commit:同步2.1版本

This commit is contained in:
Jerry
2021-12-16 21:51:40 +08:00
parent c76388f593
commit 7af7fe5dc2
553 changed files with 8366 additions and 4151 deletions

View File

@@ -2,7 +2,7 @@
<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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<groupId>com.flow.demo</groupId>
<groupId>com.orangeforms</groupId>
<artifactId>common</artifactId>
<version>1.0.0</version>
</parent>
@@ -94,6 +94,16 @@
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>${druid.version}</version>
<exclusions>
<exclusion>
<groupId>com.sun</groupId>
<artifactId>jconsole</artifactId>
</exclusion>
<exclusion>
<groupId>com.sun</groupId>
<artifactId>tools</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>

View File

@@ -1,4 +1,4 @@
package com.flow.demo.common.core.advice;
package com.orangeforms.common.core.advice;
import org.springframework.beans.propertyeditors.CustomDateEditor;
import org.springframework.web.bind.WebDataBinder;

View File

@@ -1,9 +1,9 @@
package com.flow.demo.common.core.advice;
package com.orangeforms.common.core.advice;
import com.flow.demo.common.core.exception.*;
import com.flow.demo.common.core.constant.ErrorCodeEnum;
import com.flow.demo.common.core.object.ResponseResult;
import com.flow.demo.common.core.util.ContextUtil;
import com.orangeforms.common.core.exception.*;
import com.orangeforms.common.core.constant.ErrorCodeEnum;
import com.orangeforms.common.core.object.ResponseResult;
import com.orangeforms.common.core.util.ContextUtil;
import lombok.extern.slf4j.Slf4j;
import org.apache.ibatis.exceptions.PersistenceException;
import org.springframework.dao.DataAccessException;
@@ -24,7 +24,7 @@ import java.util.concurrent.TimeoutException;
* @date 2021-06-06
*/
@Slf4j
@RestControllerAdvice("com.flow.demo")
@RestControllerAdvice("com.orangeforms")
public class MyExceptionHandler {
/**

View File

@@ -1,9 +1,9 @@
package com.flow.demo.common.core.annotation;
package com.orangeforms.common.core.annotation;
import java.lang.annotation.*;
/**
* 主要用于标记更新字段
* 主要用于标记Job实体对象的更新时间字段
*
* @author Jerry
* @date 2021-06-06

View File

@@ -1,6 +1,6 @@
package com.flow.demo.common.core.annotation;
package com.orangeforms.common.core.annotation;
import com.flow.demo.common.core.util.DataSourceResolver;
import com.orangeforms.common.core.util.DataSourceResolver;
import java.lang.annotation.*;

View File

@@ -1,4 +1,4 @@
package com.flow.demo.common.core.annotation;
package com.orangeforms.common.core.annotation;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;

View File

@@ -1,6 +1,6 @@
package com.flow.demo.common.core.annotation;
package com.orangeforms.common.core.annotation;
import com.flow.demo.common.core.object.DummyClass;
import com.orangeforms.common.core.object.DummyClass;
import java.lang.annotation.*;

View File

@@ -1,6 +1,6 @@
package com.flow.demo.common.core.annotation;
package com.orangeforms.common.core.annotation;
import com.flow.demo.common.core.object.DummyClass;
import com.orangeforms.common.core.object.DummyClass;
import java.lang.annotation.*;

View File

@@ -1,6 +1,6 @@
package com.flow.demo.common.core.annotation;
package com.orangeforms.common.core.annotation;
import com.flow.demo.common.core.object.DummyClass;
import com.orangeforms.common.core.object.DummyClass;
import java.lang.annotation.*;

View File

@@ -1,6 +1,6 @@
package com.flow.demo.common.core.annotation;
package com.orangeforms.common.core.annotation;
import com.flow.demo.common.core.object.DummyClass;
import com.orangeforms.common.core.object.DummyClass;
import java.lang.annotation.*;

View File

@@ -1,6 +1,6 @@
package com.flow.demo.common.core.annotation;
package com.orangeforms.common.core.annotation;
import com.flow.demo.common.core.object.DummyClass;
import com.orangeforms.common.core.object.DummyClass;
import java.lang.annotation.*;

View File

@@ -1,6 +1,6 @@
package com.flow.demo.common.core.annotation;
package com.orangeforms.common.core.annotation;
import com.flow.demo.common.core.upload.UploadStoreTypeEnum;
import com.orangeforms.common.core.upload.UploadStoreTypeEnum;
import java.lang.annotation.*;

View File

@@ -1,7 +1,7 @@
package com.flow.demo.common.core.aop;
package com.orangeforms.common.core.aop;
import com.flow.demo.common.core.annotation.MyDataSource;
import com.flow.demo.common.core.config.DataSourceContextHolder;
import com.orangeforms.common.core.annotation.MyDataSource;
import com.orangeforms.common.core.config.DataSourceContextHolder;
import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
@@ -25,8 +25,8 @@ public class DataSourceAspect {
/**
* 所有配置MyDataSource注解的Service实现类
*/
@Pointcut("execution(public * com.flow.demo..service..*(..)) " +
"&& @target(com.flow.demo.common.core.annotation.MyDataSource)")
@Pointcut("execution(public * com.orangeforms..service..*(..)) " +
"&& @target(com.orangeforms.common.core.annotation.MyDataSource)")
public void datasourcePointCut() {
// 空注释避免sonar警告
}

View File

@@ -1,9 +1,9 @@
package com.flow.demo.common.core.aop;
package com.orangeforms.common.core.aop;
import com.flow.demo.common.core.annotation.MyDataSourceResolver;
import com.flow.demo.common.core.util.DataSourceResolver;
import com.flow.demo.common.core.config.DataSourceContextHolder;
import com.flow.demo.common.core.util.ApplicationContextHolder;
import com.orangeforms.common.core.annotation.MyDataSourceResolver;
import com.orangeforms.common.core.util.DataSourceResolver;
import com.orangeforms.common.core.config.DataSourceContextHolder;
import com.orangeforms.common.core.util.ApplicationContextHolder;
import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
@@ -32,8 +32,8 @@ public class DataSourceResolveAspect {
/**
* 所有配置 MyDataSource 注解的Service
*/
@Pointcut("execution(public * com.flow.demo..service..*(..)) " +
"&& @target(com.flow.demo.common.core.annotation.MyDataSourceResolver)")
@Pointcut("execution(public * com.orangeforms..service..*(..)) " +
"&& @target(com.orangeforms.common.core.annotation.MyDataSourceResolver)")
public void datasourceResolverPointCut() {
// 空注释避免sonar警告
}

View File

@@ -1,6 +1,6 @@
package com.flow.demo.common.core.aop;
package com.orangeforms.common.core.aop;
import com.flow.demo.common.core.base.service.BaseDictService;
import com.orangeforms.common.core.base.service.BaseDictService;
import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
@@ -27,9 +27,9 @@ public class DictCacheSyncAspect {
/**
* BaseDictService 字典服务父类中的字典数据增删改的方法
*/
@Pointcut("execution(public * com.flow.demo..BaseDictService.saveNew (..)) " +
"|| execution(public * com.flow.demo..BaseDictService.update (..)) " +
"|| execution(public * com.flow.demo..BaseDictService.remove (..))" )
@Pointcut("execution(public * com.orangeforms..BaseDictService.saveNew (..)) " +
"|| execution(public * com.orangeforms..BaseDictService.update (..)) " +
"|| execution(public * com.orangeforms..BaseDictService.remove (..))" )
public void baseDictServicePointCut() {
// 空注释避免sonar警告
}

View File

@@ -1,4 +1,4 @@
package com.flow.demo.common.core.base.dao;
package com.orangeforms.common.core.base.dao;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Param;

View File

@@ -1,4 +1,4 @@
package com.flow.demo.common.core.base.mapper;
package com.orangeforms.common.core.base.mapper;
import cn.hutool.core.bean.BeanUtil;
import org.apache.commons.collections4.CollectionUtils;

View File

@@ -1,11 +1,11 @@
package com.flow.demo.common.core.base.service;
package com.orangeforms.common.core.base.service;
import cn.hutool.core.util.ReflectUtil;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.flow.demo.common.core.constant.GlobalDeletedFlag;
import com.flow.demo.common.core.exception.MyRuntimeException;
import com.flow.demo.common.core.cache.DictionaryCache;
import com.flow.demo.common.core.object.TokenData;
import com.orangeforms.common.core.constant.GlobalDeletedFlag;
import com.orangeforms.common.core.exception.MyRuntimeException;
import com.orangeforms.common.core.cache.DictionaryCache;
import com.orangeforms.common.core.object.TokenData;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections4.CollectionUtils;
import org.springframework.transaction.annotation.Transactional;

View File

@@ -1,20 +1,21 @@
package com.flow.demo.common.core.base.service;
package com.orangeforms.common.core.base.service;
import cn.hutool.core.collection.CollUtil;
import com.baomidou.mybatisplus.annotation.*;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.flow.demo.common.core.annotation.*;
import com.flow.demo.common.core.base.dao.BaseDaoMapper;
import com.flow.demo.common.core.constant.AggregationType;
import com.flow.demo.common.core.constant.GlobalDeletedFlag;
import com.flow.demo.common.core.exception.InvalidDataFieldException;
import com.flow.demo.common.core.exception.MyRuntimeException;
import com.flow.demo.common.core.object.*;
import com.flow.demo.common.core.util.AopTargetUtil;
import com.flow.demo.common.core.util.ApplicationContextHolder;
import com.flow.demo.common.core.util.MyModelUtil;
import com.orangeforms.common.core.annotation.*;
import com.orangeforms.common.core.base.dao.BaseDaoMapper;
import com.orangeforms.common.core.constant.AggregationType;
import com.orangeforms.common.core.constant.GlobalDeletedFlag;
import com.orangeforms.common.core.exception.InvalidDataFieldException;
import com.orangeforms.common.core.exception.MyRuntimeException;
import com.orangeforms.common.core.object.*;
import com.orangeforms.common.core.util.AopTargetUtil;
import com.orangeforms.common.core.util.ApplicationContextHolder;
import com.orangeforms.common.core.util.MyModelUtil;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.collections4.MapUtils;
@@ -28,9 +29,9 @@ import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.lang.reflect.ParameterizedType;
import java.util.*;
import java.util.function.Function;
import java.util.function.BiConsumer;
import java.util.function.Consumer;
import java.util.function.Supplier;
import java.util.function.Function;
import static java.util.stream.Collectors.*;
@@ -87,11 +88,27 @@ public abstract class BaseService<M, K extends Serializable> extends ServiceImpl
/**
* 当前Job服务源主表Model对象最后更新时间字段名称
*/
protected String updateTimeFieldName;
protected String jobUpdateTimeFieldName;
/**
* 当前Job服务源主表Model对象最后更新时间列名称
*/
protected String jobUpdateTimeColumnName;
/**
* 当前业务服务源主表Model对象最后更新时间字段名称
*/
protected String updateTimeFieldName;
/**
* 当前业务服务源主表Model对象最后更新时间列名称
*/
protected String updateTimeColumnName;
/**
* 当前业务服务源主表Model对象最后更新用户Id字段名称
*/
protected String updateUserIdFieldName;
/**
* 当前业务服务源主表Model对象最后更新用户Id列名称
*/
protected String updateUserIdColumnName;
/**
* 当前Service关联的主Model对象主键字段赋值方法的反射对象
*/
@@ -132,6 +149,10 @@ public abstract class BaseService<M, K extends Serializable> extends ServiceImpl
* 当前Service关联的主Model对象的所有多对多聚合关联的结构列表该字段在系统启动阶段一次性预加载提升运行时效率
*/
private final List<RelationStruct> relationManyToManyAggrStructList = new LinkedList<>();
/**
* 基础表的实体对象及表信息
*/
private final TableModelInfo tableModelInfo = new TableModelInfo();
private static final String GROUPED_KEY = "groupedKey";
private static final String AGGREGATED_VALUE = "aggregatedValue";
@@ -154,6 +175,15 @@ public abstract class BaseService<M, K extends Serializable> extends ServiceImpl
for (Field field : fields) {
initializeField(field);
}
tableModelInfo.setModelName(modelClass.getSimpleName());
tableModelInfo.setTableName(this.tableName);
tableModelInfo.setKeyFieldName(idFieldName);
tableModelInfo.setKeyColumnName(idColumnName);
}
@Override
public TableModelInfo getTableModelInfo() {
return this.tableModelInfo;
}
private void initializeField(Field field) {
@@ -166,9 +196,9 @@ public abstract class BaseService<M, K extends Serializable> extends ServiceImpl
getIdFieldMethod = ReflectUtil.getMethod(
modelClass, "get" + StringUtils.capitalize(idFieldName));
}
if (updateTimeFieldName == null && null != field.getAnnotation(JobUpdateTimeColumn.class)) {
updateTimeFieldName = field.getName();
updateTimeColumnName = this.safeMapToColumnName(updateTimeFieldName);
if (jobUpdateTimeFieldName == null && null != field.getAnnotation(JobUpdateTimeColumn.class)) {
jobUpdateTimeFieldName = field.getName();
jobUpdateTimeColumnName = this.safeMapToColumnName(jobUpdateTimeFieldName);
}
if (deletedFlagFieldName == null && null != field.getAnnotation(TableLogic.class)) {
deletedFlagFieldName = field.getName();
@@ -190,6 +220,41 @@ public abstract class BaseService<M, K extends Serializable> extends ServiceImpl
*/
protected abstract BaseDaoMapper<M> mapper();
@SuppressWarnings("unchecked")
@Override
public void saveNewOrUpdate(M data, Consumer<M> saveNew, BiConsumer<M, M> update) {
if (data == null) {
return;
}
K id = (K) ReflectUtil.getFieldValue(data, idFieldName);
if (id == null) {
saveNew.accept(data);
} else {
update.accept(data, this.getById(id));
}
}
@SuppressWarnings("unchecked")
@Override
public void saveNewOrUpdateBatch(List<M> dataList, Consumer<List<M>> saveNewBatch, BiConsumer<M, M> update) {
if (CollUtil.isEmpty(dataList)) {
return;
}
List<M> saveNewDataList = dataList.stream()
.filter(c -> ReflectUtil.getFieldValue(c, idFieldName) == null).collect(toList());
if (CollUtil.isNotEmpty(saveNewDataList)) {
saveNewBatch.accept(saveNewDataList);
}
List<M> updateDataList = dataList.stream()
.filter(c -> ReflectUtil.getFieldValue(c, idFieldName) != null).collect(toList());
if (CollUtil.isNotEmpty(updateDataList)) {
for (M data : updateDataList) {
K id = (K) ReflectUtil.getFieldValue(data, idFieldName);
update.accept(data, this.getById(id));
}
}
}
/**
* 根据过滤条件删除数据
*
@@ -202,6 +267,58 @@ public abstract class BaseService<M, K extends Serializable> extends ServiceImpl
return mapper().delete(new QueryWrapper<>(filter));
}
@Transactional(rollbackFor = Exception.class)
@Override
public void updateBatchOneToManyRelation(
String relationFieldName,
Object relationFieldValue,
String updateUserIdFieldName,
String updateTimeFieldName,
List<M> dataList,
Consumer<List<M>> batchInserter) {
// 删除在现有数据列表dataList中不存在的从表数据
QueryWrapper<M> queryWrapper = new QueryWrapper<>();
queryWrapper.eq(this.safeMapToColumnName(relationFieldName), relationFieldValue);
if (CollUtil.isNotEmpty(dataList)) {
Set<Object> keptIdSet = dataList.stream()
.filter(c -> ReflectUtil.getFieldValue(c, idFieldName) != null)
.map(c -> ReflectUtil.getFieldValue(c, idFieldName)).collect(toSet());
if (CollUtil.isNotEmpty(keptIdSet)) {
queryWrapper.notIn(idColumnName, keptIdSet);
}
}
mapper().delete(queryWrapper);
if (CollUtil.isNotEmpty(dataList)) {
// 没有包含主键的对象被视为新对象为了效率最优化这里执行批量插入
List<M> newDataList = dataList.stream()
.filter(c -> ReflectUtil.getFieldValue(c, idFieldName) == null).collect(toList());
if (CollUtil.isNotEmpty(newDataList)) {
newDataList.forEach(o -> ReflectUtil.setFieldValue(o, relationFieldName, relationFieldValue));
batchInserter.accept(newDataList);
}
// 对于主键已经存在的数据我们视为已存在数据这里执行逐条更新操作
List<M> updateDataList =
dataList.stream().filter(c -> ReflectUtil.getFieldValue(c, idFieldName) != null).collect(toList());
for (M updateData : updateDataList) {
// 如果前端将更新用户Id置空这里使用当前用户更新该字段
if (updateUserIdFieldName != null && ReflectUtil.getFieldValue(updateData, updateUserIdFieldName) == null) {
ReflectUtil.setFieldValue(updateData, updateUserIdFieldName, TokenData.takeFromRequest().getUserId());
}
// 如果前端将更新时间置空这里使用当前时间更新该字段
if (updateTimeFieldName != null && ReflectUtil.getFieldValue(updateData, updateTimeFieldName) == null) {
ReflectUtil.setFieldValue(updateData, updateTimeFieldName, new Date());
}
if (this.deletedFlagFieldName != null) {
ReflectUtil.setFieldValue(updateData, deletedFlagFieldName, GlobalDeletedFlag.NORMAL);
}
@SuppressWarnings("unchecked")
UpdateWrapper<M> uw = this.createUpdateQueryForNullValue(
updateData, (K) ReflectUtil.getFieldValue(updateData, idFieldName));
mapper().update(updateData, uw);
}
}
}
/**
* 判断指定字段的数据是否存在且仅仅存在一条记录
* 如果是基于主键的过滤会直接调用existId过滤函数提升性能在有缓存的场景下也可以利用缓存
@@ -515,6 +632,47 @@ public abstract class BaseService<M, K extends Serializable> extends ServiceImpl
return mapper().getCountByCondition(this.tableName, whereClause);
}
@Override
public CallResult verifyRelatedData(M data, M originalData) {
return CallResult.ok();
}
@SuppressWarnings("unchecked")
@Override
public CallResult verifyRelatedData(List<M> dataList) {
if (CollUtil.isEmpty(dataList)) {
return CallResult.ok();
}
// 1. 先过滤出数据列表中的主键Id集合
Set<K> idList = dataList.stream()
.filter(c -> ReflectUtil.getFieldValue(c, idFieldName) != null)
.map(c -> (K) ReflectUtil.getFieldValue(c, idFieldName)).collect(toSet());
// 2. 列表中我们目前仅支持全部是更新数据或全部新增数据不能混着如果有主键值说明当前全是更新数据
if (CollUtil.isNotEmpty(idList)) {
// 3. 这里是批量读取的优化用一个主键值得in list查询一步获取全部原有数据然后再在内存中基于Map排序
List<M> originalList = this.getInList(idList);
Map<Object, M> originalMap = originalList.stream()
.collect(toMap(c -> ReflectUtil.getFieldValue(c, idFieldName), c2 -> c2));
// 迭代列表传入当前最新数据和更新前数据进行比对如果关联数据变化了就对新数据进行合法性验证
for (M data : dataList) {
CallResult result = this.verifyRelatedData(
data, originalMap.get(ReflectUtil.getFieldValue(data, idFieldName)));
if (!result.isSuccess()) {
return result;
}
}
} else {
// 4. 迭代列表传入当前最新数据对关联数据进行合法性验证
for (M data : dataList) {
CallResult result = this.verifyRelatedData(data, null);
if (!result.isSuccess()) {
return result;
}
}
}
return CallResult.ok();
}
/**
* 集成所有与主表实体对象相关的关联数据列表包括本地和远程服务的一对一字典一对多和多对多聚合运算等
* 也可以根据实际需求单独调用该函数所包含的各个数据集成函数
@@ -1208,23 +1366,6 @@ public abstract class BaseService<M, K extends Serializable> extends ServiceImpl
}
}
@Transactional(rollbackFor = Exception.class)
@Override
public void saveInternal(List<M> dataList, Supplier<K> idGenerator, Consumer<List<M>> batchInserter) {
if (CollectionUtils.isEmpty(dataList)) {
return;
}
dataList.stream().filter(c -> ReflectUtil.getFieldValue(c, idFieldName) == null)
.forEach(o -> ReflectUtil.setFieldValue(o, idFieldName, idGenerator.get()));
if (batchInserter != null) {
batchInserter.accept(dataList);
} else {
for (M data : dataList) {
mapper().insert(data);
}
}
}
/**
* 缺省实现返回null在进行一对多和多对多聚合计算时没有额外的自定义过滤条件如有需要需子类自行实现
*
@@ -1244,6 +1385,9 @@ public abstract class BaseService<M, K extends Serializable> extends ServiceImpl
* @return 需要关联验证返回true否则false
*/
protected <T> boolean needToVerify(M object, M originalObject, Function<M, T> fieldGetter) {
if (object == null) {
return false;
}
T data = fieldGetter.apply(object);
if (data == null) {
return false;

View File

@@ -1,12 +1,14 @@
package com.flow.demo.common.core.base.service;
package com.orangeforms.common.core.base.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.flow.demo.common.core.object.MyRelationParam;
import com.orangeforms.common.core.object.CallResult;
import com.orangeforms.common.core.object.MyRelationParam;
import com.orangeforms.common.core.object.TableModelInfo;
import java.io.Serializable;
import java.util.*;
import java.util.function.BiConsumer;
import java.util.function.Consumer;
import java.util.function.Supplier;
/**
* 所有Service的接口
@@ -18,6 +20,24 @@ import java.util.function.Supplier;
*/
public interface IBaseService<M, K extends Serializable> extends IService<M>{
/**
* 如果主键存在则更新否则新增保存实体对象
*
* @param data 实体对象数据
* @param saveNew 新增实体对象方法
* @param update 更新实体对象方法
*/
void saveNewOrUpdate(M data, Consumer<M> saveNew, BiConsumer<M, M> update);
/**
* 如果主键存在的则更新否则批量新增保存实体对象
*
* @param dataList 实体对象数据列表
* @param saveNewBatch 批量新增实体对象方法
* @param update 更新实体对象方法
*/
void saveNewOrUpdateBatch(List<M> dataList, Consumer<List<M>> saveNewBatch, BiConsumer<M, M> update);
/**
* 根据过滤条件删除数据
*
@@ -26,6 +46,29 @@ public interface IBaseService<M, K extends Serializable> extends IService<M>{
*/
Integer removeBy(M filter);
/**
* 基于主从表之间的关联字段批量改更新一对多从表数据
* 该操作会覆盖增改三个操作具体如下
* 1. 先删除从表中relationFieldName字段的值为relationFieldValue, 同时主键Id不在dataList中的
* 2. 再批量插入遍历dataList中没有主键Id的对象视为新对象批量插入
* 3. 最后逐条更新遍历dataList中有主键Id的对象视为已存在对象并逐条更新
* 4. 如果更新时间和更新用户Id为空我们将视当前记录为变化数据因此使用当前时间和用户分别填充这两个字段
*
* @param relationFieldName 主从表关联中从表的Java字段名
* @param relationFieldValue 主从表关联中与从表关联的主表字段值该值会被赋值给从表关联字段
* @param updateUserIdFieldName 一对多从表的更新用户Id字段名
* @param updateTimeFieldName 一对多从表的更新时间字段名
* @param dataList 批量更新的从表数据列表
* @param batchInserter 从表批量插入方法
*/
void updateBatchOneToManyRelation(
String relationFieldName,
Object relationFieldValue,
String updateUserIdFieldName,
String updateTimeFieldName,
List<M> dataList,
Consumer<List<M>> batchInserter);
/**
* 判断指定字段的数据是否存在且仅仅存在一条记录
* 如果是基于主键的过滤会直接调用existId过滤函数提升性能在有缓存的场景下也可以利用缓存
@@ -216,6 +259,25 @@ public interface IBaseService<M, K extends Serializable> extends IService<M>{
*/
Integer getCountByCondition(String whereClause);
/**
* 根据最新对象和原有对象的数据对比判断关联的字典数据和多对一主表数据是否都是合法数据
* NOTE: BaseService中会给出返回CallResult.ok()的缺省实现每个业务服务实现类在需要的时候可以重载该方法
*
* @param data 数据对象
* @param originalData 原有数据对象null表示data为新增对象
* @return 应答结果对象
*/
CallResult verifyRelatedData(M data, M originalData);
/**
* 根据最新对象列表和原有对象列表的数据对比判断关联的字典数据和多对一主表数据是否都是合法数据
* NOTE: BaseService中会给出返回CallResult.ok()的缺省实现每个业务服务实现类在需要的时候可以重载该方法
*
* @param dataList 数据对象列表
* @return 应答结果对象
*/
CallResult verifyRelatedData(List<M> dataList);
/**
* 集成所有与主表实体对象相关的关联数据列表包括一对一字典一对多和多对多聚合运算等
* 也可以根据实际需求单独调用该函数所包含的各个数据集成函数
@@ -304,14 +366,9 @@ public interface IBaseService<M, K extends Serializable> extends IService<M>{
void loadRelationStruct();
/**
* 内部使用的批量保存方法在使用前要确保清楚该方法的实现功能
* 该方法通常用于从表数据的批量更新为了保证已有数据的主键不变我们通常会在执行该方法前根据主表的关联数据
* 删除从表中的数据之后在迭代参数dataList并将没有主键值的对象视为新对象该方法将为这些新对象生成主键值
* 其他包含主键值的对象为已有对象不做任何修改填充主键后将dataList集合中的数据批量插入到数据表
* 获取当前服务引用的实体对象及表信息
*
* @param dataList 待操作的数据列表
* @param idGenerator 主键值生成器方法
* @param batchInserter 批量插入方法
* @return 实体对象及表信息
*/
void saveInternal(List<M> dataList, Supplier<K> idGenerator, Consumer<List<M>> batchInserter);
TableModelInfo getTableModelInfo();
}

View File

@@ -1,6 +1,6 @@
package com.flow.demo.common.core.cache;
package com.orangeforms.common.core.cache;
import com.flow.demo.common.core.exception.MapCacheAccessException;
import com.orangeforms.common.core.exception.MapCacheAccessException;
import lombok.extern.slf4j.Slf4j;
import java.util.*;

View File

@@ -1,6 +1,6 @@
package com.flow.demo.common.core.cache;
package com.orangeforms.common.core.cache;
import com.flow.demo.common.core.exception.MapCacheAccessException;
import com.orangeforms.common.core.exception.MapCacheAccessException;
import com.google.common.collect.LinkedHashMultimap;
import com.google.common.collect.Multimap;
import lombok.extern.slf4j.Slf4j;

View File

@@ -1,9 +1,9 @@
package com.flow.demo.common.core.config;
package com.orangeforms.common.core.config;
import com.alibaba.fastjson.serializer.SerializerFeature;
import com.alibaba.fastjson.support.config.FastJsonConfig;
import com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter;
import com.flow.demo.common.core.interceptor.MyRequestArgumentResolver;
import com.orangeforms.common.core.interceptor.MyRequestArgumentResolver;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.MediaType;

View File

@@ -1,4 +1,4 @@
package com.flow.demo.common.core.config;
package com.orangeforms.common.core.config;
/**
* 通过线程本地存储的方式保存当前数据库操作所需的数据源类型动态数据源会根据该值进行动态切换

View File

@@ -1,4 +1,4 @@
package com.flow.demo.common.core.config;
package com.orangeforms.common.core.config;
import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource;

View File

@@ -1,4 +1,4 @@
package com.flow.demo.common.core.config;
package com.orangeforms.common.core.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

View File

@@ -1,4 +1,4 @@
package com.flow.demo.common.core.config;
package com.orangeforms.common.core.config;
import com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter;
import org.apache.http.client.HttpClient;

View File

@@ -1,4 +1,4 @@
package com.flow.demo.common.core.config;
package com.orangeforms.common.core.config;
import org.apache.tomcat.util.descriptor.web.SecurityCollection;
import org.apache.tomcat.util.descriptor.web.SecurityConstraint;

View File

@@ -1,4 +1,4 @@
package com.flow.demo.common.core.exception;
package com.orangeforms.common.core.exception;
/**
* 内存缓存访问失败比如获取分布式数据锁超时等待线程中断等

View File

@@ -1,4 +1,4 @@
package com.flow.demo.common.core.exception;
package com.orangeforms.common.core.exception;
/**
* 自定义的运行时异常在需要抛出运行时异常时可使用该异常

View File

@@ -1,4 +1,4 @@
package com.flow.demo.common.core.exception;
package com.orangeforms.common.core.exception;
/**
* Redis缓存访问失败比如获取分布式数据锁超时等待线程中断等

View File

@@ -1,10 +1,10 @@
package com.flow.demo.common.core.interceptor;
package com.orangeforms.common.core.interceptor;
import cn.hutool.core.convert.Convert;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.flow.demo.common.core.annotation.MyRequestBody;
import com.orangeforms.common.core.annotation.MyRequestBody;
import org.apache.commons.io.IOUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.core.MethodParameter;

View File

@@ -1,6 +1,6 @@
package com.flow.demo.common.core.listener;
package com.orangeforms.common.core.listener;
import com.flow.demo.common.core.base.service.BaseService;
import com.orangeforms.common.core.base.service.BaseService;
import org.springframework.boot.context.event.ApplicationReadyEvent;
import org.springframework.context.ApplicationListener;
import org.springframework.stereotype.Component;

View File

@@ -1,4 +1,4 @@
package com.flow.demo.common.core.object;
package com.orangeforms.common.core.object;
/**
* 哑元对象主要用于注解中的缺省对象占位符

View File

@@ -1,11 +1,11 @@
package com.flow.demo.common.core.object;
package com.orangeforms.common.core.object;
import cn.hutool.core.util.ReflectUtil;
import com.flow.demo.common.core.constant.ApplicationConstant;
import com.flow.demo.common.core.exception.InvalidClassFieldException;
import com.flow.demo.common.core.exception.InvalidDataFieldException;
import com.flow.demo.common.core.exception.InvalidDataModelException;
import com.flow.demo.common.core.util.MyModelUtil;
import com.orangeforms.common.core.constant.ApplicationConstant;
import com.orangeforms.common.core.exception.InvalidClassFieldException;
import com.orangeforms.common.core.exception.InvalidDataFieldException;
import com.orangeforms.common.core.exception.InvalidDataModelException;
import com.orangeforms.common.core.util.MyModelUtil;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.extern.slf4j.Slf4j;

View File

@@ -1,11 +1,11 @@
package com.flow.demo.common.core.object;
package com.orangeforms.common.core.object;
import cn.hutool.core.util.ReflectUtil;
import com.flow.demo.common.core.constant.ApplicationConstant;
import com.flow.demo.common.core.exception.InvalidClassFieldException;
import com.flow.demo.common.core.exception.InvalidDataFieldException;
import com.flow.demo.common.core.exception.InvalidDataModelException;
import com.flow.demo.common.core.util.MyModelUtil;
import com.orangeforms.common.core.constant.ApplicationConstant;
import com.orangeforms.common.core.exception.InvalidClassFieldException;
import com.orangeforms.common.core.exception.InvalidDataFieldException;
import com.orangeforms.common.core.exception.InvalidDataModelException;
import com.orangeforms.common.core.util.MyModelUtil;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.EqualsAndHashCode;

View File

@@ -1,10 +1,10 @@
package com.flow.demo.common.core.object;
package com.orangeforms.common.core.object;
import cn.hutool.core.util.ReflectUtil;
import com.alibaba.fastjson.annotation.JSONField;
import com.flow.demo.common.core.exception.InvalidDataFieldException;
import com.flow.demo.common.core.exception.InvalidDataModelException;
import com.flow.demo.common.core.util.MyModelUtil;
import com.orangeforms.common.core.exception.InvalidDataFieldException;
import com.orangeforms.common.core.exception.InvalidDataModelException;
import com.orangeforms.common.core.util.MyModelUtil;
import lombok.*;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections4.CollectionUtils;

View File

@@ -1,8 +1,8 @@
package com.flow.demo.common.core.object;
package com.orangeforms.common.core.object;
import com.alibaba.fastjson.JSON;
import com.flow.demo.common.core.constant.ErrorCodeEnum;
import com.flow.demo.common.core.util.ContextUtil;
import com.orangeforms.common.core.constant.ErrorCodeEnum;
import com.orangeforms.common.core.util.ContextUtil;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;
@@ -77,6 +77,20 @@ public class ResponseResult<T> {
return errorCode == null ? success() : error(errorCode, errorMessage);
}
/**
* 根据参数errorCodeEnum的枚举值判断创建成功对象还是错误对象
* 如果返回错误对象errorCode errorMessage 分别取自于参数 errorCodeEnum name() 和参数 errorMessage
*
* @param errorCodeEnum 错误码枚举
* @param errorMessage 如果该参数为null错误信息取自errorCodeEnum参数内置的errorMessage否则使用当前参数
* @param data 如果错误枚举值为NO_ERROR则返回该数据
* @return 返回创建的ResponseResult实例对象
*/
public static <T> ResponseResult<T> create(ErrorCodeEnum errorCodeEnum, String errorMessage, T data) {
errorMessage = errorMessage != null ? errorMessage : errorCodeEnum.getErrorMessage();
return errorCodeEnum == ErrorCodeEnum.NO_ERROR ? success(data) : error(errorCodeEnum.name(), errorMessage);
}
/**
* 创建成功对象
* 如果需要绑定返回数据可以在实例化后调用setDataObject方法

View File

@@ -0,0 +1,33 @@
package com.orangeforms.common.core.object;
import lombok.Data;
/**
* 数据表模型基础信息。
*
* @author Jerry
* @date 2021-06-06
*/
@Data
public class TableModelInfo {
/**
* 数据表名。
*/
private String tableName;
/**
* 实体对象名。
*/
private String modelName;
/**
* 主键的表字段名。
*/
private String keyColumnName;
/**
* 主键在实体对象中的属性名。
*/
private String keyFieldName;
}

View File

@@ -1,6 +1,6 @@
package com.flow.demo.common.core.object;
package com.orangeforms.common.core.object;
import com.flow.demo.common.core.util.ContextUtil;
import com.orangeforms.common.core.util.ContextUtil;
import lombok.Data;
import lombok.ToString;
@@ -25,11 +25,19 @@ public class TokenData {
* 用户Id
*/
private Long userId;
/**
* 用户所属角色多个角色之间逗号分隔
*/
private String roleIds;
/**
* 用户所在部门Id
* 仅当系统支持uaa时可用否则可以直接忽略该字段保留该字段是为了保持单体和微服务通用代码部分的兼容性
*/
private Long deptId;
/**
* 用户所属岗位Id多个岗位之间逗号分隔仅当系统支持岗位时有值
*/
private String postIds;
/**
* 用户的部门岗位Id多个岗位之间逗号分隔仅当系统支持岗位时有值
*/

View File

@@ -1,4 +1,4 @@
package com.flow.demo.common.core.object;
package com.orangeforms.common.core.object;
/**
* 二元组对象主要用于可以一次返回多个结果的场景同时还能避免强制转换

View File

@@ -1,9 +1,9 @@
package com.flow.demo.common.core.upload;
package com.orangeforms.common.core.upload;
import com.alibaba.fastjson.JSON;
import com.flow.demo.common.core.constant.ApplicationConstant;
import com.flow.demo.common.core.util.ContextUtil;
import com.flow.demo.common.core.util.MyCommonUtil;
import com.orangeforms.common.core.constant.ApplicationConstant;
import com.orangeforms.common.core.util.ContextUtil;
import com.orangeforms.common.core.util.MyCommonUtil;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.io.FilenameUtils;

View File

@@ -1,7 +1,7 @@
package com.flow.demo.common.core.upload;
package com.orangeforms.common.core.upload;
import com.alibaba.fastjson.JSON;
import com.flow.demo.common.core.constant.ErrorCodeEnum;
import com.orangeforms.common.core.constant.ErrorCodeEnum;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang3.StringUtils;

View File

@@ -1,4 +1,4 @@
package com.flow.demo.common.core.util;
package com.orangeforms.common.core.util;
import lombok.extern.slf4j.Slf4j;
import org.springframework.aop.framework.AdvisedSupport;

View File

@@ -1,6 +1,6 @@
package com.flow.demo.common.core.util;
package com.orangeforms.common.core.util;
import com.flow.demo.common.core.exception.MyRuntimeException;
import com.orangeforms.common.core.exception.MyRuntimeException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.lang.NonNull;

View File

@@ -1,4 +1,4 @@
package com.flow.demo.common.core.util;
package com.orangeforms.common.core.util;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;

View File

@@ -1,11 +1,11 @@
package com.flow.demo.common.core.util;
package com.orangeforms.common.core.util;
import cn.hutool.core.io.IoUtil;
import cn.hutool.poi.excel.ExcelUtil;
import cn.hutool.poi.excel.ExcelWriter;
import cn.jimmyshi.beanquery.BeanQuery;
import com.flow.demo.common.core.constant.ApplicationConstant;
import com.flow.demo.common.core.exception.MyRuntimeException;
import com.orangeforms.common.core.constant.ApplicationConstant;
import com.orangeforms.common.core.exception.MyRuntimeException;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.csv.CSVFormat;

View File

@@ -1,4 +1,4 @@
package com.flow.demo.common.core.util;
package com.orangeforms.common.core.util;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
@@ -37,6 +37,9 @@ public class IpUtil {
// Proxy-Client-IPapache 服务代理
ipAddresses = request.getHeader("Proxy-Client-IP");
}
if (StringUtils.isBlank(ipAddresses) || UNKNOWN.equalsIgnoreCase(ipAddresses)) {
ipAddresses = request.getHeader("HTTP_X_FORWARDED_FOR");
}
if (StringUtils.isBlank(ipAddresses) || UNKNOWN.equalsIgnoreCase(ipAddresses)) {
// WL-Proxy-Client-IPweblogic 服务代理
ipAddresses = request.getHeader("WL-Proxy-Client-IP");

View File

@@ -1,4 +1,4 @@
package com.flow.demo.common.core.util;
package com.orangeforms.common.core.util;
import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jwts;

View File

@@ -1,12 +1,12 @@
package com.flow.demo.common.core.util;
package com.orangeforms.common.core.util;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.ReflectUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.crypto.digest.DigestUtil;
import com.flow.demo.common.core.constant.AppDeviceType;
import com.flow.demo.common.core.validator.AddGroup;
import com.flow.demo.common.core.validator.UpdateGroup;
import com.orangeforms.common.core.constant.AppDeviceType;
import com.orangeforms.common.core.validator.AddGroup;
import com.orangeforms.common.core.validator.UpdateGroup;
import javax.validation.ConstraintViolation;
import javax.validation.Validation;

View File

@@ -1,6 +1,6 @@
package com.flow.demo.common.core.util;
package com.orangeforms.common.core.util;
import com.flow.demo.common.core.object.Tuple2;
import com.orangeforms.common.core.object.Tuple2;
import org.apache.commons.lang3.time.DateUtils;
import org.joda.time.DateTime;
import org.joda.time.Period;

View File

@@ -1,14 +1,14 @@
package com.flow.demo.common.core.util;
package com.orangeforms.common.core.util;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.util.ReflectUtil;
import com.baomidou.mybatisplus.annotation.*;
import com.flow.demo.common.core.exception.InvalidDataFieldException;
import com.flow.demo.common.core.annotation.*;
import com.flow.demo.common.core.exception.MyRuntimeException;
import com.flow.demo.common.core.object.TokenData;
import com.flow.demo.common.core.object.Tuple2;
import com.flow.demo.common.core.upload.UploadStoreInfo;
import com.orangeforms.common.core.exception.InvalidDataFieldException;
import com.orangeforms.common.core.annotation.*;
import com.orangeforms.common.core.exception.MyRuntimeException;
import com.orangeforms.common.core.object.TokenData;
import com.orangeforms.common.core.object.Tuple2;
import com.orangeforms.common.core.upload.UploadStoreInfo;
import com.google.common.base.CaseFormat;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections4.CollectionUtils;

View File

@@ -1,12 +1,12 @@
package com.flow.demo.common.core.util;
package com.orangeforms.common.core.util;
import cn.jimmyshi.beanquery.BeanQuery;
import com.alibaba.fastjson.JSONObject;
import com.github.pagehelper.Page;
import org.apache.commons.collections4.CollectionUtils;
import com.flow.demo.common.core.base.mapper.BaseModelMapper;
import com.flow.demo.common.core.object.MyPageData;
import com.flow.demo.common.core.object.Tuple2;
import com.orangeforms.common.core.base.mapper.BaseModelMapper;
import com.orangeforms.common.core.object.MyPageData;
import com.orangeforms.common.core.object.Tuple2;
import java.util.List;

View File

@@ -1,4 +1,4 @@
package com.flow.demo.common.core.util;
package com.orangeforms.common.core.util;
import javax.crypto.Cipher;
import java.nio.charset.StandardCharsets;

View File

@@ -1,4 +1,4 @@
package com.flow.demo.common.core.validator;
package com.orangeforms.common.core.validator;
/**
* 数据增加的验证分组通常用于数据新增场景

View File

@@ -1,4 +1,4 @@
package com.flow.demo.common.core.validator;
package com.orangeforms.common.core.validator;
import javax.validation.Constraint;
import javax.validation.Payload;

View File

@@ -1,4 +1,4 @@
package com.flow.demo.common.core.validator;
package com.orangeforms.common.core.validator;
import javax.validation.Constraint;
import javax.validation.Payload;

View File

@@ -1,4 +1,4 @@
package com.flow.demo.common.core.validator;
package com.orangeforms.common.core.validator;
/**
* 数据修改的验证分组通常用于数据更新的场景

Some files were not shown because too many files have changed in this diff Show More