diff --git a/adc-da-report/src/main/java/com/adc/da/report/controller/ReportManageConroller.java b/adc-da-report/src/main/java/com/adc/da/report/controller/ReportManageConroller.java index bc4127c..0e8526f 100644 --- a/adc-da-report/src/main/java/com/adc/da/report/controller/ReportManageConroller.java +++ b/adc-da-report/src/main/java/com/adc/da/report/controller/ReportManageConroller.java @@ -1,12 +1,9 @@ package com.adc.da.report.controller; -import com.adc.da.login.util.UserUtils; import com.adc.da.report.annotation.ReportLog; import com.adc.da.report.dao.mysql.ReportDao; -import com.adc.da.report.dao.mysql.ReportLogBookDao; import com.adc.da.report.eo.FileEntity; import com.adc.da.report.eo.ReportEntity; -import com.adc.da.report.eo.ReportLogBook; import com.adc.da.report.service.IFileService; import com.adc.da.report.service.IReportService; import com.adc.da.report.util.LocalFileUtil; @@ -16,7 +13,6 @@ import com.adc.da.report.vo.ReportQueryVo; import com.adc.da.report.vo.ReportVo; import com.adc.da.util.http.ResponseMessage; import com.adc.da.util.http.Result; -import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; @@ -80,6 +76,9 @@ public class ReportManageConroller { @Autowired private ReportLogBookDao reportLogBookDao; + @Resource + private WaterMarkUtil waterMarkUtil; + /** * 新增或编辑报告 * @param vo @@ -99,7 +98,9 @@ public class ReportManageConroller { if (count>0){ return Result.error("报告名称已存在"); } - String name = reportService.insert(entity, vo.getLabelList()); + String name = reportService.insert(entity, vo.getLabelList(), + vo.getReportPreviewUserIdList(), + vo.getReportPreviewAndDownloadUserIdList()); map.put("reportName", name); return Result.success(map); } @@ -367,6 +368,40 @@ public class ReportManageConroller { } +// /** +// * 下载文件 +// * @param response +// * @param fileId +// * @throws IOException +// */ +// @ApiOperation(value = "|下载文件") +// @GetMapping("/download") +// public void downloadPic(HttpServletResponse response, String fileId) throws IOException { +// +// try { +// FileEntity entity = fileService.getFile(fileId); +// String fileName = entity.getFileName(); +// String filename = URLEncoder.encode(fileName, "UTF-8"); +// response.setHeader("Content-Disposition", "attachment;filename=" + filename); +// response.setContentType("application/x-download"); +//// File file = new File(uploadFile, entity.getSavePath()); +// // 上传方式:阿里云:alioss 华为云:hwobs +// if ("hwobs".equals(uploadType)){ +// obsBootUtil.downFile(entity.getSavePath(), response); +// }else if ("alioss".equals(uploadType)){ +// ossClientUtil.downloadFileFromOSS(entity.getSavePath(),response); +// }else if ("local".equals(uploadType)){ +// localFileUtil.downFile(entity.getSavePath(), response); +// } +// if (FILE_EXTENSIONS_PDF.equalsIgnoreCase(FileUtil.getFileExtension(fileName))) { +// String text = "text"; +// PdfUtil.addWatermarkToPdf(response, text); +// } +// } catch (Exception ex) { +// log.info(ex.getMessage(),ex); +// } +// } + /** * 下载文件 * @param response @@ -383,14 +418,31 @@ public class ReportManageConroller { String filename = URLEncoder.encode(fileName, "UTF-8"); response.setHeader("Content-Disposition", "attachment;filename=" + filename); response.setContentType("application/x-download"); -// File file = new File(uploadFile, entity.getSavePath()); - // 上传方式:阿里云:alioss 华为云:hwobs - if ("hwobs".equals(uploadType)){ - obsBootUtil.downFile(entity.getSavePath(), response); - }else if ("alioss".equals(uploadType)){ - ossClientUtil.downloadFileFromOSS(entity.getSavePath(),response); - }else if ("local".equals(uploadType)){ - localFileUtil.downFile(entity.getSavePath(), response); + + //PDF文件需要加水印 + if (FILE_EXTENSIONS_PDF.equalsIgnoreCase(FileUtil.getFileExtension(fileName))) { + String path = uploadFile + entity.getSavePath(); + FileOutputStream outputStream = new FileOutputStream(path); + // 上传方式:阿里云:alioss 华为云:hwobs + if ("hwobs".equals(uploadType)) { + obsBootUtil.getFileFromOBS(entity.getSavePath(), outputStream); + } else if ("alioss".equals(uploadType)) { + ossClientUtil.getFileFromOSS(entity.getSavePath(), outputStream); + } else if ("local".equals(uploadType)) { + localFileUtil.getFileFromLocal(entity.getSavePath(), outputStream); + } + //给文件添加水印 + waterMarkUtil.addWatermarkToPdf(new FileInputStream(path), response); + + } else { + // 上传方式:阿里云:alioss 华为云:hwobs 本地:local + if ("hwobs".equals(uploadType)){ + obsBootUtil.downFile(entity.getSavePath(), response); + }else if ("alioss".equals(uploadType)){ + ossClientUtil.downloadFileFromOSS(entity.getSavePath(),response); + }else if ("local".equals(uploadType)){ + localFileUtil.downFile(entity.getSavePath(), response); + } } } catch (Exception ex) { @@ -405,8 +457,6 @@ public class ReportManageConroller { } - - /** * 权限审批流程 添加报告按钮 可添加的报告 * @return diff --git a/adc-da-report/src/main/java/com/adc/da/report/eo/PowerApply.java b/adc-da-report/src/main/java/com/adc/da/report/eo/PowerApply.java index 2784e97..9ef92b0 100644 --- a/adc-da-report/src/main/java/com/adc/da/report/eo/PowerApply.java +++ b/adc-da-report/src/main/java/com/adc/da/report/eo/PowerApply.java @@ -5,6 +5,7 @@ import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import lombok.Data; +import lombok.experimental.Accessors; import java.util.Date; @@ -16,6 +17,7 @@ import java.util.Date; */ @Data @TableName("power_apply") +@Accessors(chain = true) public class PowerApply { /** @@ -85,4 +87,11 @@ public class PowerApply { */ @TableField("del_flag") private Integer delFlag; + + /** + * 权限来源 1 上传报告时添加的 + * 2 单独申请的权限 + */ + @TableField("power_source") + private Integer powerSource; } diff --git a/adc-da-report/src/main/java/com/adc/da/report/eo/ReportContentEntity.java b/adc-da-report/src/main/java/com/adc/da/report/eo/ReportContentEntity.java index 86feeb8..0fedacb 100644 --- a/adc-da-report/src/main/java/com/adc/da/report/eo/ReportContentEntity.java +++ b/adc-da-report/src/main/java/com/adc/da/report/eo/ReportContentEntity.java @@ -42,5 +42,5 @@ public class ReportContentEntity implements Serializable { private String reportContent; @TableField(exist = false) - private static final long serialVersionUID = 1L; + private static final long serialVersionUID = 1213467213486L; } \ No newline at end of file diff --git a/adc-da-report/src/main/java/com/adc/da/report/eo/ReportLabelEntity.java b/adc-da-report/src/main/java/com/adc/da/report/eo/ReportLabelEntity.java index 30ebb29..5cf91d5 100644 --- a/adc-da-report/src/main/java/com/adc/da/report/eo/ReportLabelEntity.java +++ b/adc-da-report/src/main/java/com/adc/da/report/eo/ReportLabelEntity.java @@ -41,6 +41,6 @@ public class ReportLabelEntity implements Serializable { private String labelId; @TableField(exist = false) - private static final long serialVersionUID = 1L; + private static final long serialVersionUID = 121348721347890417L; } \ No newline at end of file diff --git a/adc-da-report/src/main/java/com/adc/da/report/eo/TreeLabelEntity.java b/adc-da-report/src/main/java/com/adc/da/report/eo/TreeLabelEntity.java index 3c96c87..ec036f2 100644 --- a/adc-da-report/src/main/java/com/adc/da/report/eo/TreeLabelEntity.java +++ b/adc-da-report/src/main/java/com/adc/da/report/eo/TreeLabelEntity.java @@ -59,6 +59,6 @@ public class TreeLabelEntity implements Serializable { private Double orderNum; @TableField(exist = false) - private static final long serialVersionUID = 1L; + private static final long serialVersionUID = 11283747892134701L; } \ No newline at end of file diff --git a/adc-da-report/src/main/java/com/adc/da/report/service/IPowerApplyService.java b/adc-da-report/src/main/java/com/adc/da/report/service/IPowerApplyService.java index 0e273a0..408d774 100644 --- a/adc-da-report/src/main/java/com/adc/da/report/service/IPowerApplyService.java +++ b/adc-da-report/src/main/java/com/adc/da/report/service/IPowerApplyService.java @@ -5,10 +5,11 @@ import com.adc.da.report.eo.PowerApplyAct; import com.adc.da.report.vo.DeleteParamRequestVO; import com.adc.da.report.vo.PowerApplyPageVO; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.IService; import java.util.List; -public interface IPowerApplyService { +public interface IPowerApplyService extends IService { /** * @param powerApplyPageVO @@ -58,4 +59,11 @@ public interface IPowerApplyService { public void deleteById(DeleteParamRequestVO deleteParamVO); void saveBatch(List powerApplyActs); + + /** + * 根据报告id删除权限 + * + * @param reportId 报表id + */ + void deleteByReportId(String reportId); } diff --git a/adc-da-report/src/main/java/com/adc/da/report/service/IReportService.java b/adc-da-report/src/main/java/com/adc/da/report/service/IReportService.java index b253118..3680738 100644 --- a/adc-da-report/src/main/java/com/adc/da/report/service/IReportService.java +++ b/adc-da-report/src/main/java/com/adc/da/report/service/IReportService.java @@ -21,7 +21,9 @@ public interface IReportService { * @param labelList * @return 报告名称 */ - String insert(ReportEntity entity, List labelList) throws IOException; + String insert(ReportEntity entity, List labelList, + List reportPreviewUserIdList, + List reportPreviewAndDownloadUserIdList) throws IOException; /** * 删除报告 diff --git a/adc-da-report/src/main/java/com/adc/da/report/service/impl/IReportServiceImpl.java b/adc-da-report/src/main/java/com/adc/da/report/service/impl/IReportServiceImpl.java index 1270449..b9c9c6d 100644 --- a/adc-da-report/src/main/java/com/adc/da/report/service/impl/IReportServiceImpl.java +++ b/adc-da-report/src/main/java/com/adc/da/report/service/impl/IReportServiceImpl.java @@ -7,24 +7,20 @@ import com.adc.da.report.dao.mysql.FileDao; import com.adc.da.report.dao.mysql.ReportDao; import com.adc.da.report.dao.mysql.ReportLabelDao; import com.adc.da.report.dao.mysql.ReportUserDao; -import com.adc.da.report.eo.FileEntity; -import com.adc.da.report.eo.ReportEntity; -import com.adc.da.report.eo.ReportLabelEntity; -import com.adc.da.report.eo.ReportUserEntity; -import com.adc.da.report.service.IReportContentService; -import com.adc.da.report.service.IReportLabelService; -import com.adc.da.report.service.IReportService; -import com.adc.da.report.service.ITreeLabelService; +import com.adc.da.report.eo.*; +import com.adc.da.report.service.*; import com.adc.da.report.util.*; import com.adc.da.report.vo.ReportQueryVo; import com.adc.da.report.vo.ReportVo; import com.adc.da.sys.dao.mysql.RoleEODao; import com.adc.da.sys.entity.RoleEO; +import com.adc.da.util.utils.CollectionUtils; import com.adc.da.util.utils.FileUtil; import com.adc.da.util.utils.StringUtils; import com.adc.da.util.utils.UUID; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; @@ -98,6 +94,10 @@ public class IReportServiceImpl extends ServiceImpl @Autowired private LocalFileUtil localFileUtil; + @Resource + private IPowerApplyService iPowerApplyService; + + /** * 新增或编辑报告 * @@ -107,9 +107,12 @@ public class IReportServiceImpl extends ServiceImpl */ @Override @Transactional(rollbackFor = Exception.class) - public String insert(ReportEntity entity, List labelList) throws IOException { + public String insert(ReportEntity entity, List labelList, + List reportPreviewUserIdList, + List reportPreviewAndDownloadUserIdList) throws IOException { SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + if (StringUtils.isEmpty(entity.getId())) { entity.setId(UUID.randomUUID10()); entity.setCreateDate(format.format(new Date())); @@ -118,13 +121,36 @@ public class IReportServiceImpl extends ServiceImpl entity.setUpdateDate(format.format(new Date())); reportDao.insert(entity); - //插入用户关系表 - entity.getReportUserIdList().forEach(c -> { - ReportUserEntity reportUserEntity = new ReportUserEntity(); - reportUserEntity.setReportId(entity.getId()); - reportUserEntity.setUserId(c); - reportUserDao.insert(reportUserEntity); - }); + //插入power_apply权限表 + if (CollectionUtils.isNotEmpty(reportPreviewUserIdList)) { + reportPreviewUserIdList.forEach(userId -> { + PowerApply powerApply = new PowerApply(); + powerApply.setId(UUID.randomUUID10()) + .setPower(1) + .setReportId(entity.getId()) + .setUserId(userId) + .setCreateDate(new Date()) + .setCreateUserId(UserUtils.getUserId()) + .setDelFlag(0) + .setPowerSource(1); + iPowerApplyService.save(powerApply); + }); + } + + if (CollectionUtils.isNotEmpty(reportPreviewAndDownloadUserIdList)) { + reportPreviewAndDownloadUserIdList.forEach(userId -> { + PowerApply powerApply = new PowerApply(); + powerApply.setId(UUID.randomUUID10()) + .setPower(2) + .setReportId(entity.getId()) + .setUserId(userId) + .setCreateDate(new Date()) + .setCreateUserId(UserUtils.getUserId()) + .setDelFlag(0) + .setPowerSource(1); + iPowerApplyService.save(powerApply); + }); + } //插入报表标签关系表 labelList.forEach((label) -> { @@ -133,7 +159,7 @@ public class IReportServiceImpl extends ServiceImpl }); //插入报表内容表 - iReportContentService.insertReportContent(entity.getId() ,entity.getFileId()); + iReportContentService.insertReportContent(entity.getId(), entity.getFileId()); CommonUtils.threadPoolExecutor().execute(() -> { //生成html @@ -157,14 +183,6 @@ public class IReportServiceImpl extends ServiceImpl reportUserDao.delete(new QueryWrapper() .eq("reportId", entity.getId())); - //插入用户关系表 - entity.getReportUserIdList().forEach(c -> { - ReportUserEntity reportUserEntity = new ReportUserEntity(); - reportUserEntity.setReportId(entity.getId()); - reportUserEntity.setUserId(c); - reportUserDao.insert(reportUserEntity); - }); - //修改报表标签关系表(先删后增) iReportLabelService.deleteReportLabelByReportId(new String[]{entity.getId()}); @@ -174,6 +192,42 @@ public class IReportServiceImpl extends ServiceImpl reportLabelDao.insert(reportLabelEntity); }); + //TODO 插入报表内容表(先删后增) + + //删除power_apply表中的对应权限 + iPowerApplyService.deleteByReportId(entity.getId()); + + //插入power_apply权限表 + if (CollectionUtils.isNotEmpty(reportPreviewUserIdList)) { + reportPreviewUserIdList.forEach(userId -> { + PowerApply powerApply = new PowerApply(); + powerApply.setId(UUID.randomUUID10()) + .setPower(1) + .setReportId(entity.getId()) + .setUserId(userId) + .setUpdateDate(new Date()) + .setUpdateUserId(UserUtils.getUserId()) + .setDelFlag(0) + .setPowerSource(1); + iPowerApplyService.save(powerApply); + }); + } + + if (CollectionUtils.isNotEmpty(reportPreviewAndDownloadUserIdList)) { + reportPreviewAndDownloadUserIdList.forEach(userId -> { + PowerApply powerApply = new PowerApply(); + powerApply.setId(UUID.randomUUID10()) + .setPower(2) + .setReportId(entity.getId()) + .setUserId(userId) + .setUpdateDate(new Date()) + .setUpdateUserId(UserUtils.getUserId()) + .setDelFlag(0) + .setPowerSource(1); + iPowerApplyService.save(powerApply); + }); + } + CommonUtils.threadPoolExecutor().execute(() -> { String key = entity.getId() + "-" + entity.getFileId(); Boolean hasKey = stringRedisTemplate.hasKey(key); @@ -375,7 +429,6 @@ public class IReportServiceImpl extends ServiceImpl List userIdList = reportUserDao.selectList( new QueryWrapper().eq("reportId", c.getId())) .stream().map(ReportUserEntity::getUserId).collect(Collectors.toList()); - c.setReportUserIdList(userIdList); }); return list; } @@ -448,7 +501,6 @@ public class IReportServiceImpl extends ServiceImpl List userIdList = reportUserDao.selectList( new QueryWrapper().eq("reportId", c.getId())) .stream().map(ReportUserEntity::getUserId).collect(Collectors.toList()); - c.setReportUserIdList(userIdList); }); return list; } diff --git a/adc-da-report/src/main/java/com/adc/da/report/service/impl/IpowerApplyServiceImpl.java b/adc-da-report/src/main/java/com/adc/da/report/service/impl/IpowerApplyServiceImpl.java index 9f038eb..986c8d1 100644 --- a/adc-da-report/src/main/java/com/adc/da/report/service/impl/IpowerApplyServiceImpl.java +++ b/adc-da-report/src/main/java/com/adc/da/report/service/impl/IpowerApplyServiceImpl.java @@ -10,6 +10,7 @@ import com.adc.da.report.vo.DeleteParamRequestVO; import com.adc.da.report.vo.PowerApplyPageVO; import com.adc.da.util.utils.StringUtils; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import lombok.extern.slf4j.Slf4j; @@ -124,5 +125,12 @@ public class IpowerApplyServiceImpl extends ServiceImpl updateWrapper = new UpdateWrapper<>(); + updateWrapper.eq("report_id", reportId); + PowerApply updatePowerApply = new PowerApply(); + updatePowerApply.setDelFlag(1); + getBaseMapper().update(updatePowerApply, updateWrapper); + } } diff --git a/adc-da-report/src/main/java/com/adc/da/report/util/WaterMarkUtil.java b/adc-da-report/src/main/java/com/adc/da/report/util/WaterMarkUtil.java new file mode 100644 index 0000000..48350ae --- /dev/null +++ b/adc-da-report/src/main/java/com/adc/da/report/util/WaterMarkUtil.java @@ -0,0 +1,100 @@ +package com.adc.da.report.util; + + +import com.adc.da.login.util.UserUtils; +import com.adc.da.sys.constant.TsConfigKeyEnum; +import com.adc.da.sys.entity.UserEO; +import com.adc.da.sys.service.iservice.IConfigService; +import com.adc.da.sys.service.iservice.IUserEoService; +import org.apache.pdfbox.pdmodel.PDDocument; +import org.apache.pdfbox.pdmodel.PDPage; +import org.apache.pdfbox.pdmodel.PDPageContentStream; +import org.apache.pdfbox.pdmodel.common.PDRectangle; +import org.apache.pdfbox.pdmodel.font.PDType0Font; +import org.apache.pdfbox.pdmodel.graphics.state.PDExtendedGraphicsState; +import org.apache.pdfbox.pdmodel.graphics.state.RenderingMode; +import org.apache.pdfbox.util.Matrix; +import org.springframework.core.io.ClassPathResource; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletResponse; +import java.awt.*; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.OutputStream; +import java.time.LocalDate; +import java.time.format.DateTimeFormatter; + +/** + * 水印工具类 + * @author CaiHaohan + */ +@Component +public class WaterMarkUtil { + + @Resource + private IUserEoService userEoService; + + @Resource + private IConfigService configService; + + public String getWaterMarkConfig() { + LocalDate currentDate = LocalDate.now(); + DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy/MM/dd"); + String formattedDate = currentDate.format(formatter); + + UserEO user = userEoService.getUserById(UserUtils.getUserId()); + String userName = user.getUsname(); + + String configValue = configService.findConfigValueByKey(TsConfigKeyEnum.WATERMARK_PREFIX.getValue()); + + return configValue + " " + userName + " " + formattedDate; + } + + public void addWatermarkToPdf(FileInputStream inputStream, HttpServletResponse response) throws IOException { + String watermarkText = getWaterMarkConfig(); + // 加载PDF文档 + try (PDDocument document = PDDocument.load(inputStream)) { + // 设置水印字体、字体大小、颜色和透明度 + ClassPathResource fontResource = new ClassPathResource("fonts/SourceHanSerif-VF.ttf"); + PDType0Font font = PDType0Font.load(document, fontResource.getInputStream()); + float fontSize = 13.0f; + Color color = new Color(100, 100, 100, 0); + PDExtendedGraphicsState graphicsState = new PDExtendedGraphicsState(); + graphicsState.setNonStrokingAlphaConstant(0.4f); + graphicsState.setStrokingAlphaConstant(0.4f); + + // 遍历每一页并添加水印 + for (PDPage page : document.getPages()) { + // 获取页面尺寸以计算水印位置 + PDRectangle pageSize = page.getMediaBox(); + float xStep = pageSize.getWidth() / 4; + float yStep = pageSize.getHeight() / 4; + float rotationInRadians = (float) Math.toRadians(20); + + for (float xPosition = pageSize.getLowerLeftX(); xPosition <= pageSize.getWidth(); xPosition += xStep) { + for (float yPosition = pageSize.getLowerLeftY(); yPosition <= pageSize.getHeight(); yPosition += yStep) { + // 创建内容流并设置图形状态参数 + try (PDPageContentStream contentStream = new PDPageContentStream(document, page, PDPageContentStream.AppendMode.APPEND, true, true)) { + contentStream.setGraphicsStateParameters(graphicsState); + contentStream.setFont(font, fontSize); + contentStream.setNonStrokingColor(color); + contentStream.beginText(); + contentStream.setRenderingMode(RenderingMode.FILL); + // 设置水印文本的旋转和位置 + contentStream.setTextMatrix(Matrix.getRotateInstance(rotationInRadians, xPosition, yPosition)); + contentStream.showText(watermarkText); + contentStream.endText(); + } + } + } + } + + // 将处理后的PDF写入HTTP响应 + try (OutputStream outputStream = response.getOutputStream()) { + document.save(outputStream); + } + } + } +} diff --git a/adc-da-report/src/main/java/com/adc/da/report/vo/ReportVo.java b/adc-da-report/src/main/java/com/adc/da/report/vo/ReportVo.java index e108dc8..e7cd7aa 100644 --- a/adc-da-report/src/main/java/com/adc/da/report/vo/ReportVo.java +++ b/adc-da-report/src/main/java/com/adc/da/report/vo/ReportVo.java @@ -68,7 +68,12 @@ public class ReportVo { /** * 报告用户id */ - private List reportUserIdList; + private List reportPreviewUserIdList; + + /** + * 报告用户id + */ + private List reportPreviewAndDownloadUserIdList; /** * 报告涉密等级 diff --git a/adc-da-report/src/main/resources/fonts/SourceHanSerif-VF.ttf b/adc-da-report/src/main/resources/fonts/SourceHanSerif-VF.ttf new file mode 100644 index 0000000..021fc0d Binary files /dev/null and b/adc-da-report/src/main/resources/fonts/SourceHanSerif-VF.ttf differ diff --git a/adc-da-sys/src/main/java/com/adc/da/eo/ConfigEntity.java b/adc-da-sys/src/main/java/com/adc/da/eo/ConfigEntity.java new file mode 100644 index 0000000..c99b422 --- /dev/null +++ b/adc-da-sys/src/main/java/com/adc/da/eo/ConfigEntity.java @@ -0,0 +1,44 @@ +package com.adc.da.eo; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import java.io.Serializable; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * + * @author ThinkBook + * @TableName ts_config + */ +@TableName(value ="ts_config") +@Data +@NoArgsConstructor +@AllArgsConstructor +public class ConfigEntity implements Serializable { + + private static final long serialVersionUID = 23487320957329L; + + /** + * 主键id + */ + @TableId(value = "id", type = IdType.INPUT) + private String id; + + /** + * 配置名 + */ + @TableField(value = "config_key") + private String configKey; + + /** + * 配置信息 + */ + @TableField(value = "config_value") + private String configValue; + +} \ No newline at end of file diff --git a/adc-da-sys/src/main/java/com/adc/da/eo/DictEntity.java b/adc-da-sys/src/main/java/com/adc/da/eo/DictEntity.java new file mode 100644 index 0000000..c7dd7cc --- /dev/null +++ b/adc-da-sys/src/main/java/com/adc/da/eo/DictEntity.java @@ -0,0 +1,82 @@ +package com.adc.da.eo; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import java.io.Serializable; +import java.util.Date; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; +import lombok.experimental.Accessors; + +/** + * + * @author ThinkBook + * @TableName ts_dict + */ +@TableName(value ="ts_dict") +@Data +@Accessors(chain = true) +@NoArgsConstructor +@AllArgsConstructor +public class DictEntity implements Serializable { + /** + * 主键id + */ + @TableId(value = "id", type = IdType.INPUT) + private String id; + + /** + * 字典名称 + */ + @TableField(value = "dic_name") + private String dicName; + + /** + * 字典编码 + */ + @TableField(value = "dic_code") + private String dicCode; + + /** + * 描述 + */ + @TableField(value = "description") + private String description; + + /** + * 创建用户id + */ + @TableField(value = "create_user") + private String createUser; + + /** + * 创建时间 + */ + @TableField(value = "create_time") + private Date createTime; + + /** + * 更新用户id + */ + @TableField(value = "update_user") + private String updateUser; + + /** + * 更新时间 + */ + @TableField(value = "update_time") + private Date updateTime; + + /** + * 删除标志 0存在 1删除 + */ + @TableField(value = "del_flag") + private Integer delFlag; + + @TableField(exist = false) + private static final long serialVersionUID = 1564756474576568768L; +} \ No newline at end of file diff --git a/adc-da-sys/src/main/java/com/adc/da/eo/DictItemEntity.java b/adc-da-sys/src/main/java/com/adc/da/eo/DictItemEntity.java new file mode 100644 index 0000000..8a3a35c --- /dev/null +++ b/adc-da-sys/src/main/java/com/adc/da/eo/DictItemEntity.java @@ -0,0 +1,100 @@ +package com.adc.da.eo; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import java.io.Serializable; +import java.util.Date; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; +import lombok.experimental.Accessors; + +/** + * + * @author Caihaohan + * @TableName ts_dict_item + */ +@TableName(value ="ts_dict_item") +@Data +@NoArgsConstructor +@AllArgsConstructor +@Accessors(chain = true) +public class DictItemEntity implements Serializable { + /** + * 主键id + */ + @TableId(value = "id", type = IdType.INPUT) + private String id; + + /** + * 字典id + */ + @TableField(value = "type_id") + private String typeId; + + /** + * 数据名称 + */ + @TableField(value = "item_name") + private String itemName; + + /** + * 数据值 + */ + @TableField(value = "item_value") + private String itemValue; + + /** + * 描述 + */ + @TableField(value = "item_description") + private String itemDescription; + + /** + * 排序 + */ + @TableField(value = "item_order") + private Double itemOrder; + + /** + * 启用标志 0不启用 1启用 + */ + @TableField(value = "item_status") + private Integer itemStatus; + + /** + * 创建用户id + */ + @TableField(value = "create_user") + private String createUser; + + /** + * 创建时间 + */ + @TableField(value = "create_time") + private Date createTime; + + /** + * 更新用户id + */ + @TableField(value = "update_user") + private String updateUser; + + /** + * 更新时间 + */ + @TableField(value = "update_time") + private Date updateTime; + + /** + * 删除标志 0存在 1删除 + */ + @TableField(value = "del_flag") + private Integer delFlag; + + @TableField(exist = false) + private static final long serialVersionUID = 12134213414324536L; +} \ No newline at end of file diff --git a/adc-da-sys/src/main/java/com/adc/da/sys/constant/TsConfigKeyEnum.java b/adc-da-sys/src/main/java/com/adc/da/sys/constant/TsConfigKeyEnum.java new file mode 100644 index 0000000..5e5f952 --- /dev/null +++ b/adc-da-sys/src/main/java/com/adc/da/sys/constant/TsConfigKeyEnum.java @@ -0,0 +1,37 @@ +package com.adc.da.sys.constant; + +/** + * @author CaiHaohan + */ + +public enum TsConfigKeyEnum { + + /** + * 水印前缀 + */ + WATERMARK_PREFIX("WATERMARK_PREFIX", "水印前缀"); + + + /** + * 对应Key + */ + private String value; + + /** + * 代表意义 + */ + private String label; + + TsConfigKeyEnum(String value, String label) { + this.value = value; + this.label = label; + } + + public String getValue() { + return value; + } + + public String getLabel() { + return label; + } +} diff --git a/adc-da-sys/src/main/java/com/adc/da/sys/controller/ConfigController.java b/adc-da-sys/src/main/java/com/adc/da/sys/controller/ConfigController.java new file mode 100644 index 0000000..9ea8845 --- /dev/null +++ b/adc-da-sys/src/main/java/com/adc/da/sys/controller/ConfigController.java @@ -0,0 +1,58 @@ +package com.adc.da.sys.controller; + +import com.adc.da.sys.service.iservice.IConfigService; +import com.adc.da.sys.vo.ConfigVo; +import com.adc.da.util.http.ResponseMessage; +import com.adc.da.util.http.Result; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; +import javax.validation.constraints.NotNull; + +/** + * @author Caihaohan + */ +@Slf4j +@RestController +@RequestMapping("/${restPath}/sys/config") +@Api(tags = {"Sys-基础设置"}) +public class ConfigController { + + @Resource + private IConfigService iConfigService; + + /** + * 获取一个基本设置项 + */ + @ApiOperation(value = "获取一个基本设置项") + @GetMapping("/{key}") + public ResponseMessage findConfig(@NotNull @PathVariable String key) { + return iConfigService.findConfig(key); + } + + /** + * 获取所有基本设置项 + */ + @ApiOperation(value = "获取所有基本设置项") + @GetMapping("/all") + public ResponseMessage findAllConfig() { + try { + return Result.success(iConfigService.findAllConfig()); + } catch (Exception e) { + log.error("获取所有基本设置项", e); + return Result.error("获取失败"); + } + } + + /** + * 保存基本设置项 + */ + @ApiOperation(value = "保存/更新 基本设置项") + @PostMapping("/save") + public ResponseMessage saveConfig(@RequestBody ConfigVo configVo) { + return iConfigService.saveOrUpdateConfig(configVo); + } +} diff --git a/adc-da-sys/src/main/java/com/adc/da/sys/controller/DictController.java b/adc-da-sys/src/main/java/com/adc/da/sys/controller/DictController.java new file mode 100644 index 0000000..d362bcf --- /dev/null +++ b/adc-da-sys/src/main/java/com/adc/da/sys/controller/DictController.java @@ -0,0 +1,67 @@ +package com.adc.da.sys.controller; + + +import com.adc.da.sys.service.iservice.IDictService; +import com.adc.da.sys.vo.DictQueryVo; +import com.adc.da.sys.vo.DictVo; +import com.adc.da.util.http.ResponseMessage; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; +import javax.validation.Valid; +import java.util.List; + + +/** + * @author CaiHaohan + */ +@Slf4j +@RestController +@RequestMapping("/${restPath}/sys/dict") +@Api(tags = {"Sys-数据字典"}) +public class DictController { + + @Resource + private IDictService dictService; + + /** + * 获取一个基本设置项 + */ + @ApiOperation(value = "分页获取所有数据字典") + @GetMapping("/page") + public ResponseMessage page(@Valid DictQueryVo dictQueryVo) { + return dictService.pageByCondition(dictQueryVo); + } + + /** + * 修改一个字典 + */ + @ApiOperation(value = "修改数据字典") + @PutMapping("/edit") + public ResponseMessage edit(@RequestBody DictVo dictVo) { + return dictService.edit(dictVo); + } + + /** + * 删除一个字典 + */ + @ApiOperation(value = "删除数据字典") + @DeleteMapping("/delete") + public ResponseMessage delete(@RequestParam("ids") List ids) { + return dictService.delete(ids); + } + + /** + * 删除一个字典 + */ + @ApiOperation(value = "新增数据字典") + @PostMapping("/add") + public ResponseMessage add(@RequestBody DictVo dictVo) { + return dictService.add(dictVo); + } + + +} diff --git a/adc-da-sys/src/main/java/com/adc/da/sys/controller/DictItemController.java b/adc-da-sys/src/main/java/com/adc/da/sys/controller/DictItemController.java new file mode 100644 index 0000000..404a396 --- /dev/null +++ b/adc-da-sys/src/main/java/com/adc/da/sys/controller/DictItemController.java @@ -0,0 +1,72 @@ +package com.adc.da.sys.controller; + +import com.adc.da.sys.service.iservice.IDictItemService; +import com.adc.da.sys.vo.DictItemQueryVo; +import com.adc.da.sys.vo.DictItemVo; +import com.adc.da.util.http.ResponseMessage; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; +import javax.validation.Valid; +import java.util.List; + +/** + * @author CaiHaohan + */ +@Slf4j +@RestController +@RequestMapping("/${restPath}/sys/dictItem") +@Api(tags = {"Sys-数据字典记录"}) +public class DictItemController { + + @Resource + private IDictItemService dictItemService; + + /** + * 根据字典编码获取所有选项 + */ + @ApiOperation(value = "根据字典编码获取所有选项") + @GetMapping("/{dicCode}") + public ResponseMessage listByPageCode(@PathVariable String dicCode) { + return dictItemService.listByPageCode(dicCode); + } + + /** + * 分页获取所有数据字典记录 + */ + @ApiOperation(value = "分页获取所有数据字典记录") + @GetMapping("/page") + public ResponseMessage pageByDicId(@Valid DictItemQueryVo dictItemQueryVo) { + return dictItemService.pageById(dictItemQueryVo); + } + + /** + * 修改数据字典记录 + */ + @ApiOperation(value = "修改数据字典记录") + @PutMapping("/edit") + public ResponseMessage edit(@RequestBody DictItemVo dictItemVo) { + return dictItemService.edit(dictItemVo); + } + + /** + * 删除数据字典记录 + */ + @ApiOperation(value = "删除数据字典记录") + @DeleteMapping("/delete") + public ResponseMessage delete(@RequestParam List ids) { + return dictItemService.delete(ids); + } + + /** + * 新增数据字典记录 + */ + @ApiOperation(value = "新增数据字典记录") + @PostMapping("/add") + public ResponseMessage add(@RequestBody DictItemVo dictItemVo) { + return dictItemService.add(dictItemVo); + } +} diff --git a/adc-da-sys/src/main/java/com/adc/da/sys/dao/mysql/ConfigDao.java b/adc-da-sys/src/main/java/com/adc/da/sys/dao/mysql/ConfigDao.java new file mode 100644 index 0000000..2647b63 --- /dev/null +++ b/adc-da-sys/src/main/java/com/adc/da/sys/dao/mysql/ConfigDao.java @@ -0,0 +1,19 @@ +package com.adc.da.sys.dao.mysql; + + +import com.adc.da.eo.ConfigEntity; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** +* @author ThinkBook +* @description 针对表【ts_config】的数据库操作Mapper +* @createDate 2023-05-04 09:45:30 +* @Entity generator.eo.ConfigEntity +*/ +public interface ConfigDao extends BaseMapper { + +} + + + + diff --git a/adc-da-sys/src/main/java/com/adc/da/sys/dao/mysql/DictDao.java b/adc-da-sys/src/main/java/com/adc/da/sys/dao/mysql/DictDao.java new file mode 100644 index 0000000..5118893 --- /dev/null +++ b/adc-da-sys/src/main/java/com/adc/da/sys/dao/mysql/DictDao.java @@ -0,0 +1,18 @@ +package com.adc.da.sys.dao.mysql; + +import com.adc.da.eo.DictEntity; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** +* @author ThinkBook +* @description 针对表【ts_dict】的数据库操作Mapper +* @createDate 2023-05-05 10:28:12 +* @Entity com.adc.da.eo.DictEntity +*/ +public interface DictDao extends BaseMapper { + +} + + + + diff --git a/adc-da-sys/src/main/java/com/adc/da/sys/dao/mysql/DictItemDao.java b/adc-da-sys/src/main/java/com/adc/da/sys/dao/mysql/DictItemDao.java new file mode 100644 index 0000000..cd3bbbc --- /dev/null +++ b/adc-da-sys/src/main/java/com/adc/da/sys/dao/mysql/DictItemDao.java @@ -0,0 +1,18 @@ +package com.adc.da.sys.dao.mysql; + +import com.adc.da.eo.DictItemEntity; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** +* @author ThinkBook +* @description 针对表【ts_dict_item】的数据库操作Mapper +* @createDate 2023-05-05 10:28:25 +* @Entity com.adc.da.eo.DictItemEntity +*/ +public interface DictItemDao extends BaseMapper { + +} + + + + diff --git a/adc-da-sys/src/main/java/com/adc/da/sys/service/ConfigServiceImpl.java b/adc-da-sys/src/main/java/com/adc/da/sys/service/ConfigServiceImpl.java new file mode 100644 index 0000000..962a873 --- /dev/null +++ b/adc-da-sys/src/main/java/com/adc/da/sys/service/ConfigServiceImpl.java @@ -0,0 +1,107 @@ +package com.adc.da.sys.service; + +import cn.hutool.core.bean.BeanUtil; +import com.adc.da.sys.constant.TsConfigKeyEnum; +import com.adc.da.sys.vo.ConfigVo; +import com.adc.da.util.http.ResponseMessage; +import com.adc.da.util.http.Result; +import com.adc.da.util.utils.UUID; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.adc.da.eo.ConfigEntity; +import com.adc.da.sys.service.iservice.IConfigService; +import com.adc.da.sys.dao.mysql.ConfigDao; +import org.springframework.stereotype.Service; + +import java.util.ArrayList; +import java.util.List; + + +/** + * @author ThinkBook + * @description 针对表【ts_config】的数据库操作Service实现 + * @createDate 2023-05-04 09:45:30 + */ +@Service +public class ConfigServiceImpl extends ServiceImpl + implements IConfigService { + + @Override + public ResponseMessage saveOrUpdateConfig(ConfigVo configVo) { + try { + // 先查询 + ConfigEntity configEntity = new ConfigEntity(); + BeanUtil.copyProperties(configVo, configEntity); + + //判断Key是否是后端预设好的 + if (isKeyValid(configEntity.getConfigKey())) { + List configEntityList = query().eq("config_key", configEntity.getConfigKey()).list(); + if (!configEntityList.isEmpty()){ + ConfigEntity existDbConfig = configEntityList.get(0); + configEntity.setId(existDbConfig.getId()); + updateById(configEntity); + } else { + configEntity.setId(UUID.randomUUID10()); + save(configEntity); + } + return Result.success("保存成功"); + } + return Result.error("配置项Key不存在"); + } catch (Exception e) { + log.error("保存基本设置项失败", e); + return Result.error("保存失败"); + } + } + + @Override + public List findAllConfig() { + List result = new ArrayList<>(); + for (TsConfigKeyEnum configKey : TsConfigKeyEnum.values()) { + List configEntityList = query().eq("config_key", configKey.getValue()).list(); + if (!configEntityList.isEmpty()){ + ConfigVo configVo = new ConfigVo(); + BeanUtil.copyProperties(configEntityList.get(0), configVo); + result.add(configVo); + } + } + return result; + } + + @Override + public ResponseMessage findConfig(String key) { + if (isKeyValid(key)) { + ConfigEntity configEntity = query().eq("config_key", key).one(); + ConfigVo configVo = new ConfigVo(); + BeanUtil.copyProperties(configEntity, configVo); + return Result.success(configVo); + } + return Result.error("配置项Key不存在"); + } + + @Override + public String findConfigValueByKey(String key) { + if (isKeyValid(key)) { + ConfigEntity configEntity = query().eq("config_key", key).one(); + return configEntity.getConfigValue(); + } + return ""; + } + + /** + * 判断传入的key是否是后端预设好的key + * + * @param key + * @return + */ + private boolean isKeyValid(String key) { + for (TsConfigKeyEnum configKey : TsConfigKeyEnum.values()) { + if (configKey.getValue().equals(key)) { + return true; + } + } + return false; + } +} + + + + diff --git a/adc-da-sys/src/main/java/com/adc/da/sys/service/DictItemServiceImpl.java b/adc-da-sys/src/main/java/com/adc/da/sys/service/DictItemServiceImpl.java new file mode 100644 index 0000000..bcddedf --- /dev/null +++ b/adc-da-sys/src/main/java/com/adc/da/sys/service/DictItemServiceImpl.java @@ -0,0 +1,162 @@ +package com.adc.da.sys.service; + +import cn.hutool.core.bean.BeanUtil; +import cn.hutool.core.util.StrUtil; +import com.adc.da.eo.DictEntity; +import com.adc.da.eo.DictItemEntity; +import com.adc.da.sys.dao.mysql.DictDao; +import com.adc.da.sys.service.iservice.IDictItemService; +import com.adc.da.sys.util.BeanCopyUtils; +import com.adc.da.sys.vo.DictItemQueryVo; +import com.adc.da.sys.vo.DictItemVo; +import com.adc.da.util.http.ResponseMessage; +import com.adc.da.util.http.Result; +import com.adc.da.util.utils.UUID; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; + +import com.adc.da.sys.dao.mysql.DictItemDao; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import javax.annotation.Resource; +import java.util.*; +import java.util.stream.Collectors; + +/** +* @author ThinkBook +* @description 针对表【ts_dict_item】的数据库操作Service实现 +* @createDate 2023-05-05 10:28:25 +*/ +@Service +@Slf4j +public class DictItemServiceImpl extends ServiceImpl + implements IDictItemService { + + @Resource + private DictItemDao dictItemDao; + + @Resource + private DictDao dictDao; + + @Override + public ResponseMessage pageById(DictItemQueryVo dictItemQueryVo) { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.like(StrUtil.isNotBlank(dictItemQueryVo.getItemName()), DictItemEntity::getItemName, dictItemQueryVo.getItemName()); + wrapper.eq(DictItemEntity::getDelFlag, 0); + wrapper.eq(DictItemEntity::getTypeId, dictItemQueryVo.getDicId()); + wrapper.orderByAsc(DictItemEntity::getItemOrder); + + IPage page = new Page<>(dictItemQueryVo.getPageNo(), dictItemQueryVo.getPageSize()); + page(page, wrapper); + + Page returnPage = BeanCopyUtils.copyBean(page, Page.class); + List dictItemVos = BeanCopyUtils.copyBeanList(page.getRecords(), DictItemVo.class); + + returnPage.setRecords(dictItemVos); + return Result.success(returnPage); + } + + @Override + public ResponseMessage edit(DictItemVo dictItemVo) { + try { + DictItemEntity dictItemEntity = new DictItemEntity(); + BeanUtil.copyProperties(dictItemVo, dictItemEntity); + dictItemDao.updateById(dictItemEntity); + log.info("编辑id为{}数据字典值成功", dictItemEntity.getId()); + return Result.success("编辑成功"); + } catch (Exception e) { + log.info("编辑数据字典值失败", e); + } + return Result.error("编辑失败"); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public ResponseMessage delete(List ids) { + List dictEntities = new ArrayList<>(); + ids.forEach(id -> { + DictItemEntity dictEntity = new DictItemEntity(); + dictEntity.setId(id); + dictEntity.setUpdateTime(new Date()); + dictEntity.setDelFlag(1); + dictEntities.add(dictEntity); + }); + updateBatchById(dictEntities); + return Result.success("删除成功"); + } + + @Override + public ResponseMessage add(DictItemVo dictItemVo) { + //判断上级字典id是否存在 + if (StrUtil.isBlank(dictItemVo.getDicId())) { + return Result.error("上级字典id无效"); + } + //判断上级字典id是否有效 + DictEntity dictEntity = dictDao.selectById(dictItemVo.getDicId()); + if (dictEntity == null) { + return Result.error("上级字典id无效"); + } + + try { + DictItemEntity dictItemEntity = BeanCopyUtils.copyBean(dictItemVo, DictItemEntity.class); + dictItemEntity.setId(UUID.randomUUID10()) + .setTypeId(dictItemVo.getDicId()) + .setCreateTime(new Date()) + .setUpdateTime(new Date()) + .setDelFlag(0); + + //求已存在选项排序的最大值 + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(DictItemEntity::getDelFlag, 0); + wrapper.eq(DictItemEntity::getTypeId, dictItemVo.getDicId()); + List dictItemEntities = dictItemDao.selectList(wrapper); + Double maxOrder = dictItemEntities.stream().map(DictItemEntity::getItemOrder) + .sorted(Comparator.reverseOrder()) + .collect(Collectors.toList()) + .stream().findFirst().orElse(null); + + //设置排序值 + if (dictItemVo.getItemOrder() == null) { + //如果目前没有最大值(没有选项) + if (maxOrder == null) { + dictItemEntity.setItemOrder(1.0); + } else { + //设置为最后一个 + dictItemEntity.setItemOrder(1.0 + Math.ceil(maxOrder)); + } + } + save(dictItemEntity); + return Result.success("新增成功"); + } catch (Exception e) { + log.info("新增选项失败", e); + } + return Result.error("新增失败"); + } + + @Override + public ResponseMessage listByPageCode(String dicCode) { + LambdaQueryWrapper dicWrapper = new LambdaQueryWrapper<>(); + dicWrapper.eq(DictEntity::getDicCode, dicCode); + dicWrapper.eq(DictEntity::getDelFlag, 0); + DictEntity dictEntity = dictDao.selectOne(dicWrapper); + if (dictEntity == null) { + return Result.error("此字典编码不存在或已被删除"); + } + + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(DictItemEntity::getDelFlag, 0); + wrapper.eq(DictItemEntity::getTypeId, dictEntity.getId()); + wrapper.orderByAsc(DictItemEntity::getItemOrder); + List list = list(wrapper); + List dictItemVos = BeanCopyUtils.copyBeanList(list, DictItemVo.class); + return Result.success(dictItemVos); + } +} + + + + diff --git a/adc-da-sys/src/main/java/com/adc/da/sys/service/DictServiceImpl.java b/adc-da-sys/src/main/java/com/adc/da/sys/service/DictServiceImpl.java new file mode 100644 index 0000000..b4f9fd9 --- /dev/null +++ b/adc-da-sys/src/main/java/com/adc/da/sys/service/DictServiceImpl.java @@ -0,0 +1,122 @@ +package com.adc.da.sys.service; + +import cn.hutool.core.bean.BeanUtil; +import cn.hutool.core.util.StrUtil; +import com.adc.da.eo.DictEntity; +import com.adc.da.sys.util.BeanCopyUtils; +import com.adc.da.sys.vo.DictQueryVo; +import com.adc.da.sys.vo.DictVo; +import com.adc.da.util.http.ResponseMessage; +import com.adc.da.util.http.Result; +import com.adc.da.util.utils.UUID; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.adc.da.sys.service.iservice.IDictService; +import com.adc.da.sys.dao.mysql.DictDao; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import javax.annotation.Resource; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; + +/** + * @author ThinkBook + * @description 针对表【ts_dict】的数据库操作Service实现 + * @createDate 2023-05-05 10:28:12 + */ +@Service +@Slf4j +public class DictServiceImpl extends ServiceImpl + implements IDictService { + + @Resource + private DictDao dictDao; + + @Override + public ResponseMessage pageByCondition(DictQueryVo dictQueryVo) { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.like(StrUtil.isNotBlank(dictQueryVo.getDicName()), DictEntity::getDicName, dictQueryVo.getDicName()); + wrapper.eq(StrUtil.isNotBlank(dictQueryVo.getDicCode()), DictEntity::getDicCode, dictQueryVo.getDicCode()); + wrapper.eq(DictEntity::getDelFlag, 0); + wrapper.orderByAsc(DictEntity::getCreateTime); + IPage page = new Page<>(dictQueryVo.getPageNo(), dictQueryVo.getPageSize()); + page(page, wrapper); + + Page returnPage = BeanCopyUtils.copyBean(page, Page.class); + List dictVos = BeanCopyUtils.copyBeanList(page.getRecords(), DictVo.class); + + returnPage.setRecords(dictVos); + return Result.success(returnPage); + } + + @Override + public ResponseMessage edit(DictVo dictVo) { + try { + DictEntity dictEntity = new DictEntity(); + //字典编码不可变 + BeanUtil.copyProperties(dictVo, dictEntity); + dictEntity.setDicCode(null); + dictEntity.setUpdateTime(new Date()); + dictDao.updateById(dictEntity); + log.info("编辑数据字典{}成功", dictEntity.getDicName()); + return Result.success("编辑成功"); + } catch (Exception e) { + log.info("编辑数据字典失败", e); + } + return Result.error("编辑失败"); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public ResponseMessage delete(List ids) { + List dictEntities = new ArrayList<>(); + ids.forEach(id -> { + DictEntity dictEntity = new DictEntity(); + dictEntity.setId(id); + dictEntity.setUpdateTime(new Date()); + dictEntity.setDelFlag(1); + dictEntities.add(dictEntity); + }); + updateBatchById(dictEntities); + return Result.success("删除成功"); + } + + @Override + public ResponseMessage add(DictVo dictVo) { + //判断字典名是否重复 + Integer dicNameCount = query().eq("dic_name", dictVo.getDicName()) + .eq("del_flag", 0).count(); + if (dicNameCount > 0) { + return Result.error("字典名重复"); + } + //判断字典编码是否重复 + Integer dicCodeCount = query().eq("dic_code", dictVo.getDicCode()) + .eq("del_flag", 0).count(); + if (dicCodeCount > 0) { + return Result.error("字典编码重复"); + } + try { + DictEntity dictEntity = BeanCopyUtils.copyBean(dictVo, DictEntity.class); + dictEntity.setId(UUID.randomUUID10()) + .setCreateTime(new Date()) + .setUpdateTime(new Date()) + .setDelFlag(0); + save(dictEntity); + return Result.success("新增成功"); + } catch (Exception e) { + log.info("新增字典失败", e); + } + return Result.error("新增失败"); + } + +} + + + + diff --git a/adc-da-sys/src/main/java/com/adc/da/sys/service/iservice/IConfigService.java b/adc-da-sys/src/main/java/com/adc/da/sys/service/iservice/IConfigService.java new file mode 100644 index 0000000..dd1107c --- /dev/null +++ b/adc-da-sys/src/main/java/com/adc/da/sys/service/iservice/IConfigService.java @@ -0,0 +1,47 @@ +package com.adc.da.sys.service.iservice; + +import com.adc.da.eo.ConfigEntity; +import com.adc.da.sys.vo.ConfigVo; +import com.adc.da.util.http.ResponseMessage; +import com.baomidou.mybatisplus.extension.service.IService; + +import java.util.List; + +/** +* @author ThinkBook +* @description 针对表【ts_config】的数据库操作Service +* @createDate 2023-05-04 09:45:30 +*/ +public interface IConfigService extends IService { + + /** + * 新增或更新配置项 + * + * @param configVo + * @return + */ + ResponseMessage saveOrUpdateConfig(ConfigVo configVo); + + /** + * 获取所有配置项 + * + * @return + */ + List findAllConfig(); + + /** + * 返回一个配置项 + * + * @param key + * @return + */ + ResponseMessage findConfig(String key); + + /** + * 返回一个配置项 + * + * @param key + * @return + */ + String findConfigValueByKey(String key); +} diff --git a/adc-da-sys/src/main/java/com/adc/da/sys/service/iservice/IDictItemService.java b/adc-da-sys/src/main/java/com/adc/da/sys/service/iservice/IDictItemService.java new file mode 100644 index 0000000..201dea9 --- /dev/null +++ b/adc-da-sys/src/main/java/com/adc/da/sys/service/iservice/IDictItemService.java @@ -0,0 +1,52 @@ +package com.adc.da.sys.service.iservice; + +import com.adc.da.eo.DictItemEntity; +import com.adc.da.sys.vo.DictItemQueryVo; +import com.adc.da.sys.vo.DictItemVo; +import com.adc.da.util.http.ResponseMessage; +import com.baomidou.mybatisplus.extension.service.IService; + +import java.util.List; + +/** +* @author ThinkBook +* @description 针对表【ts_dict_item】的数据库操作Service +* @createDate 2023-05-05 10:28:25 +*/ +public interface IDictItemService extends IService { + + /** + * 获取所有字典值 + * @param dictItemQueryVo + * @return + */ + ResponseMessage pageById(DictItemQueryVo dictItemQueryVo); + + /** + * 修改一个字典值 + * @param dictItemVo + * @return + */ + ResponseMessage edit(DictItemVo dictItemVo); + + /** + * 删除一个字典值 + * @param ids + * @return + */ + ResponseMessage delete(List ids); + + /** + * 添加一个字典值 + * @param dictItemVo 字典值视图对象 + * @return + */ + ResponseMessage add(DictItemVo dictItemVo); + + /** + * 根据字典编码获取所有选项 + * @param dicCode + * @return + */ + ResponseMessage listByPageCode(String dicCode); +} diff --git a/adc-da-sys/src/main/java/com/adc/da/sys/service/iservice/IDictService.java b/adc-da-sys/src/main/java/com/adc/da/sys/service/iservice/IDictService.java new file mode 100644 index 0000000..b3970ce --- /dev/null +++ b/adc-da-sys/src/main/java/com/adc/da/sys/service/iservice/IDictService.java @@ -0,0 +1,49 @@ +package com.adc.da.sys.service.iservice; + + +import com.adc.da.eo.DictEntity; +import com.adc.da.sys.vo.DictQueryVo; +import com.adc.da.sys.vo.DictVo; +import com.adc.da.util.http.ResponseMessage; +import com.baomidou.mybatisplus.extension.service.IService; + +import java.util.List; + + +/** +* @author ThinkBook +* @description 针对表【ts_dict】的数据库操作Service +* @createDate 2023-05-05 10:28:12 +*/ +public interface IDictService extends IService { + + /** + * 获取字典列表 + * + * @param dictQueryVo + * @return + */ + ResponseMessage pageByCondition(DictQueryVo dictQueryVo); + + /** + * 编辑字典 + * + * @param dictVo + * @return + */ + ResponseMessage edit(DictVo dictVo); + + /** + * 删除字典 + * @param id + * @return + */ + ResponseMessage delete(List id); + + /** + * 新增字典 + * @param dictVo + * @return + */ + ResponseMessage add(DictVo dictVo); +} diff --git a/adc-da-sys/src/main/java/com/adc/da/sys/util/BeanCopyUtils.java b/adc-da-sys/src/main/java/com/adc/da/sys/util/BeanCopyUtils.java new file mode 100644 index 0000000..a001852 --- /dev/null +++ b/adc-da-sys/src/main/java/com/adc/da/sys/util/BeanCopyUtils.java @@ -0,0 +1,36 @@ +package com.adc.da.sys.util; + +import org.springframework.beans.BeanUtils; + +import java.util.List; +import java.util.stream.Collectors; + +/** + * @author Mzaxd + * @since 2022-11-22 15:36 + */ +public class BeanCopyUtils { + + private BeanCopyUtils() { + } + + public static V copyBean(Object source, Class clazz){ + V result = null; + //创建目标对象 + try { + result = clazz.newInstance(); + //实现属性copy + BeanUtils.copyProperties(source, result); + } catch (Exception e) { + e.printStackTrace(); + } + //返回结果 + return result; + } + + public static List copyBeanList(List list, Class clazz) { + return list.stream() + .map(o -> copyBean(o, clazz)) + .collect(Collectors.toList()); + } +} diff --git a/adc-da-sys/src/main/java/com/adc/da/sys/vo/ConfigVo.java b/adc-da-sys/src/main/java/com/adc/da/sys/vo/ConfigVo.java new file mode 100644 index 0000000..a5f21ed --- /dev/null +++ b/adc-da-sys/src/main/java/com/adc/da/sys/vo/ConfigVo.java @@ -0,0 +1,24 @@ +package com.adc.da.sys.vo; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * @author CaiHaohan + */ +@Data +@NoArgsConstructor +@AllArgsConstructor +public class ConfigVo { + + /** + * 配置项key + */ + private String configKey; + + /** + * 配置项value + */ + private String configValue; +} diff --git a/adc-da-sys/src/main/java/com/adc/da/sys/vo/DictItemQueryVo.java b/adc-da-sys/src/main/java/com/adc/da/sys/vo/DictItemQueryVo.java new file mode 100644 index 0000000..0aac2a5 --- /dev/null +++ b/adc-da-sys/src/main/java/com/adc/da/sys/vo/DictItemQueryVo.java @@ -0,0 +1,46 @@ +package com.adc.da.sys.vo; + +import lombok.Data; +import javax.validation.constraints.Min; +import javax.validation.constraints.NotNull; + + +/** + * @author CaiHaohan + */ +@Data +public class DictItemQueryVo { + + /** + * 上级主键id + */ + private String dicId; + + /** + * 页数 + */ + @Min(1) + private Integer pageNo; + + /** + * 每页数量 + */ + @NotNull + private Integer pageSize; + + /** + * 数据名称 + */ + private String itemName; + + /** + * 状态 + */ + private Integer itemStatus; + + /** + * 排序 + */ + private Double itemOrder; + +} diff --git a/adc-da-sys/src/main/java/com/adc/da/sys/vo/DictItemVo.java b/adc-da-sys/src/main/java/com/adc/da/sys/vo/DictItemVo.java new file mode 100644 index 0000000..542bbc1 --- /dev/null +++ b/adc-da-sys/src/main/java/com/adc/da/sys/vo/DictItemVo.java @@ -0,0 +1,45 @@ +package com.adc.da.sys.vo; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * @author CaiHaohan + */ +@Data +@NoArgsConstructor +@AllArgsConstructor +public class DictItemVo { + + /** + * 主键id + */ + private String id; + + /** + * 上级字典主键id + */ + private String dicId; + + /** + * 数据名称 + */ + private String itemName; + + /** + * 数据值 + */ + private String itemValue; + + /** + * 描述 + */ + private String itemDescription; + + /** + * 排序 + */ + private Double itemOrder; + +} diff --git a/adc-da-sys/src/main/java/com/adc/da/sys/vo/DictQueryVo.java b/adc-da-sys/src/main/java/com/adc/da/sys/vo/DictQueryVo.java new file mode 100644 index 0000000..53e4c1a --- /dev/null +++ b/adc-da-sys/src/main/java/com/adc/da/sys/vo/DictQueryVo.java @@ -0,0 +1,35 @@ +package com.adc.da.sys.vo; + +import lombok.Data; + +import javax.validation.constraints.Min; +import javax.validation.constraints.NotNull; + +/** + * @author CaiHaohan + */ +@Data +public class DictQueryVo { + + /** + * 字典名称 + */ + private String dicName; + + /** + * 字典编码 + */ + private String dicCode; + + /** + * 页数 + */ + @Min(1) + private int pageNo; + + /** + * 每页数量 + */ + @NotNull + private int pageSize; +} \ No newline at end of file diff --git a/adc-da-sys/src/main/java/com/adc/da/sys/vo/DictVo.java b/adc-da-sys/src/main/java/com/adc/da/sys/vo/DictVo.java new file mode 100644 index 0000000..200b77f --- /dev/null +++ b/adc-da-sys/src/main/java/com/adc/da/sys/vo/DictVo.java @@ -0,0 +1,36 @@ +package com.adc.da.sys.vo; + + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * @author CaiHaohan + */ +@Data +@NoArgsConstructor +@AllArgsConstructor +public class DictVo { + + /** + * 主键id + */ + private String id; + + /** + * 字典名称 + */ + private String dicName; + + /** + * 字典编码 + */ + private String dicCode; + + /** + * 描述 + */ + private String description; + +}