From c4b7db92b76eb4aa81011c72825d710e5df6b329 Mon Sep 17 00:00:00 2001 From: dongzheqi <13840175730@139.com> Date: Wed, 16 Sep 2026 08:13:00 +0800 Subject: [PATCH] =?UTF-8?q?1.=E4=BC=98=E5=8C=96=E8=B7=9F=E8=B8=AA=E8=AE=B0?= =?UTF-8?q?=E5=BD=95=E5=AF=BC=E5=87=BA=E6=97=B6=E9=A1=B5=E9=9D=A2=E7=AD=89?= =?UTF-8?q?=E5=BE=85=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/dsic/gj_erp/Test.java | 54 +- .../com/dsic/gj_erp/bean/jcsj/YdjhzzVO.java | 904 ++++++++++++++++++ .../controller/jcsj/DmBomController.java | 1 - .../controller/jcsj/YdjhzzController.java | 19 + .../service/jcsj/YdjhzzExportService.java | 83 ++ .../钢材到货情况统计Service.java | 2 +- .../预切板计划导出模板.xlsx | Bin 0 -> 12069 bytes 7 files changed, 1038 insertions(+), 25 deletions(-) create mode 100644 src/main/java/com/dsic/gj_erp/bean/jcsj/YdjhzzVO.java create mode 100644 src/main/java/com/dsic/gj_erp/service/jcsj/YdjhzzExportService.java create mode 100644 src/main/resources/templates/预切板计划导出模板.xlsx diff --git a/src/main/java/com/dsic/gj_erp/Test.java b/src/main/java/com/dsic/gj_erp/Test.java index dc28c61..7492d54 100644 --- a/src/main/java/com/dsic/gj_erp/Test.java +++ b/src/main/java/com/dsic/gj_erp/Test.java @@ -2,6 +2,7 @@ package com.dsic.gj_erp; import cn.hutool.core.date.DateUtil; import cn.hutool.core.date.TimeInterval; +import cn.hutool.core.io.FileUtil; import cn.hutool.extra.qrcode.QrCodeUtil; import cn.hutool.extra.qrcode.QrConfig; import com.google.zxing.BarcodeFormat; @@ -19,10 +20,17 @@ import java.awt.geom.Rectangle2D; import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException; +import java.util.List; public class Test { public static void main(String[] args) throws IOException { + List gbk = FileUtil.readLines("D:\\T300K-132_400_erp0909\\T300K-132_400批量型材统计数据_7跨.XC", "GBK"); + System.out.println(gbk); + + List gbk1 = FileUtil.readLines("D:\\T300K-132_400_erp0909\\T300K-132_400批量数控板材统计数据_4跨.BC", "GBK"); + System.out.println(gbk1); + // System.out.println(DateUtil.thisYear()); // System.out.println(StrUtil.padPre("1",3,"0")); @@ -32,17 +40,17 @@ public class Test { //System.out.println("aaa = " + String.format("%03d",1)); // MatrixToImageWriter. - TimeInterval timer = DateUtil.timer(); - String pdfFilePath = "E:\\B058HC104HN第058批量龙门套料图2023-07-20.pdf"; // PDF文件路径 - PDDocument document = PDDocument.load(new File(pdfFilePath)); +// TimeInterval timer = DateUtil.timer(); +// String pdfFilePath = "E:\\B058HC104HN第058批量龙门套料图2023-07-20.pdf"; // PDF文件路径 +// PDDocument document = PDDocument.load(new File(pdfFilePath)); // PDFTextStripper stripper = new PDFTextStripper(); // String text = stripper.getText(document); // String[] split = text.split("\\n"); // List list = new ArrayList<>(); - QrConfig config = new QrConfig(300, 300);//二维码宽/高 +// QrConfig config = new QrConfig(300, 300);//二维码宽/高 // 设置边距,既二维码和背景之间的边距(即白边大小) - config.setMargin(0); +// config.setMargin(0); // 设置前景色,既二维码颜色(青色) //config.setForeColor(Color.CYAN.getRGB()); // 设置背景色(灰色) @@ -80,25 +88,25 @@ public class Test { // } // } - for (int pageNumber = 1; pageNumber < document.getNumberOfPages(); ++pageNumber) { - PDPage page = document.getPage(pageNumber); - String textByRegion = getTextByRegion(page, 80, 50, 1100, 40); -// System.out.println(textByRegion); - String[] split = textByRegion.split(" "); - String dcch = split[1]; - String dcpl = split[3]; - String tzbh = split[7]; - String pageIndex = split[12]; - BufferedImage bufferedImage = QrCodeUtil.generate(String.format("%s_%s_%s", dcch, dcpl, tzbh), config); - PDPageContentStream contentStream = new PDPageContentStream(document, page, PDPageContentStream.AppendMode.APPEND, true, true); - PDImageXObject qrCodeImage = JPEGFactory.createFromImage(document, bufferedImage); - contentStream.drawImage(qrCodeImage, 10, 10, 75, 75); // 在PDF中的坐标位置添加二维码 - contentStream.close(); - } +// for (int pageNumber = 1; pageNumber < document.getNumberOfPages(); ++pageNumber) { +// PDPage page = document.getPage(pageNumber); +// String textByRegion = getTextByRegion(page, 80, 50, 1100, 40); +//// System.out.println(textByRegion); +// String[] split = textByRegion.split(" "); +// String dcch = split[1]; +// String dcpl = split[3]; +// String tzbh = split[7]; +// String pageIndex = split[12]; +// BufferedImage bufferedImage = QrCodeUtil.generate(String.format("%s_%s_%s", dcch, dcpl, tzbh), config); +// PDPageContentStream contentStream = new PDPageContentStream(document, page, PDPageContentStream.AppendMode.APPEND, true, true); +// PDImageXObject qrCodeImage = JPEGFactory.createFromImage(document, bufferedImage); +// contentStream.drawImage(qrCodeImage, 10, 10, 75, 75); // 在PDF中的坐标位置添加二维码 +// contentStream.close(); +// } - document.save("E:/updated_document.pdf"); - document.close(); - System.out.println(timer.interval()); +// document.save("E:/updated_document.pdf"); +// document.close(); +// System.out.println(timer.interval()); // 输出提取的文本到控制台 // System.out.println(text); diff --git a/src/main/java/com/dsic/gj_erp/bean/jcsj/YdjhzzVO.java b/src/main/java/com/dsic/gj_erp/bean/jcsj/YdjhzzVO.java new file mode 100644 index 0000000..1e515a5 --- /dev/null +++ b/src/main/java/com/dsic/gj_erp/bean/jcsj/YdjhzzVO.java @@ -0,0 +1,904 @@ +package com.dsic.gj_erp.bean.jcsj; + +import cn.hutool.core.util.NumberUtil; +import lombok.Getter; +import lombok.Setter; + +import java.math.BigDecimal; + +/** + * 预切板计划导出VO + * 字段名与前端tableColumn中的field保持完全一致 + */ +@Setter +@Getter +public class YdjhzzVO { + + /** + * 船号 + */ + private Object dcCh; + + /** + * 批量 + */ + private Object dcPl; + + /** + * 分段 + */ + private Object dcFd; + + /** + * 龙门1 + */ + private Object lm1; + + /** + * 领取重量 + */ + private Object bclqzl_lm1; + + /** + * 实耗重量 + */ + private Object bcshzl_lm1; + + /** + * 余料重量 + */ + private Object 龙门1余料重量; + + /** + * 前批余料代 + */ + private Object 龙门1前批余料代; + + /** + * 零件重量 + */ + private Object 龙门1零件重量; + + /** + * 数1 + */ + private Object s1; + + /** + * 领取重量 + */ + private Object bclqzl_s1; + + /** + * 实耗重量 + */ + private Object bcshzl_s1; + + /** + * 余料重量 + */ + private Object 数1余料重量; + + /** + * 前批余料代 + */ + private Object 数1前批余料代; + + /** + * 零件重量 + */ + private Object 数1零件重量; + + /** + * 激光小2 + */ + private Object xj2; + + /** + * 领取重量 + */ + private Object bclqzl_xj2; + + /** + * 实耗重量 + */ + private Object bcshzl_xj2; + + /** + * 余料重量 + */ + private Object 小激光2余料重量; + + /** + * 前批余料代 + */ + private Object 小激光2前批余料代; + + /** + * 零件重量 + */ + private Object 小激光2零件重量; + + /** + * 激光中大2 + */ + private Object dj2; + + /** + * 领取重量 + */ + private Object bclqzl_dj2; + + /** + * 实耗重量 + */ + private Object bcshzl_dj2; + + /** + * 余料重量 + */ + private Object 大激光2余料重量; + + /** + * 前批余料代 + */ + private Object 大激光2前批余料代; + + /** + * 零件重量 + */ + private Object 大激光2零件重量; + + /** + * 数小2 + */ + private Object sx2; + + /** + * 领取重量 + */ + private Object bclqzl_sx2; + + /** + * 实耗重量 + */ + private Object bcshzl_sx2; + + /** + * 余料重量 + */ + private Object 数小2余料重量; + + /** + * 前批余料代 + */ + private Object 数小2前批余料代; + + /** + * 零件重量 + */ + private Object 数小2零件重量; + + /** + * 数中大2 + */ + private Object szd2; + + /** + * 领取重量 + */ + private Object bclqzl_szd2; + + /** + * 实耗重量 + */ + private Object bcshzl_szd2; + + /** + * 余料重量 + */ + private Object 数中大2余料重量; + + /** + * 前批余料代 + */ + private Object 数中大2前批余料代; + + /** + * 零件重量 + */ + private Object 数中大2零件重量; + + /** + * 小腹 + */ + private Object xf; + + /** + * 领取重量 + */ + private Object bclqzl_xf; + + /** + * 实耗重量 + */ + private Object bcshzl_xf; + + /** + * 余料重量 + */ + private Object 小腹余料重量; + + /** + * 前批余料代 + */ + private Object 小腹前批余料代; + + /** + * 零件重量 + */ + private Object 小腹零件重量; + + /** + * 大腹 + */ + private Object df; + + /** + * 领取重量 + */ + private Object bclqzl_df; + + /** + * 实耗重量 + */ + private Object bcshzl_df; + + /** + * 余料重量 + */ + private Object 大腹余料重量; + + /** + * 前批余料代 + */ + private Object 大腹前批余料代; + + /** + * 零件重量 + */ + private Object 大腹零件重量; + + /** + * 小组厚板 + */ + private Object xzhb; + + /** + * 领取重量 + */ + private Object bclqzl_xzhb; + + /** + * 实耗重量 + */ + private Object bcshzl_xzhb; + + /** + * 余料重量 + */ + private Object 小组厚板余料重量; + + /** + * 前批余料代 + */ + private Object 小组厚板前批余料代; + + /** + * 零件重量 + */ + private Object 小组厚板零件重量; + + /** + * 大组厚板 + */ + private Object dzhb; + + /** + * 领取重量 + */ + private Object bclqzl_dzhb; + + /** + * 实耗重量 + */ + private Object bcshzl_dzhb; + + /** + * 余料重量 + */ + private Object 大组厚板余料重量; + + /** + * 前批余料代 + */ + private Object 大组厚板前批余料代; + + /** + * 零件重量 + */ + private Object 大组厚板零件重量; + + /** + * 数小4 + */ + private Object sx4; + + /** + * 领取重量 + */ + private Object bclqzl_sx4; + + /** + * 实耗重量 + */ + private Object bcshzl_sx4; + + /** + * 余料重量 + */ + private Object 数小4余料重量; + + /** + * 前批余料代 + */ + private Object 数小4前批余料代; + + /** + * 零件重量 + */ + private Object 数小4零件重量; + + /** + * 机肘4 + */ + private Object jz4; + + /** + * 领取重量 + */ + private Object bclqzl_jz4; + + /** + * 实耗重量 + */ + private Object bcshzl_jz4; + + /** + * 余料重量 + */ + private Object 机肘4余料重量; + + /** + * 前批余料代 + */ + private Object 机肘4前批余料代; + + /** + * 零件重量 + */ + private Object 机肘4零件重量; + + /** + * 小面 + */ + private Object xm; + + /** + * 领取重量 + */ + private Object bclqzl_xm; + + /** + * 实耗重量 + */ + private Object bcshzl_xm; + + /** + * 余料重量 + */ + private Object 小面余料重量; + + /** + * 前批余料代 + */ + private Object 小面前批余料代; + + /** + * 零件重量 + */ + private Object 小面零件重量; + + /** + * 大面 + */ + private Object dm; + + /** + * 领取重量 + */ + private Object bclqzl_dm; + + /** + * 实耗重量 + */ + private Object bcshzl_dm; + + /** + * 余料重量 + */ + private Object 大面余料重量; + + /** + * 前批余料代 + */ + private Object 大面前批余料代; + + /** + * 零件重量 + */ + private Object 大面零件重量; + + /** + * 手小3 + */ + private Object sx3; + + /** + * 领取重量 + */ + private Object bclqzl_sx3; + + /** + * 实耗重量 + */ + private Object bcshzl_sx3; + + /** + * 余料重量 + */ + private Object 手小3余料重量; + + /** + * 前批余料代 + */ + private Object 手小3前批余料代; + + /** + * 零件重量 + */ + private Object 手小3零件重量; + + /** + * 手机3 + */ + private Object sj3; + + /** + * 领取重量 + */ + private Object bclqzl_sj3; + + /** + * 实耗重量 + */ + private Object bcshzl_sj3; + + /** + * 余料重量 + */ + private Object 手机3余料重量; + + /** + * 前批余料代 + */ + private Object 手机3前批余料代; + + /** + * 零件重量 + */ + private Object 手机3零件重量; + + /** + * 手中大3 + */ + private Object szd3; + + /** + * 领取重量 + */ + private Object bclqzl_szd3; + + /** + * 实耗重量 + */ + private Object bcshzl_szd3; + + /** + * 余料重量 + */ + private Object 手中大3余料重量; + + /** + * 前批余料代 + */ + private Object 手中大3前批余料代; + + /** + * 零件重量 + */ + private Object 手中大3零件重量; + + /** + * 小组型材根数 + */ + private Object xzxcgs; + + /** + * 小组型材领取米数 + */ + private Object 小组型材领取米数; + + /** + * 小组型材实耗米数 + */ + private Object 小组型材实耗米数; + + /** + * 领取重量 + */ + private Object lqzl_xzxc; + + /** + * 实耗重量 + */ + private Object shzl_xzxc; + + /** + * 余料重量 + */ + private Object 小组型材余料重量; + + /** + * 前批余料代 + */ + private Object 小组型材前批余料代; + + /** + * 零件重量 + */ + private Object 小组型材零件重量; + + /** + * 大组型材根数 + */ + private Object dzxcgs; + + /** + * 大组型材领取米数 + */ + private Object 大组型材领取米数; + + /** + * 大组型材实耗米数 + */ + private Object 大组型材实耗米数; + + /** + * 领取重量 + */ + private Object lqzl_dzxc; + + /** + * 实耗重量 + */ + private Object shzl_dzxc; + + /** + * 余料重量 + */ + private Object 大组型材余料重量; + + /** + * 前批余料代 + */ + private Object 大组型材前批余料代; + + /** + * 零件重量 + */ + private Object 大组型材零件重量; + + /** + * 方钢根数 + */ + private Object fggs; + + /** + * 方钢领取米数 + */ + private Object 方钢领取米数; + + /** + * 方钢实耗米数 + */ + private Object 方钢实耗米数; + + /** + * 领取重量 + */ + private Object lqzl_fg; + + /** + * 实耗重量 + */ + private Object shzl_fg; + + /** + * 余料重量 + */ + private Object 方钢余料重量; + + /** + * 前批余料代 + */ + private Object 方钢前批余料代; + + /** + * 零件重量 + */ + private Object 方钢零件重量; + + /** + * 型材根数合计 + */ + private Object xcgs_hj; + + /** + * 型材总米数(不含方钢) + */ + private Object xcms_hj; + + /** + * 小组领取合计 + */ + private BigDecimal lqhj_xz; + + /** + * 小组实耗合计 + */ + private BigDecimal shhj_xz; + + /** + * 数中大4 + */ + private Object szd4; + + /** + * 领取重量 + */ + private Object bclqzl_szd4; + + /** + * 实耗重量 + */ + private Object bcshzl_szd4; + + /** + * 余料重量 + */ + private Object 数中大4余料重量; + + /** + * 前批余料代 + */ + private Object 数中大4前批余料代; + + /** + * 零件重量 + */ + private Object 数中大4零件重量; + + /** + * 数曲2小 + */ + private Object sq2x; + + /** + * 领取重量 + */ + private Object bclqzl_sq2x; + + /** + * 实耗重量 + */ + private Object bcshzl_sq2x; + + /** + * 余料重量 + */ + private Object 数曲2小余料重量; + + /** + * 前批余料代 + */ + private Object 数曲2小前批余料代; + + /** + * 零件重量 + */ + private Object 数曲2小零件重量; + + /** + * 数曲2大 + */ + private Object sq2d; + + /** + * 领取重量 + */ + private Object bclqzl_sq2d; + + /** + * 实耗重量 + */ + private Object bcshzl_sq2d; + + /** + * 余料重量 + */ + private Object 数曲2大余料重量; + + /** + * 前批余料代 + */ + private Object 数曲2大前批余料代; + + /** + * 零件重量 + */ + private Object 数曲2大零件重量; + + /** + * 小曲3 + */ + private Object xq3; + + /** + * 领取重量 + */ + private Object bclqzl_xq3; + + /** + * 实耗重量 + */ + private Object bcshzl_xq3; + + /** + * 余料重量 + */ + private Object 小曲3余料重量; + + /** + * 前批余料代 + */ + private Object 小曲3前批余料代; + + /** + * 零件重量 + */ + private Object 小曲3零件重量; + + /** + * 大曲3 + */ + private Object dq3; + + /** + * 领取重量 + */ + private Object bclqzl_dq3; + + /** + * 实耗重量 + */ + private Object bcshzl_dq3; + + /** + * 余料重量 + */ + private Object 大曲3余料重量; + + /** + * 前批余料代 + */ + private Object 大曲3前批余料代; + + /** + * 零件重量 + */ + private Object 大曲3零件重量; + + /** + * 光电 + */ + private Object gd; + + /** + * 领取重量 + */ + private Object bclqzl_gd; + + /** + * 实耗重量 + */ + private Object bcshzl_gd; + + /** + * 余料重量 + */ + private Object 光电余料重量; + + /** + * 前批余料代 + */ + private Object 光电前批余料代; + + /** + * 零件重量 + */ + private Object 光电零件重量; + + /** + * 大组领取合计 + */ + private BigDecimal lqhj_dz; + + /** + * 大组实耗合计 + */ + private BigDecimal shhj_dz; + + /** + * 领取合计 + */ + private BigDecimal lqhj; + + /** + * 实耗合计 + */ + private BigDecimal shhj; + + /** + * 板数合计 + */ + private Object hjbs; + + /** + * 小腹零件 + */ + private Object xflj; + + /** + * 大腹零件 + */ + private Object dflj; + + public void initLqhj() { + this.lqhj = NumberUtil.add(this.lqhj_xz, this.lqhj_dz); + } + + public void initShhj() { + this.shhj = NumberUtil.add(this.shhj_xz, this.shhj_dz); + } +} \ No newline at end of file diff --git a/src/main/java/com/dsic/gj_erp/controller/jcsj/DmBomController.java b/src/main/java/com/dsic/gj_erp/controller/jcsj/DmBomController.java index 747cf4c..a647499 100644 --- a/src/main/java/com/dsic/gj_erp/controller/jcsj/DmBomController.java +++ b/src/main/java/com/dsic/gj_erp/controller/jcsj/DmBomController.java @@ -23,7 +23,6 @@ import com.dsic.gj_erp.service.jhgk.DmYdjhService; import com.dsic.gj_erp.service.sy.SYService; import com.dsic.gj_erp.util.ObjConvertUtils; import io.swagger.annotations.ApiOperation; -import jdk.nashorn.internal.ir.ReturnNode; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.transaction.annotation.Transactional; diff --git a/src/main/java/com/dsic/gj_erp/controller/jcsj/YdjhzzController.java b/src/main/java/com/dsic/gj_erp/controller/jcsj/YdjhzzController.java index aa1816d..66d2dcf 100644 --- a/src/main/java/com/dsic/gj_erp/controller/jcsj/YdjhzzController.java +++ b/src/main/java/com/dsic/gj_erp/controller/jcsj/YdjhzzController.java @@ -4,16 +4,21 @@ package com.dsic.gj_erp.controller.jcsj; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.dsic.gj_erp.bean.ResultBean; import com.dsic.gj_erp.bean.jcsj.Ydjhzz; +import com.dsic.gj_erp.bean.jcsj.YdjhzzVO; import com.dsic.gj_erp.bean.jhgk.DmYdjh; import com.dsic.gj_erp.mapper.jhgk.DmYdjhMapper; import com.dsic.gj_erp.service.jcsj.DmBclqmxpService; +import com.dsic.gj_erp.service.jcsj.YdjhzzExportService; import com.dsic.gj_erp.service.jhgk.DmYdjhService; import com.dsic.gj_erp.vo.预切板统计VO; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import lombok.AllArgsConstructor; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; import java.util.List; import java.util.Map; @@ -35,6 +40,20 @@ public class YdjhzzController { private final DmBclqmxpService bclqmxpService; private final DmYdjhService ydjhService; + private final YdjhzzExportService ydjhzzExportService; + + /** + * 服务器端导出预切板计划Excel + * 前端将当前表格已加载的数据列表直接POST提交,后端接收后写入Excel返回文件 + * + * @param dataList 前端页面已加载的数据列表 + * @param response HttpServletResponse + */ + @PostMapping("/export") + public void exportExcel(@RequestBody List dataList, HttpServletResponse response) throws Exception { + ydjhzzExportService.export(dataList, response); + } + @PostMapping public ResultBean yqbtjcx(@RequestBody Map map){ List<预切板统计VO> list = bclqmxpService.预切板统计查询(map); diff --git a/src/main/java/com/dsic/gj_erp/service/jcsj/YdjhzzExportService.java b/src/main/java/com/dsic/gj_erp/service/jcsj/YdjhzzExportService.java new file mode 100644 index 0000000..1579b2d --- /dev/null +++ b/src/main/java/com/dsic/gj_erp/service/jcsj/YdjhzzExportService.java @@ -0,0 +1,83 @@ +package com.dsic.gj_erp.service.jcsj; + +import com.dsic.gj_erp.bean.jcsj.YdjhzzVO; +import org.apache.poi.ss.usermodel.*; +import org.apache.poi.xssf.usermodel.XSSFWorkbook; +import org.springframework.core.io.ClassPathResource; +import org.springframework.stereotype.Service; + +import javax.servlet.http.HttpServletResponse; +import java.io.*; +import java.lang.reflect.Field; +import java.net.URLEncoder; +import java.util.List; + +/** + * 预切板计划导出Service + * 前端传数据方式:直接接收前端传来的数据列表,写入Excel模板导出 + */ +@Service +public class YdjhzzExportService { + + private static final String TEMPLATE_PATH = "templates/预切板计划导出模板.xlsx"; + + /** + * 导出Excel(前端传数据方式) + * + * @param dataList 前端传来的数据列表 + * @param response HTTP响应对象 + * @throws Exception 导出异常 + */ + public void export(List dataList, HttpServletResponse response) throws Exception { + // 1. 加载模板文件 + ClassPathResource resource = new ClassPathResource(TEMPLATE_PATH); + try (InputStream templateStream = resource.getInputStream(); + Workbook workbook = new XSSFWorkbook(templateStream)) { + + Sheet sheet = workbook.getSheetAt(0); + if (sheet == null) { + throw new RuntimeException("模板中未找到Sheet"); + } + + // 2. 获取VO的所有字段(按tableColumn顺序声明) + Field[] fields = YdjhzzVO.class.getDeclaredFields(); + int fieldCount = fields.length; + + // 3. 逐行写入数据(从第3行开始,第1行=分组标题,第2行=列标题) + for (YdjhzzVO vo : dataList) { + vo.initLqhj(); + vo.initShhj(); + Row dataRow = sheet.createRow(sheet.getLastRowNum() + 1); + + // 遍历VO的所有字段,按声明顺序写入Excel列 + for (int j = 0; j < fieldCount; j++) { + Field field = fields[j]; + field.setAccessible(true); + Object value = field.get(vo); + + Cell cell = dataRow.createCell(j); + if (value != null) { + if (value instanceof Number) { + cell.setCellValue(((Number) value).doubleValue()); + } else { + cell.setCellValue(value.toString()); + } + } + } + } + + // 4. 设置响应头,触发浏览器下载 + response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"); + response.setCharacterEncoding("utf-8"); + String fileName = URLEncoder.encode("预切板计划.xlsx", "UTF-8"); + response.setHeader("Content-Disposition", "attachment;filename=" + fileName); + + // 5. 写入响应流 + try (OutputStream outputStream = response.getOutputStream()) { + workbook.write(outputStream); + outputStream.flush(); + } + } + } + +} \ No newline at end of file diff --git a/src/main/java/com/dsic/gj_erp/service/钢材到货情况统计Service.java b/src/main/java/com/dsic/gj_erp/service/钢材到货情况统计Service.java index 2409441..9090a93 100644 --- a/src/main/java/com/dsic/gj_erp/service/钢材到货情况统计Service.java +++ b/src/main/java/com/dsic/gj_erp/service/钢材到货情况统计Service.java @@ -19,7 +19,7 @@ public class 钢材到货情况统计Service extends MppServiceImpl<钢材到货 public void init(){ //CronUtil.schedule("0 0 16 * * ?", (Task) this::process); - CronUtil.schedule("*/30 * * * * ?", (Task) this::process); + CronUtil.schedule("0 30 * * * ?", (Task) this::process); System.out.println("初始化定时任务"); } diff --git a/src/main/resources/templates/预切板计划导出模板.xlsx b/src/main/resources/templates/预切板计划导出模板.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..6f3da4532458b36eecc662f7bbb0e2a0cbeb2b06 GIT binary patch literal 12069 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 AkN^Mx literal 0 HcmV?d00001