Commit 66cef53e authored by huyf's avatar huyf

海运应收汇总bug&海运已装单需求

parent d5c60328
......@@ -21,12 +21,18 @@ public class LoadDto {
@ExcelProperty("prodTitleZh")
private String prodTitleZh;
@ExcelProperty("quantity")
private Integer quantity;
@ExcelProperty("brand")
private String brand;
@ExcelProperty("productRecord")
private String productRecord;
@ExcelProperty("prodAttr")
private String prodAttr;//特性
@ExcelProperty("sumNum")
private Integer sumNum;
......@@ -45,6 +51,9 @@ public class LoadDto {
@ExcelProperty("material")
private String material;
@ExcelProperty("usageIds")
private String usageIds;//用途
@ExcelProperty("merge")
private String merge;
......@@ -57,7 +66,4 @@ public class LoadDto {
@ExcelProperty("worth")
private BigDecimal worth;
@ExcelProperty("quantity")
private Integer quantity;
}
......@@ -3,11 +3,10 @@ package cn.iocoder.yudao.module.shipment.listener;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.util.StrUtil;
import cn.iocoder.yudao.framework.apollo.core.event.export.ShipmentAirLoadExcelExportPushEvent;
import cn.iocoder.yudao.framework.apollo.core.event.export.ShipmentLoadExcelExportPushEvent;
import cn.iocoder.yudao.framework.apollo.core.event.export.ShipmentLoadExcelExportPushEvent2;
import cn.iocoder.yudao.framework.apollo.core.event.export.ShipmentPreloadExcelExportPushEvent;
import cn.iocoder.yudao.framework.common.util.date.DateUtils;
import cn.iocoder.yudao.framework.common.util.json.JsonUtils;
import cn.iocoder.yudao.framework.common.util.number.NumberUtils;
import cn.iocoder.yudao.framework.dict.core.dto.DictDataRespDTO;
import cn.iocoder.yudao.framework.dict.core.util.DictFrameworkUtils;
......@@ -19,13 +18,14 @@ import cn.iocoder.yudao.module.infra.service.file.FileService;
import cn.iocoder.yudao.module.order.dal.dataobject.order.OrderDO;
import cn.iocoder.yudao.module.order.dal.dataobject.orderGuanlian.OrderGuanlianDO;
import cn.iocoder.yudao.module.order.dal.dataobject.orderItem.OrderItemDO;
import cn.iocoder.yudao.module.order.dal.dataobject.orderLocation.OrderLocationDO;
import cn.iocoder.yudao.module.order.dal.dataobject.orderWarehouseIn.OrderWarehouseInDO;
import cn.iocoder.yudao.module.order.dto.OrderBackInfoDto;
import cn.iocoder.yudao.module.order.service.order.*;
import cn.iocoder.yudao.module.order.service.orderWarehouseIn.OrderWarehouseInService;
import cn.iocoder.yudao.module.order.vo.order.OrderWarehouseInDetailsVO;
import cn.iocoder.yudao.module.order.vo.orderItem.OrderItemBackVO;
import cn.iocoder.yudao.module.order.vo.orderWarehouseIn.OrderWarehouseInBackItemVO;
import cn.iocoder.yudao.module.order.vo.orderWarehouseIn.OrderWarehouseInBackItemDo;
import cn.iocoder.yudao.module.order.vo.orderWarehouseIn.OrderWarehouseInBackVO;
import cn.iocoder.yudao.module.product.dal.dataobject.product.ProductAttrDO;
import cn.iocoder.yudao.module.product.dal.dataobject.product.ProductDO;
import cn.iocoder.yudao.module.product.dal.dataobject.productbrank.ProductBrankDO;
......@@ -34,18 +34,13 @@ import cn.iocoder.yudao.module.product.service.product.ProductService;
import cn.iocoder.yudao.module.product.service.productbrank.ProductBrankService;
import cn.iocoder.yudao.module.shipment.dal.dataobject.BoxApprovalDO;
import cn.iocoder.yudao.module.shipment.dal.dataobject.BoxDO;
import cn.iocoder.yudao.module.shipment.dal.dataobject.BoxMergePkgDO;
import cn.iocoder.yudao.module.shipment.dal.dataobject.BoxPkgOrderDO;
import cn.iocoder.yudao.module.shipment.dto.AirLoadDto;
import cn.iocoder.yudao.module.shipment.dto.LoadDto;
import cn.iocoder.yudao.module.shipment.dto.PreloadDto;
import cn.iocoder.yudao.module.shipment.service.box.BoxService;
import cn.iocoder.yudao.module.shipment.service.boxApproval.BoxApprovalService;
import cn.iocoder.yudao.module.shipment.service.boxMergePkg.BoxMergePkgService;
import cn.iocoder.yudao.module.shipment.service.boxPkgOrder.BoxPkgOrderService;
import cn.iocoder.yudao.module.shipment.service.boxPreloadGoods.BoxPreloadGoodsService;
import cn.iocoder.yudao.module.shipment.utils.CustomAirLoadMergeStrategyNew;
import cn.iocoder.yudao.module.shipment.utils.CustomCellWriteHandler;
import cn.iocoder.yudao.module.shipment.utils.CustomLoadMergeStrategyNew;
import cn.iocoder.yudao.module.shipment.utils.CustomMergeStrategy;
import cn.iocoder.yudao.module.shipment.vo.boxPreloadGoods.BoxPreloadGoodsBackVO;
import cn.iocoder.yudao.module.system.framework.ue.UeProperties;
......@@ -66,6 +61,7 @@ import javax.annotation.Resource;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
......@@ -73,17 +69,14 @@ import java.util.*;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.stream.Collectors;
import static cn.iocoder.yudao.framework.common.pojo.CommonResult.error;
import static cn.iocoder.yudao.framework.excel.constant.ExportConstant.DATA_FORMAT;
import static cn.iocoder.yudao.module.shipment.enums.ErrorCodeConstants.HAVE_NOT_PRELOAD_GOODS;
/**
* 自编号订单excel导出监听
* 修改模板样式和添加列字段
* 海运已装单数据导出
* NG2408045L
*
* @author zhengYi
*/
@Component("ShipmentLoadExcelExportListener2")
......@@ -122,6 +115,9 @@ public class ShipmentLoadExcelExportListener2 {
@Resource
private OrderService orderService;
@Resource
private ProductService productService;
@Resource
private ProductAttrService productAttrService;
......@@ -137,304 +133,158 @@ public class ShipmentLoadExcelExportListener2 {
colorList.add(47);
}
// @Value("${ue.templates-url}")
// private String path;
/**
* 订单导出监听
*
* @param event 编号记录
*/
@EventListener(ShipmentLoadExcelExportPushEvent.class)
public void shipmentLoadExcelExportPushEvent(
ShipmentLoadExcelExportPushEvent event) {
@EventListener(ShipmentLoadExcelExportPushEvent2.class)
public void shipmentLoadExcelExportPushEvent(ShipmentLoadExcelExportPushEvent2 event) {
if (StringUtils.isNotBlank(event.getRequestParams())) {
try {
DateTimeFormatter formatter =
DateTimeFormatter.ofPattern(DATA_FORMAT);
DateTimeFormatter formatter = DateTimeFormatter.ofPattern(DATA_FORMAT);
String nowTime = formatter.format(LocalDateTime.now());
String dir = ueProperties.getTempDir().concat("/load/excel/");
String fileName = event.getUserId().
toString().concat(StrUtil.DASHED).
concat(event.getUserType().toString()).
concat(StrUtil.DASHED).concat(nowTime).
concat("shipment_load.xlsx");
String fileName = event.getUserId().toString().concat(StrUtil.DASHED).concat(event.getUserType().toString()).concat(StrUtil.DASHED).concat(nowTime).concat("shipment_load.xlsx");
InputStream inputStream = null;
//获取模板 2024-06-05 添加注释
inputStream = getClass().getClassLoader().
getResourceAsStream(
ueProperties.getTemplatesUrl() + "/load.xlsx");
inputStream = getClass().getClassLoader().getResourceAsStream(ueProperties.getTemplatesUrl() + "/load.xlsx");
Map headMap = new HashMap();
JSONObject jsonObject =
JSONObject.parseObject(event.getRequestParams());
JSONObject jsonObject = JSONObject.parseObject(event.getRequestParams());
Long shipmentId = jsonObject.getLong("shipmentId");
List<BoxPreloadGoodsBackVO> goodsItemList =
boxPreloadGoodsService.getShipGoodItemList(shipmentId);
List<BoxPreloadGoodsBackVO> goodsItemList = boxPreloadGoodsService.getShipGoodItemList(shipmentId);
if (CollectionUtil.isEmpty(goodsItemList)) {
event.setResult(HAVE_NOT_PRELOAD_GOODS.getMsg());
}
BoxDO box = boxService.getBox(shipmentId);
CabinetDO cabinet = cabinetService.getCabinet(box.getCabinetId());
BoxApprovalDO boxApprovalDO =
boxApprovalService.getOne(
new LambdaQueryWrapperX<BoxApprovalDO>().
eq(BoxApprovalDO::getShipmentId, shipmentId).
eq(BoxApprovalDO::getApprovalType, 2).
last("limit 1"));
BoxApprovalDO boxApprovalDO = boxApprovalService.getOne(new LambdaQueryWrapperX<BoxApprovalDO>().eq(BoxApprovalDO::getShipmentId, shipmentId).eq(BoxApprovalDO::getApprovalType, 2).last("limit 1"));
headMap.put("selfNo", box.getSelfNo());
headMap.put("ctnNo", box.getCubNo());
if (cabinet != null) {
headMap.put("ctnNo",box.getCubNo());
if(cabinet != null) {
headMap.put("cabinetName", cabinet.getName());
}
headMap.put("exportDate", DateUtils.formatDate(new Date()));
if (boxApprovalDO != null) {
headMap.put("date",
DateUtils.formatDate(boxApprovalDO.getCreateTime()));
headMap.put("date", DateUtils.formatDate(boxApprovalDO.getCreateTime()));
}
File fileDir = new File(dir);
if (!fileDir.exists()) {
if (!fileDir.exists()){
// 不存在则创建一个目录
fileDir.mkdirs();
}
//write 写入的文件路径
//withTemplate 使用的模板
ExcelWriter excelWriter =
EasyExcel.write(dir + fileName).
withTemplate(inputStream).build();
List<ProductAttrDO> productAttrDOList = productAttrService.getProductAttrList();
Map<String, String> idNameMap = productAttrDOList.stream()
.collect(Collectors.toMap(attr -> String.valueOf(attr.getId()), ProductAttrDO::getAttrName));
ExcelWriter excelWriter = EasyExcel.write(dir + fileName).withTemplate(inputStream).build();
WriteSheet sheet = EasyExcel.writerSheet(0).build();
excelWriter.fill(headMap, sheet);
//商品属性获取
List<ProductAttrDO> ProductAttrList =
productAttrService.getProductAttrList();
Map<Long, String> ProductAttrMap = null;
if (CollectionUtil.isEmpty(ProductAttrList) == false) {
ProductAttrMap = ProductAttrList.stream().
collect(Collectors.toMap(ProductAttrDO::getId,
ProductAttrDO::getAttrName));
}
//end 商品属性获取
if (box.getLdStatus() != null && box.getLdStatus() >= 43) {
//43、已装柜、待封柜
if (box.getLdStatus() != null && box.getLdStatus()>=43) {//43、已装柜、待封柜
//以secId排序
goodsItemList.sort(Comparator.comparing(
BoxPreloadGoodsBackVO::getSecId).
thenComparing(BoxPreloadGoodsBackVO::getTidanNum).
thenComparing(BoxPreloadGoodsBackVO::getId));
goodsItemList.sort(Comparator.comparing(BoxPreloadGoodsBackVO::getSecId).thenComparing(BoxPreloadGoodsBackVO::getTidanNum).thenComparing(BoxPreloadGoodsBackVO::getId));
int allTotalNum = 0;
BigDecimal allTotalVolume = new BigDecimal(0);
BigDecimal allTotalWeight = new BigDecimal(0);
List<Long> secCount =
goodsItemList.stream().
map(BoxPreloadGoodsBackVO::getSecId).
distinct().sorted().collect(Collectors.toList());
List<Long> secCount = goodsItemList.stream().map(BoxPreloadGoodsBackVO::getSecId).distinct().sorted().collect(Collectors.toList());
AtomicInteger colorRowNum = new AtomicInteger(6);
if (!CollectionUtils.isEmpty(secCount)) {
for (int i = 0; i < secCount.size(); i++) {
for (int i=0;i<secCount.size();i++){
List<String> list1 = new ArrayList();
List<List<String>> headList = new ArrayList<>();
String head = "";
if (i == 0) {
head = "第" + NumberUtils.int2chineseNum(i + 1)
+ "部分(Be loaded inside of the container)";
head = "第"+ NumberUtils.int2chineseNum(i+1) +"部分(Be loaded inside of the container)";
} else {
head = "第" + NumberUtils.int2chineseNum(i + 1)
+ "部分(after " + NumberUtils.format(i + 1) + " parts)";
head = "第"+NumberUtils.int2chineseNum(i+1)+"部分(after "+ NumberUtils.format(i+1)+" parts)";
}
list1.add(head);
headList.add(list1);
headList.add(list1);
headList.add(list1);
headList.add(list1);
headList.add(list1);
headList.add(list1);
headList.add(list1);headList.add(list1);headList.add(list1);
headList.add(list1);headList.add(list1);headList.add(list1);
headList.add(list1);
headList.add(list1);
headList.add(list1);
headList.add(list1);
headList.add(list1);
headList.add(list1);
headList.add(list1);
headList.add(list1);headList.add(list1);headList.add(list1);
headList.add(list1);headList.add(list1);headList.add(list1);
headList.add(list1);
headList.add(list1);
headList.add(list1);
headList.add(list1);
headList.add(list1);
headList.add(list1);
headList.add(list1);headList.add(list1);headList.add(list1);
//headList.add(list1);headList.add(list1);
//headList.add(list1);headList.add(list1);
List<LoadDto> list = new ArrayList<>();
int totalNum = 0;
BigDecimal totalVolume = new BigDecimal(0);
BigDecimal totalWeight = new BigDecimal(0);
Map<String, Integer> numMap = new HashMap();
Long part = secCount.get(i);
List<Integer> mergeCountList = new ArrayList();
List<Integer> colorRowList = new ArrayList<>();
AtomicInteger colorRowNum = new AtomicInteger(5);
Map<String,Integer> numMap = new HashMap();
Map<String,Integer> colorMap = new HashMap<>();
Map<String,Integer> mergePkgCountMap = new LinkedHashMap<>();
Long part = secCount.get(i);
int colorIndex = 0;
//以订单ID分组
Map<Long, List<BoxPreloadGoodsBackVO>> orderMap =
goodsItemList.stream().filter(item -> item.getSecId().longValue() ==
part.longValue() &&
StringUtils.isNotBlank(item.getWarehouseInInfo()))
.collect(Collectors.groupingBy(BoxPreloadGoodsBackVO::getOrderId,
LinkedHashMap::new, Collectors.toList()));
Map<Long, List<BoxPreloadGoodsBackVO>> orderMap = goodsItemList.stream().filter(item -> item.getSecId().longValue()==part.longValue() && StringUtils.isNotBlank(item.getWarehouseInInfo()))
.collect(Collectors.groupingBy(BoxPreloadGoodsBackVO::getOrderId,LinkedHashMap::new,Collectors.toList()));
for (Map.Entry<Long, List<BoxPreloadGoodsBackVO>> entry : orderMap.entrySet()) {
Long orderId = entry.getKey();
List<OrderWarehouseInBackItemVO> orderWarehouseInBackItemVOS =
orderWarehouseInService.getOrderWarehouseInListOrderByInTime(orderId);
for (OrderWarehouseInBackItemVO item : orderWarehouseInBackItemVOS) {
OrderBackInfoDto orderInfo = orderQueryService.info(orderId);
List<BoxPreloadGoodsBackVO> boxPreload = entry.getValue();
List<OrderItemDO> orderItems = boxPreload.stream().map(item -> orderItemService.getOrderItem(item.getOrderItemId())).collect(Collectors.toList());
for(OrderItemDO item : orderItems) {
List<OrderWarehouseInDO> orderWarehouseInDOS = orderWarehouseInService.selectList(OrderWarehouseInDO::getOrderItemId, item.getOrderItemId());
for (OrderWarehouseInDO orderWarehouseInDO : orderWarehouseInDOS) {
if (CollectionUtil.isNotEmpty(orderWarehouseInDO.getOrderWarehouseInDetailsVOList())) {
int andIncrement = colorRowNum.getAndIncrement();
if (StringUtils.isNotBlank(item.getOrderWarehouseInDetails())) {
JSONArray jsonArray = JSONArray.parseArray(item.getOrderWarehouseInDetails());
if (jsonArray.size() > 0) {
colorMap.put(String.valueOf(andIncrement),colorList.get(colorIndex));
colorRowList.add(andIncrement);//这里加1是为了设置颜色时过滤掉入仓记录那条
break;
}
}
int mergeCount = 1;
if (StringUtils.isNotBlank(item.getOrderWarehouseInDetails())) {
item.setOrderWarehouseInDetailsVOList(JsonUtils.parseArray(item.getOrderWarehouseInDetails(), OrderWarehouseInDetailsVO.class));
}
if (CollectionUtil.isNotEmpty(item.getOrderWarehouseInDetailsVOList())) {
mergeCount = mergeCount + item.getOrderWarehouseInDetailsVOList().size();
List<OrderWarehouseInDetailsVO> orderWarehouseInDetailsVOList =
item.getOrderWarehouseInDetailsVOList();
for (int j = 0; j < orderWarehouseInDetailsVOList.size(); j++) {
int andIncrement1 = colorRowNum.getAndIncrement();
colorMap.put(String.valueOf(andIncrement1),colorList.get(colorIndex));
colorRowList.add(andIncrement1);
}
}
mergeCountList.add(mergeCount);
if (colorIndex == 7) {
colorIndex = 0;
} else {
colorIndex ++;
}
}
}
//registerWriteHandler(new XXXStrategy(需要的参数))
//自定义单元格合并策略
WriteTable writeTable = EasyExcel.writerTable(i)
.registerWriteHandler(new CustomMergeStrategy(orderMap, null, null, 0, true))
.registerWriteHandler(new CustomMergeStrategy(orderMap, null, null, 1, true))
.registerWriteHandler(new CustomMergeStrategy(orderMap, null, null, 2, true))
//2024-06-11 begin
.registerWriteHandler(new CustomCellWriteHandler(colorRowList,3, colorMap))
.registerWriteHandler(new CustomCellWriteHandler(colorRowList,4, colorMap))
.registerWriteHandler(new CustomCellWriteHandler(colorRowList,5, colorMap))
.registerWriteHandler(new CustomCellWriteHandler(colorRowList,6, colorMap))
.registerWriteHandler(new CustomCellWriteHandler(colorRowList,7, colorMap))
//.registerWriteHandler(new CustomMergeStrategy(orderMap, null, null, 7, true)) //end
.registerWriteHandler(new CustomMergeStrategy(orderMap, null, null, 10, true))
.registerWriteHandler(new CustomMergeStrategy(orderMap, null, null, 12, true))
.registerWriteHandler(new CustomMergeStrategy(orderMap, null, null, 13, true))
.registerWriteHandler(new CustomMergeStrategy(orderMap, null, null, 14, true))
.automaticMergeHead(true).head(headList).needHead(true).build();
for (Map.Entry<Long, List<BoxPreloadGoodsBackVO>> entry : orderMap.entrySet()) {
Long orderId = entry.getKey();
OrderBackInfoDto orderInfo = orderQueryService.info(orderId);
List<BoxPreloadGoodsBackVO> boxPreload = entry.getValue();
List<OrderItemDO> orderItems =
boxPreload.stream().map(item -> orderItemService.
getOrderItem(item.getOrderItemId())).
collect(Collectors.toList());
for (OrderItemDO item : orderItems) {
List<OrderWarehouseInDO> orderWarehouseInDOS =
orderWarehouseInService.selectList(
OrderWarehouseInDO::getOrderItemId,
item.getOrderItemId());
int mixedMergeCount = 1;
LoadDto preloadDto = new LoadDto();
preloadDto.setOrderNo(orderInfo.getOrderNo());
if (numMap.get(orderInfo.getOrderNo()) != null) {
preloadDto.setId(String.valueOf(numMap.get(orderInfo.getOrderNo())));
} else {
preloadDto.setId(String.valueOf(numMap.size() + 1));
numMap.put(orderInfo.getOrderNo(), numMap.size() + 1);
preloadDto.setId(String.valueOf(numMap.size()+1));
numMap.put(orderInfo.getOrderNo(),numMap.size()+1);
}
preloadDto.setMarks(orderInfo.getMarks());
List<OrderGuanlianDO> guanlianList =
orderGuanlianService.getGuanlianListByOrderId(
orderInfo.getOrderId());
List<OrderGuanlianDO> guanlianList = orderGuanlianService.getGuanlianListByOrderId(orderInfo.getOrderId());
//rIdList为此订单的所有关联订单
List<Long> rIdList = new ArrayList<>();
for (OrderGuanlianDO orderGuanlianDO : guanlianList) {
Long oId = orderGuanlianDO.getOrderId();
Long rId = orderGuanlianDO.getRelateOrderId();
if (oId.equals(orderId)) {
if(oId.equals(orderId)) {
rIdList.add((rId));
} else if (rId.equals(orderId)) {
} else if(rId.equals(orderId)) {
rIdList.add(oId);
}
}
if (CollectionUtil.isNotEmpty(rIdList)) {
List<OrderDO> orderDOS =
orderService.selectList(OrderDO::getOrderId, rIdList);
List<OrderDO> orderDOS = orderService.selectList(OrderDO::getOrderId, rIdList);
if (CollectionUtil.isNotEmpty(orderDOS)) {
preloadDto.setRelateOrder(orderDOS.stream().map(
OrderDO::getOrderNo).collect(Collectors.joining(",")));
preloadDto.setRelateOrder(orderDOS.stream().map(OrderDO::getOrderNo).collect(Collectors.joining(",")));
}
}
preloadDto.setProdTitleZh(item.getProdTitleZh() + " " + item.getProdTitleEn());
preloadDto.setProdTitleZh(item.getProdTitleZh()+ " " +item.getProdTitleEn());
preloadDto.setMerge(orderInfo.getOldNumbers());
ProductBrankDO productBrank =
productBrankService.getProductBrank(item.getBrand());
if (productBrank != null && StringUtils.isNotBlank(productBrank.getTitleZh())) {
ProductBrankDO productBrank = productBrankService.getProductBrank(item.getBrand());
if(productBrank!=null && StringUtils.isNotBlank(productBrank.getTitleZh())){
preloadDto.setBrand(productBrank.getTitleZh());
}
//材质
if (StringUtils.isNotBlank(item.getMaterial())) {
preloadDto.setMaterial(
DictFrameworkUtils.getDictDataFromCache("product_material",
item.getMaterial() + "").getLabel());
}
//品牌
if (productBrank != null && productBrank.getFiling() != null) {
preloadDto.setProductRecord(productBrank.getFiling().equals("0") ? "N" : "Y");
if(StringUtils.isNotBlank(item.getMaterial())){
preloadDto.setMaterial(DictFrameworkUtils.getDictDataFromCache("product_material",item.getMaterial()+"").getLabel());
}
//用途
if (item.getUsageIds() == null || item.getUsageIds().length() == 0) {
//preloadDto.setUsageIds("");
} else {
//在缓存数据字典中获取用途信息
String sUserdName = DictFrameworkUtils.getDictDataFromCache(
"order_item_usage",
item.getUsageIds() + "").getLabel();
//preloadDto.setUsageIds(sUserdName);
if(productBrank !=null && productBrank.getFiling()!=null){
preloadDto.setProductRecord(productBrank.getFiling().equals("0")? "N":"Y");
}
//商品特性赋值
String sR = getAttrName(item, ProductAttrMap);
//preloadDto.setProdAttrIds(sR);
preloadDto.setSumNum(item.getWarehouseInInfoVO().getCartonsNum());
if (CollectionUtil.isNotEmpty(orderWarehouseInDOS)) {
if(CollectionUtil.isNotEmpty(orderWarehouseInDOS)){
String warehousingSpecificationType = orderWarehouseInDOS.stream().map(j -> {
return DictFrameworkUtils.getDictDataFromCache("warehousing_specification_type", j.getSpecificationType() + "").getLabel();
}).distinct().collect(Collectors.joining("/"));
......@@ -445,20 +295,59 @@ public class ShipmentLoadExcelExportListener2 {
preloadDto.setPackageType(packagingType);
}
preloadDto.setSumVolume(item.getWarehouseInInfoVO().getVolume());
preloadDto.setSumWeight(item.getWarehouseInInfoVO().getWeight());
if (orderInfo.getCustomsType() != null) {
preloadDto.setCustomsType(
DictFrameworkUtils.getDictDataFromCache("customs_type",
orderInfo.getCustomsType() + "").getLabel());
if(orderInfo.getCustomsType()!=null){
preloadDto.setCustomsType(DictFrameworkUtils.getDictDataFromCache("customs_type",orderInfo.getCustomsType()+"").getLabel());
}
preloadDto.setWorth(item.getWorth());
preloadDto.setQuantity(item.getWarehouseInInfoVO().getQuantityAll());
list.add(preloadDto);
if (CollectionUtil.isNotEmpty(orderWarehouseInDOS)) {
for (OrderWarehouseInDO j : orderWarehouseInDOS) {
if (CollectionUtil.isNotEmpty(j.getOrderWarehouseInDetailsVOList())) {
mergeCount = mergeCount + j.getOrderWarehouseInDetailsVOList().size();
for (OrderWarehouseInDetailsVO k : j.getOrderWarehouseInDetailsVOList()) {
int andIncrement1 = colorRowNum.getAndIncrement();
colorMap.put(String.valueOf(andIncrement1),colorList.get(colorIndex));
colorRowList.add(andIncrement1);
LoadDto preloadDto1 = new LoadDto();
BeanUtil.copyProperties(preloadDto,preloadDto1);
ProductBrankDO productBrankDetail = productBrankService.getProductBrank(k.getBrand());
if(productBrankDetail!=null && StringUtils.isNotBlank(productBrankDetail.getTitleZh())){
preloadDto1.setBrand(productBrankDetail.getTitleZh());
}
if(productBrank !=null && productBrank.getFiling()!=null){
preloadDto1.setProductRecord(productBrank.getFiling().equals("0")? "N":"Y");
}
preloadDto1.setQuantity(k.getQuantityAll());
if (StringUtils.isNotBlank(k.getMaterial())) {
preloadDto1.setMaterial(DictFrameworkUtils.getDictDataFromCache("product_material",k.getMaterial()+"").getLabel());
}
preloadDto1.setProdAttr(getAttrNameByIds(k.getProdAttrIds(),idNameMap));
preloadDto1.setUsageIds(getUsageMsg(k.getUsageIds()));
ProductDO product = productService.getProduct(k.getProdId());
if (product != null) {
preloadDto1.setProdTitleZh(product.getTitleZh() + "" + product.getTitleEn());
}
list.add(preloadDto1);
}
}
}
}
mergeCountList.add(mergeCount);
if (colorIndex == 7) {
colorIndex = 0;
} else {
colorIndex ++;
}
totalNum = totalNum + item.getWarehouseInInfoVO().getCartonsNum();
totalVolume = totalVolume.add(item.getWarehouseInInfoVO().getVolume());
totalWeight = totalWeight.add(item.getWarehouseInInfoVO().getWeight());
colorRowNum.getAndIncrement();
}
}
colorRowNum.getAndAdd(2);
LoadDto preloadDto = new LoadDto();
preloadDto.setId("TOTAL");
preloadDto.setSumNum(totalNum);
......@@ -468,7 +357,7 @@ public class ShipmentLoadExcelExportListener2 {
allTotalNum = allTotalNum + totalNum;
allTotalVolume = allTotalVolume.add(totalVolume);
allTotalWeight = allTotalWeight.add(totalWeight);
if (i == secCount.size() - 1) {
if(i==secCount.size()-1){
LoadDto preloadDto1 = new LoadDto();
preloadDto1.setId("IN TOTAL");
preloadDto1.setSumNum(allTotalNum);
......@@ -476,12 +365,28 @@ public class ShipmentLoadExcelExportListener2 {
preloadDto1.setSumWeight(allTotalWeight);
list.add(preloadDto1);
}
excelWriter.write(list, sheet, writeTable);
WriteTable writeTable = EasyExcel.writerTable(i)
.registerWriteHandler(new CustomLoadMergeStrategyNew(list,mergeCountList,0,1))
.registerWriteHandler(new CustomLoadMergeStrategyNew(list,mergeCountList,1,1))
.registerWriteHandler(new CustomLoadMergeStrategyNew(list,mergeCountList,2,1))
.registerWriteHandler(new CustomCellWriteHandler(colorRowList,3, colorMap))
.registerWriteHandler(new CustomCellWriteHandler(colorRowList,4, colorMap))
.registerWriteHandler(new CustomCellWriteHandler(colorRowList,5, colorMap))
.registerWriteHandler(new CustomCellWriteHandler(colorRowList,6, colorMap))
.registerWriteHandler(new CustomCellWriteHandler(colorRowList,7, colorMap))
.registerWriteHandler(new CustomLoadMergeStrategyNew(list,mergeCountList,8,2))
.registerWriteHandler(new CustomLoadMergeStrategyNew(list,mergeCountList,9,1))
.registerWriteHandler(new CustomLoadMergeStrategyNew(list,mergeCountList,10,2))
.registerWriteHandler(new CustomLoadMergeStrategyNew(list,mergeCountList,11,2))
.registerWriteHandler(new CustomLoadMergeStrategyNew(list,mergeCountList,12,1))
.registerWriteHandler(new CustomLoadMergeStrategyNew(list,mergeCountList,17,1))
.registerWriteHandler(new CustomLoadMergeStrategyNew(list,mergeCountList,18,2))
.automaticMergeHead(true).head(headList).needHead(true).build();
excelWriter.write(list,sheet,writeTable);
}
}
}
excelWriter.finish();
inputStream.close();
// 获取到临时文件
......@@ -499,8 +404,8 @@ public class ShipmentLoadExcelExportListener2 {
event.setFileName(fileDO.getPath());
event.setUrl(fileDO.getUrl());
event.setFileId(fileDO.getId());
} catch (Exception e) {
e.printStackTrace();
event.setResult(e.getMessage());
}
......@@ -510,35 +415,31 @@ public class ShipmentLoadExcelExportListener2 {
}
/*
添加商品属性转换函数
*/
private String getAttrName(OrderItemDO item, Map<Long, String> ProductAttrMap) {
String sReult = "";
//添加商品特性
if (item.getProdAttrIds() == null || item.getProdAttrIds().length() == 0) {
return sReult;
} else {
if (ProductAttrMap == null) {
return sReult;
} else {
String sAttrName = "";
List<String> resultList = Arrays.asList(
item.getProdAttrIds().split(","));
for (String sId : resultList
) {
Long l = Long.parseLong(sId);
if (sAttrName.length() != 0) {
sAttrName += "," + ProductAttrMap.get(l);
private String getUsageMsg(String usageIdsDetail) {
if (StringUtils.isNotEmpty(usageIdsDetail)) {
StringJoiner labelJoiner = new StringJoiner(",");
for (String usageId : usageIdsDetail.split(",")) {
DictDataRespDTO usageValue = DictFrameworkUtils.getDictDataFromCache("order_item_usage", usageId);
if (usageValue != null) {
labelJoiner.add(usageValue.getLabel());
}
}
return labelJoiner.toString();
} else {
sAttrName += ProductAttrMap.get(l);
return "";
}
}
sReult = sAttrName;
private String getAttrNameByIds(String attrIds, Map<String, String> idNameMap) {
StringJoiner labelJoiner = new StringJoiner(",");
if(StringUtils.isNotBlank(attrIds)) {
String[] attrIdArray = attrIds.split(",");
for (String attrId : attrIdArray) {
//map一定包含数据,否则是数据错误
labelJoiner.add(idNameMap.get(attrId));
}
return labelJoiner.toString();
}
//end 添加商品特性
return sReult;
return "";
}
}
......@@ -470,9 +470,10 @@ public class ShipmentReceivableExcelExportListener2 {
map.put("sumNum", orderInfo.getSumNum());
sum14 = sum14 + orderInfo.getSumNum();
}
map.put("sumVolume", orderInfo.getOrderItemVOList().stream().map(OrderItemBackVO::getChargeVolume).reduce(BigDecimal.ZERO,BigDecimal::add));
BigDecimal volume = orderInfo.getOrderItemVOList().stream().map(OrderItemBackVO::getChargeVolume).reduce(BigDecimal.ZERO, BigDecimal::add);
map.put("sumVolume", volume);
// map.put("sumVolume", orderInfo.getSumVolume());
sum15 = sum15.add(orderInfo.getSumVolume());
sum15 = sum15.add(volume);
map.put("sumWeight", orderInfo.getSumWeight());
sum16 = sum16.add(orderInfo.getSumWeight());
map.put("vWeight", orderInfo.getVWeight());
......
package cn.iocoder.yudao.module.shipment.utils;
import cn.iocoder.yudao.module.shipment.dto.AirLoadDto;
import cn.iocoder.yudao.module.shipment.dto.LoadDto;
import com.alibaba.excel.metadata.Head;
import com.alibaba.excel.write.merge.AbstractMergeStrategy;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.util.CellRangeAddress;
import org.springframework.util.CollectionUtils;
import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
/**
* @author huyufeng
* @date 2022/12/14
* @description 自定义单元格合并策略
*/
public class CustomLoadMergeStrategyNew extends AbstractMergeStrategy {
/**
* 分组,每几行合并一次
*/
private List<Integer> exportFieldGroupCountList;
private List<Integer> partMergeList;
private int mergeType;
/**
* 目标合并列index
*/
private Integer targetColumnIndex;
// 需要开始合并单元格的首行index
private Integer rowIndex;
// exportDataList为待合并目标列的值 partMerge为另外一种合并方式计算好的合并行数,mergeType 合并类型 1为订单维度合并 2为入仓记录维度的合并
public CustomLoadMergeStrategyNew(List<LoadDto> exportDataList, List<Integer> partMergeList, Integer targetColumnIndex, int mergeType) {
this.exportFieldGroupCountList = getGroupCountList(exportDataList,targetColumnIndex);
this.partMergeList = partMergeList;
this.mergeType = mergeType;
this.targetColumnIndex = targetColumnIndex;
}
@Override
protected void merge(Sheet sheet, Cell cell, Head head, Integer relativeRowIndex) {
if (null == rowIndex) {
rowIndex = cell.getRowIndex();
}
// 仅从首行以及目标列的单元格开始合并,忽略其他
if (cell.getRowIndex() == rowIndex && cell.getColumnIndex() == targetColumnIndex ) {
if (mergeType == 1) {
mergeGroupColumn(sheet,exportFieldGroupCountList);
} else if (mergeType == 2) {
mergeGroupColumn(sheet,partMergeList);
}
}
}
private void mergeGroupColumn(Sheet sheet,List<Integer> list) {
int rowCount = rowIndex;
for (Integer count : list) {
if (count == 1) {
rowCount += count;
continue;
}
// 合并单元格
CellRangeAddress cellRangeAddress = new CellRangeAddress(rowCount, rowCount + count - 1, targetColumnIndex, targetColumnIndex);
sheet.addMergedRegionUnsafe(cellRangeAddress);
rowCount += count;
}
}
// 该方法将目标列根据值是否相同连续可合并,存储可合并的行数
private List<Integer> getGroupCountList(List<LoadDto> exportDataList,Integer targetColumnIndex) {
if (CollectionUtils.isEmpty(exportDataList)) {
return new ArrayList<>();
}
List<Integer> groupCountList = new ArrayList<>();
int count = 1;
LinkedHashMap<String, List<LoadDto>> collect = exportDataList.stream().collect(Collectors.groupingBy(LoadDto::getId, LinkedHashMap::new, Collectors.toList()));
for (Map.Entry<String, List<LoadDto>> entry : collect.entrySet()) {
groupCountList.add(entry.getValue().size());
}
return groupCountList;
}
}
......@@ -282,9 +282,9 @@ public class DownloadLogServiceImpl extends AbstractService<DownloadLogMapper, D
break;
//已装单导出
case SHIPMENT_LOAD_EXCEL_EXPORT:
shipmentLoadExcelExportPushEvent(downloadLog);
// shipmentLoadExcelExportPushEvent(downloadLog);
//总体切换
//shipmentLoadExcelExportPushEvent2(downloadLog);
shipmentLoadExcelExportPushEvent2(downloadLog);
break;
//应收汇总导出修改导出Excel样式
case SHIPMENT_RECEIVABLE_EXCEL_EXPORT:
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment