
com.diboot.framework.service.impl.BaseServiceImpl Maven / Gradle / Ivy
The newest version!
package com.diboot.framework.service.impl;
import com.diboot.framework.async.AsyncLogger;
import com.diboot.framework.config.BaseConfig;
import com.diboot.framework.model.BaseModel;
import com.diboot.framework.model.BaseUser;
import com.diboot.framework.model.TraceLog;
import com.diboot.framework.service.BaseService;
import com.diboot.framework.service.mapper.BaseMapper;
import com.diboot.framework.utils.*;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.*;
/***
* CRUD通用接口实现类
* @author [email protected]
* @version 20161107
*
*/
@Service
public abstract class BaseServiceImpl implements BaseService {
private static final Logger logger = LoggerFactory.getLogger(BaseServiceImpl.class);
private AsyncLogger asyncLogger;
public static final String OFFSET = "OFFSET";
public static final String COUNT = "COUNT";
/***
* ID生成器
*/
private static IdGenerator idGenerator;
protected IdGenerator getIdGenerator(){
if(idGenerator == null){
idGenerator = new IdGenerator();
}
return idGenerator;
}
/***
* 获取异步日志logger
*/
private AsyncLogger getAsyncLogger(){
if(!AsyncLogger.isEnabledTraceLog){
return null;
}
if(asyncLogger == null){
asyncLogger = (AsyncLogger) ContextHelper.getBean("asyncLogger");
}
return asyncLogger;
}
/**
* 获取Mapper
* @return
*/
protected abstract BaseMapper getMapper();
@Override
public T getModel(Object pk){
return getMapper().get(pk);
}
/***
* 为非数据库自增类型ID的Model 生成ID
* @param model
*/
protected void generateIdFor(BaseModel model){
// 需要程序生成ID
if(model.isNew()){
// 程序生成有序Long型ID
if(BaseModel.PK_TYPE.SYSGI.equals(model.getPkType())){
model.setId(getIdGenerator().nextId());
}
// 设置UUID
else if(BaseModel.PK_TYPE.UUID.equals(model.getPkType())){
model.setUuid(S.newUuid());
}
}
}
@Override
public boolean createModel(BaseModel model) {
if(model == null){
logger.warn("调用错误: model为null");
return false;
}
// 非数据库自增ID类型,由系统生成id
if(!BaseModel.PK_TYPE.DBAI.equals(model.getPkType()) && model.isNew()){
generateIdFor(model);
}
return getMapper().create(model) > 0 || model.getPk() != null;
}
@Override
@Transactional(rollbackFor = Exception.class)
public boolean batchCreateModels(List modelList){
if(modelList == null){
logger.warn("调用错误: modelList为null");
return false;
}
// 插入前批量生成id
BaseModel model = modelList.get(0);
if(!BaseModel.PK_TYPE.DBAI.equals(model.getPkType())){
for(BaseModel m : modelList){
generateIdFor(m);
}
}
// 分批批量插入
boolean success = false;
Iterator batchIter = new BatchIterator(modelList, 100);
while (batchIter.hasNext()) {
List currentBatch = batchIter.next();
success = getMapper().batchCreate(currentBatch) > 0;
}
return success;
}
@Override
public boolean updateModel(BaseModel model, String... updateFields) {
Map fields = convertArray2Map(model, updateFields);
// 记录数据变更日志
BaseModel oldModel = null;
if(getAsyncLogger() != null){
oldModel = getModel(model.getPk());
// 解决creatorName被覆盖的问题,此修改有可能会导致extData无法被设为空
if(oldModel != null && oldModel.getExtdata() != null && V.isEmpty(model.getExtdata())){
model.setExtdata(oldModel.getExtdata());
}
}
boolean success = getMapper().update(model, fields) > 0;
if(success){
if(getAsyncLogger() != null){
BaseUser user = BaseHelper.getCurrentUser();
String comment = "更新字段: " + (fields!=null? S.join(updateFields) : "*");
getAsyncLogger().saveTraceLog(user, TraceLog.OPERATION.UPDATE, model, oldModel, fields!=null? fields.keySet():null, comment);
}
}
else{
logger.warn("更新操作失败!model="+model.getClass().getSimpleName()+":"+model.getPk());
}
return success;
}
@Override
public boolean createOrUpdateModel(BaseModel model){
if(model.isNew()){
return createModel(model);
}
else{
return updateModel(model);
}
}
@Override
public boolean deleteModel(Object pk) {
boolean success = getMapper().delete(pk) > 0;
// 记录数据变更日志
if(success){
if(getAsyncLogger() != null){
BaseUser user = BaseHelper.getCurrentUser();
String objFlag = getMapper() != null? getMapper().getClass().getSimpleName() + ".delete() : " : "";
String comment = "删除数据: " + objFlag + pk;
getAsyncLogger().saveTraceLog(user, TraceLog.OPERATION.DELETE, null, null, null, comment);
}
}
else{
String objFlag = getMapper() != null? getMapper().getClass().getSimpleName() + ".delete() : " : "";
logger.warn("删除操作失败!"+objFlag + pk);
}
return success;
}
@Override
public boolean deleteModels(Map criteria) {
if(criteria == null){
logger.warn("阻止可能的全表删除操作!");
return false;
}
boolean success = getMapper().deleteModels(criteria) > 0;
// 记录数据变更日志
if(success){
if(getAsyncLogger() != null){
BaseUser user = BaseHelper.getCurrentUser();
String objFlag = getMapper() != null? getMapper().getClass().getSimpleName() + ".deleteModels() : " : "";
String comment = "删除数据: " + objFlag + JSON.toJSONString(criteria);
getAsyncLogger().saveTraceLog(user, TraceLog.OPERATION.DELETE, null, null, null, comment);
}
}
else{
String objFlag = getMapper() != null? getMapper().getClass().getSimpleName() + ".deleteModels() : " : "";
logger.warn("删除操作失败!"+objFlag + JSON.toJSONString(criteria));
}
return success;
}
@Override
public int getModelListCount(Map criteria) {
if(criteria == null){
criteria = new HashMap<>(4);
}
return getMapper().getListCount(criteria);
}
@Override
public List getModelList(
Map criteria, int... pages) {
criteria = attachPagination(criteria, pages);
List list = getMapper().getList(criteria);
if(list != null && list.size() > 1000){
logger.warn("数据查询结果过多,记录数为 "+list.size()+"条,请检查调用是否合理!: criteria="
+ (V.notEmpty(criteria) ? criteria.toString() : null));
}
return list;
}
@Override
public List getLimitModelList(Map criteria, int limitCount){
if(criteria == null){
criteria = new HashMap<>(8);
}
criteria.put(COUNT, limitCount);
return getModelList(criteria);
}
@Override
public T getSingleModel(Map criteria){
List modelList = getLimitModelList(criteria, 1);
if(V.notEmpty(modelList)){
return modelList.get(0);
}
return null;
}
@Override
public List
© 2015 - 2025 Weber Informatics LLC | Privacy Policy