diff --git a/Cpop-Common/src/main/java/com/cpop/common/constant/Constants.java b/Cpop-Common/src/main/java/com/cpop/common/constant/Constants.java index fdf4d80..0d7b4b7 100644 --- a/Cpop-Common/src/main/java/com/cpop/common/constant/Constants.java +++ b/Cpop-Common/src/main/java/com/cpop/common/constant/Constants.java @@ -203,4 +203,5 @@ public interface Constants { * 登陆查询用户字段 */ String USERNAME = "UserName"; + } diff --git a/Cpop-Generator/src/main/java/com/cpop/generator/CpopGenerator.java b/Cpop-Generator/src/main/java/com/cpop/generator/CpopGenerator.java index 550d8b1..e0a9781 100644 --- a/Cpop-Generator/src/main/java/com/cpop/generator/CpopGenerator.java +++ b/Cpop-Generator/src/main/java/com/cpop/generator/CpopGenerator.java @@ -16,7 +16,7 @@ import java.util.Arrays; import java.util.Scanner; /** - * @author: DB + * @author DB * @Date: 2023/08/04/13:48 * @Description: 代码生成 */ @@ -40,17 +40,17 @@ public class CpopGenerator { /** * 输出路径 */ - private static final String EXPORT_URL = "/Cpop-Mall"; + private static final String EXPORT_URL = "/Cpop-System"; /** * 模块 */ - private static final String EXPORT_ITEM = "mall"; + private static final String EXPORT_ITEM = "system"; /** * 表前缀 */ - private static final String TABLE_PREFIX = "cp_mall_"; + private static final String TABLE_PREFIX = "cp_sys_"; /** * 主入口 diff --git a/Cpop-Mall/src/main/java/com/cpop/mall/business/entity/ProductSpecification.java b/Cpop-Mall/src/main/java/com/cpop/mall/business/entity/ProductSpecification.java index 295d825..35b4f55 100644 --- a/Cpop-Mall/src/main/java/com/cpop/mall/business/entity/ProductSpecification.java +++ b/Cpop-Mall/src/main/java/com/cpop/mall/business/entity/ProductSpecification.java @@ -6,13 +6,11 @@ import com.cpop.core.base.entity.BaseUpdateListener; import com.mybatisflex.annotation.Column; import com.mybatisflex.annotation.Id; import com.mybatisflex.annotation.Table; -import java.io.Serializable; -import java.time.LocalDateTime; -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; import lombok.*; import lombok.experimental.Accessors; +import java.io.Serializable; + /** * 商城-商品-规格 实体类。 * diff --git a/Cpop-Oam/Cpop-Oam-Web/src/main/resources/application-dev.yml b/Cpop-Oam/Cpop-Oam-Web/src/main/resources/application-dev.yml index 74b080a..40dd268 100644 --- a/Cpop-Oam/Cpop-Oam-Web/src/main/resources/application-dev.yml +++ b/Cpop-Oam/Cpop-Oam-Web/src/main/resources/application-dev.yml @@ -83,11 +83,17 @@ knife4j: terms-of-service-url: https://api.jamboxsys.com group: #系统 - system: + Oam: group-name: Oam api-rule: package api-rule-resources: - com.cpop.oam + #系统 + System: + group-name: System + api-rule: package + api-rule-resources: + - com.cpop.system #微信 wx: diff --git a/Cpop-Oam/src/main/java/com/cpop/oam/business/bo/TaskIterationBo.java b/Cpop-Oam/src/main/java/com/cpop/oam/business/bo/TaskIterationBo.java new file mode 100644 index 0000000..8258105 --- /dev/null +++ b/Cpop-Oam/src/main/java/com/cpop/oam/business/bo/TaskIterationBo.java @@ -0,0 +1,45 @@ +package com.cpop.oam.business.bo; + +import com.cpop.core.annontation.StringArrayConvert; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.experimental.Accessors; +import javax.validation.constraints.NotBlank; + +/** + * Task迭代对象 + * @author DB + * @since 2023-12-01 09:43:08 + * @version 1.0.0 + */ +@Data +@Accessors(chain = true) +@ApiModel(value = "Task迭代对象") +public class TaskIterationBo { + + /** + * 主键 + */ + @ApiModelProperty("主键") + private String id; + + /** + * 任务主体 + */ + @NotBlank(message = "任务主体不能为空") + @ApiModelProperty(value = "任务主体", required = true) + private String subject; + + /**任务内容 */ + @NotBlank(message = "任务内容不能为空") + @ApiModelProperty(value = "任务内容", required = true) + private String taskContent; + + /** + * 附件地址 + */ + @StringArrayConvert + @ApiModelProperty("附件地址") + private String attachmentUrl; +} diff --git a/Cpop-Oam/src/main/java/com/cpop/oam/business/vo/TaskArchivingPagVo.java b/Cpop-Oam/src/main/java/com/cpop/oam/business/vo/TaskArchivingPagVo.java new file mode 100644 index 0000000..6ab9684 --- /dev/null +++ b/Cpop-Oam/src/main/java/com/cpop/oam/business/vo/TaskArchivingPagVo.java @@ -0,0 +1,103 @@ +package com.cpop.oam.business.vo; + +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.experimental.Accessors; + +import java.time.LocalDateTime; + +/** + * 任务归档分页 + * @author DB + * @param + * @since 2023-11-30 22:24:49 + * @version 1.0.0 + */ +@Data +@Accessors(chain = true) +@ApiModel(value = "任务归档分页", description = "任务归档分页") +public class TaskArchivingPagVo { + + /** + * 主键 + */ + @ApiModelProperty("主键") + private String id; + + /** + * 主要负责员工id + */ + @ApiModelProperty("主要负责员工id") + private String responsibleStaffId; + + /** + * 主键主要负责员工 + */ + @ApiModelProperty("主要负责员工") + private String responsibleStaffName; + + /** + * 任务类型(0:迭代;1:需求;2:投诉) + */ + @ApiModelProperty("任务类型(0:迭代;1:需求;2:投诉)") + private Integer taskType; + + /** + * 任务内容 + */ + @ApiModelProperty("任务内容") + private String taskContent; + + /** + * 任务评级(0:A;1:B;2:C;3:D;4:E) + */ + @ApiModelProperty("任务评级(0:A;1:B;2:C;3:D;4:E)") + private Integer taskRating; + + /** + * 任务绩点 + */ + @ApiModelProperty("任务绩点") + private Integer gradePoint; + + /** + * 开始时间 + */ + @ApiModelProperty("开始时间") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") + private LocalDateTime taskReceiptTime; + + /** + * 转测试时间 + */ + @ApiModelProperty("转测试时间") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") + private LocalDateTime toTestTime; + + /** + * 转部署时间 + */ + @ApiModelProperty("转部署时间") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") + private LocalDateTime toFinishTime; + + /** + * 主体 + */ + @ApiModelProperty("主体") + private String subject; + + /** + * 小组成员 + */ + @ApiModelProperty("小组成员") + private String taskGroupStaffs; + + /** + * 操作流程 + */ + @ApiModelProperty("操作流程") + private String testToFinishUrl; +} diff --git a/Cpop-Oam/src/main/java/com/cpop/oam/business/vo/TaskToBeClaimedPageVo.java b/Cpop-Oam/src/main/java/com/cpop/oam/business/vo/TaskToBeClaimedPageVo.java new file mode 100644 index 0000000..7009055 --- /dev/null +++ b/Cpop-Oam/src/main/java/com/cpop/oam/business/vo/TaskToBeClaimedPageVo.java @@ -0,0 +1,55 @@ +package com.cpop.oam.business.vo; + +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.experimental.Accessors; +import java.time.LocalDateTime; + +/** + * 任务待评估与待领取分页 + * @author DB + * @since 2023-11-30 22:44:03 + * @version 1.0.0 + */ +@Data +@Accessors(chain = true) +@ApiModel(value = "任务待评估与待领取分页") +public class TaskToBeClaimedPageVo { + + /**任务id */ + @ApiModelProperty(value = "任务id") + private String id; + + /**主体 */ + @ApiModelProperty(value = "主体") + private String subject; + + /**任务内容 */ + @ApiModelProperty(value = "任务内容") + private String taskContent; + + /**附件地址 */ + @ApiModelProperty(value = "附件地址") + private String attachmentUrl; + + /**任务评级(0:A;1:B;2:C;3:D;4:E) */ + @ApiModelProperty(value = "任务评级(0:A;1:B;2:C;3:D;4:E)") + private Integer taskRating; + + /**任务类型(0:迭代;1:需求;2:投诉/工单) */ + @ApiModelProperty(value = "任务类型(0:迭代;1:需求;2:投诉/工单)") + private Integer taskType; + + /** + * 创建时间 + */ + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") + @ApiModelProperty("创建时间") + private LocalDateTime createTime; + + /**对接员工 */ + @ApiModelProperty(value = "对接员工") + private String dockingStaff; +} diff --git a/Cpop-Oam/src/main/java/com/cpop/oam/business/vo/TaskWorkOrderPersonVo.java b/Cpop-Oam/src/main/java/com/cpop/oam/business/vo/TaskWorkOrderPersonVo.java new file mode 100644 index 0000000..42fd19b --- /dev/null +++ b/Cpop-Oam/src/main/java/com/cpop/oam/business/vo/TaskWorkOrderPersonVo.java @@ -0,0 +1,76 @@ +package com.cpop.oam.business.vo; + +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.experimental.Accessors; + +import java.time.LocalDateTime; + +@Data +@Accessors(chain = true) +@ApiModel(value = "个人工单返回对象", description = "个人工单返回对象对象") +public class TaskWorkOrderPersonVo { + + /** + * 工单id + */ + @ApiModelProperty(value = "工单id") + private String id; + + /** + * 机构/品牌 + */ + @ApiModelProperty(value = "机构/品牌") + private String brandName; + + /** + * 校区/店铺 + */ + @ApiModelProperty(value = "校区/店铺") + private String storeName; + + /** + * 问题描述 + */ + @ApiModelProperty(value = "问题描述") + private String taskContent; + + /** + * 手机号 + */ + @ApiModelProperty(value = "手机号") + private String phoneNumber; + + /** + * 提交人ID + */ + @ApiModelProperty(value = "提交人ID") + private String recordStaffId; + + /** + * 提交人 + */ + @ApiModelProperty(value = "提交人") + private String recordStaffName; + + /** + * 提交时间 + */ + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") + @ApiModelProperty(value = "提交时间") + private LocalDateTime createTime; + + /** + * 接收用时 + */ + @ApiModelProperty(value = "接收用时") + private Integer receivingTime; + + /** + * 工单状态 + */ + @ApiModelProperty(value = "工单状态") + private Integer workOrderStatus; +} diff --git a/Cpop-System/src/main/java/com/cpop/system/business/bo/DictDataBo.java b/Cpop-System/src/main/java/com/cpop/system/business/bo/DictDataBo.java new file mode 100644 index 0000000..6d034a6 --- /dev/null +++ b/Cpop-System/src/main/java/com/cpop/system/business/bo/DictDataBo.java @@ -0,0 +1,86 @@ +package com.cpop.system.business.bo; + +import com.mybatisflex.annotation.Id; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.experimental.Accessors; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; + +/** + * @author DB + * @version 1.0.0 + * @since 2023-12-01 17:04 + */ +@Data +@Accessors(chain = true) +@ApiModel(value = "字典数据参数") +public class DictDataBo { + + /** + * id + */ + @ApiModelProperty("id") + private String id; + + /** + * 排序 + */ + @NotNull(message = "排序不能为空") + @ApiModelProperty(value = "排序",required = true) + private Integer dictSort; + + /** + * 字典标签 + */ + @NotBlank(message = "字典标签不能为空") + @ApiModelProperty(value = "字典标签",required = true) + private String dictLabel; + + /** + * 字典键值 + */ + @NotBlank(message = "字典键值不能为空") + @ApiModelProperty(value = "字典键值",required = true) + private String dictValue; + + /** + * 字典类型 + */ + @NotBlank(message = "字典类型不能为空") + @ApiModelProperty(value = "字典类型",required = true) + private String dictType; + + /** + * 样式属性(其他样式扩展) + */ + @ApiModelProperty("样式属性(其他样式扩展)") + private String cssClass; + + /** + * 表格回显样式 + */ + @ApiModelProperty("表格回显样式") + private String listClass; + + /** + * 是否默认(1是 0否) + */ + @ApiModelProperty("是否默认(1是 0否)") + private Boolean isDefault; + + /** + * 状态(1正常 0停用) + */ + @NotNull(message = "状态不能为空") + @ApiModelProperty(value = "状态(1正常 0停用)",required = true) + private Boolean status; + + /** + * 备注 + */ + @ApiModelProperty("备注") + private String remark; +} diff --git a/Cpop-System/src/main/java/com/cpop/system/business/bo/DictDataPageBo.java b/Cpop-System/src/main/java/com/cpop/system/business/bo/DictDataPageBo.java new file mode 100644 index 0000000..b9a3e25 --- /dev/null +++ b/Cpop-System/src/main/java/com/cpop/system/business/bo/DictDataPageBo.java @@ -0,0 +1,30 @@ +package com.cpop.system.business.bo; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.experimental.Accessors; + +/** + * 字典数据分页参数 + * @author DB + * @version 1.0.0 + * @since 2023-12-01 16:28 + */ +@Data +@Accessors(chain = true) +@ApiModel(value = "字典数据分页参数") +public class DictDataPageBo { + + /** + * 字典标签 + */ + @ApiModelProperty("字典标签") + private String dictLabel; + + /** + * 字典类型 + */ + @ApiModelProperty("字典类型") + private String dictType; +} diff --git a/Cpop-System/src/main/java/com/cpop/system/business/bo/DictTypeBo.java b/Cpop-System/src/main/java/com/cpop/system/business/bo/DictTypeBo.java new file mode 100644 index 0000000..835631c --- /dev/null +++ b/Cpop-System/src/main/java/com/cpop/system/business/bo/DictTypeBo.java @@ -0,0 +1,54 @@ +package com.cpop.system.business.bo; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.experimental.Accessors; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; + +/** + * 字典类型参数 + * @version 1.0.0 + * @author DB + * @since 2023-12-01 15:15 + */ +@Data +@Accessors(chain = true) +@ApiModel(value = "字典类型参数") +public class DictTypeBo { + + /** + * 主键 + */ + @ApiModelProperty(value = "主键") + private String id; + + /** + * 字典名 + */ + @NotBlank(message = "字典名不能为空") + @ApiModelProperty(value = "字典名",required = true) + private String dictName; + + /** + * 字典类型 + */ + @NotBlank(message = "字典类型不能为空") + @ApiModelProperty(value = "字典类型",required = true) + private String dictType; + + /** + * 状态(0正常 1停用) + */ + @NotNull(message = "状态不能为空") + @ApiModelProperty(value = "状态(0正常 1停用)",required = true) + private Boolean status; + + /** + * 备注 + */ + @ApiModelProperty(value = "备注") + private String remark; +} diff --git a/Cpop-System/src/main/java/com/cpop/system/business/controller/DictDataController.java b/Cpop-System/src/main/java/com/cpop/system/business/controller/DictDataController.java new file mode 100644 index 0000000..8f58e9b --- /dev/null +++ b/Cpop-System/src/main/java/com/cpop/system/business/controller/DictDataController.java @@ -0,0 +1,131 @@ +package com.cpop.system.business.controller; + +import com.cpop.common.utils.bean.BeanUtils; +import com.cpop.core.base.R; +import com.cpop.core.utils.SpringUtils; +import com.cpop.system.business.bo.DictDataBo; +import com.cpop.system.business.bo.DictDataPageBo; +import com.cpop.system.business.entity.DictType; +import com.cpop.system.business.service.DictTypeService; +import com.cpop.system.business.vo.DictDataListVo; +import com.cpop.system.business.vo.DictDataPageVo; +import com.cpop.system.business.vo.DictDataVo; +import com.mybatisflex.core.paginate.Page; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.beans.factory.annotation.Autowired; +import com.cpop.system.business.entity.DictData; +import com.cpop.system.business.service.DictDataService; +import org.springframework.web.bind.annotation.RestController; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import io.swagger.annotations.ApiParam; + +import java.io.Serializable; +import java.util.List; + +/** + * 系统-字典数据表 控制层。 + * + * @author DB + * @since 2023-12-01 + */ +@RestController +@Api(tags = "系统-字典数据表接口") +@RequestMapping("/dictData") +public class DictDataController { + + @Autowired + private DictDataService dictDataService; + + /** + * 获取字典数据分页 + * @author DB + * @since 2023/12/01 + * @param bo 请求参数 + * @return R> + */ + @GetMapping("/getDictDataPage") + @ApiOperation("获取字典数据分页") + public R> getDictDataPage(@ApiParam("查询参数") DictDataPageBo bo) { + Page page = dictDataService.getDictDataPage(bo); + return R.ok(page); + } + + /** + * 根据主键获取字典数据详情 + * @author DB + * @since 2023/12/01 + * @param id 字典数据主键 + * @return DictData + */ + @GetMapping("/getDictDataInfo/{id}") + @ApiOperation("根据主键获取字典数据详情") + public R getDictDataInfo(@PathVariable @ApiParam("字典数据code") String id) { + DictDataVo vo = dictDataService.getDictDataInfo(id); + return R.ok(vo); + } + + /** + * 根据字典类型获取字典数据 + * @author DB + * @since 2023/12/01 + * @param dictType 字典类型 + * @return R + */ + @GetMapping("/getDictDataByDictType/{dictType}") + @ApiOperation("根据字典类型获取字典数据") + public R> getDictDataByDictType(@PathVariable @ApiParam("字典数据code") String dictType) { + List dataList = dictDataService.getDictDataByDictType(dictType); + return R.ok(BeanUtils.mapToList(dataList, DictDataListVo.class)); + } + + /** + * 新增字典数据 + * @author DB + * @since 2023/12/01 + * @param bo 请求参数 + * @return R + */ + @PostMapping("/insertDictData") + @ApiOperation("新增字典数据") + public R insertDictData(@RequestBody @ApiParam("字典数据") @Validated DictDataBo bo) { + dictDataService.insertDictData(bo); + return R.ok(); + } + + /** + * 修改字典数据 + * @author DB + * @since 2023/12/01 + * @param bo 请求 + * @return R + */ + @PutMapping("/updateDictData") + @ApiOperation("修改字典数据") + public R updateDictData(@RequestBody @ApiParam("字典数据") @Validated DictDataBo bo) { + dictDataService.updateDictData(bo); + return R.ok(); + } + + /** + * 删除字典数据 + * @author DB + * @since 2023/12/01 + * @param id 主键 + * @return R + */ + @DeleteMapping("/removeDictData/{id}") + @ApiOperation("删除字典数据") + public R removeDictData(@PathVariable String id) { + dictDataService.removeDictData(id); + return R.ok(); + } + +} diff --git a/Cpop-System/src/main/java/com/cpop/system/business/controller/DictTypeController.java b/Cpop-System/src/main/java/com/cpop/system/business/controller/DictTypeController.java new file mode 100644 index 0000000..b78bca4 --- /dev/null +++ b/Cpop-System/src/main/java/com/cpop/system/business/controller/DictTypeController.java @@ -0,0 +1,161 @@ +package com.cpop.system.business.controller; + +import com.cpop.common.utils.bean.BeanUtils; +import com.cpop.core.base.R; +import com.cpop.core.base.entity.LoginUser; +import com.cpop.core.base.exception.ServiceException; +import com.cpop.core.utils.SecurityUtils; +import com.cpop.system.business.bo.DictTypeBo; +import com.cpop.system.business.vo.DictTypePageVo; +import com.cpop.system.business.vo.DictTypeVo; +import com.mybatisflex.core.paginate.Page; +import com.mybatisflex.core.query.QueryWrapper; +import lombok.extern.java.Log; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.beans.factory.annotation.Autowired; +import com.cpop.system.business.entity.DictType; +import com.cpop.system.business.service.DictTypeService; +import org.springframework.web.bind.annotation.RestController; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import io.swagger.annotations.ApiParam; + +import java.io.Serializable; +import java.util.List; + +import static com.cpop.system.business.entity.table.DictTypeTableDef.DICT_TYPE; + +/** + * 系统-字典类型表 控制层。 + * + * @author DB + * @since 2023-12-01 + */ +@RestController +@Api(tags = "系统管理模块-字典类型接口") +@RequestMapping("/dictType") +public class DictTypeController { + + @Autowired + private DictTypeService dictTypeService; + + /** + * 获取系统字典类型分页 + * + * @param dictName 字典名 + * @return R> + * @author DB + * @since 2023/12/01 + */ + @GetMapping("/getDictTypePage") + @ApiOperation("获取系统字典类型分页") + public R> getDictTypePage(@ApiParam(value = "字典名") String dictName) { + Page page = dictTypeService.getDictTypePage(dictName); + return R.ok(page); + } + + /** + * 根据主键获取字典类型详情 + * + * @param id 字典类型主键 + * @return R + * @author DB + * @since 2023/12/01 + */ + @GetMapping("/getDictTypeInfo/{id}") + @ApiOperation("根据主键获取字典类型详情") + public R getDictTypeInfo(@PathVariable @ApiParam("字典类型主键") String id) { + DictTypeVo dictType = dictTypeService.getOneAs(QueryWrapper.create().where(DICT_TYPE.ID.eq(id)), DictTypeVo.class); + return R.ok(dictType); + } + + /** + * 新增字典类型 + * + * @param bo 请求参数 + * @return R + * @author DB + * @since 2023/12/01 + */ + @PostMapping("/insertDictType") + @ApiOperation("新增字典类型") + public R insertDictType(@Validated @RequestBody DictTypeBo bo) { + if (!dictTypeService.checkDictTypeUnique(bo)) { + throw new ServiceException("新增字典'" + bo.getDictName() + "'失败,字典类型已存在"); + } + dictTypeService.save(BeanUtils.mapToClass(bo, DictType.class)); + return R.ok(); + } + + /** + * 修改字典类型 + * + * @param bo 请求 + * @return R + * @author DB + * @since 2023/12/01 + */ + @PutMapping("/updateDictType") + @ApiOperation("修改字典类型") + public R updateDictType(@Validated @RequestBody DictTypeBo bo) { + if (!dictTypeService.checkDictTypeUnique(bo)) { + throw new ServiceException("修改字典'" + bo.getDictName() + "'失败,字典类型已存在"); + } + dictTypeService.updateById(BeanUtils.mapToClass(bo, DictType.class)); + return R.ok(); + } + + /** + * 根据主键删除字典类型 + * + * @param id 主键 + * @return R + * @author DB + * @since 2023/12/01 + */ + @DeleteMapping("/removeById/{id}") + @ApiOperation("根据主键删除字典类型") + public R removeById(@PathVariable @ApiParam("字典类型主键") String id) { + dictTypeService.removeDataAndCache(id); + return R.ok(); + } + + /** + * 刷新字典缓存 + * + * @return R + * @author DB + * @since 2023/12/01 + */ + @ApiOperation("刷新字典缓存") + @PutMapping("/refreshCache") + public R refreshCache() { + dictTypeService.resetDictCache(); + return R.ok(); + } + + /** + * 获取字典选择框列表 + * @author DB + * @since 2023/12/01 + * @return R> + */ + @ApiOperation("获取字典选择框列表") + @GetMapping("/optionSelect") + public R> optionSelect() { + LoginUser loginUser = SecurityUtils.getInstance().getLoginUser(); + List dictTypes = dictTypeService.queryChain() + .where(DICT_TYPE.USER_TYPE.eq(loginUser.getUserType().toString())) + .listAs(DictTypeVo.class); + return R.ok(dictTypes); + } + +} diff --git a/Cpop-System/src/main/java/com/cpop/system/business/entity/DictData.java b/Cpop-System/src/main/java/com/cpop/system/business/entity/DictData.java new file mode 100644 index 0000000..6fe57f6 --- /dev/null +++ b/Cpop-System/src/main/java/com/cpop/system/business/entity/DictData.java @@ -0,0 +1,86 @@ +package com.cpop.system.business.entity; + +import com.cpop.core.base.entity.BaseEntity; +import com.cpop.core.base.entity.BaseInsertListener; +import com.cpop.core.base.entity.BaseUpdateListener; +import com.mybatisflex.annotation.Id; +import com.mybatisflex.annotation.Table; +import java.io.Serializable; +import java.time.LocalDateTime; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.*; +import lombok.experimental.Accessors; + +/** + * 系统-字典数据表 实体类。 + * + * @author DB + * @since 2023-12-01 + */ +@Data +@EqualsAndHashCode(callSuper=false) +@Builder +@NoArgsConstructor +@AllArgsConstructor +@Accessors(chain = true) +@Table(value = "cp_sys_dict_data", onInsert = BaseInsertListener.class, onUpdate = BaseUpdateListener.class, mapperGenerateEnable = false) +public class DictData extends BaseEntity implements Serializable { + + /** + * 编码 + */ + @Id + private String id; + + /** + * 排序 + */ + private Integer dictSort; + + /** + * 字典标签 + */ + private String dictLabel; + + /** + * 字典键值 + */ + private String dictValue; + + /** + * 字典类型 + */ + private String dictType; + + /** + * 样式属性(其他样式扩展) + */ + private String cssClass; + + /** + * 表格回显样式 + */ + private String listClass; + + /** + * 是否默认(1是 0否) + */ + private Boolean isDefault; + + /** + * 状态(1正常 0停用) + */ + private Boolean status; + + /** + * 备注 + */ + private String remark; + + /** + * 用户类型 + */ + private String userType; + +} diff --git a/Cpop-System/src/main/java/com/cpop/system/business/entity/DictType.java b/Cpop-System/src/main/java/com/cpop/system/business/entity/DictType.java new file mode 100644 index 0000000..047c40c --- /dev/null +++ b/Cpop-System/src/main/java/com/cpop/system/business/entity/DictType.java @@ -0,0 +1,61 @@ +package com.cpop.system.business.entity; + +import com.cpop.core.base.entity.BaseEntity; +import com.cpop.core.base.entity.BaseInsertListener; +import com.cpop.core.base.entity.BaseUpdateListener; +import com.mybatisflex.annotation.Id; +import com.mybatisflex.annotation.Table; +import java.io.Serializable; +import java.time.LocalDateTime; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.*; +import lombok.experimental.Accessors; + +/** + * 系统-字典表 实体类。 + * + * @author DB + * @since 2023-12-01 + */ +@Data +@EqualsAndHashCode(callSuper=false) +@Builder +@NoArgsConstructor +@AllArgsConstructor +@Accessors(chain = true) +@Table(value = "cp_sys_dict_type", onInsert = BaseInsertListener.class, onUpdate = BaseUpdateListener.class, mapperGenerateEnable = false) +public class DictType extends BaseEntity implements Serializable { + + /** + * 主键 + */ + @Id + private String id; + + /** + * 字典名 + */ + private String dictName; + + /** + * 字典类型 + */ + private String dictType; + + /** + * 状态(0正常 1停用) + */ + private Boolean status; + + /** + * 备注 + */ + private String remark; + + /** + * 用户类型 + */ + private String userType; + +} diff --git a/Cpop-System/src/main/java/com/cpop/system/business/mapper/DictDataMapper.java b/Cpop-System/src/main/java/com/cpop/system/business/mapper/DictDataMapper.java new file mode 100644 index 0000000..98bd776 --- /dev/null +++ b/Cpop-System/src/main/java/com/cpop/system/business/mapper/DictDataMapper.java @@ -0,0 +1,14 @@ +package com.cpop.system.business.mapper; + +import com.mybatisflex.core.BaseMapper; +import com.cpop.system.business.entity.DictData; + +/** + * 系统-字典数据表 映射层。 + * + * @author DB + * @since 2023-12-01 + */ +public interface DictDataMapper extends BaseMapper { + +} diff --git a/Cpop-System/src/main/java/com/cpop/system/business/mapper/DictTypeMapper.java b/Cpop-System/src/main/java/com/cpop/system/business/mapper/DictTypeMapper.java new file mode 100644 index 0000000..0066794 --- /dev/null +++ b/Cpop-System/src/main/java/com/cpop/system/business/mapper/DictTypeMapper.java @@ -0,0 +1,14 @@ +package com.cpop.system.business.mapper; + +import com.mybatisflex.core.BaseMapper; +import com.cpop.system.business.entity.DictType; + +/** + * 系统-字典表 映射层。 + * + * @author DB + * @since 2023-12-01 + */ +public interface DictTypeMapper extends BaseMapper { + +} diff --git a/Cpop-System/src/main/java/com/cpop/system/business/service/DictDataService.java b/Cpop-System/src/main/java/com/cpop/system/business/service/DictDataService.java new file mode 100644 index 0000000..035c928 --- /dev/null +++ b/Cpop-System/src/main/java/com/cpop/system/business/service/DictDataService.java @@ -0,0 +1,72 @@ +package com.cpop.system.business.service; + +import com.cpop.system.business.bo.DictDataBo; +import com.cpop.system.business.bo.DictDataPageBo; +import com.cpop.system.business.vo.DictDataListVo; +import com.cpop.system.business.vo.DictDataPageVo; +import com.cpop.system.business.vo.DictDataVo; +import com.mybatisflex.core.paginate.Page; +import com.mybatisflex.core.service.IService; +import com.cpop.system.business.entity.DictData; + +import java.util.List; + +/** + * 系统-字典数据表 服务层。 + * + * @author DB + * @since 2023-12-01 + */ +public interface DictDataService extends IService { + + /** + * 获取字典数据分页 + * @author DB + * @since 2023/12/01 + * @param bo 请求参数 + * @return Page + */ + Page getDictDataPage(DictDataPageBo bo); + + /** + * 根据主键获取字典数据详情 + * @author DB + * @since 2023/12/01 + * @param id 主键 + * @return DictDataVo + */ + DictDataVo getDictDataInfo(String id); + + /** + * 根据字典类型获取字典数据 + * @author DB + * @since 2023/12/01 + * @param dictType 字典类型 + * @return List + */ + List getDictDataByDictType(String dictType); + + /** + * 新增字典数据 + * @author DB + * @since 2023/12/01 + * @param bo 请求参数 + */ + void insertDictData(DictDataBo bo); + + /** + * 修改字典数据 + * @author DB + * @since 2023/12/01 + * @param bo 请求 + */ + void updateDictData(DictDataBo bo); + + /** + * 删除字典数据 + * @author DB + * @since 2023/12/01 + * @param id 主键 + */ + void removeDictData(String id); +} diff --git a/Cpop-System/src/main/java/com/cpop/system/business/service/DictTypeService.java b/Cpop-System/src/main/java/com/cpop/system/business/service/DictTypeService.java new file mode 100644 index 0000000..0f53705 --- /dev/null +++ b/Cpop-System/src/main/java/com/cpop/system/business/service/DictTypeService.java @@ -0,0 +1,64 @@ +package com.cpop.system.business.service; + +import com.cpop.core.base.R; +import com.cpop.system.business.bo.DictTypeBo; +import com.cpop.system.business.vo.DictTypePageVo; +import com.mybatisflex.core.paginate.Page; +import com.mybatisflex.core.service.IService; +import com.cpop.system.business.entity.DictType; + +/** + * 系统-字典表 服务层。 + * + * @author DB + * @since 2023-12-01 + */ +public interface DictTypeService extends IService { + + /** + * 获取系统字典类型分页 + * @author DB + * @since 2023/12/01 + * @param dictName 字典名 + * @return R> + */ + Page getDictTypePage(String dictName); + + /** + * 查询系统类型是否存在 + * @author DB + * @since 2023/12/01 + * @param bo 请求参数 + * @return boolean + */ + Boolean checkDictTypeUnique(DictTypeBo bo); + + /** + * 根据主键删除字典类型 + * @author DB + * @since 2023/12/01 + * @param id 主键 + */ + void removeDataAndCache(String id); + + /** + * 重设字典 + * @author DB + * @since 2023/12/01 + */ + void resetDictCache(); + + /** + * 清除字典缓存 + * @author DB + * @since 2023/12/01 + */ + void clearDictCache(); + + /** + * 加载字典缓存 + * @author DB + * @since 2023/12/01 + */ + void loadingDictCache(); +} diff --git a/Cpop-System/src/main/java/com/cpop/system/business/service/impl/DictDataServiceImpl.java b/Cpop-System/src/main/java/com/cpop/system/business/service/impl/DictDataServiceImpl.java new file mode 100644 index 0000000..57516e9 --- /dev/null +++ b/Cpop-System/src/main/java/com/cpop/system/business/service/impl/DictDataServiceImpl.java @@ -0,0 +1,148 @@ +package com.cpop.system.business.service.impl; + +import com.cpop.common.utils.StringUtils; +import com.cpop.common.utils.bean.BeanUtils; +import com.cpop.core.base.entity.LoginUser; +import com.cpop.core.base.entity.PageDomain; +import com.cpop.core.utils.SecurityUtils; +import com.cpop.core.utils.SpringUtils; +import com.cpop.core.utils.sql.SqlUtils; +import com.cpop.system.business.bo.DictDataBo; +import com.cpop.system.business.bo.DictDataPageBo; +import com.cpop.system.business.vo.DictDataListVo; +import com.cpop.system.business.vo.DictDataPageVo; +import com.cpop.system.business.vo.DictDataVo; +import com.cpop.system.framework.utils.DictUtils; +import com.mybatisflex.core.paginate.Page; +import com.mybatisflex.core.query.QueryWrapper; +import com.mybatisflex.spring.service.impl.ServiceImpl; +import com.cpop.system.business.entity.DictData; +import com.cpop.system.business.mapper.DictDataMapper; +import com.cpop.system.business.service.DictDataService; +import org.springframework.stereotype.Service; + +import java.util.ArrayList; +import java.util.List; + +import static com.cpop.system.business.entity.table.DictDataTableDef.DICT_DATA; + +/** + * 系统-字典数据表 服务层实现。 + * + * @author DB + * @since 2023-12-01 + */ +@Service("dictDataService") +public class DictDataServiceImpl extends ServiceImpl implements DictDataService { + + /** + * 获取字典数据分页 + * + * @param bo 请求参数 + * @return Page + * @author DB + * @since 2023/12/01 + */ + @Override + public Page getDictDataPage(DictDataPageBo bo) { + LoginUser loginUser = SecurityUtils.getInstance().getLoginUser(); + PageDomain pageDomain = SqlUtils.getInstance().getPageDomain(); + return this.pageAs(Page.of(pageDomain.getPageNum(), pageDomain.getPageSize()), + QueryWrapper.create() + .select(DICT_DATA.ID, DICT_DATA.DICT_LABEL, DICT_DATA.DICT_VALUE, DICT_DATA.DICT_TYPE, DICT_DATA.UPDATE_TIME) + .where(DICT_DATA.USER_TYPE.eq(loginUser.getUserType().toString())) + .and(DICT_DATA.DICT_TYPE.eq(bo.getDictType())) + .and(DICT_DATA.DICT_LABEL.like(bo.getDictLabel())) + .orderBy(DICT_DATA.DICT_SORT.asc()), + DictDataPageVo.class); + } + + /** + * 根据主键获取字典数据详情 + * + * @param id 主键 + * @return DictDataVo + * @author DB + * @since 2023/12/01 + */ + @Override + public DictDataVo getDictDataInfo(String id) { + return BeanUtils.mapToClass(this.getById(id), DictDataVo.class); + } + + /** + * 根据字典类型获取字典数据 + * + * @param dictType 字典类型 + * @return List + * @author DB + * @since 2023/12/01 + */ + @Override + public List getDictDataByDictType(String dictType) { + List dictCache = DictUtils.getDictCache(dictType); + if (dictCache != null && !dictCache.isEmpty()) { + return dictCache; + } + //获取当前用户信息 + LoginUser loginUser = SecurityUtils.getInstance().getLoginUser(); + dictCache = this.list(QueryWrapper.create().select(DICT_DATA.ALL_COLUMNS) + .where(DICT_DATA.STATUS.eq(1)) + .and(DICT_DATA.DICT_TYPE.eq(dictType)) + .and(DICT_DATA.USER_TYPE.eq(loginUser.getUserType().toString())) + .orderBy(DICT_DATA.DICT_SORT.asc())); + if (StringUtils.isNotEmpty(dictCache)) { + DictUtils.setDictCache(dictType, dictCache); + return dictCache; + } + return new ArrayList<>(); + } + + /** + * 新增字典数据 + * @author DB + * @since 2023/12/01 + * @param bo 请求参数 + */ + @Override + public void insertDictData(DictDataBo bo) { + DictData dictData = BeanUtils.mapToClass(bo, DictData.class); + LoginUser loginUser = SecurityUtils.getInstance().getLoginUser(); + dictData.setUserType(loginUser.getUserType().toString()); + boolean save = this.save(dictData); + if (save) { + List dictDatas = getDictDataByDictType(dictData.getDictType()); + DictUtils.setDictCache(dictData.getDictType(), dictDatas); + } + } + + /** + * 修改字典数据 + * @author DB + * @since 2023/12/01 + * @param bo 请求 + */ + @Override + public void updateDictData(DictDataBo bo) { + DictData dictData = BeanUtils.mapToClass(bo, DictData.class); + boolean save = this.updateById(dictData); + if (save) { + List dictDatas = getDictDataByDictType(dictData.getDictType()); + DictUtils.setDictCache(dictData.getDictType(), dictDatas); + } + } + + /** + * 删除字典数据 + * @author DB + * @since 2023/12/01 + * @param id 主键 + */ + @Override + public void removeDictData(String id) { + DictDataVo data = getDictDataInfo(id); + this.removeById(id); + List dictDatas = getDictDataByDictType(data.getDictType()); + DictUtils.setDictCache(data.getDictType(), dictDatas); + } +} diff --git a/Cpop-System/src/main/java/com/cpop/system/business/service/impl/DictTypeServiceImpl.java b/Cpop-System/src/main/java/com/cpop/system/business/service/impl/DictTypeServiceImpl.java new file mode 100644 index 0000000..eff973e --- /dev/null +++ b/Cpop-System/src/main/java/com/cpop/system/business/service/impl/DictTypeServiceImpl.java @@ -0,0 +1,133 @@ +package com.cpop.system.business.service.impl; + +import com.cpop.common.utils.StringUtils; +import com.cpop.core.base.entity.LoginUser; +import com.cpop.core.base.entity.PageDomain; +import com.cpop.core.base.exception.ServiceException; +import com.cpop.core.utils.SecurityUtils; +import com.cpop.core.utils.SpringUtils; +import com.cpop.core.utils.sql.SqlUtils; +import com.cpop.system.business.bo.DictTypeBo; +import com.cpop.system.business.entity.DictData; +import com.cpop.system.business.service.DictDataService; +import com.cpop.system.business.vo.DictTypePageVo; +import com.cpop.system.framework.utils.DictUtils; +import com.mybatisflex.core.paginate.Page; +import com.mybatisflex.core.query.QueryWrapper; +import com.mybatisflex.spring.service.impl.ServiceImpl; +import com.cpop.system.business.entity.DictType; +import com.cpop.system.business.mapper.DictTypeMapper; +import com.cpop.system.business.service.DictTypeService; +import org.springframework.stereotype.Service; + +import java.util.Comparator; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +import static com.cpop.system.business.entity.table.DictDataTableDef.DICT_DATA; +import static com.cpop.system.business.entity.table.DictTypeTableDef.DICT_TYPE; + +/** + * 系统-字典表 服务层实现。 + * + * @author DB + * @since 2023-12-01 + */ +@Service("dictTypeService") +public class DictTypeServiceImpl extends ServiceImpl implements DictTypeService { + + /** + * 获取系统字典类型分页 + * + * @param dictName 字典名 + * @return R> + * @author DB + * @since 2023/12/01 + */ + @Override + public Page getDictTypePage(String dictName) { + //获取分页参数 + PageDomain pageDomain = SqlUtils.getInstance().getPageDomain(); + //获取当前登陆用户类型 + LoginUser loginUser = SecurityUtils.getInstance().getLoginUser(); + return this.pageAs(Page.of(pageDomain.getPageNum(), pageDomain.getPageSize()), + QueryWrapper.create().select(DICT_TYPE.ID, DICT_TYPE.DICT_NAME, DICT_TYPE.DICT_TYPE_, DICT_TYPE.UPDATE_TIME) + .where(DICT_TYPE.USER_TYPE.eq(loginUser.getUserType().toString())) + .and(DICT_TYPE.DICT_NAME.like(dictName)), + DictTypePageVo.class); + } + + /** + * 查询系统类型是否存在 + * + * @param bo 请求参数 + * @return boolean + * @author DB + * @since 2023/12/01 + */ + @Override + public Boolean checkDictTypeUnique(DictTypeBo bo) { + String dictId = StringUtils.isNotBlank(bo.getId()) ? bo.getId() : "-1"; + LoginUser loginUser = SecurityUtils.getInstance().getLoginUser(); + DictType dictType = this.getOne(QueryWrapper.create() + .where(DICT_TYPE.DICT_TYPE_.eq(bo.getDictType())) + .and(DICT_TYPE.USER_TYPE.eq(loginUser.getUserType().toString()))); + return dictType == null || StringUtils.equals(dictId, dictType.getId()); + } + + /** + * 根据主键删除字典类型 + * + * @param id 主键 + * @author DB + * @since 2023/12/01 + */ + @Override + public void removeDataAndCache(String id) { + //查询数据 + DictType dictType = this.getById(id); + //查询字典数据 + if (SpringUtils.getBean(DictDataService.class).count(QueryWrapper.create().where(DICT_DATA.DICT_TYPE.eq(dictType.getDictType()))) > 0) { + throw new ServiceException(String.format("%1$s已分配,不能删除", dictType.getDictName())); + } + this.removeById(id); + //删除缓存 + DictUtils.removeDictCache(dictType.getDictType()); + } + + /** + * 重置字典缓存数据 + */ + @Override + public void resetDictCache() { + clearDictCache(); + loadingDictCache(); + } + + /** + * 清空字典缓存数据 + */ + @Override + public void clearDictCache() { + DictUtils.clearDictCache(); + } + + /** + * 加载字典缓存 + * + * @author DB + * @since 2023/12/01 + */ + @Override + public void loadingDictCache() { + DictData dictData = new DictData(); + dictData.setStatus(false); + Map> dictDataMap = SpringUtils.getBean(DictDataService.class) + .list(QueryWrapper.create().orderBy(DICT_DATA.DICT_SORT.asc())) + .stream().collect(Collectors.groupingBy(DictData::getDictType)); + for (Map.Entry> entry : dictDataMap.entrySet()) { + DictUtils.setDictCache(entry.getKey(), entry.getValue().stream().sorted(Comparator.comparing(DictData::getDictSort)).collect(Collectors.toList())); + } + } +} diff --git a/Cpop-System/src/main/java/com/cpop/system/business/vo/DictDataListVo.java b/Cpop-System/src/main/java/com/cpop/system/business/vo/DictDataListVo.java new file mode 100644 index 0000000..941d68f --- /dev/null +++ b/Cpop-System/src/main/java/com/cpop/system/business/vo/DictDataListVo.java @@ -0,0 +1,66 @@ +package com.cpop.system.business.vo; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.experimental.Accessors; + +/** + * @author DB + * @version 1.0.0 + * @since 2023-12-01 16:58 + */ +@Data +@Accessors(chain = true) +@ApiModel(value = "字典数据返回对象") +public class DictDataListVo { + + /** + * id + */ + @ApiModelProperty(value = "id") + private String id; + + /** + * 字典标签 + */ + @ApiModelProperty(value = "字典标签") + private String dictLabel; + + /** + * 字典值 + */ + @ApiModelProperty(value = "字典值") + private String dictValue; + + /** + * 字典类型 + */ + @ApiModelProperty(value = "字典类型") + private String dictType; + + /** + * 排序 + */ + @ApiModelProperty(value = "排序") + private String dictSort; + + /** + * 样式属性(其他样式扩展) + */ + @ApiModelProperty(value = "样式属性(其他样式扩展)") + private String cssClass; + + /** + * 表格回显样式 + */ + @ApiModelProperty(value = "表格回显样式") + private String listClass; + + /** + * 是否默认(1是 0否) + */ + @ApiModelProperty(value = "是否默认(1是 0否)") + private Boolean isDefault; + +} diff --git a/Cpop-System/src/main/java/com/cpop/system/business/vo/DictDataPageVo.java b/Cpop-System/src/main/java/com/cpop/system/business/vo/DictDataPageVo.java new file mode 100644 index 0000000..775aa19 --- /dev/null +++ b/Cpop-System/src/main/java/com/cpop/system/business/vo/DictDataPageVo.java @@ -0,0 +1,52 @@ +package com.cpop.system.business.vo; + +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.experimental.Accessors; + +import java.time.LocalDateTime; + +/** + * 字典数据分页 + * @author DB + * @version 1.0.0 + * @since 2023-12-01 16:30 + */ +@Data +@Accessors(chain = true) +@ApiModel(value = "字典数据分页") +public class DictDataPageVo { + + /** + * id + */ + @ApiModelProperty(value = "id") + private String id; + + /** + * 字典标签 + */ + @ApiModelProperty(value = "字典标签") + private String dictLabel; + + /** + * 字典值 + */ + @ApiModelProperty(value = "字典值") + private String dictValue; + + /** + * 字典类型 + */ + @ApiModelProperty(value = "字典类型") + private String dictType; + + /** + * 更新时间 + */ + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss" , timezone = "GMT+8") + @ApiModelProperty(value = "更新时间") + private LocalDateTime updateTime; +} diff --git a/Cpop-System/src/main/java/com/cpop/system/business/vo/DictDataVo.java b/Cpop-System/src/main/java/com/cpop/system/business/vo/DictDataVo.java new file mode 100644 index 0000000..84d2159 --- /dev/null +++ b/Cpop-System/src/main/java/com/cpop/system/business/vo/DictDataVo.java @@ -0,0 +1,77 @@ +package com.cpop.system.business.vo; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.experimental.Accessors; + +/** + * @author DB + * @version 1.0.0 + * @since 2023-12-01 16:42 + */ +@Data +@Accessors(chain = true) +@ApiModel(value = "品牌分页返回参数") +public class DictDataVo { + + /** + * id + */ + @ApiModelProperty(value = "id") + private String id; + + /** + * 字典标签 + */ + @ApiModelProperty(value = "字典标签") + private String dictLabel; + + /** + * 字典值 + */ + @ApiModelProperty(value = "字典值") + private String dictValue; + + /** + * 字典类型 + */ + @ApiModelProperty(value = "字典类型") + private String dictType; + + /** + * 排序 + */ + @ApiModelProperty(value = "排序") + private String dictSort; + + /** + * 样式属性(其他样式扩展) + */ + @ApiModelProperty(value = "样式属性(其他样式扩展)") + private String cssClass; + + /** + * 表格回显样式 + */ + @ApiModelProperty(value = "表格回显样式") + private String listClass; + + /** + * 是否默认(1是 0否) + */ + @ApiModelProperty(value = "是否默认(1是 0否)") + private Boolean isDefault; + + /** + * 状态(1正常 0停用) + */ + @ApiModelProperty(value = "状态(1正常 0停用)") + private Boolean status; + + /** + * 备注 + */ + @ApiModelProperty(value = "备注") + private String remark; +} diff --git a/Cpop-System/src/main/java/com/cpop/system/business/vo/DictTypePageVo.java b/Cpop-System/src/main/java/com/cpop/system/business/vo/DictTypePageVo.java new file mode 100644 index 0000000..52daf0e --- /dev/null +++ b/Cpop-System/src/main/java/com/cpop/system/business/vo/DictTypePageVo.java @@ -0,0 +1,43 @@ +package com.cpop.system.business.vo; + +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import org.joda.time.LocalDateTime; + +/** + * 字典类型分页 + * @version 1.0.0 + * @author DB + * @since 2023-12-01 15:15 + */ +@Data +@ApiModel(value = "品牌参数") +public class DictTypePageVo { + + /** + * 主键 + */ + @ApiModelProperty(value = "主键") + private String id; + + /** + * 字典名 + */ + @ApiModelProperty(value = "字典名") + private String dictName; + + /** + * 字典类型 + */ + @ApiModelProperty(value = "字典类型") + private String dictType; + + /** + * 更新时间 + */ + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss" , timezone = "GMT+8") + @ApiModelProperty(value = "更新时间") + private LocalDateTime updateTime; +} diff --git a/Cpop-System/src/main/java/com/cpop/system/business/vo/DictTypeVo.java b/Cpop-System/src/main/java/com/cpop/system/business/vo/DictTypeVo.java new file mode 100644 index 0000000..ed90f2a --- /dev/null +++ b/Cpop-System/src/main/java/com/cpop/system/business/vo/DictTypeVo.java @@ -0,0 +1,50 @@ +package com.cpop.system.business.vo; + +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.experimental.Accessors; +import org.joda.time.LocalDateTime; + +/** + * 字典类型参数 + * @version 1.0.0 + * @author DB + * @since 2023-12-01 15:15 + */ +@Data +@Accessors(chain = true) +@ApiModel(value = "字典类型参数") +public class DictTypeVo { + + /** + * 主键 + */ + @ApiModelProperty(value = "主键") + private String id; + + /** + * 字典名 + */ + @ApiModelProperty(value = "字典名") + private String dickName; + + /** + * 字典类型 + */ + @ApiModelProperty(value = "字典类型") + private String dickType; + + /** + * 状态(0正常 1停用) + */ + @ApiModelProperty(value = "状态(0正常 1停用)") + private Boolean status; + + /** + * 备注 + */ + @ApiModelProperty(value = "备注") + private String remark; +} diff --git a/Cpop-System/src/main/java/com/cpop/system/framework/utils/DictUtils.java b/Cpop-System/src/main/java/com/cpop/system/framework/utils/DictUtils.java new file mode 100644 index 0000000..f79ca90 --- /dev/null +++ b/Cpop-System/src/main/java/com/cpop/system/framework/utils/DictUtils.java @@ -0,0 +1,159 @@ +package com.cpop.system.framework.utils; + +import com.alibaba.fastjson2.JSONArray; +import com.cpop.common.constant.Constants; +import com.cpop.common.utils.StringUtils; +import com.cpop.core.service.RedisService; +import com.cpop.core.utils.SpringUtils; +import com.cpop.system.business.entity.DictData; +import org.springframework.data.redis.cache.RedisCache; + +import java.util.Collection; +import java.util.List; + +/** + * 字典工具类 + */ +public class DictUtils { + /** + * 分隔符 + */ + public static final String SEPARATOR = ","; + + /** + * 设置字典缓存 + * + * @param key 参数键 + * @param dictDatas 字典数据列表 + */ + public static void setDictCache(String key, List dictDatas) { + SpringUtils.getBean(RedisService.class).setCacheObject(getCacheKey(key), dictDatas); + } + + /** + * 获取字典缓存 + * + * @param key 参数键 + * @return dictDatas 字典数据列表 + */ + public static List getDictCache(String key) { + JSONArray arrayCache = SpringUtils.getBean(RedisService.class).getCacheObject(getCacheKey(key)); + if (StringUtils.isNotNull(arrayCache)) { + return arrayCache.toList(DictData.class); + } + return null; + } + + /** + * 根据字典类型和字典值获取字典标签 + * + * @param dictType 字典类型 + * @param dictValue 字典值 + * @return 字典标签 + */ + public static String getDictLabel(String dictType, String dictValue) { + return getDictLabel(dictType, dictValue, SEPARATOR); + } + + /** + * 根据字典类型和字典标签获取字典值 + * + * @param dictType 字典类型 + * @param dictLabel 字典标签 + * @return 字典值 + */ + public static String getDictValue(String dictType, String dictLabel) { + return getDictValue(dictType, dictLabel, SEPARATOR); + } + + /** + * 根据字典类型和字典值获取字典标签 + * + * @param dictType 字典类型 + * @param dictValue 字典值 + * @param separator 分隔符 + * @return 字典标签 + */ + public static String getDictLabel(String dictType, String dictValue, String separator) { + StringBuilder propertyString = new StringBuilder(); + List datas = getDictCache(dictType); + + if (StringUtils.isNotNull(datas)) { + if (StringUtils.containsAny(separator, dictValue)) { + for (DictData dict : datas) { + for (String value : dictValue.split(separator)) { + if (value.equals(dict.getDictValue())) { + propertyString.append(dict.getDictLabel()).append(separator); + break; + } + } + } + } else { + for (DictData dict : datas) { + if (dictValue.equals(dict.getDictValue())) { + return dict.getDictLabel(); + } + } + } + } + return StringUtils.stripEnd(propertyString.toString(), separator); + } + + /** + * 根据字典类型和字典标签获取字典值 + * + * @param dictType 字典类型 + * @param dictLabel 字典标签 + * @param separator 分隔符 + * @return 字典值 + */ + public static String getDictValue(String dictType, String dictLabel, String separator) { + StringBuilder propertyString = new StringBuilder(); + List datas = getDictCache(dictType); + + if (StringUtils.containsAny(separator, dictLabel) && StringUtils.isNotEmpty(datas)) { + for (DictData dict : datas) { + for (String label : dictLabel.split(separator)) { + if (label.equals(dict.getDictLabel())) { + propertyString.append(dict.getDictValue()).append(separator); + break; + } + } + } + } else { + for (DictData dict : datas) { + if (dictLabel.equals(dict.getDictLabel())) { + return dict.getDictValue(); + } + } + } + return StringUtils.stripEnd(propertyString.toString(), separator); + } + + /** + * 删除指定字典缓存 + * + * @param key 字典键 + */ + public static void removeDictCache(String key) { + SpringUtils.getBean(RedisService.class).deleteObject(getCacheKey(key)); + } + + /** + * 清空字典缓存 + */ + public static void clearDictCache() { + Collection keys = SpringUtils.getBean(RedisService.class).keys(Constants.SYS_DICT_KEY + "*"); + SpringUtils.getBean(RedisService.class).deleteObject(keys); + } + + /** + * 设置cache key + * + * @param configKey 参数键 + * @return 缓存键key + */ + public static String getCacheKey(String configKey) { + return Constants.SYS_DICT_KEY + configKey; + } +} diff --git a/Cpop-System/src/main/resources/mapper/DictDataMapper.xml b/Cpop-System/src/main/resources/mapper/DictDataMapper.xml new file mode 100644 index 0000000..0eb0e35 --- /dev/null +++ b/Cpop-System/src/main/resources/mapper/DictDataMapper.xml @@ -0,0 +1,7 @@ + + + + + diff --git a/Cpop-System/src/main/resources/mapper/DictTypeMapper.xml b/Cpop-System/src/main/resources/mapper/DictTypeMapper.xml new file mode 100644 index 0000000..36be093 --- /dev/null +++ b/Cpop-System/src/main/resources/mapper/DictTypeMapper.xml @@ -0,0 +1,7 @@ + + + + +