Skip to content
项目
群组
代码片段
帮助
当前项目
正在载入...
登录 / 注册
切换导航面板
W
wangxiaolu-sfa-module-operation
项目
项目
详情
活动
周期分析
仓库
仓库
文件
提交
分支
标签
贡献者
图表
比较
统计图
议题
0
议题
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
CI / CD
CI / CD
流水线
作业
日程
统计图
Wiki
Wiki
代码片段
代码片段
成员
成员
折叠边栏
关闭边栏
活动
图像
聊天
创建新问题
作业
提交
问题看板
Open sidebar
sfa
wangxiaolu-sfa-module-operation
Commits
80cd3855
提交
80cd3855
authored
12月 09, 2025
作者:
douxy
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
增加导出策略模式和常规陈列实现类
上级
44b9c1b6
全部展开
隐藏空白字符变更
内嵌
并排
正在显示
15 个修改的文件
包含
345 行增加
和
0 行删除
+345
-0
ExportColumnConfig.java
...ain/java/com/sfa/operation/config/ExportColumnConfig.java
+64
-0
ApExportExcelController.java
...ation/controller/sales/excel/ApExportExcelController.java
+39
-0
ISalesApDisplayDao.java
...om/sfa/operation/domain/sales/dao/ISalesApDisplayDao.java
+5
-0
SalesApDisplayDaoImpl.java
...peration/domain/sales/dao/impl/SalesApDisplayDaoImpl.java
+7
-0
ExportAPType.java
src/main/java/com/sfa/operation/enums/ExportAPType.java
+37
-0
ApExportExcelStrategyFactory.java
...m/sfa/operation/factory/ApExportExcelStrategyFactory.java
+56
-0
SalesApRequest.java
.../com/sfa/operation/pojo/sales/request/SalesApRequest.java
+10
-0
IApDisplayQueryService.java
...m/sfa/operation/service/sales/IApDisplayQueryService.java
+3
-0
IExportExcelService.java
...a/operation/service/sales/export/IExportExcelService.java
+17
-0
ExportExcelServiceImpl.java
...ion/service/sales/export/impl/ExportExcelServiceImpl.java
+44
-0
ApDisplayQueryServiceImpl.java
...eration/service/sales/impl/ApDisplayQueryServiceImpl.java
+8
-0
IExportApExcelStrategy.java
...va/com/sfa/operation/strategy/IExportApExcelStrategy.java
+55
-0
NormalDisplayExportStrategyImpl.java
...ration/strategy/impl/NormalDisplayExportStrategyImpl.java
+0
-0
ExcelStyleUtils.java
...in/java/com/sfa/operation/util/excel/ExcelStyleUtils.java
+0
-0
ExcelUtils.java
src/main/java/com/sfa/operation/util/excel/ExcelUtils.java
+0
-0
没有找到文件。
src/main/java/com/sfa/operation/config/ExportColumnConfig.java
0 → 100644
浏览文件 @
80cd3855
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
;
}
}
src/main/java/com/sfa/operation/controller/sales/excel/ApExportExcelController.java
0 → 100644
浏览文件 @
80cd3855
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
);
}
}
src/main/java/com/sfa/operation/domain/sales/dao/ISalesApDisplayDao.java
浏览文件 @
80cd3855
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
);
}
src/main/java/com/sfa/operation/domain/sales/dao/impl/SalesApDisplayDaoImpl.java
浏览文件 @
80cd3855
...
...
@@ -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
()))
{
...
...
src/main/java/com/sfa/operation/enums/ExportAPType.java
0 → 100644
浏览文件 @
80cd3855
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
;
}
}
src/main/java/com/sfa/operation/factory/ApExportExcelStrategyFactory.java
0 → 100644
浏览文件 @
80cd3855
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
;
}
}
src/main/java/com/sfa/operation/pojo/sales/request/SalesApRequest.java
浏览文件 @
80cd3855
...
...
@@ -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
;
// ######################## 通用查询 ########################
/**
...
...
src/main/java/com/sfa/operation/service/sales/IApDisplayQueryService.java
浏览文件 @
80cd3855
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
);
}
src/main/java/com/sfa/operation/service/sales/export/IExportExcelService.java
0 → 100644
浏览文件 @
80cd3855
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
);
}
src/main/java/com/sfa/operation/service/sales/export/impl/ExportExcelServiceImpl.java
0 → 100644
浏览文件 @
80cd3855
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
,
"数据导出失败,请联系后台管理员处理!"
);
}
}
}
src/main/java/com/sfa/operation/service/sales/impl/ApDisplayQueryServiceImpl.java
浏览文件 @
80cd3855
...
...
@@ -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
;
}
}
src/main/java/com/sfa/operation/strategy/IExportApExcelStrategy.java
0 → 100644
浏览文件 @
80cd3855
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
()
);
}
}
src/main/java/com/sfa/operation/strategy/impl/NormalDisplayExportStrategyImpl.java
0 → 100644
浏览文件 @
80cd3855
差异被折叠。
点击展开。
src/main/java/com/sfa/operation/util/excel/ExcelStyleUtils.java
0 → 100644
浏览文件 @
80cd3855
差异被折叠。
点击展开。
src/main/java/com/sfa/operation/util/excel/ExcelUtils.java
0 → 100644
浏览文件 @
80cd3855
差异被折叠。
点击展开。
编写
预览
Markdown
格式
0%
重试
或
添加新文件
添加附件
取消
您添加了
0
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论