From cbcae37f235b2c5256aaa3aa23218b593221c19b Mon Sep 17 00:00:00 2001 From: aike <17730485278@139.com> Date: Fri, 12 Dec 2025 13:13:24 +0800 Subject: [PATCH] =?UTF-8?q?demand:=20=20=20=20TMS-=E5=AE=A2=E6=88=B7?= =?UTF-8?q?=E8=B4=A6=E5=8D=95=E7=AE=A1=E7=90=86-=E4=B8=9A=E5=8A=A1?= =?UTF-8?q?=E8=B4=A6=E5=8D=95=E7=A1=AE=E8=AE=A4-=E6=B5=B7=E8=BF=90?= =?UTF-8?q?=E8=B4=A6=E5=8D=95=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../impl/EmisSettleBillServiceImpl.java | 103 ++++++++++++++++-- .../mapper/EmisSettleSubBillFeeitemMapper.xml | 4 +- 2 files changed, 96 insertions(+), 11 deletions(-) diff --git a/emis-biz/src/main/java/com/xdadan/erp/emis/service/impl/EmisSettleBillServiceImpl.java b/emis-biz/src/main/java/com/xdadan/erp/emis/service/impl/EmisSettleBillServiceImpl.java index 6df1c0373..eb3c622c5 100644 --- a/emis-biz/src/main/java/com/xdadan/erp/emis/service/impl/EmisSettleBillServiceImpl.java +++ b/emis-biz/src/main/java/com/xdadan/erp/emis/service/impl/EmisSettleBillServiceImpl.java @@ -21,8 +21,13 @@ import cn.hutool.core.map.MapUtil; import com.alibaba.excel.EasyExcel; import com.alibaba.excel.ExcelWriter; import com.alibaba.excel.support.ExcelTypeEnum; +import com.alibaba.excel.write.handler.AbstractCellWriteHandler; +import com.alibaba.excel.metadata.data.WriteCellData; +import com.alibaba.excel.metadata.Head; import com.alibaba.excel.write.metadata.WriteSheet; import com.alibaba.excel.write.metadata.WriteTable; +import com.alibaba.excel.write.metadata.holder.WriteSheetHolder; +import com.alibaba.excel.write.metadata.holder.WriteTableHolder; import com.alibaba.excel.write.metadata.style.WriteCellStyle; import com.alibaba.excel.write.metadata.style.WriteFont; import com.alibaba.excel.write.style.HorizontalCellStyleStrategy; @@ -46,8 +51,11 @@ import org.apache.commons.collections.CollectionUtils; import org.apache.commons.collections.MapUtils; import org.apache.commons.io.IOUtils; import org.apache.poi.ss.usermodel.HorizontalAlignment; +import org.apache.poi.ss.usermodel.BorderStyle; import org.apache.poi.ss.usermodel.IndexedColors; import org.apache.poi.ss.usermodel.VerticalAlignment; +import org.apache.poi.ss.usermodel.FillPatternType; +import org.apache.poi.ss.usermodel.Cell; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import com.xdadan.erp.emis.service.IEmisSettleBillService; @@ -1245,6 +1253,8 @@ public class EmisSettleBillServiceImpl extends EmisBaseService implements IEmisS // 结算对象 String settlement = Optional.ofNullable(list.get(0)).map(e -> StringUtil.isNotBlank(e.getCustName()) ? e.getCustName() : e.getCustomerName()).orElse(""); + settlement = Optional.ofNullable(settlement).orElse("").replace("ST", ""); + final String settlementDisplay = settlement; // 根据运单号查询运单详情 List emisWaybills = emisSettleSubBillFeeitemMapper @@ -1303,36 +1313,106 @@ public class EmisSettleBillServiceImpl extends EmisBaseService implements IEmisS ExcelWriter excelWriter = EasyExcel.write(outputStream).excelType(ExcelTypeEnum.XLSX).build(); List> contentHeader = this.buildHeader(); - HorizontalCellStyleStrategy horizontalCellStyleStrategy = new HorizontalCellStyleStrategy(null, + WriteCellStyle headWriteCellStyle = new WriteCellStyle(); + headWriteCellStyle.setVerticalAlignment(VerticalAlignment.CENTER); + headWriteCellStyle.setHorizontalAlignment(HorizontalAlignment.CENTER); + + AbstractCellWriteHandler headerStyleHandler = new AbstractCellWriteHandler() { + @Override + public void afterCellDispose(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, + List> cellDataList, Cell cell, Head head, + Integer relativeRowIndex, Boolean isHead) { + if (!Boolean.TRUE.equals(isHead)) { + return; + } + int rowIndex = cell.getRowIndex(); + WriteCellStyle style = cellDataList.get(0).getOrCreateStyle(); + WriteFont font = style.getWriteFont(); + if (font == null) { + font = new WriteFont(); + style.setWriteFont(font); + } + switch (rowIndex) { + case 0: + font.setFontHeightInPoints((short) 8); + font.setBold(Boolean.FALSE); + font.setColor(IndexedColors.BLACK.getIndex()); + style.setHorizontalAlignment(HorizontalAlignment.LEFT); + break; + case 1: + font.setFontHeightInPoints((short) 14); + font.setBold(Boolean.FALSE); + font.setColor(IndexedColors.BLACK.getIndex()); + style.setHorizontalAlignment(HorizontalAlignment.CENTER); + break; + case 3: + font.setFontHeightInPoints((short) 12); + font.setBold(Boolean.TRUE); + font.setColor(IndexedColors.RED.getIndex()); + style.setFillForegroundColor(IndexedColors.WHITE.getIndex()); + style.setFillPatternType(FillPatternType.SOLID_FOREGROUND); + style.setHorizontalAlignment(HorizontalAlignment.CENTER); + break; + default: + break; + } + cellDataList.get(0).setWriteCellStyle(style); + } + }; + + HorizontalCellStyleStrategy horizontalCellStyleStrategy = new HorizontalCellStyleStrategy(headWriteCellStyle, contentWriteCellStyle); + // 样式:日期行单独,后续保持原样 + WriteCellStyle dateContentStyle = new WriteCellStyle(); + dateContentStyle.setVerticalAlignment(VerticalAlignment.CENTER); + dateContentStyle.setHorizontalAlignment(HorizontalAlignment.LEFT); + dateContentStyle.setBorderLeft(BorderStyle.THIN); + dateContentStyle.setBorderRight(BorderStyle.THIN); + dateContentStyle.setBorderTop(BorderStyle.THIN); + dateContentStyle.setBorderBottom(BorderStyle.THIN); + WriteFont dateFont = new WriteFont(); + dateFont.setFontName("微软雅黑"); + dateFont.setFontHeightInPoints((short) 8); + dateContentStyle.setWriteFont(dateFont); + + // 日期行:单独写入并使用独立样式,按列头数量合并 + WriteSheet dateSheet = EasyExcel.writerSheet("sheet").needHead(Boolean.FALSE) + .registerWriteHandler(new HorizontalCellStyleStrategy(null, dateContentStyle)) + .registerWriteHandler(headerStyleHandler) + .registerWriteHandler(new CellStyleStrategy(new WriteCellStyle())).build(); + List> headerDate = contentHeader.stream() + .map(item -> Collections.singletonList("出账日期:" + date)) + .collect(Collectors.toList()); + WriteTable tDate = EasyExcel.writerTable(0).needHead(Boolean.TRUE).head(headerDate).build(); + excelWriter.write((Collection) null, dateSheet, tDate); + // 构建大表头 WriteSheet writeSheet1 = EasyExcel.writerSheet("sheet").needHead(Boolean.FALSE) .registerWriteHandler(horizontalCellStyleStrategy) + .registerWriteHandler(headerStyleHandler) .registerWriteHandler(new CellStyleStrategy(new WriteCellStyle())).build(); + List> header1 = contentHeader.stream().map(item -> Collections.singletonList("探路供应链(上海)")) .collect(Collectors.toList()); - WriteTable t1 = EasyExcel.writerTable(0).needHead(Boolean.TRUE).head(header1).build(); + WriteTable t1 = EasyExcel.writerTable(1).needHead(Boolean.TRUE).head(header1).build(); excelWriter.write((Collection) null, writeSheet1, t1); List> header2 = contentHeader.stream() .map(item -> Collections.singletonList(year + "年" + month + "月海运费确认书")) .collect(Collectors.toList()); - WriteTable t2 = EasyExcel.writerTable(1).needHead(Boolean.TRUE).head(header2).build(); + WriteTable t2 = EasyExcel.writerTable(2).needHead(Boolean.TRUE).head(header2).build(); excelWriter.write((Collection) null, writeSheet1, t2); List> header3 = contentHeader.stream() - .map(item -> Collections.singletonList("结算对象:" + settlement)) + .map(item -> Collections.singletonList("结算对象:" + settlementDisplay)) .collect(Collectors.toList()); - header3.set(9, Collections.singletonList("出账日期:" + date)); - header3.set(10, Collections.singletonList("出账日期:" + date)); - header3.set(11, Collections.singletonList("出账日期:" + date)); - WriteTable t3 = EasyExcel.writerTable(2).needHead(Boolean.TRUE).head(header3).build(); + WriteTable t3 = EasyExcel.writerTable(3).needHead(Boolean.TRUE).head(header3).build(); excelWriter.write((Collection) null, writeSheet1, t3); log.info("Building a large header is success"); List excelKey = emisWaybillMap.keySet().stream().collect(Collectors.toList()); - int num = 3; + int num = 4; for (int i = 0; i < excelKey.size(); i++) { List> result = new ArrayList<>(); Map subtotalMap = new HashMap<>(); @@ -1341,6 +1421,7 @@ public class EmisSettleBillServiceImpl extends EmisBaseService implements IEmisS List settleSubBillFeeitemList = emisWaybill.getSettleSubBillFeeitemList(); calculateSubtotal(settleSubBillFeeitemList, subtotalMap); settleSubBillFeeitemList.forEach(item -> { + String remark = Optional.ofNullable(item.getRemark()).orElse(""); result.add(Lists.newArrayList(emisWaybill.getLadingBillCode(), emisWaybill.getBillCode(), emisWaybill.getCompanyCode(), emisWaybill.getDeparturePortName(), emisWaybill.getDestinationPortName(), emisWaybill.getBoxQuantity(), @@ -1348,7 +1429,8 @@ public class EmisSettleBillServiceImpl extends EmisBaseService implements IEmisS emisWaybill.getBillWeight().stripTrailingZeros().toPlainString(), emisWaybill.getTotalVolume().stripTrailingZeros().toPlainString(), item.getFeeName(), item.getCurrency(), - item.getBillFee().stripTrailingZeros().toPlainString())); + item.getBillFee().stripTrailingZeros().toPlainString(), + remark)); }); // 小表头 WriteSheet sheet = EasyExcel.writerSheet("sheet") @@ -1416,6 +1498,7 @@ public class EmisSettleBillServiceImpl extends EmisBaseService implements IEmisS header.add(Collections.singletonList("费用名称")); header.add(Collections.singletonList("币种")); header.add(Collections.singletonList("金额")); + header.add(Collections.singletonList("备注")); return header; } diff --git a/emis-biz/src/main/resources/mapper/EmisSettleSubBillFeeitemMapper.xml b/emis-biz/src/main/resources/mapper/EmisSettleSubBillFeeitemMapper.xml index 48f174587..8314723a2 100644 --- a/emis-biz/src/main/resources/mapper/EmisSettleSubBillFeeitemMapper.xml +++ b/emis-biz/src/main/resources/mapper/EmisSettleSubBillFeeitemMapper.xml @@ -41,6 +41,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" + @@ -66,7 +67,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" b.bill_fee, b.orig_fee, b.currency, - b.order_num + b.order_num, + b.remark from emis_waybill a left join emis_settle_sub_bill_feeitem b on a.bill_code = b.bill_code and b.del_flag = '0' left join emis_site seaway1 on a.departure_port=seaway1.site_code and seaway1.del_flag='0'