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
db2605b2
提交
db2605b2
authored
12月 15, 2025
作者:
douxy
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
增加店内执行计划导出/入功能: 1.增加导入功能
上级
5f2ada56
全部展开
显示空白字符变更
内嵌
并排
正在显示
21 个修改的文件
包含
764 行增加
和
27 行删除
+764
-27
pom.xml
pom.xml
+5
-0
OssConfigProperties.java
...in/java/com/sfa/operation/config/OssConfigProperties.java
+74
-0
ApImportExcelController.java
...ation/controller/sales/excel/ApImportExcelController.java
+36
-0
ISalesApDisplayDao.java
...om/sfa/operation/domain/sales/dao/ISalesApDisplayDao.java
+6
-0
SalesApDisplayDaoImpl.java
...peration/domain/sales/dao/impl/SalesApDisplayDaoImpl.java
+50
-0
ImportApType.java
src/main/java/com/sfa/operation/enums/ImportApType.java
+37
-0
ApExportExcelStrategyFactory.java
...m/sfa/operation/factory/ApExportExcelStrategyFactory.java
+1
-4
ApImportExcelStrategyFactory.java
...m/sfa/operation/factory/ApImportExcelStrategyFactory.java
+61
-0
SalesApDisplayImportExcelDto.java
...ration/pojo/sales/excel/SalesApDisplayImportExcelDto.java
+163
-0
ImportApExcelRequest.java
...fa/operation/pojo/sales/request/ImportApExcelRequest.java
+15
-0
SalesApDisplayVo.java
...ava/com/sfa/operation/pojo/sales/vo/SalesApDisplayVo.java
+87
-0
IApDisplayCoreService.java
...om/sfa/operation/service/sales/IApDisplayCoreService.java
+5
-0
IApDisplayQueryService.java
...m/sfa/operation/service/sales/IApDisplayQueryService.java
+3
-1
IImportExcelService.java
...a/operation/service/sales/export/IImportExcelService.java
+16
-0
ImportExcelServiceImpl.java
...ion/service/sales/export/impl/ImportExcelServiceImpl.java
+114
-0
ApDisplayCoreServiceImpl.java
...peration/service/sales/impl/ApDisplayCoreServiceImpl.java
+14
-0
ApDisplayQueryServiceImpl.java
...eration/service/sales/impl/ApDisplayQueryServiceImpl.java
+6
-7
IImportApExcelStrategy.java
...va/com/sfa/operation/strategy/IImportApExcelStrategy.java
+69
-0
NormalDisplayExportStrategyImpl.java
...trategy/impl/exports/NormalDisplayExportStrategyImpl.java
+2
-15
NormalDisplayImportStrategyImpl.java
...trategy/impl/imports/NormalDisplayImportStrategyImpl.java
+0
-0
ExcelUtils.java
src/main/java/com/sfa/operation/util/excel/ExcelUtils.java
+0
-0
没有找到文件。
pom.xml
浏览文件 @
db2605b2
...
@@ -94,6 +94,11 @@
...
@@ -94,6 +94,11 @@
<groupId>
com.taobao
</groupId>
<groupId>
com.taobao
</groupId>
<artifactId>
taobao-sdk-java
</artifactId>
<artifactId>
taobao-sdk-java
</artifactId>
</dependency>
</dependency>
<dependency>
<groupId>
com.aliyun.oss
</groupId>
<artifactId>
aliyun-sdk-oss
</artifactId>
</dependency>
</dependencies>
</dependencies>
<build>
<build>
...
...
src/main/java/com/sfa/operation/config/OssConfigProperties.java
0 → 100644
浏览文件 @
db2605b2
package
com
.
sfa
.
operation
.
config
;
import
lombok.Data
;
import
org.springframework.boot.context.properties.ConfigurationProperties
;
import
org.springframework.stereotype.Component
;
/**
* @Author: DouXinYu
* @Date: 2025-12-11 15:18
* @Description: OSS配置属性
*/
@Data
@Component
@ConfigurationProperties
(
prefix
=
"aliyun"
)
public
class
OssConfigProperties
{
/**
* 访问密钥ID
*/
private
String
accessKeyId
;
/**
* 访问密钥
*/
private
String
accessKeySecret
;
/**
* OSS配置属性
*/
private
Oss
oss
=
new
Oss
();
/**
* OSS其他配置项
*/
@Data
public
static
class
Oss
{
/**
* 地域ID
*/
private
String
regionId
;
/**
* 存储空间名称
*/
private
String
bucketName
;
/**
* 静态网站访问地址
*/
private
String
webJsLink
;
/**
* 角色授权
*/
private
String
stsRoleArm
;
private
String
sessionName
;
/**
* 静态网站访问地址前缀
*/
private
static
final
String
END_POINT_PREFIX
=
"https://"
;
/**
* 静态网站访问地址后缀
*/
private
static
final
String
END_POINT_SUFFIX
=
".aliyuncs.com"
;
/**
* 获取静态网站访问地址
* @return 静态网站访问地址
*/
public
String
getEndPoint
(){
return
END_POINT_PREFIX
+
this
.
getRegionId
()
+
END_POINT_SUFFIX
;
}
}
}
src/main/java/com/sfa/operation/controller/sales/excel/ApImportExcelController.java
0 → 100644
浏览文件 @
db2605b2
package
com
.
sfa
.
operation
.
controller
.
sales
.
excel
;
import
com.sfa.common.core.domain.R
;
import
com.sfa.operation.pojo.sales.request.ImportApExcelRequest
;
import
com.sfa.operation.service.sales.export.IImportExcelService
;
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
;
/**
* @Author: DouXinYu
* @Date: 2025-12-10 15:21
* @Description: AP导入excel(填报)控制类
*/
@RestController
@RequestMapping
(
"/sales/import"
)
public
class
ApImportExcelController
{
@Autowired
private
IImportExcelService
importExcelService
;
@PostMapping
(
"/upload"
)
public
R
importApDisplayExcel
(
@RequestBody
ImportApExcelRequest
request
)
{
return
importExcelService
.
importApExcel
(
request
);
}
@PostMapping
(
"/update"
)
public
R
updateApDisplayExcel
(
@RequestBody
ImportApExcelRequest
request
)
{
return
importExcelService
.
updateApEntity
(
request
);
}
}
src/main/java/com/sfa/operation/domain/sales/dao/ISalesApDisplayDao.java
浏览文件 @
db2605b2
...
@@ -3,6 +3,7 @@ package com.sfa.operation.domain.sales.dao;
...
@@ -3,6 +3,7 @@ package com.sfa.operation.domain.sales.dao;
import
com.sfa.common.core.web.domain.PageInfo
;
import
com.sfa.common.core.web.domain.PageInfo
;
import
com.sfa.operation.domain.sales.entity.SalesApDisplay
;
import
com.sfa.operation.domain.sales.entity.SalesApDisplay
;
import
com.sfa.operation.domain.sales.wq.SalesApWq
;
import
com.sfa.operation.domain.sales.wq.SalesApWq
;
import
com.sfa.operation.pojo.sales.excel.SalesApDisplayImportExcelDto
;
import
com.sfa.operation.pojo.sales.response.SalesApDisplayDto
;
import
com.sfa.operation.pojo.sales.response.SalesApDisplayDto
;
import
java.util.List
;
import
java.util.List
;
...
@@ -22,4 +23,9 @@ public interface ISalesApDisplayDao {
...
@@ -22,4 +23,9 @@ public interface ISalesApDisplayDao {
Object
queryDeptAPReport
(
SalesApWq
build
);
Object
queryDeptAPReport
(
SalesApWq
build
);
List
<
SalesApDisplay
>
queryDataListByCondition
(
SalesApWq
build
);
List
<
SalesApDisplay
>
queryDataListByCondition
(
SalesApWq
build
);
List
<
SalesApDisplay
>
queryByCondition
(
List
<
SalesApDisplayImportExcelDto
>
validDtoList
);
int
batchUpdate
(
List
<
SalesApDisplay
>
updateEntityList
);
}
}
src/main/java/com/sfa/operation/domain/sales/dao/impl/SalesApDisplayDaoImpl.java
浏览文件 @
db2605b2
...
@@ -2,6 +2,7 @@ package com.sfa.operation.domain.sales.dao.impl;
...
@@ -2,6 +2,7 @@ package com.sfa.operation.domain.sales.dao.impl;
import
com.baomidou.dynamic.datasource.annotation.DS
;
import
com.baomidou.dynamic.datasource.annotation.DS
;
import
com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper
;
import
com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper
;
import
com.baomidou.mybatisplus.core.conditions.query.QueryWrapper
;
import
com.baomidou.mybatisplus.extension.plugins.pagination.Page
;
import
com.baomidou.mybatisplus.extension.plugins.pagination.Page
;
import
com.sfa.common.core.enums.ECode
;
import
com.sfa.common.core.enums.ECode
;
import
com.sfa.common.core.exception.CheckedException
;
import
com.sfa.common.core.exception.CheckedException
;
...
@@ -13,13 +14,16 @@ import com.sfa.operation.domain.sales.dao.ISalesApDisplayDao;
...
@@ -13,13 +14,16 @@ import com.sfa.operation.domain.sales.dao.ISalesApDisplayDao;
import
com.sfa.operation.domain.sales.entity.SalesApDisplay
;
import
com.sfa.operation.domain.sales.entity.SalesApDisplay
;
import
com.sfa.operation.domain.sales.mapper.SalesApDisplayMapper
;
import
com.sfa.operation.domain.sales.mapper.SalesApDisplayMapper
;
import
com.sfa.operation.domain.sales.wq.SalesApWq
;
import
com.sfa.operation.domain.sales.wq.SalesApWq
;
import
com.sfa.operation.pojo.sales.excel.SalesApDisplayImportExcelDto
;
import
com.sfa.operation.pojo.sales.response.SalesApDisplayDto
;
import
com.sfa.operation.pojo.sales.response.SalesApDisplayDto
;
import
org.springframework.beans.BeanUtils
;
import
org.springframework.beans.BeanUtils
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.stereotype.Service
;
import
org.springframework.stereotype.Service
;
import
org.springframework.transaction.annotation.Transactional
;
import
org.springframework.util.CollectionUtils
;
import
org.springframework.util.CollectionUtils
;
import
java.util.*
;
import
java.util.*
;
import
java.util.function.Consumer
;
/**
/**
* @author : liqiulin
* @author : liqiulin
...
@@ -74,6 +78,52 @@ public class SalesApDisplayDaoImpl implements ISalesApDisplayDao {
...
@@ -74,6 +78,52 @@ public class SalesApDisplayDaoImpl implements ISalesApDisplayDao {
return
apDisplayList
;
return
apDisplayList
;
}
}
@Override
public
List
<
SalesApDisplay
>
queryByCondition
(
List
<
SalesApDisplayImportExcelDto
>
validDtoList
)
{
// 构建精准匹配的QueryWrapper(每个DTO对应一组AND条件,组间OR连接)
QueryWrapper
<
SalesApDisplay
>
wrapper
=
new
QueryWrapper
<>();
// 标记是否是第一个OR条件(避免多余的前置OR)
boolean
isFirstCondition
=
true
;
for
(
SalesApDisplayImportExcelDto
dto
:
validDtoList
)
{
// 字段为空时不参与条件匹配(或根据业务要求改为IS NULL)
Long
sadId
=
dto
.
getSadId
();
String
regionName
=
StringUtils
.
trimToNull
(
dto
.
getRegionName
());
String
dealerName
=
StringUtils
.
trimToNull
(
dto
.
getDealerName
());
String
lineName
=
StringUtils
.
trimToNull
(
dto
.
getLineName
());
// 构建单DTO的AND组合条件
Consumer
<
QueryWrapper
<
SalesApDisplay
>>
singleDtoCondition
=
w
->
{
w
.
eq
(
sadId
!=
null
,
"sad_id"
,
sadId
)
.
eq
(
regionName
!=
null
,
"region_name"
,
regionName
)
.
eq
(
dealerName
!=
null
,
"dealer_name"
,
dealerName
)
.
eq
(
lineName
!=
null
,
"line_name"
,
lineName
);
};
// 多条件OR拼接(第一个条件不加OR,避免SQL语法错误)
if
(
isFirstCondition
)
{
singleDtoCondition
.
accept
(
wrapper
);
isFirstCondition
=
false
;
}
else
{
wrapper
.
or
(
singleDtoCondition
);
}
}
return
salesapdisMapper
.
selectList
(
wrapper
);
}
@Override
@Transactional
(
rollbackFor
=
Exception
.
class
)
public
int
batchUpdate
(
List
<
SalesApDisplay
>
updateEntityList
)
{
if
(
CollectionUtils
.
isEmpty
(
updateEntityList
)){
return
0
;
}
int
count
=
0
;
for
(
SalesApDisplay
salesApDisplay
:
updateEntityList
)
{
count
+=
salesapdisMapper
.
updateById
(
salesApDisplay
);
}
return
count
;
}
private
LambdaQueryWrapper
<
SalesApDisplay
>
buildWq
(
SalesApWq
salesApWq
)
{
private
LambdaQueryWrapper
<
SalesApDisplay
>
buildWq
(
SalesApWq
salesApWq
)
{
LambdaQueryWrapper
<
SalesApDisplay
>
qw
=
new
LambdaQueryWrapper
<>();
LambdaQueryWrapper
<
SalesApDisplay
>
qw
=
new
LambdaQueryWrapper
<>();
if
(
StringUtils
.
isNotBlank
(
salesApWq
.
getDealerCode
()))
{
if
(
StringUtils
.
isNotBlank
(
salesApWq
.
getDealerCode
()))
{
...
...
src/main/java/com/sfa/operation/enums/ImportApType.java
0 → 100644
浏览文件 @
db2605b2
package
com
.
sfa
.
operation
.
enums
;
import
lombok.Getter
;
/**
* @Author: DouXinYu
* @Date: 2025-12-10 16:15
* @Description: 店内执行填报 导入 类型枚举
*/
@Getter
public
enum
ImportApType
{
/**
* 常规陈列导入策略
*/
NORMAL_DISPLAY_IMPORT
(
"normalDisplayImportStrategy"
),
/**
* 档期计划导入策略
*/
PROMOTION_PLAN_IMPORT
(
"promotionPlanImportStrategy"
),
/**
* 零食陈列导入策略
*/
SNACK_DISPLAY_IMPORT
(
"snackDisplayImportStrategy"
),
/**
* 三米两秒导入策略
*/
THREE_METER_TWO_SECONDS_IMPORT
(
"threeMeterSecondsImportStrategy"
),
/**
* 六小金刚导入策略
*/
SIX_KINGkONG_IMPORT
(
"sixKingKongImportStrategy"
);
private
final
String
importStrategy
;
ImportApType
(
String
importStrategy
)
{
this
.
importStrategy
=
importStrategy
;
}
}
src/main/java/com/sfa/operation/factory/ApExportExcelStrategyFactory.java
浏览文件 @
db2605b2
...
@@ -26,8 +26,6 @@ public class ApExportExcelStrategyFactory {
...
@@ -26,8 +26,6 @@ public class ApExportExcelStrategyFactory {
public
IExportApExcelStrategy
getStrategy
(
String
exportApType
)
{
public
IExportApExcelStrategy
getStrategy
(
String
exportApType
)
{
System
.
out
.
println
(
exportApExcelStrategyMap
.
size
());
System
.
out
.
println
(
exportApType
);
if
(
exportApType
==
null
||
exportApType
.
trim
().
isEmpty
())
{
if
(
exportApType
==
null
||
exportApType
.
trim
().
isEmpty
())
{
log
.
error
(
"AP导出Excel策略工厂:传入的导出类型为空!"
);
log
.
error
(
"AP导出Excel策略工厂:传入的导出类型为空!"
);
throw
new
IllegalArgumentException
(
"传入的导出类型为空!"
);
throw
new
IllegalArgumentException
(
"传入的导出类型为空!"
);
...
@@ -40,9 +38,8 @@ public class ApExportExcelStrategyFactory {
...
@@ -40,9 +38,8 @@ public class ApExportExcelStrategyFactory {
throw
new
IllegalArgumentException
(
"传入的导出类型不存在!"
);
throw
new
IllegalArgumentException
(
"传入的导出类型不存在!"
);
}
}
//
3.
从枚举中获取策略Bean名称,再从Map中查找策略
// 从枚举中获取策略Bean名称,再从Map中查找策略
String
strategyBeanName
=
typeEnum
.
getStrategy
();
String
strategyBeanName
=
typeEnum
.
getStrategy
();
System
.
out
.
println
(
strategyBeanName
);
IExportApExcelStrategy
strategy
=
exportApExcelStrategyMap
.
get
(
strategyBeanName
);
IExportApExcelStrategy
strategy
=
exportApExcelStrategyMap
.
get
(
strategyBeanName
);
if
(
strategy
==
null
)
{
if
(
strategy
==
null
)
{
log
.
error
(
"AP导出Excel策略工厂:未找到对应的导出策略!目标策略Bean名称为:{}"
,
strategyBeanName
);
log
.
error
(
"AP导出Excel策略工厂:未找到对应的导出策略!目标策略Bean名称为:{}"
,
strategyBeanName
);
...
...
src/main/java/com/sfa/operation/factory/ApImportExcelStrategyFactory.java
0 → 100644
浏览文件 @
db2605b2
package
com
.
sfa
.
operation
.
factory
;
import
com.sfa.operation.enums.ImportApType
;
import
com.sfa.operation.strategy.IImportApExcelStrategy
;
import
lombok.extern.slf4j.Slf4j
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.stereotype.Component
;
import
java.util.Map
;
/**
* @Author: DouXinYu
* @Date: 2025-12-10 16:23
* @Description: 店内执行上报 - 填报- 导入策略工厂类
*/
@Slf4j
@Component
public
class
ApImportExcelStrategyFactory
{
private
final
Map
<
String
,
IImportApExcelStrategy
>
importApExcelStrategyMap
;
//构造器注入
@Autowired
public
ApImportExcelStrategyFactory
(
Map
<
String
,
IImportApExcelStrategy
>
importApExcelStrategyMap
)
{
this
.
importApExcelStrategyMap
=
importApExcelStrategyMap
;
}
/**
* 获取策略
* @param importApType 点击导入的类型
* @return 对应策略实现类
*/
public
IImportApExcelStrategy
getStrategy
(
String
importApType
)
{
log
.
info
(
"店内执行填报导入策略注入开始,目标类型为:{}"
,
importApType
);
// 参数校验
if
(
importApType
==
null
||
importApType
.
trim
().
isEmpty
()){
log
.
error
(
"店内执行填报导入策略注入失败,失败原因:传入的导入类型为空!"
);
return
null
;
}
//转换为枚举类型
ImportApType
targetType
;
try
{
targetType
=
ImportApType
.
valueOf
(
importApType
);
}
catch
(
IllegalArgumentException
e
)
{
log
.
error
(
"店内执行填报导入策略注入失败,失败原因:传入的导入类型不存在!目标类型为:{}"
,
importApType
);
return
null
;
}
// 从枚举中获取策略Bean名称,再从Map中查找策略
String
beanName
=
targetType
.
getImportStrategy
();
IImportApExcelStrategy
strategy
=
importApExcelStrategyMap
.
get
(
beanName
);
if
(
strategy
==
null
)
{
log
.
error
(
"店内执行填报导入策略注入失败,失败原因:未找到对应的导入策略!目标策略Bean名称为:{}"
,
beanName
);
return
null
;
}
log
.
info
(
"店内执行填报导入策略注入成功,目标策略Bean名称为:{}"
,
beanName
);
return
strategy
;
}
}
src/main/java/com/sfa/operation/pojo/sales/excel/SalesApDisplayImportExcelDto.java
0 → 100644
浏览文件 @
db2605b2
package
com
.
sfa
.
operation
.
pojo
.
sales
.
excel
;
import
lombok.Data
;
/**
* @Author: DouXinYu
* @Date: 2025-12-10 16:05
* @Description: 店内执行上报 - 填报 - 常规陈列 导入excel数据传输对象
*/
@Data
public
class
SalesApDisplayImportExcelDto
{
/**
* 主键ID
* 类型:Long
*/
private
Long
sadId
;
/**
* 计划月份
* 注意:Excel中是"YYYY-MM"字符串,导入时需转换为Date类型
*/
private
String
salesMonth
;
/**
* 销售大区
* 类型:String
*/
private
String
regionName
;
/**
* 销售战区
* 类型:String
*/
private
String
districtName
;
/**
* 经销商代码
* 类型:String
*/
private
String
dealerCode
;
/**
* 经销商名称
* 类型:String
*/
private
String
dealerName
;
/**
* 门店编码
* 类型:String
*/
private
String
storeCode
;
/**
* 门店名称
* 类型:String
*/
private
String
storeName
;
/**
* 系统名称
* 类型:String
*/
private
String
lineName
;
/**
* 计划主货架-形式
* 类型:String
*/
private
String
plannedMainShelfType
;
/**
* 实际主货架-形式
* 类型:String
*/
private
String
actualMainShelfType
;
/**
* 计划主货架-数量
* 类型:Integer
*/
private
Integer
plannedMainShelfQty
;
/**
* 实际主货架-数量
* 类型:Integer
*/
private
Integer
actualMainShelfQty
;
/**
* 计划端架-数量
* 类型:Double
*/
private
Double
plannedEndCapQty
;
/**
* 实际端架-数量
* 类型:Double
*/
private
Double
actualEndCapQty
;
/**
* 计划地堆-平米数(㎡)
* 类型:Double
*/
private
Double
plannedFloorStackArea
;
/**
* 实际地堆-平米数(㎡)
* 类型:Double
*/
private
Double
actualFloorStackArea
;
/**
* 计划地堆-数量
* 类型:Integer
*/
private
Integer
plannedFloorStackQty
;
/**
* 实际地堆-数量
* 类型:Integer
*/
private
Integer
actualFloorStackQty
;
/**
* 计划多点陈列-数量+形式
* 类型:String
*/
private
String
plannedMultiDisplay
;
/**
* 实际多点陈列-数量+形式
* 类型:String
*/
private
String
actualMultiDisplay
;
/**
* 计划挂条-数量+形式
* 类型:String
*/
private
String
plannedHangingStripQuantityForm
;
/**
* 实际挂条-数量+形式
* 类型:String
*/
private
String
actualHangingStripQuantityForm
;
/**
* 错误信息
* 类型:String
*/
private
String
errorMsg
;
/**
* 行号
* 类型:Integer
*/
private
Integer
rowNum
;
}
src/main/java/com/sfa/operation/pojo/sales/request/ImportApExcelRequest.java
0 → 100644
浏览文件 @
db2605b2
package
com
.
sfa
.
operation
.
pojo
.
sales
.
request
;
import
lombok.Data
;
/**
* @Author: DouXinYu
* @Date: 2025-12-11 16:12
* @Description: 店内执行上报 - 导入Excel请求参数
*/
@Data
public
class
ImportApExcelRequest
{
private
String
importApType
;
private
String
importApFilePath
;
private
String
uuid
;
}
src/main/java/com/sfa/operation/pojo/sales/vo/SalesApDisplayVo.java
0 → 100644
浏览文件 @
db2605b2
package
com
.
sfa
.
operation
.
pojo
.
sales
.
vo
;
import
lombok.Data
;
/**
* @Author: DouXinYu
* @Date: 2025-12-10 15:31
* @Description: 店内执行-填报要更新到表的字段
*/
@Data
public
class
SalesApDisplayVo
{
/**
* 主键ID
*/
private
Long
sadId
;
/**
* 主货架形式(实际)
*/
private
String
actualMainShelfType
;
/**
* 主货架数量(实际)
*/
private
Integer
actualMainShelfQty
;
/**
* 实际-主货架是否执行
* 执行主货架形式 >= 计划主货架形式 && 执行主货架数量 >= 计划主货架数量"
* 执行/未执行
*/
private
String
actualMainShelfExecuted
;
/**
* 端架数量(实际)
*/
private
Integer
actualEndCapQty
;
/**
* 实际-架是否执行
* 执行端架数量 >= 计划端架数量
*/
private
String
actualEndCapExecuted
;
/**
* 地堆平米数(实际)
*/
private
Double
actualFloorStackArea
;
/**
* 地堆数量(实际)
*/
private
Integer
actualFloorStackQty
;
/**
* 实际-地堆是否执行
* 执行平米数 >= 计划平米数 && 执行数量 >= 计划数量"
*/
private
String
actualFloorStackExecuted
;
/**
* 多点陈列数量+形式(实际)
*/
private
String
actualMultiDisplay
;
/**
* 实际-多点陈列是否执行
*
* actualMultiDisplay的值如下时:
* 执行与计划一致:执行
* 执行与计划不一致:未执行
*/
private
String
actualMultiDisplayExecuted
;
/**
* 挂条数量+形式(实际)
*/
private
String
actualHangingStripQuantityForm
;
/**
* 实际-挂条是否执行
*
* actualHangingStripQuantityForm的值如下时:
* 执行与计划一致:执行
* 执行与计划不一致:未执行
*/
private
String
hangingStripExecuted
;
}
src/main/java/com/sfa/operation/service/sales/IApDisplayCoreService.java
浏览文件 @
db2605b2
package
com
.
sfa
.
operation
.
service
.
sales
;
package
com
.
sfa
.
operation
.
service
.
sales
;
import
com.sfa.operation.domain.sales.entity.SalesApDisplay
;
import
com.sfa.operation.pojo.sales.request.SalesApRequest
;
import
com.sfa.operation.pojo.sales.request.SalesApRequest
;
import
java.util.List
;
/**
/**
* @author : liqiulin
* @author : liqiulin
* @date : 2025-09-16 16
* @date : 2025-09-16 16
...
@@ -19,4 +22,6 @@ public interface IApDisplayCoreService {
...
@@ -19,4 +22,6 @@ public interface IApDisplayCoreService {
void
putDisplayJDetail
(
SalesApRequest
request
);
void
putDisplayJDetail
(
SalesApRequest
request
);
void
putPromotionDetail
(
SalesApRequest
request
);
void
putPromotionDetail
(
SalesApRequest
request
);
int
batchUpdate
(
List
<
SalesApDisplay
>
updateEntityList
);
}
}
src/main/java/com/sfa/operation/service/sales/IApDisplayQueryService.java
浏览文件 @
db2605b2
...
@@ -2,7 +2,7 @@ package com.sfa.operation.service.sales;
...
@@ -2,7 +2,7 @@ package com.sfa.operation.service.sales;
import
com.sfa.common.core.web.domain.PageInfo
;
import
com.sfa.common.core.web.domain.PageInfo
;
import
com.sfa.operation.domain.sales.entity.SalesApDisplay
;
import
com.sfa.operation.domain.sales.entity.SalesApDisplay
;
import
com.sfa.operation.
domain.sales.wq.SalesApWq
;
import
com.sfa.operation.
pojo.sales.excel.SalesApDisplayImportExcelDto
;
import
com.sfa.operation.pojo.sales.request.SalesApRequest
;
import
com.sfa.operation.pojo.sales.request.SalesApRequest
;
import
java.util.List
;
import
java.util.List
;
...
@@ -29,4 +29,6 @@ public interface IApDisplayQueryService {
...
@@ -29,4 +29,6 @@ public interface IApDisplayQueryService {
Object
queryDeptAPReport
(
SalesApRequest
request
);
Object
queryDeptAPReport
(
SalesApRequest
request
);
List
<
SalesApDisplay
>
queryDataListByCondition
(
SalesApRequest
build
);
List
<
SalesApDisplay
>
queryDataListByCondition
(
SalesApRequest
build
);
List
<
SalesApDisplay
>
queryByCondition
(
List
<
SalesApDisplayImportExcelDto
>
queryParam
);
}
}
src/main/java/com/sfa/operation/service/sales/export/IImportExcelService.java
0 → 100644
浏览文件 @
db2605b2
package
com
.
sfa
.
operation
.
service
.
sales
.
export
;
import
com.sfa.common.core.domain.R
;
import
com.sfa.operation.pojo.sales.request.ImportApExcelRequest
;
/**
* @Author: DouXinYu
* @Date: 2025-12-12 13:11
* @Description: 导入excel服务接口
*/
public
interface
IImportExcelService
{
R
importApExcel
(
ImportApExcelRequest
request
);
R
updateApEntity
(
ImportApExcelRequest
request
);
}
src/main/java/com/sfa/operation/service/sales/export/impl/ImportExcelServiceImpl.java
0 → 100644
浏览文件 @
db2605b2
package
com
.
sfa
.
operation
.
service
.
sales
.
export
.
impl
;
import
com.alibaba.fastjson2.JSONObject
;
import
com.sfa.common.core.domain.R
;
import
com.sfa.operation.factory.ApImportExcelStrategyFactory
;
import
com.sfa.operation.pojo.sales.request.ImportApExcelRequest
;
import
com.sfa.operation.service.sales.export.IImportExcelService
;
import
com.sfa.operation.strategy.IImportApExcelStrategy
;
import
lombok.extern.slf4j.Slf4j
;
import
org.apache.commons.collections4.CollectionUtils
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.data.redis.core.StringRedisTemplate
;
import
org.springframework.stereotype.Service
;
import
java.util.Collection
;
import
java.util.List
;
import
java.util.Map
;
import
java.util.concurrent.TimeUnit
;
/**
* @Author: DouXinYu
* @Date: 2025-12-12 13:11
* @Description: 导入excel服务实现类
*/
@Slf4j
@Service
public
class
ImportExcelServiceImpl
implements
IImportExcelService
{
@Autowired
private
ApImportExcelStrategyFactory
apImportExcelStrategyFactory
;
@Autowired
private
StringRedisTemplate
stringRedisTemplate
;
public
static
final
String
REDIS_KEY_PREFIX
=
"import_excel_ap:"
;
/**
* 店内执行上上报 -导入方法
*
* @param request 导入excel请求参数
* @return 导入结果
*/
@Override
public
R
importApExcel
(
ImportApExcelRequest
request
)
{
// 参数校验
if
(
request
==
null
||
request
.
getImportApFilePath
()
==
null
||
request
.
getImportApFilePath
().
trim
().
isEmpty
()){
return
R
.
fail
(
"导入文件路径不能为空!"
);
}
if
(
request
.
getImportApType
()
==
null
||
request
.
getImportApType
().
trim
().
isEmpty
()){
return
R
.
fail
(
"导入类型不能为空!"
);
}
// 获取策略
IImportApExcelStrategy
strategy
=
apImportExcelStrategyFactory
.
getStrategy
(
request
.
getImportApType
());
if
(
strategy
==
null
){
return
R
.
fail
(
"未找到对应的导入策略!"
);
}
// 执行导入的数据验证(根据不同的策略独自设计验证)
Map
<
String
,
Object
>
result
=
strategy
.
execute
(
request
.
getImportApFilePath
());
Integer
failCount
=
(
Integer
)
result
.
get
(
"failCount"
);
//failCount>0 时 返回错误信息
if
(
failCount
>
0
)
{
log
.
error
(
"导入失败,失败条数:{}"
,
failCount
);
return
R
.
fail
(
result
);
}
else
{
String
uuid
=
(
String
)
result
.
getOrDefault
(
"uuid"
,
""
);
String
redisKey
=
REDIS_KEY_PREFIX
+
uuid
;
//将数据保存躁redis中
stringRedisTemplate
.
opsForValue
().
set
(
redisKey
,
JSONObject
.
toJSONString
(
result
),
30
,
TimeUnit
.
MINUTES
);
log
.
info
(
"数据保存至redis中,redisKey={},result={}"
,
redisKey
,
JSONObject
.
toJSONString
(
result
));
}
return
R
.
ok
(
result
);
}
/**
* 前端点击确认后 更新数据
* @param request 导入excel请求参数
* @return 导入结果
*/
@Override
public
R
updateApEntity
(
ImportApExcelRequest
request
)
{
if
(
request
.
getImportApType
()
==
null
||
request
.
getImportApType
().
trim
().
isEmpty
()){
return
R
.
fail
(
"导入类型不能为空!"
);
}
if
(
request
.
getUuid
()
==
null
||
request
.
getUuid
().
trim
().
isEmpty
()){
return
R
.
fail
(
"导入数据标识不能为空!"
);
}
// 获取策略
IImportApExcelStrategy
strategy
=
apImportExcelStrategyFactory
.
getStrategy
(
request
.
getImportApType
());
if
(
strategy
==
null
){
return
R
.
fail
(
"未找到对应的导入策略!"
);
}
//从redis获取数据
String
redisKey
=
REDIS_KEY_PREFIX
+
request
.
getUuid
();
String
redisValue
=
stringRedisTemplate
.
opsForValue
().
get
(
redisKey
);
//解析jsonToDtoList
List
list
=
strategy
.
getTransactionJsonToObject
(
redisValue
);
//批量更新
String
result
=
strategy
.
updateDisplay
(
list
);
if
(
"更新失败"
.
equals
(
result
))
{
return
R
.
fail
(
result
);
}
return
R
.
ok
(
result
);
}
}
src/main/java/com/sfa/operation/service/sales/impl/ApDisplayCoreServiceImpl.java
浏览文件 @
db2605b2
...
@@ -3,6 +3,7 @@ package com.sfa.operation.service.sales.impl;
...
@@ -3,6 +3,7 @@ package com.sfa.operation.service.sales.impl;
import
cn.hutool.core.date.DatePattern
;
import
cn.hutool.core.date.DatePattern
;
import
com.sfa.common.security.utils.SecurityUtils
;
import
com.sfa.common.security.utils.SecurityUtils
;
import
com.sfa.operation.domain.sales.dao.*
;
import
com.sfa.operation.domain.sales.dao.*
;
import
com.sfa.operation.domain.sales.entity.SalesApDisplay
;
import
com.sfa.operation.pojo.sales.request.SalesApRequest
;
import
com.sfa.operation.pojo.sales.request.SalesApRequest
;
import
com.sfa.operation.pojo.sales.response.*
;
import
com.sfa.operation.pojo.sales.response.*
;
import
com.sfa.operation.service.sales.IApDisplayCoreService
;
import
com.sfa.operation.service.sales.IApDisplayCoreService
;
...
@@ -12,6 +13,7 @@ import org.springframework.stereotype.Service;
...
@@ -12,6 +13,7 @@ import org.springframework.stereotype.Service;
import
java.text.ParseException
;
import
java.text.ParseException
;
import
java.util.Date
;
import
java.util.Date
;
import
java.util.List
;
import
java.util.Objects
;
import
java.util.Objects
;
/**
/**
...
@@ -78,6 +80,16 @@ public class ApDisplayCoreServiceImpl implements IApDisplayCoreService {
...
@@ -78,6 +80,16 @@ public class ApDisplayCoreServiceImpl implements IApDisplayCoreService {
salesApDisplayJDao
.
updateDetail
(
djDto
);
salesApDisplayJDao
.
updateDetail
(
djDto
);
}
}
/**
*
* @param updateEntityList
* @return
*/
@Override
public
int
batchUpdate
(
List
<
SalesApDisplay
>
updateEntityList
)
{
return
salesApDisplayDao
.
batchUpdate
(
updateEntityList
);
}
@Override
@Override
public
void
putPromotionDetail
(
SalesApRequest
request
)
{
public
void
putPromotionDetail
(
SalesApRequest
request
)
{
// 修改DB 日期值为null
// 修改DB 日期值为null
...
@@ -110,4 +122,6 @@ public class ApDisplayCoreServiceImpl implements IApDisplayCoreService {
...
@@ -110,4 +122,6 @@ public class ApDisplayCoreServiceImpl implements IApDisplayCoreService {
e
.
printStackTrace
();
e
.
printStackTrace
();
}
}
}
}
}
}
src/main/java/com/sfa/operation/service/sales/impl/ApDisplayQueryServiceImpl.java
浏览文件 @
db2605b2
...
@@ -2,23 +2,17 @@ package com.sfa.operation.service.sales.impl;
...
@@ -2,23 +2,17 @@ package com.sfa.operation.service.sales.impl;
import
cn.hutool.core.date.DatePattern
;
import
cn.hutool.core.date.DatePattern
;
import
cn.hutool.core.date.DateUtil
;
import
cn.hutool.core.date.DateUtil
;
import
com.sfa.common.core.utils.StringUtils
;
import
com.sfa.common.core.utils.bean.BeanUtils
;
import
com.sfa.common.core.utils.bean.BeanUtils
;
import
com.sfa.common.core.web.domain.PageInfo
;
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.dao.*
;
import
com.sfa.operation.domain.sales.entity.SalesApDisplay
;
import
com.sfa.operation.domain.sales.entity.SalesApDisplay
;
import
com.sfa.operation.domain.sales.wq.SalesApWq
;
import
com.sfa.operation.domain.sales.wq.SalesApWq
;
import
com.sfa.operation.pojo.sales.excel.SalesApDisplayImportExcelDto
;
import
com.sfa.operation.pojo.sales.request.SalesApRequest
;
import
com.sfa.operation.pojo.sales.request.SalesApRequest
;
import
com.sfa.operation.service.sales.IApDisplayQueryService
;
import
com.sfa.operation.service.sales.IApDisplayQueryService
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.stereotype.Service
;
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
;
import
java.util.List
;
/**
/**
...
@@ -86,6 +80,11 @@ public class ApDisplayQueryServiceImpl implements IApDisplayQueryService {
...
@@ -86,6 +80,11 @@ public class ApDisplayQueryServiceImpl implements IApDisplayQueryService {
return
salesApDisplayDao
.
queryDataListByCondition
(
build
(
request
));
return
salesApDisplayDao
.
queryDataListByCondition
(
build
(
request
));
}
}
@Override
public
List
<
SalesApDisplay
>
queryByCondition
(
List
<
SalesApDisplayImportExcelDto
>
validDtoList
)
{
return
salesApDisplayDao
.
queryByCondition
(
validDtoList
);
}
private
SalesApWq
build
(
SalesApRequest
salesApRequest
){
private
SalesApWq
build
(
SalesApRequest
salesApRequest
){
SalesApWq
salesApWq
=
new
SalesApWq
();
SalesApWq
salesApWq
=
new
SalesApWq
();
BeanUtils
.
copyProperties
(
salesApRequest
,
salesApWq
);
BeanUtils
.
copyProperties
(
salesApRequest
,
salesApWq
);
...
...
src/main/java/com/sfa/operation/strategy/IImportApExcelStrategy.java
0 → 100644
浏览文件 @
db2605b2
package
com
.
sfa
.
operation
.
strategy
;
import
com.sfa.operation.config.ExportColumnConfig
;
import
com.sfa.operation.domain.sales.entity.SalesApDisplay
;
import
com.sfa.operation.pojo.sales.excel.SalesApDisplayImportExcelDto
;
import
java.io.InputStream
;
import
java.util.List
;
import
java.util.Map
;
/**
* @Author: DouXinYu
* @Date: 2025-12-10 16:21
* @Description: 店内执行填报 - 导入策略接口
*/
public
interface
IImportApExcelStrategy
<
T
>
{
/**
* 获取导入列配置(复用导出列配置)
*/
List
<
ExportColumnConfig
>
getImportColumnConfig
();
/**
* 解析Excel文件流为DTO列表
*/
List
<
T
>
parseExcelToDtoList
(
InputStream
inputStream
,
String
flePathUrl
,
Map
<
String
,
List
<
T
>>
errorMap
);
/**
* 预处理DTO数据(补充关联数据)
*/
void
preprocessData
(
List
<
T
>
dtoList
);
/**
* 数据库批量操作(新增/更新)
*/
int
queryAndBatchOperate
(
List
<
T
>
dtoList
);
/**
* 构建更新实体列表
*/
List
<?>
buildUpdateEntityList
(
List
<
T
>
dtoList
);
/**
* 查询数据库数据
*/
List
<?>
queryData
(
List
<
T
>
dto
);
/**
* 更新数据库数据
*/
String
updateDisplay
(
List
<
T
>
dtoList
);
List
<
T
>
getTransactionJsonToObject
(
String
json
);
/**
* 导入核心执行方法
*/
Map
<
String
,
Object
>
execute
(
String
flePathUrl
);
/**
* 获取导入Sheet名称(默认方法)
*/
default
String
getImportSheetName
()
{
return
""
;
}
}
src/main/java/com/sfa/operation/strategy/impl/NormalDisplayExportStrategyImpl.java
→
src/main/java/com/sfa/operation/strategy/impl/
exports/
NormalDisplayExportStrategyImpl.java
浏览文件 @
db2605b2
package
com
.
sfa
.
operation
.
strategy
.
impl
;
package
com
.
sfa
.
operation
.
strategy
.
impl
.
exports
;
import
com.sfa.common.core.constant.RoleConstants
;
import
com.sfa.common.core.enums.ECode
;
import
com.sfa.common.core.exception.CheckedException
;
import
com.sfa.common.security.utils.SecurityUtils
;
import
com.sfa.operation.config.ConstantValue
;
import
com.sfa.operation.config.ExportColumnConfig
;
import
com.sfa.operation.config.ExportColumnConfig
;
import
com.sfa.operation.pojo.sales.request.SalesApRequest
;
import
com.sfa.operation.pojo.sales.request.SalesApRequest
;
import
com.sfa.operation.service.qc.IQinceMarketEmployeeService
;
import
com.sfa.operation.service.sales.IApDisplayQueryService
;
import
com.sfa.operation.service.sales.IApDisplayQueryService
;
import
com.sfa.operation.strategy.IExportApExcelStrategy
;
import
com.sfa.operation.strategy.IExportApExcelStrategy
;
import
com.sfa.operation.util.excel.ExcelStyleUtils
;
import
com.sfa.operation.util.excel.ExcelStyleUtils
;
import
com.sfa.system.api.domain.SysRole
;
import
com.sfa.system.api.model.LoginUser
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.stereotype.Component
;
import
org.springframework.stereotype.Component
;
import
javax.annotation.PostConstruct
;
import
java.util.ArrayList
;
import
java.util.ArrayList
;
import
java.util.Arrays
;
import
java.util.Arrays
;
import
java.util.List
;
import
java.util.List
;
import
java.util.Optional
;
/**
/**
* @Author: DouXinYu
* @Author: DouXinYu
...
@@ -34,10 +25,6 @@ public class NormalDisplayExportStrategyImpl implements IExportApExcelStrategy {
...
@@ -34,10 +25,6 @@ public class NormalDisplayExportStrategyImpl implements IExportApExcelStrategy {
@Autowired
@Autowired
private
IApDisplayQueryService
apDisplayQueryService
;
private
IApDisplayQueryService
apDisplayQueryService
;
@Autowired
private
IQinceMarketEmployeeService
qinceMarketEmployeeService
;
@Autowired
private
ConstantValue
constantValue
;
/**
/**
* 获取导出列配置
* 获取导出列配置
...
...
src/main/java/com/sfa/operation/strategy/impl/imports/NormalDisplayImportStrategyImpl.java
0 → 100644
浏览文件 @
db2605b2
差异被折叠。
点击展开。
src/main/java/com/sfa/operation/util/excel/ExcelUtils.java
浏览文件 @
db2605b2
差异被折叠。
点击展开。
编写
预览
Markdown
格式
0%
重试
或
添加新文件
添加附件
取消
您添加了
0
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论