|
@@ -10,23 +10,41 @@
|
|
|
|
|
|
|
|
package com.yami.shop.service.impl;
|
|
package com.yami.shop.service.impl;
|
|
|
|
|
|
|
|
|
|
+import com.alibaba.excel.EasyExcel;
|
|
|
|
|
+import com.alibaba.excel.write.builder.ExcelWriterSheetBuilder;
|
|
|
|
|
+import com.alibaba.excel.write.merge.OnceAbsoluteMergeStrategy;
|
|
|
|
|
+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.excel.write.style.column.LongestMatchColumnWidthStyleStrategy;
|
|
|
import com.baomidou.mybatisplus.core.metadata.IPage;
|
|
import com.baomidou.mybatisplus.core.metadata.IPage;
|
|
|
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
|
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
|
|
|
|
+import com.google.common.collect.Lists;
|
|
|
import com.yami.shop.bean.model.Sku;
|
|
import com.yami.shop.bean.model.Sku;
|
|
|
import com.yami.shop.bean.po.SkuStatisticsPo;
|
|
import com.yami.shop.bean.po.SkuStatisticsPo;
|
|
|
import com.yami.shop.bean.vo.SkuBuyTogetherOftenVo;
|
|
import com.yami.shop.bean.vo.SkuBuyTogetherOftenVo;
|
|
|
-import com.yami.shop.bean.vo.SkuStatistics;
|
|
|
|
|
|
|
+import com.yami.shop.bean.vo.SkuStatisticsExcel;
|
|
|
import com.yami.shop.bean.vo.SkuStatisticsVo;
|
|
import com.yami.shop.bean.vo.SkuStatisticsVo;
|
|
|
|
|
+import com.yami.shop.common.exception.GlobalException;
|
|
|
import com.yami.shop.common.util.PageParam;
|
|
import com.yami.shop.common.util.PageParam;
|
|
|
import com.yami.shop.dao.SkuMapper;
|
|
import com.yami.shop.dao.SkuMapper;
|
|
|
import com.yami.shop.service.SkuService;
|
|
import com.yami.shop.service.SkuService;
|
|
|
|
|
+import lombok.SneakyThrows;
|
|
|
|
|
+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.beans.factory.annotation.Autowired;
|
|
|
import org.springframework.cache.annotation.CacheEvict;
|
|
import org.springframework.cache.annotation.CacheEvict;
|
|
|
import org.springframework.cache.annotation.Caching;
|
|
import org.springframework.cache.annotation.Caching;
|
|
|
import org.springframework.stereotype.Service;
|
|
import org.springframework.stereotype.Service;
|
|
|
|
|
|
|
|
import javax.servlet.http.HttpServletResponse;
|
|
import javax.servlet.http.HttpServletResponse;
|
|
|
|
|
+import java.io.IOException;
|
|
|
|
|
+import java.net.URLEncoder;
|
|
|
|
|
+import java.util.ArrayList;
|
|
|
|
|
+import java.util.Arrays;
|
|
|
import java.util.List;
|
|
import java.util.List;
|
|
|
|
|
+import java.util.stream.Collectors;
|
|
|
|
|
|
|
|
/**
|
|
/**
|
|
|
* @author lgh on 2018/09/29.
|
|
* @author lgh on 2018/09/29.
|
|
@@ -81,18 +99,122 @@ public class SkuServiceImpl extends ServiceImpl<SkuMapper, Sku> implements SkuSe
|
|
|
return skuMapper.skuStatisticsList(page, po);
|
|
return skuMapper.skuStatisticsList(page, po);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+
|
|
|
@Override
|
|
@Override
|
|
|
|
|
+ @SneakyThrows
|
|
|
public void skuStatisticsExcel(HttpServletResponse response, SkuStatisticsPo po) {
|
|
public void skuStatisticsExcel(HttpServletResponse response, SkuStatisticsPo po) {
|
|
|
- SkuStatistics skuStatistics = new SkuStatistics();
|
|
|
|
|
- skuStatistics.setGoodsTotalPrice(skuMapper.goodsTotalPrice(po));
|
|
|
|
|
- System.out.println(1);
|
|
|
|
|
- skuStatistics.setTotalPoints(skuMapper.totalPoints(po));
|
|
|
|
|
- System.out.println(2);
|
|
|
|
|
- skuStatistics.setTotalCash(skuMapper.totalCash(po));
|
|
|
|
|
- System.out.println(3);
|
|
|
|
|
- skuStatistics.setTotalFreight(skuMapper.totalFreight(po));
|
|
|
|
|
- System.out.println(4);
|
|
|
|
|
- skuStatistics.setSkuStatisticsList(skuMapper.skuStatisticsList2(po));
|
|
|
|
|
- System.out.println(skuStatistics);
|
|
|
|
|
|
|
+ List<SkuStatisticsVo> skuStatisticsVoList = skuMapper.skuStatisticsList2(po);
|
|
|
|
|
+ Double goodsTotalPrice = skuMapper.goodsTotalPrice(po);
|
|
|
|
|
+ Double totalPoints = skuMapper.totalPoints(po);
|
|
|
|
|
+ Double totalCash = skuMapper.totalCash(po);
|
|
|
|
|
+ Double totalFreight = skuMapper.totalFreight(po);
|
|
|
|
|
+
|
|
|
|
|
+ String head = "对账汇总表";
|
|
|
|
|
+ List<String> heads = Arrays.asList(
|
|
|
|
|
+ "商品ID", "商品名称", "规格", "单价(元)", "商品总数量", "小计(元)",
|
|
|
|
|
+ "商品总额(元)", "总积分抵扣(元)", "总现金抵扣(元)", "总运费(元)"
|
|
|
|
|
+ );
|
|
|
|
|
+ List<List<String>> hs = heads.stream()
|
|
|
|
|
+ .map(h -> Arrays.asList(head, h))
|
|
|
|
|
+ .collect(Collectors.toList());
|
|
|
|
|
+
|
|
|
|
|
+ List<List<Object>> data = new ArrayList<>();
|
|
|
|
|
+ for (int i = 0; i < skuStatisticsVoList.size(); i++) {
|
|
|
|
|
+ SkuStatisticsVo sku = skuStatisticsVoList.get(i);
|
|
|
|
|
+ List<Object> row = new ArrayList<>();
|
|
|
|
|
+ row.add(sku.getSkuId());
|
|
|
|
|
+ row.add(sku.getSkuName());
|
|
|
|
|
+ row.add(sku.getSpec());
|
|
|
|
|
+ row.add(sku.getPrice());
|
|
|
|
|
+ row.add(sku.getProdCount());
|
|
|
|
|
+ row.add(sku.getTotal());
|
|
|
|
|
+
|
|
|
|
|
+ if (i == 0) { // 第一行放值
|
|
|
|
|
+ row.add(goodsTotalPrice);
|
|
|
|
|
+ row.add(totalPoints);
|
|
|
|
|
+ row.add(totalCash);
|
|
|
|
|
+ row.add(totalFreight);
|
|
|
|
|
+ } else { // 其余行留空
|
|
|
|
|
+ row.add(null);
|
|
|
|
|
+ row.add(null);
|
|
|
|
|
+ row.add(null);
|
|
|
|
|
+ row.add(null);
|
|
|
|
|
+ }
|
|
|
|
|
+ data.add(row);
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ /* 4. 样式 */
|
|
|
|
|
+ WriteCellStyle headWriteCellStyle = new WriteCellStyle();
|
|
|
|
|
+ headWriteCellStyle.setFillForegroundColor(IndexedColors.GREY_25_PERCENT.getIndex());
|
|
|
|
|
+ WriteFont headWriteFont = new WriteFont();
|
|
|
|
|
+ headWriteFont.setFontHeightInPoints((short) 15);
|
|
|
|
|
+ headWriteFont.setBold(true);
|
|
|
|
|
+ headWriteCellStyle.setWriteFont(headWriteFont);
|
|
|
|
|
+ headWriteCellStyle.setHorizontalAlignment(HorizontalAlignment.CENTER);
|
|
|
|
|
+
|
|
|
|
|
+ WriteCellStyle contentWriteCellStyle = new WriteCellStyle();
|
|
|
|
|
+ contentWriteCellStyle.setHorizontalAlignment(HorizontalAlignment.CENTER);
|
|
|
|
|
+ contentWriteCellStyle.setVerticalAlignment(VerticalAlignment.CENTER);
|
|
|
|
|
+ HorizontalCellStyleStrategy horizontalCellStyleStrategy = new HorizontalCellStyleStrategy(headWriteCellStyle, contentWriteCellStyle);
|
|
|
|
|
+
|
|
|
|
|
+ /* 5. 合并策略:数据区域第 1 行到最后一行,列 6~9 纵向合并 */
|
|
|
|
|
+ OnceAbsoluteMergeStrategy mergeStrategy = null;
|
|
|
|
|
+ if (data.size() > 1) { // 至少两行才需要合并
|
|
|
|
|
+ mergeStrategy = new OnceAbsoluteMergeStrategy(2, data.size()+1, 6, 6);
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ OnceAbsoluteMergeStrategy mergeStrategy2 = null;
|
|
|
|
|
+ if (data.size() > 1) { // 至少两行才需要合并
|
|
|
|
|
+ mergeStrategy2 = new OnceAbsoluteMergeStrategy(2, data.size()+1, 7, 7);
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ OnceAbsoluteMergeStrategy mergeStrategy3 = null;
|
|
|
|
|
+ if (data.size() > 1) { // 至少两行才需要合并
|
|
|
|
|
+ mergeStrategy3 = new OnceAbsoluteMergeStrategy(2, data.size()+1, 8, 8);
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ OnceAbsoluteMergeStrategy mergeStrategy4 = null;
|
|
|
|
|
+ if (data.size() > 1) { // 至少两行才需要合并
|
|
|
|
|
+ mergeStrategy4 = new OnceAbsoluteMergeStrategy(2, data.size()+1, 9, 9);
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ /* 6. 写出 */
|
|
|
|
|
+ String fileName = URLEncoder.encode("对账汇总表", "UTF-8").replaceAll("\\+", "%20");
|
|
|
|
|
+ response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
|
|
|
|
|
+ response.setHeader("Content-disposition", "attachment;filename*=utf-8''" + fileName + ".xlsx");
|
|
|
|
|
+
|
|
|
|
|
+ ExcelWriterSheetBuilder writerBuilder = EasyExcel.write(response.getOutputStream())
|
|
|
|
|
+ .head(hs)
|
|
|
|
|
+ .sheet(head)
|
|
|
|
|
+ .registerWriteHandler(horizontalCellStyleStrategy);
|
|
|
|
|
+ if (mergeStrategy != null) {
|
|
|
|
|
+ writerBuilder.registerWriteHandler(mergeStrategy);
|
|
|
|
|
+ }
|
|
|
|
|
+ if (mergeStrategy2 != null) {
|
|
|
|
|
+ writerBuilder.registerWriteHandler(mergeStrategy2);
|
|
|
|
|
+ }
|
|
|
|
|
+ if (mergeStrategy3 != null) {
|
|
|
|
|
+ writerBuilder.registerWriteHandler(mergeStrategy3);
|
|
|
|
|
+ }
|
|
|
|
|
+ if (mergeStrategy4 != null) {
|
|
|
|
|
+ writerBuilder.registerWriteHandler(mergeStrategy4);
|
|
|
|
|
+ }
|
|
|
|
|
+ writerBuilder.doWrite(data);
|
|
|
}
|
|
}
|
|
|
|
|
+
|
|
|
|
|
+ @Override
|
|
|
|
|
+ public void test(HttpServletResponse response) {
|
|
|
|
|
+ try {
|
|
|
|
|
+ List<SkuStatisticsExcel> list = Lists.newArrayList();
|
|
|
|
|
+ response.setCharacterEncoding("utf-8");
|
|
|
|
|
+ String fileName = URLEncoder.encode("对账汇总表", "UTF-8").replaceAll("\\+", "%20");
|
|
|
|
|
+ response.setHeader("Content-disposition", "attachment;filename*=utf-8''" + fileName + ".xlsx");
|
|
|
|
|
+ EasyExcel.write(response.getOutputStream(), SkuStatisticsExcel.class)
|
|
|
|
|
+ .registerWriteHandler(new LongestMatchColumnWidthStyleStrategy())
|
|
|
|
|
+ .sheet("列表").doWrite(list);
|
|
|
|
|
+ } catch (IOException e) {
|
|
|
|
|
+ throw new GlobalException("文件下载异常");
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
}
|
|
}
|