Browse Source

iscs基础数据迁移

车车 4 tháng trước cách đây
mục cha
commit
5171e92ab7
14 tập tin đã thay đổi với 873 bổ sung3 xóa
  1. 254 0
      yudao-framework/yudao-spring-boot-starter-redis/src/main/java/cn/iocoder/yudao/framework/redis/RedisCacheUtil.java
  2. 108 0
      yudao-module-iscs/src/main/java/cn/iocoder/yudao/module/iscs/controller/admin/attribute/AttributeController.java
  3. 35 0
      yudao-module-iscs/src/main/java/cn/iocoder/yudao/module/iscs/controller/admin/attribute/vo/AttributePageReqVO.java
  4. 43 0
      yudao-module-iscs/src/main/java/cn/iocoder/yudao/module/iscs/controller/admin/attribute/vo/AttributeRespVO.java
  5. 31 0
      yudao-module-iscs/src/main/java/cn/iocoder/yudao/module/iscs/controller/admin/attribute/vo/AttributeSaveReqVO.java
  6. 40 0
      yudao-module-iscs/src/main/java/cn/iocoder/yudao/module/iscs/controller/admin/attribute/vo/MailVO.java
  7. 51 0
      yudao-module-iscs/src/main/java/cn/iocoder/yudao/module/iscs/dal/dataobject/attribute/AttributeDO.java
  8. 29 0
      yudao-module-iscs/src/main/java/cn/iocoder/yudao/module/iscs/dal/mysql/attribute/AttributeMapper.java
  9. 4 1
      yudao-module-iscs/src/main/java/cn/iocoder/yudao/module/iscs/enums/ErrorCodeConstants.java
  10. 70 0
      yudao-module-iscs/src/main/java/cn/iocoder/yudao/module/iscs/service/attribute/AttributeService.java
  11. 189 0
      yudao-module-iscs/src/main/java/cn/iocoder/yudao/module/iscs/service/attribute/AttributeServiceImpl.java
  12. 12 0
      yudao-module-iscs/src/main/java/resources/mapper/AttributeMapper.xml
  13. 6 1
      yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/dal/redis/RedisKeyConstants.java
  14. 1 1
      yudao-server/src/main/java/cn/iocoder/yudao/server/YudaoServerApplication.java

+ 254 - 0
yudao-framework/yudao-spring-boot-starter-redis/src/main/java/cn/iocoder/yudao/framework/redis/RedisCacheUtil.java

@@ -0,0 +1,254 @@
+package cn.iocoder.yudao.framework.redis;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.redis.core.BoundSetOperations;
+import org.springframework.data.redis.core.HashOperations;
+import org.springframework.data.redis.core.RedisTemplate;
+import org.springframework.data.redis.core.ValueOperations;
+import org.springframework.stereotype.Component;
+
+import java.util.*;
+import java.util.concurrent.TimeUnit;
+
+/**
+ * spring redis 工具类
+ *
+ * @author cgj
+ **/
+@SuppressWarnings(value = { "unchecked", "rawtypes" })
+@Component
+public class RedisCacheUtil
+{
+    @Autowired
+    public RedisTemplate redisTemplate;
+
+    /**
+     * 缓存基本的对象,Integer、String、实体类等
+     *
+     * @param key 缓存的键值
+     * @param value 缓存的值
+     */
+    public <T> void setCacheObject(final String key, final T value)
+    {
+        redisTemplate.opsForValue().set(key, value);
+    }
+
+    /**
+     * 缓存基本的对象,Integer、String、实体类等
+     *
+     * @param key 缓存的键值
+     * @param value 缓存的值
+     * @param timeout 时间
+     * @param timeUnit 时间颗粒度
+     */
+    public <T> void setCacheObject(final String key, final T value, final Integer timeout, final TimeUnit timeUnit)
+    {
+        redisTemplate.opsForValue().set(key, value, timeout, timeUnit);
+    }
+
+    /**
+     * 设置有效时间
+     *
+     * @param key Redis键
+     * @param timeout 超时时间
+     * @return true=设置成功;false=设置失败
+     */
+    public boolean expire(final String key, final long timeout)
+    {
+        return expire(key, timeout, TimeUnit.SECONDS);
+    }
+
+    /**
+     * 设置有效时间
+     *
+     * @param key Redis键
+     * @param timeout 超时时间
+     * @param unit 时间单位
+     * @return true=设置成功;false=设置失败
+     */
+    public boolean expire(final String key, final long timeout, final TimeUnit unit)
+    {
+        return redisTemplate.expire(key, timeout, unit);
+    }
+
+    /**
+     * 获取有效时间
+     *
+     * @param key Redis键
+     * @return 过期时间,单位秒
+     */
+    public Long getTtl(final String key)
+    {
+        return redisTemplate.getExpire(key);
+    }
+
+    /**
+     * 获得缓存的基本对象。
+     *
+     * @param key 缓存键值
+     * @return 缓存键值对应的数据
+     */
+    public <T> T getCacheObject(final String key)
+    {
+        ValueOperations<String, T> operation = redisTemplate.opsForValue();
+        return operation.get(key);
+    }
+
+    /**
+     * 删除单个对象
+     *
+     * @param key
+     */
+    public boolean deleteObject(final String key)
+    {
+        return redisTemplate.delete(key);
+    }
+
+    /**
+     * 删除集合对象
+     *
+     * @param collection 多个对象
+     * @return
+     */
+    public long deleteObject(final Collection collection)
+    {
+        return redisTemplate.delete(collection);
+    }
+
+    /**
+     * 缓存List数据
+     *
+     * @param key 缓存的键值
+     * @param dataList 待缓存的List数据
+     * @return 缓存的对象
+     */
+    public <T> long setCacheList(final String key, final List<T> dataList)
+    {
+        Long count = redisTemplate.opsForList().rightPushAll(key, dataList);
+        return count == null ? 0 : count;
+    }
+
+    /**
+     * 获得缓存的list对象
+     *
+     * @param key 缓存的键值
+     * @return 缓存键值对应的数据
+     */
+    public <T> List<T> getCacheList(final String key)
+    {
+        return redisTemplate.opsForList().range(key, 0, -1);
+    }
+
+    /**
+     * 缓存Set
+     *
+     * @param key 缓存键值
+     * @param dataSet 缓存的数据
+     * @return 缓存数据的对象
+     */
+    public <T> BoundSetOperations<String, T> setCacheSet(final String key, final Set<T> dataSet)
+    {
+        BoundSetOperations<String, T> setOperation = redisTemplate.boundSetOps(key);
+        Iterator<T> it = dataSet.iterator();
+        while (it.hasNext())
+        {
+            setOperation.add(it.next());
+        }
+        return setOperation;
+    }
+
+    /**
+     * 获得缓存的set
+     *
+     * @param key
+     * @return
+     */
+    public <T> Set<T> getCacheSet(final String key)
+    {
+        return redisTemplate.opsForSet().members(key);
+    }
+
+    /**
+     * 缓存Map
+     *
+     * @param key
+     * @param dataMap
+     */
+    public <T> void setCacheMap(final String key, final Map<String, T> dataMap)
+    {
+        if (dataMap != null) {
+            redisTemplate.opsForHash().putAll(key, dataMap);
+        }
+    }
+
+    /**
+     * 获得缓存的Map
+     *
+     * @param key
+     * @return
+     */
+    public <T> Map<String, T> getCacheMap(final String key)
+    {
+        return redisTemplate.opsForHash().entries(key);
+    }
+
+    /**
+     * 往Hash中存入数据
+     *
+     * @param key Redis键
+     * @param hKey Hash键
+     * @param value 值
+     */
+    public <T> void setCacheMapValue(final String key, final String hKey, final T value)
+    {
+        redisTemplate.opsForHash().put(key, hKey, value);
+    }
+
+    /**
+     * 获取Hash中的数据
+     *
+     * @param key Redis键
+     * @param hKey Hash键
+     * @return Hash中的对象
+     */
+    public <T> T getCacheMapValue(final String key, final String hKey)
+    {
+        HashOperations<String, String, T> opsForHash = redisTemplate.opsForHash();
+        return opsForHash.get(key, hKey);
+    }
+
+    /**
+     * 删除Hash中的数据
+     *
+     * @param key
+     * @param hKey
+     */
+    public void delCacheMapValue(final String key, final String hKey)
+    {
+        HashOperations hashOperations = redisTemplate.opsForHash();
+        hashOperations.delete(key, hKey);
+    }
+
+    /**
+     * 获取多个Hash中的数据
+     *
+     * @param key Redis键
+     * @param hKeys Hash键集合
+     * @return Hash对象集合
+     */
+    public <T> List<T> getMultiCacheMapValue(final String key, final Collection<Object> hKeys)
+    {
+        return redisTemplate.opsForHash().multiGet(key, hKeys);
+    }
+
+    /**
+     * 获得缓存的基本对象列表
+     *
+     * @param pattern 字符串前缀
+     * @return 对象列表
+     */
+    public Collection<String> keys(final String pattern)
+    {
+        return redisTemplate.keys(pattern);
+    }
+}

+ 108 - 0
yudao-module-iscs/src/main/java/cn/iocoder/yudao/module/iscs/controller/admin/attribute/AttributeController.java

@@ -0,0 +1,108 @@
+package cn.iocoder.yudao.module.iscs.controller.admin.attribute;
+
+import cn.iocoder.yudao.framework.apilog.core.annotation.ApiAccessLog;
+import cn.iocoder.yudao.framework.common.pojo.CommonResult;
+import cn.iocoder.yudao.framework.common.pojo.PageParam;
+import cn.iocoder.yudao.framework.common.pojo.PageResult;
+import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
+import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils;
+import cn.iocoder.yudao.module.iscs.controller.admin.attribute.vo.AttributePageReqVO;
+import cn.iocoder.yudao.module.iscs.controller.admin.attribute.vo.AttributeRespVO;
+import cn.iocoder.yudao.module.iscs.controller.admin.attribute.vo.AttributeSaveReqVO;
+import cn.iocoder.yudao.module.iscs.dal.dataobject.attribute.AttributeDO;
+import cn.iocoder.yudao.module.iscs.service.attribute.AttributeService;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.Parameter;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import jakarta.annotation.Resource;
+import jakarta.servlet.http.HttpServletResponse;
+import jakarta.validation.Valid;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import java.io.IOException;
+import java.util.List;
+
+import static cn.iocoder.yudao.framework.apilog.core.enums.OperateTypeEnum.EXPORT;
+import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
+
+@Tag(name = "管理后台 - iscs基础数据")
+@RestController
+@RequestMapping("/iscs/attribute")
+@Validated
+public class AttributeController {
+
+    @Resource
+    private AttributeService attributeService;
+
+    @PostMapping("/insertAttribute")
+    @Operation(summary = "创建iscs基础数据")
+    @PreAuthorize("@ss.hasPermission('iscs:attribute:create')")
+    public CommonResult<Long> insertAttribute(@Valid @RequestBody AttributeSaveReqVO createReqVO) {
+        return success(attributeService.createAttribute(createReqVO));
+    }
+
+    @PutMapping("/updateAttribute")
+    @Operation(summary = "更新iscs基础数据")
+    @PreAuthorize("@ss.hasPermission('iscs:attribute:update')")
+    public CommonResult<Boolean> updateAttribute(@Valid @RequestBody AttributeSaveReqVO updateReqVO) {
+        attributeService.updateAttribute(updateReqVO);
+        return success(true);
+    }
+
+    @DeleteMapping("/deleteAttributeList")
+    @Parameter(name = "ids", description = "编号", required = true)
+    @Operation(summary = "批量删除iscs基础数据")
+                @PreAuthorize("@ss.hasPermission('iscs:attribute:delete')")
+    public CommonResult<Boolean> deleteAttributeList(@RequestParam("ids") List<Long> ids) {
+        attributeService.deleteAttributeListByIds(ids);
+        return success(true);
+    }
+
+    @GetMapping("/selectAttributeById")
+    @Operation(summary = "获得iscs基础数据")
+    @Parameter(name = "id", description = "编号", required = true, example = "1024")
+    @PreAuthorize("@ss.hasPermission('iscs:attribute:query')")
+    public CommonResult<AttributeRespVO> selectAttributeById(@RequestParam("id") Long id) {
+        AttributeDO attribute = attributeService.getAttribute(id);
+        return success(BeanUtils.toBean(attribute, AttributeRespVO.class));
+    }
+
+    @GetMapping("/getAttributePage")
+    @Operation(summary = "获得iscs基础数据分页")
+    @PreAuthorize("@ss.hasPermission('iscs:attribute:query')")
+    public CommonResult<PageResult<AttributeRespVO>> getAttributePage(@Valid AttributePageReqVO pageReqVO) {
+        PageResult<AttributeDO> pageResult = attributeService.getAttributePage(pageReqVO);
+        return success(BeanUtils.toBean(pageResult, AttributeRespVO.class));
+    }
+
+    @GetMapping("/exportAttributeExcel")
+    @Operation(summary = "导出iscs基础数据 Excel")
+    @PreAuthorize("@ss.hasPermission('iscs:attribute:export')")
+    @ApiAccessLog(operateType = EXPORT)
+    public void exportAttributeExcel(@Valid AttributePageReqVO pageReqVO,
+              HttpServletResponse response) throws IOException {
+        pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE);
+        List<AttributeDO> list = attributeService.getAttributePage(pageReqVO).getList();
+        // 导出 Excel
+        ExcelUtils.write(response, "iscs基础数据.xls", "数据", AttributeRespVO.class,
+                        BeanUtils.toBean(list, AttributeRespVO.class));
+    }
+
+    @Operation(summary = "通过sysAttrKey查询数据")
+    @Parameter(name = "sysAttrKey", description = "参数键名")
+    @GetMapping("/getSystemAttributeByKey")
+    public CommonResult<AttributeDO> getIsSystemAttributeByKey(String sysAttrKey) {
+        AttributeDO result = attributeService.getAttributeByKey(sysAttrKey);
+        return CommonResult.success(result);
+    }
+
+    @Operation(summary = "刷新基础数据")
+    @GetMapping("/refreshAttrCache")
+    public CommonResult<Boolean> refreshAttrCache()
+    {
+        return CommonResult.success(attributeService.refreshAttrCache());
+    }
+
+}

+ 35 - 0
yudao-module-iscs/src/main/java/cn/iocoder/yudao/module/iscs/controller/admin/attribute/vo/AttributePageReqVO.java

@@ -0,0 +1,35 @@
+package cn.iocoder.yudao.module.iscs.controller.admin.attribute.vo;
+
+import cn.iocoder.yudao.framework.common.pojo.PageParam;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.time.LocalDateTime;
+
+import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
+
+@Schema(description = "管理后台 - iscs基础数据分页 Request VO")
+@Data
+public class AttributePageReqVO extends PageParam {
+
+    @Schema(description = "参数名称", example = "芋艿")
+    private String sysAttrName;
+
+    @Schema(description = "参数键名")
+    private String sysAttrKey;
+
+    @Schema(description = "参数键值")
+    private String sysAttrValue;
+
+    @Schema(description = "分类", example = "2")
+    private String sysAttrType;
+
+    @Schema(description = "备注", example = "你说的对")
+    private String remark;
+
+    @Schema(description = "创建时间")
+    @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
+    private LocalDateTime[] createTime;
+
+}

+ 43 - 0
yudao-module-iscs/src/main/java/cn/iocoder/yudao/module/iscs/controller/admin/attribute/vo/AttributeRespVO.java

@@ -0,0 +1,43 @@
+package cn.iocoder.yudao.module.iscs.controller.admin.attribute.vo;
+
+import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
+import com.alibaba.excel.annotation.ExcelProperty;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.time.LocalDateTime;
+
+@Schema(description = "管理后台 - iscs基础数据 Response VO")
+@Data
+@ExcelIgnoreUnannotated
+public class AttributeRespVO {
+
+    @Schema(description = "主键ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "21876")
+    @ExcelProperty("主键ID")
+    private Long id;
+
+    @Schema(description = "参数名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "芋艿")
+    @ExcelProperty("参数名称")
+    private String sysAttrName;
+
+    @Schema(description = "参数键名", requiredMode = Schema.RequiredMode.REQUIRED)
+    @ExcelProperty("参数键名")
+    private String sysAttrKey;
+
+    @Schema(description = "参数键值")
+    @ExcelProperty("参数键值")
+    private String sysAttrValue;
+
+    @Schema(description = "分类", example = "2")
+    @ExcelProperty("分类")
+    private String sysAttrType;
+
+    @Schema(description = "备注", example = "你说的对")
+    @ExcelProperty("备注")
+    private String remark;
+
+    @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)
+    @ExcelProperty("创建时间")
+    private LocalDateTime createTime;
+
+}

+ 31 - 0
yudao-module-iscs/src/main/java/cn/iocoder/yudao/module/iscs/controller/admin/attribute/vo/AttributeSaveReqVO.java

@@ -0,0 +1,31 @@
+package cn.iocoder.yudao.module.iscs.controller.admin.attribute.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import jakarta.validation.constraints.NotEmpty;
+import lombok.Data;
+
+@Schema(description = "管理后台 - iscs基础数据新增/修改 Request VO")
+@Data
+public class AttributeSaveReqVO {
+
+    @Schema(description = "主键ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "21876")
+    private Long id;
+
+    @Schema(description = "参数名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "芋艿")
+    @NotEmpty(message = "参数名称不能为空")
+    private String sysAttrName;
+
+    @Schema(description = "参数键名", requiredMode = Schema.RequiredMode.REQUIRED)
+    @NotEmpty(message = "参数键名不能为空")
+    private String sysAttrKey;
+
+    @Schema(description = "参数键值")
+    private String sysAttrValue;
+
+    @Schema(description = "分类", example = "2")
+    private String sysAttrType;
+
+    @Schema(description = "备注", example = "你说的对")
+    private String remark;
+
+}

+ 40 - 0
yudao-module-iscs/src/main/java/cn/iocoder/yudao/module/iscs/controller/admin/attribute/vo/MailVO.java

@@ -0,0 +1,40 @@
+package cn.iocoder.yudao.module.iscs.controller.admin.attribute.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.io.Serializable;
+
+@Data
+public class MailVO implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+
+    @Schema(description = "邮箱服务地址")
+    private String hostIp;
+
+    @Schema(description = "系统发件人邮箱地址")
+    private String fromMail;
+
+    @Schema(description = "HMailServer默认使用端口25")
+    private String port;
+
+    @Schema(description = "如果需要身份验证,设置为true")
+    private String auth;
+
+    @Schema(description = "设置邮件发送人名称")
+    private String name;
+
+    @Schema(description = "设置公司名称")
+    private String company;
+
+    @Schema(description = "检查计划邮件模板设定")
+    private String checkPlan;
+
+    @Schema(description = "物资到期提醒模板")
+    private String reminder;
+
+    @Schema(description = "物资逾期告警模板")
+    private String alarm;
+
+}

+ 51 - 0
yudao-module-iscs/src/main/java/cn/iocoder/yudao/module/iscs/dal/dataobject/attribute/AttributeDO.java

@@ -0,0 +1,51 @@
+package cn.iocoder.yudao.module.iscs.dal.dataobject.attribute;
+
+import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
+import com.baomidou.mybatisplus.annotation.KeySequence;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.*;
+
+/**
+ * iscs基础数据 DO
+ *
+ * @author 芋道源码
+ */
+@TableName("sys_attribute")
+@KeySequence("sys_attribute_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ToString(callSuper = true)
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+public class AttributeDO extends BaseDO {
+
+    /**
+     * 主键ID
+     */
+    @TableId
+    private Long id;
+    /**
+     * 参数名称
+     */
+    private String sysAttrName;
+    /**
+     * 参数键名
+     */
+    private String sysAttrKey;
+    /**
+     * 参数键值
+     */
+    private String sysAttrValue;
+    /**
+     * 分类
+     */
+    private String sysAttrType;
+    /**
+     * 备注
+     */
+    private String remark;
+
+
+}

+ 29 - 0
yudao-module-iscs/src/main/java/cn/iocoder/yudao/module/iscs/dal/mysql/attribute/AttributeMapper.java

@@ -0,0 +1,29 @@
+package cn.iocoder.yudao.module.iscs.dal.mysql.attribute;
+
+import cn.iocoder.yudao.framework.common.pojo.PageResult;
+import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
+import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
+import cn.iocoder.yudao.module.iscs.controller.admin.attribute.vo.AttributePageReqVO;
+import cn.iocoder.yudao.module.iscs.dal.dataobject.attribute.AttributeDO;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * iscs基础数据 Mapper
+ *
+ * @author 芋道源码
+ */
+@Mapper
+public interface AttributeMapper extends BaseMapperX<AttributeDO> {
+
+    default PageResult<AttributeDO> selectPage(AttributePageReqVO reqVO) {
+        return selectPage(reqVO, new LambdaQueryWrapperX<AttributeDO>()
+                .likeIfPresent(AttributeDO::getSysAttrName, reqVO.getSysAttrName())
+                .eqIfPresent(AttributeDO::getSysAttrKey, reqVO.getSysAttrKey())
+                .eqIfPresent(AttributeDO::getSysAttrValue, reqVO.getSysAttrValue())
+                .eqIfPresent(AttributeDO::getSysAttrType, reqVO.getSysAttrType())
+                .eqIfPresent(AttributeDO::getRemark, reqVO.getRemark())
+                .betweenIfPresent(AttributeDO::getCreateTime, reqVO.getCreateTime())
+                .orderByDesc(AttributeDO::getId));
+    }
+
+}

+ 4 - 1
yudao-module-iscs/src/main/java/cn/iocoder/yudao/module/iscs/enums/ErrorCodeConstants.java

@@ -4,5 +4,8 @@ import cn.iocoder.yudao.framework.common.exception.ErrorCode;
 public interface ErrorCodeConstants {
 
     // ========== 单位管理 ==========
-    ErrorCode UNIT_NOT_EXISTS = new ErrorCode(2_001_000_001, "单位管理不存在");
+    ErrorCode UNIT_NOT_EXISTS = new ErrorCode(2_001_001_001, "单位管理不存在");
+
+    // ========== iscs基础数据 ==========
+    ErrorCode ATTRIBUTE_NOT_EXISTS = new ErrorCode(2_001_002_001, "iscs基础数据不存在");
 }

+ 70 - 0
yudao-module-iscs/src/main/java/cn/iocoder/yudao/module/iscs/service/attribute/AttributeService.java

@@ -0,0 +1,70 @@
+package cn.iocoder.yudao.module.iscs.service.attribute;
+
+import cn.iocoder.yudao.framework.common.pojo.PageResult;
+import cn.iocoder.yudao.module.iscs.controller.admin.attribute.vo.AttributePageReqVO;
+import cn.iocoder.yudao.module.iscs.controller.admin.attribute.vo.AttributeSaveReqVO;
+import cn.iocoder.yudao.module.iscs.controller.admin.attribute.vo.MailVO;
+import cn.iocoder.yudao.module.iscs.dal.dataobject.attribute.AttributeDO;
+import jakarta.validation.Valid;
+
+import java.util.List;
+
+/**
+ * iscs基础数据 Service 接口
+ *
+ * @author 芋道源码
+ */
+public interface AttributeService {
+
+    /**
+     * 创建iscs基础数据
+     *
+     * @param createReqVO 创建信息
+     * @return 编号
+     */
+    Long createAttribute(@Valid AttributeSaveReqVO createReqVO);
+
+    /**
+     * 更新iscs基础数据
+     *
+     * @param updateReqVO 更新信息
+     */
+    void updateAttribute(@Valid AttributeSaveReqVO updateReqVO);
+
+    /**
+     * 删除iscs基础数据
+     *
+     * @param id 编号
+     */
+    void deleteAttribute(Long id);
+
+    /**
+    * 批量删除iscs基础数据
+    *
+    * @param ids 编号
+    */
+    void deleteAttributeListByIds(List<Long> ids);
+
+    /**
+     * 获得iscs基础数据
+     *
+     * @param id 编号
+     * @return iscs基础数据
+     */
+    AttributeDO getAttribute(Long id);
+
+    /**
+     * 获得iscs基础数据分页
+     *
+     * @param pageReqVO 分页查询
+     * @return iscs基础数据分页
+     */
+    PageResult<AttributeDO> getAttributePage(AttributePageReqVO pageReqVO);
+
+    AttributeDO getAttributeByKey(String sysAttrKey);
+
+    MailVO getMailVo();
+
+    Boolean refreshAttrCache();
+
+}

+ 189 - 0
yudao-module-iscs/src/main/java/cn/iocoder/yudao/module/iscs/service/attribute/AttributeServiceImpl.java

@@ -0,0 +1,189 @@
+package cn.iocoder.yudao.module.iscs.service.attribute;
+
+import cn.hutool.core.collection.CollUtil;
+import cn.hutool.core.lang.Assert;
+import cn.iocoder.yudao.framework.common.pojo.PageResult;
+import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
+import cn.iocoder.yudao.framework.redis.RedisCacheUtil;
+import cn.iocoder.yudao.module.iscs.controller.admin.attribute.vo.AttributePageReqVO;
+import cn.iocoder.yudao.module.iscs.controller.admin.attribute.vo.AttributeSaveReqVO;
+import cn.iocoder.yudao.module.iscs.controller.admin.attribute.vo.MailVO;
+import cn.iocoder.yudao.module.iscs.dal.dataobject.attribute.AttributeDO;
+import cn.iocoder.yudao.module.iscs.dal.mysql.attribute.AttributeMapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import jakarta.annotation.Resource;
+import org.springframework.stereotype.Service;
+import org.springframework.validation.annotation.Validated;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
+import static cn.iocoder.yudao.module.iscs.enums.ErrorCodeConstants.ATTRIBUTE_NOT_EXISTS;
+import static cn.iocoder.yudao.module.system.dal.redis.RedisKeyConstants.ATTRIBUTE;
+
+/**
+ * iscs基础数据 Service 实现类
+ *
+ * @author 芋道源码
+ */
+@Service
+@Validated
+public class AttributeServiceImpl implements AttributeService {
+
+    @Resource
+    private AttributeMapper attributeMapper;
+    @Resource
+    private RedisCacheUtil redisCacheUtil;
+
+    @Override
+    public Long createAttribute(AttributeSaveReqVO createReqVO) {
+        Assert.notBlank(createReqVO.getSysAttrKey(), "键名不可为空");
+        Assert.notBlank(createReqVO.getSysAttrValue(), "键值不可为空");
+        // 1.判断键名不可重复
+        List<AttributeDO> list = attributeMapper.selectList(Wrappers.<AttributeDO>lambdaQuery()
+                .eq(AttributeDO::getSysAttrKey, createReqVO.getSysAttrKey()));
+        Assert.isTrue(list.isEmpty(), "当前键名已存在!");
+
+        // 2.插入
+        AttributeDO attribute = BeanUtils.toBean(createReqVO, AttributeDO.class);
+        attributeMapper.insert(attribute);
+
+        // 3.开始缓存
+        String key = ATTRIBUTE + createReqVO.getSysAttrKey();
+        redisCacheUtil.setCacheObject(key, attribute);
+
+        // 返回
+        return attribute.getId();
+    }
+
+    @Override
+    public void updateAttribute(AttributeSaveReqVO updateReqVO) {
+        Assert.notNull(updateReqVO.getId(), "主键id不可为空!");
+        Assert.notBlank(updateReqVO.getSysAttrKey(), "键名不可为空");
+        Assert.notBlank(updateReqVO.getSysAttrValue(), "键值不可为空");
+        // 1.判断键名不可重复
+        List<AttributeDO> list = attributeMapper.selectList(Wrappers.<AttributeDO>lambdaQuery()
+                .eq(AttributeDO::getSysAttrKey, updateReqVO.getSysAttrKey())
+                .ne(AttributeDO::getId, updateReqVO.getId()));
+        Assert.isTrue(list.isEmpty(), "当前键名已存在!");
+        // 2.校验存在
+        validateAttributeExists(updateReqVO.getId());
+        // 3.更新
+        AttributeDO updateObj = BeanUtils.toBean(updateReqVO, AttributeDO.class);
+        attributeMapper.updateById(updateObj);
+
+        // 4.因为不知道会不会改键名,所以不管怎么样都把之前的缓存删掉重新插
+        AttributeDO byId = attributeMapper.selectById(updateReqVO.getId());
+        redisCacheUtil.deleteObject(ATTRIBUTE + byId.getSysAttrKey());
+        // 5.开始缓存
+        String key = ATTRIBUTE + updateReqVO.getSysAttrKey();
+        redisCacheUtil.setCacheObject(key, byId);
+    }
+
+    @Override
+    public void deleteAttribute(Long id) {
+        // 校验存在
+        validateAttributeExists(id);
+        // 删除
+        attributeMapper.deleteById(id);
+    }
+
+    @Override
+        public void deleteAttributeListByIds(List<Long> ids) {
+        // 校验存在
+        validateAttributeExists(ids);
+        // 开始清理缓存
+        List<AttributeDO> attributeDOList = attributeMapper.selectByIds(ids);
+        for (AttributeDO attributeDO : attributeDOList) {
+            redisCacheUtil.deleteObject(ATTRIBUTE + attributeDO.getSysAttrKey());
+        }
+        // 删除
+        attributeMapper.deleteByIds(ids);
+        }
+
+    private void validateAttributeExists(List<Long> ids) {
+        List<AttributeDO> list = attributeMapper.selectByIds(ids);
+        if (CollUtil.isEmpty(list) || list.size() != ids.size()) {
+            throw exception(ATTRIBUTE_NOT_EXISTS);
+        }
+    }
+
+    private void validateAttributeExists(Long id) {
+        if (attributeMapper.selectById(id) == null) {
+            throw exception(ATTRIBUTE_NOT_EXISTS);
+        }
+    }
+
+    @Override
+    public AttributeDO getAttribute(Long id) {
+        return attributeMapper.selectById(id);
+    }
+
+    @Override
+    public PageResult<AttributeDO> getAttributePage(AttributePageReqVO pageReqVO) {
+        return attributeMapper.selectPage(pageReqVO);
+    }
+
+    @Override
+    public AttributeDO getAttributeByKey(String sysAttrKey) {
+        Assert.notBlank(sysAttrKey, "请传入key");
+        AttributeDO cacheObject = redisCacheUtil.getCacheObject(ATTRIBUTE + sysAttrKey);
+        if (cacheObject != null) {
+            return BeanUtils.toBean(cacheObject, AttributeDO.class);
+        } else {
+            AttributeDO one = attributeMapper.selectOne(Wrappers.<AttributeDO>lambdaQuery()
+                    .eq(AttributeDO::getSysAttrKey, sysAttrKey));
+            if (one != null) {
+                redisCacheUtil.setCacheObject(ATTRIBUTE + sysAttrKey, BeanUtils.toBean(one, AttributeDO.class));
+                return one;
+            } else {
+                Assert.isTrue(false, "该配置参数不存在!");
+            }
+        }
+        return null;
+    }
+
+    @Override
+    public MailVO getMailVo() {
+        ArrayList<String> strings = new ArrayList<>();
+        strings.add("info.mail.hostip");
+        strings.add("info.mail.from");
+        strings.add("info.mail.port");
+        strings.add("info.mail.auth");
+        strings.add("info.mail.name");
+        strings.add("info.mail.company");
+        List<AttributeDO> list = attributeMapper.selectList(Wrappers.<AttributeDO>lambdaQuery()
+                .in(AttributeDO::getSysAttrKey, strings));
+        // 邮箱服务地址
+        MailVO mailVO = new MailVO();
+        try {
+            mailVO.setHostIp(list.stream().filter(o -> "info.mail.hostip".equals(o.getSysAttrKey())).limit(1).toList().get(0).getSysAttrValue());
+            mailVO.setFromMail(list.stream().filter(o -> "info.mail.from".equals(o.getSysAttrKey())).limit(1).toList().get(0).getSysAttrValue());
+            mailVO.setPort(list.stream().filter(o -> "info.mail.port".equals(o.getSysAttrKey())).limit(1).toList().get(0).getSysAttrValue());
+            mailVO.setAuth(list.stream().filter(o -> "info.mail.auth".equals(o.getSysAttrKey())).limit(1).toList().get(0).getSysAttrValue());
+            mailVO.setName(list.stream().filter(o -> "info.mail.name".equals(o.getSysAttrKey())).limit(1).toList().get(0).getSysAttrValue());
+            mailVO.setCompany(list.stream().filter(o -> "info.mail.company".equals(o.getSysAttrKey())).limit(1).toList().get(0).getSysAttrValue());
+
+        } catch (Exception e) {
+            Assert.isTrue(false, "邮箱参数缺失,请检查!");
+        }
+        return mailVO;
+    }
+
+    @Override
+    public Boolean refreshAttrCache() {
+        // 开始删除
+        redisCacheUtil.deleteObject(ATTRIBUTE);
+        // 查询所有的数据库数据
+        List<AttributeDO> list = attributeMapper.selectList();
+        // 开始缓存
+        if (!list.isEmpty()) {
+            for (AttributeDO attributeDO : list) {
+                redisCacheUtil.setCacheObject(ATTRIBUTE + attributeDO.getSysAttrKey(), attributeDO);
+            }
+        }
+        return true;
+    }
+
+}

+ 12 - 0
yudao-module-iscs/src/main/java/resources/mapper/AttributeMapper.xml

@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="cn.iocoder.yudao.module.iscs.dal.mysql.attribute.AttributeMapper">
+
+    <!--
+        一般情况下,尽可能使用 Mapper 进行 CRUD 增删改查即可。
+        无法满足的场景,例如说多表关联查询,才使用 XML 编写 SQL。
+        代码生成器暂时只生成 Mapper XML 文件本身,更多推荐 MybatisX 快速开发插件来生成查询。
+        文档可见:https://www.iocoder.cn/MyBatis/x-plugins/
+     -->
+
+</mapper>

+ 6 - 1
yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/dal/redis/RedisKeyConstants.java

@@ -110,6 +110,11 @@ public interface RedisKeyConstants {
     /**
      * ISCS缓存数据头
      */
-    public static final String ISCS_ATTR = "iscs_attr:";
+    String ISCS_ATTR = "iscs_attr:";
+
+    /**
+     * ISCS基础数据
+     */
+    String ATTRIBUTE = ISCS_ATTR + "attribute:";
 
 }

+ 1 - 1
yudao-server/src/main/java/cn/iocoder/yudao/server/YudaoServerApplication.java

@@ -13,7 +13,7 @@ import org.springframework.boot.autoconfigure.SpringBootApplication;
  * @author 芋道源码
  */
 @SuppressWarnings("SpringComponentScan") // 忽略 IDEA 无法识别 ${yudao.info.base-package}
-@SpringBootApplication(scanBasePackages = {"${yudao.info.base-package}.server", "${yudao.info.base-package}.module"})
+@SpringBootApplication(scanBasePackages = {"${yudao.info.base-package}.server", "${yudao.info.base-package}.module", "cn.iocoder.yudao.framework.redis"})
 public class YudaoServerApplication {
 
     public static void main(String[] args) {