package com.gs.xky.service.Impl; import cn.hutool.core.io.FileUtil; import cn.hutool.poi.excel.ExcelUtil; import cn.hutool.poi.excel.ExcelWriter; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.gs.xky.entity.VwCjScSjTsBb; import com.gs.xky.entity.VwCjScSjTsBbMonth; import com.gs.xky.mapper.VwCjScSjTsBbMapper; import com.gs.xky.service.DingtalkInfoService; import com.gs.xky.service.VwCjScSjTsBbMonthService; import com.gs.xky.service.VwCjScSjTsBbService; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; import java.text.SimpleDateFormat; import java.time.LocalDate; import java.time.format.DateTimeFormatter; import java.util.Date; import java.util.List; /** * @author Administrator * @description 针对表【VW_CJ_SC_SJ_TS_BB】的数据库操作Service实现 * @createDate 2025-11-12 16:42:06 */ @Service @Slf4j @RequiredArgsConstructor public class VwCjScSjTsBbServiceImpl extends ServiceImpl implements VwCjScSjTsBbService { private final DingtalkInfoService dingtalkInfoService; private final VwCjScSjTsBbMonthService vwCjScSjTsBbMonthService; @Override public boolean exportAndSendToDingtalk() throws Exception { String exportFilePath = null; try { // 2. 准备导出文件路径 String timestamp = new SimpleDateFormat("yyyyMMddHHmmss").format(new Date()); String fileName = "生产数据报表_" + timestamp + ".xlsx"; exportFilePath = "D:\\BIFile\\" + fileName; // 确保目录存在 FileUtil.mkdir("D:\\BIFile"); // 3. 导出到Excel log.info("开始导出Excel文件: {}", exportFilePath); exportToExcel(exportFilePath); log.info("Excel文件导出成功"); // 4. 发送钉钉消息 log.info("开始发送钉钉文件消息..."); boolean sendResult = dingtalkInfoService.sendFileMessage(exportFilePath); if (sendResult) { log.info("钉钉文件消息发送成功"); } else { log.warn("钉钉文件消息发送失败"); } return sendResult; } catch (Exception e) { log.error("导出并发送失败", e); throw e; } finally { // 可选:发送后删除临时文件 // if (exportFilePath != null && FileUtil.exist(exportFilePath)) { // FileUtil.del(exportFilePath); // log.info("临时文件已删除: {}", exportFilePath); // } } } /** * 导出数据到Excel(两个sheet页) * * @param filePath 文件路径 */ private void exportToExcel(String filePath) { // 计算昨天的日期 LocalDate yesterday = LocalDate.now().minusDays(1); String yesterdayStr = yesterday.format(DateTimeFormatter.ofPattern("yyyy-MM-dd")); // 计算本月的起止日期 LocalDate today = LocalDate.now(); LocalDate firstDayOfMonth = today.withDayOfMonth(1); LocalDate lastDayOfMonth = today.withDayOfMonth(today.lengthOfMonth()); String firstDayStr = firstDayOfMonth.format(DateTimeFormatter.ofPattern("yyyy-MM-dd")); String lastDayStr = lastDayOfMonth.format(DateTimeFormatter.ofPattern("yyyy-MM-dd")); log.info("昨天日期: {}", yesterdayStr); log.info("本月范围: {} 至 {}", firstDayStr, lastDayStr); // 过滤数据:预计开工在昨天的数据 List yesterdayData = list(); // 过滤数据:预计开工在本月的数据 List thisMonthData = vwCjScSjTsBbMonthService.list(); log.info("昨天数据: {} 条", yesterdayData.size()); log.info("本月数据: {} 条", thisMonthData.size()); // 创建Excel写入器(第一个sheet) ExcelWriter writer = ExcelUtil.getWriter(filePath, "昨天入库工单申请"); // 写入第一个sheet:昨天预计开工的数据 writeSheetData(writer, "昨天入库工单申请数据(" + yesterdayStr + ")", yesterdayData); // 创建第二个sheet writer.setSheet("本月入库工单申请"); // 写入第二个sheet:本月预计开工的数据 writeSheetData(writer, thisMonthData, "本月入库工单申请数据(" + firstDayStr + " 至 " + lastDayStr + ")"); // 关闭writer,释放内存 writer.close(); } /** * 写入单个sheet的数据 * * @param writer Excel写入器 * @param dataList 数据列表 * @param title 标题 */ private void writeSheetData(ExcelWriter writer, String title, List dataList) { // 清空之前的别名设置 writer.clearHeaderAlias(); // 设置表头别名(中文列名) writer.addHeaderAlias("departmentname", "车间"); writer.addHeaderAlias("lineName", "线体名称"); writer.addHeaderAlias("itemNo", "产品编码"); writer.addHeaderAlias("itemName", "产品名称"); writer.addHeaderAlias("daa001", "工单号"); writer.addHeaderAlias("daa008", "工单数"); writer.addHeaderAlias("sq", "申请数"); writer.addHeaderAlias("rk", "入库数"); writer.addHeaderAlias("sqwwg", "申请未完工数"); writer.addHeaderAlias("rkwwg", "入库未完工"); writer.addHeaderAlias("sqwrk", "申请未入库"); writer.addHeaderAlias("yjkg", "预计开工"); writer.addHeaderAlias("sjkg", "实际开工"); // 合并单元格作为标题行 writer.merge(14, title); // 写入数据,默认会使用别名作为表头 writer.write(dataList, true); // 设置列宽自适应 writer.autoSizeColumnAll(); } private void writeSheetData(ExcelWriter writer, List dataList, String title) { // 清空之前的别名设置 writer.clearHeaderAlias(); // 设置表头别名(中文列名) writer.addHeaderAlias("departmentname", "车间"); writer.addHeaderAlias("lineName", "线体名称"); writer.addHeaderAlias("itemNo", "产品编码"); writer.addHeaderAlias("itemName", "产品名称"); writer.addHeaderAlias("daa001", "工单号"); writer.addHeaderAlias("daa008", "工单数"); writer.addHeaderAlias("sq", "申请数"); writer.addHeaderAlias("rk", "入库数"); writer.addHeaderAlias("sqwwg", "申请未完工数"); writer.addHeaderAlias("rkwwg", "入库未完工"); writer.addHeaderAlias("sqwrk", "申请未入库"); writer.addHeaderAlias("yjkg", "预计开工"); writer.addHeaderAlias("sjkg", "实际开工"); // 合并单元格作为标题行 writer.merge(14, title); // 写入数据,默认会使用别名作为表头 writer.write(dataList, true); // 设置列宽自适应 writer.autoSizeColumnAll(); } }