From 6a9780369c4b0ea102c28070b5c6981e2df08c5e Mon Sep 17 00:00:00 2001 From: aike <17730485278@139.com> Date: Wed, 9 Apr 2025 13:46:15 +0800 Subject: [PATCH] =?UTF-8?q?demand:=20=E8=B4=A6=E5=8D=95=E5=AF=BC=E5=87=BA?= =?UTF-8?q?=EF=BC=9A=E5=9C=A8=E5=AE=A2=E6=88=B7=E8=B4=A6=E5=8D=95=E7=AE=A1?= =?UTF-8?q?=E7=90=86=E6=A8=A1=E5=9D=97=E4=B8=AD=EF=BC=8C=E5=BD=93=E9=80=89?= =?UTF-8?q?=E6=8B=A9=E6=B5=B7=E8=BF=90=E7=9B=B8=E5=85=B3=E8=BF=90=E5=8D=95?= =?UTF-8?q?=E6=97=B6=EF=BC=8C=E7=B3=BB=E7=BB=9F=E8=A6=81=E6=94=AF=E6=8C=81?= =?UTF-8?q?=E4=B8=8A=E8=BF=B0=E6=A8=A1=E7=89=88=E5=AF=BC=E5=87=BA=EF=BC=8C?= =?UTF-8?q?=E5=AF=BC=E5=87=BA=E7=9A=84=E8=B4=A6=E5=8D=95=E8=A1=A8=E6=A0=BC?= =?UTF-8?q?=E8=A6=81=E5=8C=85=E5=90=AB=E6=8F=90=E5=8D=95=E5=8F=B7=E3=80=81?= =?UTF-8?q?=E9=9D=A2=E5=8D=95=E5=8F=B7=E3=80=81=E8=B4=B5=E5=8F=B8=E7=BC=96?= =?UTF-8?q?=E5=8F=B7=EF=BC=88=E5=A6=82=E6=B2=A1=E6=9C=89=E5=A1=AB=EF=BC=8C?= =?UTF-8?q?=E8=BE=93=E5=87=BA=E4=B8=BA=E7=A9=BA=EF=BC=89=E3=80=81=E8=B5=B7?= =?UTF-8?q?=E8=BF=90=E6=B8=AF=E3=80=81=E7=9B=AE=E7=9A=84=E6=B8=AF=E3=80=81?= =?UTF-8?q?=E7=AE=B1=E9=87=8F=E3=80=81=E4=BB=B6=E6=95=B0=E3=80=81=E6=AF=9B?= =?UTF-8?q?=E9=87=8D=E3=80=81=E4=BD=93=E7=A7=AF=E3=80=81=E8=B4=B9=E7=94=A8?= =?UTF-8?q?=E5=90=8D=E7=A7=B0=E3=80=81=E5=B8=81=E7=A7=8D=E3=80=81=E9=87=91?= =?UTF-8?q?=E9=A2=9D=20committer:=20heyu?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../web/emis/EmisSettleBillController.java | 34 +-- .../emis/domain/EmisWaybillAndFeeitem.java | 85 ++++++ .../EmisSettleSubBillFeeitemMapper.java | 6 + .../emis/service/IEmisSettleBillService.java | 4 + .../excelCellStrategy/CellStyleStrategy.java | 94 +++++++ .../impl/EmisSettleBillServiceImpl.java | 247 +++++++++++++++++- .../mapper/EmisSettleSubBillFeeitemMapper.xml | 51 ++++ 7 files changed, 505 insertions(+), 16 deletions(-) create mode 100644 emis-biz/src/main/java/com/xdadan/erp/emis/domain/EmisWaybillAndFeeitem.java create mode 100644 emis-biz/src/main/java/com/xdadan/erp/emis/service/excelCellStrategy/CellStyleStrategy.java diff --git a/emis-biz-web/src/main/java/com/xdadan/erp/web/emis/EmisSettleBillController.java b/emis-biz-web/src/main/java/com/xdadan/erp/web/emis/EmisSettleBillController.java index dbd26a76d..b97ab5fdb 100644 --- a/emis-biz-web/src/main/java/com/xdadan/erp/web/emis/EmisSettleBillController.java +++ b/emis-biz-web/src/main/java/com/xdadan/erp/web/emis/EmisSettleBillController.java @@ -17,9 +17,11 @@ import java.math.BigDecimal; import java.net.URLEncoder; import java.nio.charset.StandardCharsets; import java.util.*; +import java.util.stream.Collectors; import javax.servlet.ServletOutputStream; import javax.servlet.http.HttpServletResponse; +import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.io.resource.ResourceUtil; import cn.hutool.core.map.MapUtil; import com.alibaba.excel.EasyExcel; @@ -27,29 +29,26 @@ import com.alibaba.excel.ExcelWriter; import com.alibaba.excel.support.ExcelTypeEnum; import com.alibaba.excel.util.MapUtils; import com.alibaba.excel.write.metadata.WriteSheet; +import com.alibaba.excel.write.metadata.WriteTable; import com.alibaba.excel.write.metadata.fill.FillConfig; +import com.alibaba.excel.write.metadata.style.WriteCellStyle; +import com.alibaba.excel.write.metadata.style.WriteFont; +import com.alibaba.excel.write.style.HorizontalCellStyleStrategy; import com.alibaba.fastjson.JSON; -import com.alibaba.fastjson.JSONObject; +import com.beust.jcommander.internal.Lists; import com.xdadan.erp.common.utils.DateUtils; import com.xdadan.erp.common.utils.DictUtils; -import com.xdadan.erp.emis.domain.EmisExchangeRate; -import com.xdadan.erp.emis.domain.EmisSettleSubBill; -import com.xdadan.erp.emis.domain.EmisSettleSubBillFeeitem; +import com.xdadan.erp.emis.domain.*; import com.xdadan.erp.emis.domain.exception.EmisBizError; import com.xdadan.erp.emis.domain.stat.BillPayStatInfo; import com.xdadan.erp.emis.domain.stat.OpenBillStatInfo; -import com.xdadan.erp.emis.domain.vo.scan.ScanResult; -import com.xdadan.erp.emis.service.EmisBaseService; -import com.xdadan.erp.emis.service.IEmisExchangeRateService; -import com.xdadan.erp.emis.service.IEmisSettleBillPayLogService; -import com.xdadan.erp.emis.service.billexport.ExcelUtils; -import com.xdadan.erp.emis.service.billexport.MapObjectUtil; +import com.xdadan.erp.emis.mapper.EmisSettleSubBillFeeitemMapper; +import com.xdadan.erp.emis.service.*; +import com.xdadan.erp.emis.service.test.CustomCellWriteHandler; import com.xdadan.erp.emis.utils.WaybillHelper; -import org.apache.commons.io.Charsets; import org.apache.commons.io.IOUtils; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.core.io.ClassPathResource; import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.util.CollectionUtils; import org.springframework.web.bind.annotation.GetMapping; @@ -67,9 +66,7 @@ import com.xdadan.erp.common.core.domain.AjaxResult; import com.xdadan.erp.common.core.page.TableDataInfo; import com.xdadan.erp.common.enums.BusinessType; import com.xdadan.erp.common.utils.poi.ExcelUtil; - -import com.xdadan.erp.emis.domain.EmisSettleBill; -import com.xdadan.erp.emis.service.IEmisSettleBillService; +import org.apache.poi.ss.usermodel.*; /** * 结算总账单Controller @@ -511,6 +508,13 @@ public class EmisSettleBillController extends BaseController return AjaxResult.success("确认成功"); } + @Log(title = "导出海运账单", businessType = BusinessType.EXPORT) + @PostMapping("/exportSeaWayBill") + public void exportSeaWayBill(HttpServletResponse response, EmisSettleBill emisSettleBill) { + + emisSettleBillService.exportSeaWayBill(response, emisSettleBill); + } + @Log(title = "导出账单", businessType = BusinessType.EXPORT) @PostMapping("/exportBill") public void exportBill(HttpServletResponse response, EmisSettleBill emisSettleBill) diff --git a/emis-biz/src/main/java/com/xdadan/erp/emis/domain/EmisWaybillAndFeeitem.java b/emis-biz/src/main/java/com/xdadan/erp/emis/domain/EmisWaybillAndFeeitem.java new file mode 100644 index 000000000..7a6132aaf --- /dev/null +++ b/emis-biz/src/main/java/com/xdadan/erp/emis/domain/EmisWaybillAndFeeitem.java @@ -0,0 +1,85 @@ +/** + * @Project: emis + * @Title: EmisWaybill.java + * @author linfso + * @date 2024-04-11 05:48:01 + * @Copyright: ShangHai Duta 2022 All rights reserved. + * @version v1.0 + * @Description:

运单列表 实体类

+ */ + +package com.xdadan.erp.emis.domain; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.fasterxml.jackson.annotation.JsonFormat; +import com.xdadan.erp.common.annotation.audit.DataAuditField; +import com.xdadan.erp.common.annotation.audit.DataAuditTable; +import com.xdadan.erp.common.core.domain.BaseEntity; +import lombok.Data; + +import java.math.BigDecimal; +import java.util.Date; +import java.util.List; + + +/** + * @ClassName EmisWaybillAndFeeitem + * @Description 运单列表 + * @author heyu + * @date 2025-04-03 11:48:01 + */ +@Data +@TableName("emis_waybill") +@DataAuditTable(tableName = "emis_waybill",tableComment = "运单列表") +public class EmisWaybillAndFeeitem extends BaseEntity +{ + private static final long serialVersionUID = 1L; + + @TableId(value = "id",type = IdType.AUTO) + private Long id; + + private String uuid; + + @TableField + @DataAuditField(fieldComment = "探路者面单号") + private String billCode ; + + @TableField + @DataAuditField(fieldComment = "提单号(记录海运提单信息)") + private String ladingBillCode ; + + @TableField + @DataAuditField(fieldComment = "贵司编号(记录相关业务的贵司编号)") + private String companyCode ; + + @TableField + @DataAuditField(fieldComment = "起运港") + private String departurePort ; + + @TableField + @DataAuditField(fieldComment = "目的港") + private String destinationPort; + + @TableField + @DataAuditField(fieldComment = "箱量") + private String boxQuantity; + + @TableField + @DataAuditField(fieldComment = "件数") + private Integer parcelQty; + + @TableField + @DataAuditField(fieldComment = "毛重") + private BigDecimal billWeight; + + @TableField + @DataAuditField(fieldComment = "体积") + private BigDecimal totalVolume; + + // 子账单费用明细信息 + @TableField(exist = false) + private List settleSubBillFeeitemList; +} diff --git a/emis-biz/src/main/java/com/xdadan/erp/emis/mapper/EmisSettleSubBillFeeitemMapper.java b/emis-biz/src/main/java/com/xdadan/erp/emis/mapper/EmisSettleSubBillFeeitemMapper.java index 594369447..5c97dac16 100644 --- a/emis-biz/src/main/java/com/xdadan/erp/emis/mapper/EmisSettleSubBillFeeitemMapper.java +++ b/emis-biz/src/main/java/com/xdadan/erp/emis/mapper/EmisSettleSubBillFeeitemMapper.java @@ -13,6 +13,10 @@ package com.xdadan.erp.emis.mapper; import java.util.List; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.xdadan.erp.emis.domain.EmisSettleSubBillFeeitem; +import com.xdadan.erp.emis.domain.EmisWaybill; +import com.xdadan.erp.emis.domain.EmisWaybillAndFeeitem; +import org.apache.ibatis.annotations.Param; + /** * @ClassName EmisSettleSubBillFeeitemMapper * @Description

子账单费用明细 Mapper 接口

@@ -80,4 +84,6 @@ public interface EmisSettleSubBillFeeitemMapper extends BaseMapper selectEmisWaybillListByBillCodeList(@Param("billCodeList") List billCodeList); } diff --git a/emis-biz/src/main/java/com/xdadan/erp/emis/service/IEmisSettleBillService.java b/emis-biz/src/main/java/com/xdadan/erp/emis/service/IEmisSettleBillService.java index be1f117b4..6ad7e1af4 100644 --- a/emis-biz/src/main/java/com/xdadan/erp/emis/service/IEmisSettleBillService.java +++ b/emis-biz/src/main/java/com/xdadan/erp/emis/service/IEmisSettleBillService.java @@ -17,6 +17,8 @@ import com.xdadan.erp.emis.domain.exception.EmisBizError; import com.xdadan.erp.emis.domain.stat.BillPayStatInfo; import com.xdadan.erp.emis.domain.stat.OpenBillStatInfo; +import javax.servlet.http.HttpServletResponse; + /** * @ClassName EmisSettleBillService * @Description 结算总账单 @@ -123,4 +125,6 @@ public interface IEmisSettleBillService extends IDataAuditService * @return */ public int reCalcSettleBillPayStatus(String settleBillNo); + + void exportSeaWayBill(HttpServletResponse response, EmisSettleBill emisSettleBill); } diff --git a/emis-biz/src/main/java/com/xdadan/erp/emis/service/excelCellStrategy/CellStyleStrategy.java b/emis-biz/src/main/java/com/xdadan/erp/emis/service/excelCellStrategy/CellStyleStrategy.java new file mode 100644 index 000000000..4155bcab4 --- /dev/null +++ b/emis-biz/src/main/java/com/xdadan/erp/emis/service/excelCellStrategy/CellStyleStrategy.java @@ -0,0 +1,94 @@ +package com.xdadan.erp.emis.service.excelCellStrategy; + +import com.alibaba.excel.metadata.data.WriteCellData; +import com.alibaba.excel.write.handler.context.CellWriteHandlerContext; +import com.alibaba.excel.write.metadata.style.WriteCellStyle; +import com.alibaba.excel.write.metadata.style.WriteFont; +import com.alibaba.excel.write.style.HorizontalCellStyleStrategy; +import org.apache.poi.ss.usermodel.*; + +/** + * @author heyu + * @ClassName CellStyleStrategy.java + * @Description CellStyleStrategy + * @createTime 2025年04月09日 + */ +public class CellStyleStrategy extends HorizontalCellStyleStrategy { + + + private final WriteCellStyle headWriteCellStyle; + + public CellStyleStrategy(WriteCellStyle headWriteCellStyle) { + this.headWriteCellStyle = headWriteCellStyle; + } + + @Override + protected void setHeadCellStyle(CellWriteHandlerContext context) { + + context.getWriteSheetHolder().getSheet().setColumnWidth(0, (int) (15.88 * 256)); + context.getWriteSheetHolder().getSheet().setColumnWidth(1, (int) (20.5 * 256)); + context.getWriteSheetHolder().getSheet().setColumnWidth(2, (int) (10 * 256)); + context.getWriteSheetHolder().getSheet().setColumnWidth(3, (int) (12.5 * 256)); + context.getWriteSheetHolder().getSheet().setColumnWidth(4, (int) (18.75 * 256)); +// context.getWriteSheetHolder().getSheet().addMergedRegion(new CellRangeAddress(2,2,0,8)); +// context.getWriteSheetHolder().getSheet().addMergedRegion(new CellRangeAddress(2,2,9,11)); + // 根据行索引为不同级别的表头应用不同样式 + if (context.getRowIndex() == 0) { + setRowStyle(context, (short) (27.75 * 20), (short) 14, IndexedColors.BLACK.getIndex(), false,IndexedColors.WHITE.getIndex()); + } else if (context.getRowIndex() > 0 && context.getRowIndex() < 3) { + setRowStyle(context, (short) (27.75 * 20), (short) 12, IndexedColors.RED.getIndex(), true,IndexedColors.WHITE.getIndex()); + if (context.getCell().getStringCellValue().contains("出账日期")) { + context.getRow().setHeight((short) (32 * 20)); + } + } else if (context.getRow().getCell(0).getStringCellValue().contains("总计")) { + headWriteCellStyle.setHorizontalAlignment(HorizontalAlignment.RIGHT); + setRowStyle(context, (short) (23 * 20), (short) 8, IndexedColors.RED.getIndex(), true,IndexedColors.WHITE.getIndex()); + } else if (context.getRow().getCell(0).getStringCellValue().contains("小计")) { + headWriteCellStyle.setHorizontalAlignment(HorizontalAlignment.RIGHT); + setRowStyle(context, (short) (23 * 20), (short) 8, IndexedColors.BLACK.getIndex(), false,IndexedColors.WHITE.getIndex()); + } else { + headWriteCellStyle.setHorizontalAlignment(HorizontalAlignment.CENTER); + setRowStyle(context, (short) (23 * 20), (short) 10, IndexedColors.BLACK.getIndex(), true,IndexedColors.YELLOW.getIndex()); +// Workbook workbook = context.getWriteContext().getWorkbook(); +// CellStyle cellStyle = workbook.createCellStyle(); +// Font cellFont = workbook.createFont(); +// cellFont.setBold(false); +// cellStyle.setFont(cellFont); +// Cell cell = context.getCell(); +// if("贵司编号".equals(cell.getStringCellValue())){ +// cellStyle.setFillForegroundColor(IndexedColors.BLUE.getIndex()); +// cellStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND); +// cell.setCellStyle(cellStyle); +// }else { +// cellStyle.setFillForegroundColor(IndexedColors.GREEN.getIndex()); +// cellStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND); +// cell.setCellStyle(cellStyle); +// } + + } + + if (stopProcessing(context)) { + return; + } + WriteCellData cellData = context.getFirstCellData(); + WriteCellStyle.merge(this.headWriteCellStyle, cellData.getOrCreateStyle()); + } + + protected void setContentCellStyle(CellWriteHandlerContext context) { + context.getRow().setHeight((short) (23 * 20)); + } + + private void setRowStyle(CellWriteHandlerContext context, short height, short fontSize, short fontColor, boolean isBold, short backgroundColor) { + context.getRow().setHeight(height); + // 背景色 + headWriteCellStyle.setFillForegroundColor(backgroundColor); + // 创建字体实例 + WriteFont cellWriteFont = new WriteFont(); + // 设置字体大小 + cellWriteFont.setFontName("微软雅黑"); + cellWriteFont.setFontHeightInPoints(fontSize); + cellWriteFont.setColor(fontColor); + cellWriteFont.setBold(isBold); + headWriteCellStyle.setWriteFont(cellWriteFont); + } +} 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 11f5f606a..ccecb7339 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 @@ -11,10 +11,22 @@ package com.xdadan.erp.emis.service.impl; import java.math.BigDecimal; +import java.net.URLEncoder; +import java.nio.charset.StandardCharsets; import java.util.*; +import java.util.stream.Collectors; import cn.hutool.core.collection.CollectionUtil; -import com.xdadan.erp.common.core.domain.AjaxResult; +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.metadata.WriteSheet; +import com.alibaba.excel.write.metadata.WriteTable; +import com.alibaba.excel.write.metadata.style.WriteCellStyle; +import com.alibaba.excel.write.metadata.style.WriteFont; +import com.alibaba.excel.write.style.HorizontalCellStyleStrategy; +import com.beust.jcommander.internal.Lists; import com.xdadan.erp.common.utils.DateUtils; import com.xdadan.erp.common.utils.StringUtils; import com.xdadan.erp.emis.domain.*; @@ -25,15 +37,24 @@ import com.xdadan.erp.emis.domain.stat.BillPayStatInfo; import com.xdadan.erp.emis.domain.stat.OpenBillStatInfo; import com.xdadan.erp.emis.mapper.*; import com.xdadan.erp.emis.service.EmisBaseService; +import com.xdadan.erp.emis.service.excelCellStrategy.CellStyleStrategy; +import com.xdadan.erp.emis.service.test.CustomCellWriteHandler; import com.xdadan.erp.emis.utils.WaybillHelper; import lombok.extern.slf4j.Slf4j; 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.IndexedColors; +import org.apache.poi.ss.usermodel.VerticalAlignment; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import com.xdadan.erp.emis.service.IEmisSettleBillService; import org.springframework.transaction.annotation.Transactional; +import javax.servlet.ServletOutputStream; +import javax.servlet.http.HttpServletResponse; + /** * 结算总账单Service业务层处理 * @@ -60,6 +81,12 @@ public class EmisSettleBillServiceImpl extends EmisBaseService implements IEmisS @Autowired private EmisSettlePayRelMapper emisSettlePayRelMapper; + @Autowired + private EmisBaseService emisBaseService; + + @Autowired + private EmisSettleSubBillFeeitemMapper emisSettleSubBillFeeitemMapper; + /** * 获取稽核数据 * @param id @@ -807,6 +834,224 @@ public class EmisSettleBillServiceImpl extends EmisBaseService implements IEmisS return 1; } + @Override + public void exportSeaWayBill(HttpServletResponse response, EmisSettleBill emisSettleBill) { + try { + log.info("cd exportSeaWayBill , emisSettleBill,{}", emisSettleBill); + + Map textMap = new HashMap<>(); + + // 总账单 + EmisSettleBill bill = emisBaseService.getSettleBillBySettleBillNo(emisSettleBill.getSettleBillNo()); + + // 子账单 + List list = emisBaseService.selectSubBillListBySettleBillNo(emisSettleBill.getSettleBillNo()); + + // 运单号 + List billCodeList = list.stream() + .map(EmisSettleSubBill::getBillCode) + .collect(Collectors.toList()); + if (org.springframework.util.CollectionUtils.isEmpty(list) || org.springframework.util.CollectionUtils.isEmpty(billCodeList)) { + return; + } + + // 根据运单号查询运单详情 + List emisWaybills = emisSettleSubBillFeeitemMapper.selectEmisWaybillListByBillCodeList(billCodeList); + Map emisWaybillMap = emisWaybills.stream().collect(Collectors.toMap(EmisWaybillAndFeeitem::getBillCode, i -> i)); + if (MapUtil.isEmpty(emisWaybillMap) || org.springframework.util.CollectionUtils.isEmpty(emisWaybills)) { + return; + } + log.info("select emisWaybills is success, emisWaybills,{}", emisWaybills); + + // 运单费用条目 + List emisWaybillFeeitemList = new ArrayList<>(); + emisWaybills.forEach(emisWaybill -> { + if (Objects.nonNull(emisWaybill) && CollectionUtil.isNotEmpty(emisWaybill.getSettleSubBillFeeitemList())) { + emisWaybillFeeitemList.addAll(emisWaybill.getSettleSubBillFeeitemList()); + } + }); + calculateTotal(emisWaybillFeeitemList, textMap); + log.info("get textMap is success, textMap,{}", textMap); + + // 出账日期 + String date = DateUtils.parseDateToStr("yyyy.M.dd", list.get(0).getBillDate()); + String year = DateUtils.parseDateToStr("yyyy", list.get(0).getBillDate()); + String month = DateUtils.parseDateToStr("M", list.get(0).getBillDate()); + +// String filePath = "D:\\log\\stduent_01.xlsx"; + ServletOutputStream outputStream = response.getOutputStream(); + + //内容的策略 + WriteCellStyle contentWriteCellStyle = new WriteCellStyle(); + contentWriteCellStyle.setFillForegroundColor(IndexedColors.WHITE.getIndex()); + contentWriteCellStyle.setVerticalAlignment(VerticalAlignment.CENTER); + contentWriteCellStyle.setHorizontalAlignment(HorizontalAlignment.CENTER); + WriteFont contentWriteFont = new WriteFont(); + contentWriteFont.setFontName("微软雅黑"); + contentWriteFont.setFontHeightInPoints((short) 8); + contentWriteCellStyle.setWriteFont(contentWriteFont); + + ExcelWriter excelWriter = EasyExcel.write(outputStream).excelType(ExcelTypeEnum.XLSX).build(); + List> contentHeader = this.buildHeader(); + HorizontalCellStyleStrategy horizontalCellStyleStrategy = + new HorizontalCellStyleStrategy(null, contentWriteCellStyle); + // 构建大表头 + WriteSheet writeSheet1 = EasyExcel.writerSheet("sheet").needHead(Boolean.FALSE) + .registerWriteHandler(horizontalCellStyleStrategy) + .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(); + 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(); + excelWriter.write((Collection) null, writeSheet1, t2); + + List> header3 = contentHeader.stream().map(item -> Collections.singletonList("结算对象:探路供应链公司")).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(); + 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; + for (int i = 0; i < excelKey.size(); i++) { + List> result = new ArrayList<>(); + Map subtotalMap = new HashMap<>(); + + EmisWaybillAndFeeitem emisWaybill = emisWaybillMap.get(excelKey.get(i)); + List settleSubBillFeeitemList = emisWaybill.getSettleSubBillFeeitemList(); + calculateSubtotal(settleSubBillFeeitemList, subtotalMap); + settleSubBillFeeitemList.forEach(item -> { + result.add(Lists.newArrayList(emisWaybill.getLadingBillCode(), emisWaybill.getBillCode(), emisWaybill.getCompanyCode(), emisWaybill.getDeparturePort(), + emisWaybill.getDestinationPort(), emisWaybill.getBoxQuantity(), String.valueOf(emisWaybill.getParcelQty()), + emisWaybill.getBillWeight().stripTrailingZeros().toPlainString(), + emisWaybill.getTotalVolume().stripTrailingZeros().toPlainString(), + item.getFeeName(), item.getCurrency(), item.getBillFee().stripTrailingZeros().toPlainString() + )); + }); + // 小表头 + WriteSheet sheet = EasyExcel.writerSheet("sheet") + .needHead(Boolean.FALSE) + .registerWriteHandler(new CustomCellWriteHandler()).build(); + WriteTable writeTable0 = EasyExcel.writerTable(num).head(contentHeader).build(); + excelWriter.write((Collection) null, sheet, writeTable0); + + // 行数据 + WriteTable writeTable1 = EasyExcel.writerTable(num + 1).needHead(Boolean.TRUE).head(contentHeader).build(); + excelWriter.write(result, writeSheet1, writeTable1); + + log.info("Building the first row is success"); + + // 小计 + List> nameHeader2 = contentHeader.stream().map(item -> Collections.singletonList("小计: USD金额:" + subtotalMap.get("usdSubtotal") + " CNY金额:" + subtotalMap.get("cnySubtotal"))).collect(Collectors.toList()); + WriteTable writeTable2 = EasyExcel.writerTable(num + 2).needHead(Boolean.TRUE).head(nameHeader2).build(); + excelWriter.write((Collection) null, writeSheet1, writeTable2); + num = num + 2; + } + // 总计 + List> nameHeader3 = contentHeader.stream().map(item -> Collections.singletonList("总计: USD金额:" + textMap.get("usdTotal") + " CNY金额:" + textMap.get("cnyTotal"))).collect(Collectors.toList()); + WriteTable writeTable3 = EasyExcel.writerTable(num + 1).needHead(Boolean.TRUE).head(nameHeader3).build(); + excelWriter.write((Collection) null, writeSheet1, writeTable3); + + log.info("exportSeaWayBill is success"); + + // 设置响应头信息 + String fileName = bill.getSettleBillName() + "_海运账单.xlsx"; + response.setHeader("Content-Disposition", "attachment;filename*=utf-8''" + URLEncoder.encode(fileName, StandardCharsets.UTF_8.name())); + response.setContentType("application/octet-stream"); + //关流 + excelWriter.finish(); + IOUtils.closeQuietly(outputStream); + } catch (Exception e) { + e.printStackTrace(); + } + } + + public List> buildHeader() { + List> header = new ArrayList<>(); + header.add(Collections.singletonList("提单号")); + header.add(Collections.singletonList("探路者面单号")); + header.add(Collections.singletonList("贵司编号")); + header.add(Collections.singletonList("起运港")); + header.add(Collections.singletonList("目的港")); + header.add(Collections.singletonList("箱量")); + header.add(Collections.singletonList("件数")); + header.add(Collections.singletonList("毛重")); + header.add(Collections.singletonList("体积")); + header.add(Collections.singletonList("费用名称")); + header.add(Collections.singletonList("币种")); + header.add(Collections.singletonList("金额")); + return header; + } + + + + private static void calculateTotal(List emisWaybillFeeitemList, Map textMap) { + Map> emisWaybillFeeitemMap = emisWaybillFeeitemList.stream() + .collect(Collectors.groupingBy(EmisSettleSubBillFeeitem::getCurrency)); + + if (MapUtil.isNotEmpty(emisWaybillFeeitemMap)) { + Set keySet = emisWaybillFeeitemMap.keySet(); + keySet.forEach(key -> { + // 计算每种金额总计 + String count = emisWaybillFeeitemMap.get(key).stream() + .map(EmisSettleSubBillFeeitem::getBillFee) + .reduce(BigDecimal.ZERO, BigDecimal::add) + .stripTrailingZeros() + .toPlainString(); + if (keySet.size() > 1) { + countA(key, textMap, "usdTotal", count, "cnyTotal"); + } else { + countB(key, textMap, "usdTotal", count, "cnyTotal"); + } + }); + } + } + + private static void calculateSubtotal(List emisWaybillFeeitemList, Map textMap) { + Map> emisWaybillFeeitemMap = emisWaybillFeeitemList.stream() + .collect(Collectors.groupingBy(EmisSettleSubBillFeeitem::getCurrency)); + + if (MapUtil.isNotEmpty(emisWaybillFeeitemMap)) { + Set keySet = emisWaybillFeeitemMap.keySet(); + keySet.forEach(key -> { + // 计算每种金额总计 + String count = emisWaybillFeeitemMap.get(key).stream() + .map(EmisSettleSubBillFeeitem::getBillFee) + .reduce(BigDecimal.ZERO, BigDecimal::add) + .stripTrailingZeros() + .toPlainString(); + if (keySet.size() > 1) { + countA(key, textMap, "usdSubtotal", count, "cnySubtotal"); + } else { + countB(key, textMap, "usdSubtotal", count, "cnySubtotal"); + } + }); + } + } + + private static void countA(String key, Map textMap, String usdSubtotal, String count, String cnySubtotal) { + if ("USD".equals(key)) { + textMap.put(usdSubtotal, count); + } else { + textMap.put(cnySubtotal, count); + } + } + + private static void countB(String key, Map textMap, String usdSubtotal, String count, String cnySubtotal) { + if ("USD".equals(key)) { + textMap.put(usdSubtotal, count); + textMap.put(cnySubtotal, "0"); + } else { + textMap.put(cnySubtotal, count); + textMap.put(usdSubtotal, "0"); + } + } + /** * 修改结算总账单 diff --git a/emis-biz/src/main/resources/mapper/EmisSettleSubBillFeeitemMapper.xml b/emis-biz/src/main/resources/mapper/EmisSettleSubBillFeeitemMapper.xml index 12881077d..7e5988a6b 100644 --- a/emis-biz/src/main/resources/mapper/EmisSettleSubBillFeeitemMapper.xml +++ b/emis-biz/src/main/resources/mapper/EmisSettleSubBillFeeitemMapper.xml @@ -16,10 +16,50 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" + + + + + + + + + + + + + + + + + + + + + + + + + select id, sub_bill_no, bill_code, fee_code, fee_name, bill_fee, orig_fee, currency, order_num, del_flag, create_by, create_time, update_by, update_time, remark from emis_settle_sub_bill_feeitem + + select a.bill_code, + a.lading_bill_code, + a.company_code, + a.departure_port, + a.destination_port, + a.box_quantity, + a.parcel_qty, + a.bill_weight, + a.total_volume, + b.* + from emis_waybill a + left join emis_settle_sub_bill_feeitem b on a.bill_code = b.bill_code and b.del_flag = '0' + + + + + insert into emis_settle_sub_bill_feeitem