diff --git a/node_modules/.yarn-integrity b/node_modules/.yarn-integrity deleted file mode 100644 index 6b67134..0000000 --- a/node_modules/.yarn-integrity +++ /dev/null @@ -1,10 +0,0 @@ -{ - "systemParams": "win32-x64-93", - "modulesFolders": [], - "flags": [], - "linkedModules": [], - "topLevelPatterns": [], - "lockfileEntries": {}, - "files": [], - "artifacts": {} -} \ No newline at end of file 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-framework/yunxi-spring-boot-starter-mybatis/src/main/java/com/yunxi/scm/framework/mybatis/core/type/EncryptTypeHandler.java b/yunxi-framework/yunxi-spring-boot-starter-mybatis/src/main/java/com/yunxi/scm/framework/mybatis/core/type/EncryptTypeHandler.java index ea029a9..985358f 100644 --- a/yunxi-framework/yunxi-spring-boot-starter-mybatis/src/main/java/com/yunxi/scm/framework/mybatis/core/type/EncryptTypeHandler.java +++ b/yunxi-framework/yunxi-spring-boot-starter-mybatis/src/main/java/com/yunxi/scm/framework/mybatis/core/type/EncryptTypeHandler.java @@ -67,6 +67,7 @@ public class EncryptTypeHandler extends BaseTypeHandler { } // 构建 AES String password = SpringUtil.getProperty(ENCRYPTOR_PROPERTY_NAME); +// String password = Optional.ofNullable(SpringUtil.getProperty(ENCRYPTOR_PROPERTY_NAME)).orElse("X+aZvWkl9jtRP9b2"); Assert.notEmpty(password, "配置项({}) 不能为空", ENCRYPTOR_PROPERTY_NAME); aes = SecureUtil.aes(password.getBytes()); return aes; diff --git a/yunxi-module-demo/yunxi-module-demo-api/pom.xml b/yunxi-module-demo/yunxi-module-demo-api/pom.xml deleted file mode 100644 index f1cff9e..0000000 --- a/yunxi-module-demo/yunxi-module-demo-api/pom.xml +++ /dev/null @@ -1,28 +0,0 @@ - - - - yunxi-module-demo - com.yunxi.scm - ${revision} - - 4.0.0 - - yunxi-module-demo-api - jar - - ${project.artifactId} - - demo 模块 API,暴露给其它模块调用 - - - - - - com.yunxi.scm - yunxi-common - - - - \ No newline at end of file diff --git a/yunxi-module-demo/yunxi-module-demo-api/src/main/java/com/yunxi/scm/module/demo/enums/DictTypeConstants.java b/yunxi-module-demo/yunxi-module-demo-api/src/main/java/com/yunxi/scm/module/demo/enums/DictTypeConstants.java deleted file mode 100644 index ef2087b..0000000 --- a/yunxi-module-demo/yunxi-module-demo-api/src/main/java/com/yunxi/scm/module/demo/enums/DictTypeConstants.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.yunxi.scm.module.demo.enums; - -/** - * System 字典类型的枚举类 - * - * @author 芋道源码 - */ -public interface DictTypeConstants { - - String USER_TYPE = "user_type"; // 用户类型 - String COMMON_STATUS = "common_status"; // 系统状态 - - String MATERIAL_STATUS = "material_status"; // 物料状态 - - // ========== SYSTEM 模块 ========== - String TRADE_ORDER_TYPE = "trade_order_type"; // 订单交易类型 - -} diff --git a/yunxi-module-demo/yunxi-module-demo-api/src/main/java/com/yunxi/scm/module/demo/enums/ErrorCodeConstants.java b/yunxi-module-demo/yunxi-module-demo-api/src/main/java/com/yunxi/scm/module/demo/enums/ErrorCodeConstants.java deleted file mode 100644 index c915f68..0000000 --- a/yunxi-module-demo/yunxi-module-demo-api/src/main/java/com/yunxi/scm/module/demo/enums/ErrorCodeConstants.java +++ /dev/null @@ -1,9 +0,0 @@ -// TODO 待办:请将下面的错误码复制到 yunxi-module-demo-api 模块的 ErrorCodeConstants 类中。注意,请给“TODO 补充编号”设置一个错误码编号!!! -// ========== 物料管理 TODO 补充编号 ========== -package com.yunxi.scm.module.demo.enums; - -import com.yunxi.scm.framework.common.exception.ErrorCode; - -public interface ErrorCodeConstants { - ErrorCode MATERIAL_NOT_EXISTS = new ErrorCode(2023091001, "物料管理不存在"); -} \ No newline at end of file diff --git a/yunxi-module-demo/yunxi-module-demo-biz/pom.xml b/yunxi-module-demo/yunxi-module-demo-biz/pom.xml deleted file mode 100644 index 27cd565..0000000 --- a/yunxi-module-demo/yunxi-module-demo-biz/pom.xml +++ /dev/null @@ -1,64 +0,0 @@ - - - - yunxi-module-demo - com.yunxi.scm - ${revision} - - 4.0.0 - jar - - yunxi-module-demo-biz - - ${project.artifactId} - - demo 模块,主要实现 XXX、YYY、ZZZ 等功能。 - - - - - - com.yunxi.scm - yunxi-module-demo-api - ${revision} - - - - - com.yunxi.scm - yunxi-spring-boot-starter-biz-operatelog - - - - - com.yunxi.scm - yunxi-spring-boot-starter-web - - - - com.yunxi.scm - yunxi-spring-boot-starter-security - - - - - com.yunxi.scm - yunxi-spring-boot-starter-mybatis - - - - - com.yunxi.scm - yunxi-spring-boot-starter-test - - - - - com.yunxi.scm - yunxi-spring-boot-starter-excel - - - - \ No newline at end of file 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 deleted file mode 100644 index 36699d1..0000000 --- a/yunxi-module-demo/yunxi-module-demo-biz/src/main/java/com/yunxi/scm/module/demo/controller/admin/DemoTestController.java +++ /dev/null @@ -1,28 +0,0 @@ -package com.yunxi.scm.module.demo.controller.admin; - -import com.yunxi.scm.framework.common.pojo.CommonResult; -import io.swagger.v3.oas.annotations.Operation; -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 javax.annotation.security.PermitAll; - -import static com.yunxi.scm.framework.common.pojo.CommonResult.success; - -@Tag(name = "管理后台 - Test") -@RestController -@RequestMapping("/demo/test") -@Validated -public class DemoTestController { - - @GetMapping("/get") - @Operation(summary = "获取 test 信息") - @PermitAll // 无需认证即可访问 - public CommonResult get() { - return success("无需认证即可访问的后台接口"); - } - -} diff --git a/yunxi-module-demo/yunxi-module-demo-biz/src/main/java/com/yunxi/scm/module/demo/controller/admin/material/MaterialController.java b/yunxi-module-demo/yunxi-module-demo-biz/src/main/java/com/yunxi/scm/module/demo/controller/admin/material/MaterialController.java deleted file mode 100644 index d9eddcd..0000000 --- a/yunxi-module-demo/yunxi-module-demo-biz/src/main/java/com/yunxi/scm/module/demo/controller/admin/material/MaterialController.java +++ /dev/null @@ -1,99 +0,0 @@ -package com.yunxi.scm.module.demo.controller.admin.material; - -import com.yunxi.scm.framework.common.pojo.CommonResult; -import com.yunxi.scm.framework.common.pojo.PageResult; -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.*; -import com.yunxi.scm.module.demo.convert.material.MaterialConvert; -import com.yunxi.scm.module.demo.dal.dataobject.material.MaterialDO; -import com.yunxi.scm.module.demo.service.material.MaterialService; -import io.swagger.v3.oas.annotations.Operation; -import io.swagger.v3.oas.annotations.Parameter; -import io.swagger.v3.oas.annotations.tags.Tag; -import org.springframework.security.access.prepost.PreAuthorize; -import org.springframework.validation.annotation.Validated; -import org.springframework.web.bind.annotation.*; - -import javax.annotation.Resource; -import javax.servlet.http.HttpServletResponse; -import javax.validation.Valid; -import java.io.IOException; -import java.util.Collection; -import java.util.List; - -import static com.yunxi.scm.framework.common.pojo.CommonResult.success; -import static com.yunxi.scm.framework.operatelog.core.enums.OperateTypeEnum.EXPORT; - -@Tag(name = "管理后台 - 物料管理") -@RestController -@RequestMapping("/demo/material") -@Validated -public class MaterialController { - - @Resource - private MaterialService materialServiceDemo; - - @PostMapping("/create") - @Operation(summary = "创建物料管理") - @PreAuthorize("@ss.hasPermission('demo:material:create')") - public CommonResult createMaterial(@Valid @RequestBody MaterialCreateReqVO createReqVO) { - return success(materialServiceDemo.createMaterial(createReqVO)); - } - - @PutMapping("/update") - @Operation(summary = "更新物料管理") - @PreAuthorize("@ss.hasPermission('demo:material:update')") - public CommonResult updateMaterial(@Valid @RequestBody MaterialUpdateReqVO updateReqVO) { - materialServiceDemo.updateMaterial(updateReqVO); - return success(true); - } - - @DeleteMapping("/delete") - @Operation(summary = "删除物料管理") - @Parameter(name = "id", description = "编号", required = true) - @PreAuthorize("@ss.hasPermission('demo:material:delete')") - public CommonResult deleteMaterial(@RequestParam("id") Long id) { - materialServiceDemo.deleteMaterial(id); - return success(true); - } - - @GetMapping("/get") - @Operation(summary = "获得物料管理") - @Parameter(name = "id", description = "编号", required = true, example = "1024") - @PreAuthorize("@ss.hasPermission('demo:material:query')") - public CommonResult getMaterial(@RequestParam("id") Long id) { - MaterialDO material = materialServiceDemo.getMaterial(id); - return success(MaterialConvert.INSTANCE.convert(material)); - } - - @GetMapping("/list") - @Operation(summary = "获得物料管理列表") - @Parameter(name = "ids", description = "编号列表", required = true, example = "1024,2048") - @PreAuthorize("@ss.hasPermission('demo:material:query')") - public CommonResult> getMaterialList(@RequestParam("ids") Collection ids) { - List list = materialServiceDemo.getMaterialList(ids); - return success(MaterialConvert.INSTANCE.convertList(list)); - } - - @GetMapping("/page") - @Operation(summary = "获得物料管理分页") - @PreAuthorize("@ss.hasPermission('demo:material:query')") - public CommonResult> getMaterialPage(@Valid MaterialPageReqVO pageVO) { - PageResult pageResult = materialServiceDemo.getMaterialPage(pageVO); - return success(MaterialConvert.INSTANCE.convertPage(pageResult)); - } - - @GetMapping("/export-excel") - @Operation(summary = "导出物料管理 Excel") - @PreAuthorize("@ss.hasPermission('demo:material:export')") - @OperateLog(type = EXPORT) - public void exportMaterialExcel(@Valid MaterialExportReqVO exportReqVO, - HttpServletResponse response) throws IOException { - List list = materialServiceDemo.getMaterialList(exportReqVO); - // 导出 Excel - List datas = MaterialConvert.INSTANCE.convertList02(list); - ExcelUtils.write(response, "物料管理.xls", "数据", MaterialExcelVO.class, datas); - } - -} 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 deleted file mode 100644 index dec2484..0000000 --- a/yunxi-module-demo/yunxi-module-demo-biz/src/main/java/com/yunxi/scm/module/demo/controller/admin/material/vo/MaterialBaseVO.java +++ /dev/null @@ -1,48 +0,0 @@ -package com.yunxi.scm.module.demo.controller.admin.material.vo; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; - -import javax.validation.constraints.NotNull; -import java.math.BigDecimal; -import java.util.List; - -/** - * 物料管理 Base VO,提供给添加、修改、详细的子 VO 使用 - * 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成 - */ -@Data -public class MaterialBaseVO { - - @Schema(description = "名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "李四") - @NotNull(message = "名称不能为空") - private String name; - - @Schema(description = "状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") - @NotNull(message = "状态不能为空") - private Byte status; - - @Schema(description = "类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "2") - @NotNull(message = "类型不能为空") - private Byte type; - - @Schema(description = "分类", requiredMode = Schema.RequiredMode.REQUIRED, example = "[1,2]") - @NotNull(message = "分类不能为空") - private List category; - - @Schema(description = "图片", requiredMode = Schema.RequiredMode.REQUIRED, example = "https://www.iocoder.cn") - @NotNull(message = "图片不能为空") - private String imgurl; - - @Schema(description = "库存数量", requiredMode = Schema.RequiredMode.REQUIRED) - @NotNull(message = "库存数量不能为空") - private Integer stock; - - @Schema(description = "单价", requiredMode = Schema.RequiredMode.REQUIRED, example = "18.00") - @NotNull(message = "单价不能为空") - private BigDecimal price; - - @Schema(description = "备注", example = "物料备注") - private String remark; - -} diff --git a/yunxi-module-demo/yunxi-module-demo-biz/src/main/java/com/yunxi/scm/module/demo/controller/admin/material/vo/MaterialCreateReqVO.java b/yunxi-module-demo/yunxi-module-demo-biz/src/main/java/com/yunxi/scm/module/demo/controller/admin/material/vo/MaterialCreateReqVO.java deleted file mode 100644 index 5c33d46..0000000 --- a/yunxi-module-demo/yunxi-module-demo-biz/src/main/java/com/yunxi/scm/module/demo/controller/admin/material/vo/MaterialCreateReqVO.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.yunxi.scm.module.demo.controller.admin.material.vo; - -import lombok.*; -import java.util.*; -import io.swagger.v3.oas.annotations.media.Schema; -import javax.validation.constraints.*; - -@Schema(description = "管理后台 - 物料管理创建 Request VO") -@Data -@EqualsAndHashCode(callSuper = true) -@ToString(callSuper = true) -public class MaterialCreateReqVO extends MaterialBaseVO { - -} 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 deleted file mode 100644 index 8d568c4..0000000 --- a/yunxi-module-demo/yunxi-module-demo-biz/src/main/java/com/yunxi/scm/module/demo/controller/admin/material/vo/MaterialExcelVO.java +++ /dev/null @@ -1,55 +0,0 @@ -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.module.demo.enums.DictTypeConstants; -import lombok.Data; - -import java.math.BigDecimal; -import java.time.LocalDateTime; -import java.util.List; - - -/** - * 物料管理 Excel VO - * - * @author ccongli - */ -@Data -public class MaterialExcelVO { - - @ExcelProperty("ID") - private Long id; - - @ExcelProperty("名称") - private String name; - - @ExcelProperty(value = "状态", converter = DictConvert.class) - @DictFormat(DictTypeConstants.MATERIAL_STATUS) - private Byte status; - - @ExcelProperty("类型") - @DictFormat(DictTypeConstants.TRADE_ORDER_TYPE) - private Byte type; - - @ExcelProperty("分类") - @DictFormat(DictTypeConstants.TRADE_ORDER_TYPE) - private List category; - - @ExcelProperty("图片") - private String imgurl; - - @ExcelProperty("库存数量") - private Integer stock; - - @ExcelProperty("单价") - private BigDecimal price; - - @ExcelProperty("备注") - private String remark; - - @ExcelProperty("创建时间") - private LocalDateTime createTime; - -} 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 deleted file mode 100644 index 3af3bea..0000000 --- a/yunxi-module-demo/yunxi-module-demo-biz/src/main/java/com/yunxi/scm/module/demo/controller/admin/material/vo/MaterialExportReqVO.java +++ /dev/null @@ -1,32 +0,0 @@ -package com.yunxi.scm.module.demo.controller.admin.material.vo; - -import io.swagger.v3.oas.annotations.media.Schema; -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; - -@Schema(description = "管理后台 - 物料管理 Excel 导出 Request VO,参数和 MaterialPageReqVO 是一致的") -@Data -public class MaterialExportReqVO { - - @Schema(description = "名称", example = "李四") - private String name; - - @Schema(description = "状态", example = "1") - private Byte status; - - @Schema(description = "类型", example = "2") - private Byte type; - - @Schema(description = "分类") - private List category; - - @Schema(description = "创建时间") - @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) - private LocalDateTime[] createTime; - -} 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 deleted file mode 100644 index 92e0014..0000000 --- a/yunxi-module-demo/yunxi-module-demo-biz/src/main/java/com/yunxi/scm/module/demo/controller/admin/material/vo/MaterialPageReqVO.java +++ /dev/null @@ -1,37 +0,0 @@ -package com.yunxi.scm.module.demo.controller.admin.material.vo; - -import com.yunxi.scm.framework.common.pojo.PageParam; -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; -import lombok.EqualsAndHashCode; -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; - -@Schema(description = "管理后台 - 物料管理分页 Request VO") -@Data -@EqualsAndHashCode(callSuper = true) -@ToString(callSuper = true) -public class MaterialPageReqVO extends PageParam { - - @Schema(description = "名称", example = "李四") - private String name; - - @Schema(description = "状态", example = "1") - private Byte status; - - @Schema(description = "类型", example = "2") - private Byte type; - - @Schema(description = "分类", example = "[1,2]") - private List category; - - @Schema(description = "创建时间") - @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) - private LocalDateTime[] createTime; - -} diff --git a/yunxi-module-demo/yunxi-module-demo-biz/src/main/java/com/yunxi/scm/module/demo/controller/admin/material/vo/MaterialRespVO.java b/yunxi-module-demo/yunxi-module-demo-biz/src/main/java/com/yunxi/scm/module/demo/controller/admin/material/vo/MaterialRespVO.java deleted file mode 100644 index cb1ff3d..0000000 --- a/yunxi-module-demo/yunxi-module-demo-biz/src/main/java/com/yunxi/scm/module/demo/controller/admin/material/vo/MaterialRespVO.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.yunxi.scm.module.demo.controller.admin.material.vo; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.*; -import java.time.LocalDateTime; - -@Schema(description = "管理后台 - 物料管理 Response VO") -@Data -@EqualsAndHashCode(callSuper = true) -@ToString(callSuper = true) -public class MaterialRespVO extends MaterialBaseVO { - - @Schema(description = "ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "14541") - private Long id; - - @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED) - private LocalDateTime createTime; - -} diff --git a/yunxi-module-demo/yunxi-module-demo-biz/src/main/java/com/yunxi/scm/module/demo/controller/admin/material/vo/MaterialUpdateReqVO.java b/yunxi-module-demo/yunxi-module-demo-biz/src/main/java/com/yunxi/scm/module/demo/controller/admin/material/vo/MaterialUpdateReqVO.java deleted file mode 100644 index 33089ba..0000000 --- a/yunxi-module-demo/yunxi-module-demo-biz/src/main/java/com/yunxi/scm/module/demo/controller/admin/material/vo/MaterialUpdateReqVO.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.yunxi.scm.module.demo.controller.admin.material.vo; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.*; -import java.util.*; -import javax.validation.constraints.*; - -@Schema(description = "管理后台 - 物料管理更新 Request VO") -@Data -@EqualsAndHashCode(callSuper = true) -@ToString(callSuper = true) -public class MaterialUpdateReqVO extends MaterialBaseVO { - - @Schema(description = "ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "14541") - @NotNull(message = "ID不能为空") - private Long id; - -} diff --git a/yunxi-module-demo/yunxi-module-demo-biz/src/main/java/com/yunxi/scm/module/demo/controller/app/AppDemoTestController.java b/yunxi-module-demo/yunxi-module-demo-biz/src/main/java/com/yunxi/scm/module/demo/controller/app/AppDemoTestController.java deleted file mode 100644 index 96c9b86..0000000 --- a/yunxi-module-demo/yunxi-module-demo-biz/src/main/java/com/yunxi/scm/module/demo/controller/app/AppDemoTestController.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.yunxi.scm.module.demo.controller.app; - -import com.yunxi.scm.framework.common.pojo.CommonResult; -import com.yunxi.scm.framework.security.core.annotations.PreAuthenticated; -import io.swagger.v3.oas.annotations.Operation; -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 static com.yunxi.scm.framework.common.pojo.CommonResult.success; - -@Tag(name = "用户 App - Test") -@RestController -@RequestMapping("/demo/test") -@Validated -public class AppDemoTestController { - - @GetMapping("/get") - @Operation(summary = "获取 test 信息") - @PreAuthenticated // 认证后可访问 - public CommonResult get() { - return success("需认证后才能访问的app接口"); - } - -} 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 deleted file mode 100644 index 3fa927e..0000000 --- a/yunxi-module-demo/yunxi-module-demo-biz/src/main/java/com/yunxi/scm/module/demo/convert/material/MaterialConvert.java +++ /dev/null @@ -1,34 +0,0 @@ -package com.yunxi.scm.module.demo.convert.material; - -import java.util.*; - -import com.yunxi.scm.framework.common.pojo.PageResult; - -import com.yunxi.scm.module.demo.dal.dataobject.material.MaterialDO; -import org.mapstruct.Mapper; -import org.mapstruct.factory.Mappers; -import com.yunxi.scm.module.demo.controller.admin.material.vo.*; - -/** - * 物料管理 Convert - * - * @author ccongli - */ -@Mapper -public interface MaterialConvert { - - MaterialConvert INSTANCE = Mappers.getMapper(MaterialConvert.class); - - MaterialDO convert(MaterialCreateReqVO bean); - - MaterialDO convert(MaterialUpdateReqVO bean); - - MaterialRespVO convert(MaterialDO bean); - - List convertList(List list); - - PageResult convertPage(PageResult page); - - List convertList02(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 deleted file mode 100644 index 43baff2..0000000 --- a/yunxi-module-demo/yunxi-module-demo-biz/src/main/java/com/yunxi/scm/module/demo/dal/dataobject/material/MaterialDO.java +++ /dev/null @@ -1,71 +0,0 @@ -package com.yunxi.scm.module.demo.dal.dataobject.material; - -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.mybatis.core.dataobject.BaseDO; -import com.yunxi.scm.framework.mybatis.core.type.IntegerListTypeHandler; -import lombok.*; - -import java.math.BigDecimal; -import java.util.List; - -/** - * 物料管理 DO - * - * @author ccongli - */ -@TableName(value = "demo_material",autoResultMap = true) -@KeySequence("demo_material_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 -@Data -@EqualsAndHashCode(callSuper = true) -@ToString(callSuper = true) -@Builder -@NoArgsConstructor -@AllArgsConstructor -public class MaterialDO extends BaseDO { - - /** - * ID - */ - @TableId - private Long id; - /** - * 名称 - */ - private String name; - /** - * 状态 - * - * 枚举 {@link TODO material_status 对应的类} - */ - private Byte status; - /** - * 类型 - */ - private Byte type; - /** - * 分类 - */ -// @TableField(typeHandler = JacksonTypeHandler.class) - @TableField(typeHandler = IntegerListTypeHandler.class) - private List category; - /** - * 图片 - */ - private String imgurl; - /** - * 库存数量 - */ - private Integer stock; - /** - * 单价 - */ - private BigDecimal price; - /** - * 备注 - */ - private String remark; - -} 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 deleted file mode 100644 index 567cb60..0000000 --- a/yunxi-module-demo/yunxi-module-demo-biz/src/main/java/com/yunxi/scm/module/demo/dal/mysql/material/MaterialMapper.java +++ /dev/null @@ -1,40 +0,0 @@ -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.module.demo.dal.dataobject.material.MaterialDO; -import org.apache.ibatis.annotations.Mapper; -import com.yunxi.scm.module.demo.controller.admin.material.vo.*; - -/** - * 物料管理 Mapper - * - * @author ccongli - */ -@Mapper -public interface MaterialMapper extends BaseMapperX { - - default PageResult selectPage(MaterialPageReqVO reqVO) { - return selectPage(reqVO, new LambdaQueryWrapperX() - .likeIfPresent(MaterialDO::getName, reqVO.getName()) - .eqIfPresent(MaterialDO::getStatus, reqVO.getStatus()) - .eqIfPresent(MaterialDO::getType, reqVO.getType()) - .eqIfPresent(MaterialDO::getCategory, reqVO.getCategory()) - .betweenIfPresent(MaterialDO::getCreateTime, reqVO.getCreateTime()) - .orderByDesc(MaterialDO::getId)); - } - - default List selectList(MaterialExportReqVO reqVO) { - return selectList(new LambdaQueryWrapperX() - .likeIfPresent(MaterialDO::getName, reqVO.getName()) - .eqIfPresent(MaterialDO::getStatus, reqVO.getStatus()) - .eqIfPresent(MaterialDO::getType, reqVO.getType()) - .eqIfPresent(MaterialDO::getCategory, 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/service/material/MaterialService.java b/yunxi-module-demo/yunxi-module-demo-biz/src/main/java/com/yunxi/scm/module/demo/service/material/MaterialService.java deleted file mode 100644 index 66433c5..0000000 --- a/yunxi-module-demo/yunxi-module-demo-biz/src/main/java/com/yunxi/scm/module/demo/service/material/MaterialService.java +++ /dev/null @@ -1,70 +0,0 @@ -package com.yunxi.scm.module.demo.service.material; - -import java.util.*; -import javax.validation.*; -import com.yunxi.scm.module.demo.controller.admin.material.vo.*; -import com.yunxi.scm.module.demo.dal.dataobject.material.MaterialDO; -import com.yunxi.scm.framework.common.pojo.PageResult; - -/** - * 物料管理 Service 接口 - * - * @author ccongli - */ -public interface MaterialService { - - /** - * 创建物料管理 - * - * @param createReqVO 创建信息 - * @return 编号 - */ - Long createMaterial(@Valid MaterialCreateReqVO createReqVO); - - /** - * 更新物料管理 - * - * @param updateReqVO 更新信息 - */ - void updateMaterial(@Valid MaterialUpdateReqVO updateReqVO); - - /** - * 删除物料管理 - * - * @param id 编号 - */ - void deleteMaterial(Long id); - - /** - * 获得物料管理 - * - * @param id 编号 - * @return 物料管理 - */ - MaterialDO getMaterial(Long id); - - /** - * 获得物料管理列表 - * - * @param ids 编号 - * @return 物料管理列表 - */ - List getMaterialList(Collection ids); - - /** - * 获得物料管理分页 - * - * @param pageReqVO 分页查询 - * @return 物料管理分页 - */ - PageResult getMaterialPage(MaterialPageReqVO pageReqVO); - - /** - * 获得物料管理列表, 用于 Excel 导出 - * - * @param exportReqVO 查询条件 - * @return 物料管理列表 - */ - List getMaterialList(MaterialExportReqVO exportReqVO); - -} diff --git a/yunxi-module-demo/yunxi-module-demo-biz/src/main/java/com/yunxi/scm/module/demo/service/material/MaterialServiceImpl.java b/yunxi-module-demo/yunxi-module-demo-biz/src/main/java/com/yunxi/scm/module/demo/service/material/MaterialServiceImpl.java deleted file mode 100644 index ad13baa..0000000 --- a/yunxi-module-demo/yunxi-module-demo-biz/src/main/java/com/yunxi/scm/module/demo/service/material/MaterialServiceImpl.java +++ /dev/null @@ -1,85 +0,0 @@ -package com.yunxi.scm.module.demo.service.material; - -import com.yunxi.scm.framework.common.pojo.PageResult; -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.convert.material.MaterialConvert; -import com.yunxi.scm.module.demo.dal.dataobject.material.MaterialDO; -import com.yunxi.scm.module.demo.dal.mysql.material.MaterialMapper; -import org.springframework.stereotype.Service; -import org.springframework.validation.annotation.Validated; - -import javax.annotation.Resource; -import java.util.Collection; -import java.util.List; - -import static com.yunxi.scm.framework.common.exception.util.ServiceExceptionUtil.exception; -import static com.yunxi.scm.module.demo.enums.ErrorCodeConstants.MATERIAL_NOT_EXISTS; - -/** - * 物料管理 Service 实现类 - * - * @author ccongli - */ -@Service -@Validated -public class MaterialServiceImpl implements MaterialService { - - @Resource - private MaterialMapper materialMapperDemo; - - @Override - public Long createMaterial(MaterialCreateReqVO createReqVO) { - // 插入 - MaterialDO material = MaterialConvert.INSTANCE.convert(createReqVO); - materialMapperDemo.insert(material); - // 返回 - return material.getId(); - } - - @Override - public void updateMaterial(MaterialUpdateReqVO updateReqVO) { - // 校验存在 - validateMaterialExists(updateReqVO.getId()); - // 更新 - MaterialDO updateObj = MaterialConvert.INSTANCE.convert(updateReqVO); - materialMapperDemo.updateById(updateObj); - } - - @Override - public void deleteMaterial(Long id) { - // 校验存在 - validateMaterialExists(id); - // 删除 - materialMapperDemo.deleteById(id); - } - - private void validateMaterialExists(Long id) { - if (materialMapperDemo.selectById(id) == null) { - throw exception(MATERIAL_NOT_EXISTS); - } - } - - @Override - public MaterialDO getMaterial(Long id) { - return materialMapperDemo.selectById(id); - } - - @Override - public List getMaterialList(Collection ids) { - return materialMapperDemo.selectBatchIds(ids); - } - - @Override - public PageResult getMaterialPage(MaterialPageReqVO pageReqVO) { - return materialMapperDemo.selectPage(pageReqVO); - } - - @Override - public List getMaterialList(MaterialExportReqVO exportReqVO) { - return materialMapperDemo.selectList(exportReqVO); - } - -} diff --git a/yunxi-module-demo/yunxi-module-demo-biz/src/main/resources/mapper/material/MaterialMapperDemo.xml b/yunxi-module-demo/yunxi-module-demo-biz/src/main/resources/mapper/material/MaterialMapperDemo.xml deleted file mode 100644 index 298d139..0000000 --- a/yunxi-module-demo/yunxi-module-demo-biz/src/main/resources/mapper/material/MaterialMapperDemo.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - diff --git a/yunxi-module-demo/yunxi-module-demo-biz/src/test/java/com/yunxi/scm/module/demo/service/material/MaterialServiceDemoImplTest.java b/yunxi-module-demo/yunxi-module-demo-biz/src/test/java/com/yunxi/scm/module/demo/service/material/MaterialServiceDemoImplTest.java deleted file mode 100644 index bb1d960..0000000 --- a/yunxi-module-demo/yunxi-module-demo-biz/src/test/java/com/yunxi/scm/module/demo/service/material/MaterialServiceDemoImplTest.java +++ /dev/null @@ -1,179 +0,0 @@ -package com.yunxi.scm.module.demo.service.material; - -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.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 org.junit.jupiter.api.Disabled; -import org.junit.jupiter.api.Test; -import org.springframework.context.annotation.Import; - -import javax.annotation.Resource; -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.*; - -/** - * {@link MaterialServiceImpl} 的单元测试类 - * - * @author ccongli - */ -@Import(MaterialServiceImpl.class) -public class MaterialServiceDemoImplTest extends BaseDbUnitTest { - - @Resource - private MaterialServiceImpl materialService; - - @Resource - private MaterialMapper materialMapperDemo; - - @Test - public void testCreateMaterial_success() { - // 准备参数 - MaterialCreateReqVO reqVO = randomPojo(MaterialCreateReqVO.class); - - // 调用 - Long materialId = materialService.createMaterial(reqVO); - // 断言 - assertNotNull(materialId); - // 校验记录的属性是否正确 - MaterialDO material = materialMapperDemo.selectById(materialId); - assertPojoEquals(reqVO, material); - } - - @Test - public void testUpdateMaterial_success() { - // mock 数据 - MaterialDO dbMaterial = randomPojo(MaterialDO.class); - materialMapperDemo.insert(dbMaterial);// @Sql: 先插入出一条存在的数据 - // 准备参数 - MaterialUpdateReqVO reqVO = randomPojo(MaterialUpdateReqVO.class, o -> { - o.setId(dbMaterial.getId()); // 设置更新的 ID - }); - - // 调用 - materialService.updateMaterial(reqVO); - // 校验是否更新正确 - MaterialDO material = materialMapperDemo.selectById(reqVO.getId()); // 获取最新的 - assertPojoEquals(reqVO, material); - } - - @Test - public void testUpdateMaterial_notExists() { - // 准备参数 - MaterialUpdateReqVO reqVO = randomPojo(MaterialUpdateReqVO.class); - - // 调用, 并断言异常 - assertServiceException(() -> materialService.updateMaterial(reqVO), MATERIAL_NOT_EXISTS); - } - - @Test - public void testDeleteMaterial_success() { - // mock 数据 - MaterialDO dbMaterial = randomPojo(MaterialDO.class); - materialMapperDemo.insert(dbMaterial);// @Sql: 先插入出一条存在的数据 - // 准备参数 - Long id = dbMaterial.getId(); - - // 调用 - materialService.deleteMaterial(id); - // 校验数据不存在了 - assertNull(materialMapperDemo.selectById(id)); - } - - @Test - public void testDeleteMaterial_notExists() { - // 准备参数 - Long id = randomLongId(); - - // 调用, 并断言异常 - assertServiceException(() -> materialService.deleteMaterial(id), MATERIAL_NOT_EXISTS); - } - - @Test - @Disabled // TODO 请修改 null 为需要的值,然后删除 @Disabled 注解 - public void testGetMaterialPage() { - // mock 数据 - MaterialDO dbMaterial = randomPojo(MaterialDO.class, o -> { // 等会查询到 - o.setName(null); - o.setStatus(null); - o.setType(null); - o.setCategory(null); - o.setCreateTime(null); - }); - materialMapperDemo.insert(dbMaterial); - // 测试 name 不匹配 - materialMapperDemo.insert(cloneIgnoreId(dbMaterial, o -> o.setName(null))); - // 测试 status 不匹配 - materialMapperDemo.insert(cloneIgnoreId(dbMaterial, o -> o.setStatus(null))); - // 测试 type 不匹配 - materialMapperDemo.insert(cloneIgnoreId(dbMaterial, o -> o.setType(null))); - // 测试 category 不匹配 - materialMapperDemo.insert(cloneIgnoreId(dbMaterial, o -> o.setCategory(null))); - // 测试 createTime 不匹配 - materialMapperDemo.insert(cloneIgnoreId(dbMaterial, o -> o.setCreateTime(null))); - // 准备参数 - MaterialPageReqVO reqVO = new MaterialPageReqVO(); - reqVO.setName(null); - reqVO.setStatus(null); - reqVO.setType(null); - reqVO.setCategory(null); - reqVO.setCreateTime(buildBetweenTime(2023, 2, 1, 2023, 2, 28)); - - // 调用 - PageResult pageResult = materialService.getMaterialPage(reqVO); - // 断言 - assertEquals(1, pageResult.getTotal()); - assertEquals(1, pageResult.getList().size()); - assertPojoEquals(dbMaterial, pageResult.getList().get(0)); - } - - @Test - @Disabled // TODO 请修改 null 为需要的值,然后删除 @Disabled 注解 - public void testGetMaterialList() { - // mock 数据 - MaterialDO dbMaterial = randomPojo(MaterialDO.class, o -> { // 等会查询到 - o.setName(null); - o.setStatus(null); - o.setType(null); - o.setCategory(null); - o.setCreateTime(null); - }); - materialMapperDemo.insert(dbMaterial); - // 测试 name 不匹配 - materialMapperDemo.insert(cloneIgnoreId(dbMaterial, o -> o.setName(null))); - // 测试 status 不匹配 - materialMapperDemo.insert(cloneIgnoreId(dbMaterial, o -> o.setStatus(null))); - // 测试 type 不匹配 - materialMapperDemo.insert(cloneIgnoreId(dbMaterial, o -> o.setType(null))); - // 测试 category 不匹配 - materialMapperDemo.insert(cloneIgnoreId(dbMaterial, o -> o.setCategory(null))); - // 测试 createTime 不匹配 - materialMapperDemo.insert(cloneIgnoreId(dbMaterial, o -> o.setCreateTime(null))); - // 准备参数 - MaterialExportReqVO reqVO = new MaterialExportReqVO(); - reqVO.setName(null); - reqVO.setStatus(null); - reqVO.setType(null); - reqVO.setCategory(null); - reqVO.setCreateTime(buildBetweenTime(2023, 2, 1, 2023, 2, 28)); - - // 调用 - List list = materialService.getMaterialList(reqVO); - // 断言 - assertEquals(1, list.size()); - assertPojoEquals(dbMaterial, list.get(0)); - } - -} diff --git a/yunxi-module-demo/yunxi-module-demo-biz/src/test/resources/sql/clean.sql b/yunxi-module-demo/yunxi-module-demo-biz/src/test/resources/sql/clean.sql deleted file mode 100644 index bdc8a99..0000000 --- a/yunxi-module-demo/yunxi-module-demo-biz/src/test/resources/sql/clean.sql +++ /dev/null @@ -1,2 +0,0 @@ --- 将该删表 SQL 语句,添加到 yunxi-module-demo-biz 模块的 test/resources/sql/clean.sql 文件里 -DELETE FROM "demo_material"; \ No newline at end of file diff --git a/yunxi-module-demo/yunxi-module-demo-biz/src/test/resources/sql/create_tables.sql b/yunxi-module-demo/yunxi-module-demo-biz/src/test/resources/sql/create_tables.sql deleted file mode 100644 index 1b8d090..0000000 --- a/yunxi-module-demo/yunxi-module-demo-biz/src/test/resources/sql/create_tables.sql +++ /dev/null @@ -1,19 +0,0 @@ --- 将该建表 SQL 语句,添加到 yunxi-module-demo-biz 模块的 test/resources/sql/create_tables.sql 文件里 -CREATE TABLE IF NOT EXISTS "demo_material" ( - "id" bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY, - "name" varchar NOT NULL, - "status" varchar NOT NULL, - "type" varchar NOT NULL, - "category" varchar NOT NULL, - "imgurl" varchar NOT NULL, - "stock" int NOT NULL, - "price" varchar NOT NULL, - "remark" varchar, - "creator" varchar DEFAULT '', - "create_time" datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, - "updater" varchar DEFAULT '', - "update_time" datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, - "deleted" bit NOT NULL DEFAULT FALSE, - "tenant_id" bigint NOT NULL, - PRIMARY KEY ("id") - ) COMMENT '物料表'; \ No newline at end of file diff --git a/yunxi-module-demo/yunxi-module-demo-biz/src/test/resources/sql/menu.sql b/yunxi-module-demo/yunxi-module-demo-biz/src/test/resources/sql/menu.sql deleted file mode 100644 index 6634071..0000000 --- a/yunxi-module-demo/yunxi-module-demo-biz/src/test/resources/sql/menu.sql +++ /dev/null @@ -1,55 +0,0 @@ --- 菜单 SQL -INSERT INTO system_menu( - name, permission, type, sort, parent_id, - path, icon, component, status, component_name -) -VALUES ( - '物料管理管理', '', 2, 0, 1, - 'material', '', 'demo/material/index', 0, 'Material' - ); - --- 按钮父菜单ID --- 暂时只支持 MySQL。如果你是 Oracle、PostgreSQL、SQLServer 的话,需要手动修改 @parentId 的部分的代码 -SELECT @parentId := LAST_INSERT_ID(); - --- 按钮 SQL -INSERT INTO system_menu( - name, permission, type, sort, parent_id, - path, icon, component, status -) -VALUES ( - '物料管理查询', 'demo:material:query', 3, 1, @parentId, - '', '', '', 0 - ); -INSERT INTO system_menu( - name, permission, type, sort, parent_id, - path, icon, component, status -) -VALUES ( - '物料管理创建', 'demo:material:create', 3, 2, @parentId, - '', '', '', 0 - ); -INSERT INTO system_menu( - name, permission, type, sort, parent_id, - path, icon, component, status -) -VALUES ( - '物料管理更新', 'demo:material:update', 3, 3, @parentId, - '', '', '', 0 - ); -INSERT INTO system_menu( - name, permission, type, sort, parent_id, - path, icon, component, status -) -VALUES ( - '物料管理删除', 'demo:material:delete', 3, 4, @parentId, - '', '', '', 0 - ); -INSERT INTO system_menu( - name, permission, type, sort, parent_id, - path, icon, component, status -) -VALUES ( - '物料管理导出', 'demo:material:export', 3, 5, @parentId, - '', '', '', 0 - ); 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-infra/yunxi-module-infra-biz/src/test/java/com/yunxi/scm/module/infra/service/db/DataSourceConfigServiceImplTest.java b/yunxi-module-infra/yunxi-module-infra-biz/src/test/java/com/yunxi/scm/module/infra/service/db/DataSourceConfigServiceImplTest.java index 89d01d4..46f6f54 100644 --- a/yunxi-module-infra/yunxi-module-infra-biz/src/test/java/com/yunxi/scm/module/infra/service/db/DataSourceConfigServiceImplTest.java +++ b/yunxi-module-infra/yunxi-module-infra-biz/src/test/java/com/yunxi/scm/module/infra/service/db/DataSourceConfigServiceImplTest.java @@ -1,8 +1,9 @@ package com.yunxi.scm.module.infra.service.db; import cn.hutool.core.map.MapUtil; -import cn.hutool.core.util.ReflectUtil; import cn.hutool.crypto.symmetric.AES; +import com.baomidou.dynamic.datasource.spring.boot.autoconfigure.DataSourceProperty; +import com.baomidou.dynamic.datasource.spring.boot.autoconfigure.DynamicDataSourceProperties; import com.yunxi.scm.framework.mybatis.core.type.EncryptTypeHandler; import com.yunxi.scm.framework.mybatis.core.util.JdbcUtils; import com.yunxi.scm.framework.test.core.ut.BaseDbUnitTest; @@ -10,12 +11,9 @@ import com.yunxi.scm.module.infra.controller.admin.db.vo.DataSourceConfigCreateR import com.yunxi.scm.module.infra.controller.admin.db.vo.DataSourceConfigUpdateReqVO; import com.yunxi.scm.module.infra.dal.dataobject.db.DataSourceConfigDO; import com.yunxi.scm.module.infra.dal.mysql.db.DataSourceConfigMapper; -import com.baomidou.dynamic.datasource.spring.boot.autoconfigure.DataSourceProperty; -import com.baomidou.dynamic.datasource.spring.boot.autoconfigure.DynamicDataSourceProperties; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.mockito.MockedStatic; -import org.mockito.stubbing.Answer; import org.springframework.boot.test.mock.mockito.MockBean; import org.springframework.context.annotation.Import; @@ -28,7 +26,6 @@ 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.infra.enums.ErrorCodeConstants.DATA_SOURCE_CONFIG_NOT_EXISTS; import static org.junit.jupiter.api.Assertions.*; -import static org.mockito.ArgumentMatchers.anyString; import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.mockStatic; import static org.mockito.Mockito.when; @@ -56,9 +53,9 @@ public class DataSourceConfigServiceImplTest extends BaseDbUnitTest { @BeforeEach public void setUp() { // mock 一个空实现的 StringEncryptor,避免 EncryptTypeHandler 报错 - ReflectUtil.setFieldValue(EncryptTypeHandler.class, "aes", aes); - when(aes.encryptBase64(anyString())).then((Answer) invocation -> invocation.getArgument(0)); - when(aes.decryptStr(anyString())).then((Answer) invocation -> invocation.getArgument(0)); +// ReflectUtil.setFieldValue(EncryptTypeHandler.class, "aes", aes); +// when(aes.encryptBase64(anyString())).then((Answer) invocation -> invocation.getArgument(0)); +// when(aes.decryptStr(anyString())).then((Answer) invocation -> invocation.getArgument(0)); // mock DynamicDataSourceProperties when(dynamicDataSourceProperties.getPrimary()).thenReturn("primary"); @@ -145,6 +142,8 @@ public class DataSourceConfigServiceImplTest extends BaseDbUnitTest { DataSourceConfigDO dbDataSourceConfig = randomPojo(DataSourceConfigDO.class); dataSourceConfigMapper.insert(dbDataSourceConfig);// @Sql: 先插入出一条存在的数据 + System.out.println(dbDataSourceConfig.getPassword()); + System.out.println(EncryptTypeHandler.encrypt(dbDataSourceConfig.getPassword())); // 调用 DataSourceConfigDO result = dataSourceConfigMapper.selectOne(DataSourceConfigDO::getPassword, EncryptTypeHandler.encrypt(dbDataSourceConfig.getPassword())); diff --git a/yunxi-module-infra/yunxi-module-infra-biz/src/test/resources/application-unit-test.yaml b/yunxi-module-infra/yunxi-module-infra-biz/src/test/resources/application-unit-test.yaml index b994814..2684a2d 100644 --- a/yunxi-module-infra/yunxi-module-infra-biz/src/test/resources/application-unit-test.yaml +++ b/yunxi-module-infra/yunxi-module-infra-biz/src/test/resources/application-unit-test.yaml @@ -29,6 +29,8 @@ spring: mybatis-plus: lazy-initialization: true # 单元测试,设置 MyBatis Mapper 延迟加载,加速每个单元测试 type-aliases-package: ${yunxi.info.base-package}.module.*.dal.dataobject + encryptor: + password: X+aZvWkl9jtRP9b2 --- #################### 定时任务相关配置 #################### 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-server/src/main/resources/application.yaml b/yunxi-server/src/main/resources/application.yaml index a7fb9e9..b73a62d 100644 --- a/yunxi-server/src/main/resources/application.yaml +++ b/yunxi-server/src/main/resources/application.yaml @@ -86,7 +86,7 @@ aj: cache-number: 1000 # local 缓存的阈值,达到这个值,清除缓存 timing-clear: 180 # local定时清除过期缓存(单位秒),设置为0代表不执行 type: blockPuzzle # 验证码类型 default两种都实例化。 blockPuzzle 滑块拼图 clickWord 文字点选 - water-mark: 芋道源码 # 右下角水印文字(我的水印),可使用 https://tool.chinaz.com/tools/unicode.aspx 中文转 Unicode,Linux 可能需要转 unicode + water-mark: \u957f\u6c5f\u4e91\u606f # 右下角水印文字(我的水印),可使用 https://tool.chinaz.com/tools/unicode.aspx 中文转 Unicode,Linux 可能需要转 unicode interference-options: 0 # 滑动干扰项(0/1/2) req-frequency-limit-enable: false # 接口请求次数一分钟限制是否开启 true|false req-get-lock-limit: 5 # 验证失败 5 次,get接口锁定 @@ -113,7 +113,7 @@ yunxi: maxOnlineCount: 0 # 最大连接人数 sessionMap: true # 保存sessionMap swagger: - title: 芋道快速开发平台 + title: 云息供应链管理平台接口文档 description: 提供管理后台、用户 App 的所有功能 version: ${yunxi.info.version} url: ${yunxi.web.admin-ui.url} @@ -194,6 +194,7 @@ yunxi: - rep_demo_jianpiao - tmp_report_data_1 - tmp_report_data_income + - demo_xxx sms-code: # 短信验证码相关的配置项 expire-times: 10m send-frequency: 1m 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(() => { });