src/main/java/com/linghu/controller/KeywordController.java
@@ -36,6 +36,7 @@ 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.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpHeaders; import org.springframework.http.MediaType; @@ -49,6 +50,7 @@ import javax.xml.bind.ValidationException; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.time.LocalDate; import java.time.LocalDateTime; import java.io.IOException; import java.time.format.DateTimeFormatter; @@ -284,8 +286,8 @@ dto.getPlatformId()); } //查询所有平台名称 List<String> platfromNames = result.stream() .map(ResultListVO::getPlatform_name) List<String> platfromNames = platformService.list().stream() .map(Platform::getPlatform_name) .filter(Objects::nonNull) .collect(Collectors.toList()); // 3. 导出Excel @@ -293,6 +295,68 @@ // 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()); } /** * 根据平台查看 0-当前轮 1-代表前1轮 2-代表前2轮 */ @PostMapping("/exportGetResultByPlatformId2") @ApiOperation(value = "导出:根据平台查看2") public ResponseEntity<byte[]> exportGetResultByPlatformId2(@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<ResultList2VO> result2=new ArrayList<>(); for (ResultListVO vo : result) { ResultList2VO vo2 = new ResultList2VO(); BeanUtils.copyProperties(vo, vo2); // 复制同名同类型的字段 result2.add(vo2); } //查询所有平台名称 List<String> platfromNames = platformService.list().stream() .map(Platform::getPlatform_name) .filter(Objects::nonNull) .collect(Collectors.toList()); // 3. 导出Excel ByteArrayOutputStream out = new ByteArrayOutputStream(); // 3. 使用自定义的SheetWriteHandler来添加数据验证 ExcelWriter excelWriter = EasyExcel.write(out, ResultList2VO.class) .registerWriteHandler(new SheetWriteHandler() { @Override public void afterSheetCreate(WriteWorkbookHolder writeWorkbookHolder, @@ -314,7 +378,7 @@ WriteSheet writeSheet = EasyExcel.writerSheet("平台分布占比").build(); excelWriter.write(result, writeSheet); excelWriter.write(result2, writeSheet); excelWriter.finish(); // 4. 构建响应 @@ -343,7 +407,21 @@ @ApiOperation("下载投喂模板") public ResponseEntity<byte[]> downTemplate() throws IOException { ByteArrayOutputStream out = new ByteArrayOutputStream(); EasyExcel.write(out, ReferenceExcel.class).sheet("投喂模板").doWrite(new ArrayList<>()); // 创建示例数据(第一行) ReferenceExcel exampleData = new ReferenceExcel(); exampleData.setPlatform_name("示例平台"); exampleData.setTitle("示例标题"); exampleData.setCreate_time(LocalDate.now()); // 设置当前日期作为示例 exampleData.setUrl("https://example.com"); List<ReferenceExcel> excelList=new ArrayList<>(); excelList.add(exampleData); ExcelWriter excelWriter = EasyExcel.write(out, ReferenceExcel.class).build(); WriteSheet writeSheet = EasyExcel.writerSheet("平台分布占比").build(); excelWriter.write(excelList, writeSheet); excelWriter.finish(); return ResponseEntity.ok() .header(HttpHeaders.CONTENT_DISPOSITION, "attachment;filename=platform_template.xlsx") src/main/java/com/linghu/controller/OrderController.java
@@ -237,7 +237,7 @@ @ApiOperation("获取客户列表") public ResponseResult<CustomPage<String>> getClientList(@RequestParam(required = false) String clientName, @RequestParam(required = false,defaultValue = "1") Integer pageNum, @RequestParam(required = false, defaultValue = "10") Integer pageSize) { @RequestParam(required = false, defaultValue = "100") Integer pageSize) { Page<String> result = orderService.getClientList(clientName,pageNum, pageSize); src/main/java/com/linghu/controller/PlatformController.java
@@ -261,7 +261,7 @@ platformService.saveBatch(platforms); return ResponseResult.success("导入成功,新增" + platforms.size() + "条数据"); } else { return ResponseResult.success("导入完成,没有新增数据(所有数据均已存在)"); return ResponseResult.error("导入完成,没有新增数据(所有数据均已存在)"); } } catch (Exception e) { src/main/java/com/linghu/controller/UserController.java
@@ -57,7 +57,7 @@ public ResponseResult add(@RequestBody User user) { List<User> list = userService.list(new LambdaQueryWrapper<User>().eq(User::getUser_email, user.getUser_email())); if (list != null && list.size() > 0) { return ResponseResult.success("该邮箱已存在"); return ResponseResult.error("该邮箱已存在"); } user.setStatus("正常"); userService.save(user); @@ -80,10 +80,10 @@ .ne(User::getUser_id, user.getUser_id()) .eq(User::getUser_email, user.getUser_email())); if (list != null && list.size() > 0) { return ResponseResult.success("该邮箱已存在"); return ResponseResult.error("该邮箱已存在"); } if (!user1.getUser_email().equals(user.getUser_email())||!user1.getPassword().equals(user.getPassword())) { user1.setStatus("正常"); user.setStatus("正常"); } userService.updateById(user); src/main/java/com/linghu/listener/BigDecimalPercentConverter.java
New file @@ -0,0 +1,46 @@ package com.linghu.listener; import com.alibaba.excel.converters.Converter; import com.alibaba.excel.enums.CellDataTypeEnum; import com.alibaba.excel.metadata.GlobalConfiguration; import com.alibaba.excel.metadata.data.ReadCellData; import com.alibaba.excel.metadata.data.WriteCellData; import com.alibaba.excel.metadata.property.ExcelContentProperty; import java.math.BigDecimal; /** * 自定义转换器:将BigDecimal转换为带%的字符串(如25.5 → 25.5%) */ public class BigDecimalPercentConverter implements Converter<BigDecimal> { @Override public Class<BigDecimal> supportJavaTypeKey() { return BigDecimal.class; // 支持的Java类型 } @Override public CellDataTypeEnum supportExcelTypeKey() { return CellDataTypeEnum.STRING; // Excel中显示为字符串类型 } /** * 写入Excel时:将BigDecimal转换为带%的字符串 */ @Override public WriteCellData<String> convertToExcelData(BigDecimal value, ExcelContentProperty contentProperty, GlobalConfiguration globalConfiguration) { if (value == null) { return new WriteCellData<>(""); // 空值处理 } // 拼接%符号(如需保留固定小数位,可使用setScale处理,如value.setScale(2, BigDecimal.ROUND_HALF_UP)) return new WriteCellData<>(value.toString() + "%"); } /** * 读取Excel时:如果需要从带%的字符串转回BigDecimal,可实现此方法 * (当前场景仅导出,暂时返回null即可) */ @Override public BigDecimal convertToJavaData(ReadCellData<?> cellData, ExcelContentProperty contentProperty, GlobalConfiguration globalConfiguration) { return null; } } src/main/java/com/linghu/model/entity/User.java
@@ -5,11 +5,13 @@ import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import java.io.Serializable; import java.time.LocalDateTime; import javax.validation.constraints.Email; import javax.validation.constraints.NotBlank; import javax.validation.constraints.Size; import com.fasterxml.jackson.annotation.JsonFormat; import io.swagger.annotations.ApiModelProperty; import lombok.Data; @@ -59,6 +61,13 @@ /** * 创建时间 */ @ApiModelProperty(hidden = true) @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") private LocalDateTime create_time; /** * 状态 */ private String status; src/main/java/com/linghu/model/excel/FeedExportExcel.java
@@ -12,7 +12,7 @@ @Data public class FeedExportExcel { @ExcelProperty("平台名称") @ExcelProperty("发布平台") @ApiModelProperty("平台名称") private String platform_name; @ApiModelProperty("平台是否匹配 0-否 1-是") src/main/java/com/linghu/model/vo/KeywordStaticsVO.java
@@ -2,6 +2,7 @@ import com.alibaba.excel.annotation.ExcelIgnore; import com.alibaba.excel.annotation.ExcelProperty; import com.linghu.listener.BigDecimalPercentConverter; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; @@ -21,6 +22,6 @@ @ExcelProperty("重复次数") private Integer total_repetitions; @ApiModelProperty("平台分布占比") @ExcelProperty("平台分布占比") @ExcelProperty(value = "平台分布占比",converter = BigDecimalPercentConverter.class) private BigDecimal repetition_ratio; } src/main/java/com/linghu/model/vo/PlatformProportionVO.java
@@ -1,6 +1,7 @@ package com.linghu.model.vo; import com.alibaba.excel.annotation.ExcelProperty; import com.linghu.listener.BigDecimalPercentConverter; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; @@ -26,11 +27,11 @@ private Integer total_repetitions; @ApiModelProperty("全平台分布占比") @ExcelProperty("全平台分布占比") @ExcelProperty(value = "全平台分布占比",converter = BigDecimalPercentConverter.class) private BigDecimal all_platform_ratio; @ApiModelProperty("同类平台分布占比") @ExcelProperty("同类平台分布占比") @ExcelProperty(value = "同类平台分布占比",converter = BigDecimalPercentConverter.class) private BigDecimal same_type_ratio; } src/main/java/com/linghu/model/vo/ResultList2VO.java
New file @@ -0,0 +1,37 @@ package com.linghu.model.vo; import com.alibaba.excel.annotation.ExcelIgnore; 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.LocalDate; @Data @ApiModel public class ResultList2VO { @ApiModelProperty("结果id") @ExcelIgnore private Integer reference_id; @ApiModelProperty("平台名称") private String platform_name; @ApiModelProperty("标题") @ExcelProperty("标题") private String title; @ApiModelProperty("重复次数") @ExcelProperty("重复次数") private Integer repetition_num; @ApiModelProperty("发布时间") @ExcelProperty("发布时间") @JsonFormat(pattern = "yyyy/MM/dd") private LocalDate create_time; @ExcelProperty("发布网址") private String url; } src/main/java/com/linghu/model/vo/ResultListVO.java
@@ -7,6 +7,7 @@ import io.swagger.annotations.ApiModelProperty; import lombok.Data; import java.time.LocalDate; import java.time.LocalDateTime; @Data @@ -18,7 +19,7 @@ private Integer reference_id; @ApiModelProperty("平台名称") @ExcelProperty("全部平台") @ExcelIgnore private String platform_name; @ApiModelProperty("标题") @@ -31,8 +32,8 @@ @ApiModelProperty("发布时间") @ExcelProperty("发布时间") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") private LocalDateTime create_time; @JsonFormat(pattern = "yyyy/MM/dd") private LocalDate create_time; @ExcelProperty("发布网址") private String url; } src/main/java/com/linghu/service/impl/OrderServiceImpl.java
@@ -146,28 +146,23 @@ queryWrapper.select(Orders::getClient_name) // 只查询客户名称字段 .eq(Orders::getDel_flag, 0) // 只查询未删除的订单 .groupBy(Orders::getClient_name); // 按客户名称分组去重 if (clientName != null && !clientName.isEmpty()) { queryWrapper.like(Orders::getClient_name, clientName); } // 执行分页查询 IPage<Orders> orderPage = orderMapper.selectPage(page, queryWrapper); List<Orders> orders = orderMapper.selectList(queryWrapper); // 执行分页查询 // IPage<Orders> orderPage = orderMapper.selectPage(page, queryWrapper); // 转换为客户选项列表(统计每个客户的订单数量) List<String> clientOptions = orderPage.getRecords().stream() .map(order -> { return order.getClient_name(); }) List<String> clientOptions = orders.stream() .map(Orders::getClient_name) .collect(Collectors.toList()); // 构建结果分页对象 Page<String> resultPage = new Page<>(); resultPage.setCurrent(orderPage.getCurrent()); resultPage.setSize(orderPage.getSize()); resultPage.setTotal(orderPage.getTotal()); // resultPage.setCurrent(orderPage.getCurrent()); // resultPage.setSize(orderPage.getSize()); // resultPage.setTotal(orderPage.getTotal()); resultPage.setRecords(clientOptions); return resultPage; src/main/resources/mapper/UserMapper.xml
@@ -12,11 +12,12 @@ <result property="phone" column="phone" jdbcType="INTEGER"/> <result property="sectionalization_id" column="sectionalization_id" jdbcType="INTEGER"/> <result property="status" column="status" jdbcType="VARCHAR"/> <result property="create_time" column="create_time" jdbcType="TIMESTAMP"/> </resultMap> <sql id="Base_Column_List"> user_id,user_name,user_email, password,phone,sectionalization_id,status password,phone,sectionalization_id,status,create_time </sql> <select id="getPage" resultType="com.linghu.model.vo.UserPageVO"> SELECT @@ -38,6 +39,7 @@ and u.status = #{status} </if> </where> order by u.create_time </select> </mapper> src/main/resources/mapper/keywordMapper.xml
@@ -121,7 +121,6 @@ </if> ORDER BY r.repetition_num, r.create_time DESC r.repetition_num DESC </select> </mapper>