测试导入导出功能、注解字典转换功能案例

ccongli-dev-0811
LI-CCONG\李聪聪 1 year ago
parent 61818816a4
commit f68b58448c

@ -1,11 +1,11 @@
package com.yunxi.scm.framework.excel.core.convert; package com.yunxi.scm.framework.excel.core.convert;
import com.yunxi.scm.framework.common.util.json.JsonUtils;
import com.alibaba.excel.converters.Converter; import com.alibaba.excel.converters.Converter;
import com.alibaba.excel.enums.CellDataTypeEnum; import com.alibaba.excel.enums.CellDataTypeEnum;
import com.alibaba.excel.metadata.GlobalConfiguration; import com.alibaba.excel.metadata.GlobalConfiguration;
import com.alibaba.excel.metadata.data.WriteCellData; import com.alibaba.excel.metadata.data.WriteCellData;
import com.alibaba.excel.metadata.property.ExcelContentProperty; import com.alibaba.excel.metadata.property.ExcelContentProperty;
import com.yunxi.scm.framework.common.util.json.JsonUtils;
/** /**
* Excel Json * Excel Json
@ -16,11 +16,13 @@ public class JsonConvert implements Converter<Object> {
@Override @Override
public Class<?> supportJavaTypeKey() { public Class<?> supportJavaTypeKey() {
throw new UnsupportedOperationException("暂不支持,也不需要"); throw new UnsupportedOperationException("暂不支持,也不需要");
} }
@Override @Override
public CellDataTypeEnum supportExcelTypeKey() { public CellDataTypeEnum supportExcelTypeKey() {
throw new UnsupportedOperationException("暂不支持,也不需要"); throw new UnsupportedOperationException("暂不支持,也不需要");
} }

@ -0,0 +1,81 @@
package com.yunxi.scm.framework.excel.core.convert;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.StrUtil;
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.yunxi.scm.framework.dict.core.util.DictFrameworkUtils;
import com.yunxi.scm.framework.excel.core.annotations.DictFormat;
import lombok.extern.slf4j.Slf4j;
import java.util.ArrayList;
import java.util.List;
@Slf4j
public class MutilDictConvert implements Converter<List<String>> {
// 分隔符
private static final String COMMA = ",";
// 指定转化参数的Java类型
@Override
public Class<?> supportJavaTypeKey() {
return List.class;
}
// 指定转化参数对应的单元格类型
@Override
public CellDataTypeEnum supportExcelTypeKey() {
return CellDataTypeEnum.STRING;
}
@Override
public List<String> convertToJavaData(ReadCellData readCellData, ExcelContentProperty contentProperty,
GlobalConfiguration globalConfiguration) {
// 使用字典解析
String type = getType(contentProperty);
String strings = readCellData.getStringValue();
// Class<?> fieldClazz = contentProperty.getField().getType(); // 获取被注解的字段类型
List<String> labels = StrUtil.splitTrim(strings, COMMA);
List<String> values = new ArrayList<>();
for(String label : labels) {
String value = DictFrameworkUtils.parseDictDataValue(type, label);
if (value == null) {
log.error("[convertToJavaData][type({}) 解析不掉 label({})]", type, label);
return null;
}
values.add(value);
}
// return Convert.convert(fieldClazz, value); // 类型转换
return values;
}
@Override
public WriteCellData<String> convertToExcelData(List<String> values, ExcelContentProperty contentProperty,
GlobalConfiguration globalConfiguration) {
// 空时,返回空
if (values == null || values.isEmpty()) {
return new WriteCellData<>("");
}
// 使用字典格式化
String type = getType(contentProperty);
List<String> labels = new ArrayList<>();
for(String value : values) {
String label = DictFrameworkUtils.getDictDataLabel(type, value);
if (label == null) {
log.error("[convertToExcelData][type({}) 转换不了 label({})]", type, value);
} else {
labels.add(label);
}
}
// 生成 Excel 小表格
return new WriteCellData<>(CollUtil.join(labels, COMMA));
}
private static String getType(ExcelContentProperty contentProperty) {
return contentProperty.getField().getAnnotation(DictFormat.class).value();
}
}

@ -1,16 +1,32 @@
package com.yunxi.scm.module.demo.controller.admin; package com.yunxi.scm.module.demo.controller.admin;
import com.yunxi.scm.framework.common.pojo.CommonResult; import com.yunxi.scm.framework.common.pojo.CommonResult;
import com.yunxi.scm.framework.excel.core.util.ExcelUtils;
import com.yunxi.scm.framework.operatelog.core.annotations.OperateLog;
import com.yunxi.scm.module.demo.controller.admin.material.vo.MaterialExportTestVO;
import com.yunxi.scm.module.demo.controller.admin.material.vo.MaterialImportTestVO;
import com.yunxi.scm.module.demo.convert.material.MaterialConvert;
import com.yunxi.scm.module.demo.dal.dataobject.material.MaterialXDO;
import com.yunxi.scm.module.demo.enums.material.CategoryEnum;
import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.Parameters;
import io.swagger.v3.oas.annotations.tags.Tag; import io.swagger.v3.oas.annotations.tags.Tag;
import org.springframework.validation.annotation.Validated; import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.*;
import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.security.PermitAll; import javax.annotation.security.PermitAll;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
import static com.yunxi.scm.framework.common.pojo.CommonResult.success; import static com.yunxi.scm.framework.common.pojo.CommonResult.success;
import static com.yunxi.scm.framework.operatelog.core.enums.OperateTypeEnum.EXPORT;
import static com.yunxi.scm.framework.operatelog.core.enums.OperateTypeEnum.IMPORT;
@Tag(name = "管理后台 - Test") @Tag(name = "管理后台 - Test")
@RestController @RestController
@ -25,4 +41,48 @@ public class DemoTestController {
return success("无需认证即可访问的后台接口"); return success("无需认证即可访问的后台接口");
} }
@GetMapping("/test_export")
@Operation(summary = "测试导出和字典转化")
@PermitAll
@OperateLog(type = EXPORT)
public void testExport(HttpServletResponse response) throws IOException {
MaterialXDO xdo1 = new MaterialXDO(Arrays.asList("1","2"));
MaterialXDO xdo2 = new MaterialXDO(Arrays.asList("1","3"));
List<MaterialXDO> xdos = new ArrayList<>();
xdos.add(xdo1);
xdos.add(xdo2);
List<MaterialExportTestVO> datas = MaterialConvert.INSTANCE.convertList03(xdos);
ExcelUtils.write(response, "测试导出.xls", "数据", MaterialExportTestVO.class, datas);
}
@PostMapping("/test_import")
@Operation(summary = "测试导入和转化为字典")
@PermitAll
@OperateLog(type = IMPORT)
@Parameters({
@Parameter(name = "file", description = "Excel 文件", required = true),
@Parameter(name = "updateSupport", description = "是否支持更新,默认为 false", example = "true")
})
public CommonResult<List<MaterialImportTestVO>> testImport(@RequestParam("file") MultipartFile file,
@RequestParam(value = "updateSupport", required = false, defaultValue = "false") Boolean updateSupport) throws IOException {
List<MaterialImportTestVO> list = ExcelUtils.read(file, MaterialImportTestVO.class);
return success(list);
}
@GetMapping("/get-import-template")
@PermitAll
@Operation(summary = "获得导入模板")
public void importTemplate(HttpServletResponse response) throws IOException {
List<String> values = Arrays.asList(CategoryEnum.COMMON.getCode(),CategoryEnum.KANJIA.getCode())
.stream().map(v-> String.valueOf(v)).collect(Collectors.toList());
// 手动创建导出 demo
List<MaterialImportTestVO> list = Arrays.asList(
MaterialImportTestVO.builder().category(values).build()
);
// 输出
ExcelUtils.write(response, "导入模板.xls", "物料标准模版", MaterialImportTestVO.class, list);
}
} }

@ -26,9 +26,9 @@ public class MaterialBaseVO {
@NotNull(message = "类型不能为空") @NotNull(message = "类型不能为空")
private Byte type; private Byte type;
@Schema(description = "分类", requiredMode = Schema.RequiredMode.REQUIRED, example = "[1,2]") @Schema(description = "分类", requiredMode = Schema.RequiredMode.REQUIRED, example = "1,2")
@NotNull(message = "分类不能为空") @NotNull(message = "分类不能为空")
private List<Integer> category; private List<String> categories;
@Schema(description = "图片", requiredMode = Schema.RequiredMode.REQUIRED, example = "https://www.iocoder.cn") @Schema(description = "图片", requiredMode = Schema.RequiredMode.REQUIRED, example = "https://www.iocoder.cn")
@NotNull(message = "图片不能为空") @NotNull(message = "图片不能为空")

@ -3,6 +3,7 @@ package com.yunxi.scm.module.demo.controller.admin.material.vo;
import com.alibaba.excel.annotation.ExcelProperty; import com.alibaba.excel.annotation.ExcelProperty;
import com.yunxi.scm.framework.excel.core.annotations.DictFormat; import com.yunxi.scm.framework.excel.core.annotations.DictFormat;
import com.yunxi.scm.framework.excel.core.convert.DictConvert; import com.yunxi.scm.framework.excel.core.convert.DictConvert;
import com.yunxi.scm.framework.excel.core.convert.JsonConvert;
import com.yunxi.scm.module.demo.enums.DictTypeConstants; import com.yunxi.scm.module.demo.enums.DictTypeConstants;
import lombok.Data; import lombok.Data;
@ -19,7 +20,7 @@ import java.util.List;
@Data @Data
public class MaterialExcelVO { public class MaterialExcelVO {
@ExcelProperty("ID") @ExcelProperty("编号")
private Long id; private Long id;
@ExcelProperty("名称") @ExcelProperty("名称")
@ -29,13 +30,13 @@ public class MaterialExcelVO {
@DictFormat(DictTypeConstants.MATERIAL_STATUS) @DictFormat(DictTypeConstants.MATERIAL_STATUS)
private Byte status; private Byte status;
@ExcelProperty("类型") @ExcelProperty(value = "类型", converter = DictConvert.class)
@DictFormat(DictTypeConstants.TRADE_ORDER_TYPE) @DictFormat(DictTypeConstants.TRADE_ORDER_TYPE)
private Byte type; private Byte type;
@ExcelProperty("分类") @ExcelProperty(value = "分类", converter = JsonConvert.class)
@DictFormat(DictTypeConstants.TRADE_ORDER_TYPE) private List<String> categories;
private List<Integer> category;
@ExcelProperty("图片") @ExcelProperty("图片")
private String imgurl; private String imgurl;

@ -5,7 +5,6 @@ import lombok.Data;
import org.springframework.format.annotation.DateTimeFormat; import org.springframework.format.annotation.DateTimeFormat;
import java.time.LocalDateTime; import java.time.LocalDateTime;
import java.util.List;
import static com.yunxi.scm.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; import static com.yunxi.scm.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
@ -22,8 +21,8 @@ public class MaterialExportReqVO {
@Schema(description = "类型", example = "2") @Schema(description = "类型", example = "2")
private Byte type; private Byte type;
@Schema(description = "分类") @Schema(description = "分类", example = "1")
private List<Integer> category; private String category;
@Schema(description = "创建时间") @Schema(description = "创建时间")
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)

@ -0,0 +1,18 @@
package com.yunxi.scm.module.demo.controller.admin.material.vo;
import com.alibaba.excel.annotation.ExcelProperty;
import com.yunxi.scm.framework.excel.core.annotations.DictFormat;
import com.yunxi.scm.framework.excel.core.convert.MutilDictConvert;
import com.yunxi.scm.module.demo.enums.DictTypeConstants;
import lombok.Data;
import java.util.List;
// 测试转换
@Data
public class MaterialExportTestVO {
@ExcelProperty(value = "分类测试", converter = MutilDictConvert.class)
@DictFormat(DictTypeConstants.TRADE_ORDER_TYPE)
private List<String> category;
}

@ -0,0 +1,27 @@
package com.yunxi.scm.module.demo.controller.admin.material.vo;
import com.alibaba.excel.annotation.ExcelProperty;
import com.yunxi.scm.framework.excel.core.annotations.DictFormat;
import com.yunxi.scm.framework.excel.core.convert.MutilDictConvert;
import com.yunxi.scm.module.demo.enums.DictTypeConstants;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;
import java.util.List;
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
@Accessors(chain = false) // 设置 chain = false避免用户导入有问题
public class MaterialImportTestVO {
@ExcelProperty(value = "分类测试", converter = MutilDictConvert.class)
@DictFormat(DictTypeConstants.TRADE_ORDER_TYPE)
private List<String> category;
}

@ -8,7 +8,6 @@ import lombok.ToString;
import org.springframework.format.annotation.DateTimeFormat; import org.springframework.format.annotation.DateTimeFormat;
import java.time.LocalDateTime; import java.time.LocalDateTime;
import java.util.List;
import static com.yunxi.scm.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; import static com.yunxi.scm.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
@ -27,8 +26,8 @@ public class MaterialPageReqVO extends PageParam {
@Schema(description = "类型", example = "2") @Schema(description = "类型", example = "2")
private Byte type; private Byte type;
@Schema(description = "分类", example = "[1,2]") @Schema(description = "分类", example = "2")
private List<Integer> category; private String category;
@Schema(description = "创建时间") @Schema(description = "创建时间")
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)

@ -1,13 +1,13 @@
package com.yunxi.scm.module.demo.convert.material; package com.yunxi.scm.module.demo.convert.material;
import java.util.*;
import com.yunxi.scm.framework.common.pojo.PageResult; import com.yunxi.scm.framework.common.pojo.PageResult;
import org.mapstruct.Mapper;
import org.mapstruct.factory.Mappers;
import com.yunxi.scm.module.demo.controller.admin.material.vo.*; import com.yunxi.scm.module.demo.controller.admin.material.vo.*;
import com.yunxi.scm.module.demo.dal.dataobject.material.MaterialDO; import com.yunxi.scm.module.demo.dal.dataobject.material.MaterialDO;
import com.yunxi.scm.module.demo.dal.dataobject.material.MaterialXDO;
import org.mapstruct.Mapper;
import org.mapstruct.factory.Mappers;
import java.util.List;
/** /**
* Convert * Convert
@ -31,4 +31,7 @@ public interface MaterialConvert {
List<MaterialExcelVO> convertList02(List<MaterialDO> list); List<MaterialExcelVO> convertList02(List<MaterialDO> list);
List<MaterialExportTestVO> convertList03(List<MaterialXDO> list);
} }

@ -5,7 +5,7 @@ import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName; import com.baomidou.mybatisplus.annotation.TableName;
import com.yunxi.scm.framework.mybatis.core.dataobject.BaseDO; import com.yunxi.scm.framework.mybatis.core.dataobject.BaseDO;
import com.yunxi.scm.framework.mybatis.core.type.IntegerListTypeHandler; import com.yunxi.scm.framework.mybatis.core.type.StringListTypeHandler;
import lombok.*; import lombok.*;
import java.math.BigDecimal; import java.math.BigDecimal;
@ -49,8 +49,8 @@ public class MaterialDO extends BaseDO {
* *
*/ */
// @TableField(typeHandler = JacksonTypeHandler.class) // @TableField(typeHandler = JacksonTypeHandler.class)
@TableField(typeHandler = IntegerListTypeHandler.class) @TableField(typeHandler = StringListTypeHandler.class)
private List<Integer> category; private List<String> categories;
/** /**
* *
*/ */

@ -0,0 +1,15 @@
package com.yunxi.scm.module.demo.dal.dataobject.material;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.List;
@Data
@NoArgsConstructor
@AllArgsConstructor
public class MaterialXDO {
private List<String> category;
}

@ -1,13 +1,14 @@
package com.yunxi.scm.module.demo.dal.mysql.material; package com.yunxi.scm.module.demo.dal.mysql.material;
import java.util.*;
import com.yunxi.scm.framework.common.pojo.PageResult; import com.yunxi.scm.framework.common.pojo.PageResult;
import com.yunxi.scm.framework.mybatis.core.query.LambdaQueryWrapperX;
import com.yunxi.scm.framework.mybatis.core.mapper.BaseMapperX; import com.yunxi.scm.framework.mybatis.core.mapper.BaseMapperX;
import com.yunxi.scm.framework.mybatis.core.query.LambdaQueryWrapperX;
import com.yunxi.scm.module.demo.controller.admin.material.vo.MaterialExportReqVO;
import com.yunxi.scm.module.demo.controller.admin.material.vo.MaterialPageReqVO;
import com.yunxi.scm.module.demo.dal.dataobject.material.MaterialDO; import com.yunxi.scm.module.demo.dal.dataobject.material.MaterialDO;
import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Mapper;
import com.yunxi.scm.module.demo.controller.admin.material.vo.*;
import java.util.List;
/** /**
* Mapper * Mapper
@ -22,7 +23,7 @@ public interface MaterialMapper extends BaseMapperX<MaterialDO> {
.likeIfPresent(MaterialDO::getName, reqVO.getName()) .likeIfPresent(MaterialDO::getName, reqVO.getName())
.eqIfPresent(MaterialDO::getStatus, reqVO.getStatus()) .eqIfPresent(MaterialDO::getStatus, reqVO.getStatus())
.eqIfPresent(MaterialDO::getType, reqVO.getType()) .eqIfPresent(MaterialDO::getType, reqVO.getType())
.eqIfPresent(MaterialDO::getCategory, reqVO.getCategory()) .likeIfPresent(MaterialDO::getCategories, reqVO.getCategory())
.betweenIfPresent(MaterialDO::getCreateTime, reqVO.getCreateTime()) .betweenIfPresent(MaterialDO::getCreateTime, reqVO.getCreateTime())
.orderByDesc(MaterialDO::getId)); .orderByDesc(MaterialDO::getId));
} }
@ -32,7 +33,7 @@ public interface MaterialMapper extends BaseMapperX<MaterialDO> {
.likeIfPresent(MaterialDO::getName, reqVO.getName()) .likeIfPresent(MaterialDO::getName, reqVO.getName())
.eqIfPresent(MaterialDO::getStatus, reqVO.getStatus()) .eqIfPresent(MaterialDO::getStatus, reqVO.getStatus())
.eqIfPresent(MaterialDO::getType, reqVO.getType()) .eqIfPresent(MaterialDO::getType, reqVO.getType())
.eqIfPresent(MaterialDO::getCategory, reqVO.getCategory()) .likeIfPresent(MaterialDO::getCategories, reqVO.getCategory())
.betweenIfPresent(MaterialDO::getCreateTime, reqVO.getCreateTime()) .betweenIfPresent(MaterialDO::getCreateTime, reqVO.getCreateTime())
.orderByDesc(MaterialDO::getId)); .orderByDesc(MaterialDO::getId));
} }

@ -0,0 +1,34 @@
package com.yunxi.scm.module.demo.enums.material;
import com.yunxi.scm.framework.common.core.IntArrayValuable;
import lombok.AllArgsConstructor;
import lombok.Getter;
import java.util.Arrays;
@Getter
@AllArgsConstructor
public enum CategoryEnum implements IntArrayValuable {
COMMON(0, "普通"),
MIAOSHA(1, "秒杀"),
PINTUAN(2,"拼团"),
KANJIA(3, "砍价");
public static final int[] ARRAYS = Arrays.stream(values()).mapToInt(CategoryEnum::getCode).toArray();
/**
*
*/
private final Integer code;
/**
*
*/
private final String name;
@Override
public int[] array() {
return ARRAYS;
}
}

@ -1,32 +1,28 @@
package com.yunxi.scm.module.demo.service.material; package com.yunxi.scm.module.demo.service.material;
import org.junit.jupiter.api.Disabled; import com.yunxi.scm.framework.common.pojo.PageResult;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.mock.mockito.MockBean;
import javax.annotation.Resource;
import com.yunxi.scm.framework.test.core.ut.BaseDbUnitTest; import com.yunxi.scm.framework.test.core.ut.BaseDbUnitTest;
import com.yunxi.scm.module.demo.controller.admin.material.vo.MaterialCreateReqVO;
import com.yunxi.scm.module.demo.controller.admin.material.vo.*; import com.yunxi.scm.module.demo.controller.admin.material.vo.MaterialExportReqVO;
import com.yunxi.scm.module.demo.controller.admin.material.vo.MaterialPageReqVO;
import com.yunxi.scm.module.demo.controller.admin.material.vo.MaterialUpdateReqVO;
import com.yunxi.scm.module.demo.dal.dataobject.material.MaterialDO; import com.yunxi.scm.module.demo.dal.dataobject.material.MaterialDO;
import com.yunxi.scm.module.demo.dal.mysql.material.MaterialMapper; import com.yunxi.scm.module.demo.dal.mysql.material.MaterialMapper;
import com.yunxi.scm.framework.common.pojo.PageResult; import org.junit.jupiter.api.Disabled;
import org.junit.jupiter.api.Test;
import org.springframework.context.annotation.Import;
import javax.annotation.Resource; import javax.annotation.Resource;
import org.springframework.context.annotation.Import; import java.util.List;
import java.util.*;
import java.time.LocalDateTime; import static com.yunxi.scm.framework.common.util.date.LocalDateTimeUtils.buildBetweenTime;
import static com.yunxi.scm.framework.common.util.object.ObjectUtils.cloneIgnoreId;
import static cn.hutool.core.util.RandomUtil.*; import static com.yunxi.scm.framework.test.core.util.AssertUtils.assertPojoEquals;
import static com.yunxi.scm.module.demo.enums.ErrorCodeConstants.*; import static com.yunxi.scm.framework.test.core.util.AssertUtils.assertServiceException;
import static com.yunxi.scm.framework.test.core.util.AssertUtils.*; import static com.yunxi.scm.framework.test.core.util.RandomUtils.randomLongId;
import static com.yunxi.scm.framework.test.core.util.RandomUtils.*; import static com.yunxi.scm.framework.test.core.util.RandomUtils.randomPojo;
import static com.yunxi.scm.framework.common.util.date.LocalDateTimeUtils.*; import static com.yunxi.scm.module.demo.enums.ErrorCodeConstants.MATERIAL_NOT_EXISTS;
import static com.yunxi.scm.framework.common.util.object.ObjectUtils.*;
import static com.yunxi.scm.framework.common.util.date.DateUtils.*;
import static org.junit.jupiter.api.Assertions.*; import static org.junit.jupiter.api.Assertions.*;
import static org.mockito.Mockito.*;
/** /**
* {@link MaterialServiceImpl} * {@link MaterialServiceImpl}
@ -113,7 +109,7 @@ public class MaterialServiceImplTest extends BaseDbUnitTest {
o.setName(null); o.setName(null);
o.setStatus(null); o.setStatus(null);
o.setType(null); o.setType(null);
o.setCategory(null); o.setCategories(null);
o.setCreateTime(null); o.setCreateTime(null);
}); });
materialMapper.insert(dbMaterial); materialMapper.insert(dbMaterial);
@ -124,7 +120,7 @@ public class MaterialServiceImplTest extends BaseDbUnitTest {
// 测试 type 不匹配 // 测试 type 不匹配
materialMapper.insert(cloneIgnoreId(dbMaterial, o -> o.setType(null))); materialMapper.insert(cloneIgnoreId(dbMaterial, o -> o.setType(null)));
// 测试 category 不匹配 // 测试 category 不匹配
materialMapper.insert(cloneIgnoreId(dbMaterial, o -> o.setCategory(null))); materialMapper.insert(cloneIgnoreId(dbMaterial, o -> o.setCategories(null)));
// 测试 createTime 不匹配 // 测试 createTime 不匹配
materialMapper.insert(cloneIgnoreId(dbMaterial, o -> o.setCreateTime(null))); materialMapper.insert(cloneIgnoreId(dbMaterial, o -> o.setCreateTime(null)));
// 准备参数 // 准备参数
@ -151,7 +147,7 @@ public class MaterialServiceImplTest extends BaseDbUnitTest {
o.setName(null); o.setName(null);
o.setStatus(null); o.setStatus(null);
o.setType(null); o.setType(null);
o.setCategory(null); o.setCategories(null);
o.setCreateTime(null); o.setCreateTime(null);
}); });
materialMapper.insert(dbMaterial); materialMapper.insert(dbMaterial);
@ -162,7 +158,7 @@ public class MaterialServiceImplTest extends BaseDbUnitTest {
// 测试 type 不匹配 // 测试 type 不匹配
materialMapper.insert(cloneIgnoreId(dbMaterial, o -> o.setType(null))); materialMapper.insert(cloneIgnoreId(dbMaterial, o -> o.setType(null)));
// 测试 category 不匹配 // 测试 category 不匹配
materialMapper.insert(cloneIgnoreId(dbMaterial, o -> o.setCategory(null))); materialMapper.insert(cloneIgnoreId(dbMaterial, o -> o.setCategories(null)));
// 测试 createTime 不匹配 // 测试 createTime 不匹配
materialMapper.insert(cloneIgnoreId(dbMaterial, o -> o.setCreateTime(null))); materialMapper.insert(cloneIgnoreId(dbMaterial, o -> o.setCreateTime(null)));
// 准备参数 // 准备参数

@ -19,7 +19,6 @@ import com.yunxi.scm.module.infra.dal.dataobject.file.FileConfigDO;
import com.yunxi.scm.module.infra.dal.mysql.file.FileConfigMapper; import com.yunxi.scm.module.infra.dal.mysql.file.FileConfigMapper;
import lombok.Getter; import lombok.Getter;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
import org.springframework.validation.annotation.Validated; import org.springframework.validation.annotation.Validated;
@ -30,7 +29,6 @@ import javax.validation.Validator;
import java.time.LocalDateTime; import java.time.LocalDateTime;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.concurrent.TimeUnit;
import static com.yunxi.scm.framework.common.exception.util.ServiceExceptionUtil.exception; import static com.yunxi.scm.framework.common.exception.util.ServiceExceptionUtil.exception;
import static com.yunxi.scm.module.infra.enums.ErrorCodeConstants.FILE_CONFIG_DELETE_FAIL_MASTER; import static com.yunxi.scm.module.infra.enums.ErrorCodeConstants.FILE_CONFIG_DELETE_FAIL_MASTER;
@ -88,7 +86,7 @@ public class FileConfigServiceImpl implements FileConfigService {
* *
* *
*/ */
@Scheduled(initialDelay = 60, fixedRate = 60, timeUnit = TimeUnit.SECONDS) // @Scheduled(initialDelay = 60, fixedRate = 60, timeUnit = TimeUnit.SECONDS)
public void refreshLocalCache() { public void refreshLocalCache() {
// 情况一:如果缓存里没有数据,则直接刷新缓存 // 情况一:如果缓存里没有数据,则直接刷新缓存
if (CollUtil.isEmpty(fileConfigCache)) { if (CollUtil.isEmpty(fileConfigCache)) {

@ -84,7 +84,7 @@ public class SensitiveWordController {
List<SensitiveWordDO> list = sensitiveWordService.getSensitiveWordList(exportReqVO); List<SensitiveWordDO> list = sensitiveWordService.getSensitiveWordList(exportReqVO);
// 导出 Excel // 导出 Excel
List<SensitiveWordExcelVO> datas = SensitiveWordConvert.INSTANCE.convertList02(list); List<SensitiveWordExcelVO> datas = SensitiveWordConvert.INSTANCE.convertList02(list);
ExcelUtils.write(response, "敏感词.xls", "数据", SensitiveWordExcelVO.class, datas); ExcelUtils.write(response, "敏感词123.xls", "数据", SensitiveWordExcelVO.class, datas);
} }
@GetMapping("/get-tags") @GetMapping("/get-tags")

@ -171,7 +171,6 @@ public class UserController {
UserImportExcelVO.builder().username("yuanma").deptId(2L).email("yuanma@iocoder.cn").mobile("15601701300") UserImportExcelVO.builder().username("yuanma").deptId(2L).email("yuanma@iocoder.cn").mobile("15601701300")
.nickname("源码").status(CommonStatusEnum.DISABLE.getStatus()).sex(SexEnum.FEMALE.getSex()).build() .nickname("源码").status(CommonStatusEnum.DISABLE.getStatus()).sex(SexEnum.FEMALE.getSex()).build()
); );
// 输出 // 输出
ExcelUtils.write(response, "用户导入模板.xls", "用户列表", UserImportExcelVO.class, list); ExcelUtils.write(response, "用户导入模板.xls", "用户列表", UserImportExcelVO.class, list);
} }

@ -1,12 +1,12 @@
package com.yunxi.scm.module.system.dal.dataobject.sensitiveword; package com.yunxi.scm.module.system.dal.dataobject.sensitiveword;
import com.yunxi.scm.framework.common.enums.CommonStatusEnum;
import com.yunxi.scm.framework.mybatis.core.dataobject.BaseDO;
import com.yunxi.scm.framework.mybatis.core.type.StringListTypeHandler;
import com.baomidou.mybatisplus.annotation.KeySequence; import com.baomidou.mybatisplus.annotation.KeySequence;
import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName; import com.baomidou.mybatisplus.annotation.TableName;
import com.yunxi.scm.framework.common.enums.CommonStatusEnum;
import com.yunxi.scm.framework.mybatis.core.dataobject.BaseDO;
import com.yunxi.scm.framework.mybatis.core.type.StringListTypeHandler;
import lombok.*; import lombok.*;
import java.util.List; import java.util.List;

@ -1,6 +1,8 @@
package com.yunxi.scm.module.system.service.sensitiveword; package com.yunxi.scm.module.system.service.sensitiveword;
import cn.hutool.core.collection.CollUtil; import cn.hutool.core.collection.CollUtil;
import com.google.common.collect.HashMultimap;
import com.google.common.collect.Multimap;
import com.yunxi.scm.framework.common.enums.CommonStatusEnum; import com.yunxi.scm.framework.common.enums.CommonStatusEnum;
import com.yunxi.scm.framework.common.pojo.PageResult; import com.yunxi.scm.framework.common.pojo.PageResult;
import com.yunxi.scm.framework.common.util.collection.CollectionUtils; import com.yunxi.scm.framework.common.util.collection.CollectionUtils;
@ -12,11 +14,8 @@ import com.yunxi.scm.module.system.convert.sensitiveword.SensitiveWordConvert;
import com.yunxi.scm.module.system.dal.dataobject.sensitiveword.SensitiveWordDO; import com.yunxi.scm.module.system.dal.dataobject.sensitiveword.SensitiveWordDO;
import com.yunxi.scm.module.system.dal.mysql.sensitiveword.SensitiveWordMapper; import com.yunxi.scm.module.system.dal.mysql.sensitiveword.SensitiveWordMapper;
import com.yunxi.scm.module.system.util.collection.SimpleTrie; import com.yunxi.scm.module.system.util.collection.SimpleTrie;
import com.google.common.collect.HashMultimap;
import com.google.common.collect.Multimap;
import lombok.Getter; import lombok.Getter;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.validation.annotation.Validated; import org.springframework.validation.annotation.Validated;
@ -24,7 +23,6 @@ import javax.annotation.PostConstruct;
import javax.annotation.Resource; import javax.annotation.Resource;
import java.time.LocalDateTime; import java.time.LocalDateTime;
import java.util.*; import java.util.*;
import java.util.concurrent.TimeUnit;
import static com.yunxi.scm.framework.common.exception.util.ServiceExceptionUtil.exception; import static com.yunxi.scm.framework.common.exception.util.ServiceExceptionUtil.exception;
import static com.yunxi.scm.framework.common.util.collection.CollectionUtils.filterList; import static com.yunxi.scm.framework.common.util.collection.CollectionUtils.filterList;
@ -115,7 +113,7 @@ public class SensitiveWordServiceImpl implements SensitiveWordService {
* *
* *
*/ */
@Scheduled(initialDelay = 60, fixedRate = 60, timeUnit = TimeUnit.SECONDS) // @Scheduled(initialDelay = 60, fixedRate = 60, timeUnit = TimeUnit.SECONDS)
public void refreshLocalCache() { public void refreshLocalCache() {
// 情况一:如果缓存里没有数据,则直接刷新缓存 // 情况一:如果缓存里没有数据,则直接刷新缓存
if (CollUtil.isEmpty(sensitiveWordCache)) { if (CollUtil.isEmpty(sensitiveWordCache)) {

@ -12,7 +12,6 @@ import com.yunxi.scm.module.system.dal.dataobject.sms.SmsChannelDO;
import com.yunxi.scm.module.system.dal.mysql.sms.SmsChannelMapper; import com.yunxi.scm.module.system.dal.mysql.sms.SmsChannelMapper;
import lombok.Getter; import lombok.Getter;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import javax.annotation.PostConstruct; import javax.annotation.PostConstruct;
@ -20,7 +19,6 @@ import javax.annotation.Resource;
import java.time.LocalDateTime; import java.time.LocalDateTime;
import java.util.Collections; import java.util.Collections;
import java.util.List; import java.util.List;
import java.util.concurrent.TimeUnit;
import static com.yunxi.scm.framework.common.exception.util.ServiceExceptionUtil.exception; import static com.yunxi.scm.framework.common.exception.util.ServiceExceptionUtil.exception;
import static com.yunxi.scm.framework.common.util.collection.CollectionUtils.getMaxValue; import static com.yunxi.scm.framework.common.util.collection.CollectionUtils.getMaxValue;
@ -69,7 +67,7 @@ public class SmsChannelServiceImpl implements SmsChannelService {
* *
* *
*/ */
@Scheduled(initialDelay = 60, fixedRate = 60, timeUnit = TimeUnit.SECONDS) // @Scheduled(initialDelay = 60, fixedRate = 60, timeUnit = TimeUnit.SECONDS)
public void refreshLocalCache() { public void refreshLocalCache() {
// 情况一:如果缓存里没有数据,则直接刷新缓存 // 情况一:如果缓存里没有数据,则直接刷新缓存
if (CollUtil.isEmpty(channelCache)) { if (CollUtil.isEmpty(channelCache)) {

@ -49,9 +49,9 @@ export default {
// //
this.getUnreadCount() this.getUnreadCount()
// //
setInterval(() => { // setInterval(() => {
this.getUnreadCount() // this.getUnreadCount()
},1000 * 60 * 2) // },1000 * 60 * 2)
}, },
methods: { methods: {
getList: function() { getList: function() {

@ -9,21 +9,21 @@
<el-form-item label="状态" prop="status"> <el-form-item label="状态" prop="status">
<el-select v-model="queryParams.status" placeholder="请选择状态" clearable size="small"> <el-select v-model="queryParams.status" placeholder="请选择状态" clearable size="small">
<el-option v-for="dict in this.getDictDatas(DICT_TYPE.MATERIAL_STATUS)" <el-option v-for="dict in this.getDictDatas(DICT_TYPE.MATERIAL_STATUS)"
:key="dict.value" :label="dict.label" :value="dict.value"/> :key="dict.value" :label="dict.label" :value="parseInt(dict.value)"/>
</el-select> </el-select>
</el-form-item> </el-form-item>
<el-form-item label="类型" prop="type"> <el-form-item label="类型" prop="type">
<el-select v-model="queryParams.type" placeholder="请选择类型" clearable size="small"> <el-select v-model="queryParams.type" placeholder="请选择类型" clearable size="small">
<el-option v-for="dict in this.getDictDatas(DICT_TYPE.TRADE_ORDER_TYPE)" <el-option v-for="dict in this.getDictDatas(DICT_TYPE.TRADE_ORDER_TYPE)"
:key="dict.value" :label="dict.label" :value="dict.value"/> :key="dict.value" :label="dict.label" :value="parseInt(dict.value)"/>
</el-select>
</el-form-item>
<el-form-item label="分类" prop="category">
<el-select v-model="queryParams.category" placeholder="请选择分类" clearable size="small">
<el-option v-for="dict in this.getDictDatas(DICT_TYPE.TRADE_ORDER_TYPE)"
:key="dict.value" :label="dict.label" :value="parseInt(dict.value)"/>
</el-select> </el-select>
</el-form-item> </el-form-item>
<!-- <el-form-item label="分类" prop="category">-->
<!-- <el-select v-model="queryParams.category" placeholder="请选择分类" clearable size="small">-->
<!-- <el-option v-for="dict in this.getDictDatas(DICT_TYPE.TRADE_ORDER_TYPE)"-->
<!-- :key="dict.value" :label="dict.label" :value="dict.value"/>-->
<!-- </el-select>-->
<!-- </el-form-item>-->
<el-form-item label="创建时间" prop="createTime"> <el-form-item label="创建时间" prop="createTime">
<el-date-picker v-model="queryParams.createTime" style="width: 240px" value-format="yyyy-MM-dd HH:mm:ss" type="daterange" <el-date-picker v-model="queryParams.createTime" style="width: 240px" value-format="yyyy-MM-dd HH:mm:ss" type="daterange"
range-separator="-" start-placeholder="开始日期" end-placeholder="结束日期" :default-time="['00:00:00', '23:59:59']" /> range-separator="-" start-placeholder="开始日期" end-placeholder="结束日期" :default-time="['00:00:00', '23:59:59']" />
@ -63,7 +63,7 @@
</el-table-column> </el-table-column>
<el-table-column label="分类" align="center" prop="category"> <el-table-column label="分类" align="center" prop="category">
<template v-slot="scope"> <template v-slot="scope">
<dict-tag :type="DICT_TYPE.TRADE_ORDER_TYPE" :value="scope.row.category" /> <dict-tag :type="DICT_TYPE.TRADE_ORDER_TYPE" :value="scope.row.categories" />
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="图片" align="center" prop="imgurl"> <el-table-column label="图片" align="center" prop="imgurl">
@ -288,11 +288,11 @@ export default {
params.pageNo = undefined; params.pageNo = undefined;
params.pageSize = undefined; params.pageSize = undefined;
this.$modal.confirm('是否确认导出所有物料管理数据项?').then(() => { this.$modal.confirm('是否确认导出所有物料管理数据项?').then(() => {
this.exportLoading = true; // this.exportLoading = true;
return exportMaterialExcel(params); return exportMaterialExcel(params);
}).then(response => { }).then(response => {
this.$download.excel(response, '物料管理.xls'); this.$download.excel(response, '物料管理.xls');
this.exportLoading = false; // this.exportLoading = false;
}).catch(() => {}); }).catch(() => {});
} }
} }

@ -315,7 +315,8 @@ export default {
this.exportLoading = true; this.exportLoading = true;
return exportSensitiveWordExcel(params); return exportSensitiveWordExcel(params);
}).then(response => { }).then(response => {
this.$download.excel(response, '${table.classComment}.xls'); // this.$download.excel(response, '${table.classComment}.xls');
this.$download.excel(response, '敏感词.xls');
this.exportLoading = false; this.exportLoading = false;
}).catch(() => { }).catch(() => {
}); });

Loading…
Cancel
Save