Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Contribute to GitLab
Sign in / Register
Toggle navigation
D
dsk-cr20g
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Administrator
dsk-cr20g
Commits
e7ac6f01
Commit
e7ac6f01
authored
Sep 04, 2023
by
lcl
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
集团户相关代码迁移
parent
04adee90
Changes
10
Hide whitespace changes
Inline
Side-by-side
Showing
10 changed files
with
2322 additions
and
0 deletions
+2322
-0
Excel.java
...common/src/main/java/com/dsk/common/annotation/Excel.java
+188
-0
DictUtils.java
dsk-common/src/main/java/com/dsk/common/utils/DictUtils.java
+187
-0
ImageUtils.java
...n/src/main/java/com/dsk/common/utils/file/ImageUtils.java
+97
-0
ExcelHandlerAdapter.java
...in/java/com/dsk/common/utils/poi/ExcelHandlerAdapter.java
+19
-0
CustomerFollowRecord.java
...rc/main/java/com/dsk/biz/domain/CustomerFollowRecord.java
+3
-0
ExcelUtils.java
...k-biz-api/src/main/java/com/dsk/biz/utils/ExcelUtils.java
+1329
-0
JskCombineInfoController.java
...java/com/dsk/jsk/controller/JskCombineInfoController.java
+184
-0
JskCombineBidProjectExportVo.java
...a/com/dsk/jsk/domain/vo/JskCombineBidProjectExportVo.java
+55
-0
JskCombineWinBidProjectExportVo.java
...om/dsk/jsk/domain/vo/JskCombineWinBidProjectExportVo.java
+55
-0
JskCombineInfoService.java
.../main/java/com/dsk/jsk/service/JskCombineInfoService.java
+205
-0
No files found.
dsk-common/src/main/java/com/dsk/common/annotation/Excel.java
0 → 100644
View file @
e7ac6f01
package
com
.
dsk
.
common
.
annotation
;
import
com.dsk.common.utils.poi.ExcelHandlerAdapter
;
import
org.apache.poi.ss.usermodel.HorizontalAlignment
;
import
org.apache.poi.ss.usermodel.IndexedColors
;
import
java.lang.annotation.ElementType
;
import
java.lang.annotation.Retention
;
import
java.lang.annotation.RetentionPolicy
;
import
java.lang.annotation.Target
;
import
java.math.BigDecimal
;
/**
* 自定义导出Excel数据注解
*
* @author dsk
*/
@Retention
(
RetentionPolicy
.
RUNTIME
)
@Target
(
ElementType
.
FIELD
)
public
@interface
Excel
{
/**
* 导出时在excel中排序
*/
public
int
sort
()
default
Integer
.
MAX_VALUE
;
/**
* 导出到Excel中的名字.
*/
public
String
name
()
default
""
;
/**
* 日期格式, 如: yyyy-MM-dd
*/
public
String
dateFormat
()
default
""
;
/**
* 如果是字典类型,请设置字典的type值 (如: sys_user_sex)
*/
public
String
dictType
()
default
""
;
/**
* 读取内容转表达式 (如: 0=男,1=女,2=未知)
*/
public
String
readConverterExp
()
default
""
;
/**
* 分隔符,读取字符串组内容
*/
public
String
separator
()
default
","
;
/**
* BigDecimal 精度 默认:-1(默认不开启BigDecimal格式化)
*/
public
int
scale
()
default
-
1
;
/**
* BigDecimal 舍入规则 默认:BigDecimal.ROUND_HALF_EVEN
*/
public
int
roundingMode
()
default
BigDecimal
.
ROUND_HALF_EVEN
;
/**
* 导出时在excel中每个列的高度 单位为字符
*/
public
double
height
()
default
14
;
/**
* 导出时在excel中每个列的宽 单位为字符
*/
public
double
width
()
default
16
;
/**
* 文字后缀,如% 90 变成90%
*/
public
String
suffix
()
default
""
;
/**
* 当值为空时,字段的默认值
*/
public
String
defaultValue
()
default
""
;
/**
* 提示信息
*/
public
String
prompt
()
default
""
;
/**
* 设置只能选择不能输入的列内容.
*/
public
String
[]
combo
()
default
{};
/**
* 是否需要纵向合并单元格,应对需求:含有list集合单元格)
*/
public
boolean
needMerge
()
default
false
;
/**
* 是否导出数据,应对需求:有时我们需要导出一份模板,这是标题需要但内容需要用户手工填写.
*/
public
boolean
isExport
()
default
true
;
/**
* 另一个类中的属性名称,支持多级获取,以小数点隔开
*/
public
String
targetAttr
()
default
""
;
/**
* 是否自动统计数据,在最后追加一行统计数据总和
*/
public
boolean
isStatistics
()
default
false
;
/**
* 导出类型(0数字 1字符串 2图片)
*/
public
ColumnType
cellType
()
default
ColumnType
.
STRING
;
/**
* 导出列头背景色
*/
public
IndexedColors
headerBackgroundColor
()
default
IndexedColors
.
GREY_50_PERCENT
;
/**
* 导出列头字体颜色
*/
public
IndexedColors
headerColor
()
default
IndexedColors
.
WHITE
;
/**
* 导出单元格背景色
*/
public
IndexedColors
backgroundColor
()
default
IndexedColors
.
WHITE
;
/**
* 导出单元格字体颜色
*/
public
IndexedColors
color
()
default
IndexedColors
.
BLACK
;
/**
* 导出字段对齐方式
*/
public
HorizontalAlignment
align
()
default
HorizontalAlignment
.
CENTER
;
/**
* 自定义数据处理器
*/
public
Class
<?>
handler
()
default
ExcelHandlerAdapter
.
class
;
/**
* 自定义数据处理器参数
*/
public
String
[]
args
()
default
{};
/**
* 字段类型(0:导出导入;1:仅导出;2:仅导入)
*/
Type
type
()
default
Type
.
ALL
;
public
enum
Type
{
ALL
(
0
),
EXPORT
(
1
),
IMPORT
(
2
);
private
final
int
value
;
Type
(
int
value
)
{
this
.
value
=
value
;
}
public
int
value
()
{
return
this
.
value
;
}
}
public
enum
ColumnType
{
NUMERIC
(
0
),
STRING
(
1
),
IMAGE
(
2
);
private
final
int
value
;
ColumnType
(
int
value
)
{
this
.
value
=
value
;
}
public
int
value
()
{
return
this
.
value
;
}
}
}
dsk-common/src/main/java/com/dsk/common/utils/DictUtils.java
0 → 100644
View file @
e7ac6f01
package
com
.
dsk
.
common
.
utils
;
import
com.dsk.common.constant.CacheConstants
;
import
com.dsk.common.core.domain.entity.SysDictData
;
import
com.dsk.common.utils.redis.RedisUtils
;
import
org.apache.commons.collections4.CollectionUtils
;
import
org.springframework.util.ObjectUtils
;
import
java.util.Collection
;
import
java.util.List
;
/**
* 字典工具类
*
* @author dsk
*/
public
class
DictUtils
{
/**
* 分隔符
*/
public
static
final
String
SEPARATOR
=
","
;
/**
* 设置字典缓存
*
* @param key 参数键
* @param dictDatas 字典数据列表
*/
public
static
void
setDictCache
(
String
key
,
List
<
SysDictData
>
dictDatas
)
{
RedisUtils
.
setCacheObject
(
getCacheKey
(
key
),
dictDatas
);
}
/**
* 获取字典缓存
*
* @param key 参数键
* @return dictDatas 字典数据列表
*/
public
static
List
<
SysDictData
>
getDictCache
(
String
key
)
{
Object
arrayCache
=
RedisUtils
.
getCacheObject
(
getCacheKey
(
key
));
if
(!
ObjectUtils
.
isEmpty
(
arrayCache
))
{
return
(
List
<
SysDictData
>)
arrayCache
;
}
return
null
;
}
/**
* 根据字典类型和字典值获取字典标签
*
* @param dictType 字典类型
* @param dictValue 字典值
* @return 字典标签
*/
public
static
String
getDictLabel
(
String
dictType
,
String
dictValue
)
{
return
getDictLabel
(
dictType
,
dictValue
,
SEPARATOR
);
}
/**
* 根据字典类型和字典标签获取字典值
*
* @param dictType 字典类型
* @param dictLabel 字典标签
* @return 字典值
*/
public
static
String
getDictValue
(
String
dictType
,
String
dictLabel
)
{
return
getDictValue
(
dictType
,
dictLabel
,
SEPARATOR
);
}
/**
* 根据字典类型和字典值获取字典标签
*
* @param dictType 字典类型
* @param dictValue 字典值
* @param separator 分隔符
* @return 字典标签
*/
public
static
String
getDictLabel
(
String
dictType
,
String
dictValue
,
String
separator
)
{
StringBuilder
propertyString
=
new
StringBuilder
();
List
<
SysDictData
>
datas
=
getDictCache
(
dictType
);
if
(!
ObjectUtils
.
isEmpty
(
datas
))
{
if
(
StringUtils
.
containsAny
(
separator
,
dictValue
))
{
for
(
SysDictData
dict
:
datas
)
{
for
(
String
value
:
dictValue
.
split
(
separator
))
{
if
(
value
.
equals
(
dict
.
getDictValue
()))
{
propertyString
.
append
(
dict
.
getDictLabel
()).
append
(
separator
);
break
;
}
}
}
}
else
{
for
(
SysDictData
dict
:
datas
)
{
if
(
dictValue
.
equals
(
dict
.
getDictValue
()))
{
return
dict
.
getDictLabel
();
}
}
}
}
return
StringUtils
.
stripEnd
(
propertyString
.
toString
(),
separator
);
}
/**
* 根据字典类型和字典标签获取字典值
*
* @param dictType 字典类型
* @param dictLabel 字典标签
* @param separator 分隔符
* @return 字典值
*/
public
static
String
getDictValue
(
String
dictType
,
String
dictLabel
,
String
separator
)
{
StringBuilder
propertyString
=
new
StringBuilder
();
List
<
SysDictData
>
datas
=
getDictCache
(
dictType
);
if
(
StringUtils
.
containsAny
(
separator
,
dictLabel
)
&&
CollectionUtils
.
isNotEmpty
(
datas
))
{
for
(
SysDictData
dict
:
datas
)
{
for
(
String
label
:
dictLabel
.
split
(
separator
))
{
if
(
label
.
equals
(
dict
.
getDictLabel
()))
{
propertyString
.
append
(
dict
.
getDictValue
()).
append
(
separator
);
break
;
}
}
}
}
else
{
for
(
SysDictData
dict
:
datas
)
{
if
(
dictLabel
.
equals
(
dict
.
getDictLabel
()))
{
return
dict
.
getDictValue
();
}
}
}
return
StringUtils
.
stripEnd
(
propertyString
.
toString
(),
separator
);
}
/**
* 删除指定字典缓存
*
* @param key 字典键
*/
public
static
void
removeDictCache
(
String
key
)
{
RedisUtils
.
deleteObject
(
getCacheKey
(
key
));
}
/**
* 清空字典缓存
*/
public
static
void
clearDictCache
()
{
Collection
<
String
>
keys
=
RedisUtils
.
keys
(
CacheConstants
.
SYS_DICT_KEY
+
"*"
);
RedisUtils
.
deleteObject
(
keys
);
}
/**
* 设置cache key
*
* @param configKey 参数键
* @return 缓存键key
*/
public
static
String
getCacheKey
(
String
configKey
)
{
return
CacheConstants
.
SYS_DICT_KEY
+
configKey
;
}
}
dsk-common/src/main/java/com/dsk/common/utils/file/ImageUtils.java
0 → 100644
View file @
e7ac6f01
package
com
.
dsk
.
common
.
utils
.
file
;
import
com.dsk.common.utils.StringUtils
;
import
org.apache.poi.util.IOUtils
;
import
org.slf4j.Logger
;
import
org.slf4j.LoggerFactory
;
import
java.io.ByteArrayInputStream
;
import
java.io.FileInputStream
;
import
java.io.InputStream
;
import
java.net.URL
;
import
java.net.URLConnection
;
import
java.util.Arrays
;
/**
* 图片处理工具类
*
* @author dsk
*/
public
class
ImageUtils
{
private
static
final
Logger
log
=
LoggerFactory
.
getLogger
(
ImageUtils
.
class
);
public
static
byte
[]
getImage
(
String
imagePath
)
{
InputStream
is
=
getFile
(
imagePath
);
try
{
return
IOUtils
.
toByteArray
(
is
);
}
catch
(
Exception
e
)
{
log
.
error
(
"图片加载异常 {}"
,
e
);
return
null
;
}
finally
{
IOUtils
.
closeQuietly
(
is
);
}
}
public
static
InputStream
getFile
(
String
imagePath
)
{
try
{
byte
[]
result
=
readFile
(
imagePath
);
result
=
Arrays
.
copyOf
(
result
,
result
.
length
);
return
new
ByteArrayInputStream
(
result
);
}
catch
(
Exception
e
)
{
log
.
error
(
"获取图片异常 {}"
,
e
);
}
return
null
;
}
/**
* 读取文件为字节数据
*
* @param url 地址
* @return 字节数据
*/
public
static
byte
[]
readFile
(
String
url
)
{
InputStream
in
=
null
;
try
{
if
(
url
.
startsWith
(
"http"
))
{
// 网络地址
URL
urlObj
=
new
URL
(
url
);
URLConnection
urlConnection
=
urlObj
.
openConnection
();
urlConnection
.
setConnectTimeout
(
30
*
1000
);
urlConnection
.
setReadTimeout
(
60
*
1000
);
urlConnection
.
setDoInput
(
true
);
in
=
urlConnection
.
getInputStream
();
}
else
{
// 本机地址
String
localPath
=
FileUploadUtils
.
getDefaultBaseDir
();
String
downloadPath
=
localPath
+
StringUtils
.
substringAfter
(
url
,
"/profile"
);
in
=
new
FileInputStream
(
downloadPath
);
}
return
IOUtils
.
toByteArray
(
in
);
}
catch
(
Exception
e
)
{
log
.
error
(
"获取文件路径异常 {}"
,
e
);
return
null
;
}
finally
{
IOUtils
.
closeQuietly
(
in
);
}
}
}
dsk-common/src/main/java/com/dsk/common/utils/poi/ExcelHandlerAdapter.java
0 → 100644
View file @
e7ac6f01
package
com
.
dsk
.
common
.
utils
.
poi
;
/**
* Excel数据格式处理适配器
*
* @author dsk
*/
public
interface
ExcelHandlerAdapter
{
/**
* 格式化
*
* @param value 单元格数据值
* @param args excel注解args参数组
*
* @return 处理后的值
*/
Object
format
(
Object
value
,
String
[]
args
);
}
dsk-module/dsk-biz-api/src/main/java/com/dsk/biz/domain/CustomerFollowRecord.java
View file @
e7ac6f01
package
com
.
dsk
.
biz
.
domain
;
import
com.baomidou.mybatisplus.annotation.*
;
import
com.fasterxml.jackson.annotation.JsonFormat
;
import
lombok.Data
;
import
lombok.NoArgsConstructor
;
import
lombok.experimental.Accessors
;
...
...
@@ -38,10 +39,12 @@ public class CustomerFollowRecord implements Serializable {
/**
* 拜访时间
*/
@JsonFormat
(
pattern
=
"yyyy-MM-dd"
)
private
Date
visitTime
;
/**
* 下次拜访时间
*/
@JsonFormat
(
pattern
=
"yyyy-MM-dd"
)
private
Date
nextVisitTime
;
/**
* 拜访对象姓名
...
...
dsk-module/dsk-biz-api/src/main/java/com/dsk/biz/utils/ExcelUtils.java
0 → 100644
View file @
e7ac6f01
package
com
.
dsk
.
biz
.
utils
;
import
cn.hutool.core.convert.Convert
;
import
com.dsk.common.annotation.Excel
;
import
com.dsk.common.core.domain.AjaxResult
;
import
com.dsk.common.exception.UtilException
;
import
com.dsk.common.utils.DateUtils
;
import
com.dsk.common.utils.DictUtils
;
import
com.dsk.common.utils.StringUtils
;
import
com.dsk.common.utils.file.FileTypeUtils
;
import
com.dsk.common.utils.file.FileUploadUtils
;
import
com.dsk.common.utils.file.ImageUtils
;
import
com.dsk.common.utils.poi.ExcelHandlerAdapter
;
import
com.dsk.common.utils.poi.ExcelUtil
;
import
org.apache.commons.lang3.ArrayUtils
;
import
org.apache.commons.lang3.RegExUtils
;
import
org.apache.commons.lang3.reflect.FieldUtils
;
import
org.apache.poi.hssf.usermodel.*
;
import
org.apache.poi.ooxml.POIXMLDocumentPart
;
import
org.apache.poi.ss.usermodel.*
;
import
org.apache.poi.ss.util.CellRangeAddress
;
import
org.apache.poi.ss.util.CellRangeAddressList
;
import
org.apache.poi.util.IOUtils
;
import
org.apache.poi.xssf.streaming.SXSSFWorkbook
;
import
org.apache.poi.xssf.usermodel.*
;
import
org.openxmlformats.schemas.drawingml.x2006.spreadsheetDrawing.CTMarker
;
import
org.slf4j.Logger
;
import
org.slf4j.LoggerFactory
;
import
org.springframework.util.ObjectUtils
;
import
javax.servlet.http.HttpServletResponse
;
import
java.io.*
;
import
java.lang.reflect.Field
;
import
java.lang.reflect.Method
;
import
java.lang.reflect.ParameterizedType
;
import
java.math.BigDecimal
;
import
java.text.DecimalFormat
;
import
java.time.LocalDate
;
import
java.time.LocalDateTime
;
import
java.util.*
;
import
java.util.stream.Collectors
;
/**
* Excel相关处理
*
* @author dsk
*/
public
class
ExcelUtils
<
T
>
{
private
static
final
Logger
log
=
LoggerFactory
.
getLogger
(
ExcelUtil
.
class
);
public
static
final
String
FORMULA_REGEX_STR
=
"=|-|\\+|@"
;
public
static
final
String
[]
FORMULA_STR
=
{
"="
,
"-"
,
"+"
,
"@"
};
/**
* 用于dictType属性数据存储,避免重复查缓存
*/
public
Map
<
String
,
String
>
sysDictMap
=
new
HashMap
<
String
,
String
>();
/**
* Excel sheet最大行数,默认65536
*/
public
static
final
int
sheetSize
=
65536
;
/**
* 工作表名称
*/
private
String
sheetName
;
/**
* 导出类型(EXPORT:导出数据;IMPORT:导入模板)
*/
private
Excel
.
Type
type
;
/**
* 工作薄对象
*/
private
Workbook
wb
;
/**
* 工作表对象
*/
private
Sheet
sheet
;
/**
* 样式列表
*/
private
Map
<
String
,
CellStyle
>
styles
;
/**
* 导入导出数据列表
*/
private
List
<
T
>
list
;
/**
* 注解列表
*/
private
List
<
Object
[]>
fields
;
/**
* 当前行号
*/
private
int
rownum
;
/**
* 标题
*/
private
String
title
;
/**
* 导出时间 (是否添加导出时间)
*/
private
boolean
dateStatus
;
/**
* 最大高度
*/
private
short
maxHeight
;
/**
* 合并后最后行数
*/
private
int
subMergedLastRowNum
=
0
;
/**
* 合并后开始行数
*/
private
int
subMergedFirstRowNum
=
1
;
/**
* 对象的子列表方法
*/
private
Method
subMethod
;
/**
* 对象的子列表属性
*/
private
List
<
Field
>
subFields
;
/**
* 统计列表
*/
private
Map
<
Integer
,
Double
>
statistics
=
new
HashMap
<
Integer
,
Double
>();
/**
* 数字格式
*/
private
static
final
DecimalFormat
DOUBLE_FORMAT
=
new
DecimalFormat
(
"######0.00"
);
/**
* 实体对象
*/
public
Class
<
T
>
clazz
;
/**
* 需要排除列属性
*/
public
String
[]
excludeFields
;
public
ExcelUtils
(
Class
<
T
>
clazz
)
{
this
.
clazz
=
clazz
;
}
/**
* 隐藏Excel中列属性
*
* @param fields 列属性名 示例[单个"name"/多个"id","name"]
* @throws Exception
*/
public
void
hideColumn
(
String
...
fields
)
{
this
.
excludeFields
=
fields
;
}
public
void
init
(
List
<
T
>
list
,
String
sheetName
,
String
title
,
Excel
.
Type
type
,
boolean
dateStatus
)
{
if
(
list
==
null
)
{
list
=
new
ArrayList
<
T
>();
}
this
.
list
=
list
;
this
.
sheetName
=
sheetName
;
this
.
type
=
type
;
this
.
title
=
title
;
this
.
dateStatus
=
dateStatus
;
createExcelField
();
createWorkbook
();
createTitle
();
createExportDate
();
createSubHead
();
}
/**
* 创建excel第一行标题
*/
public
void
createTitle
()
{
if
(
StringUtils
.
isNotEmpty
(
title
))
{
subMergedFirstRowNum
++;
subMergedLastRowNum
++;
int
titleLastCol
=
this
.
fields
.
size
()
-
1
;
if
(
isSubList
())
{
titleLastCol
=
titleLastCol
+
subFields
.
size
()
-
1
;
}
Row
titleRow
=
sheet
.
createRow
(
rownum
==
0
?
rownum
++
:
0
);
titleRow
.
setHeightInPoints
(
30
);
Cell
titleCell
=
titleRow
.
createCell
(
0
);
titleCell
.
setCellStyle
(
styles
.
get
(
"title"
));
titleCell
.
setCellValue
(
title
);
sheet
.
addMergedRegion
(
new
CellRangeAddress
(
titleRow
.
getRowNum
(),
titleRow
.
getRowNum
(),
titleRow
.
getRowNum
(),
titleLastCol
));
}
}
public
void
createExportDate
()
{
if
(
dateStatus
)
{
subMergedFirstRowNum
++;
subMergedLastRowNum
++;
int
dateLastCol
=
this
.
fields
.
size
()
-
1
;
if
(
isSubList
())
{
dateLastCol
=
dateLastCol
+
subFields
.
size
()
-
1
;
}
Row
dateRow
=
sheet
.
createRow
(
rownum
);
dateRow
.
setHeightInPoints
(
15
);
Cell
dateCell
=
dateRow
.
createCell
(
0
);
CellStyle
cellStyle
=
wb
.
createCellStyle
();
cellStyle
.
setAlignment
(
HorizontalAlignment
.
CENTER
);
dateCell
.
setCellStyle
(
cellStyle
);
dateCell
.
setCellValue
(
"导出时间:"
.
concat
(
DateUtils
.
dateTimeNow
(
DateUtils
.
YYYY_MM_DD_HH_MM_SS
)));
sheet
.
addMergedRegion
(
new
CellRangeAddress
(
dateRow
.
getRowNum
(),
dateRow
.
getRowNum
(),
0
,
dateLastCol
));
rownum
++;
}
}
/**
* 创建对象的子列表名称
*/
public
void
createSubHead
()
{
if
(
isSubList
())
{
subMergedFirstRowNum
++;
subMergedLastRowNum
++;
Row
subRow
=
sheet
.
createRow
(
rownum
);
int
excelNum
=
0
;
for
(
Object
[]
objects
:
fields
)
{
Excel
attr
=
(
Excel
)
objects
[
1
];
Cell
headCell1
=
subRow
.
createCell
(
excelNum
);
headCell1
.
setCellValue
(
attr
.
name
());
headCell1
.
setCellStyle
(
styles
.
get
(
StringUtils
.
format
(
"header_{}_{}"
,
attr
.
headerColor
(),
attr
.
headerBackgroundColor
())));
excelNum
++;
}
int
headFirstRow
=
excelNum
-
1
;
int
headLastRow
=
headFirstRow
+
subFields
.
size
()
-
1
;
if
(
headLastRow
>
headFirstRow
)
{
sheet
.
addMergedRegion
(
new
CellRangeAddress
(
rownum
,
rownum
,
headFirstRow
,
headLastRow
));
}
rownum
++;
}
}
/**
* 对list数据源将其里面的数据导入到excel表单
*
* @param list 导出数据集合
* @param sheetName 工作表的名称
* @return 结果
*/
public
AjaxResult
exportExcel
(
List
<
T
>
list
,
String
sheetName
)
{
return
exportExcel
(
list
,
sheetName
,
StringUtils
.
EMPTY
);
}
/**
* 对list数据源将其里面的数据导入到excel表单
*
* @param list 导出数据集合
* @param sheetName 工作表的名称
* @param title 标题
* @return 结果
*/
public
AjaxResult
exportExcel
(
List
<
T
>
list
,
String
sheetName
,
String
title
)
{
this
.
init
(
list
,
sheetName
,
title
,
Excel
.
Type
.
EXPORT
,
false
);
return
exportExcel
();
}
/**
* 对list数据源将其里面的数据导入到excel表单
*
* @param response 返回数据
* @param list 导出数据集合
* @param sheetName 工作表的名称
* @return 结果
*/
public
void
exportExcel
(
HttpServletResponse
response
,
List
<
T
>
list
,
String
sheetName
)
{
exportExcel
(
response
,
list
,
sheetName
,
StringUtils
.
EMPTY
);
}
/**
* 对list数据源将其里面的数据导入到excel表单
*
* @param response 返回数据
* @param list 导出数据集合
* @param sheetName 工作表的名称
* @param title 标题
* @return 结果
*/
public
void
exportExcel
(
HttpServletResponse
response
,
List
<
T
>
list
,
String
sheetName
,
String
title
)
{
response
.
setContentType
(
"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"
);
response
.
setCharacterEncoding
(
"utf-8"
);
this
.
init
(
list
,
sheetName
,
title
,
Excel
.
Type
.
EXPORT
,
false
);
exportExcel
(
response
);
}
public
void
exportExcel
(
HttpServletResponse
response
,
List
<
T
>
list
,
String
sheetName
,
String
title
,
boolean
dateStatus
)
{
response
.
setContentType
(
"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"
);
response
.
setCharacterEncoding
(
"utf-8"
);
this
.
init
(
list
,
sheetName
,
title
,
Excel
.
Type
.
EXPORT
,
dateStatus
);
exportExcel
(
response
);
}
private
static
final
String
FILE_PATH
=
"D://"
;
/**
* 本地初始化
*
* @param list 数据列表
* @param sheetName sheet名称
* @param title 标题
* @param dateStatus 是否添加导出时间
* @return
*/
public
String
localInit
(
List
<
T
>
list
,
String
sheetName
,
String
title
,
boolean
dateStatus
)
{
String
fileName
=
title
+
"-"
+
System
.
currentTimeMillis
()
+
".xlsx"
;
this
.
init
(
list
,
sheetName
,
title
,
Excel
.
Type
.
EXPORT
,
dateStatus
);
writeSheet
();
try
(
FileOutputStream
fileOutputStream
=
new
FileOutputStream
(
FILE_PATH
.
concat
(
fileName
))){
wb
.
write
(
fileOutputStream
);
return
fileName
;
}
catch
(
Exception
e
)
{
log
.
error
(
"导出Excel异常{}"
,
e
.
getMessage
());
}
finally
{
IOUtils
.
closeQuietly
(
wb
);
}
return
null
;
}
/**
* 对list数据源将其里面的数据导入到excel表单
*
* @param sheetName 工作表的名称
* @return 结果
*/
public
AjaxResult
importTemplateExcel
(
String
sheetName
)
{
return
importTemplateExcel
(
sheetName
,
StringUtils
.
EMPTY
);
}
/**
* 对list数据源将其里面的数据导入到excel表单
*
* @param sheetName 工作表的名称
* @param title 标题
* @return 结果
*/
public
AjaxResult
importTemplateExcel
(
String
sheetName
,
String
title
)
{
this
.
init
(
null
,
sheetName
,
title
,
Excel
.
Type
.
IMPORT
,
false
);
return
exportExcel
();
}
/**
* 对list数据源将其里面的数据导入到excel表单
*
* @param sheetName 工作表的名称
* @return 结果
*/
public
void
importTemplateExcel
(
HttpServletResponse
response
,
String
sheetName
)
{
importTemplateExcel
(
response
,
sheetName
,
StringUtils
.
EMPTY
);
}
/**
* 对list数据源将其里面的数据导入到excel表单
*
* @param sheetName 工作表的名称
* @param title 标题
* @return 结果
*/
public
void
importTemplateExcel
(
HttpServletResponse
response
,
String
sheetName
,
String
title
)
{
response
.
setContentType
(
"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"
);
response
.
setCharacterEncoding
(
"utf-8"
);
this
.
init
(
null
,
sheetName
,
title
,
Excel
.
Type
.
IMPORT
,
false
);
exportExcel
(
response
);
}
/**
* 对list数据源将其里面的数据导入到excel表单
*
* @return 结果
*/
public
void
exportExcel
(
HttpServletResponse
response
)
{
try
{
writeSheet
();
wb
.
write
(
response
.
getOutputStream
());
}
catch
(
Exception
e
)
{
log
.
error
(
"导出Excel异常{}"
,
e
.
getMessage
());
}
finally
{
IOUtils
.
closeQuietly
(
wb
);
}
}
/**
* 对list数据源将其里面的数据导入到excel表单
*
* @return 结果
*/
public
AjaxResult
exportExcel
()
{
OutputStream
out
=
null
;
try
{
writeSheet
();
String
filename
=
encodingFilename
(
sheetName
);
out
=
new
FileOutputStream
(
getAbsoluteFile
(
filename
));
wb
.
write
(
out
);
return
AjaxResult
.
success
(
filename
);
}
catch
(
Exception
e
)
{
log
.
error
(
"导出Excel异常{}"
,
e
.
getMessage
());
throw
new
UtilException
(
"导出Excel失败,请联系网站管理员!"
);
}
finally
{
IOUtils
.
closeQuietly
(
wb
);
IOUtils
.
closeQuietly
(
out
);
}
}
/**
* 创建写入数据到Sheet
*/
public
void
writeSheet
()
{
// 取出一共有多少个sheet.
int
sheetNo
=
Math
.
max
(
1
,
(
int
)
Math
.
ceil
(
list
.
size
()
*
1.0
/
sheetSize
));
for
(
int
index
=
0
;
index
<
sheetNo
;
index
++)
{
createSheet
(
sheetNo
,
index
);
// 产生一行
Row
row
=
sheet
.
createRow
(
rownum
);
int
column
=
0
;
// 写入各个字段的列头名称
for
(
Object
[]
os
:
fields
)
{
Field
field
=
(
Field
)
os
[
0
];
Excel
excel
=
(
Excel
)
os
[
1
];
if
(
Collection
.
class
.
isAssignableFrom
(
field
.
getType
()))
{
for
(
Field
subField
:
subFields
)
{
Excel
subExcel
=
subField
.
getAnnotation
(
Excel
.
class
);
this
.
createHeadCell
(
subExcel
,
row
,
column
++);
}
}
else
{
this
.
createHeadCell
(
excel
,
row
,
column
++);
}
}
if
(
Excel
.
Type
.
EXPORT
.
equals
(
type
))
{
fillExcelData
(
index
,
row
);
addStatisticsRow
();
}
}
}
/**
* 填充excel数据
*
* @param index 序号
* @param row 单元格行
*/
@SuppressWarnings
(
"unchecked"
)
public
void
fillExcelData
(
int
index
,
Row
row
)
{
int
startNo
=
index
*
sheetSize
;
int
endNo
=
Math
.
min
(
startNo
+
sheetSize
,
list
.
size
());
int
rowNo
=
(
1
+
rownum
)
-
startNo
;
for
(
int
i
=
startNo
;
i
<
endNo
;
i
++)
{
rowNo
=
isSubList
()
?
(
i
>
1
?
rowNo
+
1
:
rowNo
+
i
)
:
i
+
1
+
rownum
-
startNo
;
row
=
sheet
.
createRow
(
rowNo
);
// 得到导出对象.
T
vo
=
(
T
)
list
.
get
(
i
);
Collection
<?>
subList
=
null
;
if
(
isSubList
())
{
if
(
isSubListValue
(
vo
))
{
subList
=
getListCellValue
(
vo
);
subMergedLastRowNum
=
subMergedLastRowNum
+
subList
.
size
();
}
else
{
subMergedFirstRowNum
++;
subMergedLastRowNum
++;
}
}
int
column
=
0
;
for
(
Object
[]
os
:
fields
)
{
Field
field
=
(
Field
)
os
[
0
];
Excel
excel
=
(
Excel
)
os
[
1
];
if
(
Collection
.
class
.
isAssignableFrom
(
field
.
getType
())
&&
!
ObjectUtils
.
isEmpty
(
subList
))
{
boolean
subFirst
=
false
;
for
(
Object
obj
:
subList
)
{
if
(
subFirst
)
{
rowNo
++;
row
=
sheet
.
createRow
(
rowNo
);
}
List
<
Field
>
subFields
=
FieldUtils
.
getFieldsListWithAnnotation
(
obj
.
getClass
(),
Excel
.
class
);
int
subIndex
=
0
;
for
(
Field
subField
:
subFields
)
{
if
(
subField
.
isAnnotationPresent
(
Excel
.
class
))
{
subField
.
setAccessible
(
true
);
Excel
attr
=
subField
.
getAnnotation
(
Excel
.
class
);
this
.
addCell
(
attr
,
row
,
(
T
)
obj
,
subField
,
column
+
subIndex
);
}
subIndex
++;
}
subFirst
=
true
;
}
this
.
subMergedFirstRowNum
=
this
.
subMergedFirstRowNum
+
subList
.
size
();
}
else
{
this
.
addCell
(
excel
,
row
,
vo
,
field
,
column
++);
}
}
}
}
/**
* 创建表格样式
*
* @param wb 工作薄对象
* @return 样式列表
*/
private
Map
<
String
,
CellStyle
>
createStyles
(
Workbook
wb
)
{
// 写入各条记录,每条记录对应excel表中的一行
Map
<
String
,
CellStyle
>
styles
=
new
HashMap
<
String
,
CellStyle
>();
CellStyle
style
=
wb
.
createCellStyle
();
style
.
setAlignment
(
HorizontalAlignment
.
CENTER
);
style
.
setVerticalAlignment
(
VerticalAlignment
.
CENTER
);
Font
titleFont
=
wb
.
createFont
();
titleFont
.
setFontName
(
"Arial"
);
titleFont
.
setFontHeightInPoints
((
short
)
16
);
titleFont
.
setBold
(
true
);
style
.
setFont
(
titleFont
);
styles
.
put
(
"title"
,
style
);
style
=
wb
.
createCellStyle
();
style
.
setAlignment
(
HorizontalAlignment
.
CENTER
);
style
.
setVerticalAlignment
(
VerticalAlignment
.
CENTER
);
style
.
setBorderRight
(
BorderStyle
.
THIN
);
style
.
setRightBorderColor
(
IndexedColors
.
GREY_50_PERCENT
.
getIndex
());
style
.
setBorderLeft
(
BorderStyle
.
THIN
);
style
.
setLeftBorderColor
(
IndexedColors
.
GREY_50_PERCENT
.
getIndex
());
style
.
setBorderTop
(
BorderStyle
.
THIN
);
style
.
setTopBorderColor
(
IndexedColors
.
GREY_50_PERCENT
.
getIndex
());
style
.
setBorderBottom
(
BorderStyle
.
THIN
);
style
.
setBottomBorderColor
(
IndexedColors
.
GREY_50_PERCENT
.
getIndex
());
Font
dataFont
=
wb
.
createFont
();
dataFont
.
setFontName
(
"Arial"
);
dataFont
.
setFontHeightInPoints
((
short
)
10
);
style
.
setFont
(
dataFont
);
styles
.
put
(
"data"
,
style
);
style
=
wb
.
createCellStyle
();
style
.
setAlignment
(
HorizontalAlignment
.
CENTER
);
style
.
setVerticalAlignment
(
VerticalAlignment
.
CENTER
);
Font
totalFont
=
wb
.
createFont
();
totalFont
.
setFontName
(
"Arial"
);
totalFont
.
setFontHeightInPoints
((
short
)
10
);
style
.
setFont
(
totalFont
);
styles
.
put
(
"total"
,
style
);
styles
.
putAll
(
annotationHeaderStyles
(
wb
,
styles
));
styles
.
putAll
(
annotationDataStyles
(
wb
));
return
styles
;
}
/**
* 根据Excel注解创建表格头样式
*
* @param wb 工作薄对象
* @return 自定义样式列表
*/
private
Map
<
String
,
CellStyle
>
annotationHeaderStyles
(
Workbook
wb
,
Map
<
String
,
CellStyle
>
styles
)
{
Map
<
String
,
CellStyle
>
headerStyles
=
new
HashMap
<
String
,
CellStyle
>();
for
(
Object
[]
os
:
fields
)
{
Excel
excel
=
(
Excel
)
os
[
1
];
String
key
=
StringUtils
.
format
(
"header_{}_{}"
,
excel
.
headerColor
(),
excel
.
headerBackgroundColor
());
if
(!
headerStyles
.
containsKey
(
key
))
{
CellStyle
style
=
wb
.
createCellStyle
();
style
.
cloneStyleFrom
(
styles
.
get
(
"data"
));
style
.
setAlignment
(
HorizontalAlignment
.
CENTER
);
style
.
setVerticalAlignment
(
VerticalAlignment
.
CENTER
);
style
.
setFillForegroundColor
(
excel
.
headerBackgroundColor
().
index
);
style
.
setFillPattern
(
FillPatternType
.
SOLID_FOREGROUND
);
Font
headerFont
=
wb
.
createFont
();
headerFont
.
setFontName
(
"Arial"
);
headerFont
.
setFontHeightInPoints
((
short
)
10
);
headerFont
.
setBold
(
true
);
headerFont
.
setColor
(
excel
.
headerColor
().
index
);
style
.
setFont
(
headerFont
);
headerStyles
.
put
(
key
,
style
);
}
}
return
headerStyles
;
}
/**
* 根据Excel注解创建表格列样式
*
* @param wb 工作薄对象
* @return 自定义样式列表
*/
private
Map
<
String
,
CellStyle
>
annotationDataStyles
(
Workbook
wb
)
{
Map
<
String
,
CellStyle
>
styles
=
new
HashMap
<
String
,
CellStyle
>();
for
(
Object
[]
os
:
fields
)
{
Excel
excel
=
(
Excel
)
os
[
1
];
String
key
=
StringUtils
.
format
(
"data_{}_{}_{}"
,
excel
.
align
(),
excel
.
color
(),
excel
.
backgroundColor
());
if
(!
styles
.
containsKey
(
key
))
{
CellStyle
style
=
wb
.
createCellStyle
();
style
.
setAlignment
(
excel
.
align
());
style
.
setVerticalAlignment
(
VerticalAlignment
.
CENTER
);
style
.
setBorderRight
(
BorderStyle
.
THIN
);
style
.
setRightBorderColor
(
IndexedColors
.
GREY_50_PERCENT
.
getIndex
());
style
.
setBorderLeft
(
BorderStyle
.
THIN
);
style
.
setLeftBorderColor
(
IndexedColors
.
GREY_50_PERCENT
.
getIndex
());
style
.
setBorderTop
(
BorderStyle
.
THIN
);
style
.
setTopBorderColor
(
IndexedColors
.
GREY_50_PERCENT
.
getIndex
());
style
.
setBorderBottom
(
BorderStyle
.
THIN
);
style
.
setBottomBorderColor
(
IndexedColors
.
GREY_50_PERCENT
.
getIndex
());
style
.
setFillPattern
(
FillPatternType
.
SOLID_FOREGROUND
);
style
.
setFillForegroundColor
(
excel
.
backgroundColor
().
getIndex
());
Font
dataFont
=
wb
.
createFont
();
dataFont
.
setFontName
(
"Arial"
);
dataFont
.
setFontHeightInPoints
((
short
)
10
);
dataFont
.
setColor
(
excel
.
color
().
index
);
style
.
setFont
(
dataFont
);
styles
.
put
(
key
,
style
);
}
}
return
styles
;
}
/**
* 创建单元格
*/
public
Cell
createHeadCell
(
Excel
attr
,
Row
row
,
int
column
)
{
// 创建列
Cell
cell
=
row
.
createCell
(
column
);
// 写入列信息
cell
.
setCellValue
(
attr
.
name
());
setDataValidation
(
attr
,
row
,
column
);
cell
.
setCellStyle
(
styles
.
get
(
StringUtils
.
format
(
"header_{}_{}"
,
attr
.
headerColor
(),
attr
.
headerBackgroundColor
())));
if
(
isSubList
())
{
// 填充默认样式,防止合并单元格样式失效
sheet
.
setDefaultColumnStyle
(
column
,
styles
.
get
(
StringUtils
.
format
(
"data_{}_{}_{}"
,
attr
.
align
(),
attr
.
color
(),
attr
.
backgroundColor
())));
if
(
attr
.
needMerge
())
{
sheet
.
addMergedRegion
(
new
CellRangeAddress
(
rownum
-
1
,
rownum
,
column
,
column
));
}
}
return
cell
;
}
/**
* 设置单元格信息
*
* @param value 单元格值
* @param attr 注解相关
* @param cell 单元格信息
*/
public
void
setCellVo
(
Object
value
,
Excel
attr
,
Cell
cell
)
{
if
(
Excel
.
ColumnType
.
STRING
==
attr
.
cellType
())
{
String
cellValue
=
Convert
.
toStr
(
value
);
// 对于任何以表达式触发字符 =-+@开头的单元格,直接使用tab字符作为前缀,防止CSV注入。
if
(
StringUtils
.
startsWithAny
(
cellValue
,
FORMULA_STR
))
{
cellValue
=
RegExUtils
.
replaceFirst
(
cellValue
,
FORMULA_REGEX_STR
,
"\t$0"
);
}
if
(
value
instanceof
Collection
&&
StringUtils
.
equals
(
"[]"
,
cellValue
))
{
cellValue
=
StringUtils
.
EMPTY
;
}
cell
.
setCellValue
(
ObjectUtils
.
isEmpty
(
cellValue
)
?
attr
.
defaultValue
()
:
cellValue
+
attr
.
suffix
());
}
else
if
(
Excel
.
ColumnType
.
NUMERIC
==
attr
.
cellType
())
{
if
(!
ObjectUtils
.
isEmpty
(
value
))
{
cell
.
setCellValue
(
StringUtils
.
contains
(
Convert
.
toStr
(
value
),
"."
)
?
Convert
.
toDouble
(
value
)
:
Convert
.
toInt
(
value
));
}
}
else
if
(
Excel
.
ColumnType
.
IMAGE
==
attr
.
cellType
())
{
ClientAnchor
anchor
=
new
XSSFClientAnchor
(
0
,
0
,
0
,
0
,
(
short
)
cell
.
getColumnIndex
(),
cell
.
getRow
().
getRowNum
(),
(
short
)
(
cell
.
getColumnIndex
()
+
1
),
cell
.
getRow
().
getRowNum
()
+
1
);
String
imagePath
=
Convert
.
toStr
(
value
);
if
(
StringUtils
.
isNotEmpty
(
imagePath
))
{
byte
[]
data
=
ImageUtils
.
getImage
(
imagePath
);
getDrawingPatriarch
(
cell
.
getSheet
()).
createPicture
(
anchor
,
cell
.
getSheet
().
getWorkbook
().
addPicture
(
data
,
getImageType
(
data
)));
}
}
}
/**
* 获取画布
*/
public
static
Drawing
<?>
getDrawingPatriarch
(
Sheet
sheet
)
{
if
(
sheet
.
getDrawingPatriarch
()
==
null
)
{
sheet
.
createDrawingPatriarch
();
}
return
sheet
.
getDrawingPatriarch
();
}
/**
* 获取图片类型,设置图片插入类型
*/
public
int
getImageType
(
byte
[]
value
)
{
String
type
=
FileTypeUtils
.
getFileExtendName
(
value
);
if
(
"JPG"
.
equalsIgnoreCase
(
type
))
{
return
Workbook
.
PICTURE_TYPE_JPEG
;
}
else
if
(
"PNG"
.
equalsIgnoreCase
(
type
))
{
return
Workbook
.
PICTURE_TYPE_PNG
;
}
return
Workbook
.
PICTURE_TYPE_JPEG
;
}
/**
* 创建表格样式
*/
public
void
setDataValidation
(
Excel
attr
,
Row
row
,
int
column
)
{
if
(
attr
.
name
().
indexOf
(
"注:"
)
>=
0
)
{
sheet
.
setColumnWidth
(
column
,
6000
);
}
else
{
// 设置列宽
sheet
.
setColumnWidth
(
column
,
(
int
)
((
attr
.
width
()
+
0.72
)
*
256
));
}
if
(
StringUtils
.
isNotEmpty
(
attr
.
prompt
())
||
attr
.
combo
().
length
>
0
)
{
if
(
attr
.
combo
().
length
>
15
||
StringUtils
.
join
(
attr
.
combo
()).
length
()
>
255
)
{
// 如果下拉数大于15或字符串长度大于255,则使用一个新sheet存储,避免生成的模板下拉值获取不到
setXSSFValidationWithHidden
(
sheet
,
attr
.
combo
(),
attr
.
prompt
(),
1
,
100
,
column
,
column
);
}
else
{
// 提示信息或只能选择不能输入的列内容.
setPromptOrValidation
(
sheet
,
attr
.
combo
(),
attr
.
prompt
(),
1
,
100
,
column
,
column
);
}
}
}
/**
* 添加单元格
*/
public
Cell
addCell
(
Excel
attr
,
Row
row
,
T
vo
,
Field
field
,
int
column
)
{
Cell
cell
=
null
;
try
{
// 设置行高
row
.
setHeight
(
maxHeight
);
// 根据Excel中设置情况决定是否导出,有些情况需要保持为空,希望用户填写这一列.
if
(
attr
.
isExport
())
{
// 创建cell
cell
=
row
.
createCell
(
column
);
if
(
isSubListValue
(
vo
)
&&
getListCellValue
(
vo
).
size
()
>
1
&&
attr
.
needMerge
())
{
CellRangeAddress
cellAddress
=
new
CellRangeAddress
(
subMergedFirstRowNum
,
subMergedLastRowNum
,
column
,
column
);
sheet
.
addMergedRegion
(
cellAddress
);
}
cell
.
setCellStyle
(
styles
.
get
(
StringUtils
.
format
(
"data_{}_{}_{}"
,
attr
.
align
(),
attr
.
color
(),
attr
.
backgroundColor
())));
// 用于读取对象中的属性
Object
value
=
getTargetValue
(
vo
,
field
,
attr
);
String
dateFormat
=
attr
.
dateFormat
();
String
readConverterExp
=
attr
.
readConverterExp
();
String
separator
=
attr
.
separator
();
String
dictType
=
attr
.
dictType
();
if
(
StringUtils
.
isNotEmpty
(
dateFormat
)
&&
!
ObjectUtils
.
isEmpty
(
value
))
{
cell
.
setCellValue
(
parseDateToStr
(
dateFormat
,
value
));
}
else
if
(
StringUtils
.
isNotEmpty
(
readConverterExp
)
&&
!
ObjectUtils
.
isEmpty
(
value
))
{
cell
.
setCellValue
(
convertByExp
(
Convert
.
toStr
(
value
),
readConverterExp
,
separator
));
}
else
if
(
StringUtils
.
isNotEmpty
(
dictType
)
&&
!
ObjectUtils
.
isEmpty
(
value
))
{
if
(!
sysDictMap
.
containsKey
(
dictType
+
value
))
{
String
lable
=
convertDictByExp
(
Convert
.
toStr
(
value
),
dictType
,
separator
);
sysDictMap
.
put
(
dictType
+
value
,
lable
);
}
cell
.
setCellValue
(
sysDictMap
.
get
(
dictType
+
value
));
}
else
if
(
value
instanceof
BigDecimal
&&
-
1
!=
attr
.
scale
())
{
cell
.
setCellValue
((((
BigDecimal
)
value
).
setScale
(
attr
.
scale
(),
attr
.
roundingMode
())).
doubleValue
());
}
else
if
(!
attr
.
handler
().
equals
(
ExcelHandlerAdapter
.
class
))
{
cell
.
setCellValue
(
dataFormatHandlerAdapter
(
value
,
attr
));
}
else
{
// 设置列类型
setCellVo
(
value
,
attr
,
cell
);
}
addStatisticsData
(
column
,
Convert
.
toStr
(
value
),
attr
);
}
}
catch
(
Exception
e
)
{
log
.
error
(
"导出Excel失败{}"
,
e
);
}
return
cell
;
}
/**
* 设置 POI XSSFSheet 单元格提示或选择框
*
* @param sheet 表单
* @param textlist 下拉框显示的内容
* @param promptContent 提示内容
* @param firstRow 开始行
* @param endRow 结束行
* @param firstCol 开始列
* @param endCol 结束列
*/
public
void
setPromptOrValidation
(
Sheet
sheet
,
String
[]
textlist
,
String
promptContent
,
int
firstRow
,
int
endRow
,
int
firstCol
,
int
endCol
)
{
DataValidationHelper
helper
=
sheet
.
getDataValidationHelper
();
DataValidationConstraint
constraint
=
textlist
.
length
>
0
?
helper
.
createExplicitListConstraint
(
textlist
)
:
helper
.
createCustomConstraint
(
"DD1"
);
CellRangeAddressList
regions
=
new
CellRangeAddressList
(
firstRow
,
endRow
,
firstCol
,
endCol
);
DataValidation
dataValidation
=
helper
.
createValidation
(
constraint
,
regions
);
if
(
StringUtils
.
isNotEmpty
(
promptContent
))
{
// 如果设置了提示信息则鼠标放上去提示
dataValidation
.
createPromptBox
(
""
,
promptContent
);
dataValidation
.
setShowPromptBox
(
true
);
}
// 处理Excel兼容性问题
if
(
dataValidation
instanceof
XSSFDataValidation
)
{
dataValidation
.
setSuppressDropDownArrow
(
true
);
dataValidation
.
setShowErrorBox
(
true
);
}
else
{
dataValidation
.
setSuppressDropDownArrow
(
false
);
}
sheet
.
addValidationData
(
dataValidation
);
}
/**
* 设置某些列的值只能输入预制的数据,显示下拉框(兼容超出一定数量的下拉框).
*
* @param sheet 要设置的sheet.
* @param textlist 下拉框显示的内容
* @param promptContent 提示内容
* @param firstRow 开始行
* @param endRow 结束行
* @param firstCol 开始列
* @param endCol 结束列
*/
public
void
setXSSFValidationWithHidden
(
Sheet
sheet
,
String
[]
textlist
,
String
promptContent
,
int
firstRow
,
int
endRow
,
int
firstCol
,
int
endCol
)
{
String
hideSheetName
=
"combo_"
+
firstCol
+
"_"
+
endCol
;
Sheet
hideSheet
=
wb
.
createSheet
(
hideSheetName
);
// 用于存储 下拉菜单数据
for
(
int
i
=
0
;
i
<
textlist
.
length
;
i
++)
{
hideSheet
.
createRow
(
i
).
createCell
(
0
).
setCellValue
(
textlist
[
i
]);
}
// 创建名称,可被其他单元格引用
Name
name
=
wb
.
createName
();
name
.
setNameName
(
hideSheetName
+
"_data"
);
name
.
setRefersToFormula
(
hideSheetName
+
"!$A$1:$A$"
+
textlist
.
length
);
DataValidationHelper
helper
=
sheet
.
getDataValidationHelper
();
// 加载下拉列表内容
DataValidationConstraint
constraint
=
helper
.
createFormulaListConstraint
(
hideSheetName
+
"_data"
);
// 设置数据有效性加载在哪个单元格上,四个参数分别是:起始行、终止行、起始列、终止列
CellRangeAddressList
regions
=
new
CellRangeAddressList
(
firstRow
,
endRow
,
firstCol
,
endCol
);
// 数据有效性对象
DataValidation
dataValidation
=
helper
.
createValidation
(
constraint
,
regions
);
if
(
StringUtils
.
isNotEmpty
(
promptContent
))
{
// 如果设置了提示信息则鼠标放上去提示
dataValidation
.
createPromptBox
(
""
,
promptContent
);
dataValidation
.
setShowPromptBox
(
true
);
}
// 处理Excel兼容性问题
if
(
dataValidation
instanceof
XSSFDataValidation
)
{
dataValidation
.
setSuppressDropDownArrow
(
true
);
dataValidation
.
setShowErrorBox
(
true
);
}
else
{
dataValidation
.
setSuppressDropDownArrow
(
false
);
}
sheet
.
addValidationData
(
dataValidation
);
// 设置hiddenSheet隐藏
wb
.
setSheetHidden
(
wb
.
getSheetIndex
(
hideSheet
),
true
);
}
/**
* 解析导出值 0=男,1=女,2=未知
*
* @param propertyValue 参数值
* @param converterExp 翻译注解
* @param separator 分隔符
* @return 解析后值
*/
public
static
String
convertByExp
(
String
propertyValue
,
String
converterExp
,
String
separator
)
{
StringBuilder
propertyString
=
new
StringBuilder
();
String
[]
convertSource
=
converterExp
.
split
(
","
);
for
(
String
item
:
convertSource
)
{
String
[]
itemArray
=
item
.
split
(
"="
);
if
(
StringUtils
.
containsAny
(
propertyValue
,
separator
))
{
for
(
String
value
:
propertyValue
.
split
(
separator
))
{
if
(
itemArray
[
0
].
equals
(
value
))
{
propertyString
.
append
(
itemArray
[
1
]
+
separator
);
break
;
}
}
}
else
{
if
(
itemArray
[
0
].
equals
(
propertyValue
))
{
return
itemArray
[
1
];
}
}
}
return
StringUtils
.
stripEnd
(
propertyString
.
toString
(),
separator
);
}
/**
* 反向解析值 男=0,女=1,未知=2
*
* @param propertyValue 参数值
* @param converterExp 翻译注解
* @param separator 分隔符
* @return 解析后值
*/
public
static
String
reverseByExp
(
String
propertyValue
,
String
converterExp
,
String
separator
)
{
StringBuilder
propertyString
=
new
StringBuilder
();
String
[]
convertSource
=
converterExp
.
split
(
","
);
for
(
String
item
:
convertSource
)
{
String
[]
itemArray
=
item
.
split
(
"="
);
if
(
StringUtils
.
containsAny
(
propertyValue
,
separator
))
{
for
(
String
value
:
propertyValue
.
split
(
separator
))
{
if
(
itemArray
[
1
].
equals
(
value
))
{
propertyString
.
append
(
itemArray
[
0
]
+
separator
);
break
;
}
}
}
else
{
if
(
itemArray
[
1
].
equals
(
propertyValue
))
{
return
itemArray
[
0
];
}
}
}
return
StringUtils
.
stripEnd
(
propertyString
.
toString
(),
separator
);
}
/**
* 解析字典值
*
* @param dictValue 字典值
* @param dictType 字典类型
* @param separator 分隔符
* @return 字典标签
*/
public
static
String
convertDictByExp
(
String
dictValue
,
String
dictType
,
String
separator
)
{
return
DictUtils
.
getDictLabel
(
dictType
,
dictValue
,
separator
);
}
/**
* 反向解析值字典值
*
* @param dictLabel 字典标签
* @param dictType 字典类型
* @param separator 分隔符
* @return 字典值
*/
public
static
String
reverseDictByExp
(
String
dictLabel
,
String
dictType
,
String
separator
)
{
return
DictUtils
.
getDictValue
(
dictType
,
dictLabel
,
separator
);
}
/**
* 数据处理器
*
* @param value 数据值
* @param excel 数据注解
* @return
*/
public
String
dataFormatHandlerAdapter
(
Object
value
,
Excel
excel
)
{
try
{
Object
instance
=
excel
.
handler
().
newInstance
();
Method
formatMethod
=
excel
.
handler
().
getMethod
(
"format"
,
new
Class
[]{
Object
.
class
,
String
[].
class
});
value
=
formatMethod
.
invoke
(
instance
,
value
,
excel
.
args
());
}
catch
(
Exception
e
)
{
log
.
error
(
"不能格式化数据 "
+
excel
.
handler
(),
e
.
getMessage
());
}
return
Convert
.
toStr
(
value
);
}
/**
* 合计统计信息
*/
private
void
addStatisticsData
(
Integer
index
,
String
text
,
Excel
entity
)
{
if
(
entity
!=
null
&&
entity
.
isStatistics
())
{
Double
temp
=
0
D
;
if
(!
statistics
.
containsKey
(
index
))
{
statistics
.
put
(
index
,
temp
);
}
try
{
temp
=
Double
.
valueOf
(
text
);
}
catch
(
NumberFormatException
e
)
{
}
statistics
.
put
(
index
,
statistics
.
get
(
index
)
+
temp
);
}
}
/**
* 创建统计行
*/
public
void
addStatisticsRow
()
{
if
(
statistics
.
size
()
>
0
)
{
Row
row
=
sheet
.
createRow
(
sheet
.
getLastRowNum
()
+
1
);
Set
<
Integer
>
keys
=
statistics
.
keySet
();
Cell
cell
=
row
.
createCell
(
0
);
cell
.
setCellStyle
(
styles
.
get
(
"total"
));
cell
.
setCellValue
(
"合计"
);
for
(
Integer
key
:
keys
)
{
cell
=
row
.
createCell
(
key
);
cell
.
setCellStyle
(
styles
.
get
(
"total"
));
cell
.
setCellValue
(
DOUBLE_FORMAT
.
format
(
statistics
.
get
(
key
)));
}
statistics
.
clear
();
}
}
/**
* 编码文件名
*/
public
String
encodingFilename
(
String
filename
)
{
filename
=
UUID
.
randomUUID
()
+
"_"
+
filename
+
".xlsx"
;
return
filename
;
}
/**
* 获取下载路径
*
* @param filename 文件名称
*/
public
String
getAbsoluteFile
(
String
filename
)
{
String
downloadPath
=
FileUploadUtils
.
getDefaultBaseDir
().
concat
(
"/download/"
).
concat
(
filename
);
File
desc
=
new
File
(
downloadPath
);
if
(!
desc
.
getParentFile
().
exists
())
{
desc
.
getParentFile
().
mkdirs
();
}
return
downloadPath
;
}
/**
* 获取bean中的属性值
*
* @param vo 实体对象
* @param field 字段
* @param excel 注解
* @return 最终的属性值
* @throws Exception
*/
private
Object
getTargetValue
(
T
vo
,
Field
field
,
Excel
excel
)
throws
Exception
{
Object
o
=
field
.
get
(
vo
);
if
(
StringUtils
.
isNotEmpty
(
excel
.
targetAttr
()))
{
String
target
=
excel
.
targetAttr
();
if
(
target
.
contains
(
"."
))
{
String
[]
targets
=
target
.
split
(
"[.]"
);
for
(
String
name
:
targets
)
{
o
=
getValue
(
o
,
name
);
}
}
else
{
o
=
getValue
(
o
,
target
);
}
}
return
o
;
}
/**
* 以类的属性的get方法方法形式获取值
*
* @param o
* @param name
* @return value
* @throws Exception
*/
private
Object
getValue
(
Object
o
,
String
name
)
throws
Exception
{
if
(!
ObjectUtils
.
isEmpty
(
o
)
&&
StringUtils
.
isNotEmpty
(
name
))
{
Class
<?>
clazz
=
o
.
getClass
();
Field
field
=
clazz
.
getDeclaredField
(
name
);
field
.
setAccessible
(
true
);
o
=
field
.
get
(
o
);
}
return
o
;
}
/**
* 得到所有定义字段
*/
private
void
createExcelField
()
{
this
.
fields
=
getFields
();
this
.
fields
=
this
.
fields
.
stream
().
sorted
(
Comparator
.
comparing
(
objects
->
((
Excel
)
objects
[
1
]).
sort
())).
collect
(
Collectors
.
toList
());
this
.
maxHeight
=
getRowHeight
();
}
/**
* 获取字段注解信息
*/
public
List
<
Object
[]>
getFields
()
{
List
<
Object
[]>
fields
=
new
ArrayList
<
Object
[]>();
List
<
Field
>
tempFields
=
new
ArrayList
<>();
tempFields
.
addAll
(
Arrays
.
asList
(
clazz
.
getSuperclass
().
getDeclaredFields
()));
tempFields
.
addAll
(
Arrays
.
asList
(
clazz
.
getDeclaredFields
()));
for
(
Field
field
:
tempFields
)
{
if
(!
ArrayUtils
.
contains
(
this
.
excludeFields
,
field
.
getName
()))
{
// 单注解
if
(
field
.
isAnnotationPresent
(
Excel
.
class
))
{
Excel
attr
=
field
.
getAnnotation
(
Excel
.
class
);
if
(
attr
!=
null
&&
(
attr
.
type
()
==
Excel
.
Type
.
ALL
||
attr
.
type
()
==
type
))
{
field
.
setAccessible
(
true
);
fields
.
add
(
new
Object
[]{
field
,
attr
});
}
if
(
Collection
.
class
.
isAssignableFrom
(
field
.
getType
()))
{
subMethod
=
getSubMethod
(
field
.
getName
(),
clazz
);
ParameterizedType
pt
=
(
ParameterizedType
)
field
.
getGenericType
();
Class
<?>
subClass
=
(
Class
<?>)
pt
.
getActualTypeArguments
()[
0
];
this
.
subFields
=
FieldUtils
.
getFieldsListWithAnnotation
(
subClass
,
Excel
.
class
);
}
}
// // 多注解
// if (field.isAnnotationPresent(Excels.class)) {
// Excels attrs = field.getAnnotation(Excels.class);
// Excel[] excels = attrs.value();
// for (Excel attr : excels) {
// if (!ArrayUtils.contains(this.excludeFields, field.getName() + "." + attr.targetAttr())
// && (attr != null && (attr.type() == Excel.Type.ALL || attr.type() == type))) {
// field.setAccessible(true);
// fields.add(new Object[]{field, attr});
// }
// }
// }
}
}
return
fields
;
}
/**
* 根据注解获取最大行高
*/
public
short
getRowHeight
()
{
double
maxHeight
=
0
;
for
(
Object
[]
os
:
this
.
fields
)
{
Excel
excel
=
(
Excel
)
os
[
1
];
maxHeight
=
Math
.
max
(
maxHeight
,
excel
.
height
());
}
return
(
short
)
(
maxHeight
*
20
);
}
/**
* 创建一个工作簿
*/
public
void
createWorkbook
()
{
this
.
wb
=
new
SXSSFWorkbook
(
500
);
this
.
sheet
=
wb
.
createSheet
();
wb
.
setSheetName
(
0
,
sheetName
);
this
.
styles
=
createStyles
(
wb
);
}
/**
* 创建工作表
*
* @param sheetNo sheet数量
* @param index 序号
*/
public
void
createSheet
(
int
sheetNo
,
int
index
)
{
// 设置工作表的名称.
if
(
sheetNo
>
1
&&
index
>
0
)
{
this
.
sheet
=
wb
.
createSheet
();
this
.
createTitle
();
wb
.
setSheetName
(
index
,
sheetName
+
index
);
}
}
/**
* 获取单元格值
*
* @param row 获取的行
* @param column 获取单元格列号
* @return 单元格值
*/
public
Object
getCellValue
(
Row
row
,
int
column
)
{
if
(
row
==
null
)
{
return
row
;
}
Object
val
=
""
;
try
{
Cell
cell
=
row
.
getCell
(
column
);
if
(!
ObjectUtils
.
isEmpty
(
cell
))
{
if
(
cell
.
getCellType
()
==
CellType
.
NUMERIC
||
cell
.
getCellType
()
==
CellType
.
FORMULA
)
{
val
=
cell
.
getNumericCellValue
();
if
(
DateUtil
.
isCellDateFormatted
(
cell
))
{
val
=
DateUtil
.
getJavaDate
((
Double
)
val
);
// POI Excel 日期格式转换
}
else
{
if
((
Double
)
val
%
1
!=
0
)
{
val
=
new
BigDecimal
(
val
.
toString
());
}
else
{
val
=
new
DecimalFormat
(
"0"
).
format
(
val
);
}
}
}
else
if
(
cell
.
getCellType
()
==
CellType
.
STRING
)
{
val
=
cell
.
getStringCellValue
();
}
else
if
(
cell
.
getCellType
()
==
CellType
.
BOOLEAN
)
{
val
=
cell
.
getBooleanCellValue
();
}
else
if
(
cell
.
getCellType
()
==
CellType
.
ERROR
)
{
val
=
cell
.
getErrorCellValue
();
}
}
}
catch
(
Exception
e
)
{
return
val
;
}
return
val
;
}
/**
* 判断是否是空行
*
* @param row 判断的行
* @return
*/
private
boolean
isRowEmpty
(
Row
row
)
{
if
(
row
==
null
)
{
return
true
;
}
for
(
int
i
=
row
.
getFirstCellNum
();
i
<
row
.
getLastCellNum
();
i
++)
{
Cell
cell
=
row
.
getCell
(
i
);
if
(
cell
!=
null
&&
cell
.
getCellType
()
!=
CellType
.
BLANK
)
{
return
false
;
}
}
return
true
;
}
/**
* 获取Excel2003图片
*
* @param sheet 当前sheet对象
* @param workbook 工作簿对象
* @return Map key:图片单元格索引(1_1)String,value:图片流PictureData
*/
public
static
Map
<
String
,
PictureData
>
getSheetPictures03
(
HSSFSheet
sheet
,
HSSFWorkbook
workbook
)
{
Map
<
String
,
PictureData
>
sheetIndexPicMap
=
new
HashMap
<
String
,
PictureData
>();
List
<
HSSFPictureData
>
pictures
=
workbook
.
getAllPictures
();
if
(!
pictures
.
isEmpty
())
{
for
(
HSSFShape
shape
:
sheet
.
getDrawingPatriarch
().
getChildren
())
{
HSSFClientAnchor
anchor
=
(
HSSFClientAnchor
)
shape
.
getAnchor
();
if
(
shape
instanceof
HSSFPicture
)
{
HSSFPicture
pic
=
(
HSSFPicture
)
shape
;
int
pictureIndex
=
pic
.
getPictureIndex
()
-
1
;
HSSFPictureData
picData
=
pictures
.
get
(
pictureIndex
);
String
picIndex
=
anchor
.
getRow1
()
+
"_"
+
anchor
.
getCol1
();
sheetIndexPicMap
.
put
(
picIndex
,
picData
);
}
}
return
sheetIndexPicMap
;
}
else
{
return
sheetIndexPicMap
;
}
}
/**
* 获取Excel2007图片
*
* @param sheet 当前sheet对象
* @param workbook 工作簿对象
* @return Map key:图片单元格索引(1_1)String,value:图片流PictureData
*/
public
static
Map
<
String
,
PictureData
>
getSheetPictures07
(
XSSFSheet
sheet
,
XSSFWorkbook
workbook
)
{
Map
<
String
,
PictureData
>
sheetIndexPicMap
=
new
HashMap
<
String
,
PictureData
>();
for
(
POIXMLDocumentPart
dr
:
sheet
.
getRelations
())
{
if
(
dr
instanceof
XSSFDrawing
)
{
XSSFDrawing
drawing
=
(
XSSFDrawing
)
dr
;
List
<
XSSFShape
>
shapes
=
drawing
.
getShapes
();
for
(
XSSFShape
shape
:
shapes
)
{
if
(
shape
instanceof
XSSFPicture
)
{
XSSFPicture
pic
=
(
XSSFPicture
)
shape
;
XSSFClientAnchor
anchor
=
pic
.
getPreferredSize
();
CTMarker
ctMarker
=
anchor
.
getFrom
();
String
picIndex
=
ctMarker
.
getRow
()
+
"_"
+
ctMarker
.
getCol
();
sheetIndexPicMap
.
put
(
picIndex
,
pic
.
getPictureData
());
}
}
}
}
return
sheetIndexPicMap
;
}
/**
* 格式化不同类型的日期对象
*
* @param dateFormat 日期格式
* @param val 被格式化的日期对象
* @return 格式化后的日期字符
*/
public
String
parseDateToStr
(
String
dateFormat
,
Object
val
)
{
if
(
val
==
null
)
{
return
""
;
}
String
str
;
if
(
val
instanceof
Date
)
{
str
=
DateUtils
.
parseDateToStr
(
dateFormat
,
(
Date
)
val
);
}
else
if
(
val
instanceof
LocalDateTime
)
{
str
=
DateUtils
.
parseDateToStr
(
dateFormat
,
DateUtils
.
toDate
((
LocalDateTime
)
val
));
}
else
if
(
val
instanceof
LocalDate
)
{
str
=
DateUtils
.
parseDateToStr
(
dateFormat
,
DateUtils
.
toDate
((
LocalDate
)
val
));
}
else
{
str
=
val
.
toString
();
}
return
str
;
}
/**
* 是否有对象的子列表
*/
public
boolean
isSubList
()
{
return
!
ObjectUtils
.
isEmpty
(
subFields
)
&&
subFields
.
size
()
>
0
;
}
/**
* 是否有对象的子列表,集合不为空
*/
public
boolean
isSubListValue
(
T
vo
)
{
return
!
ObjectUtils
.
isEmpty
(
subFields
)
&&
subFields
.
size
()
>
0
&&
!
ObjectUtils
.
isEmpty
(
getListCellValue
(
vo
))
&&
getListCellValue
(
vo
).
size
()
>
0
;
}
/**
* 获取集合的值
*/
public
Collection
<?>
getListCellValue
(
Object
obj
)
{
Object
value
;
try
{
value
=
subMethod
.
invoke
(
obj
,
new
Object
[]{});
}
catch
(
Exception
e
)
{
return
new
ArrayList
<
Object
>();
}
return
(
Collection
<?>)
value
;
}
/**
* 获取对象的子列表方法
*
* @param name 名称
* @param pojoClass 类对象
* @return 子列表方法
*/
public
Method
getSubMethod
(
String
name
,
Class
<?>
pojoClass
)
{
StringBuffer
getMethodName
=
new
StringBuffer
(
"get"
);
getMethodName
.
append
(
name
.
substring
(
0
,
1
).
toUpperCase
());
getMethodName
.
append
(
name
.
substring
(
1
));
Method
method
=
null
;
try
{
method
=
pojoClass
.
getMethod
(
getMethodName
.
toString
(),
new
Class
[]{});
}
catch
(
Exception
e
)
{
log
.
error
(
"获取对象异常{}"
,
e
.
getMessage
());
}
return
method
;
}
}
dsk-module/dsk-biz-api/src/main/java/com/dsk/jsk/controller/JskCombineInfoController.java
0 → 100644
View file @
e7ac6f01
package
com
.
dsk
.
jsk
.
controller
;
import
cn.dev33.satoken.annotation.SaCheckPermission
;
import
com.dsk.biz.utils.ExcelUtils
;
import
com.dsk.common.core.controller.BaseController
;
import
com.dsk.common.core.domain.AjaxResult
;
import
com.dsk.common.core.domain.R
;
import
com.dsk.common.core.page.TableDataInfo
;
import
com.dsk.jsk.domain.JskCombineBidPageDto
;
import
com.dsk.jsk.domain.JskCombineCertificateDto
;
import
com.dsk.jsk.domain.JskCombineSearchDto
;
import
com.dsk.jsk.domain.vo.JskCombineBidProjectExportVo
;
import
com.dsk.jsk.domain.vo.JskCombineWinBidProjectExportVo
;
import
com.dsk.jsk.service.JskCombineInfoService
;
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
;
import
java.util.List
;
import
java.util.Map
;
/**
* 集团户相关信息
*
* @author lcl
* @create 2023/8/7
*/
@Slf4j
@RestController
@RequestMapping
(
value
=
"/combine/info"
)
public
class
JskCombineInfoController
extends
BaseController
{
@Autowired
private
JskCombineInfoService
baseService
;
/**
* 集团成员列表
*/
@PostMapping
(
"/memberList"
)
public
TableDataInfo
memberList
(
@RequestBody
JskCombineSearchDto
dto
)
throws
Exception
{
return
baseService
.
memberList
(
dto
);
}
/**
* 分组成员数量
*/
@PostMapping
(
"/group/memberCount"
)
public
R
groupMemberCount
(
@RequestBody
JskCombineSearchDto
dto
)
{
return
baseService
.
groupMemberCount
(
dto
);
}
/**
* 集团业绩列表
*/
@PostMapping
(
"/businessList"
)
public
TableDataInfo
businessList
(
@RequestBody
JskCombineSearchDto
dto
)
throws
Exception
{
return
baseService
.
businessList
(
dto
);
}
/**
* 集团资质列表
*/
@PostMapping
(
"/certificateList"
)
public
TableDataInfo
certificateList
(
@RequestBody
JskCombineSearchDto
dto
)
throws
Exception
{
return
baseService
.
certificateList
(
dto
);
}
/**
* 集团成员资质列表
*/
@PostMapping
(
"/member/certificateList"
)
public
TableDataInfo
menberCertificateList
(
@RequestBody
JskCombineCertificateDto
dto
)
throws
Exception
{
return
baseService
.
menberCertificateList
(
dto
);
}
/**
* 集团资质分组统计
*/
@PostMapping
(
"/group/certificateCount"
)
public
R
groupCertificateCount
(
@RequestBody
JskCombineSearchDto
dto
)
throws
Exception
{
return
baseService
.
groupCertificateCount
(
dto
);
}
/**
* 集团户搜索
*/
@PostMapping
(
"/index"
)
public
AjaxResult
index
(
@RequestBody
Map
<
String
,
Object
>
object
)
{
return
baseService
.
index
(
object
);
}
/**
* 查央企
*/
@PostMapping
(
"/centralEnterprse"
)
public
AjaxResult
centralEnterprse
()
{
return
baseService
.
centralEnterprse
();
}
/**
* 查央企子公司
*/
@PostMapping
(
"/centralEnterprse/child"
)
public
AjaxResult
centralEnterprseChild
()
{
return
baseService
.
centralEnterprseChild
();
}
/**
* 查央企子公司 翻页
*/
@PostMapping
(
"/centralEnterprse/child/page"
)
public
AjaxResult
centralEnterprseChildPage
(
@RequestBody
Map
<
String
,
Object
>
object
)
{
return
baseService
.
centralEnterprseChildPage
(
object
);
}
/**
* 查地方国企
*/
@PostMapping
(
"/centralEnterprse/local"
)
public
AjaxResult
centralEnterprseLocal
(
@RequestBody
Map
<
String
,
Object
>
object
)
{
return
baseService
.
centralEnterprseLocal
(
object
);
}
/**
* 查地方国企 翻页
*/
@PostMapping
(
"/centralEnterprse/local/page"
)
public
AjaxResult
centralEnterprseLocalPage
(
@RequestBody
Map
<
String
,
Object
>
object
)
{
return
baseService
.
centralEnterprseLocalPage
(
object
);
}
/**
* 民营企业
*/
@PostMapping
(
"/centralEnterprse/social"
)
public
AjaxResult
centralEnterprseSocial
()
{
return
baseService
.
centralEnterprseSocial
();
}
/**
* 民营企业 翻页
*/
@PostMapping
(
"/centralEnterprse/social/page"
)
public
AjaxResult
centralEnterprseSocialPage
(
@RequestBody
Map
<
String
,
Object
>
object
)
{
return
baseService
.
centralEnterprseSocialPage
(
object
);
}
/**
* 导出中标业绩
*/
@PostMapping
(
"/export/win/bid"
)
@SaCheckPermission
(
"combine:info:export:win:bid"
)
public
void
exportWinBid
(
@RequestBody
JskCombineSearchDto
dto
,
HttpServletResponse
response
)
{
List
<
JskCombineWinBidProjectExportVo
>
list
=
baseService
.
exportWinBid
(
dto
);
ExcelUtils
<
JskCombineWinBidProjectExportVo
>
util
=
new
ExcelUtils
<>(
JskCombineWinBidProjectExportVo
.
class
);
util
.
exportExcel
(
response
,
list
,
"集团中标"
,
dto
.
getCombineName
().
concat
(
"中标业绩清单"
),
true
);
// String fileName = util.localInit(list, "集团中标", dto.getCombineName().concat("中标业绩清单"), true);
}
/**
* 导出招标业绩
*/
@PostMapping
(
"/export/bid"
)
@SaCheckPermission
(
"combine:info:export:bid"
)
public
void
exportBid
(
@RequestBody
JskCombineBidPageDto
dto
,
HttpServletResponse
response
)
{
List
<
JskCombineBidProjectExportVo
>
list
=
baseService
.
exportBid
(
dto
);
ExcelUtils
<
JskCombineBidProjectExportVo
>
util
=
new
ExcelUtils
<>(
JskCombineBidProjectExportVo
.
class
);
util
.
exportExcel
(
response
,
list
,
"集团招标"
,
dto
.
getCombineName
().
concat
(
"招标公告清单"
),
true
);
}
/**
* 集团招标分页列表
*/
@PostMapping
(
"/bidPage"
)
public
TableDataInfo
bidPage
(
@RequestBody
JskCombineBidPageDto
dto
)
throws
Exception
{
return
baseService
.
bidPage
(
dto
);
}
}
dsk-module/dsk-biz-api/src/main/java/com/dsk/jsk/domain/vo/JskCombineBidProjectExportVo.java
0 → 100644
View file @
e7ac6f01
package
com
.
dsk
.
jsk
.
domain
.
vo
;
import
com.dsk.common.annotation.Excel
;
import
lombok.Data
;
import
java.io.Serializable
;
import
java.util.Date
;
/**
* 集团中标业绩
* @author lcl
* @create 2023/8/28
*/
@Data
public
class
JskCombineBidProjectExportVo
implements
Serializable
{
@Excel
(
name
=
"序号"
,
width
=
6
)
private
Integer
id
;
@Excel
(
name
=
"招标发布时间"
,
width
=
15
,
dateFormat
=
"yyyy/MM/dd"
)
private
Date
issueTime
;
@Excel
(
name
=
"招标成员"
,
width
=
30
)
private
String
tenderee
;
@Excel
(
name
=
"持股比例"
,
suffix
=
"%"
,
width
=
15
)
private
Double
stockPercent
;
@Excel
(
name
=
"成员等级"
,
width
=
15
)
private
String
memberLevel
;
@Excel
(
name
=
"项目名称"
,
width
=
50
)
private
String
projectName
;
@Excel
(
name
=
"预算金额"
,
suffix
=
"万元"
)
private
Double
bidAmount
;
@Excel
(
name
=
"项目地区"
,
width
=
20
)
private
String
address
;
@Excel
(
name
=
"招标采购分类"
,
width
=
15
)
private
String
subjectMatter
;
@Excel
(
name
=
"项目类型"
,
width
=
15
)
private
String
projectType
;
@Excel
(
name
=
"代理单位"
,
width
=
30
)
private
String
agency
;
}
dsk-module/dsk-biz-api/src/main/java/com/dsk/jsk/domain/vo/JskCombineWinBidProjectExportVo.java
0 → 100644
View file @
e7ac6f01
package
com
.
dsk
.
jsk
.
domain
.
vo
;
import
com.dsk.common.annotation.Excel
;
import
lombok.Data
;
import
java.io.Serializable
;
import
java.util.Date
;
/**
* 集团中标业绩
* @author lcl
* @create 2023/8/28
*/
@Data
public
class
JskCombineWinBidProjectExportVo
implements
Serializable
{
@Excel
(
name
=
"序号"
,
width
=
6
)
private
Integer
id
;
@Excel
(
name
=
"中标时间"
,
width
=
15
,
dateFormat
=
"yyyy/MM/dd"
)
private
Date
bidTime
;
@Excel
(
name
=
"成员名称"
,
width
=
30
)
private
String
companyName
;
@Excel
(
name
=
"持股比例"
,
suffix
=
"%"
,
width
=
15
)
private
Double
stockPercent
;
@Excel
(
name
=
"成员等级"
,
width
=
15
)
private
String
memberLevel
;
@Excel
(
name
=
"项目名称"
,
width
=
50
)
private
String
projectName
;
@Excel
(
name
=
"中标金额"
,
suffix
=
"万元"
)
private
Double
bidAmount
;
@Excel
(
name
=
"中标地区"
,
width
=
20
)
private
String
address
;
@Excel
(
name
=
"业绩类型"
,
width
=
15
)
private
String
boundType
;
@Excel
(
name
=
"项目类型"
,
width
=
15
)
private
String
projectType
;
@Excel
(
name
=
"业主单位"
,
width
=
30
)
private
String
projectUnit
;
}
dsk-module/dsk-biz-api/src/main/java/com/dsk/jsk/service/JskCombineInfoService.java
0 → 100644
View file @
e7ac6f01
package
com
.
dsk
.
jsk
.
service
;
import
cn.hutool.core.bean.BeanUtil
;
import
cn.hutool.core.map.MapUtil
;
import
cn.hutool.core.util.ObjectUtil
;
import
com.dsk.common.core.domain.AjaxResult
;
import
com.dsk.common.core.domain.R
;
import
com.dsk.common.core.page.TableDataInfo
;
import
com.dsk.common.exception.ServiceException
;
import
com.dsk.common.utils.DskOpenApiUtil
;
import
com.dsk.jsk.domain.JskCombineBidPageDto
;
import
com.dsk.jsk.domain.JskCombineCertificateDto
;
import
com.dsk.jsk.domain.JskCombineSearchDto
;
import
com.dsk.jsk.domain.vo.JskCombineBidProjectExportVo
;
import
com.dsk.jsk.domain.vo.JskCombineWinBidProjectExportVo
;
import
lombok.extern.slf4j.Slf4j
;
import
org.apache.commons.collections4.MapUtils
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.stereotype.Service
;
import
org.springframework.util.ObjectUtils
;
import
java.util.ArrayList
;
import
java.util.List
;
import
java.util.Map
;
/**
* @author lcl
* @create 2023/8/7
*/
@Slf4j
@Service
public
class
JskCombineInfoService
{
@Autowired
private
DskOpenApiUtil
dskOpenApiUtil
;
@Autowired
private
EnterpriseService
enterpriseService
;
public
TableDataInfo
memberList
(
JskCombineSearchDto
dto
)
throws
Exception
{
Map
<
String
,
Object
>
map
=
dskOpenApiUtil
.
requestBody
(
"/operate/combine/memberList"
,
BeanUtil
.
beanToMap
(
dto
,
false
,
false
));
return
dskOpenApiUtil
.
responsePage
(
map
);
}
public
R
groupMemberCount
(
JskCombineSearchDto
dto
)
{
Map
<
String
,
Object
>
map
=
dskOpenApiUtil
.
requestBody
(
"/operate/combine/group/memberCount"
,
BeanUtil
.
beanToMap
(
dto
,
false
,
false
));
return
BeanUtil
.
toBean
(
map
,
R
.
class
);
}
public
TableDataInfo
businessList
(
JskCombineSearchDto
dto
)
throws
Exception
{
Map
<
String
,
Object
>
map
=
dskOpenApiUtil
.
requestBody
(
"/nationzj/project/combine/projectList"
,
BeanUtil
.
beanToMap
(
dto
,
false
,
false
));
if
(!
ObjectUtils
.
isEmpty
(
map
.
get
(
"data"
)))
{
Map
<
String
,
Object
>
data
=
BeanUtil
.
beanToMap
(
map
.
get
(
"data"
));
if
(!
ObjectUtils
.
isEmpty
(
data
.
get
(
"list"
)))
{
List
<
Map
<
String
,
Object
>>
list
=
(
List
<
Map
<
String
,
Object
>>)
data
.
get
(
"list"
);
list
.
parallelStream
().
forEach
(
res
->
{
Integer
companyId
=
MapUtils
.
getInteger
(
res
,
"companyId"
);
String
companyName
=
MapUtils
.
getString
(
res
,
"companyName"
);
res
.
put
(
"uipId"
,
enterpriseService
.
getUipIdByCompanyNameOrCompanyId
(
companyName
,
companyId
));
Integer
projectUnitId
=
MapUtils
.
getInteger
(
res
,
"projectUnitId"
);
String
projectUnit
=
MapUtils
.
getString
(
res
,
"projectUnit"
);
res
.
put
(
"projectUnitUipId"
,
enterpriseService
.
getUipIdByCompanyNameOrCompanyId
(
projectUnit
,
projectUnitId
));
});
}
}
return
dskOpenApiUtil
.
responsePage
(
map
);
}
public
TableDataInfo
certificateList
(
JskCombineSearchDto
dto
)
throws
Exception
{
Map
<
String
,
Object
>
map
=
dskOpenApiUtil
.
requestBody
(
"/operate/combine/certificateList"
,
BeanUtil
.
beanToMap
(
dto
,
false
,
false
));
return
dskOpenApiUtil
.
responsePage
(
map
);
}
public
TableDataInfo
menberCertificateList
(
JskCombineCertificateDto
dto
)
throws
Exception
{
Map
<
String
,
Object
>
map
=
dskOpenApiUtil
.
requestBody
(
"/operate/combine/member/certificateList"
,
BeanUtil
.
beanToMap
(
dto
,
false
,
false
));
return
dskOpenApiUtil
.
responsePage
(
map
);
}
public
R
groupCertificateCount
(
JskCombineSearchDto
dto
)
{
Map
<
String
,
Object
>
map
=
dskOpenApiUtil
.
requestBody
(
"/operate/combine/group/certificateCount"
,
BeanUtil
.
beanToMap
(
dto
,
false
,
false
));
return
BeanUtil
.
toBean
(
map
,
R
.
class
);
}
public
AjaxResult
index
(
Map
<
String
,
Object
>
object
)
{
Map
<
String
,
Object
>
map
=
dskOpenApiUtil
.
requestBody
(
"/nationzj/enterprice/groupCompany"
,
object
);
return
BeanUtil
.
toBean
(
map
,
AjaxResult
.
class
);
}
public
AjaxResult
centralEnterprse
()
{
Map
<
String
,
Object
>
map
=
dskOpenApiUtil
.
requestBody
(
"/nationzj/enterprice/centralEnterprse"
,
null
);
return
BeanUtil
.
toBean
(
map
,
AjaxResult
.
class
);
}
public
AjaxResult
centralEnterprseChild
()
{
Map
<
String
,
Object
>
map
=
dskOpenApiUtil
.
requestBody
(
"/nationzj/enterprice/centralEnterprse/child"
,
null
);
return
BeanUtil
.
toBean
(
map
,
AjaxResult
.
class
);
}
public
AjaxResult
centralEnterprseChildPage
(
Map
<
String
,
Object
>
object
)
{
Map
<
String
,
Object
>
map
=
dskOpenApiUtil
.
requestBody
(
"/nationzj/enterprice/centralEnterprse/child/page"
,
object
);
return
BeanUtil
.
toBean
(
map
,
AjaxResult
.
class
);
}
public
AjaxResult
centralEnterprseLocal
(
Map
<
String
,
Object
>
object
)
{
Map
<
String
,
Object
>
map
=
dskOpenApiUtil
.
requestBody
(
"/nationzj/enterprice/centralEnterprse/local"
,
object
);
return
BeanUtil
.
toBean
(
map
,
AjaxResult
.
class
);
}
public
AjaxResult
centralEnterprseLocalPage
(
Map
<
String
,
Object
>
object
)
{
Map
<
String
,
Object
>
map
=
dskOpenApiUtil
.
requestBody
(
"/nationzj/enterprice/centralEnterprse/local/page"
,
object
);
return
BeanUtil
.
toBean
(
map
,
AjaxResult
.
class
);
}
public
AjaxResult
centralEnterprseSocial
()
{
Map
<
String
,
Object
>
map
=
dskOpenApiUtil
.
requestBody
(
"/nationzj/enterprice/centralEnterprse/social"
,
null
);
return
BeanUtil
.
toBean
(
map
,
AjaxResult
.
class
);
}
public
AjaxResult
centralEnterprseSocialPage
(
Map
<
String
,
Object
>
object
)
{
Map
<
String
,
Object
>
map
=
dskOpenApiUtil
.
requestBody
(
"/nationzj/enterprice/centralEnterprse/social/page"
,
object
);
return
BeanUtil
.
toBean
(
map
,
AjaxResult
.
class
);
}
public
List
<
JskCombineWinBidProjectExportVo
>
exportWinBid
(
JskCombineSearchDto
dto
)
{
if
(
ObjectUtils
.
isEmpty
(
dto
.
getPageSize
()))
throw
new
ServiceException
(
"导出条数不能为空!"
);
if
(
dto
.
getPageSize
()
>
2000
)
dto
.
setPageSize
(
2000
);
dto
.
setPageNum
(
1
);
Map
<
String
,
Object
>
map
=
dskOpenApiUtil
.
requestBody
(
"/nationzj/project/combine/projectList"
,
BeanUtil
.
beanToMap
(
dto
,
false
,
false
));
if
(
ObjectUtils
.
isEmpty
(
map
.
get
(
"data"
)))
throw
new
ServiceException
(
"导出失败,系统错误!"
);
Map
<
String
,
Object
>
data
=
BeanUtil
.
beanToMap
(
map
.
get
(
"data"
));
if
(
ObjectUtils
.
isEmpty
(
data
.
get
(
"list"
)))
throw
new
ServiceException
(
"导出失败,系统错误!"
);
List
<
Map
<
String
,
Object
>>
list
=
(
List
<
Map
<
String
,
Object
>>)
data
.
get
(
"list"
);
if
(
ObjectUtils
.
isEmpty
(
list
))
throw
new
ServiceException
(
"导出失败,无数据导出!"
);
List
<
JskCombineWinBidProjectExportVo
>
result
=
new
ArrayList
<>();
for
(
int
i
=
0
;
i
<
list
.
size
();
i
++)
{
JskCombineWinBidProjectExportVo
vo
=
new
JskCombineWinBidProjectExportVo
();
vo
.
setId
(
i
+
1
);
vo
.
setBidTime
(
MapUtil
.
getDate
(
list
.
get
(
i
),
"bidTime"
));
vo
.
setCompanyName
(
MapUtil
.
getStr
(
list
.
get
(
i
),
"companyName"
));
vo
.
setStockPercent
(
MapUtil
.
getDouble
(
list
.
get
(
i
),
"stockPercent"
));
vo
.
setMemberLevel
(
MapUtil
.
getStr
(
list
.
get
(
i
),
"memberLevel"
));
vo
.
setProjectName
(
MapUtil
.
getStr
(
list
.
get
(
i
),
"projectName"
));
vo
.
setBidAmount
(
MapUtil
.
getDouble
(
list
.
get
(
i
),
"bidAmount"
));
vo
.
setAddress
(
MapUtil
.
getStr
(
list
.
get
(
i
),
"address"
));
vo
.
setBoundType
(
MapUtil
.
getStr
(
list
.
get
(
i
),
"boundType"
));
vo
.
setProjectType
(
MapUtil
.
getStr
(
list
.
get
(
i
),
"projectType"
));
vo
.
setProjectUnit
(
MapUtil
.
getStr
(
list
.
get
(
i
),
"projectUnit"
));
result
.
add
(
vo
);
}
return
result
;
}
public
List
<
JskCombineBidProjectExportVo
>
exportBid
(
JskCombineBidPageDto
dto
)
{
if
(
ObjectUtils
.
isEmpty
(
dto
.
getPageSize
()))
throw
new
ServiceException
(
"导出条数不能为空!"
);
if
(
dto
.
getPageSize
()
>
2000
)
dto
.
setPageSize
(
2000
);
dto
.
setPageNum
(
1
);
Map
<
String
,
Object
>
map
=
dskOpenApiUtil
.
requestBody
(
"/operate/combine/bidPage"
,
BeanUtil
.
beanToMap
(
dto
,
false
,
false
));
if
(
ObjectUtils
.
isEmpty
(
map
.
get
(
"data"
)))
throw
new
ServiceException
(
"导出失败,系统错误!"
);
Map
<
String
,
Object
>
data
=
BeanUtil
.
beanToMap
(
map
.
get
(
"data"
));
if
(
ObjectUtils
.
isEmpty
(
data
.
get
(
"list"
)))
throw
new
ServiceException
(
"导出失败,系统错误!"
);
List
<
Map
<
String
,
Object
>>
list
=
(
List
<
Map
<
String
,
Object
>>)
data
.
get
(
"list"
);
if
(
ObjectUtils
.
isEmpty
(
list
))
throw
new
ServiceException
(
"导出失败,无数据导出!"
);
List
<
JskCombineBidProjectExportVo
>
result
=
new
ArrayList
<>();
for
(
int
i
=
0
;
i
<
list
.
size
();
i
++)
{
JskCombineBidProjectExportVo
vo
=
new
JskCombineBidProjectExportVo
();
vo
.
setId
(
i
+
1
);
vo
.
setIssueTime
(
MapUtil
.
getDate
(
list
.
get
(
i
),
"issueTime"
));
vo
.
setTenderee
(
MapUtil
.
getStr
(
list
.
get
(
i
),
"tenderee"
));
vo
.
setStockPercent
(
MapUtil
.
getDouble
(
list
.
get
(
i
),
"stockPercent"
));
vo
.
setMemberLevel
(
MapUtil
.
getStr
(
list
.
get
(
i
),
"memberLevel"
));
vo
.
setProjectName
(
MapUtil
.
getStr
(
list
.
get
(
i
),
"projectName"
));
vo
.
setBidAmount
(
MapUtil
.
getDouble
(
list
.
get
(
i
),
"bidAmount"
));
vo
.
setAddress
(
MapUtil
.
getStr
(
list
.
get
(
i
),
"address"
));
vo
.
setSubjectMatter
(
MapUtil
.
getStr
(
list
.
get
(
i
),
"subjectMatter"
));
vo
.
setProjectType
(
MapUtil
.
getStr
(
list
.
get
(
i
),
"projectType"
));
vo
.
setAgency
(
MapUtil
.
getStr
(
list
.
get
(
i
),
"agency"
));
result
.
add
(
vo
);
}
return
result
;
}
public
TableDataInfo
bidPage
(
JskCombineBidPageDto
dto
)
throws
Exception
{
Map
<
String
,
Object
>
map
=
dskOpenApiUtil
.
requestBody
(
"/operate/combine/bidPage"
,
BeanUtil
.
beanToMap
(
dto
,
false
,
false
));
if
(
ObjectUtil
.
isNotEmpty
(
map
.
get
(
"data"
)))
{
Map
<
String
,
Object
>
data
=
BeanUtil
.
beanToMap
(
map
.
get
(
"data"
));
if
(!
ObjectUtils
.
isEmpty
(
data
.
get
(
"list"
)))
{
List
<
Map
<
String
,
Object
>>
list
=
(
List
<
Map
<
String
,
Object
>>)
data
.
get
(
"list"
);
list
.
parallelStream
().
forEach
(
res
->
{
//招标企业
Integer
tendereeId
=
MapUtils
.
getInteger
(
res
,
"tendereeId"
);
String
tenderee
=
MapUtils
.
getString
(
res
,
"tenderee"
);
// 代理机构名称
Integer
agencyId
=
MapUtils
.
getInteger
(
res
,
"agencyId"
);
String
agency
=
MapUtils
.
getString
(
res
,
"agency"
);
res
.
put
(
"tendereeUipId"
,
enterpriseService
.
getUipIdByCompanyNameOrCompanyId
(
tenderee
,
tendereeId
));
res
.
put
(
"agencyUipId"
,
enterpriseService
.
getUipIdByCompanyNameOrCompanyId
(
agency
,
agencyId
));
});
}
}
return
dskOpenApiUtil
.
responsePage
(
map
);
}
}
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment