Commit a41a7443 by MMF

MMF 2026-03-25 修改评分填报导出

parent 5e3d21e7
package com.qianhe.common.utils;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
public class MtTimeUtil {
private static final DateTimeFormatter DATA_TIME_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
/**
* LocalDateTime -> String
* @param localDateTime
* @return
*/
public static String dateTimeFormat(LocalDateTime localDateTime){
return DATA_TIME_FORMATTER.format(localDateTime);
}
}
......@@ -57,15 +57,6 @@ public class ZqczPftbController extends BaseController {
*/
@PostMapping("/export")
public void export(HttpServletResponse response, ZqczPftbQuery zqczPftbQuery) {
try {
Map<String, Object> resMap = zqczPftbService.list(zqczPftbQuery);
List<Map<String, Object>> dataList = (List<Map<String, Object>>) resMap.get("dataList");
MtExcelUtil utilT = new MtExcelUtil();
utilT.createExcel(response, dataList, "", "");
} catch (BusinessException e) {
log.warn("最强操作-评分导出失败:" + e.getMessage());
} catch (Exception e) {
log.error("最强操作-评分导出失败:" + e.getMessage());
}
zqczPftbService.export(response, zqczPftbQuery);
}
}
......@@ -4,6 +4,7 @@ import com.qianhe.zqcz.pftb.domain.ZqczPftb;
import com.qianhe.zqcz.pftb.domain.ZqczPftbQuery;
import org.apache.ibatis.annotations.Param;
import javax.servlet.http.HttpServletResponse;
import java.util.List;
import java.util.Map;
......@@ -22,4 +23,9 @@ public interface ZqczPftbService {
* 根据基层任务ID删除
*/
int deleteByJcrwid(Long jcrwid);
/**
* 导出
*/
void export(HttpServletResponse response, ZqczPftbQuery zqczPftbQuery);
}
package com.qianhe.zqcz.pftb.service.impl;
import com.qianhe.common.enums.zqcz.ZqczXmlbEnum;
import com.qianhe.common.exception.BusinessException;
import com.qianhe.common.utils.MtTimeUtil;
import com.qianhe.zqcz.pftb.domain.ZqczPftb;
import com.qianhe.zqcz.pftb.domain.ZqczPftbQuery;
import com.qianhe.zqcz.pftb.mapper.ZqczPftbMapper;
......@@ -9,10 +11,19 @@ import com.qianhe.zqcz.pwxx.domain.ZqczPwxxQuery;
import com.qianhe.zqcz.pwxx.domain.ZqczPwxxVo;
import com.qianhe.zqcz.pwxx.mapper.ZqczPwxxMapper;
import lombok.extern.slf4j.Slf4j;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.ss.util.CellRangeAddress;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import javax.servlet.http.HttpServletResponse;
import java.io.FileOutputStream;
import java.io.IOException;
import java.net.URLEncoder;
import java.time.LocalDateTime;
import java.util.*;
import java.util.stream.Collectors;
@Slf4j
@Service
......@@ -64,4 +75,256 @@ public class ZqczPftbServiceImpl implements ZqczPftbService {
public int deleteByJcrwid(Long jcrwid) {
return zqczPftbMapper.deleteByJcrwid(jcrwid);
}
/**
* 导出
*/
@Override
public void export(HttpServletResponse response, ZqczPftbQuery zqczPftbQuery) {
Map<String, Object> resMap = list(zqczPftbQuery); // 查询数据
List<ZqczPwxxVo> fields = (List<ZqczPwxxVo>) resMap.get("fields"); // 获取动态表头
List<Map<String, Object>> dataList = (List<Map<String, Object>>) resMap.get("dataList"); // 获取数据
// 表格标题
List<String> tableTitle = new ArrayList<>(); // 拼接完成的标题列表
List<String> tableTitlePreFixList = Arrays.asList("时间", "基层单位名称", "班站名称", "项目类别", "盲抽人员姓名", "盲抽项目名称"); // 前缀
List<String> tableTitleSuffixList = Arrays.asList("得分(平均)", "存在问题"); // 后缀
List<String> tableTitleDynamicList = fields.stream().map(ZqczPwxxVo::getPwmc).collect(Collectors.toList()); // 动态
tableTitle.addAll(tableTitlePreFixList);
for (int i = 0; i < tableTitleDynamicList.size(); i++) {
tableTitle.add(String.format("评委%s分数(%s)", i + 1, tableTitleDynamicList.get(i)));
}
tableTitle.addAll(tableTitleSuffixList);
// 处理表格数据
List<Object[]> finalList = new ArrayList<>();
// 遍历数据
for (Map<String, Object> rowMap : dataList) {
List<Object> rowList = new ArrayList<>();
// 固定字段(直接添加,无需多余对象接收)
rowList.add(rowMap.get("update_time")); // 更新时间
rowList.add(rowMap.get("jcdwmc")); // 基层单位名称
rowList.add(rowMap.get("dwmc")); // 班站名称
String xmlb = rowMap.get("xmlb").toString();
rowList.add(ZqczXmlbEnum.getNameByCode(xmlb)); // 项目类型
rowList.add(rowMap.get("rymc")); // 盲抽人员姓名
rowList.add(rowMap.get("xmmc")); // 盲抽项目名称
// 动态列
for (String dynamic : tableTitleDynamicList) {
rowList.add(rowMap.get(dynamic));
}
// 末尾固定字段
rowList.add(rowMap.get("pjdf")); // 平均得分
rowList.add(rowMap.get("remark")); // 存在问题
// 转数组并加入列表
finalList.add(rowList.toArray());
}
// 最终二维数组
Object[][] finalArray = finalList.toArray(new Object[0][]);
Workbook workbook = new XSSFWorkbook();
try {
Sheet sheet = workbook.createSheet(); // 创建标签页
createMainTitle(workbook, sheet, tableTitle.size() - 1);
createSubTitle(workbook, sheet, "临盘采油厂");
createTableTitle(workbook, sheet, tableTitle);
writeTableData(workbook, sheet, finalArray, 3);
setExportResponseHeader(response, "附表1“最强操作”抽取人员及项目评分统计表.xlsx");
workbook.write(response.getOutputStream());
} catch (Exception e) {
e.printStackTrace();
try {
response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
response.getWriter().write("导出失败:" + e.getMessage());
} catch (IOException ex) {
ex.printStackTrace();
}
}
}
/**
* 创建大标题
*/
private void createMainTitle(Workbook workbook, Sheet sheet, Integer lastCol) {
// ====================== 创建标题样式 ======================
CellStyle mainTitleStyle = workbook.createCellStyle();
mainTitleStyle.setAlignment(HorizontalAlignment.CENTER); // 水平居中
mainTitleStyle.setVerticalAlignment(VerticalAlignment.CENTER); // 垂直居中
Font mainTitleFont = workbook.createFont(); // 设置字体
mainTitleFont.setBold(true); // 加粗
mainTitleFont.setFontHeightInPoints((short) 22); // 字体大小
mainTitleFont.setFontName("宋体"); // 字体名称
mainTitleStyle.setFont(mainTitleFont);
Row mainTitleRow = sheet.createRow(0); // 第一行
mainTitleRow.setHeightInPoints(46); // 设置行高
Cell cell = mainTitleRow.createCell(0); // 创建单元格
cell.setCellValue("附表1“最强操作”抽取人员及项目评分统计表"); // 设置单元格的内容
cell.setCellStyle(mainTitleStyle); // 设置单元格样式
sheet.addMergedRegion(new CellRangeAddress(0, 0, 0, lastCol)); // 单元格合并
}
/**
* 创建副标题
*/
public void createSubTitle(Workbook workbook, Sheet sheet, String subTitle) {
// ====================== 创建副标题样式 ======================
CellStyle subTitleStyle = workbook.createCellStyle();
subTitleStyle.setAlignment(HorizontalAlignment.LEFT); // 左对齐
subTitleStyle.setVerticalAlignment(VerticalAlignment.CENTER); // 垂直居中
Font subTitleFont = workbook.createFont(); // 设置字体
subTitleFont.setBold(true); // 加粗
subTitleFont.setFontHeightInPoints((short) 11); // 字体大小
subTitleFont.setFontName("宋体"); // 字体名称
subTitleStyle.setFont(subTitleFont);
Row subTitleRow = sheet.createRow(1); // 第二行
subTitleRow.setHeightInPoints(25); // 设置行高
Cell cell = subTitleRow.createCell(0); // 创建单元格
cell.setCellValue(String.format("直属单位:%s", subTitle)); // 设置单元格的内容
cell.setCellStyle(subTitleStyle); // 设置单元格样式
sheet.addMergedRegion(new CellRangeAddress(1, 1, 0, 1)); // 单元格合并
}
/**
* 创建表格标题
*/
public static void createTableTitle(Workbook workbook, Sheet sheet, List<String> tableTitle) {
CellStyle tableHeaderStyle = workbook.createCellStyle(); // 创建单元格样式类
tableHeaderStyle.setAlignment(HorizontalAlignment.CENTER); // 左对齐
tableHeaderStyle.setVerticalAlignment(VerticalAlignment.CENTER); // 垂直居中
Font tableHeaderFont = workbook.createFont(); // 设置字体
tableHeaderFont.setBold(true); // 加粗
tableHeaderFont.setFontHeightInPoints((short) 11); // 字体大小
tableHeaderFont.setFontName("宋体"); // 字体名称
tableHeaderStyle.setFont(tableHeaderFont);
tableHeaderStyle.setBorderTop(BorderStyle.THIN); // 上边框
tableHeaderStyle.setBorderBottom(BorderStyle.THIN); // 下边框
tableHeaderStyle.setBorderLeft(BorderStyle.THIN); // 左边框
tableHeaderStyle.setBorderRight(BorderStyle.THIN); // 右边框
Row tableHeaderRow = sheet.createRow(2); // 创建第三行
tableHeaderRow.setHeightInPoints(43); // 设置行高
// 循环创建每一列表头
for (int i = 0; i < tableTitle.size(); i++) {
// 在当前行创建第 i 列(i 从 0 开始)
Cell cell = tableHeaderRow.createCell(i);
// 设置单元格的值为表头文字
cell.setCellValue(tableTitle.get(i));
// 将表头样式应用到该单元格
cell.setCellStyle(tableHeaderStyle);
}
}
/**
* 设置数据
*/
public static void writeTableData(Workbook workbook, Sheet sheet, Object[][] finalArray, Integer firstRow) {
if (finalArray == null || finalArray.length == 0) {
return;
}
CellStyle dataStyle = workbook.createCellStyle();
dataStyle.setAlignment(HorizontalAlignment.LEFT);
dataStyle.setVerticalAlignment(VerticalAlignment.CENTER);
dataStyle.setBorderTop(BorderStyle.THIN);
dataStyle.setBorderBottom(BorderStyle.THIN);
dataStyle.setBorderLeft(BorderStyle.THIN);
dataStyle.setBorderRight(BorderStyle.THIN);
// 创建数字样式(千分位格式)
CellStyle numberStyle = workbook.createCellStyle();
numberStyle.setAlignment(HorizontalAlignment.RIGHT);
numberStyle.setVerticalAlignment(VerticalAlignment.CENTER);
// 设置千分位格式,带2位小数
// "#,##0.00" 表示带千分位和两位小数
DataFormat dataFormat = workbook.createDataFormat();
numberStyle.setDataFormat(dataFormat.getFormat("#,##0"));
// 复制边框样式
numberStyle.setBorderTop(BorderStyle.THIN);
numberStyle.setBorderBottom(BorderStyle.THIN);
numberStyle.setBorderLeft(BorderStyle.THIN);
numberStyle.setBorderRight(BorderStyle.THIN);
for (int i = 0; i < finalArray.length; i++) {
Row row = sheet.createRow(i + firstRow);
row.setHeightInPoints(20); // 设置行高
for (int j = 0; j < finalArray[i].length; j++) {
// 创建单元格
Cell cell = row.createCell(j);
// 单元格赋值
Object value = finalArray[i][j];
if (value instanceof String) {
cell.setCellValue((String) value); // 设置为字符串
} else if (value instanceof Integer) {
int intValue = (Integer) value;
cell.setCellValue(intValue); // 设置为数值
} else if (value instanceof LocalDateTime) {
String timeValue = MtTimeUtil.dateTimeFormat((LocalDateTime) value);
cell.setCellValue(timeValue); // 将日期类型转化为字符串类型
}
// 设置单元格样式
cell.setCellStyle(dataStyle);
}
}
// ====================== 2. 所有数据写完后,统一自动列宽(关键!) ======================
int colCount = finalArray[0].length;
for (int j = 0; j < colCount; j++) {
// 自动计算宽度
sheet.autoSizeColumn(j);
// 对中文进行加宽(关键!解决显示不全)
int width = sheet.getColumnWidth(j) * 14 / 10;
// 最大宽度限制(Excel 限制 255 个字符宽度)
int maxWidth = 255 * 256;
if (width > maxWidth) {
width = maxWidth;
}
sheet.setColumnWidth(j, width);
}
}
/**
* 设置响应头
*/
private void setExportResponseHeader(HttpServletResponse response, String fileName) throws IOException {
// 设置内容类型
response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
response.setCharacterEncoding("UTF-8");
// 处理中文文件名
String encodedFileName = URLEncoder.encode(fileName, "UTF-8")
.replaceAll("\\+", "%20");
response.setHeader("Content-disposition",
"attachment;filename*=utf-8''" + encodedFileName);
// 禁用缓存
response.setHeader("Cache-Control", "no-cache, no-store, must-revalidate");
response.setHeader("Pragma", "no-cache");
response.setDateHeader("Expires", 0);
}
}
......@@ -291,7 +291,7 @@ public class ZqczXmRyLsjlServiceImpl implements ZqczXmRyLsjlService {
String dwmc = finalList.stream().map(ZqczRyxxVo::getDwmc).distinct().collect(Collectors.joining(","));
String rymc = finalList.stream().map(ZqczRyxxVo::getRymc).distinct().collect(Collectors.joining(","));
ZqczXmRyLsjl xmRyLsjl = new ZqczXmRyLsjl(zsrwid, jcrwid, jcdwid, bzhczXmglVo, rymc, dwmc);
ZqczXmRyLsjl xmRyLsjl = new ZqczXmRyLsjl(zsrwid, jcrwid, jcdwid, bzhczXmglVo, dwmc, rymc);
return xmRyLsjl;
}
......@@ -337,19 +337,8 @@ public class ZqczXmRyLsjlServiceImpl implements ZqczXmRyLsjlService {
String dwmc = finalList.stream().map(ZqczRyxxVo::getDwmc).distinct().collect(Collectors.joining(","));
String rymc = finalList.stream().map(ZqczRyxxVo::getRymc).distinct().collect(Collectors.joining(","));
ZqczXmRyLsjl xmRyLsjl = ZqczXmRyLsjl.builder()
.jcrwid(jcrwid)
.jcdwid(jcdwid)
.xmmc(bzhczXmglVo.getXmmc())
.xmzy(bzhczXmglVo.getXmzy())
.xmlb(bzhczXmglVo.getXmlb())
.gzcj(bzhczXmglVo.getGzcj())
.rymc(rymc)
.dwmc(dwmc)
.create_by(SecurityUtils.getLoginUser().getUsername())
.update_by(SecurityUtils.getLoginUser().getUsername())
.create_time(new Date())
.build();
ZqczXmRyLsjl xmRyLsjl = new ZqczXmRyLsjl(zsrwid, jcrwid, jcdwid, bzhczXmglVo, dwmc, rymc);
return xmRyLsjl;
}
......@@ -537,7 +526,7 @@ public class ZqczXmRyLsjlServiceImpl implements ZqczXmRyLsjlService {
String rymc = rymcList.stream().distinct().collect(Collectors.joining(","));
ZqczXmRyLsjl spotCheckXmRyLsjl = new ZqczXmRyLsjl(zsrwid, jcrwid, jcdwid, spotCheckTdyjXmgl, rymc, dwmc);
ZqczXmRyLsjl spotCheckXmRyLsjl = new ZqczXmRyLsjl(zsrwid, jcrwid, jcdwid, spotCheckTdyjXmgl, dwmc, rymc);
dataList.add(spotCheckXmRyLsjl);
}
return dataList;
......
......@@ -44,6 +44,7 @@
<if test="zsrwid != null ">AND lsjl.zsrwid = #{zsrwid}</if>
<if test="jcrwid != null ">AND lsjl.jcrwid = #{jcrwid}</if>
</where>
ORDER BY lsjl.xmlb
</select>
<!-- 添加|修改 -->
<insert id="add" parameterType="com.qianhe.zqcz.pftb.domain.ZqczPftb">
......
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