提交 80cd3855 authored 作者: douxy's avatar douxy

增加导出策略模式和常规陈列实现类

上级 44b9c1b6
package com.sfa.operation.config;
import com.sfa.operation.util.excel.ExcelStyleUtils;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.apache.poi.ss.usermodel.DataValidation;
import java.util.List;
/**
* @Author: DouXinYu
* @Date: 2025-12-08 16:43
* @Description: AP导出列配置
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
public class ExportColumnConfig {
// 字段名
private String fieldName;
// 表头名
private String headerName;
// 格式(如:日期 yyyy-mm)
private String format;
// 列样式
private ExcelStyleUtils.ExcelStyle style;
// 合法值列表(null/空则不验证)
private List<String> validationValidOptions;
// 输入提示标题(可选)
private String validationPromptTitle;
// 输入提示内容(可选)
private String validationPromptMsg;
// 错误提示标题(可选)
private String validationErrorTitle;
// 错误提示内容(可选)
private String validationErrorMsg;
// 错误级别(默认阻止非法输入)
private int validationErrorStyle = DataValidation.ErrorStyle.STOP;
// 验证生效起始行(默认第1行,跳过表头)
private int validationStartRow = 1;
private int validationEndRow = 1048575;
// 数字最小值(null则不限制)
private Double validationNumberMin;
// 数字最大值(null则不限制)
private Double validationNumberMax;
// 是否允许小数(默认整数)
private boolean validationNumberAllowDecimal = false;
// 标记:是否启用数字验证
private boolean isNumberValidation = false;
// 标记:是否启用条件样式
private boolean conditionalStyling = false;
public ExportColumnConfig(String fieldName, String headerName, String format, ExcelStyleUtils.ExcelStyle style) {
this.fieldName = fieldName;
this.headerName = headerName;
this.format = format;
this.style = style;
}
}
package com.sfa.operation.controller.sales.excel;
import com.sfa.common.core.domain.R;
import com.sfa.common.core.enums.ECode;
import com.sfa.operation.pojo.sales.request.SalesApRequest;
import com.sfa.operation.service.sales.export.IExportExcelService;
import com.sfa.operation.strategy.IExportApExcelStrategy;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.servlet.http.HttpServletResponse;
/**
* @Author: DouXinYu
* @Date: 2025-12-05 17:31
* @Description: 导出excel控制类
*/
@Slf4j
@RestController
@RequestMapping("/sales/export")
public class ApExportExcelController {
@Autowired
private IExportExcelService exportApExcelService;
/**
* 导出常规陈列的excel表格
* @param salesApRequest 查询参数
* @return 导出文件
*/
@PostMapping("/ap_display")
public R exportApDisplayExcel(@RequestBody SalesApRequest salesApRequest, HttpServletResponse response) {
return exportApExcelService.exportApDisplayExcel(salesApRequest, response);
}
}
package com.sfa.operation.domain.sales.dao;
import com.sfa.common.core.web.domain.PageInfo;
import com.sfa.operation.domain.sales.entity.SalesApDisplay;
import com.sfa.operation.domain.sales.wq.SalesApWq;
import com.sfa.operation.pojo.sales.response.SalesApDisplayDto;
import java.util.List;
/**
* @author : liqiulin
* @date : 2025-09-08 14
......@@ -17,4 +20,6 @@ public interface ISalesApDisplayDao {
Object queryStoreAPReport(SalesApWq build);
Object queryDeptAPReport(SalesApWq build);
List<SalesApDisplay> queryDataListByCondition(SalesApWq build);
}
......@@ -67,6 +67,13 @@ public class SalesApDisplayDaoImpl implements ISalesApDisplayDao {
}
@Override
public List<SalesApDisplay> queryDataListByCondition(SalesApWq build) {
LambdaQueryWrapper<SalesApDisplay> queryWrapper = buildWq(build);
List<SalesApDisplay> apDisplayList = salesapdisMapper.selectList(queryWrapper);
return apDisplayList;
}
private LambdaQueryWrapper<SalesApDisplay> buildWq(SalesApWq salesApWq) {
LambdaQueryWrapper<SalesApDisplay> qw = new LambdaQueryWrapper<>();
if (StringUtils.isNotBlank(salesApWq.getDealerCode())) {
......
package com.sfa.operation.enums;
import lombok.Getter;
/**
* @Author: DouXinYu
* @Date: 2025-12-05 18:31
* @Description: ap导出页面类型枚举类(与策略对应)
*/
@Getter
public enum ExportAPType {
/**
* 常规陈列策略
*/
NORMAL_DISPLAY_EXPORT("normalDisplayExportStrategy"),
/**
* 档期计划策略
*/
PROMOTION_PLAN_EXPORT("promotionPlanExportStrategy"),
/**
* 零食陈列策略
*/
SNACK_DISPLAY_EXPORT("snackDisplayExportStrategy"),
/**
* 三米两秒策略
*/
THREE_METER_TWO_SECONDS_EXPORT("threeMeterTwoSecondsExportStrategy"),
/**
* 六小金刚策略
*/
SIX_KINGkONG_EXPORT("sixKingKongExportStrategy");
private final String strategy;
ExportAPType(String strategy) {
this.strategy = strategy;
}
}
package com.sfa.operation.factory;
import com.sfa.operation.enums.ExportAPType;
import com.sfa.operation.strategy.IExportApExcelStrategy;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.util.HashMap;
import java.util.Map;
/**
* @Author: DouXinYu
* @Date: 2025-12-08 16:49
* @Description: AP导出excel策略工厂类
*/
@Slf4j
@Component
public class ApExportExcelStrategyFactory {
private final Map<String, IExportApExcelStrategy> exportApExcelStrategyMap;
//构造器注入
@Autowired
public ApExportExcelStrategyFactory(Map<String, IExportApExcelStrategy> exportApExcelStrategyMap) {
this.exportApExcelStrategyMap = exportApExcelStrategyMap;
}
public IExportApExcelStrategy getStrategy(String exportApType) {
System.out.println(exportApExcelStrategyMap.size());
System.out.println(exportApType);
if (exportApType == null || exportApType.trim().isEmpty()) {
log.error("AP导出Excel策略工厂:传入的导出类型为空!");
throw new IllegalArgumentException("传入的导出类型为空!");
}
ExportAPType typeEnum;
try {
typeEnum = ExportAPType.valueOf(exportApType.toUpperCase());
} catch (IllegalArgumentException e) {
log.error("AP导出Excel策略工厂:传入的导出类型不存在!目标类型为:{}", exportApType);
throw new IllegalArgumentException("传入的导出类型不存在!");
}
// 3. 从枚举中获取策略Bean名称,再从Map中查找策略
String strategyBeanName = typeEnum.getStrategy();
System.out.println(strategyBeanName);
IExportApExcelStrategy strategy = exportApExcelStrategyMap.get(strategyBeanName);
if (strategy == null) {
log.error("AP导出Excel策略工厂:未找到对应的导出策略!目标策略Bean名称为:{}", strategyBeanName);
throw new IllegalArgumentException("未找到对应的导出策略!");
}
log.info("AP导出Excel策略工厂:找到对应的导出策略!目标策略Bean名称为:{}", strategyBeanName);
return strategy;
}
}
......@@ -62,6 +62,16 @@ public class SalesApRequest {
*/
private String rqStatus;
/**
* 当前查询的页面类型
* 1.常规陈列 :NORMAL_DISPLAY_EXPORT
* 2.档期计划 :PROMOTION_PLAN_EXPORT
* 3.零食陈列 :SNACK_DISPLAY_EXPORT
* 4.三米两秒 :THREE_METER_TWO_SECONDS_EXPORT
* 5.六小金刚 :SIX_KINGkONG_EXPORT
*/
private String pageType;
// ######################## 通用查询 ########################
/**
......
package com.sfa.operation.service.sales;
import com.sfa.common.core.web.domain.PageInfo;
import com.sfa.operation.domain.sales.entity.SalesApDisplay;
import com.sfa.operation.domain.sales.wq.SalesApWq;
import com.sfa.operation.pojo.sales.request.SalesApRequest;
import java.util.List;
......@@ -26,4 +28,5 @@ public interface IApDisplayQueryService {
Object queryStoreAPReport(SalesApRequest request);
Object queryDeptAPReport(SalesApRequest request);
List<SalesApDisplay> queryDataListByCondition(SalesApRequest build);
}
package com.sfa.operation.service.sales.export;
import com.sfa.common.core.domain.R;
import com.sfa.operation.pojo.sales.request.SalesApRequest;
import javax.servlet.http.HttpServletResponse;
/**
* @Author: DouXinYu
* @Date: 2025-12-09 14:20
* @Description:
*/
public interface IExportExcelService {
R exportApDisplayExcel(SalesApRequest salesApRequest, HttpServletResponse response);
}
package com.sfa.operation.service.sales.export.impl;
import com.sfa.common.core.domain.R;
import com.sfa.operation.factory.ApExportExcelStrategyFactory;
import com.sfa.operation.pojo.sales.request.SalesApRequest;
import com.sfa.operation.service.sales.export.IExportExcelService;
import com.sfa.operation.strategy.IExportApExcelStrategy;
import com.sfa.operation.util.excel.ExcelUtils;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import javax.servlet.http.HttpServletResponse;
/**
* @Author: DouXinYu
* @Date: 2025-12-09 14:20
* @Description: 导出excel服务实现类
*/
@Slf4j
@Service
public class ExportExcelServiceImpl implements IExportExcelService {
@Autowired
private ApExportExcelStrategyFactory exportApExcelStrategyFactory;
@Override
public R exportApDisplayExcel(SalesApRequest salesApRequest, HttpServletResponse response) {
try {
IExportApExcelStrategy strategy = exportApExcelStrategyFactory.getStrategy(salesApRequest.getPageType());
String fileNamePrefix = strategy.getExportFileNamePrefix();
log.info("导出前缀为:{}的excel", fileNamePrefix);
byte[] excelBytesArray = strategy.generateExcel(salesApRequest);
ExcelUtils.exportExcelBytesToResponse(excelBytesArray, response, fileNamePrefix);
log.info("常规陈列数据导出成功!");
return R.ok(R.SUCCESS, "数据导出成功") ;
} catch (Exception e) {
log.error("常规陈列数据导出异常!具体错误原因:", e);
return R.fail(R.FAIL,"数据导出失败,请联系后台管理员处理!");
}
}
}
......@@ -7,6 +7,7 @@ import com.sfa.common.core.utils.bean.BeanUtils;
import com.sfa.common.core.web.domain.PageInfo;
import com.sfa.operation.domain.feishu.dao.IQinceMarketEmployeeDao;
import com.sfa.operation.domain.sales.dao.*;
import com.sfa.operation.domain.sales.entity.SalesApDisplay;
import com.sfa.operation.domain.sales.wq.SalesApWq;
import com.sfa.operation.pojo.sales.request.SalesApRequest;
import com.sfa.operation.service.sales.IApDisplayQueryService;
......@@ -15,6 +16,7 @@ import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import java.awt.dnd.Autoscroll;
import java.util.Collections;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
......@@ -79,6 +81,11 @@ public class ApDisplayQueryServiceImpl implements IApDisplayQueryService {
return salesApDisplayDao.queryDeptAPReport(build(request));
}
@Override
public List<SalesApDisplay> queryDataListByCondition(SalesApRequest request) {
return salesApDisplayDao.queryDataListByCondition(build(request));
}
private SalesApWq build(SalesApRequest salesApRequest){
SalesApWq salesApWq = new SalesApWq();
BeanUtils.copyProperties(salesApRequest,salesApWq);
......@@ -91,4 +98,5 @@ public class ApDisplayQueryServiceImpl implements IApDisplayQueryService {
// }
return salesApWq;
}
}
package com.sfa.operation.strategy;
import com.sfa.operation.config.ExportColumnConfig;
import com.sfa.operation.pojo.sales.request.SalesApRequest;
import com.sfa.operation.util.excel.ExcelUtils;
import java.util.List;
/**
* @Author: DouXinYu
* @Date: 2025-12-08 16:17
* @Description: 策略接口
*/
public interface IExportApExcelStrategy {
/**
* 获取导出列配置
*
* @return 导出列配置
*/
List<ExportColumnConfig> getExportColumnConfig();
/**
* 查询数据
*
* @param salesApRequest 请求参数
* @return 查询结果
*/
List<?> queryData(SalesApRequest salesApRequest);
/**
* 获取导出sheet名称
*/
String getExportSheetName();
/**
* 获取导出文件名前缀
*
* @return 导出文件名前缀
*/
String getExportFileNamePrefix();
/**
* 生成excel
*
* @param salesApRequest 请求参数
* @return excel字节数组
*/
default byte[] generateExcel(SalesApRequest salesApRequest) throws Exception {
return ExcelUtils.generateExcelBytes(
this.getExportColumnConfig(),
this.queryData(salesApRequest),
this.getExportSheetName()
);
}
}
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论