diff --git a/adc-da-login/src/main/java/com/adc/da/login/config/ShiroFilterConfiguration.java b/adc-da-login/src/main/java/com/adc/da/login/config/ShiroFilterConfiguration.java index d6744d3..51bb276 100644 --- a/adc-da-login/src/main/java/com/adc/da/login/config/ShiroFilterConfiguration.java +++ b/adc-da-login/src/main/java/com/adc/da/login/config/ShiroFilterConfiguration.java @@ -115,6 +115,9 @@ public class ShiroFilterConfiguration { /* 用户信息不用认证 */ filterChainDefinitionMap.put(restPath + "/userInfo", ANON); + /* 用户信息不用认证 */ + filterChainDefinitionMap.put(restPath + "/report/refreshReportContent", ANON); + /* 在线用户列表不用验证 */ filterChainDefinitionMap.put(restPath + "/onlineUser", ANON); diff --git a/adc-da-main/src/main/resources/application-dev.properties b/adc-da-main/src/main/resources/application-dev.properties index df4ad6f..7a10004 100644 --- a/adc-da-main/src/main/resources/application-dev.properties +++ b/adc-da-main/src/main/resources/application-dev.properties @@ -36,9 +36,6 @@ spring.datasource.driverClassName = com.mysql.cj.jdbc.Driver spring.datasource.url = jdbc:mysql://121.36.69.172:3307/report-library?characterEncoding=UTF-8&useUnicode=true&useSSL=false&tinyInt1isBit=false&allowPublicKeyRetrieval=true&serverTimezone=Asia/Shanghai -#spring.datasource.url = jdbc:mysql://121.36.69\ -# .172:3307/report-library_test?characterEncoding=UTF-8&useUnicode=true&useSSL=false&tinyInt1isBit=false\ -# &allowPublicKeyRetrieval=true&serverTimezone=Asia/Shanghai spring.datasource.username = root spring.datasource.password = hzwlsoft.com @@ -67,7 +64,7 @@ swaggerLevel=0 # \u672C\u5730\u5B58\u50A8\u6587\u4EF6\u7684\u78C1\u76D8\u5730\u5740 #uploadFile=D:\\work\\idea\\changan\\ #uploadFile=D:\\uploadfile\\tmp\\ -uploadFile=D:\\desktop\\dazhong\\uploadfile +uploadFile=/data/DeploymentPackage/report_library/uploadfile/ # \u672C\u5730\u6587\u4EF6\u8BBF\u95EE\u7684url\u5730\u5740 picPath=/api/home/pic/ diff --git a/adc-da-main/src/test/java/com/adc/da/DataDictionaryGenerator.java b/adc-da-main/src/test/java/com/adc/da/DataDictionaryGenerator.java new file mode 100644 index 0000000..c7c9d79 --- /dev/null +++ b/adc-da-main/src/test/java/com/adc/da/DataDictionaryGenerator.java @@ -0,0 +1,164 @@ +package com.adc.da; + +import java.math.BigInteger; +import java.nio.file.Files; +import java.nio.file.Paths; +import java.sql.*; +import java.util.HashSet; +import java.util.Set; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +import org.apache.poi.xwpf.usermodel.*; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTTblWidth; +import org.openxmlformats.schemas.wordprocessingml.x2006.main.STTblWidth; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.junit4.SpringRunner; + +@RunWith(SpringRunner.class) +@SpringBootTest +public class DataDictionaryGenerator { + + /** + * 生成数据字典Word + */ + @Test + public void generate() throws Exception { + // Connect to the database + String url = "jdbc:mysql://localhost:3306/report_library?characterEncoding=UTF-8&useUnicode=true&useSSL=false&tinyInt1isBit=false&allowPublicKeyRetrieval=true&serverTimezone=Asia/Shanghai"; + String username = "root"; + String password = "rootroot"; + Connection connection = DriverManager.getConnection(url, username, password); + + // Get metadata + DatabaseMetaData metaData = connection.getMetaData(); + // Specify the database name + String databaseName = "report_library"; // Replace "report_library" with the actual database name + + // Get tables in the specified database + ResultSet tables = metaData.getTables(databaseName, null, "%", null); + + // Create a new Word document + XWPFDocument document = new XWPFDocument(); + + int tableCounter = 1; + + // Iterate over the tables + while (tables.next()) { + String tableName = tables.getString(3); + + // Add the table name to the document + XWPFParagraph tableNameParagraph = document.createParagraph(); + XWPFRun run = tableNameParagraph.createRun(); + + // Set table name as "Table 1: 表名" + String tableNumber = tableCounter + ": "; + String tableNameText = tableNumber + tableName; + run.setText(tableNameText); + run.setBold(true); + + // Set font size + run.setFontSize(12); // 12 points for font size (equivalent to three号字号) + + // Increment table counter + tableCounter++; + + // Create table + XWPFTable table = document.createTable(); + CTTblWidth tableWidth = table.getCTTbl().addNewTblPr().addNewTblW(); + tableWidth.setType(STTblWidth.PCT); + tableWidth.setW(BigInteger.valueOf(5000)); // Set the table width (10000 = 100%) + + // create header row + XWPFTableRow headerRow = table.getRow(0); + headerRow.getCell(0).setText("列名"); + headerRow.addNewTableCell().setText("中文含义"); + headerRow.addNewTableCell().setText("数据类型"); + headerRow.addNewTableCell().setText("主键"); + headerRow.addNewTableCell().setText("外键"); + headerRow.addNewTableCell().setText("不为空"); + headerRow.addNewTableCell().setText("备注"); + + // Get columns + ResultSet columns = metaData.getColumns(null, null, tableName, "%"); + + // get primary keys + ResultSet primaryKeys = metaData.getPrimaryKeys(null, null, tableName); + Set primaryKeySet = new HashSet<>(); + while (primaryKeys.next()) { + primaryKeySet.add(primaryKeys.getString("COLUMN_NAME")); + } + + // Pattern for matching remarks + Pattern pattern = Pattern.compile("([^((]+)[((]([^))]+)[))]"); + + // Iterate over the columns + while (columns.next()) { + String columnName = columns.getString(4); + int columnSize = columns.getInt("COLUMN_SIZE"); + String columnType = columns.getString(6) + "(" + columnSize + ")"; + String isNullable = columns.getString(18); + boolean isNotNull = isNullable.equals("NO"); + + // Check if column is primary key + String isPrimaryKey = primaryKeySet.contains(columnName) ? "是" : "否"; + + String isForeignKey = "否"; + + // Extracting Chinese meaning and remarks from the remarks column + String fullRemarks = columns.getString("REMARKS"); + Matcher matcher = pattern.matcher(fullRemarks); + + String chineseMeaning = ""; + String remarks = ""; + if (matcher.find()) { + chineseMeaning = matcher.group(1); + remarks = matcher.group(2); + } else { + chineseMeaning = fullRemarks; + } + + // Add the column details to the table + XWPFTableRow row = table.createRow(); + XWPFRun cellRun = row.getCell(0).getParagraphs().get(0).createRun(); + cellRun.setFontSize(10); + cellRun.setText(columnName); + + cellRun = row.getCell(1).getParagraphs().get(0).createRun(); + cellRun.setFontSize(10); + cellRun.setText(chineseMeaning); + + cellRun = row.getCell(2).getParagraphs().get(0).createRun(); + cellRun.setFontSize(10); + cellRun.setText(columnType); + + cellRun = row.getCell(3).getParagraphs().get(0).createRun(); + cellRun.setFontSize(10); + cellRun.setText(isPrimaryKey); + + cellRun = row.getCell(4).getParagraphs().get(0).createRun(); + cellRun.setFontSize(10); + cellRun.setText(isForeignKey); + + cellRun = row.getCell(5).getParagraphs().get(0).createRun(); + cellRun.setFontSize(10); + cellRun.setText(isNotNull ? "是" : "否"); + + cellRun = row.getCell(6).getParagraphs().get(0).createRun(); + cellRun.setFontSize(10); + cellRun.setText(remarks); + } + // Create an empty paragraph + XWPFParagraph emptyParagraph = document.createParagraph(); + emptyParagraph.setSpacingAfter(200); // Set the spacing after the paragraph (adjust the value as needed) + } + + // Save the document + document.write(Files.newOutputStream(Paths.get("DataDictionary.docx"))); + + // Close the document + document.close(); + } +} \ No newline at end of file diff --git a/adc-da-main/src/test/java/com/adc/da/report/TestMessage.java b/adc-da-main/src/test/java/com/adc/da/report/TestMessage.java new file mode 100644 index 0000000..5cd8ff6 --- /dev/null +++ b/adc-da-main/src/test/java/com/adc/da/report/TestMessage.java @@ -0,0 +1,48 @@ +package com.adc.da.report; + +import com.adc.da.report.constant.MessageTypeEnum; +import com.adc.da.report.eo.MessageEntity; +import com.adc.da.report.service.IMessageService; +import com.adc.da.util.utils.UUID; +import io.github.swagger2markup.GroupBy; +import io.github.swagger2markup.Language; +import io.github.swagger2markup.Swagger2MarkupConfig; +import io.github.swagger2markup.Swagger2MarkupConverter; +import io.github.swagger2markup.builder.Swagger2MarkupConfigBuilder; +import io.github.swagger2markup.markup.builder.MarkupLanguage; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.junit4.SpringRunner; + +import javax.annotation.Resource; +import java.net.URL; +import java.nio.file.Paths; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; + +@RunWith(SpringRunner.class) +@SpringBootTest +public class TestMessage { + + @Resource + private IMessageService messageService; + + @Test + public void testMessagePublish() { + for (int i = 0; i < 20; i++) { + MessageEntity messageEntity = new MessageEntity(); + messageEntity.setMessageTitle("测试发送标题" + java.util.UUID.randomUUID()) + .setMessageType(MessageTypeEnum.SYSTEM_MESSAGE.getValue()) + .setId(UUID.randomUUID10()) + .setContent("测试测试站内信内容" + java.util.UUID.randomUUID()) + .setDelFlag(0) + .setCreateUser("ZGGJP3N7FT") + .setCreateDate(new Date()); + List userIds = new ArrayList<>(); + userIds.add("ZGGJP3N7FT"); + messageService.publishMessage(messageEntity, false, userIds); + } + } +} \ No newline at end of file diff --git a/adc-da-report/src/main/java/com/adc/da/report/Timer/secrecyDDLTimer.java b/adc-da-report/src/main/java/com/adc/da/report/Timer/secrecyDDLTimer.java index 0811058..47567f6 100644 --- a/adc-da-report/src/main/java/com/adc/da/report/Timer/secrecyDDLTimer.java +++ b/adc-da-report/src/main/java/com/adc/da/report/Timer/secrecyDDLTimer.java @@ -29,9 +29,9 @@ public class secrecyDDLTimer { @Autowired IReportServiceImpl iReportService; -// @Scheduled(cron="0 0 0 * * *") // @Scheduled(cron="0 0/1 * * * ?") - @Scheduled(cron="0 0/10 * * * ?") +// @Scheduled(cron="0 0/10 * * * ?") + @Scheduled(cron="0 1 0 * * *") //每晚1点执行 public void timingOpen() { log.info("**********************保密到期定时任务开始**********************"); List entity = reportDao.selectDDL(); diff --git a/adc-da-report/src/main/java/com/adc/da/report/constant/MessageConstants.java b/adc-da-report/src/main/java/com/adc/da/report/constant/MessageConstants.java new file mode 100644 index 0000000..7902caf --- /dev/null +++ b/adc-da-report/src/main/java/com/adc/da/report/constant/MessageConstants.java @@ -0,0 +1,23 @@ +package com.adc.da.report.constant; + +import io.swagger.models.auth.In; + +/** + * @author: CaiHaohan + * @Date: 2023/5/23 15:17 + * @Description: + */ +public class MessageConstants { + + /** + * 消息状态 未读 + */ + public static final Integer UNREAD = 0; + + + /** + * 消息状态 已读 + */ + public static final Integer READ = 1; + +} diff --git a/adc-da-report/src/main/java/com/adc/da/report/constant/MessageTypeEnum.java b/adc-da-report/src/main/java/com/adc/da/report/constant/MessageTypeEnum.java new file mode 100644 index 0000000..b8cda0e --- /dev/null +++ b/adc-da-report/src/main/java/com/adc/da/report/constant/MessageTypeEnum.java @@ -0,0 +1,40 @@ +package com.adc.da.report.constant; + +import com.baomidou.mybatisplus.annotation.EnumValue; +import com.fasterxml.jackson.annotation.JsonValue; + +/** + * @author: CaiHaohan + * @Date: 2023/5/24 10:44 + * @Description: + */ +public enum MessageTypeEnum { + + /** + * 系统消息 + */ + SYSTEM_MESSAGE(0, "系统消息"); + + /** + * 对应值 + */ + private Integer code; + + /** + * 描述 + */ + private String desc; + + MessageTypeEnum(Integer code, String desc) { + this.code = code; + this.desc = desc; + } + + public Integer getValue() { + return code; + } + + public String getDesc() { + return desc; + } +} diff --git a/adc-da-report/src/main/java/com/adc/da/report/constant/ReportConstants.java b/adc-da-report/src/main/java/com/adc/da/report/constant/ReportConstants.java index 3801efc..fc25652 100644 --- a/adc-da-report/src/main/java/com/adc/da/report/constant/ReportConstants.java +++ b/adc-da-report/src/main/java/com/adc/da/report/constant/ReportConstants.java @@ -23,6 +23,15 @@ public class ReportConstants { */ public static final String NO_USER_PRIVACY_INVOLVED = "不涉及用户隐私"; + /** + * 流程中 + */ + public static final Integer IN_PROCESS = 1; + + /** + * 不在流程中 + */ + public static final Integer NOT_IN_PROCESS = 2; } diff --git a/adc-da-report/src/main/java/com/adc/da/report/controller/MessageController.java b/adc-da-report/src/main/java/com/adc/da/report/controller/MessageController.java new file mode 100644 index 0000000..04fb5e4 --- /dev/null +++ b/adc-da-report/src/main/java/com/adc/da/report/controller/MessageController.java @@ -0,0 +1,59 @@ +package com.adc.da.report.controller; + +import com.adc.da.report.service.IMessageService; +import com.adc.da.report.vo.MessageQueryVo; +import com.adc.da.report.vo.MessageVo; +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; + +/** + * @Author caihaohan + * @Date 2021/11/9 13:46 + */ +@Slf4j +@Api(tags = "站内信") +@RestController +@RequestMapping("/${restPath}/message") +public class MessageController { + + + @Resource + private IMessageService messageEntityService; + + /** + * 站内信消息列表 + * @return + */ + @ApiOperation("站内信消息列表") + @GetMapping("/list") + public ResponseMessage list(@Valid MessageQueryVo messageQueryVo) { + return messageEntityService.listByCurrentUser(messageQueryVo); + } + + /** + * 全部已读 + * @return + */ + @ApiOperation("全部已读接口") + @GetMapping("/allRead") + public ResponseMessage allRead() { + return messageEntityService.allRead(); + } + + /** + * 已读 + * @return + */ + @ApiOperation("单条已读") + @GetMapping("/read/{id}") + public ResponseMessage readMessage(@PathVariable String id) { + return messageEntityService.readMessage(id); + } + +} diff --git a/adc-da-report/src/main/java/com/adc/da/report/controller/ReportLogBookController.java b/adc-da-report/src/main/java/com/adc/da/report/controller/ReportLogBookController.java index 0759e92..5c9179e 100644 --- a/adc-da-report/src/main/java/com/adc/da/report/controller/ReportLogBookController.java +++ b/adc-da-report/src/main/java/com/adc/da/report/controller/ReportLogBookController.java @@ -133,7 +133,7 @@ public class ReportLogBookController { * @return com.adc.da.util.http.ResponseMessage * @author bu * @date 2023-05-08 - * @description 根据报告id和当前登录用户id获取点赞数 + * @description 根据报告id和当前登录用户id点赞或取消点赞 */ @GetMapping("/thumbUpOrDown") @ApiOperation(value = "点赞或者取消点赞") @@ -144,4 +144,20 @@ public class ReportLogBookController { return Result.success(result); } + /** + * @param reportId + * @return com.adc.da.util.http.ResponseMessage + * @author bu + * @date 2023-05-08 + * @description 根据报告id和当前登录用户id点赞或取消点赞 + */ + @GetMapping("/collectOrCancelCollect") + @ApiOperation(value = "收藏或取消收藏") + public ResponseMessage collectOrCancelCollect(String reportId){ + + //根据报告id和当前登录用户id获取点赞数 + return reportLogBookService.collectOrCancelCollect(reportId); + + } + } 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 4ffa9b5..fd53514 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 @@ -3,12 +3,10 @@ package com.adc.da.report.controller; import cn.hutool.core.util.StrUtil; import com.adc.da.login.util.UserUtils; import com.adc.da.report.annotation.ReportLog; +import com.adc.da.report.constant.ReportConstants; 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.LogEntity; -import com.adc.da.report.eo.ReportEntity; -import com.adc.da.report.eo.ReportLogBook; +import com.adc.da.report.eo.*; import com.adc.da.report.service.IFileService; import com.adc.da.report.service.ILogService; import com.adc.da.report.service.IReportService; @@ -16,17 +14,21 @@ import com.adc.da.report.util.LocalFileUtil; import com.adc.da.report.util.OSSClientUtil; import com.adc.da.report.util.ObsBootUtil; import com.adc.da.report.util.WaterMarkUtil; +import com.adc.da.report.vo.ChangeUploaderVo; +import com.adc.da.report.vo.ReportFilePageVO; import com.adc.da.report.vo.ReportQueryVo; import com.adc.da.report.vo.ReportVo; import com.adc.da.util.exception.AdcDaBaseException; import com.adc.da.util.http.ResponseMessage; import com.adc.da.util.http.Result; +import com.adc.da.util.utils.CollectionUtils; import com.adc.da.util.utils.FileUtil; import com.adc.da.util.utils.StringUtils; 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; +import io.swagger.annotations.ApiParam; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; @@ -38,12 +40,14 @@ import org.springframework.web.multipart.MultipartFile; import javax.annotation.Resource; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; +import javax.validation.Valid; import java.io.*; -import java.net.URISyntaxException; import java.net.URLEncoder; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.*; +import java.util.zip.ZipEntry; +import java.util.zip.ZipOutputStream; import static com.adc.da.report.constant.ReportConstants.FILE_EXTENSIONS_PDF; @@ -186,6 +190,30 @@ public class ReportManageConroller { return Result.success(list); } + /** + * 修改上传人 + * @param changeUploaderVo + * @return + * @throws Exception + */ + @ApiOperation("修改上传人") + @PostMapping("/changeUploader") + public ResponseMessage changeUploader(@Valid @RequestBody ChangeUploaderVo changeUploaderVo) { + return reportService.changeUploader(changeUploaderVo); + } + + /** + * 报告管理列表 + * @param vo + * @return + * @throws Exception + */ + @ApiOperation("报告管理列表") + @PostMapping("/myCollectPage") + public ResponseMessage myCollectPage(@RequestBody ReportQueryVo vo) throws Exception { + IPage list = reportService.myCollectPage(vo); + return Result.success(list); + } /** @@ -231,19 +259,27 @@ public class ReportManageConroller { /** * 获取报告预览 - * @param id + * @param reportId + * @param fileId * @return */ @ApiOperation("获取报告预览") - @GetMapping("/getReportHtml/{id}") - public ResponseMessage getReportHtml(@PathVariable("id") String id) { - String html = reportService.reportHtml(id); + @GetMapping("/getReportHtml") + public ResponseMessage getReportHtml(@RequestParam String reportId, @RequestParam String fileId) { + //判断要预览的是不是excel文件 + FileEntity file = fileService.getFile(fileId); + String fileType = file.getFileType(); + if (ReportConstants.FILE_EXTENSIONS_XLS.equalsIgnoreCase(fileType) || ReportConstants.FILE_EXTENSIONS_XLSX.equalsIgnoreCase(fileType)) { + return Result.error("无法预览excel文件"); + } + + String html = reportService.reportHtml(reportId, fileId); Map map = new HashMap<>(); map.put("content", html); ReportLogBook reportLog = new ReportLogBook(); reportLog.setId(UUID.randomUUID().toString().replaceAll("-","")); - reportLog.setReportId(id); + reportLog.setReportId(reportId); reportLog.setType(1); reportLog.setUpdateTime(new Date()); reportLog.setUserId(UserUtils.getUserId()); @@ -284,31 +320,6 @@ public class ReportManageConroller { return Result.success(); } - // TODO 测试完不需要的代码请删掉,然后再把这个TODO也删掉 - /** - * 测试 - */ - @ApiOperation("testtest") - @GetMapping("/test") - @Deprecated - public void ttt() { - stringRedisTemplate.boundValueOps("1121212").set("1212"); - - } - - // TODO 测试完不需要的代码请删掉,然后再把这个TODO也删掉 - @ApiOperation("testPath") - @GetMapping("/testPath") - @Deprecated - public ResponseMessage testPath() throws URISyntaxException { - HashMap pathMap = new HashMap<>(); - String jarPath = new File(getClass().getProtectionDomain().getCodeSource().getLocation().toURI().getPath()).getParentFile().getPath(); - String property = System.getProperty("user.dir"); - pathMap.put("jarpath", jarPath); - pathMap.put("propertyPath", property); - return Result.success(pathMap); - } - /** * 获取文件名 * @param fileId @@ -330,57 +341,24 @@ public class ReportManageConroller { @ApiOperation(value = "详情||上传文件") @PostMapping("/uploadFile") public ResponseMessage> uploadFile(MultipartFile file) throws IOException { - Map resultMap = new HashMap(); - //上传路径 - //此路径映射到localhost - String path = uploadFile; - String realName = file.getOriginalFilename(); - Date now = new Date(); - SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMddHHmmss"); - String date = dateFormat.format(now); - Random r = new Random(); - String num = ""; - for (int i = 0; i < 3; i++) { - int s = r.nextInt(10); - num += String.valueOf(s); - } - - //获取上传文件名 - String fileName = file.getOriginalFilename(); - String contentType = file.getContentType(); - String ext = fileName.substring(fileName.lastIndexOf(".") + 1); - fileName = fileName.substring(0, fileName.lastIndexOf("."))+date + num + "." + ext; - log.info("fileName>>" + fileName); - try{ - String result=""; - // 上传方式:阿里云:alioss 华为云:hwobs - if ("hwobs".equals(uploadType)){ - result = obsBootUtil.upload(file, fileName); - }else if ("alioss".equals(uploadType)) { - result = ossClientUtil.uploadFile2OSS(file.getInputStream(),fileName); - }else if ("local".equals(uploadType)) { - localFileUtil.saveFile(file.getInputStream(), fileName); - } - resultMap.put("key", date + num); - resultMap.put("value", path + "//" + fileName); - resultMap.put("name", realName); - } - catch (Exception e){ - log.error(e.getMessage(),e); - } - FileEntity entity = new FileEntity(); - entity.setContentType(contentType); - entity.setCreateTime(new Date()); - entity.setFileName(realName); - entity.setFileType(ext); - entity.setFileSize(String.valueOf(file.getSize())); - entity.setFileId(date + num); - entity.setSavePath(fileName); - fileService.addFile(entity); + Map resultMap = fileService.uploadFile(file); return Result.success(resultMap); } + /** + * 批量上传文件 + * @param files + * @return + * @throws IOException + */ + @ApiOperation(value = "批量上传文件") + @PostMapping("/batchUploadFile") + public ResponseMessage>> batchUploadFile(@RequestParam("files") @ApiParam(value="上传文件",required=true) MultipartFile[] files) throws IOException { + List> uploadFile = fileService.batchUploadFile(files); + return Result.success(uploadFile); + } + /** * 上传图片 * @param file @@ -452,105 +430,319 @@ 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); -// } -// } - /** - * 下载文件 + * 下载文件(禁止下载Excel) * @param response - * @param fileId + * @param fileIds * @throws IOException */ - @ApiOperation(value = "|下载文件") + @ApiOperation(value = "下载文件(禁止下载Excel)") @GetMapping("/download") - public void downloadPic(HttpServletResponse response, String fileId,String repostId) throws IOException { + public void download(HttpServletResponse response, String[] fileIds, String reportId) throws IOException { + List fileIdList = new ArrayList<>(); + if (CollectionUtils.isNotEmpty(fileIds)) { + fileIdList = Arrays.asList(fileIds); + } - if (StrUtil.isNotBlank(repostId)) { + if (StrUtil.isBlank(reportId)) { + throw new AdcDaBaseException("缺少报告id"); + } + + if (StrUtil.isNotBlank(reportId)) { //校验权限 - if (!reportService.isAllowDownload(UserUtils.getUserId(), repostId)) { + if (!reportService.isAllowDownload(UserUtils.getUserId(), reportId)) { throw new AdcDaBaseException("无此报告下载权限"); } } - 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"); + //待下载的文件id List + List downLoadFileIds; + String reportName = reportDao.selectById(reportId).getName(); + String folderName = reportName + ".zip"; + // 获取编码后的文件名 + String encodedZipName = URLEncoder.encode(folderName, "UTF-8"); - //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); + //判断是从列表页面下载 还是预览页面下载 + if (CollectionUtils.isEmpty(fileIdList)) { + //列表点击下载按钮 + downLoadFileIds = fileService.getDownloadFileIdsWithoutExcel(reportId); + if (CollectionUtils.isEmpty(downLoadFileIds)) { + log.info("无法下载,原因可能是无可下载文件(xls/xlsx文件无法下载)"); + try { + // 设置响应头信息 + response.setContentType("application/zip"); + response.setHeader("Content-Disposition", "attachment; filename=" + encodedZipName); + response.setHeader("Content-Transfer-Encoding", "binary"); + response.setHeader("Pragma", "public"); + response.setHeader("Cache-Control", "no-store"); + response.setHeader("Expires", "0"); - } 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); + // 创建空的ZipOutputStream + ZipOutputStream zipOutputStream = new ZipOutputStream(response.getOutputStream()); + // 添加空文件夹条目 + ZipEntry emptyDirectoryEntry = new ZipEntry(reportName + "/"); + zipOutputStream.putNextEntry(emptyDirectoryEntry); + zipOutputStream.close(); + return; + } catch (IOException e) { + e.printStackTrace(); } } - - } catch (Exception ex) { - log.info(ex.getMessage(),ex); + } else { + //检测是否要下载Excel文件 + if (fileService.hasExcelFileId(fileIdList)) { + throw new AdcDaBaseException("不可以下载Excel文件"); + } + //预览点击下载按钮 + downLoadFileIds = fileIdList; } - if (StringUtils.isNotEmpty(repostId)){ + + //如果只下载一个文件,则不压缩 + if (downLoadFileIds.size() == 1) { + String fileId = downLoadFileIds.get(0); + try { + FileEntity entity = fileService.getFile(fileId); + String fileName = entity.getFileName(); + // 获取编码后的文件名 + String encodedFileName = URLEncoder.encode(fileName, "UTF-8"); + response.setHeader("Content-Disposition", "attachment;filename=" + encodedFileName); + + //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.addWatermarkToPdfAndWriteToResponse(new FileInputStream(path), response); + outputStream.close(); + } 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) { + log.info(ex.getMessage(),ex); + } + } else { + List filePaths = new ArrayList<>(); + // 设置响应头信息 + response.setContentType("application/zip"); + response.setHeader("Content-Disposition", "attachment; filename=" + encodedZipName); + response.setHeader("Content-Transfer-Encoding", "binary"); + response.setHeader("Pragma", "public"); + response.setHeader("Cache-Control", "no-store"); + response.setHeader("Expires", "0"); + + for (String fileId : downLoadFileIds) { + try { + FileEntity entity = fileService.getFile(fileId); + String fileName = entity.getFileName(); + + String path = uploadFile + entity.getSavePath(); + FileOutputStream outputStream = new FileOutputStream(path); + filePaths.add(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); + } + //PDF文件需要加水印 + if (FILE_EXTENSIONS_PDF.equalsIgnoreCase(FileUtil.getFileExtension(fileName))) { + waterMarkUtil.savePdfToFile(new FileInputStream(path), path); + } + outputStream.close(); + } catch (Exception ex) { + log.info(ex.getMessage(),ex); + } + } + //将文件压缩 写入Response + localFileUtil.compressFiles(filePaths, response); + } + + if (StringUtils.isNotEmpty(reportId)){ ReportLogBook reportLog = new ReportLogBook(); reportLog.setId(UUID.randomUUID().toString().replaceAll("-","")); - reportLog.setReportId(repostId); + reportLog.setReportId(reportId); reportLog.setType(2); reportLog.setUpdateTime(new Date()); reportLog.setUserId(UserUtils.getUserId()); reportLogBookDao.insert(reportLog); //报告日志管理 - ReportEntity reportEntity = reportDao.selectById(repostId); + ReportEntity reportEntity = reportDao.selectById(reportId); + reportLog(reportEntity.getName(),"下载"); + } + } + + /** + * 下载文件 + * @param response + * @param fileIds + * @throws IOException + */ + @ApiOperation(value = "下载文件") + @GetMapping("/downloadAll") + public void downloadAll(HttpServletResponse response, String[] fileIds, String reportId) throws IOException { + List fileIdList = new ArrayList<>(); + if (CollectionUtils.isNotEmpty(fileIds)) { + fileIdList = Arrays.asList(fileIds); + } + + if (StrUtil.isBlank(reportId)) { + throw new AdcDaBaseException("缺少报告id"); + } + + if (StrUtil.isNotBlank(reportId)) { + //校验权限 + if (!reportService.isAllowDownload(UserUtils.getUserId(), reportId)) { + throw new AdcDaBaseException("无此报告下载权限"); + } + } + + //待下载的文件id List + List downLoadFileIds; + String reportName = reportDao.selectById(reportId).getName(); + String folderName = reportName + ".zip"; + // 获取编码后的文件名 + String encodedZipName = URLEncoder.encode(folderName, "UTF-8"); + + //判断是从列表页面下载 还是预览页面下载 + if (CollectionUtils.isEmpty(fileIdList)) { + //列表点击下载按钮 + downLoadFileIds = fileService.getDownloadFileIds(reportId); + if (CollectionUtils.isEmpty(downLoadFileIds)) { + try { + // 设置响应头信息 + response.setContentType("application/zip"); + response.setHeader("Content-Disposition", "attachment; filename=" + encodedZipName); + response.setHeader("Content-Transfer-Encoding", "binary"); + response.setHeader("Pragma", "public"); + response.setHeader("Cache-Control", "no-store"); + response.setHeader("Expires", "0"); + + // 创建空的ZipOutputStream + ZipOutputStream zipOutputStream = new ZipOutputStream(response.getOutputStream()); + // 添加空文件夹条目 + ZipEntry emptyDirectoryEntry = new ZipEntry(reportName + "/"); + zipOutputStream.putNextEntry(emptyDirectoryEntry); + zipOutputStream.close(); + return; + } catch (IOException e) { + e.printStackTrace(); + } + } + } else { + //预览点击下载按钮 + downLoadFileIds = fileIdList; + } + + //如果只下载一个文件,则不压缩 + if (downLoadFileIds.size() == 1) { + String fileId = downLoadFileIds.get(0); + try { + FileEntity entity = fileService.getFile(fileId); + String fileName = entity.getFileName(); + // 获取编码后的文件名 + String encodedFileName = URLEncoder.encode(fileName, "UTF-8"); + response.setHeader("Content-Disposition", "attachment;filename=" + encodedFileName); + + //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.addWatermarkToPdfAndWriteToResponse(new FileInputStream(path), response); + outputStream.close(); + } 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) { + log.info(ex.getMessage(),ex); + } + } else { + List filePaths = new ArrayList<>(); + // 设置响应头信息 + response.setContentType("application/zip"); + response.setHeader("Content-Disposition", "attachment; filename=" + encodedZipName); + response.setHeader("Content-Transfer-Encoding", "binary"); + response.setHeader("Pragma", "public"); + response.setHeader("Cache-Control", "no-store"); + response.setHeader("Expires", "0"); + + for (String fileId : downLoadFileIds) { + try { + FileEntity entity = fileService.getFile(fileId); + String fileName = entity.getFileName(); + + String path = uploadFile + entity.getSavePath(); + FileOutputStream outputStream = new FileOutputStream(path); + filePaths.add(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); + } + //PDF文件需要加水印 + if (FILE_EXTENSIONS_PDF.equalsIgnoreCase(FileUtil.getFileExtension(fileName))) { + waterMarkUtil.savePdfToFile(new FileInputStream(path), path); + } + outputStream.close(); + } catch (Exception ex) { + log.info(ex.getMessage(),ex); + } + } + //将文件压缩 写入Response + localFileUtil.compressFiles(filePaths, response); + } + + if (StringUtils.isNotEmpty(reportId)){ + ReportLogBook reportLog = new ReportLogBook(); + reportLog.setId(UUID.randomUUID().toString().replaceAll("-","")); + reportLog.setReportId(reportId); + reportLog.setType(2); + reportLog.setUpdateTime(new Date()); + reportLog.setUserId(UserUtils.getUserId()); + reportLogBookDao.insert(reportLog); + + //报告日志管理 + ReportEntity reportEntity = reportDao.selectById(reportId); reportLog(reportEntity.getName(),"下载"); } } @@ -593,4 +785,39 @@ public class ReportManageConroller { return Result.success(act); } + /** + * 删除文件 + * @return + * @throws ParseException + */ + @ApiOperation("删除文件") + @PostMapping("/delFile") + public ResponseMessage delFile(@RequestBody ReportFile reportFile) throws Exception { + reportService.delFile(reportFile); + return Result.success(); + } + + /** + * 文件分页查询 + * @return + * @throws ParseException + */ + @ApiOperation("文件分页查询") + @PostMapping("/filePage") + public ResponseMessage filePage(@RequestBody ReportFilePageVO reportFilePageVO) throws Exception { + IPage reportFileIPage = reportService.filePage(reportFilePageVO); + return Result.success(reportFileIPage); + } + + /** + * 刷新报告内容表,对比报告内容和报告表的差异,找到没有抽取过内容的报告,生成其内容放入报告内容表中 + * @return + * @throws ParseException + */ + @ApiOperation("刷新报告内容表") + @GetMapping("/refreshReportContent") + public ResponseMessage refreshReportContent() { + return reportService.refreshReportContent(); + } + } diff --git a/adc-da-report/src/main/java/com/adc/da/report/dao/mysql/FileDao.java b/adc-da-report/src/main/java/com/adc/da/report/dao/mysql/FileDao.java index 74087c8..e23d177 100644 --- a/adc-da-report/src/main/java/com/adc/da/report/dao/mysql/FileDao.java +++ b/adc-da-report/src/main/java/com/adc/da/report/dao/mysql/FileDao.java @@ -3,9 +3,15 @@ package com.adc.da.report.dao.mysql; import com.adc.da.report.eo.FileEntity; import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import java.util.List; + /** * @Author doudxw * @Date 2021/6/28 15:19 */ public interface FileDao extends BaseMapper { + + List getDownloadFileIdsWithoutExcel(String reportId); + + List getDownloadFileIds(String reportId); } diff --git a/adc-da-report/src/main/java/com/adc/da/report/dao/mysql/MessageDao.java b/adc-da-report/src/main/java/com/adc/da/report/dao/mysql/MessageDao.java new file mode 100644 index 0000000..c0ad01a --- /dev/null +++ b/adc-da-report/src/main/java/com/adc/da/report/dao/mysql/MessageDao.java @@ -0,0 +1,30 @@ +package com.adc.da.report.dao.mysql; + +import com.adc.da.report.eo.MessageEntity; +import com.adc.da.report.vo.MessageQueryVo; +import com.adc.da.report.vo.MessageVo; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import org.apache.ibatis.annotations.Param; + +/** +* @author ThinkBook +* @description 针对表【ts_message】的数据库操作Mapper +* @createDate 2023-05-23 11:22:15 +* @Entity com.adc.da.report.eo.MessageEntityEntity +*/ +public interface MessageDao extends BaseMapper { + + /** + * 根据当前用户展示站内信列表 + * @param page + * @param messageVo + * @param userId + * @return + */ + IPage listByUser(IPage page, @Param("vo") MessageQueryVo messageVo, @Param("userId") String userId); +} + + + + diff --git a/adc-da-report/src/main/java/com/adc/da/report/dao/mysql/ReportDao.java b/adc-da-report/src/main/java/com/adc/da/report/dao/mysql/ReportDao.java index 44c8ca8..3519ec6 100644 --- a/adc-da-report/src/main/java/com/adc/da/report/dao/mysql/ReportDao.java +++ b/adc-da-report/src/main/java/com/adc/da/report/dao/mysql/ReportDao.java @@ -48,6 +48,8 @@ public interface ReportDao extends BaseMapper { */ IPage page(IPage page, @Param("pageVO") ReportQueryVo vo, @Param("idSet") Set idSet); + IPage myCollectPage(IPage page, @Param("pageVO") ReportQueryVo vo, @Param("idSet") Set idSet, @Param("collectReportIds") List collectReportIds); + /** * 报告列表 * diff --git a/adc-da-report/src/main/java/com/adc/da/report/dao/mysql/ReportFileDao.java b/adc-da-report/src/main/java/com/adc/da/report/dao/mysql/ReportFileDao.java new file mode 100644 index 0000000..feb115c --- /dev/null +++ b/adc-da-report/src/main/java/com/adc/da/report/dao/mysql/ReportFileDao.java @@ -0,0 +1,22 @@ +package com.adc.da.report.dao.mysql; + +import com.adc.da.report.eo.ReportFile; +import com.adc.da.report.vo.ReportFilePageVO; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +public interface ReportFileDao extends BaseMapper { + + void delByReportId(@Param("pageVO") ReportFile reportFile); + + void actEndDelReport(@Param("reportId")String reportId); + + void updateState(@Param("reportId")String dataId); + + List selectByReport(@Param("pageVO")ReportFile reportFile); + + IPage filePage(IPage page,@Param("pageVO") ReportFilePageVO reportFilePageVO); +} diff --git a/adc-da-report/src/main/java/com/adc/da/report/dao/mysql/ReportLabelDao.java b/adc-da-report/src/main/java/com/adc/da/report/dao/mysql/ReportLabelDao.java index 59ffc96..fc73ffe 100644 --- a/adc-da-report/src/main/java/com/adc/da/report/dao/mysql/ReportLabelDao.java +++ b/adc-da-report/src/main/java/com/adc/da/report/dao/mysql/ReportLabelDao.java @@ -2,6 +2,7 @@ package com.adc.da.report.dao.mysql; import com.adc.da.report.eo.ReportLabelEntity; import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.apache.ibatis.annotations.Param; /** * @author ThinkBook @@ -11,6 +12,9 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; */ public interface ReportLabelDao extends BaseMapper { + void actEndDelReport(@Param("reportId")String dataId); + + void updateState(@Param("reportId")String dataId); } diff --git a/adc-da-report/src/main/java/com/adc/da/report/dao/mysql/TreeLabelDao.java b/adc-da-report/src/main/java/com/adc/da/report/dao/mysql/TreeLabelDao.java index f96fd9d..8701748 100644 --- a/adc-da-report/src/main/java/com/adc/da/report/dao/mysql/TreeLabelDao.java +++ b/adc-da-report/src/main/java/com/adc/da/report/dao/mysql/TreeLabelDao.java @@ -2,6 +2,7 @@ package com.adc.da.report.dao.mysql; import com.adc.da.report.eo.TreeLabelEntity; import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.apache.ibatis.annotations.Param; import java.util.List; @@ -20,7 +21,7 @@ public interface TreeLabelDao extends BaseMapper { */ double getMaxNum(String parentId); - List selectIdByReport(String reportId); + List selectIdByReport(@Param("reportId") String reportId,@Param("state") Integer state); } diff --git a/adc-da-report/src/main/java/com/adc/da/report/dao/mysql/UserMessageDao.java b/adc-da-report/src/main/java/com/adc/da/report/dao/mysql/UserMessageDao.java new file mode 100644 index 0000000..fc37a79 --- /dev/null +++ b/adc-da-report/src/main/java/com/adc/da/report/dao/mysql/UserMessageDao.java @@ -0,0 +1,18 @@ +package com.adc.da.report.dao.mysql; + +import com.adc.da.report.eo.UserMessageEntity; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** +* @author ThinkBook +* @description 针对表【ts_user_message】的数据库操作Mapper +* @createDate 2023-05-23 11:30:04 +* @Entity com.adc.da.report.eo.UserMessage +*/ +public interface UserMessageDao extends BaseMapper { + +} + + + + diff --git a/adc-da-report/src/main/java/com/adc/da/report/eo/MessageEntity.java b/adc-da-report/src/main/java/com/adc/da/report/eo/MessageEntity.java new file mode 100644 index 0000000..cce9217 --- /dev/null +++ b/adc-da-report/src/main/java/com/adc/da/report/eo/MessageEntity.java @@ -0,0 +1,70 @@ +package com.adc.da.report.eo; + +import com.adc.da.report.constant.MessageTypeEnum; +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_message + */ +@TableName(value ="ts_message") +@Data +@NoArgsConstructor +@AllArgsConstructor +@Accessors(chain = true) +public class MessageEntity implements Serializable { + /** + * 主键id + */ + @TableId(value = "id") + private String id; + + /** + * 标题 + */ + @TableField(value = "message_title") + private String messageTitle; + + /** + * 内容 + */ + @TableField(value = "content") + private String content; + + /** + * 消息类型 + */ + @TableField(value = "message_type") + private Integer messageType; + + /** + * 发布人 + */ + @TableField(value = "createUser") + private String createUser; + + /** + * 发布时间 + */ + @TableField(value = "createDate") + private Date createDate; + + /** + * 删除标记(0未删除 1已删除) + */ + @TableField(value = "del_flag") + private Integer delFlag; + + @TableField(exist = false) + private static final long serialVersionUID = 1314298673425876932L; +} \ No newline at end of file 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 0fedacb..d34b4d2 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 @@ -35,6 +35,12 @@ public class ReportContentEntity implements Serializable { @TableField(value = "report_id") private String reportId; + /** + * 报告id + */ + @TableField(value = "file_ids") + private String fileIds; + /** * 文件内容 */ diff --git a/adc-da-report/src/main/java/com/adc/da/report/eo/ReportEntity.java b/adc-da-report/src/main/java/com/adc/da/report/eo/ReportEntity.java index 222990a..8dea718 100644 --- a/adc-da-report/src/main/java/com/adc/da/report/eo/ReportEntity.java +++ b/adc-da-report/src/main/java/com/adc/da/report/eo/ReportEntity.java @@ -68,7 +68,7 @@ public class ReportEntity { /** * 文件id */ - @TableField("fileId") + @TableField(exist = false) private String fileId; /** @@ -109,4 +109,7 @@ public class ReportEntity { @TableField(exist = false) private List> labelList; + + @TableField(exist = false) + private List fileList; } diff --git a/adc-da-report/src/main/java/com/adc/da/report/eo/ReportFile.java b/adc-da-report/src/main/java/com/adc/da/report/eo/ReportFile.java new file mode 100644 index 0000000..b2d049c --- /dev/null +++ b/adc-da-report/src/main/java/com/adc/da/report/eo/ReportFile.java @@ -0,0 +1,52 @@ +package com.adc.da.report.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 lombok.Data; + +import java.util.List; + +@Data +@TableName("TS_REPORT_FILE") +public class ReportFile { + + @TableId(value = "id",type = IdType.INPUT) + private String id; + + @TableField("report_id") + private String reportId; + + @TableField("file_id") + private String fileId; + + /** + * 状态 1 流程中 ,2 非流程中 + */ + @TableField("state") + private Integer state; + + + + + @TableField(exist = false) + private List rfIdList; + + @TableField(exist = false) + private String fileName; + + + + public ReportFile(String reportId){ + this.reportId = reportId; + } + public ReportFile(String reportId,Integer state){ + this.reportId = reportId; + this.state = state; + } + + public ReportFile(){ + + } +} 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 1609c06..4642098 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 @@ -4,13 +4,13 @@ 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; import lombok.experimental.Accessors; +import java.io.Serializable; + /** * @author Caihaohan * @TableName ts_report_label @@ -46,12 +46,19 @@ public class ReportLabelEntity implements Serializable { @TableField(value = "last_label") private String lastLabel; + /** + * 状态 1 流程中 ,2 非流程中 + */ + @TableField("state") + private Integer state; + @TableField(exist = false) private static final long serialVersionUID = 121348721347890417L; - public ReportLabelEntity(String id, String reportId, String labelId) { + public ReportLabelEntity(String id, String reportId, String labelId,Integer state) { this.id = id; this.reportId = reportId; this.labelId = labelId; + this.state = state; } } \ No newline at end of file diff --git a/adc-da-report/src/main/java/com/adc/da/report/eo/TtReportManageAct.java b/adc-da-report/src/main/java/com/adc/da/report/eo/TtReportManageAct.java index e6fa1af..b225e12 100644 --- a/adc-da-report/src/main/java/com/adc/da/report/eo/TtReportManageAct.java +++ b/adc-da-report/src/main/java/com/adc/da/report/eo/TtReportManageAct.java @@ -94,7 +94,7 @@ public class TtReportManageAct { /** * 文件id */ - @TableField("fileId") + @TableField(exist = false) private String fileId; @@ -128,10 +128,16 @@ public class TtReportManageAct { @TableField("secrecy_last") private Date secrecyLast; - @TableField("file_name") + @TableField(exist = false) + private String rfId; + + @TableField(exist = false) private String fileName; @TableField(exist = false) private List labelList; + @TableField(exist = false) + private List fileList; + } diff --git a/adc-da-report/src/main/java/com/adc/da/report/eo/UserMessageEntity.java b/adc-da-report/src/main/java/com/adc/da/report/eo/UserMessageEntity.java new file mode 100644 index 0000000..76131e3 --- /dev/null +++ b/adc-da-report/src/main/java/com/adc/da/report/eo/UserMessageEntity.java @@ -0,0 +1,56 @@ +package com.adc.da.report.eo; + +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; +import lombok.experimental.Accessors; + +/** + * + * @author ThinkBook + * @TableName ts_user_message + */ +@TableName(value ="ts_user_message") +@Data +@NoArgsConstructor +@AllArgsConstructor +@Accessors(chain = true) +public class UserMessageEntity implements Serializable { + /** + * 主键id + */ + @TableId(value = "id") + private String id; + + /** + * 用户id + */ + @TableField(value = "user_id") + private String userId; + + /** + * 站内信id + */ + @TableField(value = "message_id") + private String messageId; + + /** + * 阅读状态(0代表未读,1代表已读) + */ + @TableField(value = "read_type") + private Integer readType; + + /** + * 删除标记(0未删除 1已删除) + */ + @TableField(value = "del_flag") + private Integer delFlag; + + @TableField(exist = false) + private static final long serialVersionUID = 1L; +} \ No newline at end of file diff --git a/adc-da-report/src/main/java/com/adc/da/report/service/IFileService.java b/adc-da-report/src/main/java/com/adc/da/report/service/IFileService.java index c220c44..b333895 100644 --- a/adc-da-report/src/main/java/com/adc/da/report/service/IFileService.java +++ b/adc-da-report/src/main/java/com/adc/da/report/service/IFileService.java @@ -2,6 +2,10 @@ package com.adc.da.report.service; import com.adc.da.report.eo.FileEntity; +import org.springframework.web.multipart.MultipartFile; + +import java.util.List; +import java.util.Map; /** * @Author doudxw @@ -22,4 +26,26 @@ public interface IFileService { */ FileEntity getFile(String fileId); + List> batchUploadFile(MultipartFile[] files); + + /** + * 判断传进来的fileIds里有没有Excel的fileId + * @param fileIds + * @return + */ + boolean hasExcelFileId(List fileIds); + + /** + * 根据报告id返回所有可以下载的文件id(不要excel的) + */ + List getDownloadFileIdsWithoutExcel(String reportId); + + /** + * 根据报告id返回所有可以下载的文件id + * @param reportId + * @return + */ + List getDownloadFileIds(String reportId); + + Map uploadFile(MultipartFile file); } diff --git a/adc-da-report/src/main/java/com/adc/da/report/service/IMessageService.java b/adc-da-report/src/main/java/com/adc/da/report/service/IMessageService.java new file mode 100644 index 0000000..fbdbdaa --- /dev/null +++ b/adc-da-report/src/main/java/com/adc/da/report/service/IMessageService.java @@ -0,0 +1,43 @@ +package com.adc.da.report.service; + +import com.adc.da.report.eo.MessageEntity; +import com.adc.da.report.vo.MessageQueryVo; +import com.adc.da.util.http.ResponseMessage; +import com.baomidou.mybatisplus.extension.service.IService; + +import java.util.List; + +/** +* @author ThinkBook +* @description 针对表【ts_message】的数据库操作Service +* @createDate 2023-05-23 11:22:15 +*/ +public interface IMessageService extends IService { + + /** + * 返回当前用户的消息列表 + * @return + */ + ResponseMessage listByCurrentUser(MessageQueryVo messageVo); + + /** + * 全部已读接口 + * @return + */ + ResponseMessage allRead(); + + /** + * 发布站内信(当用户数过多的时候谨慎使用发送给全部用户) + * @param message + * @param toAllUser + * @param userIds + */ + void publishMessage(MessageEntity message, boolean toAllUser, List userIds); + + /** + * 查看站内信设置为已读 + * @param messageId + * @return + */ + ResponseMessage readMessage(String messageId); +} diff --git a/adc-da-report/src/main/java/com/adc/da/report/service/IReportContentService.java b/adc-da-report/src/main/java/com/adc/da/report/service/IReportContentService.java index 37ce02d..1835b17 100644 --- a/adc-da-report/src/main/java/com/adc/da/report/service/IReportContentService.java +++ b/adc-da-report/src/main/java/com/adc/da/report/service/IReportContentService.java @@ -3,7 +3,6 @@ package com.adc.da.report.service; import com.adc.da.report.eo.ReportContentEntity; import com.baomidou.mybatisplus.extension.service.IService; -import java.io.FileNotFoundException; import java.io.IOException; /** @@ -18,7 +17,12 @@ public interface IReportContentService extends IService { * 插入报告内容表 * * @param reportId 报告id - * @param fileId 文件id */ - void insertReportContent(String reportId, String fileId) throws IOException; + void insertReportContent(String reportId) throws IOException; + + /** + * 根据报告id删除记录 + * @param reportId + */ + void removeByReportId(String reportId); } diff --git a/adc-da-report/src/main/java/com/adc/da/report/service/IReportFileService.java b/adc-da-report/src/main/java/com/adc/da/report/service/IReportFileService.java new file mode 100644 index 0000000..260a802 --- /dev/null +++ b/adc-da-report/src/main/java/com/adc/da/report/service/IReportFileService.java @@ -0,0 +1,11 @@ +package com.adc.da.report.service; + + +import com.adc.da.report.eo.ReportFile; +import com.baomidou.mybatisplus.extension.service.IService; + +public interface IReportFileService extends IService { + + + +} diff --git a/adc-da-report/src/main/java/com/adc/da/report/service/IReportLogBookService.java b/adc-da-report/src/main/java/com/adc/da/report/service/IReportLogBookService.java index 3f72548..153fdd7 100644 --- a/adc-da-report/src/main/java/com/adc/da/report/service/IReportLogBookService.java +++ b/adc-da-report/src/main/java/com/adc/da/report/service/IReportLogBookService.java @@ -4,6 +4,7 @@ import com.adc.da.report.eo.ReportLogBook; import com.adc.da.report.vo.DeleteParamRequestVO; import com.adc.da.report.vo.ReportDetailThumbUpVo; import com.adc.da.report.vo.ReportLogPageVO; +import com.adc.da.util.http.ResponseMessage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import java.util.List; @@ -64,6 +65,13 @@ public interface IReportLogBookService { */ Integer getPreviewCount(String reportId); + /** + * 获取收藏量 + * @param reportId + * @return + */ + Integer getCollectCount(String reportId); + /** * 获取点赞量 * @param reportId @@ -71,4 +79,17 @@ public interface IReportLogBookService { */ Integer getThumbUpCount(String reportId); + /** + * 收藏或取消收藏 + * @param reportId + * @return + */ + ResponseMessage collectOrCancelCollect(String reportId); + + /** + * 根据用户id获取所有报告id + * @param userId + * @return + */ + List getCollectReportIdByUser(String userId); } 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 82b67fc..bd9dcf8 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 @@ -1,6 +1,9 @@ package com.adc.da.report.service; import com.adc.da.report.eo.ReportEntity; +import com.adc.da.report.eo.ReportFile; +import com.adc.da.report.vo.ChangeUploaderVo; +import com.adc.da.report.vo.ReportFilePageVO; import com.adc.da.report.vo.ReportQueryVo; import com.adc.da.report.vo.ReportVo; import com.adc.da.util.http.ResponseMessage; @@ -40,15 +43,33 @@ public interface IReportService { /** * 获取报告htmlString - * @param id + * @param reportId + * @param fileId * @return */ - String reportHtml(String id); + String reportHtml(String reportId, String fileId); IPage addReportPage(ReportQueryVo vo) throws Exception; + /** + * 报告查询页面列表接口 + * @param vo + * @return + */ IPage page(ReportQueryVo vo); + /** + * 我的收藏页面列表接口 + * @param vo + * @return + */ + IPage myCollectPage(ReportQueryVo vo); + + /** + * 报告管理页面列表接口 + * @param vo + * @return + */ IPage reportManagerPage(ReportQueryVo vo); List isAct(ReportQueryVo vo); @@ -78,5 +99,30 @@ public interface IReportService { */ Boolean isAllowDownload(String userId, String repostId); + /** + * 判断用户是否允许修改上传人 + * + * @param userId 用户id + * @return 是否有修改上传人的权限 + */ + Boolean isAllowChangeUploader(String userId); + void addOrUpdate(ReportEntity reportEntity); + + /** + * 更改上传人 + * @param changeUploaderVo + * @return + */ + ResponseMessage changeUploader(ChangeUploaderVo changeUploaderVo); + + void delFile(ReportFile reportFile); + + IPage filePage(ReportFilePageVO ReportFilePageVO); + + /** + * 刷新报告内容 + * @return + */ + ResponseMessage refreshReportContent(); } diff --git a/adc-da-report/src/main/java/com/adc/da/report/service/IUserMessageService.java b/adc-da-report/src/main/java/com/adc/da/report/service/IUserMessageService.java new file mode 100644 index 0000000..53500ef --- /dev/null +++ b/adc-da-report/src/main/java/com/adc/da/report/service/IUserMessageService.java @@ -0,0 +1,13 @@ +package com.adc.da.report.service; + +import com.adc.da.report.eo.UserMessageEntity; +import com.baomidou.mybatisplus.extension.service.IService; + +/** +* @author ThinkBook +* @description 针对表【ts_user_message】的数据库操作Service +* @createDate 2023-05-23 11:30:04 +*/ +public interface IUserMessageService extends IService { + +} diff --git a/adc-da-report/src/main/java/com/adc/da/report/service/impl/IFileServiceImpl.java b/adc-da-report/src/main/java/com/adc/da/report/service/impl/IFileServiceImpl.java index 7a5eba7..12c6f64 100644 --- a/adc-da-report/src/main/java/com/adc/da/report/service/impl/IFileServiceImpl.java +++ b/adc-da-report/src/main/java/com/adc/da/report/service/impl/IFileServiceImpl.java @@ -1,21 +1,53 @@ package com.adc.da.report.service.impl; +import com.adc.da.report.constant.ReportConstants; import com.adc.da.report.dao.mysql.FileDao; import com.adc.da.report.eo.FileEntity; import com.adc.da.report.service.IFileService; -import javax.annotation.Resource; +import com.adc.da.report.util.LocalFileUtil; +import com.adc.da.report.util.OSSClientUtil; +import com.adc.da.report.util.ObsBootUtil; +import com.adc.da.util.utils.CollectionUtils; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import lombok.Synchronized; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.web.multipart.MultipartFile; + +import javax.annotation.Resource; +import java.text.SimpleDateFormat; +import java.util.*; /** * @Author doudxw * @Date 2021/11/8 15:00 */ @Service +@Slf4j public class IFileServiceImpl implements IFileService { @Resource private FileDao fileDao; + @Value("${uploadFile}") + private String uploadFile; + + @Value("${picPath}") + private String picPath; + @Value("${uploadType}") + private String uploadType; + + @Autowired + private ObsBootUtil obsBootUtil; + + @Autowired + private LocalFileUtil localFileUtil; + + @Resource + private OSSClientUtil ossClientUtil; /** * 添加文件 @@ -36,4 +68,142 @@ public class IFileServiceImpl implements IFileService { FileEntity fileEntity = fileDao.selectById(fileId); return fileEntity; } + + @Override + @Transactional + public List> batchUploadFile(MultipartFile[] files) { + List> resultList = new ArrayList<>(); + for (MultipartFile file : files) { + Map resultMap = new HashMap(); + //上传路径 + //此路径映射到localhost + String path = uploadFile; + String realName = file.getOriginalFilename(); + Date now = new Date(); + SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMddHHmmss"); + String date = dateFormat.format(now); + Random r = new Random(); + String num = ""; + for (int i = 0; i < 3; i++) { + int s = r.nextInt(10); + num += String.valueOf(s); + } + + //获取上传文件名 + String fileName = file.getOriginalFilename(); + String contentType = file.getContentType(); + String ext = fileName.substring(fileName.lastIndexOf(".") + 1); + fileName = fileName.substring(0, fileName.lastIndexOf("."))+date + num + "." + ext; + log.info("fileName>>" + fileName); + try{ + String result=""; + // 上传方式:阿里云:alioss 华为云:hwobs + if ("hwobs".equals(uploadType)){ + result = obsBootUtil.upload(file, fileName); + }else if ("alioss".equals(uploadType)) { + result = ossClientUtil.uploadFile2OSS(file.getInputStream(),fileName); + }else if ("local".equals(uploadType)) { + localFileUtil.saveFile(file.getInputStream(), fileName); + } + resultMap.put("key", date + num); + resultMap.put("value", path + "//" + fileName); + resultMap.put("name", realName); + resultList.add(resultMap); + } + catch (Exception e){ + log.error(e.getMessage(),e); + } + FileEntity entity = new FileEntity(); + entity.setContentType(contentType); + entity.setCreateTime(new Date()); + entity.setFileName(realName); + entity.setFileType(ext); + entity.setFileSize(String.valueOf(file.getSize())); + entity.setFileId(date + num); + entity.setSavePath(fileName); + this.addFile(entity); + } + return resultList; + } + + @Override + @Synchronized + public Map uploadFile(MultipartFile file) { + Map resultMap = new HashMap(); + //上传路径 + //此路径映射到localhost + String path = uploadFile; + String realName = file.getOriginalFilename(); + Date now = new Date(); + SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMddHHmmss"); + String date = dateFormat.format(now); + Random r = new Random(); + String num = ""; + for (int i = 0; i < 3; i++) { + int s = r.nextInt(10); + num += String.valueOf(s); + } + + //获取上传文件名 + String fileName = file.getOriginalFilename(); + String contentType = file.getContentType(); + String ext = fileName.substring(fileName.lastIndexOf(".") + 1); + fileName = fileName.substring(0, fileName.lastIndexOf("."))+date + num + "." + ext; + log.info("fileName>>" + fileName); + try{ + String result=""; + // 上传方式:阿里云:alioss 华为云:hwobs + if ("hwobs".equals(uploadType)){ + result = obsBootUtil.upload(file, fileName); + }else if ("alioss".equals(uploadType)) { + result = ossClientUtil.uploadFile2OSS(file.getInputStream(),fileName); + }else if ("local".equals(uploadType)) { + localFileUtil.saveFile(file.getInputStream(), fileName); + } + resultMap.put("id", date + num); + resultMap.put("value", path + "//" + fileName); + resultMap.put("name", realName); + } + catch (Exception e){ + log.error(e.getMessage(),e); + } + FileEntity entity = new FileEntity(); + entity.setContentType(contentType); + entity.setCreateTime(new Date()); + entity.setFileName(realName); + entity.setFileType(ext); + entity.setFileSize(String.valueOf(file.getSize())); + entity.setFileId(date + num); + entity.setSavePath(fileName); + this.addFile(entity); + return resultMap; + } + + @Override + public boolean hasExcelFileId(List fileIds) { + boolean hasExcelFileId = false; + LambdaQueryWrapper fileEntityLambdaQueryWrapper = new LambdaQueryWrapper<>(); + fileEntityLambdaQueryWrapper.in(FileEntity::getFileId, fileIds); + List fileEntities = fileDao.selectList(fileEntityLambdaQueryWrapper); + if (CollectionUtils.isNotEmpty(fileEntities)) { + for (FileEntity fileEntity : fileEntities) { + if (ReportConstants.FILE_EXTENSIONS_XLS.equals(fileEntity.getFileType()) || + ReportConstants.FILE_EXTENSIONS_XLSX.equals(fileEntity.getFileType())) { + hasExcelFileId = true; + break; + } + } + } + return hasExcelFileId; + } + + @Override + public List getDownloadFileIdsWithoutExcel(String reportId) { + return fileDao.getDownloadFileIdsWithoutExcel(reportId); + } + + @Override + public List getDownloadFileIds(String reportId) { + return fileDao.getDownloadFileIds(reportId); + } } diff --git a/adc-da-report/src/main/java/com/adc/da/report/service/impl/ILogServiceImpl.java b/adc-da-report/src/main/java/com/adc/da/report/service/impl/ILogServiceImpl.java index 6f2874d..466068d 100644 --- a/adc-da-report/src/main/java/com/adc/da/report/service/impl/ILogServiceImpl.java +++ b/adc-da-report/src/main/java/com/adc/da/report/service/impl/ILogServiceImpl.java @@ -9,9 +9,9 @@ import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import org.springframework.beans.BeanUtils; -import javax.annotation.Resource; import org.springframework.stereotype.Service; +import javax.annotation.Resource; import java.util.List; import java.util.stream.Collectors; @@ -72,6 +72,11 @@ public class ILogServiceImpl implements ILogService { wrapper.and(c -> c.like("DESCRIPTION", doList[0]).or() .like("DESCRIPTION", doList[1]).or().like("DESCRIPTION", doList[2])); break; + case 4: + wrapper.and(c -> c.like("DESCRIPTION", doList[0]).or() + .like("DESCRIPTION", doList[1]).or().like("DESCRIPTION", doList[2]) + .or().like("DESCRIPTION", doList[3])); + break; default: break; diff --git a/adc-da-report/src/main/java/com/adc/da/report/service/impl/IMessageServiceImpl.java b/adc-da-report/src/main/java/com/adc/da/report/service/impl/IMessageServiceImpl.java new file mode 100644 index 0000000..4ea2c56 --- /dev/null +++ b/adc-da-report/src/main/java/com/adc/da/report/service/impl/IMessageServiceImpl.java @@ -0,0 +1,119 @@ +package com.adc.da.report.service.impl; + +import com.adc.da.login.util.UserUtils; +import com.adc.da.report.constant.MessageConstants; +import com.adc.da.report.constant.MessageTypeEnum; +import com.adc.da.report.constant.ReportConstants; +import com.adc.da.report.dao.mysql.UserMessageDao; +import com.adc.da.report.eo.UserMessageEntity; +import com.adc.da.report.service.IUserMessageService; +import com.adc.da.report.vo.MessageQueryVo; +import com.adc.da.report.vo.MessageVo; +import com.adc.da.sys.dao.mysql.UserEODao; +import com.adc.da.sys.entity.UserEO; +import com.adc.da.sys.service.iservice.IUserEoService; +import com.adc.da.util.exception.AdcDaBaseException; +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.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; +import com.adc.da.report.eo.MessageEntity; +import com.adc.da.report.service.IMessageService; +import com.adc.da.report.dao.mysql.MessageDao; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import javax.annotation.Resource; +import java.util.ArrayList; +import java.util.List; +import java.util.stream.Collectors; + +import static com.adc.da.report.constant.MessageConstants.READ; + +/** +* @author ThinkBook +* @description 针对表【ts_message】的数据库操作Service实现 +* @createDate 2023-05-23 11:22:15 +*/ +@Service +public class IMessageServiceImpl extends ServiceImpl + implements IMessageService { + + @Resource + private MessageDao messageDao; + + @Resource + private IUserMessageService userMessageService; + + @Resource + private UserEODao userEODao; + + @Override + public ResponseMessage listByCurrentUser(MessageQueryVo messageVo) { + IPage page = new Page<>(); + page.setCurrent(messageVo.getPageNo()); + page.setSize(messageVo.getPageSize()); + IPage list = messageDao.listByUser(page, messageVo, UserUtils.getUserId()); + return Result.success(list); + } + + @Override + public ResponseMessage allRead() { + LambdaUpdateWrapper wrapper = new LambdaUpdateWrapper<>(); + wrapper.eq(UserMessageEntity::getReadType, MessageConstants.UNREAD); + wrapper.eq(UserMessageEntity::getUserId, UserUtils.getUserId()); + wrapper.set(UserMessageEntity::getReadType, READ); + userMessageService.update(wrapper); + return Result.success("全部已读"); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void publishMessage(MessageEntity message, boolean toAllUser, List userIds) { + List userEoIds = new ArrayList<>(); + if (toAllUser) { + LambdaQueryWrapper lambdaQueryWrapper = new LambdaQueryWrapper<>(); + lambdaQueryWrapper.eq(UserEO::getDelFlag, 0); + List userEOS = userEODao.selectList(lambdaQueryWrapper); + if (userEOS != null) { + userEoIds = userEOS.stream().map(UserEO::getUsid).collect(Collectors.toList()); + } + } else { + userEoIds = userIds; + if (userEoIds.isEmpty()) { + throw new AdcDaBaseException("无指定发送的用户,无法发送站内信"); + } + } + //保存消息信息 + save(message); + List userMessageEntities = new ArrayList<>(); + userEoIds.forEach(userId -> { + UserMessageEntity userMessageEntity = new UserMessageEntity(); + userMessageEntity.setId(UUID.randomUUID10()) + .setUserId(userId) + .setMessageId(message.getId()) + .setReadType(MessageConstants.UNREAD) + .setDelFlag(0); + userMessageEntities.add(userMessageEntity); + }); + userMessageService.saveBatch(userMessageEntities); + } + + @Override + public ResponseMessage readMessage(String id) { + LambdaUpdateWrapper lambdaUpdateWrapper = new LambdaUpdateWrapper<>(); + lambdaUpdateWrapper.eq(UserMessageEntity::getId, id); + lambdaUpdateWrapper.set(UserMessageEntity::getReadType, READ); + userMessageService.update(lambdaUpdateWrapper); + return Result.success(); + } +} + + + + diff --git a/adc-da-report/src/main/java/com/adc/da/report/service/impl/IReportContentServiceImpl.java b/adc-da-report/src/main/java/com/adc/da/report/service/impl/IReportContentServiceImpl.java index bd326c1..f34f5fe 100644 --- a/adc-da-report/src/main/java/com/adc/da/report/service/impl/IReportContentServiceImpl.java +++ b/adc-da-report/src/main/java/com/adc/da/report/service/impl/IReportContentServiceImpl.java @@ -1,19 +1,23 @@ package com.adc.da.report.service.impl; +import cn.hutool.json.JSONUtil; import com.adc.da.report.dao.mysql.FileDao; +import com.adc.da.report.dao.mysql.ReportFileDao; import com.adc.da.report.eo.FileEntity; +import com.adc.da.report.eo.ReportFile; import com.adc.da.report.util.FileContentUtil; import com.adc.da.report.util.LocalFileUtil; import com.adc.da.report.util.OSSClientUtil; import com.adc.da.report.util.ObsBootUtil; +import com.adc.da.util.utils.CollectionUtils; import com.adc.da.util.utils.FileUtil; import com.adc.da.util.utils.UUID; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.adc.da.report.eo.ReportContentEntity; import com.adc.da.report.service.IReportContentService; import com.adc.da.report.dao.mysql.ReportContentDao; import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -22,6 +26,9 @@ import javax.annotation.Resource; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; +import java.util.ArrayList; +import java.util.List; +import java.util.stream.Collectors; /** * @author Caihaohan @@ -51,36 +58,70 @@ public class IReportContentServiceImpl extends ServiceImpl reportFileLambdaQueryWrapper = new LambdaQueryWrapper<>(); + reportFileLambdaQueryWrapper.eq(ReportFile::getReportId, reportId); + reportFileLambdaQueryWrapper.eq(ReportFile::getState, 2); + List reportFiles = reportFileDao.selectList(reportFileLambdaQueryWrapper); + List fileIds = new ArrayList<>(); + if (CollectionUtils.isNotEmpty(reportFiles)) { + fileIds = reportFiles.stream().map(ReportFile::getFileId).collect(Collectors.toList()); + } + StringBuilder content = new StringBuilder(); + List reportContentFileIdList = new ArrayList<>(); + for (String fileId : fileIds) { + //获取文件 + FileEntity fileEntity = fileDao.selectById(fileId); + String path = uploadFile + fileEntity.getSavePath(); + FileOutputStream outputStream = new FileOutputStream(path); + // 上传方式:阿里云:alioss 华为云:hwobs + if ("hwobs".equals(uploadType)) { + obsBootUtil.getFileFromOBS(fileEntity.getSavePath(), outputStream); + } else if ("alioss".equals(uploadType)) { + ossClientUtil.getFileFromOSS(fileEntity.getSavePath(), outputStream); + } else if ("local".equals(uploadType)) { + localFileUtil.getFileFromLocal(fileEntity.getSavePath(), outputStream); + } + File file = new File(path); + //解析出内容 + try { + String fileContent = FileContentUtil.readFileContent(file); + content.append(fileContent); + reportContentFileIdList.add(fileId); + } catch (Exception e) { + log.error("抽取文件内容发生错误,请检查", e); + } + + //将文件删除 + outputStream.close(); + FileUtil.deleteFile(path); + } + + String reportContentFileIds = ""; + if (CollectionUtils.isNotEmpty(reportContentFileIdList)) { + reportContentFileIds = JSONUtil.toJsonStr(reportContentFileIdList); } - File file = new File(path); - //解析出内容 - String content = FileContentUtil.readFileContent(file); //将内容存入 ReportContentEntity reportContent = query().eq("report_id", reportId).one(); if (reportContent == null) { - ReportContentEntity reportContentEntity = new ReportContentEntity(UUID.randomUUID10(), reportId, content); + ReportContentEntity reportContentEntity = new ReportContentEntity(UUID.randomUUID10(), reportId, reportContentFileIds, content.toString()); save(reportContentEntity); } else { - reportContent.setReportContent(content); + reportContent.setReportContent(content.toString()); saveOrUpdate(reportContent); } - //将文件删除 - outputStream.close(); - FileUtil.deleteFile(path); + } + + @Override + public void removeByReportId(String reportId) { + LambdaQueryWrapper lambdaQueryWrapper = new LambdaQueryWrapper<>(); + lambdaQueryWrapper.eq(ReportContentEntity::getReportId, reportId); + remove(lambdaQueryWrapper); } } diff --git a/adc-da-report/src/main/java/com/adc/da/report/service/impl/IReportFileServiceImpl.java b/adc-da-report/src/main/java/com/adc/da/report/service/impl/IReportFileServiceImpl.java new file mode 100644 index 0000000..e57861b --- /dev/null +++ b/adc-da-report/src/main/java/com/adc/da/report/service/impl/IReportFileServiceImpl.java @@ -0,0 +1,16 @@ +package com.adc.da.report.service.impl; + +import com.adc.da.report.dao.mysql.ReportFileDao; +import com.adc.da.report.eo.ReportFile; +import com.adc.da.report.service.IReportFileService; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; + + +@Service +@Slf4j +public class IReportFileServiceImpl extends ServiceImpl + implements IReportFileService { + +} diff --git a/adc-da-report/src/main/java/com/adc/da/report/service/impl/IReportLogBookServiceImpl.java b/adc-da-report/src/main/java/com/adc/da/report/service/impl/IReportLogBookServiceImpl.java index 834b4a4..fdc2d6a 100644 --- a/adc-da-report/src/main/java/com/adc/da/report/service/impl/IReportLogBookServiceImpl.java +++ b/adc-da-report/src/main/java/com/adc/da/report/service/impl/IReportLogBookServiceImpl.java @@ -8,6 +8,8 @@ import com.adc.da.report.service.IReportLogBookService; import com.adc.da.report.vo.DeleteParamRequestVO; import com.adc.da.report.vo.ReportDetailThumbUpVo; import com.adc.da.report.vo.ReportLogPageVO; +import com.adc.da.util.http.ResponseMessage; +import com.adc.da.util.http.Result; import com.adc.da.util.utils.StringUtils; import com.adc.da.util.utils.UUID; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; @@ -20,6 +22,7 @@ import org.springframework.util.ObjectUtils; import java.util.ArrayList; import java.util.Date; import java.util.List; +import java.util.stream.Collectors; /** * @author bu @@ -145,18 +148,35 @@ public class IReportLogBookServiceImpl extends ServiceImpl reportLogBookLambdaQueryWrapper = new LambdaQueryWrapper<>(); reportLogBookLambdaQueryWrapper.eq(ReportLogBook::getReportId, reportId); @@ -176,6 +200,34 @@ public class IReportLogBookServiceImpl extends ServiceImpl reportLogBookLambdaQueryWrapper = new LambdaQueryWrapper<>(); + reportLogBookLambdaQueryWrapper.eq(ReportLogBook::getReportId, reportId); + reportLogBookLambdaQueryWrapper.eq(ReportLogBook::getType, 4); + reportLogBookLambdaQueryWrapper.eq(ReportLogBook::getUserId, UserUtils.getUserId()); + remove(reportLogBookLambdaQueryWrapper); + } + @Override public ReportDetailThumbUpVo thumbUpOrDown(String reportId) { ReportLogBook entity = findThumbUpLog(reportId); @@ -191,4 +243,24 @@ public class IReportLogBookServiceImpl extends ServiceImpl getCollectReportIdByUser(String userId) { + LambdaQueryWrapper collectWrapper = new LambdaQueryWrapper<>(); + collectWrapper.eq(ReportLogBook::getType, 4); + collectWrapper.eq(ReportLogBook::getUserId, userId); + List list = list(collectWrapper).stream().map(ReportLogBook::getReportId).collect(Collectors.toList()); + return list; + } } 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 b5da093..2d85919 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 @@ -1,25 +1,28 @@ package com.adc.da.report.service.impl; import cn.hutool.core.util.StrUtil; +import cn.hutool.json.JSONArray; +import cn.hutool.json.JSONUtil; import com.adc.da.login.util.CommonUtils; import com.adc.da.login.util.UserUtils; import com.adc.da.report.constant.ReportConstants; import com.adc.da.report.dao.mysql.FileDao; import com.adc.da.report.dao.mysql.ReportDao; +import com.adc.da.report.dao.mysql.ReportFileDao; import com.adc.da.report.dao.mysql.ReportLabelDao; -import com.adc.da.report.dao.mysql.ReportUserDao; import com.adc.da.report.eo.*; import com.adc.da.report.service.*; import com.adc.da.report.util.*; -import com.adc.da.report.vo.ReportDetailVo; -import com.adc.da.report.vo.ReportQueryVo; -import com.adc.da.report.vo.ReportVo; +import com.adc.da.report.vo.*; import com.adc.da.sys.dao.mysql.RoleEODao; import com.adc.da.sys.dao.mysql.UserEODao; +import com.adc.da.sys.entity.MenuEO; import com.adc.da.sys.entity.OrgEO; import com.adc.da.sys.entity.RoleEO; import com.adc.da.sys.entity.UserEO; +import com.adc.da.sys.service.MenuEOService; import com.adc.da.sys.service.OrgEOService; +import com.adc.da.sys.util.BeanCopyUtils; import com.adc.da.util.http.ResponseMessage; import com.adc.da.util.http.Result; import com.adc.da.util.utils.CollectionUtils; @@ -28,11 +31,12 @@ import com.adc.da.util.utils.StringUtils; import com.adc.da.util.utils.UUID; import com.alibaba.fastjson.JSON; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +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 lombok.extern.slf4j.Slf4j; +import org.apache.poi.poifs.filesystem.OfficeXmlFileException; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Lazy; @@ -41,6 +45,7 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import javax.annotation.Resource; +import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; @@ -68,9 +73,6 @@ public class IReportServiceImpl extends ServiceImpl @Resource private ReportDao reportDao; - @Resource - private ReportUserDao reportUserDao; - @Resource private ReportLabelDao reportLabelDao; @@ -122,9 +124,18 @@ public class IReportServiceImpl extends ServiceImpl @Resource private OrgEOService orgEOService; + @Resource private ILogService logService; + @Resource + private MenuEOService menuEOService; + + @Autowired + private IReportFileService iReportFileService; + + @Autowired + private ReportFileDao reportFileDao; @Override public void addOrUpdate(ReportEntity reportEntity) { @@ -141,6 +152,17 @@ public class IReportServiceImpl extends ServiceImpl reportDao.insert(reportEntity); } String reportId = reportEntity.getId(); + //文件 + reportFileDao.delByReportId(new ReportFile(reportId,2)); + List reportFiles = new ArrayList<>(); + for (ReportFile reportFile : reportEntity.getFileList()) { + reportFile.setId(UUID.randomUUID().replace("-","")); + reportFile.setReportId(reportId); +// reportFile.setFileId(s); + reportFile.setState(2); + reportFiles.add(reportFile); + } + iReportFileService.saveBatch(reportFiles); //插入报表标签关系表 //修改报表标签关系表(先删后增) iReportLabelService.deleteReportLabelByReportId(new String[]{reportId}); @@ -150,19 +172,115 @@ public class IReportServiceImpl extends ServiceImpl for (List list : reportEntity.getLabelList()) { String lastLabel = list.get(list.size() - 1); ReportLabelEntity reportLabelEntity = new ReportLabelEntity(com.adc.da.util.utils.UUID.randomUUID10() - ,reportId, JSON.toJSONString(list),lastLabel); + ,reportId, JSON.toJSONString(list),lastLabel,1); labelList.add(reportLabelEntity); } iReportLabelService.saveBatch(labelList); - //插入报表内容表 - try { - iReportContentService.insertReportContent(reportId, reportEntity.getFileId()); - log.info("抽取报告内容"); - } catch (IOException e) { - log.error("获取报告内容失败", e); + } + //修改报表内容表(先删后增) + iReportContentService.removeByReportId(reportId); + try { + iReportContentService.insertReportContent(reportId); + log.info("抽取报告内容"); + } catch (IOException e) { + log.error("获取报告内容失败", e); + } + + } + + @Override + public ResponseMessage changeUploader(ChangeUploaderVo changeUploaderVo) { + //判断当前登陆人是否有权限更改上传人 + if (!this.isAllowChangeUploader(UserUtils.getUserId())) { + return Result.error("无权限更改上传人"); + } + //更改上传人 + LambdaUpdateWrapper wrapper = new LambdaUpdateWrapper<>(); + wrapper.in(ReportEntity::getId, changeUploaderVo.getReportIds()); + wrapper.set(ReportEntity::getCreateUserId, changeUploaderVo.getUserId()); + update(wrapper); + return Result.success("修改成功"); + } + + @Override + public void delFile(ReportFile reportFile) { + reportFileDao.deleteBatchIds(reportFile.getRfIdList()); + } + + @Override + public IPage filePage(ReportFilePageVO reportFilePageVO) { + IPage page = new Page<>(); + page.setCurrent(reportFilePageVO.getCurrent()); + page.setSize(reportFilePageVO.getSize()); + + return reportFileDao.filePage(page,reportFilePageVO); + } + + @Override + public ResponseMessage refreshReportContent() { + //找出所有能生成内容的报告id + LambdaQueryWrapper reportFileLambdaQueryWrapper = new LambdaQueryWrapper<>(); + + //只找不在流程中的报告 + reportFileLambdaQueryWrapper.ne(ReportFile::getState, 1); + List reportFileList = iReportFileService.list(reportFileLambdaQueryWrapper); + //所有报告的id + Set allReportIdSet = reportFileList.stream().map(ReportFile::getReportId).collect(Collectors.toSet()); + //所有文件的id + Set allFileIdSet = reportFileList.stream().map(ReportFile::getFileId).collect(Collectors.toSet()); + + List reportContentList = iReportContentService.list(); + //找出已经生成过的报告id + Set generatedReportIdSet = reportContentList.stream().map(ReportContentEntity::getReportId).collect(Collectors.toSet()); + //找出已经生成过的报告的fileId + List generatedFileIds = reportContentList.stream().map(ReportContentEntity::getFileIds).collect(Collectors.toList()); + Set generatedFileIdSet = new HashSet<>(); + for (String fileIds : generatedFileIds) { + // 将JSONArray转换为List + // 解析JSON字符串为JSONArray + if (StrUtil.isNotBlank(fileIds)) { + JSONArray jsonArray = JSONUtil.parseArray(fileIds); + List fileIdList = jsonArray.toList(String.class); + generatedFileIdSet.addAll(fileIdList); } } + //获取缺失的文件id + allFileIdSet.removeAll(generatedFileIdSet); + allReportIdSet.removeAll(generatedReportIdSet); + + //需要生成的文件的数量 + int needGenerateFileCount = allFileIdSet.size(); + int needGenerateReportCount = allReportIdSet.size(); + log.info("发现缺少" + needGenerateFileCount + "个文件的内容"); + log.info("有" + needGenerateReportCount + "个报告需要重新生成"); + //实际生成的数量 + int count = 0; + List failGenerateReportId = new ArrayList<>(); + //生成报告内容 + for (String reportId : allReportIdSet) { + //修改报表内容表(先删后增) + iReportContentService.removeByReportId(reportId); + try { + log.info("抽取reportId为{}报告内容", reportId); + iReportContentService.insertReportContent(reportId); + count++; + } catch (IOException e) { + log.error("获取reportId为{}的报告内容失败", reportId); + failGenerateReportId.add(reportId); + log.error(String.valueOf(e)); + } + } + log.info("实际生成" + count + "条报告的内容"); + if (needGenerateReportCount == count) { + if (needGenerateReportCount == 0) { + return Result.success("未发现缺失报告内容,无需生成"); + } + return Result.success("成功,全部生成完毕,共" + count + "条"); + } else { + int missing = needGenerateReportCount - count; + return Result.success("失败," + missing + "条报告的内容生成失败,请检查其是否有空文件或其余问题,失败的报告id为" + failGenerateReportId); + } } /** @@ -174,6 +292,7 @@ public class IReportServiceImpl extends ServiceImpl */ @Override @Transactional(rollbackFor = Exception.class) + @Deprecated public String insert(ReportEntity entity, List labelList, List reportPreviewUserIdList, List reportPreviewAndDownloadUserIdList) throws IOException { @@ -236,22 +355,21 @@ public class IReportServiceImpl extends ServiceImpl }); } else { - entity.setUpdateDate(format.format(new Date())); - reportDao.updateById(entity); - reportUserDao.delete(new QueryWrapper() - .eq("reportId", entity.getId())); +// entity.setUpdateDate(format.format(new Date())); +// reportDao.updateById(entity); +// reportUserDao.delete(new QueryWrapper() +// .eq("reportId", entity.getId())); //修改报表标签关系表(先删后增) iReportLabelService.deleteReportLabelByReportId(new String[]{entity.getId()}); //插入报表标签关系表 labelList.forEach((label) -> { - ReportLabelEntity reportLabelEntity = new ReportLabelEntity(UUID.randomUUID10(), entity.getId(), label); + ReportLabelEntity reportLabelEntity = new ReportLabelEntity(UUID.randomUUID10(), entity.getId(), + label,2); reportLabelDao.insert(reportLabelEntity); }); - //TODO 插入报表内容表(先删后增) - //删除power_apply表中的对应权限 iPowerApplyService.deleteByReportId(entity.getId()); @@ -360,6 +478,10 @@ public class IReportServiceImpl extends ServiceImpl LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); wrapper.in(ReportContentEntity::getReportId, idList); iReportContentService.remove(wrapper); + //删除文件关联 + LambdaQueryWrapper reportFileLambdaQueryWrapper = new LambdaQueryWrapper<>(); + reportFileLambdaQueryWrapper.in(ReportFile::getReportId, idList); + iReportFileService.remove(reportFileLambdaQueryWrapper); return nameList; } @@ -383,18 +505,18 @@ public class IReportServiceImpl extends ServiceImpl /** * 报告html * - * @param id + * @param reportId + * @param fileId * @return */ @Override - public String reportHtml(String id) { + public String reportHtml(String reportId, String fileId) { try { - ReportEntity entity = reportDao.selectById(id); - String key = entity.getId() + "-" + entity.getFileId(); + String key = reportId + "-" + fileId; String html = stringRedisTemplate.boundValueOps(key).get(); //没有的话就生成 if (StrUtil.isBlank(html)) { - html = createHtmlString(entity.getFileId()); + html = createHtmlString(fileId); log.info("执行完成html" + html); @@ -511,39 +633,93 @@ public class IReportServiceImpl extends ServiceImpl } }); } + return list; + } - list.getRecords().forEach(c -> { - FileEntity fileEntity = Optional.ofNullable(fileDao.selectById(c.getFileId())).orElse(new FileEntity()); - if (StringUtils.isEmpty(fileEntity.getFileType())) { - c.setFileType(null); - } - //ppt文件 - else if (ReportConstants.FILE_EXTENSIONS_PPT.equalsIgnoreCase(fileEntity.getFileType()) || - ReportConstants.FILE_EXTENSIONS_PPTX.equalsIgnoreCase(fileEntity.getFileType())) { - c.setFileType("1"); - } - //excel文件 - else if (ReportConstants.FILE_EXTENSIONS_XLS.equalsIgnoreCase(fileEntity.getFileType()) || - ReportConstants.FILE_EXTENSIONS_XLSX.equalsIgnoreCase(fileEntity.getFileType())) { - c.setFileType("2"); - } - //pdf文件 - else if (ReportConstants.FILE_EXTENSIONS_PDF.equalsIgnoreCase(fileEntity.getFileType())) { - c.setFileType("3"); - } - //word文件 - else { - c.setFileType("4"); - } + @Override + public IPage myCollectPage(ReportQueryVo vo) { + IPage page = new Page<>(); + page.setCurrent(vo.getPageNo()); + page.setSize(vo.getPageSize()); - //文件大小 - c.setFileSize(StringUtils.isNotEmpty(fileEntity.getFileSize()) - ? String.valueOf(Integer.parseInt(fileEntity.getFileSize()) / 1024) + "kb" : "0kb"); - c.setFileName(fileEntity.getFileName()); - List userIdList = reportUserDao.selectList( - new QueryWrapper().eq("reportId", c.getId())) - .stream().map(ReportUserEntity::getUserId).collect(Collectors.toList()); - }); + //按照labelId筛选 + Set idSet = new HashSet<>(); + if (CollectionUtils.isNotEmpty(vo.getLabelId())) { + LambdaQueryWrapper reportLabelEntityWrapper = new LambdaQueryWrapper<>(); + reportLabelEntityWrapper.in(ReportLabelEntity::getLastLabel, vo.getLabelId()); + List reportLabelEntities = reportLabelDao.selectList(reportLabelEntityWrapper); + reportLabelEntities.forEach(reportLabelEntity -> { + idSet.add(reportLabelEntity.getReportId()); + }); + if (CollectionUtils.isEmpty(idSet)) { + idSet.add("默认搜索条件"); + } + } + //找到当前用户收藏的reportId + List collectReportIds = reportLogBookService.getCollectReportIdByUser(UserUtils.getUserId()); + if (CollectionUtils.isEmpty(collectReportIds)) { + collectReportIds.add("默认搜索条件"); + } + + vo.setUsid(UserUtils.getUserId()); + IPage list = reportDao.myCollectPage(page, vo, idSet, collectReportIds); + + //设置权限 + UserEO userEo = userEODao.selectById(UserUtils.getUserId()); + String levelId = StringUtils.isEmpty(userEo.getLevelId()) ? "0.8" : userEo.getLevelId(); + String employeeTypeId = StringUtils.isEmpty(userEo.getEmployeeTypeId()) ? "0.8" : userEo.getEmployeeTypeId(); + //用户级别 + double level = Double.parseDouble(levelId); + double employeeType = Double.parseDouble(employeeTypeId); + //总监拥有全部报告的预览和下载权力 + if ((level == SPECIAL_LEVEL_ONE || level == SPECIAL_LEVEL_TWO || + level == SPECIAL_LEVEL_THREE || level == SPECIAL_LEVEL_FOUL) && + (employeeType == EMPLOYEE_TYPE_ID_ONE)) { + list.getRecords().forEach(reportVo -> { + reportVo.setPower(PREVIEW_DOWNLOAD); + }); + } else { + //其余员工 + //用户自己申请的权限 + List powerList = new ArrayList<>(); + powerList.add(PREVIEW_DOWNLOAD); + powerList.add(PREVIEW); + powerList.add(DOWNLOAD); + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.in(CollectionUtils.isNotEmpty(list.getRecords()) ,PowerApply::getReportId, list.getRecords().stream().map(ReportVo::getId).collect(Collectors.toList())); + wrapper.in(PowerApply::getPower, powerList); + wrapper.eq(PowerApply::getUserId, UserUtils.getUserId()); + wrapper.eq(PowerApply::getDelFlag, 0); + List powerApplyList = iPowerApplyService.list(wrapper).stream().distinct().collect(Collectors.toList()); + + Map> reportPowerMap = powerApplyList.stream() + .collect(Collectors.groupingBy(PowerApply::getReportId)); + + //设置权限 + list.getRecords().forEach(reportVo -> { + //无权限要求的报告自带预览权限 + if (reportVo.getConfidentialLevel().equals(PUBLIC_REPORT) && + reportVo.getPrivacyLevel().equals(NO_USER_PRIVACY_INVOLVED)) { + reportVo.setPower(PREVIEW); + } else { + reportVo.setPower(NONE); + } + List powerApplies = reportPowerMap.get(reportVo.getId()); + if (powerApplies != null) { + //只有当PA表只有一条申请的权限且并不是公开表的时候才给权限 + if (powerApplies.size() == 1 && reportVo.getPower().equals(NONE)) { + reportVo.setPower(powerApplies.get(0).getPower()); + } else { + reportVo.setPower(PREVIEW_DOWNLOAD); + } + } + + //如果上传人是自己也有预览下载权限 + if (UserUtils.getUserId().equals(reportVo.getCreateUserId())) { + reportVo.setPower(PREVIEW_DOWNLOAD); + } + }); + } return list; } @@ -595,41 +771,53 @@ public class IReportServiceImpl extends ServiceImpl } }); - list.getRecords().forEach(c -> { - FileEntity fileEntity = Optional.ofNullable(fileDao.selectById(c.getFileId())).orElse(new FileEntity()); - if (StringUtils.isEmpty(fileEntity.getFileType())) { - c.setFileType(null); - } - //ppt文件 - else if (ReportConstants.FILE_EXTENSIONS_PPT.equalsIgnoreCase(fileEntity.getFileType()) || - ReportConstants.FILE_EXTENSIONS_PPTX.equalsIgnoreCase(fileEntity.getFileType())) { - c.setFileType("1"); - } - //excel文件 - else if (ReportConstants.FILE_EXTENSIONS_XLS.equalsIgnoreCase(fileEntity.getFileType()) || - ReportConstants.FILE_EXTENSIONS_XLSX.equalsIgnoreCase(fileEntity.getFileType())) { - c.setFileType("2"); - } - //pdf文件 - else if (ReportConstants.FILE_EXTENSIONS_PDF.equalsIgnoreCase(fileEntity.getFileType())) { - c.setFileType("3"); - } - //word文件 - else { - c.setFileType("4"); - } - - //文件大小 - c.setFileSize(StringUtils.isNotEmpty(fileEntity.getFileSize()) - ? String.valueOf(Integer.parseInt(fileEntity.getFileSize()) / 1024) + "kb" : "0kb"); - c.setFileName(fileEntity.getFileName()); - List userIdList = reportUserDao.selectList( - new QueryWrapper().eq("reportId", c.getId())) - .stream().map(ReportUserEntity::getUserId).collect(Collectors.toList()); - }); +// list.getRecords().forEach(c -> { +// FileEntity fileEntity = Optional.ofNullable(fileDao.selectById(c.getFileId())).orElse(new FileEntity()); +// if (StringUtils.isEmpty(fileEntity.getFileType())) { +// c.setFileType(null); +// } +// //ppt文件 +// else if (ReportConstants.FILE_EXTENSIONS_PPT.equalsIgnoreCase(fileEntity.getFileType()) || +// ReportConstants.FILE_EXTENSIONS_PPTX.equalsIgnoreCase(fileEntity.getFileType())) { +// c.setFileType("1"); +// } +// //excel文件 +// else if (ReportConstants.FILE_EXTENSIONS_XLS.equalsIgnoreCase(fileEntity.getFileType()) || +// ReportConstants.FILE_EXTENSIONS_XLSX.equalsIgnoreCase(fileEntity.getFileType())) { +// c.setFileType("2"); +// } +// //pdf文件 +// else if (ReportConstants.FILE_EXTENSIONS_PDF.equalsIgnoreCase(fileEntity.getFileType())) { +// c.setFileType("3"); +// } +// //word文件 +// else { +// c.setFileType("4"); +// } +// +// //文件大小 +// c.setFileSize(StringUtils.isNotEmpty(fileEntity.getFileSize()) +// ? String.valueOf(Integer.parseInt(fileEntity.getFileSize()) / 1024) + "kb" : "0kb"); +// c.setFileName(fileEntity.getFileName()); +// List userIdList = reportUserDao.selectList( +// new QueryWrapper().eq("reportId", c.getId())) +// .stream().map(ReportUserEntity::getUserId).collect(Collectors.toList()); +// }); return list; } + @Override + public Boolean isAllowChangeUploader(String userId) { + //找出对应的权限id + List menuEOS = menuEOService.listMenuEOByUserId(userId); + for (MenuEO menuEO : menuEOS) { + if ("修改上传人".equals(menuEO.getName())) { + return true; + } + } + return false; + } + @Override public Boolean isAllowDownload(String userId, String reportId) { //校验权限 @@ -687,6 +875,22 @@ public class IReportServiceImpl extends ServiceImpl @Override public ResponseMessage reportDetail(String reportId) { ReportDetailVo reportDetailVo = reportDao.reportDetail(reportId); + //设置文件信息 + LambdaQueryWrapper reportFileLambdaQueryWrapper = new LambdaQueryWrapper<>(); + reportFileLambdaQueryWrapper.eq(ReportFile::getReportId, reportDetailVo.getId()); + reportFileLambdaQueryWrapper.eq(ReportFile::getState, ReportConstants.NOT_IN_PROCESS); + List reportFiles = reportFileDao.selectList(reportFileLambdaQueryWrapper); + List fileIds = new ArrayList<>(); + if (reportFiles != null) { + fileIds = reportFiles.stream().map(ReportFile::getFileId).collect(Collectors.toList()); + } + + if (CollectionUtils.isNotEmpty(fileIds)) { + List fileEntities = fileDao.selectBatchIds(fileIds); + List fileVos = BeanCopyUtils.copyBeanList(fileEntities, ReportFile.class); + reportDetailVo.setFileList(fileVos); + } + //设置部门名称 String department = reportDetailVo.getDepartment(); if (StrUtil.isNotBlank(department)) { @@ -701,6 +905,7 @@ public class IReportServiceImpl extends ServiceImpl //设置标签列表 LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); wrapper.eq(ReportLabelEntity::getReportId, reportId); + wrapper.eq(ReportLabelEntity::getState, 2); List reportLabelEntities = reportLabelDao.selectList(wrapper); if (CollectionUtils.isNotEmpty(reportLabelEntities)) { List reportLabelIds = reportLabelEntities.stream().map(ReportLabelEntity::getLabelId).collect(Collectors.toList()); @@ -766,7 +971,13 @@ public class IReportServiceImpl extends ServiceImpl } else if (ReportConstants.FILE_EXTENSIONS_DOCX.equalsIgnoreCase(fileEntity.getFileType())) { html = WordUtil.doc2pdf(new FileInputStream(path), uploadFile, ipAddress); } else if (ReportConstants.FILE_EXTENSIONS_PPT.equalsIgnoreCase(fileEntity.getFileType())) { - html = PptUtil.doPpt2003toImage(new FileInputStream(path), uploadFile, ipAddress); + try { + html = PptUtil.doPpt2003toImage(new FileInputStream(path), uploadFile, ipAddress); + } catch (OfficeXmlFileException e) { + String newPath = path + "x"; + cn.hutool.core.io.FileUtil.rename(new File(path), newPath, false, false); + html = PptUtil.doPpt2007toImage(new FileInputStream(newPath), uploadFile, ipAddress); + } } else if (ReportConstants.FILE_EXTENSIONS_PPTX.equalsIgnoreCase(fileEntity.getFileType())) { html = PptUtil.doPpt2007toImage(new FileInputStream(path), uploadFile, ipAddress); } else if (ReportConstants.FILE_EXTENSIONS_PDF.equalsIgnoreCase(fileEntity.getFileType())) { diff --git a/adc-da-report/src/main/java/com/adc/da/report/service/impl/ITtReportManageActServiceImpl.java b/adc-da-report/src/main/java/com/adc/da/report/service/impl/ITtReportManageActServiceImpl.java index e356e84..25063aa 100644 --- a/adc-da-report/src/main/java/com/adc/da/report/service/impl/ITtReportManageActServiceImpl.java +++ b/adc-da-report/src/main/java/com/adc/da/report/service/impl/ITtReportManageActServiceImpl.java @@ -3,14 +3,13 @@ package com.adc.da.report.service.impl; import cn.hutool.core.bean.BeanUtil; import com.adc.da.login.util.UserUtils; -import com.adc.da.report.dao.mysql.PowerApplyDao; -import com.adc.da.report.dao.mysql.ReportDao; -import com.adc.da.report.dao.mysql.TtReportManageActDao; +import com.adc.da.report.dao.mysql.*; import com.adc.da.report.eo.LogEntity; import com.adc.da.report.eo.ReportEntity; import com.adc.da.report.eo.TtReportManageAct; import com.adc.da.report.service.ILogService; import com.adc.da.report.service.IReportContentService; +import com.adc.da.report.service.IReportFileService; import com.adc.da.report.service.ITtReportManageActService; import com.adc.da.report.vo.DeleteParamRequestVO; import com.adc.da.report.vo.TtReportManageActPageVO; @@ -51,7 +50,14 @@ public class ITtReportManageActServiceImpl extends ServiceImpl @@ -150,10 +156,19 @@ public class ITtReportManageActServiceImpl extends ServiceImpl + implements IUserMessageService { + +} + + + + diff --git a/adc-da-report/src/main/java/com/adc/da/report/util/FileContentUtil.java b/adc-da-report/src/main/java/com/adc/da/report/util/FileContentUtil.java index 1ba8074..12049d1 100644 --- a/adc-da-report/src/main/java/com/adc/da/report/util/FileContentUtil.java +++ b/adc-da-report/src/main/java/com/adc/da/report/util/FileContentUtil.java @@ -3,13 +3,16 @@ package com.adc.da.report.util; import java.io.File; import java.io.FileInputStream; import java.io.IOException; +import java.nio.charset.CharsetEncoder; +import java.nio.charset.StandardCharsets; import com.adc.da.report.constant.ReportConstants; +import lombok.extern.slf4j.Slf4j; import org.apache.poi.hslf.usermodel.HSLFShape; import org.apache.poi.hslf.usermodel.HSLFSlide; import org.apache.poi.hslf.usermodel.HSLFTextShape; import org.apache.poi.hssf.usermodel.HSSFWorkbook; -import org.apache.poi.openxml4j.exceptions.InvalidFormatException; +import org.apache.poi.openxml4j.exceptions.NotOfficeXmlFileException; import org.apache.poi.ss.usermodel.Cell; import org.apache.poi.ss.usermodel.Row; import org.apache.poi.xslf.usermodel.XMLSlideShow; @@ -22,7 +25,6 @@ import org.apache.poi.hwpf.extractor.WordExtractor; import org.apache.poi.xwpf.usermodel.XWPFDocument; import org.apache.poi.xwpf.extractor.XWPFWordExtractor; import org.apache.poi.hslf.usermodel.HSLFSlideShow; -import org.apache.poi.hslf.extractor.PowerPointExtractor; import org.apache.pdfbox.pdmodel.PDDocument; import org.apache.pdfbox.text.PDFTextStripper; @@ -31,6 +33,7 @@ import org.apache.pdfbox.text.PDFTextStripper; * * @author caihaohan */ +@Slf4j public class FileContentUtil { public static String readFileContent(File file) throws IOException { @@ -39,58 +42,73 @@ public class FileContentUtil { StringBuilder content = new StringBuilder(); FileInputStream fis = new FileInputStream(file); - - switch (fileExtension) { - case ReportConstants.FILE_EXTENSIONS_XLS: - HSSFWorkbook workbookXls = new HSSFWorkbook(fis); - content = new StringBuilder(readExcelContent(workbookXls)); - break; - case ReportConstants.FILE_EXTENSIONS_XLSX: - XSSFWorkbook workbookXlsx = new XSSFWorkbook(fis); - content = new StringBuilder(readExcelContent(workbookXlsx)); - break; - case ReportConstants.FILE_EXTENSIONS_DOC: - HWPFDocument documentDoc = new HWPFDocument(fis); - WordExtractor extractorDoc = new WordExtractor(documentDoc); - content = new StringBuilder(extractorDoc.getText()); - break; - case ReportConstants.FILE_EXTENSIONS_DOCX: - XWPFDocument documentDocx = new XWPFDocument(fis); - XWPFWordExtractor extractorDocx = new XWPFWordExtractor(documentDocx); - content = new StringBuilder(extractorDocx.getText()); - break; - case ReportConstants.FILE_EXTENSIONS_PPT: - HSLFSlideShow ppt = new HSLFSlideShow(fis); - for (HSLFSlide slide : ppt.getSlides()) { - for (HSLFShape shape : slide.getShapes()) { - if (shape instanceof HSLFTextShape) { - HSLFTextShape textShape = (HSLFTextShape) shape; - content.append(textShape.getText()).append("\n"); + try { + switch (fileExtension) { + case ReportConstants.FILE_EXTENSIONS_XLS: + HSSFWorkbook workbookXls = new HSSFWorkbook(fis); + content = new StringBuilder(readExcelContent(workbookXls)); + break; + case ReportConstants.FILE_EXTENSIONS_XLSX: + XSSFWorkbook workbookXlsx = new XSSFWorkbook(fis); + content = new StringBuilder(readExcelContent(workbookXlsx)); + break; + case ReportConstants.FILE_EXTENSIONS_DOC: + HWPFDocument documentDoc = new HWPFDocument(fis); + WordExtractor extractorDoc = new WordExtractor(documentDoc); + content = new StringBuilder(extractorDoc.getText()); + break; + case ReportConstants.FILE_EXTENSIONS_DOCX: + XWPFDocument documentDocx = new XWPFDocument(fis); + XWPFWordExtractor extractorDocx = new XWPFWordExtractor(documentDocx); + content = new StringBuilder(extractorDocx.getText()); + break; + case ReportConstants.FILE_EXTENSIONS_PPT: + HSLFSlideShow ppt = new HSLFSlideShow(fis); + for (HSLFSlide slide : ppt.getSlides()) { + for (HSLFShape shape : slide.getShapes()) { + if (shape instanceof HSLFTextShape) { + HSLFTextShape textShape = (HSLFTextShape) shape; + content.append(textShape.getText()).append("\n"); + } } } - } - break; - case ReportConstants.FILE_EXTENSIONS_PPTX: - XMLSlideShow pptx = new XMLSlideShow(fis); - for (XSLFSlide slide : pptx.getSlides()) { - for (XSLFShape shape : slide.getShapes()) { - if (shape instanceof XSLFTextShape) { - XSLFTextShape textShape = (XSLFTextShape) shape; - content.append(textShape.getText()).append("\n"); + break; + case ReportConstants.FILE_EXTENSIONS_PPTX: + XMLSlideShow pptx = new XMLSlideShow(fis); + for (XSLFSlide slide : pptx.getSlides()) { + for (XSLFShape shape : slide.getShapes()) { + if (shape instanceof XSLFTextShape) { + XSLFTextShape textShape = (XSLFTextShape) shape; + content.append(textShape.getText()).append("\n"); + } } } - } - break; - case ReportConstants.FILE_EXTENSIONS_PDF: - PDDocument document = PDDocument.load(fis); - PDFTextStripper stripper = new PDFTextStripper(); - content = new StringBuilder(stripper.getText(document)); - default: + break; + case ReportConstants.FILE_EXTENSIONS_PDF: + PDDocument document = PDDocument.load(fis); + PDFTextStripper stripper = new PDFTextStripper(); + content = new StringBuilder(stripper.getText(document)); + default: + } + } catch (NotOfficeXmlFileException e) { + fis.close(); + log.info("文件内容抽取失败,原因可能是上传的文件为空文件"); } - fis.close(); - return content.toString(); + return cleanInvalidCharacters(content.toString()); } + public static String cleanInvalidCharacters(String input) { + StringBuilder stringBuilder = new StringBuilder(); + CharsetEncoder encoder = StandardCharsets.UTF_8.newEncoder(); + for (char ch : input.toCharArray()) { + if (encoder.canEncode(ch)) { + stringBuilder.append(ch); + } + } + return stringBuilder.toString(); + } + + private static String readExcelContent(org.apache.poi.ss.usermodel.Workbook workbook) { StringBuilder sb = new StringBuilder(); int numberOfSheets = workbook.getNumberOfSheets(); diff --git a/adc-da-report/src/main/java/com/adc/da/report/util/LocalFileUtil.java b/adc-da-report/src/main/java/com/adc/da/report/util/LocalFileUtil.java index 6204671..b4adc83 100644 --- a/adc-da-report/src/main/java/com/adc/da/report/util/LocalFileUtil.java +++ b/adc-da-report/src/main/java/com/adc/da/report/util/LocalFileUtil.java @@ -10,6 +10,9 @@ import javax.servlet.http.HttpServletResponse; import java.io.*; import java.nio.file.Files; import java.nio.file.Paths; +import java.util.List; +import java.util.zip.ZipEntry; +import java.util.zip.ZipOutputStream; /** * @author Caihaohan @@ -24,6 +27,39 @@ public class LocalFileUtil { @Value("${localFilePath}") private String localFilePath; + public void compressFiles(List filePaths, HttpServletResponse response) { + try { + // 创建输出流 + OutputStream outputStream = response.getOutputStream(); + ZipOutputStream zipOutputStream = new ZipOutputStream(outputStream); + + byte[] buffer = new byte[1024]; + + for (String filePath : filePaths) { + File sourceFile = new File(filePath); + + ZipEntry zipEntry = new ZipEntry(sourceFile.getName()); + zipOutputStream.putNextEntry(zipEntry); + + FileInputStream fileInputStream = new FileInputStream(sourceFile); + + int len; + while ((len = fileInputStream.read(buffer)) > 0) { + zipOutputStream.write(buffer, 0, len); + } + + fileInputStream.close(); + zipOutputStream.closeEntry(); + } + + zipOutputStream.close(); + + System.out.println("文件成功压缩成ZIP格式并写入 HttpServletResponse!"); + } catch (IOException e) { + e.printStackTrace(); + } + } + public void saveFile(InputStream fileInputStream, String fileName) throws IOException { String path = localFilePath + fileName; FileOutputStream fileOutputStream = new FileOutputStream(path); 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 index 48350ae..72606e1 100644 --- 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 @@ -21,6 +21,7 @@ import javax.annotation.Resource; import javax.servlet.http.HttpServletResponse; import java.awt.*; import java.io.FileInputStream; +import java.io.FileOutputStream; import java.io.IOException; import java.io.OutputStream; import java.time.LocalDate; @@ -52,49 +53,62 @@ public class WaterMarkUtil { return configValue + " " + userName + " " + formattedDate; } - public void addWatermarkToPdf(FileInputStream inputStream, HttpServletResponse response) throws IOException { + public PDDocument addWatermarkToPdf(FileInputStream inputStream) 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); + PDDocument document = PDDocument.load(inputStream); - // 遍历每一页并添加水印 - 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); + // 设置水印字体、字体大小、颜色和透明度 + 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 (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(); - } + // 遍历每一页并添加水印 + 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(); } } } + } + return document; + } - // 将处理后的PDF写入HTTP响应 - try (OutputStream outputStream = response.getOutputStream()) { - document.save(outputStream); - } + + public void savePdfToFile(FileInputStream inputStream, String outputPath) throws IOException { + PDDocument pdDocument = addWatermarkToPdf(inputStream); + try (FileOutputStream outputStream = new FileOutputStream(outputPath)) { + pdDocument.save(outputStream); } } + + + public void addWatermarkToPdfAndWriteToResponse(FileInputStream inputStream, HttpServletResponse response) throws IOException { + PDDocument document = addWatermarkToPdf(inputStream); + try (OutputStream outputStream = response.getOutputStream()) { + document.save(outputStream); + } + document.close(); + } + } diff --git a/adc-da-report/src/main/java/com/adc/da/report/vo/ChangeUploaderVo.java b/adc-da-report/src/main/java/com/adc/da/report/vo/ChangeUploaderVo.java new file mode 100644 index 0000000..4c1221f --- /dev/null +++ b/adc-da-report/src/main/java/com/adc/da/report/vo/ChangeUploaderVo.java @@ -0,0 +1,35 @@ +package com.adc.da.report.vo; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; +import lombok.experimental.Accessors; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotEmpty; +import java.util.List; + +/** + * @author: CaiHaohan + * @Date: 2023/5/22 11:03 + * @Description: + */ +@Data +@NoArgsConstructor +@AllArgsConstructor +@Accessors(chain = true) +public class ChangeUploaderVo { + + /** + * 报告ids + */ + @NotEmpty + private List reportIds; + + /** + * 用户id + */ + @NotBlank + private String userId; + +} diff --git a/adc-da-report/src/main/java/com/adc/da/report/vo/FileVo.java b/adc-da-report/src/main/java/com/adc/da/report/vo/FileVo.java new file mode 100644 index 0000000..8ef3be2 --- /dev/null +++ b/adc-da-report/src/main/java/com/adc/da/report/vo/FileVo.java @@ -0,0 +1,21 @@ +package com.adc.da.report.vo; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class FileVo { + + /** + * 文件主键id + */ + private String fileId; + + /** + * 文件名 + */ + private String fileName; +} diff --git a/adc-da-report/src/main/java/com/adc/da/report/vo/MessageQueryVo.java b/adc-da-report/src/main/java/com/adc/da/report/vo/MessageQueryVo.java new file mode 100644 index 0000000..29052a0 --- /dev/null +++ b/adc-da-report/src/main/java/com/adc/da/report/vo/MessageQueryVo.java @@ -0,0 +1,41 @@ +package com.adc.da.report.vo; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import javax.validation.constraints.Min; +import javax.validation.constraints.NotNull; + +/** + * @author: CaiHaohan + * @Date: 2023/5/23 14:14 + * @Description: + */ +@Data +@NoArgsConstructor +@AllArgsConstructor +public class MessageQueryVo { + + /** + * 标题 + */ + private String messageTitle; + + /** + * 发布人姓名 + */ + private String createUserName; + + /** + * 页数 + */ + @Min(1) + private int pageNo; + + /** + * 每页数量 + */ + @NotNull + private int pageSize; +} diff --git a/adc-da-report/src/main/java/com/adc/da/report/vo/MessageVo.java b/adc-da-report/src/main/java/com/adc/da/report/vo/MessageVo.java new file mode 100644 index 0000000..0f0b3d8 --- /dev/null +++ b/adc-da-report/src/main/java/com/adc/da/report/vo/MessageVo.java @@ -0,0 +1,79 @@ +package com.adc.da.report.vo; + +import com.adc.da.report.constant.MessageTypeEnum; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; +import lombok.experimental.Accessors; + +import java.util.Date; + +/** + * @author: CaiHaohan + * @Date: 2023/5/23 11:54 + * @Description: + */ +@Data +@NoArgsConstructor +@AllArgsConstructor +@Accessors(chain = true) +public class MessageVo { + + /** + * 关系表的id + */ + private String id; + + /** + * 标题 + */ + private String messageTitle; + + /** + * 内容 + */ + private String content; + + /** + * 消息类型 + */ + private Integer messageType; + + /** + * 消息类型 + */ + private String messageTypeDesc; + + /** + * 发布时间 + */ + private Date createDate; + + /** + * 创建用户id + */ + private String createUser; + + /** + * 消息id + */ + private String messageId; + + /** + * 阅读状态(0未读 1已读) + */ + private Integer readType; + + public void setMessageType(Integer messageType) { + this.messageType = messageType; + switch (messageType) { + case 0: + this.messageTypeDesc = MessageTypeEnum.SYSTEM_MESSAGE.getDesc(); + break; + default: + this.messageTypeDesc = "未知"; + } + } +} diff --git a/adc-da-report/src/main/java/com/adc/da/report/vo/ReportDetailVo.java b/adc-da-report/src/main/java/com/adc/da/report/vo/ReportDetailVo.java index 5843c73..fe01296 100644 --- a/adc-da-report/src/main/java/com/adc/da/report/vo/ReportDetailVo.java +++ b/adc-da-report/src/main/java/com/adc/da/report/vo/ReportDetailVo.java @@ -1,5 +1,7 @@ package com.adc.da.report.vo; +import com.adc.da.report.eo.ReportFile; +import com.baomidou.mybatisplus.annotation.TableField; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; @@ -65,13 +67,6 @@ public class ReportDetailVo { */ private String privacyLevel; - /** - * 文件id - */ - private String fileId; - - private String fileName; - /** * 创建人id */ @@ -111,4 +106,9 @@ public class ReportDetailVo { * 保密到期日期 */ private Date secrecyLast; + + + @TableField(exist = false) + private List fileList; + } diff --git a/adc-da-report/src/main/java/com/adc/da/report/vo/ReportFilePageVO.java b/adc-da-report/src/main/java/com/adc/da/report/vo/ReportFilePageVO.java new file mode 100644 index 0000000..2ac7ee4 --- /dev/null +++ b/adc-da-report/src/main/java/com/adc/da/report/vo/ReportFilePageVO.java @@ -0,0 +1,15 @@ +package com.adc.da.report.vo; + +public class ReportFilePageVO extends BasePageVO{ + + private String id; + + private String reportId; + + private String fileId; + + /** + * 状态 1 流程中 ,2 非流程中 + */ + private Integer state; +} 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 48cfc2a..cdf5a3d 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 @@ -1,5 +1,7 @@ package com.adc.da.report.vo; +import com.adc.da.report.eo.ReportFile; +import com.baomidou.mybatisplus.annotation.TableField; import lombok.Data; import java.util.List; @@ -46,16 +48,6 @@ public class ReportVo { */ private String year; - /** - * 文件id - */ - private String fileId; - - /** - * 文件名称 - */ - private String fileName; - /** * 文件类型 */ @@ -116,6 +108,11 @@ public class ReportVo { */ private Integer download; + /** + * 受否收藏 + */ + private Integer collect; + /** * 创建人id */ @@ -135,5 +132,6 @@ public class ReportVo { private Integer isAct; private String prcType; - + @TableField(exist = false) + private List fileList; } diff --git a/adc-da-report/src/main/resources/mybatis/mapper/mysql/FileDao.xml b/adc-da-report/src/main/resources/mybatis/mapper/mysql/FileDao.xml new file mode 100644 index 0000000..2c4a575 --- /dev/null +++ b/adc-da-report/src/main/resources/mybatis/mapper/mysql/FileDao.xml @@ -0,0 +1,30 @@ + + + + + + + + diff --git a/adc-da-report/src/main/resources/mybatis/mapper/mysql/MessageDao.xml b/adc-da-report/src/main/resources/mybatis/mapper/mysql/MessageDao.xml new file mode 100644 index 0000000..2509bc8 --- /dev/null +++ b/adc-da-report/src/main/resources/mybatis/mapper/mysql/MessageDao.xml @@ -0,0 +1,48 @@ + + + + + + + + + + + + + + id,content,message_type, + createDate,del_flag + + + diff --git a/adc-da-report/src/main/resources/mybatis/mapper/mysql/PowerApplyActMapper.xml b/adc-da-report/src/main/resources/mybatis/mapper/mysql/PowerApplyActMapper.xml index 4ca2bcd..ba90b12 100644 --- a/adc-da-report/src/main/resources/mybatis/mapper/mysql/PowerApplyActMapper.xml +++ b/adc-da-report/src/main/resources/mybatis/mapper/mysql/PowerApplyActMapper.xml @@ -105,21 +105,21 @@ + select rf.*,f.file_name as fileName from ts_report_file rf + LEFT JOIN ts_file f on f.FILE_ID = rf.file_id + + + AND report_id = #{pageVO.reportId} + + + AND state = #{pageVO.state} + + + + + diff --git a/adc-da-report/src/main/resources/mybatis/mapper/mysql/ReportLabelMapper.xml b/adc-da-report/src/main/resources/mybatis/mapper/mysql/ReportLabelMapper.xml new file mode 100644 index 0000000..98dbfd9 --- /dev/null +++ b/adc-da-report/src/main/resources/mybatis/mapper/mysql/ReportLabelMapper.xml @@ -0,0 +1,17 @@ + + + + + update ts_report_label set state = 2 + where report_id = #{reportId} + + + delete from ts_report_label + + report_id = #{reportId} + and state = 2 + + + + + diff --git a/adc-da-report/src/main/resources/mybatis/mapper/mysql/ReportManageMapper.xml b/adc-da-report/src/main/resources/mybatis/mapper/mysql/ReportManageMapper.xml index 982c730..f0af4d9 100644 --- a/adc-da-report/src/main/resources/mybatis/mapper/mysql/ReportManageMapper.xml +++ b/adc-da-report/src/main/resources/mybatis/mapper/mysql/ReportManageMapper.xml @@ -1,15 +1,62 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - id, name, keycontent, maincontent, department, year, fileId, confidentialLevel, privacyLevel, + id, name, keycontent, maincontent, department, year, confidentialLevel, privacyLevel, createUserId, createDate, updateDate, del_flag,secrecy_last - #{Vo.id},#{Vo.name},#{Vo.keycontent},#{Vo.maincontent},#{Vo.department},#{Vo.year},#{Vo.fileId}, + #{Vo.id},#{Vo.name},#{Vo.keycontent},#{Vo.maincontent},#{Vo.department},#{Vo.year}, #{Vo.confidentialLevel},#{Vo.privacyLevel}, #{Vo.createUserId}, #{Vo.createDate},#{Vo.updateDate},#{Vo.del_flag}, @@ -19,7 +66,7 @@ insert into TT_REPORT_MANAGE () value ( - #{Vo.dataId},#{Vo.name},#{Vo.keyContent},#{Vo.mainContent},#{Vo.department},#{Vo.year},#{Vo.fileId}, + #{Vo.dataId},#{Vo.name},#{Vo.keyContent},#{Vo.mainContent},#{Vo.department},#{Vo.year}, #{Vo.confidentialLevel},#{Vo.privacyLevel}, #{Vo.createUserId}, #{Vo.createDate},#{Vo.updateDate},#{Vo.delFlag}, @@ -28,7 +75,6 @@ - SELECT eo.id AS id, @@ -103,7 +146,6 @@ eo.maincontent AS mainContent, eo.DEPARTMENT AS department, eo.`YEAR` AS `year`, - eo.fileid AS fileId, eo.confidentialLevel AS confidentialLevel, eo.privacyLevel AS privacyLevel, eo.createUserId AS createUserId, @@ -113,19 +155,24 @@ clicksCount.clicks AS clicks, downloadCount.download AS download, AVG( trur.user_rating ) AS reportRating, + IF(rlb.type = 4, 1, 0) AS collect, IF(bpn.id is null,1, IF(bpn.SUBMIT_STATUS = 1 and bpn.CREAT_USER = #{pageVO.usid} ,0,1) ) as isAct + , + f.FILE_ID as fileId, f.file_name as fileName ,rf.id as rfId FROM TT_REPORT_MANAGE eo LEFT JOIN ts_report_content rc ON eo.id = rc.report_id LEFT JOIN ts_user tu ON tu.USID = eo.createUserId - LEFT JOIN tr_report_user ru ON eo.id = ru.reportId LEFT JOIN (SELECT report_id, COUNT(id) AS thumbUp FROM report_log_book WHERE type = 3 GROUP BY report_id) AS thumbUpCount ON eo.id = thumbUpCount.report_id LEFT JOIN (SELECT report_id, COUNT(id) AS clicks FROM report_log_book WHERE type = 1 GROUP BY report_id) AS clicksCount ON eo.id = clicksCount.report_id LEFT JOIN (SELECT report_id, COUNT(id) AS download FROM report_log_book WHERE type = 2 GROUP BY report_id) AS downloadCount ON eo.id = downloadCount.report_id LEFT JOIN ts_report_user_rating AS trur ON eo.id = trur.report_id LEFT JOIN bus_process_name as bpn on bpn.data_id = eo.id and bpn.prc_type != '5' + LEFT JOIN ts_report_file rf on rf.report_id = eo.id and rf.state = 2 + LEFT JOIN ts_file f on f.FILE_ID = rf.file_id + LEFT JOIN report_log_book AS rlb ON rlb.user_id = #{pageVO.usid} AND rlb.report_id = eo.id AND rlb.type = 4 WHERE eo.DEL_FLAG = 0 @@ -173,23 +220,113 @@ + + - SELECT rm.id AS id, rm.name AS `name`, @@ -285,18 +422,19 @@ rm.maincontent AS maincontent, rm.department AS department, rm.`year` AS `year`, - rm.fileId AS fileId, - f.file_name as fileName, rm.confidentialLevel AS confidentialLevel, rm.privacyLevel AS privacyLevel, - rm.secrecy_last AS secrecyLast + rm.secrecy_last AS secrecyLast, + f.FILE_ID as fileId, f.file_name as fileName ,rf.id as rfId FROM `tt_report_manage` AS rm LEFT JOIN ts_user AS u ON u.USID = rm.createUserId LEFT JOIN ts_org as org on org.id = rm.department - LEFT JOIN ts_file as f on rm.fileId=f.file_id + LEFT JOIN ts_report_file rf on rf.report_id = rm.id and rf.state = 2 + LEFT JOIN ts_file f on f.FILE_ID = rf.file_id WHERE rm.id = #{reportId} AND rm.del_flag = 0 + diff --git a/adc-da-report/src/main/resources/mybatis/mapper/mysql/TreeLabelDao.xml b/adc-da-report/src/main/resources/mybatis/mapper/mysql/TreeLabelDao.xml index f261e1d..f40b1a7 100644 --- a/adc-da-report/src/main/resources/mybatis/mapper/mysql/TreeLabelDao.xml +++ b/adc-da-report/src/main/resources/mybatis/mapper/mysql/TreeLabelDao.xml @@ -21,6 +21,6 @@ diff --git a/adc-da-report/src/main/resources/mybatis/mapper/mysql/TtReportManageActMapper.xml b/adc-da-report/src/main/resources/mybatis/mapper/mysql/TtReportManageActMapper.xml index 3047e60..a272517 100644 --- a/adc-da-report/src/main/resources/mybatis/mapper/mysql/TtReportManageActMapper.xml +++ b/adc-da-report/src/main/resources/mybatis/mapper/mysql/TtReportManageActMapper.xml @@ -15,7 +15,6 @@ - @@ -23,7 +22,11 @@ - + + + + + @@ -34,9 +37,9 @@ id, - task_id, prc_id, data_id,report_id ,name, keycontent, maincontent, department, year, fileId, confidentialLevel, + task_id, prc_id, data_id,report_id ,name, keycontent, maincontent, department, year, confidentialLevel, privacyLevel, createUserId, createDate, updateDate, del_flag - ,secrecy_last,file_name + ,secrecy_last @@ -71,9 +74,6 @@ AND year LIKE CONCAT(CONCAT('%',#{pageVO.year}),'%') - - AND fileId LIKE CONCAT(CONCAT('%',#{pageVO.fileId}),'%') - AND confidentialLevel LIKE CONCAT(CONCAT('%',#{pageVO.confidentialLevel}),'%') @@ -133,12 +133,16 @@ SELECT a.id, - task_id, prc_id, data_id,report_id, name, keycontent, maincontent, department, + task_id, prc_id, data_id,a.report_id, name, keycontent, maincontent, department, org.LONG_NAME as departmentName, - year, fileId, confidentialLevel, privacyLevel, createUserId, createDate, updateDate, del_flag - ,secrecy_last,file_name + year,f.FILE_ID as fileId, f.file_name as fileName ,rf.id as rfId ,confidentialLevel, privacyLevel, createUserId, + createDate, + updateDate, a.del_flag + ,secrecy_last FROM a LEFT JOIN ts_org org on a.department = org.id + LEFT JOIN ts_report_file rf on rf.report_id = a.data_id and rf.state = 1 + LEFT JOIN ts_file f on f.FILE_ID = rf.file_id prc_id = #{prcId} 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 index 404a396..462953c 100644 --- 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 @@ -48,7 +48,7 @@ public class DictItemController { */ @ApiOperation(value = "修改数据字典记录") @PutMapping("/edit") - public ResponseMessage edit(@RequestBody DictItemVo dictItemVo) { + public ResponseMessage edit(@Valid @RequestBody DictItemVo dictItemVo) { return dictItemService.edit(dictItemVo); } @@ -66,7 +66,7 @@ public class DictItemController { */ @ApiOperation(value = "新增数据字典记录") @PostMapping("/add") - public ResponseMessage add(@RequestBody DictItemVo dictItemVo) { + public ResponseMessage add(@Valid @RequestBody DictItemVo dictItemVo) { return dictItemService.add(dictItemVo); } } diff --git a/adc-da-sys/src/main/java/com/adc/da/sys/dao/mysql/OrgEODao.java b/adc-da-sys/src/main/java/com/adc/da/sys/dao/mysql/OrgEODao.java index 15e00b3..945c497 100644 --- a/adc-da-sys/src/main/java/com/adc/da/sys/dao/mysql/OrgEODao.java +++ b/adc-da-sys/src/main/java/com/adc/da/sys/dao/mysql/OrgEODao.java @@ -17,4 +17,6 @@ public interface OrgEODao extends BaseMapper { IPage selectPageByVO(Page page,@Param("pageVO")OrgEOPage orgEOPage); long selectCountByOrgCode(@Param("pageVO")OrgEO orgEO); + + List selectNameAll(OrgEO orgEO); } diff --git a/adc-da-sys/src/main/java/com/adc/da/sys/dao/mysql/UserEODao.java b/adc-da-sys/src/main/java/com/adc/da/sys/dao/mysql/UserEODao.java index fc74d38..5672503 100644 --- a/adc-da-sys/src/main/java/com/adc/da/sys/dao/mysql/UserEODao.java +++ b/adc-da-sys/src/main/java/com/adc/da/sys/dao/mysql/UserEODao.java @@ -50,4 +50,7 @@ public interface UserEODao extends BaseMapper { List getOwnLeader(@Param("Vo") List orgEOList); long listCount(@Param("account") String account, @Param("roleName") String roleName); + + List selectAccout(); + } diff --git a/adc-da-sys/src/main/java/com/adc/da/sys/entity/OrgEO.java b/adc-da-sys/src/main/java/com/adc/da/sys/entity/OrgEO.java index bedb84b..22cb25b 100644 --- a/adc-da-sys/src/main/java/com/adc/da/sys/entity/OrgEO.java +++ b/adc-da-sys/src/main/java/com/adc/da/sys/entity/OrgEO.java @@ -46,6 +46,12 @@ public class OrgEO extends BaseEntity implements Serializable { @TableField("PARENT_ID") private String ParentID; + /** + * 父部门 编码 + */ + @TableField(exist = false) + private String ParentCode; + /** * 部门路径 */ 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 index bcddedf..1e53284 100644 --- 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 @@ -62,6 +62,11 @@ public class DictItemServiceImpl extends ServiceImpl item = query().like("item_name", dictItemName).list(); + return item.size() > 0; + } + @Override public ResponseMessage add(DictItemVo dictItemVo) { //判断上级字典id是否存在 @@ -100,7 +110,10 @@ public class DictItemServiceImpl extends ServiceImpl userEOArrayList = dataMap.get(key); ArrayList addList = new ArrayList<>(); ArrayList addRoleList = new ArrayList<>(); + ArrayList addOrgList = new ArrayList<>(); userEOArrayList.forEach(userImportVO -> { UserEO userEO = new UserEO(); BeanUtils.copyProperties(userImportVO, userEO); + userEO.setUsid(UUID.randomUUID().toString().replace("-","")); userEO.setDelFlag(0); userEO.setIsSelf(UserBelongEnum.LOCAL.getValue()); userEO.setUsid(com.adc.da.util.utils.UUID.randomUUID10()); @@ -379,7 +386,16 @@ public class UserEOServiceImpl implements IUserEoService { userEO.setUpdateTime(simpleDateFormat.format(date)); userEO.setRoleId(userImportVO.getRoleId()); addList.add(userEO); - + //部门 + if (StringUtils.isNotEmpty(userImportVO.getOrgId())){ + String[] split = userImportVO.getOrgId().split(","); + for (String s : split) { + UserOrgEO userOrgEO = new UserOrgEO(); + userOrgEO.setUserId(userEO.getUsid()); + userOrgEO.setOrgId(s); + addOrgList.add(userOrgEO); + } + } }); saveBatch(addList); //添加角色 @@ -391,6 +407,9 @@ public class UserEOServiceImpl implements IUserEoService { addRoleList.add(userRoleEO); }); userRoleEODao.insertBatch(addRoleList); + if (addOrgList.size()>0){ + userOrgEODao.insertBatch(addOrgList); + } } //更新 @@ -398,6 +417,7 @@ public class UserEOServiceImpl implements IUserEoService { List userEOArrayList = dataMap.get(key); ArrayList userIDList = new ArrayList<>(); ArrayList userRoleList = new ArrayList<>(); + ArrayList addOrgList = new ArrayList<>(); userEOArrayList.forEach(userImportVO -> { QueryWrapper queryWrapper = new QueryWrapper(); queryWrapper.eq("ACCOUNT", userImportVO.getAccount()); @@ -414,12 +434,28 @@ public class UserEOServiceImpl implements IUserEoService { userRoleEO.setUserId(userEO.getUsid()); userRoleEO.setRoleId(userImportVO.getRoleId()); userRoleList.add(userRoleEO); + + if (StringUtils.isNotEmpty(userImportVO.getOrgId())){ + String[] split = userImportVO.getOrgId().split(","); + for (String s : split) { + UserOrgEO userOrgEO = new UserOrgEO(); + userOrgEO.setUserId(userEO.getUsid()); + userOrgEO.setOrgId(s); + addOrgList.add(userOrgEO); + } + } } }); QueryWrapper deleteWapper = new QueryWrapper<>(); deleteWapper.in("user_id", userIDList); userRoleEODao.delete(deleteWapper); userRoleEODao.insertBatch(userRoleList); + + //保存用户部门关系表 + userOrgEODao.deleteBatchByUserIds(userIDList); + if (addOrgList.size()>0){ + userOrgEODao.insertBatch(addOrgList); + } } }); } @@ -503,6 +539,8 @@ public class UserEOServiceImpl implements IUserEoService { return user.getAccount(); } + + void checkExcel(List list) { if (CollectionUtils.isEmpty(list)) { throw new AdcDaBaseException("数据不能为空"); @@ -516,25 +554,27 @@ public class UserEOServiceImpl implements IUserEoService { //所有用户 List existUserAccounts = new ArrayList<>(); List existUserAccountsUpdate = new ArrayList<>(); - QueryWrapper queryWrapper = new QueryWrapper<>(); - queryWrapper.eq("del_flag", 0); - List allUsers = dao.selectList(queryWrapper); - for (UserEO userEO : allUsers) { - existUserAccounts.add(userEO.getAccount()); - existUserAccountsUpdate.add(userEO.getAccount()); - } - + List accoutList = dao.selectAccout(); + existUserAccounts = accoutList; + existUserAccountsUpdate = accoutList; + //所有部门 + List orgEOList = orgEODao.selectNameAll(new OrgEO()); + Map orgEOMap = orgEOList.stream().collect(Collectors.toMap(OrgEO::getLongName, e -> e, + (k1,k2)->k1)); for (int i = 0; i < list.size(); i++) { UserImportVO userImportVO = list.get(i); if (StringUtils.isEmpty(userImportVO.getAccount())) { throw new AdcDaBaseException("第"+(i+1)+"行"+"用户名不能为空"); } + if (userImportVO.getAccount().length() > 20) { + throw new AdcDaBaseException("第"+(i+1)+"行"+"用户名不能超过20字符"); + } if (StringUtils.isEmpty(userImportVO.getUsname())) { throw new AdcDaBaseException("第"+(i+1)+"行"+"姓名不能为空"); } if (userImportVO.getUsname().length() > 20) { - throw new AdcDaBaseException("第"+(i+1)+"行"+"姓名不超过20字符"); + throw new AdcDaBaseException("第"+(i+1)+"行"+"姓名不能超过20字符"); } if ("admin".equals(userImportVO.getAccount()) || "root".equals(userImportVO.getAccount()) || @@ -544,11 +584,31 @@ public class UserEOServiceImpl implements IUserEoService { throw new AdcDaBaseException("第"+(i+1)+"行"+"用户名不符合规则"); } if (StringUtils.isNotBlank(userImportVO.getEmail())) { + if (userImportVO.getEmail().length() > 50 ) { + throw new AdcDaBaseException("第"+(i+1)+"行"+"邮箱长度不能超过50"); + } + if (!(userImportVO.getEmail().matches("^[a-zA-Z0-9_-]+@[a-zA-Z0-9_-]+(\\.[a-zA-Z0-9_-]+)+$"))) { + throw new AdcDaBaseException("第"+(i+1)+"行"+"邮箱不符合规则!"); + } userImportVO.setEmail(userImportVO.getEmail().replace("amp;", "")); } if (StringUtils.isNotBlank(userImportVO.getCellPhoneNumber())) { - if (!userImportVO.getCellPhoneNumber().matches("^[1][3,4,5,7,8,9][0-9]{9}$")) { - throw new AdcDaBaseException("第"+(i+1)+"行"+"手机号不符合规则"); + if (!(userImportVO.getCellPhoneNumber().matches("^(?:\\+86)?-(1[3456789]\\d)\\d{8}$") || + userImportVO.getCellPhoneNumber().matches("^1(3\\d|4[5-9]|5[0-35-9]|6[56]|7[0135678]|8\\d|9[89])\\d{8}$"))) { + throw new AdcDaBaseException("第"+(i+1)+"行"+"手机号不符合规则!"); + } + } + if (StringUtils.isNotEmpty(userImportVO.getOrgName())) { + userImportVO.setOrgName(userImportVO.getOrgName().replace(",", ",")); + String[] split = userImportVO.getOrgName().split(","); + for (String s : split) { + OrgEO orgEO = orgEOMap.get(s); + if (orgEO == null){ + throw new AdcDaBaseException("第"+(i+1)+"行"+s+"部门不存在"); + }else { + userImportVO.setOrgId(StringUtils.isEmpty(userImportVO.getOrgId()) ? orgEO.getId() + :userImportVO.getOrgId() + "," + orgEO.getId()); + } } } if (StringUtils.isEmpty(userImportVO.getOperation())) { @@ -557,9 +617,15 @@ public class UserEOServiceImpl implements IUserEoService { // if (StringUtils.isEmpty(userImportVO.getIsUse())) { // throw new AdcDaBaseException("第"+(i+1)+"行"+"是否启用不能为空"); // } + if (StringUtils.isEmpty(userImportVO.getRoleName())){ + throw new AdcDaBaseException("第"+(i+1)+"行"+"角色:不能为空"); + } if (!roleEOMap.keySet().contains(userImportVO.getRoleName())) { throw new AdcDaBaseException("第"+(i+1)+"行"+"角色:" + userImportVO.getRoleName() + "不存在,请检查"); } + if(StringUtils.isNotEmpty(userImportVO.getOperation()) && !"add".equals(userImportVO.getOperation()) && !"full".equals(userImportVO.getOperation())){ + throw new AdcDaBaseException("第"+(i+1)+"行"+"操作(add添加、full覆盖角色)只能填写add和full"); + } if ("add".equals(userImportVO.getOperation())) { if (existUserAccounts.contains(userImportVO.getAccount())) { throw new AdcDaBaseException("第"+(i+1)+"行"+"用户名:" + userImportVO.getAccount() + "已存在,请检查"); @@ -573,8 +639,6 @@ public class UserEOServiceImpl implements IUserEoService { } } userImportVO.setRoleId(roleEOMap.get(userImportVO.getRoleName()).getId()); - - } } 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 index 542bbc1..3528a98 100644 --- 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 @@ -4,6 +4,8 @@ import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; +import javax.validation.constraints.NotNull; + /** * @author CaiHaohan */ @@ -40,6 +42,7 @@ public class DictItemVo { /** * 排序 */ + @NotNull(message = "缺少排序字段") private Double itemOrder; } diff --git a/adc-da-sys/src/main/java/com/adc/da/sys/vo/UserImportVO.java b/adc-da-sys/src/main/java/com/adc/da/sys/vo/UserImportVO.java index 7aaf92a..e75e994 100644 --- a/adc-da-sys/src/main/java/com/adc/da/sys/vo/UserImportVO.java +++ b/adc-da-sys/src/main/java/com/adc/da/sys/vo/UserImportVO.java @@ -37,6 +37,14 @@ public class UserImportVO { @Excel(name = "邮箱", width = 20) private String email; + + private String orgId; + /** + * 部门 + */ + @Excel(name = "部门", width = 20) + private String orgName; + /** * 创建时间 */ diff --git a/adc-da-sys/src/main/resources/mybatis/mapper/sys/mysql/OrgEOMapper.xml b/adc-da-sys/src/main/resources/mybatis/mapper/sys/mysql/OrgEOMapper.xml index 1093a10..b413d34 100644 --- a/adc-da-sys/src/main/resources/mybatis/mapper/sys/mysql/OrgEOMapper.xml +++ b/adc-da-sys/src/main/resources/mybatis/mapper/sys/mysql/OrgEOMapper.xml @@ -32,9 +32,27 @@ + diff --git a/adc-da-sys/src/main/resources/mybatis/mapper/sys/mysql/UserEOMapper.xml b/adc-da-sys/src/main/resources/mybatis/mapper/sys/mysql/UserEOMapper.xml index f662eeb..23731fe 100644 --- a/adc-da-sys/src/main/resources/mybatis/mapper/sys/mysql/UserEOMapper.xml +++ b/adc-da-sys/src/main/resources/mybatis/mapper/sys/mysql/UserEOMapper.xml @@ -290,6 +290,10 @@ and u.del_flag = 0 + diff --git a/adc-da-sys/src/main/resources/template/用户导入模板.xlsx b/adc-da-sys/src/main/resources/template/用户导入模板.xlsx index a7cc340..07dfe36 100644 Binary files a/adc-da-sys/src/main/resources/template/用户导入模板.xlsx and b/adc-da-sys/src/main/resources/template/用户导入模板.xlsx differ diff --git a/report-activity/src/main/java/com/adc/da/wkflow/business_activiti/service/ActivitDefineService.java b/report-activity/src/main/java/com/adc/da/wkflow/business_activiti/service/ActivitDefineService.java index 611751d..3eae4e1 100644 --- a/report-activity/src/main/java/com/adc/da/wkflow/business_activiti/service/ActivitDefineService.java +++ b/report-activity/src/main/java/com/adc/da/wkflow/business_activiti/service/ActivitDefineService.java @@ -1,12 +1,15 @@ package com.adc.da.wkflow.business_activiti.service; import com.adc.da.report.dao.mysql.PowerApplyActDao; +import com.adc.da.report.dao.mysql.ReportFileDao; import com.adc.da.report.dao.mysql.ReportLabelDao; import com.adc.da.report.dao.mysql.TtReportManageActDao; import com.adc.da.report.eo.PowerApplyAct; +import com.adc.da.report.eo.ReportFile; import com.adc.da.report.eo.ReportLabelEntity; import com.adc.da.report.eo.TtReportManageAct; import com.adc.da.report.service.IPowerApplyActService; +import com.adc.da.report.service.IReportFileService; import com.adc.da.report.service.IReportLabelService; import com.adc.da.report.service.ITtReportManageActService; import com.adc.da.util.exception.AdcDaBaseException; @@ -19,7 +22,10 @@ import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; -import java.util.*; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; +import java.util.UUID; @Service public class ActivitDefineService { @@ -42,7 +48,11 @@ public class ActivitDefineService { private ReportLabelDao reportLabelDao; @Autowired private IReportLabelService iReportLabelService; + @Autowired + private IReportFileService iReportFileService; + @Autowired + private ReportFileDao reportFileDao; //保存data数据 public String saveOrUpdateDate(String prcType, String dataJson,String taskId,String prcId,String reportId) { if (StringUtils.isBlank(reportId)){ @@ -110,11 +120,22 @@ public class ActivitDefineService { JSONArray objects = JSONObject.parseArray(label); String lastLabel =(String)objects.get(objects.size()-1); ReportLabelEntity reportLabelEntity = new ReportLabelEntity(com.adc.da.util.utils.UUID.randomUUID10() - ,ttReportManageAct.getDataId(), label,lastLabel); + ,ttReportManageAct.getDataId(), label,lastLabel,1); labelList.add(reportLabelEntity); } iReportLabelService.saveBatch(labelList); } + // 文件 + reportFileDao.delByReportId(new ReportFile(reportId,1)); + List reportFiles = new ArrayList<>(); + for (ReportFile reportFile : ttReportManageAct.getFileList()) { + reportFile.setId(UUID.randomUUID().toString().replace("-","")); + reportFile.setReportId(ttReportManageAct.getDataId()); +// reportFile.setFileId(s); + reportFile.setState(1); + reportFiles.add(reportFile); + } + iReportFileService.saveBatch(reportFiles); }else if ("5".equals(prcType)){ // 编辑 TtReportManageAct ttReportManageAct = JSONObject.parseObject(dataJson, TtReportManageAct.class); @@ -133,11 +154,22 @@ public class ActivitDefineService { JSONArray objects = JSONObject.parseArray(label); String lastLabel =(String)objects.get(objects.size()-1); ReportLabelEntity reportLabelEntity = new ReportLabelEntity(com.adc.da.util.utils.UUID.randomUUID10() - ,ttReportManageAct.getDataId(), label,lastLabel); + ,ttReportManageAct.getDataId(), label,lastLabel,1); labelList.add(reportLabelEntity); } iReportLabelService.saveBatch(labelList); } + // 文件 + reportFileDao.delByReportId(new ReportFile(reportId,1)); + List reportFiles = new ArrayList<>(); + for (ReportFile reportFile : ttReportManageAct.getFileList()) { + reportFile.setId(UUID.randomUUID().toString().replace("-","")); + reportFile.setReportId(ttReportManageAct.getDataId()); +// reportFile.setFileId(s); + reportFile.setState(1); + reportFiles.add(reportFile); + } + iReportFileService.saveBatch(reportFiles); }else { throw new AdcDaBaseException("没有流程类型"+prcType); } diff --git a/report-activity/src/main/java/com/adc/da/wkflow/business_activiti/task/TodoTaskController.java b/report-activity/src/main/java/com/adc/da/wkflow/business_activiti/task/TodoTaskController.java index 6a7cef1..3c52146 100644 --- a/report-activity/src/main/java/com/adc/da/wkflow/business_activiti/task/TodoTaskController.java +++ b/report-activity/src/main/java/com/adc/da/wkflow/business_activiti/task/TodoTaskController.java @@ -2,11 +2,9 @@ package com.adc.da.wkflow.business_activiti.task; import cn.hutool.core.util.StrUtil; import com.adc.da.login.util.UserUtils; -import com.adc.da.report.dao.mysql.PowerApplyActDao; -import com.adc.da.report.dao.mysql.ReportDao; -import com.adc.da.report.dao.mysql.TreeLabelDao; -import com.adc.da.report.dao.mysql.TtReportManageActDao; +import com.adc.da.report.dao.mysql.*; import com.adc.da.report.eo.ReportEntity; +import com.adc.da.report.eo.ReportFile; import com.adc.da.report.eo.TtReportManageAct; import com.adc.da.report.vo.PowerApplyActPageVO; import com.adc.da.sys.service.iservice.IUserEoService; @@ -87,6 +85,9 @@ public class TodoTaskController { @Autowired private TtReportManageActDao ttReportManageActDao; + @Autowired + private ReportFileDao reportFileDao; + @Autowired private ReportDao reportDao; @@ -209,8 +210,10 @@ public class TodoTaskController { String taskId = entry.getValue().get(0).get("id").toString(); if (busProcessName != null) { ReportEntity reportEntity = this.selectReport(busProcessName.getPrcType(),busProcessName.getDataId()); - busProcessName.setConfidentialLevel(reportEntity.getConfidentialLevel()); - busProcessName.setPrivacyLevel(reportEntity.getPrivacyLevel()); + if(reportEntity != null){ + busProcessName.setConfidentialLevel(reportEntity.getConfidentialLevel()); + busProcessName.setPrivacyLevel(reportEntity.getPrivacyLevel()); + } busProcessName.setTaskId(taskId); busProcessName.setTaskInfo(entry.getValue().get(0).get("name").toString()); busProcessName.setTaskDefinitionKey(entry.getValue().get(0).get("taskDefinitionKey").toString()); @@ -619,8 +622,21 @@ public class TodoTaskController { }else { ttReportManageAct = ttReportManageActDao.selectByPrcId(pId); } - List labelList = treeLableDao.selectIdByReport(ttReportManageAct.getDataId()); - ttReportManageAct.setLabelList(labelList); + // 为空说明流程已经结束 + if (ttReportManageAct.getFileList().size() == 0){ + List reportFiles = + reportFileDao.selectByReport(new ReportFile(ttReportManageAct.getDataId(),2)); + ttReportManageAct.setFileList(reportFiles); + } + List labelList = treeLableDao.selectIdByReport(ttReportManageAct.getDataId(),1); + if (labelList.size()>0){ + //流程未结束 + ttReportManageAct.setLabelList(labelList); + }else { + //流程已结束 + labelList = treeLableDao.selectIdByReport(ttReportManageAct.getDataId(),2); + ttReportManageAct.setLabelList(labelList); + } String string = JSONArray.toJSONString(ttReportManageAct); //去对应的 数据表查数据 busProcessNewVO.setDataJson(string); @@ -633,8 +649,21 @@ public class TodoTaskController { }else { ttReportManageAct = ttReportManageActDao.selectByPrcId(pId); } - List labelList = treeLableDao.selectIdByReport(ttReportManageAct.getDataId()); - ttReportManageAct.setLabelList(labelList); + // 为空说明流程已经结束 + if (ttReportManageAct.getFileList().size() == 0){ + List reportFiles = + reportFileDao.selectByReport(new ReportFile(ttReportManageAct.getDataId(),2)); + ttReportManageAct.setFileList(reportFiles); + } + List labelList = treeLableDao.selectIdByReport(ttReportManageAct.getDataId(),1); + if (labelList.size()>0){ + //流程未结束 + ttReportManageAct.setLabelList(labelList); + }else { + //流程已结束 + labelList = treeLableDao.selectIdByReport(ttReportManageAct.getDataId(),2); + ttReportManageAct.setLabelList(labelList); + } String string = JSONArray.toJSONString(ttReportManageAct); //去对应的 数据表查数据 busProcessNewVO.setDataJson(string);