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