1.优化跟踪记录导出时页面等待问题

master
董哲奇 2 months ago
parent 42e24a3c01
commit c4b7db92b7

@ -2,6 +2,7 @@ package com.dsic.gj_erp;
import cn.hutool.core.date.DateUtil; import cn.hutool.core.date.DateUtil;
import cn.hutool.core.date.TimeInterval; import cn.hutool.core.date.TimeInterval;
import cn.hutool.core.io.FileUtil;
import cn.hutool.extra.qrcode.QrCodeUtil; import cn.hutool.extra.qrcode.QrCodeUtil;
import cn.hutool.extra.qrcode.QrConfig; import cn.hutool.extra.qrcode.QrConfig;
import com.google.zxing.BarcodeFormat; import com.google.zxing.BarcodeFormat;
@ -19,10 +20,17 @@ import java.awt.geom.Rectangle2D;
import java.awt.image.BufferedImage; import java.awt.image.BufferedImage;
import java.io.File; import java.io.File;
import java.io.IOException; import java.io.IOException;
import java.util.List;
public class Test { public class Test {
public static void main(String[] args) throws IOException { public static void main(String[] args) throws IOException {
List<String> gbk = FileUtil.readLines("D:\\T300K-132_400_erp0909\\T300K-132_400批量型材统计数据_7跨.XC", "GBK");
System.out.println(gbk);
List<String> 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(DateUtil.thisYear());
// System.out.println(StrUtil.padPre("1",3,"0")); // System.out.println(StrUtil.padPre("1",3,"0"));
@ -32,17 +40,17 @@ public class Test {
//System.out.println("aaa = " + String.format("%03d",1)); //System.out.println("aaa = " + String.format("%03d",1));
// MatrixToImageWriter. // MatrixToImageWriter.
TimeInterval timer = DateUtil.timer(); // TimeInterval timer = DateUtil.timer();
String pdfFilePath = "E:\\B058HC104HN第058批量龙门套料图2023-07-20.pdf"; // PDF文件路径 // String pdfFilePath = "E:\\B058HC104HN第058批量龙门套料图2023-07-20.pdf"; // PDF文件路径
PDDocument document = PDDocument.load(new File(pdfFilePath)); // PDDocument document = PDDocument.load(new File(pdfFilePath));
// PDFTextStripper stripper = new PDFTextStripper(); // PDFTextStripper stripper = new PDFTextStripper();
// String text = stripper.getText(document); // String text = stripper.getText(document);
// String[] split = text.split("\\n"); // String[] split = text.split("\\n");
// List<QrCodeDto> list = new ArrayList<>(); // List<QrCodeDto> 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()); //config.setForeColor(Color.CYAN.getRGB());
// 设置背景色(灰色) // 设置背景色(灰色)
@ -80,25 +88,25 @@ public class Test {
// } // }
// } // }
for (int pageNumber = 1; pageNumber < document.getNumberOfPages(); ++pageNumber) { // for (int pageNumber = 1; pageNumber < document.getNumberOfPages(); ++pageNumber) {
PDPage page = document.getPage(pageNumber); // PDPage page = document.getPage(pageNumber);
String textByRegion = getTextByRegion(page, 80, 50, 1100, 40); // String textByRegion = getTextByRegion(page, 80, 50, 1100, 40);
// System.out.println(textByRegion); //// System.out.println(textByRegion);
String[] split = textByRegion.split(" "); // String[] split = textByRegion.split(" ");
String dcch = split[1]; // String dcch = split[1];
String dcpl = split[3]; // String dcpl = split[3];
String tzbh = split[7]; // String tzbh = split[7];
String pageIndex = split[12]; // String pageIndex = split[12];
BufferedImage bufferedImage = QrCodeUtil.generate(String.format("%s_%s_%s", dcch, dcpl, tzbh), config); // BufferedImage bufferedImage = QrCodeUtil.generate(String.format("%s_%s_%s", dcch, dcpl, tzbh), config);
PDPageContentStream contentStream = new PDPageContentStream(document, page, PDPageContentStream.AppendMode.APPEND, true, true); // PDPageContentStream contentStream = new PDPageContentStream(document, page, PDPageContentStream.AppendMode.APPEND, true, true);
PDImageXObject qrCodeImage = JPEGFactory.createFromImage(document, bufferedImage); // PDImageXObject qrCodeImage = JPEGFactory.createFromImage(document, bufferedImage);
contentStream.drawImage(qrCodeImage, 10, 10, 75, 75); // 在PDF中的坐标位置添加二维码 // contentStream.drawImage(qrCodeImage, 10, 10, 75, 75); // 在PDF中的坐标位置添加二维码
contentStream.close(); // contentStream.close();
} // }
document.save("E:/updated_document.pdf"); // document.save("E:/updated_document.pdf");
document.close(); // document.close();
System.out.println(timer.interval()); // System.out.println(timer.interval());
// 输出提取的文本到控制台 // 输出提取的文本到控制台
// System.out.println(text); // System.out.println(text);

@ -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);
}
}

@ -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.service.sy.SYService;
import com.dsic.gj_erp.util.ObjConvertUtils; import com.dsic.gj_erp.util.ObjConvertUtils;
import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiOperation;
import jdk.nashorn.internal.ir.ReturnNode;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;

@ -4,16 +4,21 @@ package com.dsic.gj_erp.controller.jcsj;
import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.dsic.gj_erp.bean.ResultBean; import com.dsic.gj_erp.bean.ResultBean;
import com.dsic.gj_erp.bean.jcsj.Ydjhzz; 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.bean.jhgk.DmYdjh;
import com.dsic.gj_erp.mapper.jhgk.DmYdjhMapper; import com.dsic.gj_erp.mapper.jhgk.DmYdjhMapper;
import com.dsic.gj_erp.service.jcsj.DmBclqmxpService; 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.service.jhgk.DmYdjhService;
import com.dsic.gj_erp.vo.预切板统计VO; import com.dsic.gj_erp.vo.预切板统计VO;
import io.swagger.annotations.Api; import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiOperation;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
@ -35,6 +40,20 @@ public class YdjhzzController {
private final DmBclqmxpService bclqmxpService; private final DmBclqmxpService bclqmxpService;
private final DmYdjhService ydjhService; private final DmYdjhService ydjhService;
private final YdjhzzExportService ydjhzzExportService;
/**
* 服务器端导出预切板计划Excel
* 前端将当前表格已加载的数据列表直接POST提交,后端接收后写入Excel返回文件
*
* @param dataList 前端页面已加载的数据列表
* @param response HttpServletResponse
*/
@PostMapping("/export")
public void exportExcel(@RequestBody List<YdjhzzVO> dataList, HttpServletResponse response) throws Exception {
ydjhzzExportService.export(dataList, response);
}
@PostMapping @PostMapping
public ResultBean<?> yqbtjcx(@RequestBody Map<String,String> map){ public ResultBean<?> yqbtjcx(@RequestBody Map<String,String> map){
List<预切板统计VO> list = bclqmxpService.预切板统计查询(map); List<预切板统计VO> list = bclqmxpService.预切板统计查询(map);

@ -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<YdjhzzVO> 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();
}
}
}
}

@ -19,7 +19,7 @@ public class 钢材到货情况统计Service extends MppServiceImpl<钢材到货
public void init(){ public void init(){
//CronUtil.schedule("0 0 16 * * ?", (Task) this::process); //CronUtil.schedule("0 0 16 * * ?", (Task) this::process);
CronUtil.schedule("*/30 * * * * ?", (Task) this::process); CronUtil.schedule("0 30 * * * ?", (Task) this::process);
System.out.println("初始化定时任务"); System.out.println("初始化定时任务");
} }

Loading…
Cancel
Save