From ff1fec7eae681e89e607fd441d2597ab67b5ed2a Mon Sep 17 00:00:00 2001 From: guyue <1721849008@qq.com> Date: 星期二, 12 八月 2025 19:04:34 +0800 Subject: [PATCH] 修改查看时间和删除关键词 --- src/main/java/com/linghu/controller/KeywordController.java | 487 ++++++----------------------------------------------- 1 files changed, 58 insertions(+), 429 deletions(-) diff --git a/src/main/java/com/linghu/controller/KeywordController.java b/src/main/java/com/linghu/controller/KeywordController.java index f5443cf..eda21a9 100644 --- a/src/main/java/com/linghu/controller/KeywordController.java +++ b/src/main/java/com/linghu/controller/KeywordController.java @@ -1,17 +1,9 @@ package com.linghu.controller; import com.alibaba.excel.EasyExcel; -import com.alibaba.excel.ExcelWriter; -import com.alibaba.excel.context.AnalysisContext; -import com.alibaba.excel.event.AnalysisEventListener; -import com.alibaba.excel.write.handler.SheetWriteHandler; -import com.alibaba.excel.write.metadata.WriteSheet; -import com.alibaba.excel.write.metadata.holder.WriteSheetHolder; -import com.alibaba.excel.write.metadata.holder.WriteWorkbookHolder; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.linghu.config.FinalStatus; import com.linghu.listener.KeywordExcelListener; -import com.linghu.mapper.KeywordMapper; -import com.linghu.mapper.ReferenceMapper; import com.linghu.model.common.ResponseResult; import com.linghu.model.dto.ExportFeedDTO; @@ -20,44 +12,33 @@ import com.linghu.model.dto.ExportStaticsDTO; import com.linghu.model.entity.*; import com.linghu.model.excel.*; +import com.linghu.model.validator.UpdateGroup; import com.linghu.model.vo.*; -import com.linghu.model.excel.PlatformExcel; import com.linghu.model.vo.KeywordStaticsListVO; -import com.linghu.model.vo.KeywordStaticsVO; import com.linghu.model.vo.PlatformProportionVO; import com.linghu.model.vo.ResultListVO; import com.linghu.service.KeywordService; -import com.linghu.service.PlatformService; + +import com.linghu.service.OrderService; import com.linghu.service.ReferenceService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; -import org.apache.poi.ss.usermodel.DataValidation; -import org.apache.poi.ss.usermodel.DataValidationConstraint; -import org.apache.poi.ss.usermodel.DataValidationHelper; -import org.apache.poi.ss.usermodel.Sheet; -import org.apache.poi.ss.util.CellRangeAddressList; + import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpHeaders; import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; -import org.springframework.util.StringUtils; -import org.springframework.web.bind.MethodArgumentNotValidException; +import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile; -import javax.servlet.http.HttpServletResponse; -import javax.xml.bind.ValidationException; +import javax.validation.Valid; import java.io.ByteArrayOutputStream; import java.io.IOException; -import java.time.LocalDateTime; -import java.io.IOException; -import java.time.format.DateTimeFormatter; -import java.time.format.DateTimeParseException; + import java.util.ArrayList; import java.util.List; -import java.util.Map; -import java.util.Objects; -import java.util.stream.Collectors; + @RestController @RequestMapping("/keyword") @@ -67,14 +48,10 @@ private KeywordService keywordService; @Autowired - private KeywordMapper keywordMapper; + private ReferenceService referenceService; @Autowired - private ReferenceService referenceService; - @Autowired - private ReferenceMapper referenceMapper; - @Autowired - private PlatformService platformService; + private OrderService orderService; /** * 关键词统计 EChart图 @@ -83,71 +60,25 @@ @ApiOperation(value = "EChart图") public ResponseResult<KeywordStaticsListVO> statics(@RequestParam("id") Integer keywordId, @RequestParam(value = "questionId", required = false) Integer questionId) { - // return keywordService.statics(keywordId, questionId); } @GetMapping("/getTime") @ApiOperation(value = "查看时间") public ResponseResult<GetTimeVO> getTime(@RequestParam("id") Integer keywordId,@RequestParam(value = "questionId", required = false) Integer questionId) { - // - GetTimeVO vo = new GetTimeVO(); - Keyword keyword = keywordService.getById(keywordId); - - LambdaQueryWrapper<Reference> queryWrapper = new LambdaQueryWrapper<>(); - queryWrapper.eq(Reference::getKeyword_id, keywordId); - if (questionId != null) { - queryWrapper.eq(Reference::getQuestion_id, questionId); - } - queryWrapper.eq(Reference::getNum,keyword.getNum()); - - List<Reference> list = referenceService.list(queryWrapper); - if (null != list && !list.isEmpty()) { - vo.setNow(list.get(0).getCreate_time()); - } - //首次 - LambdaQueryWrapper<Reference> queryWrapper2 = new LambdaQueryWrapper<>(); - queryWrapper2.eq(Reference::getKeyword_id, keywordId); - if (questionId != null) { - queryWrapper2.eq(Reference::getQuestion_id, questionId); - } - queryWrapper2.eq(Reference::getNum,1); - - List<Reference> list2 = referenceService.list(queryWrapper2); - if (null != list2 && !list2.isEmpty()) { - vo.setFirst(list2.get(0).getCreate_time()); - } - - return ResponseResult.success(vo); + return keywordService.getTimeVOResponseResult(keywordId, questionId); } + + @PostMapping(value = "/exportStatics") @ApiOperation(value = "EChart图导出") - public ResponseEntity<byte[]> exportStatics(@RequestBody ExportStaticsDTO exportStaticsDTO) { + public ResponseEntity<byte[]> exportStatics(@Valid @RequestBody ExportStaticsDTO exportStaticsDTO) { - Keyword keyword = keywordMapper.selectById(exportStaticsDTO.getKeywordId()); - List<KeywordStaticsVO> voList=new ArrayList<>(); - if (exportStaticsDTO.getIsFirst()==0){ - voList = keywordMapper.statics(exportStaticsDTO.getKeywordId(), exportStaticsDTO.getQuestionId(), keyword.getNum()); - - }else { - voList = keywordMapper.statics(exportStaticsDTO.getKeywordId(), exportStaticsDTO.getQuestionId(), 1); - - } - - // 3. 导出Excel - ByteArrayOutputStream out = new ByteArrayOutputStream(); - EasyExcel.write(out, KeywordStaticsVO.class) - .sheet("引用数据") - .doWrite(voList); - - // 4. 构建响应 - return ResponseEntity.ok() - .header(HttpHeaders.CONTENT_DISPOSITION, "attachment;filename=references_export.xlsx") - .contentType(MediaType.APPLICATION_OCTET_STREAM) - .body(out.toByteArray()); + return keywordService.exportEChart(exportStaticsDTO); } + /** * 根据类别查看 @@ -158,85 +89,21 @@ @RequestParam(value = "questionId", required = false) Integer questionId, @RequestParam(value = "typeId", required = false) Integer typeId, @RequestParam(value = "isNow") Integer isNow) { - Keyword keyword = keywordService.getById(keywordId); - if (isNow == 0) { - List<PlatformProportionVO> result = keywordMapper.getResultByTypeId(keywordId, questionId, - keyword.getNum() , typeId); - // 检查列表是否为空或只包含null元素 - boolean isValid = result != null && result.stream() - .anyMatch(Objects::nonNull); - - return isValid ? ResponseResult.success(result) - : ResponseResult.success(new ArrayList<>()); - }else { - List<PlatformProportionVO> result = keywordMapper.getResultByTypeId(keywordId, questionId, 1, typeId); - boolean isValid = result != null && result.stream() - .anyMatch(Objects::nonNull); - - return isValid ? ResponseResult.success(result) - : ResponseResult.success(new ArrayList<>()); - - } + return keywordService.getByTypeId(keywordId, questionId, typeId, isNow); } + + /** * 导出:根据类别查看 */ @PostMapping(value = "/exportGetResultByTypeId") @ApiOperation(value = "导出:根据类别查看") - public ResponseEntity<byte[]> exportGetResultByTypeId(@RequestBody ExportGetResultDTO dto) { - Keyword keyword = keywordService.getById(dto.getKeywordId()); - List<PlatformProportionVO> result =new ArrayList<>(); - - if (dto.getIsNow()==0){ - result = keywordMapper.getResultByTypeId(dto.getKeywordId(), dto.getQuestionId(), - keyword.getNum() , dto.getTypeId()); - }else { - result = keywordMapper.getResultByTypeId(dto.getKeywordId(), dto.getQuestionId(), - 1 , dto.getTypeId()); - } - - //查询所有平台名称 - List<String> typeNameList = result.stream() - .map(PlatformProportionVO::getType_name) - .filter(Objects::nonNull) - .collect(Collectors.toList()); - - // 3. 导出Excel - ByteArrayOutputStream out = new ByteArrayOutputStream(); - // 3. 使用自定义的SheetWriteHandler来添加数据验证 - ExcelWriter excelWriter = EasyExcel.write(out, PlatformProportionVO.class) - .registerWriteHandler(new SheetWriteHandler() { - @Override - public void afterSheetCreate(WriteWorkbookHolder writeWorkbookHolder, - WriteSheetHolder writeSheetHolder) { - Sheet sheet = writeSheetHolder.getSheet(); - - // 添加数据验证(下拉框) - DataValidationHelper helper = sheet.getDataValidationHelper(); - CellRangeAddressList rangeList = new CellRangeAddressList( - 1, 65535, 0, 0); // D列(第4列) - - DataValidationConstraint constraint = helper.createExplicitListConstraint( - typeNameList.toArray(new String[0])); - DataValidation validation = helper.createValidation(constraint, rangeList); - sheet.addValidationData(validation); - } - }) - .build(); - - - WriteSheet writeSheet = EasyExcel.writerSheet("平台分布占比").build(); - excelWriter.write(result, writeSheet); - excelWriter.finish(); - - // 4. 构建响应 - return ResponseEntity.ok() - .header(HttpHeaders.CONTENT_DISPOSITION, "attachment;filename=references_export.xlsx") - .contentType(MediaType.APPLICATION_OCTET_STREAM) - .body(out.toByteArray()); + public ResponseEntity<byte[]> exportGetResultByTypeId(@Valid @RequestBody ExportGetResultDTO dto) { + return keywordService.exportResult(dto); } + /** * 根据平台查看 @@ -247,82 +114,31 @@ @RequestParam(value = "questionId", required = false) Integer questionId, @RequestParam(value = "platformId", required = false) Integer platformId, @RequestParam(value = "isNow") Integer isNow) { - Keyword keyword = keywordService.getById(keywordId); - if (isNow == 0) { - List<ResultListVO> result = keywordMapper.getResultByPlatformId(keywordId, questionId, keyword.getNum(), - platformId); - boolean isValid = result != null && result.stream() - .anyMatch(Objects::nonNull); - - return isValid ? ResponseResult.success(result) - : ResponseResult.success(new ArrayList<>()); - } else { - List<ResultListVO> result = keywordMapper.getResultByPlatformId(keywordId, questionId, 1, - platformId); - boolean isValid = result != null && result.stream() - .anyMatch(Objects::nonNull); - - return isValid ? ResponseResult.success(result) - : ResponseResult.success(new ArrayList<>()); - } + return keywordService.getResultByPlatform(keywordId, questionId, platformId, isNow); } + + /** * 根据平台查看 0-当前轮 1-代表前1轮 2-代表前2轮 */ @PostMapping("/exportGetResultByPlatformId") @ApiOperation(value = "导出:根据平台查看") - public ResponseEntity<byte[]> exportGetResultByPlatformId(@RequestBody ExportGetResultByPlatformIdDTO dto) { - Keyword keyword = keywordService.getById(dto.getKeywordId()); - List<ResultListVO> result=new ArrayList<>(); - if (dto.getIsNow()==0){ - result = keywordMapper.getResultByPlatformId(dto.getKeywordId(), dto.getQuestionId(), keyword.getNum(), - dto.getPlatformId()); - }else { - result = keywordMapper.getResultByPlatformId(dto.getKeywordId(), dto.getQuestionId(), 1, - dto.getPlatformId()); - } - //查询所有平台名称 - List<String> platfromNames = result.stream() - .map(ResultListVO::getPlatform_name) - .filter(Objects::nonNull) - .collect(Collectors.toList()); - // 3. 导出Excel - ByteArrayOutputStream out = new ByteArrayOutputStream(); - - // 3. 使用自定义的SheetWriteHandler来添加数据验证 - ExcelWriter excelWriter = EasyExcel.write(out, ResultListVO.class) - .registerWriteHandler(new SheetWriteHandler() { - @Override - public void afterSheetCreate(WriteWorkbookHolder writeWorkbookHolder, - WriteSheetHolder writeSheetHolder) { - Sheet sheet = writeSheetHolder.getSheet(); - - // 添加数据验证(下拉框) - DataValidationHelper helper = sheet.getDataValidationHelper(); - CellRangeAddressList rangeList = new CellRangeAddressList( - 1, 65535, 0, 0); // D列(第4列) - - DataValidationConstraint constraint = helper.createExplicitListConstraint( - platfromNames.toArray(new String[0])); - DataValidation validation = helper.createValidation(constraint, rangeList); - sheet.addValidationData(validation); - } - }) - .build(); - - - WriteSheet writeSheet = EasyExcel.writerSheet("平台分布占比").build(); - excelWriter.write(result, writeSheet); - excelWriter.finish(); - - // 4. 构建响应 - return ResponseEntity.ok() - .header(HttpHeaders.CONTENT_DISPOSITION, "attachment;filename=references_export.xlsx") - .contentType(MediaType.APPLICATION_OCTET_STREAM) - .body(out.toByteArray()); + public ResponseEntity<byte[]> exportGetResultByPlatformId(@Valid @RequestBody ExportGetResultByPlatformIdDTO dto) { + return keywordService.exportResultByPlatform(dto); } + + + /** + * 根据平台查看 0-当前轮 1-代表前1轮 2-代表前2轮 + */ + @PostMapping("/exportGetResultByPlatformId2") + @ApiOperation(value = "导出:根据平台查看2") + public ResponseEntity<byte[]> exportGetResultByPlatformId2(@Valid @RequestBody ExportGetResultByPlatformIdDTO dto) { + return keywordService.exportResultByPlatform2(dto); + } + /** * 查看详情 @@ -342,164 +158,19 @@ @GetMapping("/download") @ApiOperation("下载投喂模板") public ResponseEntity<byte[]> downTemplate() throws IOException { - ByteArrayOutputStream out = new ByteArrayOutputStream(); - EasyExcel.write(out, ReferenceExcel.class).sheet("投喂模板").doWrite(new ArrayList<>()); - - return ResponseEntity.ok() - .header(HttpHeaders.CONTENT_DISPOSITION, "attachment;filename=platform_template.xlsx") - .contentType(MediaType.APPLICATION_OCTET_STREAM) - .body(out.toByteArray()); + return keywordService.downloadKeywrodFeed(); } + + /** * 投喂 */ @PostMapping("/importFeed/{keywordId}") @ApiOperation("投喂") public ResponseResult<List<FeedExportExcel>> importTemplate(@PathVariable("keywordId") Integer keywordId,@RequestParam("file") MultipartFile file) { - Keyword keyword = keywordService.getById(keywordId); - //查找出最近一次的结果 - List<FeedExportExcel> references = referenceMapper.importTemplateList(keywordId,keyword.getNum()); - //平台名称 - Map<String, FeedExportExcel> nameMap = references.stream() - .collect(Collectors.toMap( - FeedExportExcel::getPlatform_name, // Key映射 - excel -> excel, // Value映射 - (oldValue, newValue) -> oldValue // 键冲突处理(保留旧值) - )); - //URL - Map<String, FeedExportExcel> urlMap = references.stream() - .collect(Collectors.toMap( - FeedExportExcel::getUrl, // Key映射 - excel -> excel, // Value映射 - (oldValue, newValue) -> oldValue // 键冲突处理(保留旧值) - )); - //title - Map<String, FeedExportExcel> titleMap = references.stream() - .collect(Collectors.toMap( - FeedExportExcel::getTitle, // Key映射 - excel -> excel, // Value映射 - (oldValue, newValue) -> oldValue // 键冲突处理(保留旧值) - )); - - //time - // 定义日期格式化器 - DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); - Map<String, FeedExportExcel> timeMap = references.stream() - .collect(Collectors.toMap( - excel -> excel.getCreate_time().format(formatter), - - excel -> excel, // Value映射 - (oldValue, newValue) -> oldValue // 键冲突处理(保留旧值) - )); - - try { - // 检查文件是否为空 - if (file.isEmpty()) { - return ResponseResult.error("上传文件不能为空"); - } - - // 读取Excel数据 - List<ReferenceExcel> excelList = EasyExcel.read(file.getInputStream()) - .head(ReferenceExcel.class) - .sheet() - .doReadSync(); - - // 数据转换与验证 - List<String> errorMessages = new ArrayList<>(); - List<FeedExportExcel> result = new ArrayList<>(); - for (ReferenceExcel excel : excelList) { - // 检查必要字段 - if (!StringUtils.hasText(excel.getPlatform_name())) { - errorMessages.add("平台名称不能为空"); - continue; - } - if (!StringUtils.hasText(excel.getTitle())) { - errorMessages.add("标题不能为空"); - continue; - } - if (!StringUtils.hasText(String.valueOf(excel.getCreate_time()))) { - errorMessages.add("发布时间不能为空"); - continue; - } - - if (!StringUtils.hasText(excel.getUrl())) { - errorMessages.add("发布网址不能为空"); - continue; - } - FeedExportExcel feedExportExcel = getFeedExportExcel(excel, nameMap, urlMap, titleMap, timeMap); - result.add(feedExportExcel); - - } - // 处理错误 - if (!errorMessages.isEmpty()) { - return ResponseResult.error("数据验证失败: " + String.join("; ", errorMessages)); - } - - - // 返回信息 - return ResponseResult.success(result); - }catch (DateTimeParseException e) { - return ResponseResult.error("文件解析失败:发布时间格式输入错误"); - } - catch (Exception e) { - // 记录详细异常信息 - - return ResponseResult.error("文件解析失败:" + e.getMessage()); - } + return keywordService.importFeedByKeyWord(keywordId, file); } - private FeedExportExcel getFeedExportExcel(ReferenceExcel excel, Map<String, FeedExportExcel> nameMap, Map<String, FeedExportExcel> urlMap, Map<String, FeedExportExcel> titleMap, Map<String, FeedExportExcel> timeMap) { - FeedExportExcel vo=new FeedExportExcel(); - DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); - excel.setTimeString(excel.getCreate_time().format(formatter)); - vo.setPlatform_name(excel.getPlatform_name()); - vo.setTitle(excel.getTitle()); - vo.setCreate_time(excel.getCreate_time()); - vo.setUrl(excel.getUrl()); - vo.setInclusionStatus("未选择"); - vo.setPlatformIs(0); - vo.setTitleIs(0); - vo.setUrlIs(0); - vo.setCreateIs(0); - //平台名称 - if (nameMap.containsKey(excel.getPlatform_name())) { - vo.setPlatformIs(1); - if (urlMap.containsKey(excel.getUrl())) { - vo.setUrlIs(1); - } - if (titleMap.containsKey(excel.getTitle())) { - vo.setTitleIs(1); - } - if (timeMap.containsKey(excel.getTimeString())) { - vo.setCreateIs(1); - } - return vo; - } - //网站链接 - if (urlMap.containsKey(excel.getUrl())) { - vo.setUrlIs(1); - if (titleMap.containsKey(excel.getTitle())) { - vo.setTitleIs(1); - } - if (timeMap.containsKey(excel.getTimeString())) { - vo.setCreateIs(1); - } - return vo; - } - //标题 - if (titleMap.containsKey(excel.getTitle())) { - vo.setTitleIs(1); - if (timeMap.containsKey(excel.getTimeString())) { - vo.setCreateIs(1); - } - } - //时间 - if (timeMap.containsKey(excel.getTimeString())) { - vo.setCreateIs(1); - return vo; - } - return vo; - } /** @@ -507,62 +178,10 @@ */ @PostMapping("/exportFeed") @ApiOperation(value = "导出投喂结果") - public ResponseEntity<byte[]> exportGetResultByPlatformId(@RequestBody ExportFeedDTO dto) { - // 3. 导出Excel - ByteArrayOutputStream out = new ByteArrayOutputStream(); - List<String> statusList = new ArrayList<>(); - statusList.add("未收录"); - statusList.add("已收录"); - statusList.add("未选择"); - // 3. 使用自定义的SheetWriteHandler来添加数据验证 - ExcelWriter excelWriter = EasyExcel.write(out, FeedExportExcel.class) - .registerWriteHandler(new SheetWriteHandler() { - @Override - public void afterSheetCreate(WriteWorkbookHolder writeWorkbookHolder, - WriteSheetHolder writeSheetHolder) { - Sheet sheet = writeSheetHolder.getSheet(); - - // 添加数据验证(下拉框) - DataValidationHelper helper = sheet.getDataValidationHelper(); - CellRangeAddressList rangeList = new CellRangeAddressList( - 1, 65535, 2, 2); // D列(第4列) - - DataValidationConstraint constraint = helper.createExplicitListConstraint( - statusList.toArray(new String[0])); - DataValidation validation = helper.createValidation(constraint, rangeList); - sheet.addValidationData(validation); - } - }) - .build(); - - // 4. 写入空数据 - WriteSheet writeSheet = EasyExcel.writerSheet("账号模板").build(); - excelWriter.write(dto.getExcels(), writeSheet); - excelWriter.finish(); - - // 4. 构建响应 - return ResponseEntity.ok() - .header(HttpHeaders.CONTENT_DISPOSITION, "attachment;filename=references_export.xlsx") - .contentType(MediaType.APPLICATION_OCTET_STREAM) - .body(out.toByteArray()); + public ResponseEntity<byte[]> exportGetResultByPlatformId( @Valid @RequestBody ExportFeedDTO dto) { + return keywordService.exportFeedResult(dto); } - - /** - * 批量新增关键词 - */ - @PostMapping("/batchAdd") - @ApiOperation(value = "批量新增关键词") - public ResponseResult<String> batchAdd(String keywords, String order_id) { - Boolean saveKeywords = keywordService.saveKeywords(keywords, order_id); - - if (saveKeywords) { - return ResponseResult.success("新增成功"); - } else { - return ResponseResult.error("新增失败"); - } - - } /** * 根据订单ID查询关键词 @@ -579,8 +198,8 @@ */ @PostMapping("/updateKeyword") @ApiOperation(value = "修改关键词") - public ResponseResult<String> updateKeyword(@RequestBody Keyword keyword) { - if("submitted".equals(keyword.getStatus())){ + public ResponseResult<String> updateKeyword(@Validated(UpdateGroup.class) @RequestBody Keyword keyword) { + if(FinalStatus.SUBMITTED.getValue().equals(keyword.getStatus())){ return ResponseResult.error("关键词已开始采集不允许修改!"); } keywordService.updateById(keyword); @@ -594,10 +213,20 @@ @ApiOperation(value = "删除关键词") public ResponseResult<String> deleteKeyword(@RequestParam("keywordId") Integer keywordId) { Keyword keyword = keywordService.getById(keywordId); - if("submitted".equals(keyword.getStatus())){ + if(FinalStatus.SUBMITTED.getValue().equals(keyword.getStatus())){ return ResponseResult.error("关键词已开始采集或不允许删除!"); } + keywordService.removeById(keywordId); + //找到订单 + Orders order = orderService.getById(keyword.getOrder_id()); + //更新关键词数量 + LambdaQueryWrapper<Keyword> queryKeywordsQueryWrapper = new LambdaQueryWrapper<>(); + queryKeywordsQueryWrapper.eq(Keyword::getOrder_id, keyword.getOrder_id()); + int count1 = (int) keywordService.count(queryKeywordsQueryWrapper); + order.setKeyword_num(count1); + orderService.updateById(order); + return ResponseResult.success("删除成功"); } -- Gitblit v1.7.1