From 9fb04a62cf681403345043eabafee4378173787d Mon Sep 17 00:00:00 2001 From: huliguo <2023611923@qq.com> Date: 星期一, 07 七月 2025 21:42:56 +0800 Subject: [PATCH] 采集详情 --- src/main/java/com/linghu/model/vo/KeywordStaticsListVO.java | 19 ++ src/main/java/com/linghu/model/vo/PlatformProportionVO.java | 36 ++++ src/main/java/com/linghu/service/KeywordService.java | 11 + src/main/resources/mapper/keywordMapper.xml | 108 +++++++++++++ src/main/java/com/linghu/controller/OrderController.java | 2 src/main/java/com/linghu/model/vo/ResultListVO.java | 36 ++++ src/main/java/com/linghu/service/impl/KeywordServiceImpl.java | 59 +++++++ src/main/java/com/linghu/controller/QuestionController.java | 2 src/main/java/com/linghu/mapper/KeywordMapper.java | 12 + src/main/java/com/linghu/controller/KeywordController.java | 149 ++++++++++++++++++ src/main/java/com/linghu/model/vo/KeywordStaticsVO.java | 22 ++ 11 files changed, 453 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/linghu/controller/KeywordController.java b/src/main/java/com/linghu/controller/KeywordController.java new file mode 100644 index 0000000..eabba3a --- /dev/null +++ b/src/main/java/com/linghu/controller/KeywordController.java @@ -0,0 +1,149 @@ +package com.linghu.controller; + +import com.alibaba.excel.EasyExcel; +import com.linghu.mapper.KeywordMapper; +import com.linghu.model.common.ResponseResult; +import com.linghu.model.entity.Keyword; +import com.linghu.model.entity.Reference; +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.ReferenceService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +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.web.bind.annotation.*; + +import javax.servlet.http.HttpServletResponse; +import java.io.ByteArrayOutputStream; +import java.util.List; + +@RestController +@RequestMapping("/keyword") +@Api(value = "采集详情相关接口", tags = "订单列表-采集列表-采集详情") +public class KeywordController { + @Autowired + private KeywordService keywordService; + + @Autowired + private KeywordMapper keywordMapper; + + @Autowired + private ReferenceService referenceService; + + /** + * 关键词统计 EChart图 + */ + @GetMapping("/statics") + @ApiOperation(value = "EChart图") + public ResponseResult<KeywordStaticsListVO> statics(@RequestParam("id") Integer keywordId, @RequestParam(value = "questionId",required = false) Integer questionId) { + return keywordService.statics(keywordId,questionId); + } + + @PostMapping(value = "/exportStatics") + @ApiOperation(value = "EChart图导出") + public ResponseEntity<byte[]> exportStatics(@RequestParam("id") Integer keywordId, @RequestParam(value = "questionId",required = false) Integer questionId, HttpServletResponse response) { + Keyword keyword = keywordMapper.selectById(keywordId); + List<KeywordStaticsVO> voList = keywordMapper.statics(keywordId,questionId,keyword.getNum()); + + // 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()); + } + /** + * 根据类别查看 + */ + @GetMapping("/getResultByTypeId") + @ApiOperation(value = "根据类别查看") + public ResponseResult<List<PlatformProportionVO>> getResultByTypeId(@RequestParam("id") Integer keywordId, @RequestParam(value = "questionId",required = false) Integer questionId, @RequestParam(value = "typeId",required = false) Integer typeId) { + return keywordService.getResultByTypeId(keywordId,questionId,typeId); + } + + + /** + * 导出:根据类别查看 + */ + @PostMapping(value = "/exportGetResultByTypeId") + @ApiOperation(value = "导出:根据类别查看") + public ResponseEntity<byte[]> exportGetResultByTypeId(@RequestParam("id") Integer keywordId, @RequestParam(value = "questionId",required = false) Integer questionId, @RequestParam(value = "typeId",required = false) Integer typeId,@RequestParam(value = "isNow") Integer isNow ) { + Keyword keyword = keywordService.getById(keywordId); + List<PlatformProportionVO> result = keywordMapper.getResultByTypeId(keywordId, questionId, keyword.getNum() - isNow, typeId); + // 3. 导出Excel + ByteArrayOutputStream out = new ByteArrayOutputStream(); + EasyExcel.write(out, PlatformProportionVO.class) + .sheet("引用数据") + .doWrite(result); + + // 4. 构建响应 + return ResponseEntity.ok() + .header(HttpHeaders.CONTENT_DISPOSITION, "attachment;filename=references_export.xlsx") + .contentType(MediaType.APPLICATION_OCTET_STREAM) + .body(out.toByteArray()); + } + + /** + * 根据平台查看 + */ + @GetMapping("/getResultByPlatformId") + @ApiOperation(value = "根据平台查看") + public ResponseResult<List<ResultListVO>> getResultByPlatformId(@RequestParam("id") Integer keywordId, @RequestParam(value = "questionId",required = false) Integer questionId, @RequestParam(value = "platformId",required = false) Integer platformId) { + return keywordService.getResultByPlatformId(keywordId,questionId,platformId); + } + + /** + * 根据平台查看 0-当前轮 1-代表前1轮 2-代表前2轮 + */ + @GetMapping("/exportGetResultByPlatformId") + @ApiOperation(value = "根据平台查看") + public ResponseEntity<byte[]> exportGetResultByPlatformId(@RequestParam("id") Integer keywordId, @RequestParam(value = "questionId",required = false) Integer questionId, @RequestParam(value = "platformId",required = false) Integer platformId,@RequestParam(value = "isNow") Integer isNow) { + Keyword keyword = keywordService.getById(keywordId); + List<ResultListVO> result = keywordMapper.getResultByPlatformId(keywordId, questionId, keyword.getNum() - isNow, platformId); + // 3. 导出Excel + ByteArrayOutputStream out = new ByteArrayOutputStream(); + EasyExcel.write(out, ResultListVO.class) + .sheet("引用数据") + .doWrite(result); + + // 4. 构建响应 + return ResponseEntity.ok() + .header(HttpHeaders.CONTENT_DISPOSITION, "attachment;filename=references_export.xlsx") + .contentType(MediaType.APPLICATION_OCTET_STREAM) + .body(out.toByteArray()); + } + + /** + * 查看详情 + */ + @GetMapping("/getResultById") + @ApiOperation(value = "根据平台查看") + public ResponseResult getResultById(@RequestParam("referenceId") Integer referenceId) { + Reference reference = referenceService.getById(referenceId); + if (reference == null) { + return ResponseResult.error("该结果不存在"); + } + return ResponseResult.success(reference); + } + + + /** + * 投喂 + */ + + + + + +} diff --git a/src/main/java/com/linghu/controller/OrderController.java b/src/main/java/com/linghu/controller/OrderController.java index ea27ecc..0467e77 100644 --- a/src/main/java/com/linghu/controller/OrderController.java +++ b/src/main/java/com/linghu/controller/OrderController.java @@ -8,6 +8,7 @@ import com.linghu.model.dto.OrderDto; import com.linghu.service.OrderService; +import io.swagger.annotations.Api; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; @@ -21,6 +22,7 @@ */ @RestController @RequestMapping("/order") +@Api(value = "订单管理", tags = "订单管理") public class OrderController { @Autowired diff --git a/src/main/java/com/linghu/controller/QuestionController.java b/src/main/java/com/linghu/controller/QuestionController.java index 5922e03..aeaa35d 100644 --- a/src/main/java/com/linghu/controller/QuestionController.java +++ b/src/main/java/com/linghu/controller/QuestionController.java @@ -18,7 +18,7 @@ @RestController @RequestMapping("/question") -@Api(value = "提问词相关接口", tags = "设置-提问词") +@Api(value = "提问词相关接口", tags = "订单管理-提问词") public class QuestionController { @Autowired diff --git a/src/main/java/com/linghu/mapper/KeywordMapper.java b/src/main/java/com/linghu/mapper/KeywordMapper.java index 267f6d3..8ca2e29 100644 --- a/src/main/java/com/linghu/mapper/KeywordMapper.java +++ b/src/main/java/com/linghu/mapper/KeywordMapper.java @@ -2,6 +2,13 @@ import com.linghu.model.entity.Keyword; import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.linghu.model.vo.KeywordStaticsVO; +import com.linghu.model.vo.PlatformProportionVO; +import com.linghu.model.vo.ResultListVO; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; /** * @author xy @@ -11,6 +18,11 @@ */ public interface KeywordMapper extends BaseMapper<Keyword> { + List<KeywordStaticsVO> statics(@Param("keywordId") Integer keywordId, @Param("questionId")Integer questionId, @Param("num")Integer num); + + List<PlatformProportionVO> getResultByTypeId(@Param("keywordId") Integer keywordId, @Param("questionId")Integer questionId, @Param("num")Integer num, @Param("typeId") Integer typeId); + + List<ResultListVO> getResultByPlatformId(@Param("keywordId") Integer keywordId, @Param("questionId")Integer questionId, @Param("num")Integer num, @Param("platformId") Integer platformId); } diff --git a/src/main/java/com/linghu/model/vo/KeywordStaticsListVO.java b/src/main/java/com/linghu/model/vo/KeywordStaticsListVO.java new file mode 100644 index 0000000..3b298c6 --- /dev/null +++ b/src/main/java/com/linghu/model/vo/KeywordStaticsListVO.java @@ -0,0 +1,19 @@ +package com.linghu.model.vo; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.math.BigDecimal; +import java.util.List; + +@Data +@ApiModel("关键词统计") +public class KeywordStaticsListVO { + @ApiModelProperty("当前统计记录") + private List<KeywordStaticsVO> nowRecord; + + @ApiModelProperty("统计记录-前一次") + private List<KeywordStaticsVO> beforeRecord; + +} diff --git a/src/main/java/com/linghu/model/vo/KeywordStaticsVO.java b/src/main/java/com/linghu/model/vo/KeywordStaticsVO.java new file mode 100644 index 0000000..06c490e --- /dev/null +++ b/src/main/java/com/linghu/model/vo/KeywordStaticsVO.java @@ -0,0 +1,22 @@ +package com.linghu.model.vo; + +import com.alibaba.excel.annotation.ExcelProperty; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.math.BigDecimal; + +@Data +@ApiModel("关键词统计") +public class KeywordStaticsVO { + @ApiModelProperty("发布平台") + @ExcelProperty("发布平台") + private String platformName; + @ApiModelProperty("重复次数") + @ExcelProperty("重复次数") + private Integer totalRepetitions; + @ApiModelProperty("平台分布占比") + @ExcelProperty("平台分布占比") + private BigDecimal repetitionRatio; +} diff --git a/src/main/java/com/linghu/model/vo/PlatformProportionVO.java b/src/main/java/com/linghu/model/vo/PlatformProportionVO.java new file mode 100644 index 0000000..b79ded5 --- /dev/null +++ b/src/main/java/com/linghu/model/vo/PlatformProportionVO.java @@ -0,0 +1,36 @@ +package com.linghu.model.vo; + +import com.alibaba.excel.annotation.ExcelProperty; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.math.BigDecimal; + +@Data +@ApiModel("") +public class PlatformProportionVO { + + + + @ApiModelProperty("类型名称") + @ExcelProperty("全部类型") + private String typeName; + + @ApiModelProperty("平台名称") + @ExcelProperty("平台名称") + private String platformName; + + @ApiModelProperty("重复次数") + @ExcelProperty("重复次数") + private Integer totalRepetitions; + + @ApiModelProperty("全平台分布占比") + @ExcelProperty("全平台分布占比") + private BigDecimal allPlatformRatio; + + @ApiModelProperty("同类平台分布占比") + @ExcelProperty("同类平台分布占比") + private BigDecimal sameTypeRatio; + +} diff --git a/src/main/java/com/linghu/model/vo/ResultListVO.java b/src/main/java/com/linghu/model/vo/ResultListVO.java new file mode 100644 index 0000000..7543a91 --- /dev/null +++ b/src/main/java/com/linghu/model/vo/ResultListVO.java @@ -0,0 +1,36 @@ +package com.linghu.model.vo; + +import com.alibaba.excel.annotation.ExcelProperty; +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.time.LocalDateTime; + +@Data +@ApiModel +public class ResultListVO { + + @ApiModelProperty("结果id") + private Integer referenceId; + + @ApiModelProperty("平台名称") + @ExcelProperty("全部平台") + private String platformName; + + @ApiModelProperty("标题") + @ExcelProperty("标题") + private String title; + + @ApiModelProperty("重复次数") + @ExcelProperty("重复次数") + private Integer repetitionNum; + + @ApiModelProperty("发布时间") + @ExcelProperty("发布时间") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime createTime; + @ExcelProperty("发布网址") + private String url; +} diff --git a/src/main/java/com/linghu/service/KeywordService.java b/src/main/java/com/linghu/service/KeywordService.java index 10a3ae7..3c84e82 100644 --- a/src/main/java/com/linghu/service/KeywordService.java +++ b/src/main/java/com/linghu/service/KeywordService.java @@ -1,7 +1,13 @@ package com.linghu.service; +import com.linghu.model.common.ResponseResult; import com.linghu.model.entity.Keyword; import com.baomidou.mybatisplus.extension.service.IService; +import com.linghu.model.vo.KeywordStaticsListVO; +import com.linghu.model.vo.PlatformProportionVO; +import com.linghu.model.vo.ResultListVO; + +import java.util.List; /** * @author xy @@ -10,4 +16,9 @@ */ public interface KeywordService extends IService<Keyword> { + ResponseResult<KeywordStaticsListVO> statics(Integer keywordId, Integer questionId); + + ResponseResult<List<PlatformProportionVO>> getResultByTypeId(Integer keywordId, Integer questionId, Integer typeId); + + ResponseResult<List<ResultListVO>> getResultByPlatformId(Integer keywordId, Integer questionId, Integer platformId); } diff --git a/src/main/java/com/linghu/service/impl/KeywordServiceImpl.java b/src/main/java/com/linghu/service/impl/KeywordServiceImpl.java index 125bc52..5901887 100644 --- a/src/main/java/com/linghu/service/impl/KeywordServiceImpl.java +++ b/src/main/java/com/linghu/service/impl/KeywordServiceImpl.java @@ -1,10 +1,16 @@ package com.linghu.service.impl; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.linghu.model.common.ResponseResult; import com.linghu.model.entity.Keyword; +import com.linghu.model.vo.*; +import com.linghu.model.vo.KeywordStaticsListVO; import com.linghu.service.KeywordService; import com.linghu.mapper.KeywordMapper; import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.Map; /** * @author xy @@ -12,8 +18,57 @@ * @createDate 2025-07-04 20:17:33 */ @Service -public class KeywordServiceImpl extends ServiceImpl<KeywordMapper, Keyword> - implements KeywordService{ +public class KeywordServiceImpl extends ServiceImpl<KeywordMapper, Keyword> implements KeywordService{ + + @Override + public ResponseResult<KeywordStaticsListVO> statics(Integer keywordId, Integer questionId) { + KeywordStaticsListVO vo = new KeywordStaticsListVO(); + //1.关键词是否存在 + Keyword keyword = this.getById(keywordId); + if (keyword == null) { + return ResponseResult.error("关键词不存在"); + } + if (!"completed".equals(keyword.getStatus())){ + return ResponseResult.error("关键词采集未完成"); + } + List<KeywordStaticsVO> statics = this.getBaseMapper().statics(keywordId,questionId,keyword.getNum()); + vo.setNowRecord(statics); + if (keyword.getNum()!=0){ + statics = this.getBaseMapper().statics(keywordId,questionId,keyword.getNum()-1); + vo.setBeforeRecord(statics); + } + return ResponseResult.success(vo); + } + + @Override + public ResponseResult<List<PlatformProportionVO>> getResultByTypeId(Integer keywordId, Integer questionId, Integer typeId) { + //1.关键词是否存在 + Keyword keyword = this.getById(keywordId); + if (keyword == null) { + return ResponseResult.error("关键词不存在"); + } + if (!"completed".equals(keyword.getStatus())){ + return ResponseResult.error("关键词采集未完成"); + } + List<PlatformProportionVO> result = this.getBaseMapper().getResultByTypeId(keywordId, questionId, keyword.getNum(), typeId); + return ResponseResult.success(result); + } + + @Override + public ResponseResult<List<ResultListVO>> getResultByPlatformId(Integer keywordId, Integer questionId, Integer platformId) { + //1.关键词是否存在 + Keyword keyword = this.getById(keywordId); + if (keyword == null) { + return ResponseResult.error("关键词不存在"); + } + if (!"completed".equals(keyword.getStatus())){ + return ResponseResult.error("关键词采集未完成"); + } + + List<ResultListVO> result = this.getBaseMapper().getResultByPlatformId(keywordId, questionId, keyword.getNum(), platformId); + return ResponseResult.success(result); + } + } diff --git a/src/main/resources/mapper/keywordMapper.xml b/src/main/resources/mapper/keywordMapper.xml index e8516a1..ec90fa5 100644 --- a/src/main/resources/mapper/keywordMapper.xml +++ b/src/main/resources/mapper/keywordMapper.xml @@ -17,4 +17,112 @@ keyword_id,order_id,keyword_name, num,task_id,status </sql> + <select id="statics" resultType="com.linghu.model.vo.KeywordStaticsVO"> + SELECT + p.platform_name, + SUM( r.repetition_num ) AS total_repetitions, + ROUND( + SUM( r.repetition_num ) * 100.0 / ( + SELECT + SUM( r2.repetition_num ) + FROM + reference r2 + WHERE + r2.keyword_id = #{keywordId} + <if test = "questionId != null" > + AND r2.question_id = #{questionId} + </if> + AND r2.num = #{num} + ),2) AS repetition_ratio + FROM + reference r + JOIN platform p ON r.platform_id = p.platform_id + WHERE + r.keyword_id = #{keywordId} + <if test = "questionId != null" > + AND r.question_id = #{questionId} + </if> + AND r.num = #{num} + + AND p.del_flag = 0 + GROUP BY + p.platform_id, + p.platform_name + ORDER BY + total_repetitions DESC + </select> + <select id="getResultByTypeId" resultType="com.linghu.model.vo.PlatformProportionVO"> + SELECT + t.type_name, + p.platform_name, + SUM(r.repetition_num) AS total_repetitions, + -- 全平台分布占比 = 当前平台重复次数 / 所有平台重复次数 + ROUND(SUM(r.repetition_num) * 100.0 / ( + SELECT SUM(r2.repetition_num) + FROM reference r2 + WHERE r2.keyword_id = #{keywordId} + <if test="questionId != null"> + AND r2.question_id = #{questionId} + </if> + AND r2.num = #{num} + ), 2) AS all_platform_ratio, + -- 同类平台分布占比 = 当前平台重复次数 / 同类型平台重复次数 + ROUND(SUM(r.repetition_num) * 100.0 / ( + SELECT SUM(r3.repetition_num) + FROM reference r3 + JOIN platform p3 ON r3.platform_id = p3.platform_id + WHERE r3.keyword_id = #{keywordId} + <if test="questionId != null"> + AND r3.question_id = #{questionId} + </if> + AND r3.num = #{num} + AND p3.type_id = p.type_id + ), 2) AS same_type_ratio + FROM + reference r + JOIN + platform p ON r.platform_id = p.platform_id + JOIN + type t ON p.type_id = t.type_id + WHERE + r.keyword_id = #{keywordId} + <if test="questionId != null"> + AND r.question_id = #{questionId} + </if> + AND r.num = #{num} + <if test="typeId != null"> + AND p.type_id = #{typeId} + </if> + AND p.del_flag = 0 + AND t.del_flag = 0 + GROUP BY + t.type_id, t.type_name, p.platform_id, p.platform_name + ORDER BY + t.type_name, total_repetitions DESC + </select> + <select id="getResultByPlatformId" resultType="com.linghu.model.vo.ResultListVO"> + SELECT + r.reference_id, + p.platform_name, + r.title, + r.repetition_num, + r.create_time, + r.url + FROM + reference r + JOIN + platform p ON r.platform_id = p.platform_id + WHERE + r.keyword_id = #{keywordId} + <if test="questionId != null"> + AND r.question_id = #{questionId} + </if> + AND r.num = #{num} + <if test="platformId != null"> + AND r.platform_id = #{platformId} + </if> + AND p.del_flag = 0 + ORDER BY + r.create_time DESC + </select> </mapper> -- Gitblit v1.7.1