package com.hisense.iam800;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.apache.log4j.Logger;
import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFCellStyle;
import org.apache.poi.hssf.usermodel.HSSFFont;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.ss.usermodel.FillPatternType;
import org.apache.poi.ss.usermodel.IndexedColors;
import org.apache.poi.ss.usermodel.Workbook;
import com.ibm.wsdl.util.StringUtils;
import cn.afterturn.easypoi.excel.ExcelExportUtil;
import cn.afterturn.easypoi.excel.entity.ExportParams;
import cn.afterturn.easypoi.excel.entity.params.ExcelExportEntity;
public class DailyFzExcel {
private static Logger logger = Logger.getLogger(DailyFzExcel.class);
// 时间处理类
static DataUtils dataUtils = new DataUtils();
public static Map<String, String> exportToKV(Map<String, Object> dataMap, Map<String, Object> ruleMap, String email, boolean isOpen,
boolean isTest) {
//大品类---大品类下各个基地附件路径
Map<String, String> fileMap = new HashMap<>();
//小品类-基地集合
Map<String, Object> kVMap = new HashMap<>();
// 大品类集合
List<String> types = new ArrayList<>();
types.add("冰箱");
types.add("空调");
// 大品类--小品类集合
for (String t : types) {
List<DailyDto> tList = new ArrayList<>();
tList = (List<DailyDto>) dataMap.get(t);
// 小品类集合
Set<String> smalls = new HashSet();
// 基地集合
Set<String> bases = new HashSet();
tList.forEach(tt -> {
if(org.apache.commons.lang3.StringUtils.isNotEmpty(tt.getGoods_type_name())) {
smalls.add(tt.getGoods_type_name());
}
if(org.apache.commons.lang3.StringUtils.isNotEmpty(tt.getStorage_base())) {
bases.add(tt.getStorage_base());
}
});
kVMap.put(t + "small", smalls);// 大品类--小品类数据集合
kVMap.put(t + "base", bases);// 大品类---基地数据集合
}
// 导出
for (String t : types) {
// 全部数据汇总
List<DailyDto> allInitData = (List<DailyDto>) dataMap.get(t);
// 获取基地数据
Set<String> base = (Set<String>) kVMap.get(t + "base");
// 获取小品类数据
Set<String> small = (Set<String>) kVMap.get(t + "small");
// 【不区分基地合计】全部数据--遍历汇总成按照大品类总数,大品类线上总数。线下总数,-小品类基地线上,线下,汇总数
Map<String, Object> allKV = getAllKV(allInitData, small);
// 【区分基地合计】全部数据--遍历汇总成按照大品类总数,大品类线上总数。线下总数,-小品类基地线上,线下,汇总数
Map<String, Object> baseKV = getBaseKV(allInitData, base, small);
try {
List<ExcelExportEntity> colList = new ArrayList<ExcelExportEntity>();
ExcelExportEntity colEntity = new ExcelExportEntity("基地", "base");
colEntity.setNeedMerge(true);
colList.add(colEntity);
colEntity = new ExcelExportEntity("总计", "total");
colEntity.setNeedMerge(true);
colList.add(colEntity);
ExcelExportEntity deliColGroup = new ExcelExportEntity("线上下", "lineTotal");
List<ExcelExportEntity> deliColList = new ArrayList<ExcelExportEntity>();
deliColList.add(new ExcelExportEntity("线上", "up"));
deliColList.add(new ExcelExportEntity("线下", "down"));
deliColGroup.setList(deliColList);
colList.add(deliColGroup);
for (String sm : small) {
ExcelExportEntity jdColGroup = new ExcelExportEntity(sm, sm + "smallName");
List<ExcelExportEntity> jdColList = new ArrayList<ExcelExportEntity>();
jdColList.add(new ExcelExportEntity("线上", sm + "up"));
jdColList.add(new ExcelExportEntity("线下", sm + "down"));
jdColList.add(new ExcelExportEntity("汇总", sm + "total"));
jdColGroup.setList(jdColList);
colList.add(jdColGroup);
}
// List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();
// 【不区分基地】合计汇总
List<Map<String, Object>> list = getAllTotal(t, dataMap, ruleMap, allKV, small);
// 【区分基地】逐行合计
list = getBaseTotal(list, t, dataMap, ruleMap, baseKV, small, base);
String day=dataUtils.getYesterday(new Date(), 0) ;
String date =day+ "-total-" + new Date().getTime();
Workbook workbook = ExcelExportUtil.exportExcel(new ExportParams(day+"-大品类-【" + t + "】-各基地下单情况", "数据汇总"),
colList, list);
// 设置颜色
HSSFSheet sheet = (HSSFSheet) workbook.getSheetAt(0);
HSSFRow row = sheet.getRow(0);// 第1行
HSSFCell cell = row.getCell(1);// 2,1格
HSSFCellStyle cellStyle = (HSSFCellStyle) workbook.createCellStyle();
cellStyle.setFillForegroundColor((short) 13);// 设置背景色
cellStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND);
cellStyle.setFillForegroundColor(IndexedColors.PALE_BLUE.getIndex());
// cellStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER); // 设置字体居中
cell.setCellStyle(cellStyle);
// 文件附件地址
FileOutputStream fos = null;
String path="";
if (isTest) {
// 本地测试地址
//path=Thread.currentThread().getContextClassLoader().getResource("").getPath().substring(1);
path= "D:/" + date + ".xls";
fos = new FileOutputStream(path);
} else {
// 云端生产地址
path= "/mnt/"+ date + ".xls";
fos = new FileOutputStream(path);
}
logger.info(">>>>大品类下各个基地数据汇总附件path>>>>"+path);
workbook.write(fos);
fos.close();
fileMap.put(t, path);
} catch (FileNotFoundException e) {
logger.info(">>>>大品类下各个基地数据汇总附件FileNotFoundException>>>>");
e.printStackTrace();
} catch (IOException e) {
logger.info(">>>>大品类下各个基地数据汇总附件IOException>>>>");
e.printStackTrace();
}
}
logger.info("【大品类下各个基地数据汇总附件fileMap】"+fileMap);
return fileMap;
}
// 【基地汇总-业务逻辑】逐条显示加载
private static List<Map<String, Object>> getBaseTotal(List<Map<String, Object>> list, String t,
Map<String, Object> dataMap, Map<String, Object> ruleMap, Map<String, Object> baseKV, Set<String> small,
Set<String> bases) {
// List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();
for (String base : bases) {
Map<String, Object> valMap = new HashMap<String, Object>();
valMap.put("base", base);// 基地名称
valMap.put("total", baseKV.get(base + "total"));// 合计=全线上+全线下
List<Map<String, Object>> deliDetailList = new ArrayList<Map<String, Object>>();
Map<String, Object> deliValMap = new HashMap<String, Object>();
deliValMap.put("up", baseKV.get(base + "up"));// 线上
deliValMap.put("down", baseKV.get(base + "down"));// 线下
deliDetailList.add(deliValMap);
valMap.put("lineTotal", deliDetailList);
for (String sm : small) {
List<Map<String, Object>> jdDetailList = new ArrayList<Map<String, Object>>();
Map<String, Object> jdValMap = new HashMap<String, Object>();
jdValMap.put(sm + "up", baseKV.get(base + sm + "up"));
jdValMap.put(sm + "down", baseKV.get(base + sm + "down"));
jdValMap.put(sm + "total", baseKV.get(base + sm + "total"));
jdDetailList.add(jdValMap);
valMap.put(sm + "smallName", jdDetailList);
}
list.add(valMap);
}
return list;
}
// 【基地汇总APi】
private static Map<String, Object> getBaseKV(List<DailyDto> allInitData, Set<String> base, Set<String> small) {
Map<String, Object> kvMap = new HashMap<>();
for (String ba : base) {
// 【1】///基地合计,线上合计,线下合计汇总/
// 基地总计
BigDecimal total = new BigDecimal("0");
// 基地线上总计
BigDecimal up = new BigDecimal("0");
// 基地线下总计
BigDecimal down = new BigDecimal("0");
for (DailyDto dto : allInitData) {
// 是一个基地时
if (org.apache.commons.lang3.StringUtils.isNotEmpty(dto.getStorage_base())
&&ba.equals(dto.getStorage_base())) {
if (dto.getBe_online().equals("线上")) {
up = up.add(dto.getQuantity());
} else {
down = down.add(dto.getQuantity());
}
} else {
continue;
}
}
total = up.add(down);
logger.info(">>>总数total." + total + "....线上总数up." + up + "....线下总数down." + down);
kvMap.put(ba + "total", total);// 基地汇总合计
kvMap.put(ba + "up", up);// 基地线上合计
kvMap.put(ba + "down", down);// 基地线下合计
// 【2】基地-小品类汇总/
for (String sm : small) {
// 基地小品类总计
BigDecimal jdTotal = new BigDecimal("0");
// 基地小品类线上总计
BigDecimal jdUp = new BigDecimal("0");
// 基地小品类线下总计
BigDecimal jdDown = new BigDecimal("0");
for (DailyDto dto : allInitData) {
String baseSmall = ba + sm;// 基地-小品类
String baseSmall2 = dto.getStorage_base() + dto.getGoods_type_name();// 基地-小品类
if (baseSmall.equals(baseSmall2)) {
if (dto.getBe_online().equals("线上")) {
jdUp = jdUp.add(dto.getQuantity());
} else {
jdDown = jdDown.add(dto.getQuantity());
}
} else {
continue;
}
}
jdTotal = jdUp.add(jdDown);
logger.info(ba + sm + ">>>总数total." + jdTotal + "....线上总数up." + jdUp + "....线下总数down." + jdDown);
kvMap.put(ba + sm + "total", jdTotal);// 基地汇总合计
kvMap.put(ba + sm + "up", jdUp);// 基地线上合计
kvMap.put(ba + sm + "down", jdDown);// 基地线下合计
}
}
return kvMap;
}
// 【合计汇总API】全部数据--遍历汇总成按照大品类总数,大品类线上总数。线下总数,-小品类基地线上,线下,汇总数
private static Map<String, Object> getAllKV(List<DailyDto> allInitData, Set<String> small) {
Map<String, Object> kvMap = new HashMap<>();
// 总计
BigDecimal total = new BigDecimal("0");
// 线上总计
BigDecimal up = new BigDecimal("0");
// 线下总计
BigDecimal down = new BigDecimal("0");
for (DailyDto dto : allInitData) {
if (dto.getBe_online().equals("线上")) {
up = up.add(dto.getQuantity());
} else {
down = down.add(dto.getQuantity());
}
}
total = up.add(down);
logger.info(">>>总数total." + total + "....线上总数up." + up + "....线下总数down." + down);
kvMap.put("total", total);
kvMap.put("up", up);
kvMap.put("down", down);
// 各个小品类汇总--不区分基地
for (String s : small) {
// 小品类汇总
BigDecimal smTotal = new BigDecimal("0");
// 小品类线上总计
BigDecimal smUp = new BigDecimal("0");
// 小品类线下总计
BigDecimal smDown = new BigDecimal("0");
for (DailyDto dt : allInitData) {
// 小品类包含
if (org.apache.commons.lang3.StringUtils.isNotEmpty(dt.getGoods_type_name())
&&dt.getGoods_type_name().equals(s)) {
if (dt.getBe_online().equals("线上")) {
smUp = smUp.add(dt.getQuantity());
} else {
smDown = smDown.add(dt.getQuantity());
}
}
}
kvMap.put(s + "up", smUp);// 小品类--线上
kvMap.put(s + "down", smDown);// 小品类--线下
kvMap.put(s + "total", smUp.add(smDown));// 小品类--汇总
logger.info(">>>小品类" + s + "stotal." + kvMap.get(s + "total") + "....线上总数up." + kvMap.get(s + "up")
+ "....线下总数down." + kvMap.get(s + "down"));
}
return kvMap;
}
// 【合计汇总--业务逻辑】
private static List<Map<String, Object>> getAllTotal(String daType, Map<String, Object> dataMap,
Map<String, Object> ruleMap, Map<String, Object> allKV, Set<String> small) {
List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();
Map<String, Object> valMap = new HashMap<String, Object>();
valMap.put("base", "合计");// 基地名称
valMap.put("total", allKV.get("total"));// 合计=全线上+全线下
List<Map<String, Object>> deliDetailList = new ArrayList<Map<String, Object>>();
Map<String, Object> deliValMap = new HashMap<String, Object>();
deliValMap.put("up", allKV.get("up"));// 线上
deliValMap.put("down", allKV.get("down"));// 线下
deliDetailList.add(deliValMap);
valMap.put("lineTotal", deliDetailList);
for (String sm : small) {
List<Map<String, Object>> jdDetailList = new ArrayList<Map<String, Object>>();
Map<String, Object> jdValMap = new HashMap<String, Object>();
jdValMap.put(sm + "up", allKV.get(sm + "up"));
jdValMap.put(sm + "down", allKV.get(sm + "down"));
jdValMap.put(sm + "total", allKV.get(sm + "total"));
jdDetailList.add(jdValMap);
valMap.put(sm + "smallName", jdDetailList);
}
list.add(valMap);
return list;
}
// 【汇总逻辑】--大品类下,各个基地小品类文件附件集合,k-v(大品类名称--大品类下各个小品类汇总文件附件)
public static Map<String, String> exportKV(Map<String, Object> dataMap, Map<String, Object> ruleMap, String email,
boolean isOpen, boolean isTest) {
DailyFzExcel.exportTest(dataMap, ruleMap, email, isOpen, isTest);
return null;
}
//本地测试
public static void exportTest(Map<String, Object> dataMap, Map<String, Object> ruleMap, String email,
boolean isOpen, boolean isTest) {
//大品类---大品类下各个基地附件路径
Map<String, Object> fileMap = new HashMap<>();
//小品类-基地集合
Map<String, Object> kVMap = new HashMap<>();
// 大品类集合
List<String> types = new ArrayList<>();
types.add("冰箱");
types.add("空调");
// 大品类--小品类集合
for (String t : types) {
List<DailyDto> tList = new ArrayList<>();
tList = (List<DailyDto>) dataMap.get(t);
// 小品类集合
Set<String> smalls = new HashSet();
// 基地集合
Set<String> bases = new HashSet();
tList.forEach(tt -> {
if(org.apache.commons.lang3.StringUtils.isNotEmpty(tt.getGoods_type_name())) {
smalls.add(tt.getGoods_type_name());
}
if(org.apache.commons.lang3.StringUtils.isNotEmpty(tt.getStorage_base())) {
bases.add(tt.getStorage_base());
}
});
kVMap.put(t + "small", smalls);// 大品类--小品类数据集合
kVMap.put(t + "base", bases);// 大品类---基地数据集合
}
// 导出
for (String t : types) {
// 全部数据汇总
List<DailyDto> allInitData = (List<DailyDto>) dataMap.get(t);
// 获取基地数据
Set<String> base = (Set<String>) kVMap.get(t + "base");
// 获取小品类数据
Set<String> small = (Set<String>) kVMap.get(t + "small");
// 【不区分基地合计】全部数据--遍历汇总成按照大品类总数,大品类线上总数。线下总数,-小品类基地线上,线下,汇总数
Map<String, Object> allKV = getAllKV(allInitData, small);
// 【区分基地合计】全部数据--遍历汇总成按照大品类总数,大品类线上总数。线下总数,-小品类基地线上,线下,汇总数
Map<String, Object> baseKV = getBaseKV(allInitData, base, small);
try {
List<ExcelExportEntity> colList = new ArrayList<ExcelExportEntity>();
ExcelExportEntity colEntity = new ExcelExportEntity("基地", "base");
colEntity.setNeedMerge(true);
colList.add(colEntity);
colEntity = new ExcelExportEntity("总计", "total");
colEntity.setNeedMerge(true);
colList.add(colEntity);
ExcelExportEntity deliColGroup = new ExcelExportEntity("线上下", "lineTotal");
List<ExcelExportEntity> deliColList = new ArrayList<ExcelExportEntity>();
deliColList.add(new ExcelExportEntity("线上", "up"));
deliColList.add(new ExcelExportEntity("线下", "down"));
deliColGroup.setList(deliColList);
colList.add(deliColGroup);
for (String sm : small) {
ExcelExportEntity jdColGroup = new ExcelExportEntity(sm, sm + "smallName");
List<ExcelExportEntity> jdColList = new ArrayList<ExcelExportEntity>();
jdColList.add(new ExcelExportEntity("线上", sm + "up"));
jdColList.add(new ExcelExportEntity("线下", sm + "down"));
jdColList.add(new ExcelExportEntity("汇总", sm + "total"));
jdColGroup.setList(jdColList);
colList.add(jdColGroup);
}
// List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();
// 【不区分基地】合计汇总
List<Map<String, Object>> list = getAllTotal(t, dataMap, ruleMap, allKV, small);
// 【区分基地】逐行合计
list = getBaseTotal(list, t, dataMap, ruleMap, baseKV, small, base);
String day=dataUtils.getYesterday(new Date(), 0) ;
String date =day+ "-DailyPlanTotal-" + new Date().getTime();
Workbook workbook = ExcelExportUtil.exportExcel(new ExportParams(day+"-大品类-【" + t + "】-各基地下单情况", "数据汇总"),
colList, list);
// 设置颜色
HSSFSheet sheet = (HSSFSheet) workbook.getSheetAt(0);
HSSFRow row = sheet.getRow(0);// 第1行
HSSFCell cell = row.getCell(1);// 2,1格
HSSFCellStyle cellStyle = (HSSFCellStyle) workbook.createCellStyle();
cellStyle.setFillForegroundColor((short) 13);// 设置背景色
cellStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND);
cellStyle.setFillForegroundColor(IndexedColors.PALE_BLUE.getIndex());
// cellStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER); // 设置字体居中
cell.setCellStyle(cellStyle);
// 文件附件地址
FileOutputStream fos = null;
String path="";
if (isTest) {
// 本地测试地址
//path=Thread.currentThread().getContextClassLoader().getResource("").getPath().substring(1);
path= "D:/" + t + date + ".xls";
fos = new FileOutputStream(path);
} else {
// 云端生产地址
path= "/mnt/" + t + date + ".xls";
fos = new FileOutputStream("D:/" + t + date + ".xls");
}
logger.info(">>>>大品类下各个基地数据汇总附件path>>>>"+path);
workbook.write(fos);
fos.close();
} catch (FileNotFoundException e) {
logger.info(">>>>大品类下各个基地数据汇总附件FileNotFoundException>>>>");
e.printStackTrace();
} catch (IOException e) {
logger.info(">>>>大品类下各个基地数据汇总附件IOException>>>>");
e.printStackTrace();
}
}
}
}