| | |
| | | package generator.service.impl; |
| | | 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 generator.domain.VwCjScSjTsBb; |
| | | import generator.service.VwCjScSjTsBbService; |
| | | import generator.mapper.VwCjScSjTsBbMapper; |
| | | 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; |
| | | |
| | | /** |
| | | * @author Administrator |
| | | * @description 针对表【VW_CJ_SC_SJ_TS_BB】的数据库操作Service实现 |
| | | * @createDate 2025-11-12 19:44:46 |
| | | */ |
| | | @Service |
| | | public class VwCjScSjTsBbServiceImpl extends ServiceImpl<VwCjScSjTsBbMapper, VwCjScSjTsBb> |
| | | implements VwCjScSjTsBbService{ |
| | | 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<VwCjScSjTsBbMapper, VwCjScSjTsBb> |
| | | 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<VwCjScSjTsBb> yesterdayData = list(); |
| | | |
| | | // 过滤数据:预计开工在本月的数据 |
| | | List<VwCjScSjTsBbMonth> 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<VwCjScSjTsBb> dataList) { |
| | | // 清空之前的别名设置 |
| | | writer.clearHeaderAlias(); |
| | | |
| | | // 设置表头别名(中文列名) |
| | | writer.addHeaderAlias("daa001", "工单号"); |
| | | writer.addHeaderAlias("itemNo", "物料编码"); |
| | | writer.addHeaderAlias("itemName", "物料名称"); |
| | | writer.addHeaderAlias("departmentname", "车间名称"); |
| | | writer.addHeaderAlias("lineName", "线体名称"); |
| | | writer.addHeaderAlias("departmentcode", "车间编码"); |
| | | writer.addHeaderAlias("lineNo", "线体编码"); |
| | | writer.addHeaderAlias("daa008", "工单数量"); |
| | | writer.addHeaderAlias("yjkg", "预计开工"); |
| | | writer.addHeaderAlias("sjkg", "实际开工"); |
| | | writer.addHeaderAlias("sq", "申请入库数"); |
| | | writer.addHeaderAlias("rk", "入库数"); |
| | | writer.addHeaderAlias("sqwwg", "申请未完工数"); |
| | | writer.addHeaderAlias("rkwwg", "入库未完工"); |
| | | writer.addHeaderAlias("sqwrk", "申请未入库"); |
| | | |
| | | // 合并单元格作为标题行 |
| | | writer.merge(14, title); |
| | | |
| | | // 写入数据,默认会使用别名作为表头 |
| | | writer.write(dataList, true); |
| | | |
| | | // 设置列宽自适应 |
| | | writer.autoSizeColumnAll(); |
| | | } |
| | | |
| | | |
| | | private void writeSheetData(ExcelWriter writer, List<VwCjScSjTsBbMonth> dataList, String title) { |
| | | // 清空之前的别名设置 |
| | | writer.clearHeaderAlias(); |
| | | |
| | | // 设置表头别名(中文列名) |
| | | writer.addHeaderAlias("daa001", "工单号"); |
| | | writer.addHeaderAlias("itemNo", "物料编码"); |
| | | writer.addHeaderAlias("itemName", "物料名称"); |
| | | writer.addHeaderAlias("departmentname", "车间名称"); |
| | | writer.addHeaderAlias("lineName", "线体名称"); |
| | | writer.addHeaderAlias("departmentcode", "车间编码"); |
| | | writer.addHeaderAlias("lineNo", "线体编码"); |
| | | writer.addHeaderAlias("daa008", "工单数量"); |
| | | writer.addHeaderAlias("yjkg", "预计开工"); |
| | | writer.addHeaderAlias("sjkg", "实际开工"); |
| | | writer.addHeaderAlias("sq", "申请入库数"); |
| | | writer.addHeaderAlias("rk", "入库数"); |
| | | writer.addHeaderAlias("sqwwg", "申请未完工数"); |
| | | writer.addHeaderAlias("rkwwg", "入库未完工"); |
| | | writer.addHeaderAlias("sqwrk", "申请未入库"); |
| | | |
| | | // 合并单元格作为标题行 |
| | | writer.merge(14, title); |
| | | |
| | | // 写入数据,默认会使用别名作为表头 |
| | | writer.write(dataList, true); |
| | | |
| | | // 设置列宽自适应 |
| | | writer.autoSizeColumnAll(); |
| | | } |
| | | } |
| | | |
| | | |