记得上下班打卡 | git大法好,push需谨慎
Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
L
liquidnet-bus-v1
Project
Project
Details
Activity
Releases
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
董敬伟
liquidnet-bus-v1
Commits
e3c607d8
Commit
e3c607d8
authored
Jun 30, 2026
by
姜秀龙
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
报名活动后台管理
parent
e5d4659b
Changes
13
Show whitespace changes
Inline
Side-by-side
Showing
13 changed files
with
613 additions
and
1 deletion
+613
-1
sweet_form_submission_dict.sql
docs/sweet_form_submission_dict.sql
+17
-0
sweet_form_submission_menu.sql
docs/sweet_form_submission_menu.sql
+24
-0
SweetFormSubmissionActivityListParam.java
...dto/param/admin/SweetFormSubmissionActivityListParam.java
+17
-0
SweetFormSubmissionExportParam.java
...sweet/dto/param/admin/SweetFormSubmissionExportParam.java
+23
-0
CommonController.java
.../client/admin/web/controller/common/CommonController.java
+7
-1
SweetFormSubmissionAdminController.java
...er/zhengzai/sweet/SweetFormSubmissionAdminController.java
+73
-0
list.html
...sources/templates/zhengzai/sweet/formSubmission/list.html
+150
-0
ISweetFormSubmissionAdminService.java
...ngzai/sweet/service/ISweetFormSubmissionAdminService.java
+15
-0
SweetFormSubmissionAdminServiceImpl.java
...eet/service/impl/SweetFormSubmissionAdminServiceImpl.java
+66
-0
SweetFormSubmissionExcelUtils.java
...n/zhengzai/sweet/utils/SweetFormSubmissionExcelUtils.java
+154
-0
SweetFormSubmissionActivityVo.java
...ervice/sweet/dto/admin/SweetFormSubmissionActivityVo.java
+30
-0
SweetFormSubmissionMapper.java
...idnet/service/sweet/mapper/SweetFormSubmissionMapper.java
+9
-0
SweetFormSubmissionMapper.xml
...uidnet.service.sweet.mapper/SweetFormSubmissionMapper.xml
+28
-0
No files found.
docs/sweet_form_submission_dict.sql
0 → 100644
View file @
e3c607d8
-- 动态表单报名活动 - 字典配置
-- dict_value:英文活动标识,与 C 端提交 activityName、库表 sweet_form_submission.activity_name 一致
-- dict_label:后台展示中文名
-- 可按实际活动增删下方字典数据;重复执行不会重复插入(按 dict_type / dict_value 判重)
INSERT
INTO
sys_dict_type
(
dict_name
,
dict_type
,
status
,
create_by
,
create_time
,
remark
)
SELECT
'动态表单报名活动'
,
'sweet_form_activity'
,
'0'
,
'admin'
,
NOW
(),
'动态表单报名活动标识与中文名映射'
WHERE
NOT
EXISTS
(
SELECT
1
FROM
sys_dict_type
WHERE
dict_type
=
'sweet_form_activity'
);
-- 示例字典数据(请按实际活动修改或追加)
INSERT
INTO
sys_dict_data
(
dict_sort
,
dict_label
,
dict_value
,
dict_type
,
css_class
,
list_class
,
is_default
,
status
,
create_by
,
create_time
,
remark
)
SELECT
1
,
'2026春季达人招募'
,
'talent_2026_spring'
,
'sweet_form_activity'
,
NULL
,
NULL
,
'N'
,
'0'
,
'admin'
,
NOW
(),
'示例'
WHERE
NOT
EXISTS
(
SELECT
1
FROM
sys_dict_data
WHERE
dict_type
=
'sweet_form_activity'
AND
dict_value
=
'talent_2026_spring'
);
INSERT
INTO
sys_dict_data
(
dict_sort
,
dict_label
,
dict_value
,
dict_type
,
css_class
,
list_class
,
is_default
,
status
,
create_by
,
create_time
,
remark
)
SELECT
2
,
'音乐节志愿者报名'
,
'music_fest_volunteer'
,
'sweet_form_activity'
,
NULL
,
NULL
,
'N'
,
'0'
,
'admin'
,
NOW
(),
'示例'
WHERE
NOT
EXISTS
(
SELECT
1
FROM
sys_dict_data
WHERE
dict_type
=
'sweet_form_activity'
AND
dict_value
=
'music_fest_volunteer'
);
docs/sweet_form_submission_menu.sql
0 → 100644
View file @
e3c607d8
-- 动态表单报名活动管理 - 菜单与权限
-- 挂载在「正在映画」顶级菜单下(按 menu_name 查询,兼容线上/测试 menu_id 不一致)
SET
@
zhengzaiRootId
=
(
SELECT
menu_id
FROM
sys_menu
WHERE
menu_name
=
'正在映画'
AND
parent_id
=
0
AND
menu_type
=
'M'
LIMIT
1
);
INSERT
INTO
sys_menu
(
menu_name
,
parent_id
,
order_num
,
url
,
target
,
menu_type
,
visible
,
perms
,
icon
,
create_by
,
create_time
,
update_by
,
update_time
,
remark
)
VALUES
(
'报名活动管理'
,
@
zhengzaiRootId
,
10
,
'#'
,
'menuItem'
,
'M'
,
'0'
,
NULL
,
'fa fa-list-alt'
,
'admin'
,
NOW
(),
''
,
NULL
,
'动态表单报名活动管理'
);
SET
@
parentId
=
LAST_INSERT_ID
();
INSERT
INTO
sys_menu
(
menu_name
,
parent_id
,
order_num
,
url
,
target
,
menu_type
,
visible
,
perms
,
icon
,
create_by
,
create_time
,
update_by
,
update_time
,
remark
)
VALUES
(
'活动列表'
,
@
parentId
,
1
,
'/sweet/formSubmission/listView'
,
'menuItem'
,
'C'
,
'0'
,
'sweet:formSubmission:list'
,
'#'
,
'admin'
,
NOW
(),
''
,
NULL
,
'报名活动列表'
);
SET
@
menuId
=
LAST_INSERT_ID
();
INSERT
INTO
sys_menu
(
menu_name
,
parent_id
,
order_num
,
url
,
target
,
menu_type
,
visible
,
perms
,
icon
,
create_by
,
create_time
,
update_by
,
update_time
,
remark
)
VALUES
(
'导出'
,
@
menuId
,
1
,
'#'
,
''
,
'F'
,
'0'
,
'sweet:formSubmission:export'
,
'#'
,
'admin'
,
NOW
(),
''
,
NULL
,
''
);
liquidnet-bus-api/liquidnet-service-sweet-api/src/main/java/com/liquidnet/service/sweet/dto/param/admin/SweetFormSubmissionActivityListParam.java
0 → 100644
View file @
e3c607d8
package
com
.
liquidnet
.
service
.
sweet
.
dto
.
param
.
admin
;
import
io.swagger.annotations.ApiModel
;
import
io.swagger.annotations.ApiModelProperty
;
import
lombok.Data
;
import
java.io.Serializable
;
@Data
@ApiModel
(
value
=
"SweetFormSubmissionActivityListParam"
,
description
=
"动态表单报名活动列表查询"
)
public
class
SweetFormSubmissionActivityListParam
implements
Serializable
{
private
static
final
long
serialVersionUID
=
1L
;
@ApiModelProperty
(
value
=
"活动标识(英文)"
)
private
String
activityName
;
}
liquidnet-bus-api/liquidnet-service-sweet-api/src/main/java/com/liquidnet/service/sweet/dto/param/admin/SweetFormSubmissionExportParam.java
0 → 100644
View file @
e3c607d8
package
com
.
liquidnet
.
service
.
sweet
.
dto
.
param
.
admin
;
import
io.swagger.annotations.ApiModel
;
import
io.swagger.annotations.ApiModelProperty
;
import
lombok.Data
;
import
java.io.Serializable
;
@Data
@ApiModel
(
value
=
"SweetFormSubmissionExportParam"
,
description
=
"动态表单报名导出"
)
public
class
SweetFormSubmissionExportParam
implements
Serializable
{
private
static
final
long
serialVersionUID
=
1L
;
@ApiModelProperty
(
value
=
"活动标识(英文)"
,
required
=
true
)
private
String
activityName
;
@ApiModelProperty
(
value
=
"开始时间 yyyy-MM-dd HH:mm:ss"
)
private
String
beginTime
;
@ApiModelProperty
(
value
=
"结束时间 yyyy-MM-dd HH:mm:ss"
)
private
String
endTime
;
}
liquidnet-bus-client/liquidnet-client-admin/liquidnet-client-admin-web/src/main/java/com/liquidnet/client/admin/web/controller/common/CommonController.java
View file @
e3c607d8
...
@@ -47,7 +47,13 @@ public class CommonController
...
@@ -47,7 +47,13 @@ public class CommonController
{
{
throw
new
Exception
(
StringUtils
.
format
(
"文件名称({})非法,不允许下载。 "
,
fileName
));
throw
new
Exception
(
StringUtils
.
format
(
"文件名称({})非法,不允许下载。 "
,
fileName
));
}
}
String
realFileName
=
System
.
currentTimeMillis
()
+
fileName
.
substring
(
fileName
.
indexOf
(
"_"
)
+
1
);
int
underscoreIndex
=
fileName
.
indexOf
(
"_"
);
String
realFileName
;
if
(
underscoreIndex
>
0
)
{
realFileName
=
System
.
currentTimeMillis
()
+
fileName
.
substring
(
underscoreIndex
+
1
);
}
else
{
realFileName
=
fileName
;
}
String
filePath
=
RuoYiConfig
.
getDownloadPath
()
+
fileName
;
String
filePath
=
RuoYiConfig
.
getDownloadPath
()
+
fileName
;
response
.
setContentType
(
MediaType
.
APPLICATION_OCTET_STREAM_VALUE
);
response
.
setContentType
(
MediaType
.
APPLICATION_OCTET_STREAM_VALUE
);
...
...
liquidnet-bus-client/liquidnet-client-admin/liquidnet-client-admin-web/src/main/java/com/liquidnet/client/admin/web/controller/zhengzai/sweet/SweetFormSubmissionAdminController.java
0 → 100644
View file @
e3c607d8
package
com
.
liquidnet
.
client
.
admin
.
web
.
controller
.
zhengzai
.
sweet
;
import
com.github.pagehelper.PageHelper
;
import
com.liquidnet.client.admin.common.annotation.Log
;
import
com.liquidnet.client.admin.common.core.controller.BaseController
;
import
com.liquidnet.client.admin.common.core.domain.AjaxResult
;
import
com.liquidnet.client.admin.common.core.page.PageDomain
;
import
com.liquidnet.client.admin.common.core.page.TableDataInfo
;
import
com.liquidnet.client.admin.common.core.page.TableSupport
;
import
com.liquidnet.client.admin.common.enums.BusinessType
;
import
com.liquidnet.client.admin.common.utils.StringUtils
;
import
com.liquidnet.client.admin.zhengzai.sweet.service.ISweetFormSubmissionAdminService
;
import
com.liquidnet.service.sweet.dto.param.admin.SweetFormSubmissionActivityListParam
;
import
com.liquidnet.service.sweet.dto.param.admin.SweetFormSubmissionExportParam
;
import
com.liquidnet.service.sweet.dto.admin.SweetFormSubmissionActivityVo
;
import
io.swagger.annotations.Api
;
import
io.swagger.annotations.ApiOperation
;
import
org.apache.shiro.authz.annotation.RequiresPermissions
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.stereotype.Controller
;
import
org.springframework.web.bind.annotation.GetMapping
;
import
org.springframework.web.bind.annotation.PostMapping
;
import
org.springframework.web.bind.annotation.RequestMapping
;
import
org.springframework.web.bind.annotation.ResponseBody
;
import
java.util.List
;
@Api
(
tags
=
"动态表单报名活动管理"
)
@Controller
@RequestMapping
(
"/sweet/formSubmission"
)
public
class
SweetFormSubmissionAdminController
extends
BaseController
{
private
String
prefix
=
"zhengzai/sweet/formSubmission"
;
@Autowired
private
ISweetFormSubmissionAdminService
sweetFormSubmissionAdminService
;
@GetMapping
(
"listView"
)
@ApiOperation
(
value
=
"报名活动列表页面"
)
public
String
listView
()
{
return
prefix
+
"/list"
;
}
@Log
(
title
=
"报名活动列表"
,
businessType
=
BusinessType
.
LIST
)
@RequiresPermissions
(
"sweet:formSubmission:list"
)
@PostMapping
(
"list"
)
@ApiOperation
(
value
=
"报名活动列表数据"
)
@ResponseBody
public
TableDataInfo
list
(
SweetFormSubmissionActivityListParam
param
)
{
PageDomain
pageDomain
=
TableSupport
.
buildPageRequest
();
Integer
pageNum
=
pageDomain
.
getPageNum
();
Integer
pageSize
=
pageDomain
.
getPageSize
();
if
(
StringUtils
.
isNull
(
pageNum
))
{
pageNum
=
1
;
}
if
(
StringUtils
.
isNull
(
pageSize
))
{
pageSize
=
10
;
}
// 聚合查询排序在 SQL 中固定,忽略前端 orderByColumn 避免 PageHelper 追加无效字段
PageHelper
.
startPage
(
pageNum
,
pageSize
);
List
<
SweetFormSubmissionActivityVo
>
list
=
sweetFormSubmissionAdminService
.
activityList
(
param
);
return
getDataTable
(
list
);
}
@Log
(
title
=
"报名数据导出"
,
businessType
=
BusinessType
.
EXPORT
)
@RequiresPermissions
(
"sweet:formSubmission:export"
)
@PostMapping
(
"export"
)
@ApiOperation
(
value
=
"报名数据导出"
)
@ResponseBody
public
AjaxResult
export
(
SweetFormSubmissionExportParam
param
)
{
return
sweetFormSubmissionAdminService
.
export
(
param
);
}
}
liquidnet-bus-client/liquidnet-client-admin/liquidnet-client-admin-web/src/main/resources/templates/zhengzai/sweet/formSubmission/list.html
0 → 100644
View file @
e3c607d8
<!DOCTYPE html>
<html
lang=
"zh"
xmlns:th=
"http://www.thymeleaf.org"
xmlns:shiro=
"http://www.pollix.at/thymeleaf/shiro"
>
<head>
<th:block
th:include=
"include :: header('报名活动列表')"
/>
</head>
<body
class=
"gray-bg"
>
<div
class=
"container-div"
>
<div
class=
"row"
>
<div
class=
"col-sm-12 search-collapse"
>
<form
id=
"formId"
>
<div
class=
"select-list"
>
<ul>
<li>
活动:
<select
name=
"activityName"
th:with=
"type=${@dict.getType('sweet_form_activity')}"
>
<option
value=
""
>
全部
</option>
<option
th:each=
"dict : ${type}"
th:text=
"${dict.dictLabel}"
th:value=
"${dict.dictValue}"
></option>
</select>
</li>
<li>
<a
class=
"btn btn-primary btn-rounded btn-sm"
onclick=
"$.table.search()"
><i
class=
"fa fa-search"
></i>
搜索
</a>
<a
class=
"btn btn-warning btn-rounded btn-sm"
onclick=
"$.form.reset()"
><i
class=
"fa fa-refresh"
></i>
重置
</a>
</li>
</ul>
</div>
</form>
</div>
<div
class=
"col-sm-12 select-table table-bordered"
>
<table
id=
"bootstrap-table"
></table>
</div>
</div>
</div>
<th:block
th:include=
"include :: footer"
/>
<script
th:inline=
"javascript"
>
var
exportFlag
=
[[
$
{@
permission
.
hasPermi
(
'sweet:formSubmission:export'
)}]];
var
prefix
=
ctx
+
"sweet/formSubmission"
;
function
formatDateTime
(
value
)
{
return
$
.
common
.
sprintf
(
"<span>%s</span>"
,
null
!=
value
?
value
.
replace
(
"T"
,
" "
).
substring
(
0
,
19
)
:
value
);
}
function
exportAll
(
activityName
)
{
doExport
({
activityName
:
activityName
});
}
function
exportByTime
(
activityName
)
{
var
html
=
'<div style="padding: 20px;">'
+
'<div class="form-group">'
+
'<label>开始时间:</label>'
+
'<input type="text" class="time-input form-control" id="exportBeginTime" placeholder="yyyy-MM-dd HH:mm:ss"/>'
+
'</div>'
+
'<div class="form-group">'
+
'<label>结束时间:</label>'
+
'<input type="text" class="time-input form-control" id="exportEndTime" placeholder="yyyy-MM-dd HH:mm:ss"/>'
+
'</div>'
+
'</div>'
;
layer
.
open
({
type
:
1
,
title
:
'按时间导出'
,
area
:
[
'420px'
,
'260px'
],
content
:
html
,
btn
:
[
'导出'
,
'取消'
],
success
:
function
()
{
layui
.
use
(
'laydate'
,
function
()
{
var
laydate
=
layui
.
laydate
;
laydate
.
render
({
elem
:
'#exportBeginTime'
,
type
:
'datetime'
,
trigger
:
'click'
});
laydate
.
render
({
elem
:
'#exportEndTime'
,
type
:
'datetime'
,
trigger
:
'click'
});
});
},
yes
:
function
(
index
)
{
var
beginTime
=
$
(
'#exportBeginTime'
).
val
();
var
endTime
=
$
(
'#exportEndTime'
).
val
();
if
(
!
beginTime
&&
!
endTime
)
{
$
.
modal
.
msgWarning
(
'请至少填写一个时间'
);
return
;
}
layer
.
close
(
index
);
doExport
({
activityName
:
activityName
,
beginTime
:
beginTime
,
endTime
:
endTime
});
}
});
}
function
doExport
(
data
)
{
$
.
modal
.
loading
(
"正在导出数据,请稍后..."
);
$
.
post
(
prefix
+
"/export"
,
data
,
function
(
result
)
{
$
.
modal
.
closeLoading
();
if
(
result
.
code
==
web_status
.
SUCCESS
)
{
window
.
location
.
href
=
ctx
+
"common/download?fileName="
+
encodeURI
(
result
.
msg
)
+
"&delete="
+
true
;
}
else
{
$
.
modal
.
alertError
(
result
.
msg
);
}
});
}
$
(
function
()
{
var
options
=
{
url
:
prefix
+
"/list"
,
modalName
:
"报名活动"
,
sortable
:
false
,
columns
:
[
{
field
:
'activityName'
,
title
:
'活动标识(英文)'
},
{
field
:
'activityLabel'
,
title
:
'活动名称(中文)'
,
formatter
:
function
(
value
,
row
)
{
return
value
||
row
.
activityName
;
}
},
{
field
:
'submissionCount'
,
title
:
'报名数量'
},
{
field
:
'firstCreatedAt'
,
title
:
'最早提交'
,
formatter
:
function
(
value
)
{
return
formatDateTime
(
value
);
}
},
{
field
:
'lastCreatedAt'
,
title
:
'最新提交'
,
formatter
:
function
(
value
)
{
return
formatDateTime
(
value
);
}
},
{
title
:
'操作'
,
align
:
'center'
,
formatter
:
function
(
value
,
row
)
{
var
actions
=
[];
actions
.
push
(
'<a class="btn btn-warning btn-xs '
+
exportFlag
+
'" href="javascript:void(0)" onclick="exportAll(
\'
'
+
row
.
activityName
+
'
\'
)"><i class="fa fa-download"></i> 全部导出</a>'
);
actions
.
push
(
'<a class="btn btn-info btn-xs '
+
exportFlag
+
'" href="javascript:void(0)" onclick="exportByTime(
\'
'
+
row
.
activityName
+
'
\'
)"><i class="fa fa-clock-o"></i> 按时间导出</a>'
);
return
actions
.
join
(
' '
);
}
}
]
};
$
.
table
.
init
(
options
);
});
</script>
</body>
</html>
liquidnet-bus-client/liquidnet-client-admin/liquidnet-client-admin-zhengzai/src/main/java/com/liquidnet/client/admin/zhengzai/sweet/service/ISweetFormSubmissionAdminService.java
0 → 100644
View file @
e3c607d8
package
com
.
liquidnet
.
client
.
admin
.
zhengzai
.
sweet
.
service
;
import
com.liquidnet.client.admin.common.core.domain.AjaxResult
;
import
com.liquidnet.service.sweet.dto.param.admin.SweetFormSubmissionActivityListParam
;
import
com.liquidnet.service.sweet.dto.param.admin.SweetFormSubmissionExportParam
;
import
com.liquidnet.service.sweet.dto.admin.SweetFormSubmissionActivityVo
;
import
java.util.List
;
public
interface
ISweetFormSubmissionAdminService
{
List
<
SweetFormSubmissionActivityVo
>
activityList
(
SweetFormSubmissionActivityListParam
param
);
AjaxResult
export
(
SweetFormSubmissionExportParam
param
);
}
liquidnet-bus-client/liquidnet-client-admin/liquidnet-client-admin-zhengzai/src/main/java/com/liquidnet/client/admin/zhengzai/sweet/service/impl/SweetFormSubmissionAdminServiceImpl.java
0 → 100644
View file @
e3c607d8
package
com
.
liquidnet
.
client
.
admin
.
zhengzai
.
sweet
.
service
.
impl
;
import
com.liquidnet.client.admin.common.core.domain.AjaxResult
;
import
com.liquidnet.client.admin.common.core.domain.entity.SysDictData
;
import
com.liquidnet.client.admin.common.utils.DictUtils
;
import
com.liquidnet.client.admin.common.utils.StringUtils
;
import
com.liquidnet.client.admin.zhengzai.sweet.service.ISweetFormSubmissionAdminService
;
import
com.liquidnet.client.admin.zhengzai.sweet.utils.SweetFormSubmissionExcelUtils
;
import
com.liquidnet.service.sweet.dto.param.admin.SweetFormSubmissionActivityListParam
;
import
com.liquidnet.service.sweet.dto.param.admin.SweetFormSubmissionExportParam
;
import
com.liquidnet.service.sweet.dto.admin.SweetFormSubmissionActivityVo
;
import
com.liquidnet.service.sweet.entity.SweetFormSubmission
;
import
com.liquidnet.service.sweet.mapper.SweetFormSubmissionMapper
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.stereotype.Service
;
import
java.util.List
;
@Service
public
class
SweetFormSubmissionAdminServiceImpl
implements
ISweetFormSubmissionAdminService
{
public
static
final
String
DICT_TYPE_SWEET_FORM_ACTIVITY
=
"sweet_form_activity"
;
@Autowired
private
SweetFormSubmissionMapper
sweetFormSubmissionMapper
;
@Override
public
List
<
SweetFormSubmissionActivityVo
>
activityList
(
SweetFormSubmissionActivityListParam
param
)
{
String
activityName
=
StringUtils
.
isEmpty
(
param
.
getActivityName
())
?
null
:
param
.
getActivityName
();
List
<
SweetFormSubmissionActivityVo
>
list
=
sweetFormSubmissionMapper
.
selectActivityGroupList
(
activityName
);
for
(
SweetFormSubmissionActivityVo
vo
:
list
)
{
vo
.
setActivityLabel
(
getActivityLabel
(
vo
.
getActivityName
()));
}
return
list
;
}
private
String
getActivityLabel
(
String
activityName
)
{
if
(
StringUtils
.
isEmpty
(
activityName
))
{
return
""
;
}
List
<
SysDictData
>
datas
=
DictUtils
.
getDictCache
(
DICT_TYPE_SWEET_FORM_ACTIVITY
);
if
(
datas
!=
null
)
{
for
(
SysDictData
dict
:
datas
)
{
if
(
activityName
.
equals
(
dict
.
getDictValue
()))
{
return
dict
.
getDictLabel
();
}
}
}
return
activityName
;
}
@Override
public
AjaxResult
export
(
SweetFormSubmissionExportParam
param
)
{
if
(
StringUtils
.
isEmpty
(
param
.
getActivityName
()))
{
return
AjaxResult
.
error
(
"请选择活动"
);
}
String
beginTime
=
StringUtils
.
isEmpty
(
param
.
getBeginTime
())
?
null
:
param
.
getBeginTime
();
String
endTime
=
StringUtils
.
isEmpty
(
param
.
getEndTime
())
?
null
:
param
.
getEndTime
();
List
<
SweetFormSubmission
>
submissions
=
sweetFormSubmissionMapper
.
selectForExport
(
param
.
getActivityName
(),
beginTime
,
endTime
);
String
activityLabel
=
getActivityLabel
(
param
.
getActivityName
());
String
exportName
=
SweetFormSubmissionExcelUtils
.
buildExportName
(
activityLabel
,
beginTime
,
endTime
);
String
filename
=
SweetFormSubmissionExcelUtils
.
export
(
submissions
,
exportName
);
return
AjaxResult
.
success
(
filename
);
}
}
liquidnet-bus-client/liquidnet-client-admin/liquidnet-client-admin-zhengzai/src/main/java/com/liquidnet/client/admin/zhengzai/sweet/utils/SweetFormSubmissionExcelUtils.java
0 → 100644
View file @
e3c607d8
package
com
.
liquidnet
.
client
.
admin
.
zhengzai
.
sweet
.
utils
;
import
com.alibaba.fastjson.JSON
;
import
com.alibaba.fastjson.JSONObject
;
import
com.alibaba.fastjson.parser.Feature
;
import
com.liquidnet.client.admin.common.config.RuoYiConfig
;
import
com.liquidnet.client.admin.common.exception.BusinessException
;
import
com.liquidnet.client.admin.common.utils.StringUtils
;
import
com.liquidnet.service.sweet.entity.SweetFormSubmission
;
import
org.apache.poi.ss.usermodel.Row
;
import
org.apache.poi.ss.usermodel.Sheet
;
import
org.apache.poi.xssf.usermodel.XSSFWorkbook
;
import
java.io.File
;
import
java.io.FileOutputStream
;
import
java.time.format.DateTimeFormatter
;
import
java.util.ArrayList
;
import
java.util.LinkedHashMap
;
import
java.util.LinkedHashSet
;
import
java.util.List
;
import
java.util.Map
;
import
java.util.Set
;
/**
* 动态表单报名 Excel 导出
*/
public
class
SweetFormSubmissionExcelUtils
{
private
static
final
DateTimeFormatter
DTF
=
DateTimeFormatter
.
ofPattern
(
"yyyy-MM-dd HH:mm:ss"
);
private
static
final
String
COL_CREATED_AT
=
"提交时间"
;
private
SweetFormSubmissionExcelUtils
()
{
}
public
static
String
export
(
List
<
SweetFormSubmission
>
submissions
,
String
exportName
)
{
if
(
submissions
==
null
||
submissions
.
isEmpty
())
{
throw
new
BusinessException
(
"查无报名信息"
);
}
List
<
Map
<
String
,
String
>>
rows
=
new
ArrayList
<>();
Set
<
String
>
dataKeys
=
new
LinkedHashSet
<>();
for
(
SweetFormSubmission
submission
:
submissions
)
{
Map
<
String
,
String
>
row
=
new
LinkedHashMap
<>();
row
.
put
(
COL_CREATED_AT
,
submission
.
getCreatedAt
()
==
null
?
""
:
submission
.
getCreatedAt
().
format
(
DTF
));
parseDataJson
(
submission
.
getData
(),
row
,
dataKeys
);
rows
.
add
(
row
);
}
List
<
String
>
headers
=
new
ArrayList
<>();
headers
.
add
(
COL_CREATED_AT
);
headers
.
addAll
(
dataKeys
);
String
sheetName
=
sanitizeSheetName
(
exportName
);
XSSFWorkbook
workbook
=
new
XSSFWorkbook
();
Sheet
sheet
=
workbook
.
createSheet
(
sheetName
);
Row
headerRow
=
sheet
.
createRow
(
0
);
for
(
int
i
=
0
;
i
<
headers
.
size
();
i
++)
{
headerRow
.
createCell
(
i
).
setCellValue
(
headers
.
get
(
i
));
}
int
rowNum
=
1
;
for
(
Map
<
String
,
String
>
rowData
:
rows
)
{
Row
row
=
sheet
.
createRow
(
rowNum
++);
for
(
int
i
=
0
;
i
<
headers
.
size
();
i
++)
{
String
value
=
rowData
.
get
(
headers
.
get
(
i
));
row
.
createCell
(
i
).
setCellValue
(
value
==
null
?
""
:
value
);
}
}
String
filename
=
sanitizeFilename
(
exportName
)
+
".xlsx"
;
String
absolutePath
=
RuoYiConfig
.
getDownloadPath
()
+
filename
;
File
desc
=
new
File
(
absolutePath
);
if
(!
desc
.
getParentFile
().
exists
())
{
desc
.
getParentFile
().
mkdirs
();
}
try
(
FileOutputStream
out
=
new
FileOutputStream
(
desc
))
{
workbook
.
write
(
out
);
workbook
.
close
();
}
catch
(
Exception
e
)
{
throw
new
BusinessException
(
"导出Excel失败,请联系网站管理员!"
);
}
return
filename
;
}
public
static
String
buildExportName
(
String
activityLabel
,
String
beginTime
,
String
endTime
)
{
StringBuilder
name
=
new
StringBuilder
(
activityLabel
).
append
(
"报名数据"
);
if
(
StringUtils
.
isNotEmpty
(
beginTime
)
||
StringUtils
.
isNotEmpty
(
endTime
))
{
name
.
append
(
"_"
);
if
(
StringUtils
.
isNotEmpty
(
beginTime
))
{
name
.
append
(
normalizeTimeForName
(
beginTime
));
}
name
.
append
(
"-"
);
if
(
StringUtils
.
isNotEmpty
(
endTime
))
{
name
.
append
(
normalizeTimeForName
(
endTime
));
}
}
return
name
.
toString
();
}
private
static
String
normalizeTimeForName
(
String
time
)
{
return
time
.
trim
().
replace
(
":"
,
""
).
replace
(
" "
,
"_"
);
}
private
static
String
sanitizeSheetName
(
String
name
)
{
if
(
StringUtils
.
isEmpty
(
name
))
{
return
"报名数据"
;
}
String
sanitized
=
name
.
replaceAll
(
"[\\\\/?*\\[\\]:]"
,
"_"
);
return
sanitized
.
length
()
>
31
?
sanitized
.
substring
(
0
,
31
)
:
sanitized
;
}
private
static
String
sanitizeFilename
(
String
name
)
{
if
(
StringUtils
.
isEmpty
(
name
))
{
return
"报名数据"
;
}
return
name
.
replaceAll
(
"[\\\\/:*?\"<>|]"
,
"_"
);
}
private
static
void
parseDataJson
(
String
dataJson
,
Map
<
String
,
String
>
row
,
Set
<
String
>
dataKeys
)
{
if
(
dataJson
==
null
||
dataJson
.
trim
().
isEmpty
())
{
return
;
}
try
{
JSONObject
jsonObject
=
JSON
.
parseObject
(
dataJson
,
Feature
.
OrderedField
);
if
(
jsonObject
==
null
)
{
return
;
}
for
(
Map
.
Entry
<
String
,
Object
>
entry
:
jsonObject
.
entrySet
())
{
String
key
=
entry
.
getKey
();
if
(!
dataKeys
.
contains
(
key
))
{
dataKeys
.
add
(
key
);
}
row
.
put
(
key
,
formatValue
(
entry
.
getValue
()));
}
}
catch
(
Exception
ignored
)
{
if
(!
dataKeys
.
contains
(
"data"
))
{
dataKeys
.
add
(
"data"
);
}
row
.
put
(
"data"
,
dataJson
);
}
}
private
static
String
formatValue
(
Object
value
)
{
if
(
value
==
null
)
{
return
""
;
}
if
(
value
instanceof
Map
||
value
instanceof
List
)
{
return
JSON
.
toJSONString
(
value
);
}
return
String
.
valueOf
(
value
);
}
}
liquidnet-bus-do/liquidnet-service-sweet-do/src/main/java/com/liquidnet/service/sweet/dto/admin/SweetFormSubmissionActivityVo.java
0 → 100644
View file @
e3c607d8
package
com
.
liquidnet
.
service
.
sweet
.
dto
.
admin
;
import
io.swagger.annotations.ApiModel
;
import
io.swagger.annotations.ApiModelProperty
;
import
lombok.Data
;
import
java.io.Serializable
;
import
java.time.LocalDateTime
;
@Data
@ApiModel
(
value
=
"SweetFormSubmissionActivityVo"
,
description
=
"动态表单报名活动汇总"
)
public
class
SweetFormSubmissionActivityVo
implements
Serializable
{
private
static
final
long
serialVersionUID
=
1L
;
@ApiModelProperty
(
value
=
"活动标识(英文)"
)
private
String
activityName
;
@ApiModelProperty
(
value
=
"活动名称(中文)"
)
private
String
activityLabel
;
@ApiModelProperty
(
value
=
"报名数量"
)
private
Long
submissionCount
;
@ApiModelProperty
(
value
=
"最早提交时间"
)
private
LocalDateTime
firstCreatedAt
;
@ApiModelProperty
(
value
=
"最新提交时间"
)
private
LocalDateTime
lastCreatedAt
;
}
liquidnet-bus-do/liquidnet-service-sweet-do/src/main/java/com/liquidnet/service/sweet/mapper/SweetFormSubmissionMapper.java
View file @
e3c607d8
package
com
.
liquidnet
.
service
.
sweet
.
mapper
;
package
com
.
liquidnet
.
service
.
sweet
.
mapper
;
import
com.baomidou.mybatisplus.core.mapper.BaseMapper
;
import
com.baomidou.mybatisplus.core.mapper.BaseMapper
;
import
com.liquidnet.service.sweet.dto.admin.SweetFormSubmissionActivityVo
;
import
com.liquidnet.service.sweet.entity.SweetFormSubmission
;
import
com.liquidnet.service.sweet.entity.SweetFormSubmission
;
import
org.apache.ibatis.annotations.Param
;
import
java.util.List
;
/**
/**
* 动态表单报名提交表 Mapper
* 动态表单报名提交表 Mapper
*/
*/
public
interface
SweetFormSubmissionMapper
extends
BaseMapper
<
SweetFormSubmission
>
{
public
interface
SweetFormSubmissionMapper
extends
BaseMapper
<
SweetFormSubmission
>
{
List
<
SweetFormSubmissionActivityVo
>
selectActivityGroupList
(
@Param
(
"activityName"
)
String
activityName
);
List
<
SweetFormSubmission
>
selectForExport
(
@Param
(
"activityName"
)
String
activityName
,
@Param
(
"beginTime"
)
String
beginTime
,
@Param
(
"endTime"
)
String
endTime
);
}
}
liquidnet-bus-do/liquidnet-service-sweet-do/src/main/resources/com.liquidnet.service.sweet.mapper/SweetFormSubmissionMapper.xml
View file @
e3c607d8
...
@@ -2,4 +2,32 @@
...
@@ -2,4 +2,32 @@
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper
namespace=
"com.liquidnet.service.sweet.mapper.SweetFormSubmissionMapper"
>
<mapper
namespace=
"com.liquidnet.service.sweet.mapper.SweetFormSubmissionMapper"
>
<select
id=
"selectActivityGroupList"
resultType=
"com.liquidnet.service.sweet.dto.admin.SweetFormSubmissionActivityVo"
>
SELECT activity_name AS activityName,
COUNT(1) AS submissionCount,
MIN(created_at) AS firstCreatedAt,
MAX(created_at) AS lastCreatedAt
FROM sweet_form_submission
<where>
<if
test=
"activityName != null and activityName != ''"
>
AND activity_name = #{activityName}
</if>
</where>
GROUP BY activity_name
ORDER BY MAX(created_at) DESC
</select>
<select
id=
"selectForExport"
resultType=
"com.liquidnet.service.sweet.entity.SweetFormSubmission"
>
SELECT mid, submission_id AS submissionId, activity_name AS activityName, data, created_at AS createdAt, updated_at AS updatedAt
FROM sweet_form_submission
WHERE activity_name = #{activityName}
<if
test=
"beginTime != null and beginTime != ''"
>
AND created_at
>
= #{beginTime}
</if>
<if
test=
"endTime != null and endTime != ''"
>
AND created_at
<
= #{endTime}
</if>
ORDER BY created_at ASC
</select>
</mapper>
</mapper>
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