@Resource
private ExcelUtils excelUtils;
@Async("doSomethingExecutor")
Future doCreateStockOutExcel(Date endTime, Date beginTime, Object storeNo) {
List stockOutEoList = stockOutMapper.findByStoreNo(storeNo.toString(), beginTime, endTime);
//生成记录在缺货报表列表
if (EmptyUtil.notEmpty(stockOutEoList)) {
//在内存中创建一个Excel文件
XSSFWorkbook workbook = new XSSFWorkbook();
sheetStockOut(workbook, stockOutEoList);
String excelName = DateUtil.dateStr6(beginTime) + ".xls";
String dir = storeNo.toString() + "/" + StockOutEo.EXCEL_DIR;
String downloadUrl = aliOssUtils.putExcel(workbook, dir, excelName);
createStockOutExcel(downloadUrl, storeNo.toString(), dir + "/" + excelName, 1);
} else {
createStockOutExcel(null, storeNo.toString(), null, 0);
}
return new AsyncResult(null);
}
private void sheetStockOut(XSSFWorkbook workbook, List stockOutEoList) {
XSSFSheet sheet = workbook.createSheet("缺货报表");
//创建行,0表示第一行
XSSFRow row = sheet.createRow(0);
//创建单元格,0表示第一个单元格
row.createCell(0).setCellValue("缺货报表");
XSSFRow row1 = sheet.createRow(1);
ExcelUtils.setTableForm(row1, ExcelUtils.stockOutLists);
excelUtils.setStockOutTableData(sheet, stockOutEoList);
}
创建EXCEL工具类
@Component
public class ExcelUtils {
@Resource
private P360RequestUtils p360RequestUtils;
@Resource
private OsLog osLog;
@Resource
private RtisUtil rtisUtil;
public static List collectRowLists = Arrays.asList("移动收银", "自助收银", "扫码购", "实体销售(不含实体POS收银机)", "屈臣氏云店", "到店业务", "到家业务", "平台销售", "总计");
public static List collectLists = Arrays.asList("业务类型", "销售额", "会员销售额占比", "销售笔数", "客单价", "销售件数", "客单量", "OB销售额", "EB销售额", "OB销售额占比", "EB销售额占比", "会员卡销售量");
public static List totalLists = Arrays.asList("订单编号", "订单日期", "订单实付金额", "销售人员", "商品编码", "商品明细", "销售数量", "商品含税销售金额", "订单状态", "退货数量");
public static List detailLists = Arrays.asList("订单号", "订单日期", "订单渠道", "订单类型", "部门", "品牌", "货号", "商品名称", "数量", "销售金额", "实付金额", "销售人员");
public static List stockOutLists = Arrays.asList("日期", " 商品编码", "名称", "条形编码", "20点实时库存", "盘点数量", "备注");
public static void setTableForm(XSSFRow row, List tableFormList) {
for (int index = 0; index < tableFormList.size(); index++) {
row.createCell(index).setCellValue(tableFormList.get(index));
}
}
public static void setCollectTableData(XSSFSheet sheet, int index, List dataList) {
}
public void setDetailTableData(XSSFSheet sheet, List dataList) {
if (null != dataList && !dataList.isEmpty()) {
for (int i = 0; i < dataList.size(); i++) {
SaleDetailDTO saleDetailDTO = dataList.get(i);
XSSFRow row = sheet.createRow(i + 2);
row.createCell(0).setCellValue(saleDetailDTO.getItemNo());
row.createCell(1).setCellValue(saleDetailDTO.getOrderTime());
row.createCell(2).setCellValue(saleDetailDTO.getOrderChannel());
row.createCell(3).setCellValue(saleDetailDTO.getOrderType());
row.createCell(4).setCellValue(saleDetailDTO.getDepartment());
row.createCell(5).setCellValue(saleDetailDTO.getBrand());
row.createCell(6).setCellValue(saleDetailDTO.getItemNo());
row.createCell(7).setCellValue(saleDetailDTO.getItemNameZht());
row.createCell(8).setCellValue(saleDetailDTO.getOrderQty());
row.createCell(9).setCellValue(saleDetailDTO.getOriginPrice().toString());
row.createCell(10).setCellValue(saleDetailDTO.getActualPrice().toString());
row.createCell(11).setCellValue(saleDetailDTO.getOptName());
}
}
}
/**
* 设置缺货数据
*
* @param sheet sheet
* @param dataList dataList
*/
public void setStockOutTableData(XSSFSheet sheet, List dataList) {
if (null != dataList && !dataList.isEmpty()) {
for (int i = 0; i < dataList.size(); i++) {
StockOutEo stockOutDTO = dataList.get(i);
XSSFRow row = sheet.createRow(i + 2);
//日期
row.createCell(0).setCellValue(DateUtil.dateStr2(stockOutDTO.getCreateTime()));
//商品编码
row.createCell(1).setCellValue(stockOutDTO.getItemNo());
//名称
row.createCell(2).setCellValue(stockOutDTO.getItemNameZht());
//条形编码
try {
AppointProductByItemResp appointProductByItemResp = p360RequestUtils.requestItemDetail(Arrays.asList(stockOutDTO.getItemNo()), stockOutDTO.getStoreNo());
if (EmptyUtil.notEmpty(appointProductByItemResp) && appointProductByItemResp.getSuccess()) {
ProductList data = appointProductByItemResp.getData();
if (EmptyUtil.notEmpty(data) && EmptyUtil.notEmpty(data.getProductList())) {
List productList = data.getProductList();
productList.forEach(a -> {
String barcode = a.getProductBase().getBarcode();
row.createCell(3).setCellValue(barcode);
});
}
}
} catch (Exception e) {
osLog.error(ResultEnum.P360_GET_PRODUCT.getCode(), ResultEnum.P360_GET_PRODUCT.getMsg(), e);
}
//实时库存
try {
AvaliableStock availableStock = rtisUtil.getAvailableStock(Arrays.asList(stockOutDTO.getItemNo()), Arrays.asList(stockOutDTO.getStoreNo()));
if (EmptyUtil.notEmpty(availableStock) && availableStock.getSuccess()) {
StoreList data = availableStock.getData();
if (EmptyUtil.notEmpty(data)) {
List storeList = data.getStoreList();
if (EmptyUtil.notEmpty(storeList)) {
row.createCell(4).setCellValue(storeList.get(0).getQty());
}
}
}
} catch (Exception e) {
osLog.error(ResultEnum.RTIS_GET_PRODUCT.getCode(), ResultEnum.RTIS_GET_PRODUCT.getMsg(), e);
}
//盘点数量
row.createCell(5).setCellValue("");
//备注
row.createCell(6).setCellValue("");
}
}
}
}
OSS工具类
@Component
public class AliOssUtils {
@Value("${oss.ali.endpoint:}")
private String endpoint;
@Value("${oss.ali.accessKeyId:}")
private String accessKeyId;
@Value("${oss.ali.accessKeySecret:}")
private String accessKeySecret;
@Value("${oss.ali.bucketName:}")
private String bucketName;
@Value("${oss.ali.domainUrl:}")
private String domainUrl;
@Resource
private OsLog osLog;
public OSS getOssClient() {
// 创建OSSClient实例。
return new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
}
public String getDomainUrl() {
return domainUrl;
}
/**
* 上传excel
*
* @param workbook
* @param dir 目录
* @param excelName 文件名
* @return
*/
public String putExcel(XSSFWorkbook workbook, String dir, String excelName) {
ByteArrayOutputStream bos = new ByteArrayOutputStream();
try {
workbook.write(bos);
} catch (IOException e) {
} finally {
try {
bos.close();
} catch (IOException e) {
}
}
byte[] brray = bos.toByteArray();
InputStream is = new ByteArrayInputStream(brray);
OSS ossClient = getOssClient();
try {
// 创建PutObjectRequest对象。
PutObjectRequest putObjectRequest = new PutObjectRequest(bucketName, dir + "/" + excelName, is);
// 如果需要上传时设置存储类型和访问权限,请参考以下示例代码。
// ObjectMetadata metadata = new ObjectMetadata();
// metadata.setHeader(OSSHeaders.OSS_STORAGE_CLASS, StorageClass.Standard.toString());
// metadata.setObjectAcl(CannedAccessControlList.Private);
// putObjectRequest.setMetadata(metadata);
// 上传文件
ossClient.putObject(putObjectRequest);
//设置过期时间
LocalDateTime time = LocalDateTime.now().plusDays(5);
Date expiration = Date.from(time.atZone(ZoneId.systemDefault()).toInstant());
return ossClient.generatePresignedUrl(bucketName, dir + "/" + excelName, expiration).toString();
} catch (OSSException oe) {
osLog.error(ResultEnum.SYS_ERROR.getCode(), ResultEnum.SYS_ERROR.getMsg(), oe.getErrorMessage());
} catch (ClientException ce) {
osLog.error(ResultEnum.SYS_ERROR.getCode(), ResultEnum.SYS_ERROR.getMsg(), ce.getErrorMessage());
} finally {
if (ossClient != null) {
ossClient.shutdown();
}
}
return null;
}
public void deleteExcel(String excelUrl) {
if (EmptyUtil.notEmpty(excelUrl)) {
OSS ossClient = getOssClient();
try {
boolean b = ossClient.doesObjectExist(bucketName, excelUrl);
if (b) {
ossClient.deleteObject(bucketName, excelUrl);
}
} catch (OSSException oe) {
osLog.error(ResultEnum.SYS_ERROR.getCode(), ResultEnum.SYS_ERROR.getMsg(), oe.getErrorMessage());
} catch (ClientException ce) {
osLog.error(ResultEnum.SYS_ERROR.getCode(), ResultEnum.SYS_ERROR.getMsg(), ce.getErrorMessage());
} finally {
if (EmptyUtil.notEmpty(ossClient)) {
ossClient.shutdown();
}
}
}
}
}