From f68b58448c56919400aca90145f270aa95cd4fb9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?LI-CCONG=5C=E6=9D=8E=E8=81=AA=E8=81=AA?= <1441652193@qq.com> Date: Thu, 17 Aug 2023 08:59:36 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B5=8B=E8=AF=95=E5=AF=BC=E5=85=A5=E5=AF=BC?= =?UTF-8?q?=E5=87=BA=E5=8A=9F=E8=83=BD=E3=80=81=E6=B3=A8=E8=A7=A3=E5=AD=97?= =?UTF-8?q?=E5=85=B8=E8=BD=AC=E6=8D=A2=E5=8A=9F=E8=83=BD=E6=A1=88=E4=BE=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../excel/core/convert/JsonConvert.java | 4 +- .../excel/core/convert/MutilDictConvert.java | 81 +++++++++++++++++++ .../controller/admin/DemoTestController.java | 66 ++++++++++++++- .../admin/material/vo/MaterialBaseVO.java | 4 +- .../admin/material/vo/MaterialExcelVO.java | 11 +-- .../material/vo/MaterialExportReqVO.java | 5 +- .../material/vo/MaterialExportTestVO.java | 18 +++++ .../material/vo/MaterialImportTestVO.java | 27 +++++++ .../admin/material/vo/MaterialPageReqVO.java | 5 +- .../convert/material/MaterialConvert.java | 13 +-- .../dal/dataobject/material/MaterialDO.java | 6 +- .../dal/dataobject/material/MaterialXDO.java | 15 ++++ .../dal/mysql/material/MaterialMapper.java | 13 +-- .../demo/enums/material/CategoryEnum.java | 34 ++++++++ .../material/MaterialServiceImplTest.java | 46 +++++------ .../service/file/FileConfigServiceImpl.java | 4 +- .../SensitiveWordController.java | 2 +- .../controller/admin/user/UserController.java | 1 - .../sensitiveword/SensitiveWordDO.java | 6 +- .../SensitiveWordServiceImpl.java | 8 +- .../service/sms/SmsChannelServiceImpl.java | 4 +- .../src/layout/components/Message/index.vue | 6 +- .../src/views/demo/material/index.vue | 22 ++--- .../src/views/system/sensitiveWord/index.vue | 3 +- 24 files changed, 317 insertions(+), 87 deletions(-) create mode 100644 yunxi-framework/yunxi-spring-boot-starter-excel/src/main/java/com/yunxi/scm/framework/excel/core/convert/MutilDictConvert.java create mode 100644 yunxi-module-demo/yunxi-module-demo-biz/src/main/java/com/yunxi/scm/module/demo/controller/admin/material/vo/MaterialExportTestVO.java create mode 100644 yunxi-module-demo/yunxi-module-demo-biz/src/main/java/com/yunxi/scm/module/demo/controller/admin/material/vo/MaterialImportTestVO.java create mode 100644 yunxi-module-demo/yunxi-module-demo-biz/src/main/java/com/yunxi/scm/module/demo/dal/dataobject/material/MaterialXDO.java create mode 100644 yunxi-module-demo/yunxi-module-demo-biz/src/main/java/com/yunxi/scm/module/demo/enums/material/CategoryEnum.java diff --git a/yunxi-framework/yunxi-spring-boot-starter-excel/src/main/java/com/yunxi/scm/framework/excel/core/convert/JsonConvert.java b/yunxi-framework/yunxi-spring-boot-starter-excel/src/main/java/com/yunxi/scm/framework/excel/core/convert/JsonConvert.java index 16d2060..df64aed 100644 --- a/yunxi-framework/yunxi-spring-boot-starter-excel/src/main/java/com/yunxi/scm/framework/excel/core/convert/JsonConvert.java +++ b/yunxi-framework/yunxi-spring-boot-starter-excel/src/main/java/com/yunxi/scm/framework/excel/core/convert/JsonConvert.java @@ -1,11 +1,11 @@ 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.enums.CellDataTypeEnum; import com.alibaba.excel.metadata.GlobalConfiguration; import com.alibaba.excel.metadata.data.WriteCellData; import com.alibaba.excel.metadata.property.ExcelContentProperty; +import com.yunxi.scm.framework.common.util.json.JsonUtils; /** * Excel Json 转换器 @@ -16,11 +16,13 @@ public class JsonConvert implements Converter { @Override public Class supportJavaTypeKey() { + throw new UnsupportedOperationException("暂不支持,也不需要"); } @Override public CellDataTypeEnum supportExcelTypeKey() { + throw new UnsupportedOperationException("暂不支持,也不需要"); } diff --git a/yunxi-framework/yunxi-spring-boot-starter-excel/src/main/java/com/yunxi/scm/framework/excel/core/convert/MutilDictConvert.java b/yunxi-framework/yunxi-spring-boot-starter-excel/src/main/java/com/yunxi/scm/framework/excel/core/convert/MutilDictConvert.java new file mode 100644 index 0000000..f0ae0f1 --- /dev/null +++ b/yunxi-framework/yunxi-spring-boot-starter-excel/src/main/java/com/yunxi/scm/framework/excel/core/convert/MutilDictConvert.java @@ -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> { + + // 分隔符 + private static final String COMMA = ","; + + // 指定转化参数的Java类型 + @Override + public Class supportJavaTypeKey() { + return List.class; + } + + // 指定转化参数对应的单元格类型 + @Override + public CellDataTypeEnum supportExcelTypeKey() { + return CellDataTypeEnum.STRING; + } + + @Override + public List convertToJavaData(ReadCellData readCellData, ExcelContentProperty contentProperty, + GlobalConfiguration globalConfiguration) { + // 使用字典解析 + String type = getType(contentProperty); + String strings = readCellData.getStringValue(); +// Class fieldClazz = contentProperty.getField().getType(); // 获取被注解的字段类型 + List labels = StrUtil.splitTrim(strings, COMMA); + List 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 convertToExcelData(List values, ExcelContentProperty contentProperty, + GlobalConfiguration globalConfiguration) { + // 空时,返回空 + if (values == null || values.isEmpty()) { + return new WriteCellData<>(""); + } + // 使用字典格式化 + String type = getType(contentProperty); + List 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(); + } +} diff --git a/yunxi-module-demo/yunxi-module-demo-biz/src/main/java/com/yunxi/scm/module/demo/controller/admin/DemoTestController.java b/yunxi-module-demo/yunxi-module-demo-biz/src/main/java/com/yunxi/scm/module/demo/controller/admin/DemoTestController.java index 36699d1..f35bba5 100644 --- a/yunxi-module-demo/yunxi-module-demo-biz/src/main/java/com/yunxi/scm/module/demo/controller/admin/DemoTestController.java +++ b/yunxi-module-demo/yunxi-module-demo-biz/src/main/java/com/yunxi/scm/module/demo/controller/admin/DemoTestController.java @@ -1,16 +1,32 @@ package com.yunxi.scm.module.demo.controller.admin; 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.Parameter; +import io.swagger.v3.oas.annotations.Parameters; import io.swagger.v3.oas.annotations.tags.Tag; import org.springframework.validation.annotation.Validated; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; 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.operatelog.core.enums.OperateTypeEnum.EXPORT; +import static com.yunxi.scm.framework.operatelog.core.enums.OperateTypeEnum.IMPORT; @Tag(name = "管理后台 - Test") @RestController @@ -25,4 +41,48 @@ public class DemoTestController { 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 xdos = new ArrayList<>(); + xdos.add(xdo1); + xdos.add(xdo2); + List 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> testImport(@RequestParam("file") MultipartFile file, + @RequestParam(value = "updateSupport", required = false, defaultValue = "false") Boolean updateSupport) throws IOException { + List list = ExcelUtils.read(file, MaterialImportTestVO.class); + return success(list); + } + + + @GetMapping("/get-import-template") + @PermitAll + @Operation(summary = "获得导入模板") + public void importTemplate(HttpServletResponse response) throws IOException { + List values = Arrays.asList(CategoryEnum.COMMON.getCode(),CategoryEnum.KANJIA.getCode()) + .stream().map(v-> String.valueOf(v)).collect(Collectors.toList()); + // 手动创建导出 demo + List list = Arrays.asList( + MaterialImportTestVO.builder().category(values).build() + ); + // 输出 + ExcelUtils.write(response, "导入模板.xls", "物料标准模版", MaterialImportTestVO.class, list); + } } diff --git a/yunxi-module-demo/yunxi-module-demo-biz/src/main/java/com/yunxi/scm/module/demo/controller/admin/material/vo/MaterialBaseVO.java b/yunxi-module-demo/yunxi-module-demo-biz/src/main/java/com/yunxi/scm/module/demo/controller/admin/material/vo/MaterialBaseVO.java index dec2484..24bd461 100644 --- a/yunxi-module-demo/yunxi-module-demo-biz/src/main/java/com/yunxi/scm/module/demo/controller/admin/material/vo/MaterialBaseVO.java +++ b/yunxi-module-demo/yunxi-module-demo-biz/src/main/java/com/yunxi/scm/module/demo/controller/admin/material/vo/MaterialBaseVO.java @@ -26,9 +26,9 @@ public class MaterialBaseVO { @NotNull(message = "类型不能为空") private Byte type; - @Schema(description = "分类", requiredMode = Schema.RequiredMode.REQUIRED, example = "[1,2]") + @Schema(description = "分类", requiredMode = Schema.RequiredMode.REQUIRED, example = "1,2") @NotNull(message = "分类不能为空") - private List category; + private List categories; @Schema(description = "图片", requiredMode = Schema.RequiredMode.REQUIRED, example = "https://www.iocoder.cn") @NotNull(message = "图片不能为空") diff --git a/yunxi-module-demo/yunxi-module-demo-biz/src/main/java/com/yunxi/scm/module/demo/controller/admin/material/vo/MaterialExcelVO.java b/yunxi-module-demo/yunxi-module-demo-biz/src/main/java/com/yunxi/scm/module/demo/controller/admin/material/vo/MaterialExcelVO.java index 8d568c4..d289090 100644 --- a/yunxi-module-demo/yunxi-module-demo-biz/src/main/java/com/yunxi/scm/module/demo/controller/admin/material/vo/MaterialExcelVO.java +++ b/yunxi-module-demo/yunxi-module-demo-biz/src/main/java/com/yunxi/scm/module/demo/controller/admin/material/vo/MaterialExcelVO.java @@ -3,6 +3,7 @@ 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.DictConvert; +import com.yunxi.scm.framework.excel.core.convert.JsonConvert; import com.yunxi.scm.module.demo.enums.DictTypeConstants; import lombok.Data; @@ -19,7 +20,7 @@ import java.util.List; @Data public class MaterialExcelVO { - @ExcelProperty("ID") + @ExcelProperty("编号") private Long id; @ExcelProperty("名称") @@ -29,13 +30,13 @@ public class MaterialExcelVO { @DictFormat(DictTypeConstants.MATERIAL_STATUS) private Byte status; - @ExcelProperty("类型") + @ExcelProperty(value = "类型", converter = DictConvert.class) @DictFormat(DictTypeConstants.TRADE_ORDER_TYPE) private Byte type; - @ExcelProperty("分类") - @DictFormat(DictTypeConstants.TRADE_ORDER_TYPE) - private List category; + @ExcelProperty(value = "分类", converter = JsonConvert.class) + private List categories; + @ExcelProperty("图片") private String imgurl; diff --git a/yunxi-module-demo/yunxi-module-demo-biz/src/main/java/com/yunxi/scm/module/demo/controller/admin/material/vo/MaterialExportReqVO.java b/yunxi-module-demo/yunxi-module-demo-biz/src/main/java/com/yunxi/scm/module/demo/controller/admin/material/vo/MaterialExportReqVO.java index 3af3bea..52b645b 100644 --- a/yunxi-module-demo/yunxi-module-demo-biz/src/main/java/com/yunxi/scm/module/demo/controller/admin/material/vo/MaterialExportReqVO.java +++ b/yunxi-module-demo/yunxi-module-demo-biz/src/main/java/com/yunxi/scm/module/demo/controller/admin/material/vo/MaterialExportReqVO.java @@ -5,7 +5,6 @@ import lombok.Data; import org.springframework.format.annotation.DateTimeFormat; 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; @@ -22,8 +21,8 @@ public class MaterialExportReqVO { @Schema(description = "类型", example = "2") private Byte type; - @Schema(description = "分类") - private List category; + @Schema(description = "分类", example = "1") + private String category; @Schema(description = "创建时间") @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) diff --git a/yunxi-module-demo/yunxi-module-demo-biz/src/main/java/com/yunxi/scm/module/demo/controller/admin/material/vo/MaterialExportTestVO.java b/yunxi-module-demo/yunxi-module-demo-biz/src/main/java/com/yunxi/scm/module/demo/controller/admin/material/vo/MaterialExportTestVO.java new file mode 100644 index 0000000..2a63529 --- /dev/null +++ b/yunxi-module-demo/yunxi-module-demo-biz/src/main/java/com/yunxi/scm/module/demo/controller/admin/material/vo/MaterialExportTestVO.java @@ -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 category; +} diff --git a/yunxi-module-demo/yunxi-module-demo-biz/src/main/java/com/yunxi/scm/module/demo/controller/admin/material/vo/MaterialImportTestVO.java b/yunxi-module-demo/yunxi-module-demo-biz/src/main/java/com/yunxi/scm/module/demo/controller/admin/material/vo/MaterialImportTestVO.java new file mode 100644 index 0000000..63ddb9c --- /dev/null +++ b/yunxi-module-demo/yunxi-module-demo-biz/src/main/java/com/yunxi/scm/module/demo/controller/admin/material/vo/MaterialImportTestVO.java @@ -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 category; +} diff --git a/yunxi-module-demo/yunxi-module-demo-biz/src/main/java/com/yunxi/scm/module/demo/controller/admin/material/vo/MaterialPageReqVO.java b/yunxi-module-demo/yunxi-module-demo-biz/src/main/java/com/yunxi/scm/module/demo/controller/admin/material/vo/MaterialPageReqVO.java index 92e0014..1f97dfa 100644 --- a/yunxi-module-demo/yunxi-module-demo-biz/src/main/java/com/yunxi/scm/module/demo/controller/admin/material/vo/MaterialPageReqVO.java +++ b/yunxi-module-demo/yunxi-module-demo-biz/src/main/java/com/yunxi/scm/module/demo/controller/admin/material/vo/MaterialPageReqVO.java @@ -8,7 +8,6 @@ import lombok.ToString; import org.springframework.format.annotation.DateTimeFormat; 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; @@ -27,8 +26,8 @@ public class MaterialPageReqVO extends PageParam { @Schema(description = "类型", example = "2") private Byte type; - @Schema(description = "分类", example = "[1,2]") - private List category; + @Schema(description = "分类", example = "2") + private String category; @Schema(description = "创建时间") @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) diff --git a/yunxi-module-demo/yunxi-module-demo-biz/src/main/java/com/yunxi/scm/module/demo/convert/material/MaterialConvert.java b/yunxi-module-demo/yunxi-module-demo-biz/src/main/java/com/yunxi/scm/module/demo/convert/material/MaterialConvert.java index e65e644..0c6b6cb 100644 --- a/yunxi-module-demo/yunxi-module-demo-biz/src/main/java/com/yunxi/scm/module/demo/convert/material/MaterialConvert.java +++ b/yunxi-module-demo/yunxi-module-demo-biz/src/main/java/com/yunxi/scm/module/demo/convert/material/MaterialConvert.java @@ -1,13 +1,13 @@ package com.yunxi.scm.module.demo.convert.material; -import java.util.*; - 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.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 @@ -31,4 +31,7 @@ public interface MaterialConvert { List convertList02(List list); + + List convertList03(List list); + } diff --git a/yunxi-module-demo/yunxi-module-demo-biz/src/main/java/com/yunxi/scm/module/demo/dal/dataobject/material/MaterialDO.java b/yunxi-module-demo/yunxi-module-demo-biz/src/main/java/com/yunxi/scm/module/demo/dal/dataobject/material/MaterialDO.java index 43baff2..3eb3e1f 100644 --- a/yunxi-module-demo/yunxi-module-demo-biz/src/main/java/com/yunxi/scm/module/demo/dal/dataobject/material/MaterialDO.java +++ b/yunxi-module-demo/yunxi-module-demo-biz/src/main/java/com/yunxi/scm/module/demo/dal/dataobject/material/MaterialDO.java @@ -5,7 +5,7 @@ import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; 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 java.math.BigDecimal; @@ -49,8 +49,8 @@ public class MaterialDO extends BaseDO { * 分类 */ // @TableField(typeHandler = JacksonTypeHandler.class) - @TableField(typeHandler = IntegerListTypeHandler.class) - private List category; + @TableField(typeHandler = StringListTypeHandler.class) + private List categories; /** * 图片 */ diff --git a/yunxi-module-demo/yunxi-module-demo-biz/src/main/java/com/yunxi/scm/module/demo/dal/dataobject/material/MaterialXDO.java b/yunxi-module-demo/yunxi-module-demo-biz/src/main/java/com/yunxi/scm/module/demo/dal/dataobject/material/MaterialXDO.java new file mode 100644 index 0000000..686cae9 --- /dev/null +++ b/yunxi-module-demo/yunxi-module-demo-biz/src/main/java/com/yunxi/scm/module/demo/dal/dataobject/material/MaterialXDO.java @@ -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 category; +} diff --git a/yunxi-module-demo/yunxi-module-demo-biz/src/main/java/com/yunxi/scm/module/demo/dal/mysql/material/MaterialMapper.java b/yunxi-module-demo/yunxi-module-demo-biz/src/main/java/com/yunxi/scm/module/demo/dal/mysql/material/MaterialMapper.java index 567cb60..fd38697 100644 --- a/yunxi-module-demo/yunxi-module-demo-biz/src/main/java/com/yunxi/scm/module/demo/dal/mysql/material/MaterialMapper.java +++ b/yunxi-module-demo/yunxi-module-demo-biz/src/main/java/com/yunxi/scm/module/demo/dal/mysql/material/MaterialMapper.java @@ -1,13 +1,14 @@ 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.mybatis.core.query.LambdaQueryWrapperX; 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 org.apache.ibatis.annotations.Mapper; -import com.yunxi.scm.module.demo.controller.admin.material.vo.*; + +import java.util.List; /** * 物料管理 Mapper @@ -22,7 +23,7 @@ public interface MaterialMapper extends BaseMapperX { .likeIfPresent(MaterialDO::getName, reqVO.getName()) .eqIfPresent(MaterialDO::getStatus, reqVO.getStatus()) .eqIfPresent(MaterialDO::getType, reqVO.getType()) - .eqIfPresent(MaterialDO::getCategory, reqVO.getCategory()) + .likeIfPresent(MaterialDO::getCategories, reqVO.getCategory()) .betweenIfPresent(MaterialDO::getCreateTime, reqVO.getCreateTime()) .orderByDesc(MaterialDO::getId)); } @@ -32,7 +33,7 @@ public interface MaterialMapper extends BaseMapperX { .likeIfPresent(MaterialDO::getName, reqVO.getName()) .eqIfPresent(MaterialDO::getStatus, reqVO.getStatus()) .eqIfPresent(MaterialDO::getType, reqVO.getType()) - .eqIfPresent(MaterialDO::getCategory, reqVO.getCategory()) + .likeIfPresent(MaterialDO::getCategories, reqVO.getCategory()) .betweenIfPresent(MaterialDO::getCreateTime, reqVO.getCreateTime()) .orderByDesc(MaterialDO::getId)); } diff --git a/yunxi-module-demo/yunxi-module-demo-biz/src/main/java/com/yunxi/scm/module/demo/enums/material/CategoryEnum.java b/yunxi-module-demo/yunxi-module-demo-biz/src/main/java/com/yunxi/scm/module/demo/enums/material/CategoryEnum.java new file mode 100644 index 0000000..881e37f --- /dev/null +++ b/yunxi-module-demo/yunxi-module-demo-biz/src/main/java/com/yunxi/scm/module/demo/enums/material/CategoryEnum.java @@ -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; + } +} diff --git a/yunxi-module-demo/yunxi-module-demo-biz/src/test/java/com/yunxi/scm/module/demo/service/material/MaterialServiceImplTest.java b/yunxi-module-demo/yunxi-module-demo-biz/src/test/java/com/yunxi/scm/module/demo/service/material/MaterialServiceImplTest.java index b3154fa..04c1b14 100644 --- a/yunxi-module-demo/yunxi-module-demo-biz/src/test/java/com/yunxi/scm/module/demo/service/material/MaterialServiceImplTest.java +++ b/yunxi-module-demo/yunxi-module-demo-biz/src/test/java/com/yunxi/scm/module/demo/service/material/MaterialServiceImplTest.java @@ -1,32 +1,28 @@ package com.yunxi.scm.module.demo.service.material; -import org.junit.jupiter.api.Disabled; -import org.junit.jupiter.api.Test; -import org.springframework.boot.test.mock.mockito.MockBean; - -import javax.annotation.Resource; - +import com.yunxi.scm.framework.common.pojo.PageResult; import com.yunxi.scm.framework.test.core.ut.BaseDbUnitTest; - -import com.yunxi.scm.module.demo.controller.admin.material.vo.*; +import com.yunxi.scm.module.demo.controller.admin.material.vo.MaterialCreateReqVO; +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.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 org.springframework.context.annotation.Import; -import java.util.*; -import java.time.LocalDateTime; - -import static cn.hutool.core.util.RandomUtil.*; -import static com.yunxi.scm.module.demo.enums.ErrorCodeConstants.*; -import static com.yunxi.scm.framework.test.core.util.AssertUtils.*; -import static com.yunxi.scm.framework.test.core.util.RandomUtils.*; -import static com.yunxi.scm.framework.common.util.date.LocalDateTimeUtils.*; -import static com.yunxi.scm.framework.common.util.object.ObjectUtils.*; -import static com.yunxi.scm.framework.common.util.date.DateUtils.*; +import java.util.List; + +import static com.yunxi.scm.framework.common.util.date.LocalDateTimeUtils.buildBetweenTime; +import static com.yunxi.scm.framework.common.util.object.ObjectUtils.cloneIgnoreId; +import static com.yunxi.scm.framework.test.core.util.AssertUtils.assertPojoEquals; +import static com.yunxi.scm.framework.test.core.util.AssertUtils.assertServiceException; +import static com.yunxi.scm.framework.test.core.util.RandomUtils.randomLongId; +import static com.yunxi.scm.framework.test.core.util.RandomUtils.randomPojo; +import static com.yunxi.scm.module.demo.enums.ErrorCodeConstants.MATERIAL_NOT_EXISTS; import static org.junit.jupiter.api.Assertions.*; -import static org.mockito.Mockito.*; /** * {@link MaterialServiceImpl} 的单元测试类 @@ -113,7 +109,7 @@ public class MaterialServiceImplTest extends BaseDbUnitTest { o.setName(null); o.setStatus(null); o.setType(null); - o.setCategory(null); + o.setCategories(null); o.setCreateTime(null); }); materialMapper.insert(dbMaterial); @@ -124,7 +120,7 @@ public class MaterialServiceImplTest extends BaseDbUnitTest { // 测试 type 不匹配 materialMapper.insert(cloneIgnoreId(dbMaterial, o -> o.setType(null))); // 测试 category 不匹配 - materialMapper.insert(cloneIgnoreId(dbMaterial, o -> o.setCategory(null))); + materialMapper.insert(cloneIgnoreId(dbMaterial, o -> o.setCategories(null))); // 测试 createTime 不匹配 materialMapper.insert(cloneIgnoreId(dbMaterial, o -> o.setCreateTime(null))); // 准备参数 @@ -151,7 +147,7 @@ public class MaterialServiceImplTest extends BaseDbUnitTest { o.setName(null); o.setStatus(null); o.setType(null); - o.setCategory(null); + o.setCategories(null); o.setCreateTime(null); }); materialMapper.insert(dbMaterial); @@ -162,7 +158,7 @@ public class MaterialServiceImplTest extends BaseDbUnitTest { // 测试 type 不匹配 materialMapper.insert(cloneIgnoreId(dbMaterial, o -> o.setType(null))); // 测试 category 不匹配 - materialMapper.insert(cloneIgnoreId(dbMaterial, o -> o.setCategory(null))); + materialMapper.insert(cloneIgnoreId(dbMaterial, o -> o.setCategories(null))); // 测试 createTime 不匹配 materialMapper.insert(cloneIgnoreId(dbMaterial, o -> o.setCreateTime(null))); // 准备参数 diff --git a/yunxi-module-infra/yunxi-module-infra-biz/src/main/java/com/yunxi/scm/module/infra/service/file/FileConfigServiceImpl.java b/yunxi-module-infra/yunxi-module-infra-biz/src/main/java/com/yunxi/scm/module/infra/service/file/FileConfigServiceImpl.java index ae077fe..a875459 100644 --- a/yunxi-module-infra/yunxi-module-infra-biz/src/main/java/com/yunxi/scm/module/infra/service/file/FileConfigServiceImpl.java +++ b/yunxi-module-infra/yunxi-module-infra-biz/src/main/java/com/yunxi/scm/module/infra/service/file/FileConfigServiceImpl.java @@ -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 lombok.Getter; import lombok.extern.slf4j.Slf4j; -import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.validation.annotation.Validated; @@ -30,7 +29,6 @@ import javax.validation.Validator; import java.time.LocalDateTime; import java.util.List; 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.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() { // 情况一:如果缓存里没有数据,则直接刷新缓存 if (CollUtil.isEmpty(fileConfigCache)) { diff --git a/yunxi-module-system/yunxi-module-system-biz/src/main/java/com/yunxi/scm/module/system/controller/admin/sensitiveword/SensitiveWordController.java b/yunxi-module-system/yunxi-module-system-biz/src/main/java/com/yunxi/scm/module/system/controller/admin/sensitiveword/SensitiveWordController.java index ee15d46..0975234 100644 --- a/yunxi-module-system/yunxi-module-system-biz/src/main/java/com/yunxi/scm/module/system/controller/admin/sensitiveword/SensitiveWordController.java +++ b/yunxi-module-system/yunxi-module-system-biz/src/main/java/com/yunxi/scm/module/system/controller/admin/sensitiveword/SensitiveWordController.java @@ -84,7 +84,7 @@ public class SensitiveWordController { List list = sensitiveWordService.getSensitiveWordList(exportReqVO); // 导出 Excel List datas = SensitiveWordConvert.INSTANCE.convertList02(list); - ExcelUtils.write(response, "敏感词.xls", "数据", SensitiveWordExcelVO.class, datas); + ExcelUtils.write(response, "敏感词123.xls", "数据", SensitiveWordExcelVO.class, datas); } @GetMapping("/get-tags") diff --git a/yunxi-module-system/yunxi-module-system-biz/src/main/java/com/yunxi/scm/module/system/controller/admin/user/UserController.java b/yunxi-module-system/yunxi-module-system-biz/src/main/java/com/yunxi/scm/module/system/controller/admin/user/UserController.java index e852794..7e5be65 100644 --- a/yunxi-module-system/yunxi-module-system-biz/src/main/java/com/yunxi/scm/module/system/controller/admin/user/UserController.java +++ b/yunxi-module-system/yunxi-module-system-biz/src/main/java/com/yunxi/scm/module/system/controller/admin/user/UserController.java @@ -171,7 +171,6 @@ public class UserController { UserImportExcelVO.builder().username("yuanma").deptId(2L).email("yuanma@iocoder.cn").mobile("15601701300") .nickname("源码").status(CommonStatusEnum.DISABLE.getStatus()).sex(SexEnum.FEMALE.getSex()).build() ); - // 输出 ExcelUtils.write(response, "用户导入模板.xls", "用户列表", UserImportExcelVO.class, list); } diff --git a/yunxi-module-system/yunxi-module-system-biz/src/main/java/com/yunxi/scm/module/system/dal/dataobject/sensitiveword/SensitiveWordDO.java b/yunxi-module-system/yunxi-module-system-biz/src/main/java/com/yunxi/scm/module/system/dal/dataobject/sensitiveword/SensitiveWordDO.java index fb2f3eb..2cc77c0 100644 --- a/yunxi-module-system/yunxi-module-system-biz/src/main/java/com/yunxi/scm/module/system/dal/dataobject/sensitiveword/SensitiveWordDO.java +++ b/yunxi-module-system/yunxi-module-system-biz/src/main/java/com/yunxi/scm/module/system/dal/dataobject/sensitiveword/SensitiveWordDO.java @@ -1,12 +1,12 @@ 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.TableField; import com.baomidou.mybatisplus.annotation.TableId; 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 java.util.List; diff --git a/yunxi-module-system/yunxi-module-system-biz/src/main/java/com/yunxi/scm/module/system/service/sensitiveword/SensitiveWordServiceImpl.java b/yunxi-module-system/yunxi-module-system-biz/src/main/java/com/yunxi/scm/module/system/service/sensitiveword/SensitiveWordServiceImpl.java index 09f4533..b576044 100644 --- a/yunxi-module-system/yunxi-module-system-biz/src/main/java/com/yunxi/scm/module/system/service/sensitiveword/SensitiveWordServiceImpl.java +++ b/yunxi-module-system/yunxi-module-system-biz/src/main/java/com/yunxi/scm/module/system/service/sensitiveword/SensitiveWordServiceImpl.java @@ -1,6 +1,8 @@ package com.yunxi.scm.module.system.service.sensitiveword; 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.pojo.PageResult; 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.mysql.sensitiveword.SensitiveWordMapper; 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.extern.slf4j.Slf4j; -import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Service; import org.springframework.validation.annotation.Validated; @@ -24,7 +23,6 @@ import javax.annotation.PostConstruct; import javax.annotation.Resource; import java.time.LocalDateTime; 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.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() { // 情况一:如果缓存里没有数据,则直接刷新缓存 if (CollUtil.isEmpty(sensitiveWordCache)) { diff --git a/yunxi-module-system/yunxi-module-system-biz/src/main/java/com/yunxi/scm/module/system/service/sms/SmsChannelServiceImpl.java b/yunxi-module-system/yunxi-module-system-biz/src/main/java/com/yunxi/scm/module/system/service/sms/SmsChannelServiceImpl.java index 1ca39c1..27aa2ff 100644 --- a/yunxi-module-system/yunxi-module-system-biz/src/main/java/com/yunxi/scm/module/system/service/sms/SmsChannelServiceImpl.java +++ b/yunxi-module-system/yunxi-module-system-biz/src/main/java/com/yunxi/scm/module/system/service/sms/SmsChannelServiceImpl.java @@ -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 lombok.Getter; import lombok.extern.slf4j.Slf4j; -import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Service; import javax.annotation.PostConstruct; @@ -20,7 +19,6 @@ import javax.annotation.Resource; import java.time.LocalDateTime; import java.util.Collections; 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.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() { // 情况一:如果缓存里没有数据,则直接刷新缓存 if (CollUtil.isEmpty(channelCache)) { diff --git a/yunxi-ui-admin/src/layout/components/Message/index.vue b/yunxi-ui-admin/src/layout/components/Message/index.vue index c27e8ee..ebfd2ef 100644 --- a/yunxi-ui-admin/src/layout/components/Message/index.vue +++ b/yunxi-ui-admin/src/layout/components/Message/index.vue @@ -49,9 +49,9 @@ export default { // 首次加载小红点 this.getUnreadCount() // 轮询刷新小红点 - setInterval(() => { - this.getUnreadCount() - },1000 * 60 * 2) + // setInterval(() => { + // this.getUnreadCount() + // },1000 * 60 * 2) }, methods: { getList: function() { diff --git a/yunxi-ui-admin/src/views/demo/material/index.vue b/yunxi-ui-admin/src/views/demo/material/index.vue index 7e964b4..b7f088c 100644 --- a/yunxi-ui-admin/src/views/demo/material/index.vue +++ b/yunxi-ui-admin/src/views/demo/material/index.vue @@ -9,21 +9,21 @@ + :key="dict.value" :label="dict.label" :value="parseInt(dict.value)"/> + :key="dict.value" :label="dict.label" :value="parseInt(dict.value)"/> + + + + + - - - - - - @@ -63,7 +63,7 @@ @@ -288,11 +288,11 @@ export default { params.pageNo = undefined; params.pageSize = undefined; this.$modal.confirm('是否确认导出所有物料管理数据项?').then(() => { - this.exportLoading = true; + // this.exportLoading = true; return exportMaterialExcel(params); }).then(response => { this.$download.excel(response, '物料管理.xls'); - this.exportLoading = false; + // this.exportLoading = false; }).catch(() => {}); } } diff --git a/yunxi-ui-admin/src/views/system/sensitiveWord/index.vue b/yunxi-ui-admin/src/views/system/sensitiveWord/index.vue index acc681c..164d1d8 100644 --- a/yunxi-ui-admin/src/views/system/sensitiveWord/index.vue +++ b/yunxi-ui-admin/src/views/system/sensitiveWord/index.vue @@ -315,7 +315,8 @@ export default { this.exportLoading = true; return exportSensitiveWordExcel(params); }).then(response => { - this.$download.excel(response, '${table.classComment}.xls'); + // this.$download.excel(response, '${table.classComment}.xls'); + this.$download.excel(response, '敏感词.xls'); this.exportLoading = false; }).catch(() => { });