dataTracer

This commit is contained in:
yandanyang 2021-10-26 18:58:18 +08:00
parent 11850a4dd8
commit db4b844146
21 changed files with 155 additions and 81 deletions

View File

@ -6,7 +6,7 @@ import net.lab1024.smartadmin.service.common.constant.CacheModuleConst;
import net.lab1024.smartadmin.service.common.constant.StringConst;
import net.lab1024.smartadmin.service.common.util.SmartBeanUtil;
import net.lab1024.smartadmin.service.module.business.category.domain.CategoryEntity;
import net.lab1024.smartadmin.service.module.business.category.domain.CategoryTreeVO;
import net.lab1024.smartadmin.service.module.business.category.domain.vo.CategoryTreeVO;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang3.math.NumberUtils;
import org.springframework.beans.factory.annotation.Autowired;

View File

@ -5,7 +5,11 @@ import io.swagger.annotations.ApiOperation;
import net.lab1024.smartadmin.service.common.swagger.SwaggerTagConst;
import net.lab1024.smartadmin.service.common.controller.SystemBaseController;
import net.lab1024.smartadmin.service.common.domain.ResponseDTO;
import net.lab1024.smartadmin.service.module.business.category.domain.*;
import net.lab1024.smartadmin.service.module.business.category.domain.form.CategoryAddForm;
import net.lab1024.smartadmin.service.module.business.category.domain.form.CategoryTreeQueryForm;
import net.lab1024.smartadmin.service.module.business.category.domain.form.CategoryUpdateForm;
import net.lab1024.smartadmin.service.module.business.category.domain.vo.CategoryTreeVO;
import net.lab1024.smartadmin.service.module.business.category.domain.vo.CategoryVO;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

View File

@ -5,6 +5,11 @@ import net.lab1024.smartadmin.service.common.code.UserErrorCode;
import net.lab1024.smartadmin.service.common.domain.ResponseDTO;
import net.lab1024.smartadmin.service.module.business.category.domain.*;
import net.lab1024.smartadmin.service.common.util.SmartBeanUtil;
import net.lab1024.smartadmin.service.module.business.category.domain.form.CategoryAddForm;
import net.lab1024.smartadmin.service.module.business.category.domain.form.CategoryTreeQueryForm;
import net.lab1024.smartadmin.service.module.business.category.domain.form.CategoryUpdateForm;
import net.lab1024.smartadmin.service.module.business.category.domain.vo.CategoryTreeVO;
import net.lab1024.smartadmin.service.module.business.category.domain.vo.CategoryVO;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang3.math.NumberUtils;
import org.springframework.beans.factory.annotation.Autowired;

View File

@ -1,4 +1,4 @@
package net.lab1024.smartadmin.service.module.business.category.domain;
package net.lab1024.smartadmin.service.module.business.category.domain.dto;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;

View File

@ -1,4 +1,4 @@
package net.lab1024.smartadmin.service.module.business.category.domain;
package net.lab1024.smartadmin.service.module.business.category.domain.dto;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;

View File

@ -1,6 +1,7 @@
package net.lab1024.smartadmin.service.module.business.category.domain;
package net.lab1024.smartadmin.service.module.business.category.domain.form;
import lombok.Data;
import net.lab1024.smartadmin.service.module.business.category.domain.dto.CategoryBaseDTO;
/**
* 类目 添加 DTO

View File

@ -1,4 +1,4 @@
package net.lab1024.smartadmin.service.module.business.category.domain;
package net.lab1024.smartadmin.service.module.business.category.domain.form;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;

View File

@ -1,7 +1,8 @@
package net.lab1024.smartadmin.service.module.business.category.domain;
package net.lab1024.smartadmin.service.module.business.category.domain.form;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import net.lab1024.smartadmin.service.module.business.category.domain.dto.CategoryBaseDTO;
import javax.validation.constraints.NotNull;

View File

@ -1,7 +1,8 @@
package net.lab1024.smartadmin.service.module.business.category.domain;
package net.lab1024.smartadmin.service.module.business.category.domain.vo;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import net.lab1024.smartadmin.service.module.business.category.domain.dto.CategorySimpleDTO;
import java.util.List;

View File

@ -1,7 +1,8 @@
package net.lab1024.smartadmin.service.module.business.category.domain;
package net.lab1024.smartadmin.service.module.business.category.domain.vo;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import net.lab1024.smartadmin.service.module.business.category.domain.dto.CategoryBaseDTO;
import java.time.LocalDateTime;

View File

@ -0,0 +1,74 @@
package net.lab1024.smartadmin.service.module.business.goods;
import com.google.common.collect.Lists;
import net.lab1024.smartadmin.service.common.enumeration.BaseEnum;
import net.lab1024.smartadmin.service.module.business.goods.domain.GoodsEntity;
import net.lab1024.smartadmin.service.module.support.datatracer.DataTracerFieldService;
import net.lab1024.smartadmin.service.module.support.datatracer.DataTracerService;
import net.lab1024.smartadmin.service.module.support.datatracer.constant.DataTracerBusinessTypeEnum;
import net.lab1024.smartadmin.service.module.support.datatracer.constant.DataTracerOperateTypeEnum;
import net.lab1024.smartadmin.service.module.support.datatracer.domain.DataTracerDTO;
import net.lab1024.smartadmin.service.module.support.datatracer.domain.DataTracerExtraDataDTO;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Service;
import java.time.LocalDateTime;
import java.util.List;
/**
* [ ]
*
* @author yandanyang
* @date 2021/8/23 10:38
*/
@Service
public class GoodsDataTracerService {
@Autowired
private DataTracerService dataTracerService;
@Autowired
private DataTracerFieldService dataTracerFieldService;
@Async
public void goodsAddRecord(GoodsEntity goodsEntity, LocalDateTime operateTime, Long operatorId, String operatorName) {
DataTracerDTO dataTracerDTO = new DataTracerDTO();
dataTracerDTO.setBusinessId(goodsEntity.getGoodsId());
dataTracerDTO.setBusinessType(DataTracerBusinessTypeEnum.GOODS);
dataTracerDTO.setOperateType(DataTracerOperateTypeEnum.Common.SAVE);
dataTracerDTO.setOperateContent(DataTracerOperateTypeEnum.Common.SAVE.getDesc());
dataTracerDTO.setOperateTime(operateTime);
dataTracerService.saveOperateRecord(dataTracerDTO, operatorId, operatorName);
}
@Async
public void goodsUpdateRecord(GoodsEntity originGoodsEntity, GoodsEntity newGoodsEntity, LocalDateTime operateTime, Long operatorId, String operatorName) {
String operateContent = dataTracerFieldService.beanParse(originGoodsEntity, newGoodsEntity);
DataTracerDTO dataTracerDTO = new DataTracerDTO();
dataTracerDTO.setBusinessId(originGoodsEntity.getGoodsId());
dataTracerDTO.setBusinessType(DataTracerBusinessTypeEnum.GOODS);
dataTracerDTO.setOperateType(DataTracerOperateTypeEnum.Common.UPDATE);
dataTracerDTO.setOperateContent(operateContent);
dataTracerDTO.setOperateTime(operateTime);
dataTracerDTO.setExtraData(new DataTracerExtraDataDTO(GoodsEntity.class, originGoodsEntity, newGoodsEntity));
dataTracerService.saveOperateRecord(dataTracerDTO, operatorId, operatorName);
}
@Async
public void batchRecord(List<Long> goodsIdList, String operateContent, BaseEnum operateType, LocalDateTime operateTime, Long operatorId, String operatorName) {
List<DataTracerDTO> dataTracerList = Lists.newArrayList();
for (Long goodsId : goodsIdList) {
DataTracerDTO dataTracerDTO = new DataTracerDTO();
dataTracerDTO.setBusinessId(goodsId);
dataTracerDTO.setBusinessType(DataTracerBusinessTypeEnum.GOODS);
dataTracerDTO.setOperateType(operateType);
dataTracerDTO.setOperateContent(operateContent);
dataTracerDTO.setOperateTime(operateTime);
dataTracerList.add(dataTracerDTO);
}
dataTracerService.saveBatchOperateRecord(dataTracerList, operatorId, operatorName);
}
}

View File

@ -4,15 +4,17 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import net.lab1024.smartadmin.service.common.code.UserErrorCode;
import net.lab1024.smartadmin.service.common.domain.PageResultDTO;
import net.lab1024.smartadmin.service.common.domain.ResponseDTO;
import net.lab1024.smartadmin.service.common.util.SmartBeanUtil;
import net.lab1024.smartadmin.service.common.util.SmartPageUtil;
import net.lab1024.smartadmin.service.module.business.category.CategoryQueryService;
import net.lab1024.smartadmin.service.module.business.category.constant.CategoryTypeEnum;
import net.lab1024.smartadmin.service.module.business.category.domain.CategoryEntity;
import net.lab1024.smartadmin.service.module.business.goods.domain.*;
import net.lab1024.smartadmin.service.common.util.SmartBeanUtil;
import net.lab1024.smartadmin.service.common.util.SmartPageUtil;
import net.lab1024.smartadmin.service.module.support.datatracer.constant.DataTracerOperateTypeEnum;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.time.LocalDateTime;
import java.util.List;
import java.util.Map;
import java.util.Objects;
@ -37,6 +39,9 @@ public class GoodsService {
@Autowired
private CategoryQueryService categoryQueryService;
@Autowired
private GoodsDataTracerService goodsDataTracerService;
/**
* 添加商品
*
@ -49,9 +54,9 @@ public class GoodsService {
if (!res.getOk()) {
return res;
}
GoodsEntity goodsEntity = SmartBeanUtil.copy(addForm, GoodsEntity.class);
goodsDao.insert(goodsEntity);
goodsDataTracerService.goodsAddRecord(goodsEntity, LocalDateTime.now(), addForm.getUpdateId(), addForm.getUpdateName());
return ResponseDTO.ok();
}
@ -67,9 +72,10 @@ public class GoodsService {
if (!res.getOk()) {
return res;
}
GoodsEntity originEntity = goodsDao.selectById(updateForm.getGoodsId());
GoodsEntity goodsEntity = SmartBeanUtil.copy(updateForm, GoodsEntity.class);
goodsDao.updateById(goodsEntity);
goodsDataTracerService.goodsUpdateRecord(originEntity,goodsEntity, LocalDateTime.now(), updateForm.getUpdateId(), updateForm.getUpdateName());
return ResponseDTO.ok();
}
@ -95,7 +101,6 @@ public class GoodsService {
return ResponseDTO.error(UserErrorCode.ALREADY_EXIST, "商品名称不能重复~");
}
}
// 校验类目id
Optional<CategoryEntity> optional = categoryQueryService.queryCategory(categoryId);
if (!optional.isPresent() || !CategoryTypeEnum.GOODS.equalsValue(optional.get().getCategoryType())) {
@ -120,6 +125,8 @@ public class GoodsService {
return goodsEntity;
}).collect(Collectors.toList());
goodsManager.updateBatchById(goodsList);
List<Long> goodsIdList = goodsList.stream().map(GoodsEntity::getGoodsId).collect(Collectors.toList());
goodsDataTracerService.batchRecord(goodsIdList, "删除商品", DataTracerOperateTypeEnum.Common.DELETE, LocalDateTime.now(), delForm.getUpdateId(), delForm.getUpdateName());
return ResponseDTO.ok();
}

View File

@ -4,7 +4,12 @@ import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import net.lab1024.smartadmin.service.module.business.category.CategoryDao;
import net.lab1024.smartadmin.service.module.business.goods.constant.GoodsTypeEnum;
import net.lab1024.smartadmin.service.module.support.datatracer.anno.FieldBigDecimalValue;
import net.lab1024.smartadmin.service.module.support.datatracer.anno.FieldDoc;
import net.lab1024.smartadmin.service.module.support.datatracer.anno.FieldEnumValue;
import net.lab1024.smartadmin.service.module.support.datatracer.anno.FieldSqlValue;
import java.math.BigDecimal;
import java.time.LocalDateTime;
@ -27,6 +32,8 @@ public class GoodsEntity {
*
* @see GoodsTypeEnum
*/
@FieldDoc("商品类型")
@FieldEnumValue(enumClass = GoodsTypeEnum.class)
private Integer goodsType;
/**
@ -37,11 +44,13 @@ public class GoodsEntity {
/**
* 商品分类
*/
@FieldSqlValue(relateColumn = "categoryId",relateDisplayColumn = "categoryName",relateMapper = CategoryDao.class)
private Long categoryId;
/**
* 商品名称
*/
@FieldDoc("商品名称")
private String goodsName;
/**
@ -52,6 +61,8 @@ public class GoodsEntity {
/**
* 商品价格
*/
@FieldDoc("商品价格")
@FieldBigDecimalValue
private BigDecimal price;
/**
@ -62,6 +73,7 @@ public class GoodsEntity {
/**
* 上架状态
*/
@FieldDoc("上架状态")
private Boolean shelvesFlag;
/**

View File

@ -1,32 +0,0 @@
package net.lab1024.smartadmin.service.module.support.beanrecord;
/**
* [ ]
*
* @author 罗伊
*/
public enum OperateTypeEnum {
ADD(1, "新增"),
UPDATE(2, "修改"),
DELETE(3, "删除");
private Integer value;
private String desc;
OperateTypeEnum(Integer value, String desc) {
this.value = value;
this.desc = desc;
}
public Integer getValue() {
return value;
}
public String getDesc() {
return desc;
}
}

View File

@ -1,14 +1,16 @@
package net.lab1024.smartadmin.service.module.support.beanrecord;
package net.lab1024.smartadmin.service.module.support.datatracer;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.google.common.base.CaseFormat;
import com.google.common.collect.Lists;
import io.swagger.annotations.ApiModelProperty;
import lombok.extern.slf4j.Slf4j;
import net.lab1024.smartadmin.service.module.support.beanrecord.annotation.FieldBigDecimalValue;
import net.lab1024.smartadmin.service.module.support.beanrecord.annotation.FieldDoc;
import net.lab1024.smartadmin.service.module.support.beanrecord.annotation.FieldEnumValue;
import net.lab1024.smartadmin.service.module.support.beanrecord.annotation.FieldSqlValue;
import net.lab1024.smartadmin.service.module.support.datatracer.anno.FieldBigDecimalValue;
import net.lab1024.smartadmin.service.module.support.datatracer.anno.FieldDoc;
import net.lab1024.smartadmin.service.module.support.datatracer.anno.FieldEnumValue;
import net.lab1024.smartadmin.service.module.support.datatracer.anno.FieldSqlValue;
import net.lab1024.smartadmin.service.module.support.datatracer.constant.DataTracerOperateTypeEnum;
import net.lab1024.smartadmin.service.third.SmartApplicationContext;
import net.lab1024.smartadmin.service.common.util.SmartBaseEnumUtil;
import net.lab1024.smartadmin.service.common.util.SmartBigDecimalUtil;
@ -29,13 +31,13 @@ import java.util.Map.Entry;
import java.util.concurrent.ConcurrentHashMap;
/**
* [ ]
* [ 对象对比 ]
*
* @author 罗伊
*/
@Slf4j
@Service
public class BeanRecordService {
public class DataTracerFieldService {
/**
* 字段描述缓存
@ -59,16 +61,16 @@ public class BeanRecordService {
if (!valid) {
return "";
}
OperateTypeEnum operateType = this.getOperateType(oldObjectList, newObjectList);
DataTracerOperateTypeEnum.Common operateType = this.getOperateType(oldObjectList, newObjectList);
String operateContent = "";
if (OperateTypeEnum.ADD.equals(operateType) || OperateTypeEnum.DELETE.equals(operateType)) {
if (DataTracerOperateTypeEnum.Common.SAVE.equals(operateType) || DataTracerOperateTypeEnum.Common.DELETE.equals(operateType)) {
operateContent = this.getObjectListContent(newObjectList);
if (StringUtils.isEmpty(operateContent)) {
return "";
}
return operateType.getDesc() + ":" + operateContent;
}
if (OperateTypeEnum.UPDATE.equals(operateType)) {
if (DataTracerOperateTypeEnum.Common.UPDATE.equals(operateType)) {
return this.getUpdateContentList(oldObjectList, newObjectList);
}
return operateContent;
@ -128,12 +130,12 @@ public class BeanRecordService {
if (!valid) {
return null;
}
OperateTypeEnum operateType = this.getOperateType(oldObject, newObject);
DataTracerOperateTypeEnum.Common operateType = this.getOperateType(oldObject, newObject);
String operateContent = "";
if (OperateTypeEnum.ADD.equals(operateType) || OperateTypeEnum.DELETE.equals(operateType)) {
if (DataTracerOperateTypeEnum.Common.SAVE.equals(operateType) || DataTracerOperateTypeEnum.Common.DELETE.equals(operateType)) {
operateContent = this.getAddDeleteContent(newObject);
}
if (OperateTypeEnum.UPDATE.equals(operateType)) {
if (DataTracerOperateTypeEnum.Common.UPDATE.equals(operateType)) {
operateContent = this.getUpdateContent(oldObject, newObject);
}
if (StringUtils.isEmpty(operateContent)) {
@ -149,7 +151,7 @@ public class BeanRecordService {
* @param object
* @return
*/
public String beanParse(String operateDesc, Object object) {
public String beanObjectParse(String operateDesc, Object object) {
String content = this.getAddDeleteContent(object);
if (StringUtils.isEmpty(operateDesc)) {
return content;
@ -303,8 +305,8 @@ public class BeanRecordService {
}
String relateFieldValue = fieldValue.toString();
QueryWrapper qw = new QueryWrapper();
qw.select(fieldSqlValue.relateDisplayColumn());
qw.eq(fieldSqlValue.relateColumn(), relateFieldValue);
qw.select(CaseFormat.UPPER_CAMEL.to(CaseFormat.LOWER_UNDERSCORE, fieldSqlValue.relateDisplayColumn()));
qw.eq(CaseFormat.UPPER_CAMEL.to(CaseFormat.LOWER_UNDERSCORE, fieldSqlValue.relateColumn()), relateFieldValue);
List<Object> displayValue = mapper.selectObjs(qw);
if (CollectionUtils.isEmpty(displayValue)) {
return "";
@ -343,14 +345,14 @@ public class BeanRecordService {
* @param newObject
* @return
*/
private OperateTypeEnum getOperateType(Object oldObject, Object newObject) {
private DataTracerOperateTypeEnum.Common getOperateType(Object oldObject, Object newObject) {
if (oldObject == null && newObject != null) {
return OperateTypeEnum.ADD;
return DataTracerOperateTypeEnum.Common.SAVE;
}
if (oldObject != null && newObject == null) {
return OperateTypeEnum.DELETE;
return DataTracerOperateTypeEnum.Common.DELETE;
}
return OperateTypeEnum.UPDATE;
return DataTracerOperateTypeEnum.Common.UPDATE;
}
/**
@ -366,18 +368,18 @@ public class BeanRecordService {
return false;
}
if (oldObject == null && newObject != null) {
log.info("bean operate log: oldObject is null,new:" + newObject.getClass().getName() + " " + OperateTypeEnum.ADD.getDesc());
log.info("bean operate log: oldObject is null,new:" + newObject.getClass().getName() + " " + DataTracerOperateTypeEnum.Common.SAVE.getDesc());
return true;
}
if (oldObject != null && newObject == null) {
log.info("bean operate log: newObject is null,old:" + oldObject.getClass().getName() + " " + OperateTypeEnum.DELETE.getDesc());
log.info("bean operate log: newObject is null,old:" + oldObject.getClass().getName() + " " + DataTracerOperateTypeEnum.Common.DELETE.getDesc());
return true;
}
if (oldObject != null && newObject != null) {
String oldClass = oldObject.getClass().getName();
String newClass = newObject.getClass().getName();
if (oldClass.equals(newClass)) {
log.info("bean operate log: " + oldObject.getClass().getName() + " " + OperateTypeEnum.UPDATE.getDesc());
log.info("bean operate log: " + oldObject.getClass().getName() + " " + DataTracerOperateTypeEnum.Common.UPDATE.getDesc());
return true;
}
log.error("bean operate log: is different class:old:" + oldClass + " new:" + newClass);
@ -400,11 +402,11 @@ public class BeanRecordService {
return false;
}
if (CollectionUtils.isEmpty(oldObjectList) && CollectionUtils.isNotEmpty(newObjectList)) {
log.info("bean operate log: oldObjectList is null,new:" + newObjectList.getClass().getName() + " " + OperateTypeEnum.ADD.getDesc());
log.info("bean operate log: oldObjectList is null,new:" + newObjectList.getClass().getName() + " " + DataTracerOperateTypeEnum.Common.SAVE.getDesc());
return true;
}
if (CollectionUtils.isNotEmpty(oldObjectList) && CollectionUtils.isEmpty(newObjectList)) {
log.info("bean operate log: newObject is null,old:" + oldObjectList.getClass().getName() + " " + OperateTypeEnum.DELETE.getDesc());
log.info("bean operate log: newObject is null,old:" + oldObjectList.getClass().getName() + " " + DataTracerOperateTypeEnum.Common.DELETE.getDesc());
return true;
}
if (CollectionUtils.isNotEmpty(oldObjectList) && CollectionUtils.isNotEmpty(newObjectList)) {
@ -413,7 +415,7 @@ public class BeanRecordService {
String oldClass = oldObject.getClass().getName();
String newClass = newObject.getClass().getName();
if (oldClass.equals(newClass)) {
log.info("bean operate log: " + oldObject.getClass().getName() + " " + OperateTypeEnum.UPDATE.getDesc());
log.info("bean operate log: " + oldObject.getClass().getName() + " " + DataTracerOperateTypeEnum.Common.UPDATE.getDesc());
return true;
}
log.error("bean operate log: is different class:old:" + oldClass + " new:" + newClass);

View File

@ -1,4 +1,4 @@
package net.lab1024.smartadmin.service.module.support.beanrecord.annotation;
package net.lab1024.smartadmin.service.module.support.datatracer.anno;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;

View File

@ -1,4 +1,4 @@
package net.lab1024.smartadmin.service.module.support.beanrecord.annotation;
package net.lab1024.smartadmin.service.module.support.datatracer.anno;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;

View File

@ -1,4 +1,4 @@
package net.lab1024.smartadmin.service.module.support.beanrecord.annotation;
package net.lab1024.smartadmin.service.module.support.datatracer.anno;
import net.lab1024.smartadmin.service.common.enumeration.BaseEnum;

View File

@ -1,4 +1,4 @@
package net.lab1024.smartadmin.service.module.support.beanrecord.annotation;
package net.lab1024.smartadmin.service.module.support.datatracer.anno;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;

View File

@ -15,7 +15,7 @@ import net.lab1024.smartadmin.service.common.enumeration.BaseEnum;
@Getter
public enum DataTracerBusinessTypeEnum implements BaseEnum {
NOTICE(1, "系统通知"),
GOODS(1, "商品"),
;

View File

@ -18,11 +18,9 @@ public interface DataTracerOperateTypeEnum extends BaseEnum {
@AllArgsConstructor
@Getter
enum Common implements BaseEnum {
SAVE(0, "保存"),
SAVE_SUBMIT(1, "保存并提交"),
SAVE(1, "保存"),
UPDATE(2, "更新"),
UPDATE_SUBMIT(3, "更新并提交"),
DELETE(4, "删除");
DELETE(3, "删除");
private final Integer value;