记得上下班打卡 | git大法好,push需谨慎

Commit 483408e7 authored by 姜秀龙's avatar 姜秀龙

Merge branch 'refs/heads/jxl-baoming-admin' into test-ecs

parents d590089a 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');
-- 动态表单报名活动管理 - 菜单与权限
-- 挂载在「正在映画」顶级菜单下(按 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, '');
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;
}
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;
}
...@@ -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);
......
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);
}
}
<!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>&nbsp;搜索</a>
<a class="btn btn-warning btn-rounded btn-sm" onclick="$.form.reset()"><i
class="fa fa-refresh"></i>&nbsp;重置</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>
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);
}
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);
}
}
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);
}
}
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;
}
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);
} }
...@@ -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 &gt;= #{beginTime}
</if>
<if test="endTime != null and endTime != ''">
AND created_at &lt;= #{endTime}
</if>
ORDER BY created_at ASC
</select>
</mapper> </mapper>
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment