9 changed files with 384 additions and 116 deletions
@ -0,0 +1,35 @@
@@ -0,0 +1,35 @@
|
||||
package com.ruoyi.dhc.domain; |
||||
|
||||
import java.lang.annotation.ElementType; |
||||
import java.lang.annotation.Retention; |
||||
import java.lang.annotation.RetentionPolicy; |
||||
import java.lang.annotation.Target; |
||||
|
||||
/** |
||||
* 对excel导入时,处理枚举转化 |
||||
* @Author 996 |
||||
* @Date 2024/3/13 |
||||
*/ |
||||
@Target(ElementType.FIELD) |
||||
@Retention(RetentionPolicy.RUNTIME) |
||||
public @interface EnumFiledConvert { |
||||
|
||||
|
||||
/** |
||||
* 枚举映射map key-value,key-value,key-value,key-value |
||||
* @return |
||||
*/ |
||||
String enumMap() default ""; |
||||
|
||||
/** |
||||
* 枚举类导入、导出在excel中的分隔符号 |
||||
* @return |
||||
*/ |
||||
String spiteChar() default ","; |
||||
|
||||
/** |
||||
* 单选 or 多选 |
||||
* @return |
||||
*/ |
||||
boolean single() default true; |
||||
} |
@ -1,269 +1,304 @@
@@ -1,269 +1,304 @@
|
||||
package com.ruoyi.dhc.domain; |
||||
|
||||
import java.util.Date; |
||||
|
||||
import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; |
||||
import com.alibaba.excel.annotation.ExcelProperty; |
||||
import com.alibaba.excel.annotation.write.style.ColumnWidth; |
||||
import com.alibaba.excel.annotation.write.style.HeadFontStyle; |
||||
import com.alibaba.excel.annotation.write.style.HeadRowHeight; |
||||
import com.fasterxml.jackson.annotation.JsonFormat; |
||||
import com.ruoyi.common.annotation.Excel; |
||||
import com.ruoyi.common.annotation.Excel.ColumnType; |
||||
import com.ruoyi.common.core.domain.BaseEntity; |
||||
import com.ruoyi.dhc.domain.read.EasyExcelConvert; |
||||
import org.apache.commons.lang3.builder.ToStringBuilder; |
||||
import org.apache.commons.lang3.builder.ToStringStyle; |
||||
|
||||
/** |
||||
* 操作日志记录表 oper_log |
||||
* |
||||
* |
||||
* @author ruoyi |
||||
*/ |
||||
public class SysOperLog extends BaseEntity |
||||
{ |
||||
@ExcelIgnoreUnannotated |
||||
@ColumnWidth(16) |
||||
@HeadRowHeight(14) |
||||
@HeadFontStyle(fontHeightInPoints = 11) |
||||
public class SysOperLog extends BaseEntity { |
||||
private static final long serialVersionUID = 1L; |
||||
|
||||
/** 日志主键 */ |
||||
@Excel(name = "操作序号", cellType = ColumnType.NUMERIC) |
||||
/** |
||||
* 日志主键 |
||||
*/ |
||||
@ExcelProperty(value = "操作序号") |
||||
private Long operId; |
||||
|
||||
/** 操作模块 */ |
||||
@Excel(name = "操作模块") |
||||
/** |
||||
* 操作模块 |
||||
*/ |
||||
@ExcelProperty(value = "操作模块") |
||||
private String title; |
||||
|
||||
/** 业务类型(0其它 1新增 2修改 3删除) */ |
||||
@Excel(name = "业务类型", readConverterExp = "0=其它,1=新增,2=修改,3=删除,4=授权,5=导出,6=导入,7=强退,8=生成代码,9=清空数据") |
||||
/** |
||||
* 业务类型(0其它 1新增 2修改 3删除) |
||||
*/ |
||||
@ExcelProperty(value = "业务类型", converter = EasyExcelConvert.class) |
||||
@EnumFiledConvert(enumMap = "0-其它,1-新增,2-修改,3-删除,4-授权,5-导出,6-导入,7-强退,8-生成代码,9-清空数据") |
||||
private Integer businessType; |
||||
|
||||
/** 业务类型数组 */ |
||||
/** |
||||
* 业务类型数组 |
||||
*/ |
||||
private Integer[] businessTypes; |
||||
|
||||
/** 请求方法 */ |
||||
@Excel(name = "请求方法") |
||||
/** |
||||
* 请求方法 |
||||
*/ |
||||
@ExcelProperty(value = "请求方法") |
||||
private String method; |
||||
|
||||
/** 请求方式 */ |
||||
@Excel(name = "请求方式") |
||||
/** |
||||
* 请求方式 |
||||
*/ |
||||
@ExcelProperty(value = "请求方式") |
||||
private String requestMethod; |
||||
|
||||
/** 操作类别(0其它 1后台用户 2手机端用户) */ |
||||
@Excel(name = "操作类别", readConverterExp = "0=其它,1=后台用户,2=手机端用户") |
||||
/** |
||||
* 操作类别(0其它 1后台用户 2手机端用户) |
||||
*/ |
||||
@ExcelProperty(value = "操作类别", converter = EasyExcelConvert.class) |
||||
@EnumFiledConvert(enumMap = "0-其它,1-后台用户,2-手机端用户") |
||||
|
||||
private Integer operatorType; |
||||
|
||||
/** 操作人员 */ |
||||
@Excel(name = "操作人员") |
||||
/** |
||||
* 操作人员 |
||||
*/ |
||||
@ExcelProperty(value = "操作人员") |
||||
private String operName; |
||||
|
||||
/** 部门名称 */ |
||||
@Excel(name = "部门名称") |
||||
/** |
||||
* 部门名称 |
||||
*/ |
||||
@ExcelProperty(value = "部门名称") |
||||
private String deptName; |
||||
|
||||
/** 请求url */ |
||||
@Excel(name = "请求地址") |
||||
/** |
||||
* 请求url |
||||
*/ |
||||
@ExcelProperty(value = "请求地址") |
||||
private String operUrl; |
||||
|
||||
/** 操作地址 */ |
||||
@Excel(name = "操作地址") |
||||
/** |
||||
* 操作地址 |
||||
*/ |
||||
@ExcelProperty(value = "操作地址") |
||||
private String operIp; |
||||
|
||||
/** 操作地点 */ |
||||
@Excel(name = "操作地点") |
||||
/** |
||||
* 操作地点 |
||||
*/ |
||||
@ExcelProperty(value = "操作地点") |
||||
private String operLocation; |
||||
|
||||
/** 请求参数 */ |
||||
@Excel(name = "请求参数") |
||||
/** |
||||
* 请求参数 |
||||
*/ |
||||
@ExcelProperty(value = "请求参数") |
||||
private String operParam; |
||||
|
||||
/** 返回参数 */ |
||||
@Excel(name = "返回参数") |
||||
/** |
||||
* 返回参数 |
||||
*/ |
||||
@ExcelProperty(value = "返回参数") |
||||
private String jsonResult; |
||||
|
||||
/** 操作状态(0正常 1异常) */ |
||||
@Excel(name = "状态", readConverterExp = "0=正常,1=异常") |
||||
/** |
||||
* 操作状态(0正常 1异常) |
||||
*/ |
||||
@ExcelProperty(value = "状态", converter = EasyExcelConvert.class) |
||||
@EnumFiledConvert(enumMap = "0-正常,1-异常") |
||||
private Integer status; |
||||
|
||||
/** 错误消息 */ |
||||
@Excel(name = "错误消息") |
||||
/** |
||||
* 错误消息 |
||||
*/ |
||||
@ExcelProperty(value = "错误消息") |
||||
private String errorMsg; |
||||
|
||||
/** 操作时间 */ |
||||
/** |
||||
* 操作时间 |
||||
*/ |
||||
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") |
||||
@Excel(name = "操作时间", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss") |
||||
@ExcelProperty(value = "操作时间") |
||||
private Date operTime; |
||||
|
||||
/** 消耗时间 */ |
||||
@Excel(name = "消耗时间", suffix = "毫秒") |
||||
private Long costTime; |
||||
|
||||
public Long getOperId() |
||||
{ |
||||
public Long getOperId() { |
||||
return operId; |
||||
} |
||||
|
||||
public void setOperId(Long operId) |
||||
{ |
||||
public void setOperId(Long operId) { |
||||
this.operId = operId; |
||||
} |
||||
|
||||
public String getTitle() |
||||
{ |
||||
public String getTitle() { |
||||
return title; |
||||
} |
||||
|
||||
public void setTitle(String title) |
||||
{ |
||||
public void setTitle(String title) { |
||||
this.title = title; |
||||
} |
||||
|
||||
public Integer getBusinessType() |
||||
{ |
||||
public Integer getBusinessType() { |
||||
return businessType; |
||||
} |
||||
|
||||
public void setBusinessType(Integer businessType) |
||||
{ |
||||
public void setBusinessType(Integer businessType) { |
||||
this.businessType = businessType; |
||||
} |
||||
|
||||
public Integer[] getBusinessTypes() |
||||
{ |
||||
public Integer[] getBusinessTypes() { |
||||
return businessTypes; |
||||
} |
||||
|
||||
public void setBusinessTypes(Integer[] businessTypes) |
||||
{ |
||||
public void setBusinessTypes(Integer[] businessTypes) { |
||||
this.businessTypes = businessTypes; |
||||
} |
||||
|
||||
public String getMethod() |
||||
{ |
||||
public String getMethod() { |
||||
return method; |
||||
} |
||||
|
||||
public void setMethod(String method) |
||||
{ |
||||
public void setMethod(String method) { |
||||
this.method = method; |
||||
} |
||||
|
||||
public String getRequestMethod() |
||||
{ |
||||
public String getRequestMethod() { |
||||
return requestMethod; |
||||
} |
||||
|
||||
public void setRequestMethod(String requestMethod) |
||||
{ |
||||
public void setRequestMethod(String requestMethod) { |
||||
this.requestMethod = requestMethod; |
||||
} |
||||
|
||||
public Integer getOperatorType() |
||||
{ |
||||
public Integer getOperatorType() { |
||||
return operatorType; |
||||
} |
||||
|
||||
public void setOperatorType(Integer operatorType) |
||||
{ |
||||
public void setOperatorType(Integer operatorType) { |
||||
this.operatorType = operatorType; |
||||
} |
||||
|
||||
public String getOperName() |
||||
{ |
||||
public String getOperName() { |
||||
return operName; |
||||
} |
||||
|
||||
public void setOperName(String operName) |
||||
{ |
||||
public void setOperName(String operName) { |
||||
this.operName = operName; |
||||
} |
||||
|
||||
public String getDeptName() |
||||
{ |
||||
public String getDeptName() { |
||||
return deptName; |
||||
} |
||||
|
||||
public void setDeptName(String deptName) |
||||
{ |
||||
public void setDeptName(String deptName) { |
||||
this.deptName = deptName; |
||||
} |
||||
|
||||
public String getOperUrl() |
||||
{ |
||||
public String getOperUrl() { |
||||
return operUrl; |
||||
} |
||||
|
||||
public void setOperUrl(String operUrl) |
||||
{ |
||||
public void setOperUrl(String operUrl) { |
||||
this.operUrl = operUrl; |
||||
} |
||||
|
||||
public String getOperIp() |
||||
{ |
||||
public String getOperIp() { |
||||
return operIp; |
||||
} |
||||
|
||||
public void setOperIp(String operIp) |
||||
{ |
||||
public void setOperIp(String operIp) { |
||||
this.operIp = operIp; |
||||
} |
||||
|
||||
public String getOperLocation() |
||||
{ |
||||
public String getOperLocation() { |
||||
return operLocation; |
||||
} |
||||
|
||||
public void setOperLocation(String operLocation) |
||||
{ |
||||
public void setOperLocation(String operLocation) { |
||||
this.operLocation = operLocation; |
||||
} |
||||
|
||||
public String getOperParam() |
||||
{ |
||||
public String getOperParam() { |
||||
return operParam; |
||||
} |
||||
|
||||
public void setOperParam(String operParam) |
||||
{ |
||||
public void setOperParam(String operParam) { |
||||
this.operParam = operParam; |
||||
} |
||||
|
||||
public String getJsonResult() |
||||
{ |
||||
public String getJsonResult() { |
||||
return jsonResult; |
||||
} |
||||
|
||||
public void setJsonResult(String jsonResult) |
||||
{ |
||||
public void setJsonResult(String jsonResult) { |
||||
this.jsonResult = jsonResult; |
||||
} |
||||
|
||||
public Integer getStatus() |
||||
{ |
||||
public Integer getStatus() { |
||||
return status; |
||||
} |
||||
|
||||
public void setStatus(Integer status) |
||||
{ |
||||
public void setStatus(Integer status) { |
||||
this.status = status; |
||||
} |
||||
|
||||
public String getErrorMsg() |
||||
{ |
||||
public String getErrorMsg() { |
||||
return errorMsg; |
||||
} |
||||
|
||||
public void setErrorMsg(String errorMsg) |
||||
{ |
||||
public void setErrorMsg(String errorMsg) { |
||||
this.errorMsg = errorMsg; |
||||
} |
||||
|
||||
public Date getOperTime() |
||||
{ |
||||
public Date getOperTime() { |
||||
return operTime; |
||||
} |
||||
|
||||
public void setOperTime(Date operTime) |
||||
{ |
||||
public void setOperTime(Date operTime) { |
||||
this.operTime = operTime; |
||||
} |
||||
|
||||
public Long getCostTime() |
||||
{ |
||||
public Long getCostTime() { |
||||
return costTime; |
||||
} |
||||
|
||||
public void setCostTime(Long costTime) |
||||
{ |
||||
public void setCostTime(Long costTime) { |
||||
this.costTime = costTime; |
||||
} |
||||
|
||||
@Override |
||||
public String toString() { |
||||
return new ToStringBuilder(this, ToStringStyle.MULTI_LINE_STYLE) |
||||
.append("operId", getOperId()) |
||||
.append("title", getTitle()) |
||||
.append("businessType", getBusinessType()) |
||||
.append("businessTypes", getBusinessTypes()) |
||||
.append("method", getMethod()) |
||||
.append("requestMethod", getRequestMethod()) |
||||
.append("operatorType", getOperatorType()) |
||||
.append("operName", getOperName()) |
||||
.append("deptName", getDeptName()) |
||||
.append("operUrl", getOperUrl()) |
||||
.append("operIp", getOperIp()) |
||||
.append("operLocation", getOperLocation()) |
||||
.append("operParam", getOperParam()) |
||||
.append("status", getStatus()) |
||||
.append("errorMsg", getErrorMsg()) |
||||
.append("operTime", getOperTime()) |
||||
.toString(); |
||||
} |
||||
} |
||||
|
@ -0,0 +1,138 @@
@@ -0,0 +1,138 @@
|
||||
package com.ruoyi.dhc.domain.read; |
||||
|
||||
import com.alibaba.excel.converters.Converter; |
||||
import com.alibaba.excel.enums.CellDataTypeEnum; |
||||
import com.alibaba.excel.metadata.GlobalConfiguration; |
||||
import com.alibaba.excel.metadata.data.ReadCellData; |
||||
import com.alibaba.excel.metadata.data.WriteCellData; |
||||
import com.alibaba.excel.metadata.property.ExcelContentProperty; |
||||
import com.ruoyi.dhc.domain.EnumFiledConvert; |
||||
import org.springframework.util.StringUtils; |
||||
|
||||
import java.lang.reflect.Field; |
||||
import java.util.Arrays; |
||||
import java.util.HashMap; |
||||
import java.util.List; |
||||
import java.util.Map; |
||||
import java.util.stream.Collectors; |
||||
|
||||
/** |
||||
* excel导入导出针对枚举类型的转换器 |
||||
* |
||||
* @Author 996 |
||||
* @Date 2024/3/13 |
||||
*/ |
||||
public class EasyExcelConvert implements Converter<Object> { |
||||
/** |
||||
* 枚举列表 |
||||
*/ |
||||
private Map<String, String> enumMap = new HashMap<>(); |
||||
|
||||
|
||||
/** |
||||
* excel转化后的类型 |
||||
* |
||||
* @return |
||||
*/ |
||||
@Override |
||||
public Class<?> supportJavaTypeKey() { |
||||
return Object.class; |
||||
} |
||||
|
||||
/** |
||||
* excel中的数据类型,统一设置字符串 |
||||
* |
||||
* @return |
||||
*/ |
||||
@Override |
||||
public CellDataTypeEnum supportExcelTypeKey() { |
||||
return CellDataTypeEnum.STRING; |
||||
} |
||||
|
||||
/** |
||||
* 导入转换 |
||||
* @param cellData 当前单元格对象 |
||||
* @param contentProperty 当前单元格属性 |
||||
* @param globalConfiguration |
||||
* @return |
||||
* @throws Exception |
||||
*/ |
||||
@Override |
||||
public Object convertToJavaData(ReadCellData<?> cellData, ExcelContentProperty contentProperty, GlobalConfiguration globalConfiguration) throws Exception { |
||||
String cellMsg = cellData.getStringValue(); |
||||
Field field = contentProperty.getField(); |
||||
EnumFiledConvert enumFiledConvert = field.getAnnotation(EnumFiledConvert.class); |
||||
if (enumFiledConvert == null) { |
||||
return null; |
||||
} |
||||
String enumStr = enumFiledConvert.enumMap(); |
||||
// 解析枚举映射关系
|
||||
getEnumMap(enumStr, true); |
||||
// 是否为单选
|
||||
boolean single = enumFiledConvert.single(); |
||||
// 如果是单选,默认Java属性为integer
|
||||
if (single) { |
||||
String res = enumMap.get(cellMsg); |
||||
return StringUtils.hasText(res) ? Integer.valueOf(res) : null; |
||||
} else { |
||||
// 多选分隔符
|
||||
String spiteChar = enumFiledConvert.spiteChar(); |
||||
// 多选枚举,默认Java属性为字符串,格式为 key1,key2,key3
|
||||
List<String> strStr = Arrays.asList(cellMsg.split(spiteChar)).stream().map(s -> String.valueOf(enumMap.get(s))).collect(Collectors.toList()); |
||||
String str = String.join(spiteChar, strStr); |
||||
return str; |
||||
} |
||||
} |
||||
|
||||
/** |
||||
* 导出转化 |
||||
* @param value 当前值 |
||||
* @param contentProperty 当前单元格属性 |
||||
* @param globalConfiguration |
||||
* @return |
||||
* @throws Exception |
||||
*/ |
||||
@Override |
||||
public WriteCellData<?> convertToExcelData(Object value, ExcelContentProperty contentProperty, GlobalConfiguration globalConfiguration) throws Exception { |
||||
Field field = contentProperty.getField(); |
||||
EnumFiledConvert enumFiledConvert = field.getAnnotation(EnumFiledConvert.class); |
||||
if (enumFiledConvert == null) { |
||||
return new WriteCellData(); |
||||
} |
||||
// 解析枚举字符串
|
||||
String enumStr = enumFiledConvert.enumMap(); |
||||
getEnumMap(enumStr, false); |
||||
// 是否为单选
|
||||
boolean single = enumFiledConvert.single(); |
||||
// 如果是单选,默认Java属性为integer
|
||||
if (single) { |
||||
return new WriteCellData(enumMap.getOrDefault(String.valueOf(value), "")); |
||||
} else { |
||||
// 多选分隔符
|
||||
String spiteChar = enumFiledConvert.spiteChar(); |
||||
// 多选枚举,默认Java属性为字符串,格式为 key1,key2,key3
|
||||
List<String> strStr = Arrays.asList(String.valueOf(value).split(spiteChar)).stream().map(s -> String.valueOf(enumMap.get(s))).collect(Collectors.toList()); |
||||
String str = String.join(spiteChar, strStr); |
||||
return new WriteCellData(str); |
||||
} |
||||
} |
||||
|
||||
/** |
||||
* 根据注解配置的枚举映射字符串进行解析到map中 |
||||
* @param mapStr |
||||
* @param readOrWrite 读excel 、 写excel |
||||
*/ |
||||
private void getEnumMap(String mapStr, boolean readOrWrite) { |
||||
String[] enumS = mapStr.split(","); |
||||
for (String anEnum : enumS) { |
||||
String[] data = anEnum.split("-"); |
||||
if (readOrWrite) { |
||||
// 读excel excel中的数据都是value,转换成key
|
||||
enumMap.put(data[1], data[0]); |
||||
} else { |
||||
// 写excel Java中的数据都是key,转换成value
|
||||
enumMap.put(data[0], data[1]); |
||||
} |
||||
} |
||||
} |
||||
} |
Loading…
Reference in new issue