From 7992cd7adb57f8f2cb4b4fa295afb8894c24d0bf Mon Sep 17 00:00:00 2001 From: Helius <wangdoubleone@gmail.com> Date: Wed, 18 May 2022 17:19:34 +0800 Subject: [PATCH] add export for deliver --- src/main/java/cc/mrbird/febs/mall/mapper/MallOrderInfoMapper.java | 4 src/main/java/cc/mrbird/febs/others/controller/EximportController.java | 2 src/main/resources/templates/febs/views/modules/score/orderList.html | 16 + src/main/java/cc/mrbird/febs/mall/service/impl/AdminMallOrderService.java | 23 + src/main/java/cc/mrbird/febs/common/utils/excl/ExcelSheetPO.java | 68 ++++ src/main/java/cc/mrbird/febs/monitor/controller/SessionController.java | 3 src/main/resources/mapper/modules/MallOrderInfoMapper.xml | 41 ++ pom.xml | 26 + src/main/java/cc/mrbird/febs/mall/service/IAdminMallOrderService.java | 4 src/main/java/cc/mrbird/febs/generator/service/impl/GeneratorConfigServiceImpl.java | 2 src/main/java/cc/mrbird/febs/common/utils/excl/ExcelVersion.java | 46 +++ src/main/java/cc/mrbird/febs/mall/entity/MallExpressInfo.java | 2 src/main/java/cc/mrbird/febs/common/utils/excl/ResponseHeadUtil.java | 18 + src/main/java/cc/mrbird/febs/mall/controller/AdminMallOrderController.java | 191 +++++++++++-- src/main/resources/templates/febs/views/modules/order/orderList.html | 67 ++- src/main/java/cc/mrbird/febs/common/utils/excl/ExcelUtil.java | 322 +++++++++++++++++++++++ src/main/java/cc/mrbird/febs/mall/dto/DeliverGoodsDto.java | 4 17 files changed, 775 insertions(+), 64 deletions(-) diff --git a/pom.xml b/pom.xml index 6a367e2..cef71ae 100644 --- a/pom.xml +++ b/pom.xml @@ -291,6 +291,32 @@ </exclusion> </exclusions> </dependency> + + <!--excel读取 --> + <dependency> + <groupId>org.apache.commons</groupId> + <artifactId>commons-csv</artifactId> + <version>1.5</version> + </dependency> + + <dependency> + <groupId>org.apache.poi</groupId> + <artifactId>poi-ooxml</artifactId> + <version>3.8</version> + </dependency> + + <dependency> + <groupId>org.apache.poi</groupId> + <artifactId>poi</artifactId> + <version>3.8</version> + </dependency> + + <!-- https://mvnrepository.com/artifact/org.apache.poi/poi-ooxml-schemas --> + <dependency> + <groupId>org.apache.poi</groupId> + <artifactId>poi-ooxml-schemas</artifactId> + <version>3.8</version> + </dependency> </dependencies> <build> diff --git a/src/main/java/cc/mrbird/febs/common/utils/excl/ExcelSheetPO.java b/src/main/java/cc/mrbird/febs/common/utils/excl/ExcelSheetPO.java new file mode 100644 index 0000000..ecb6b50 --- /dev/null +++ b/src/main/java/cc/mrbird/febs/common/utils/excl/ExcelSheetPO.java @@ -0,0 +1,68 @@ +package cc.mrbird.febs.common.utils.excl; + +import java.util.List; + +/** + * 定义表格的数据对象 + * @author JIANGYOUYAO + * @email 935090232@qq.com + * @date 2017年12月20日 + */ +public class ExcelSheetPO { + + /** + * sheet的名称 + */ + private String sheetName; + + + /** + * 表格标题 + */ + private String title; + + /** + * 头部标题集合 + */ + private String[] headers; + + /** + * 数据集合 + */ + private List<List<Object>> dataList; + + public String getTitle() { + return title; + } + + public void setTitle(String title) { + this.title = title; + } + + public String[] getHeaders() { + return headers; + } + + public void setHeaders(String[] headers) { + this.headers = headers; + } + + public List<List<Object>> getDataList() { + return dataList; + } + + public void setDataList(List<List<Object>> dataList) { + this.dataList = dataList; + } + + public String getSheetName() { + return sheetName; + } + + public void setSheetName(String sheetName) { + this.sheetName = sheetName; + } + + + +} diff --git a/src/main/java/cc/mrbird/febs/common/utils/excl/ExcelUtil.java b/src/main/java/cc/mrbird/febs/common/utils/excl/ExcelUtil.java new file mode 100644 index 0000000..51d799b --- /dev/null +++ b/src/main/java/cc/mrbird/febs/common/utils/excl/ExcelUtil.java @@ -0,0 +1,322 @@ +package cc.mrbird.febs.common.utils.excl; + +import cn.hutool.core.util.ArrayUtil; +import org.apache.commons.collections.CollectionUtils; +import org.apache.commons.lang.ArrayUtils; +import org.apache.poi.hssf.usermodel.HSSFCellStyle; +import org.apache.poi.hssf.usermodel.HSSFDateUtil; +import org.apache.poi.hssf.usermodel.HSSFWorkbook; +import org.apache.poi.ss.usermodel.*; +import org.apache.poi.ss.util.CellRangeAddress; +import org.apache.poi.ss.util.WorkbookUtil; +import org.apache.poi.xssf.streaming.SXSSFWorkbook; +import org.apache.poi.xssf.usermodel.XSSFWorkbook; + +import java.io.*; +import java.text.DecimalFormat; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.LinkedList; +import java.util.List; + +/** + * excel工具类 提供读取和写入excel的功能 + * + * @author JIANGYOUYAO + * @email 935090232@qq.com + * @date 2017年12月20日 + */ +public class ExcelUtil { + + /** + * 标题样式 + */ + private final static String STYLE_HEADER = "header"; + /** + * 表头样式 + */ + private final static String STYLE_TITLE = "title"; + /** + * 数据样式 + */ + private final static String STYLE_DATA = "data"; + + private static String getFileExtName(File file) { + String fileName = file.getName(); + String prefix = fileName.substring(fileName.lastIndexOf(".") ); + return prefix; + } + + /** + * 读取excel文件里面的内容 支持日期,数字,字符,函数公式,布尔类型 + * + * @param file + * @param rowCount + * @param columnCount + * @return + * @throws FileNotFoundException + * @throws IOException + * @author JIANGYOUYAO + * @email 935090232@qq.com + * @date 2017年12月20日 + */ + public static List<ExcelSheetPO> readExcel(File file, Integer rowCount, Integer columnCount) + throws FileNotFoundException, IOException { + + // 根据后缀名称判断excel的版本 + String extName = getFileExtName(file); + Workbook wb = null; + if (ExcelVersion.V2003.getSuffix().equals(extName)) { + wb = new HSSFWorkbook(new FileInputStream(file)); + + } else if (ExcelVersion.V2007.getSuffix().equals(extName)) { + wb = new XSSFWorkbook(new FileInputStream(file)); + + } else { + // 无效后缀名称,这里之能保证excel的后缀名称,不能保证文件类型正确,不过没关系,在创建Workbook的时候会校验文件格式 + throw new IllegalArgumentException("Invalid excel version"); + } + // 开始读取数据 + List<ExcelSheetPO> sheetPOs = new ArrayList<>(); + // 解析sheet + for (int i = 0; i < wb.getNumberOfSheets(); i++) { + Sheet sheet = wb.getSheetAt(i); + List<List<Object>> dataList = new ArrayList<>(); + ExcelSheetPO sheetPO = new ExcelSheetPO(); + sheetPO.setSheetName(sheet.getSheetName()); + sheetPO.setDataList(dataList); + int readRowCount = 0; + if (rowCount == null || rowCount > sheet.getPhysicalNumberOfRows()) { + readRowCount = sheet.getPhysicalNumberOfRows(); + } else { + readRowCount = rowCount; + } + // 解析sheet 的行 + for (int j = sheet.getFirstRowNum(); j < readRowCount; j++) { + Row row = sheet.getRow(j); + if (row == null) { + continue; + } + if (row.getFirstCellNum() < 0) { + continue; + } + int readColumnCount = 0; + if (columnCount == null || columnCount > row.getLastCellNum()) { + readColumnCount = (int) row.getLastCellNum(); + } else { + readColumnCount = columnCount; + } + List<Object> rowValue = new LinkedList<Object>(); + // 解析sheet 的列 + for (int k = 0; k < readColumnCount; k++) { + Cell cell = row.getCell(k); + rowValue.add(getCellValue(wb, cell)); + } + dataList.add(rowValue); + } + sheetPOs.add(sheetPO); + } + return sheetPOs; + } + + + + + + private static Object getCellValue(Workbook wb, Cell cell) { + Object columnValue = null; + if (cell != null) { + // 格式化 number + DecimalFormat df = new DecimalFormat("0"); + // String + // 字符 + // 格式化日期字符串 + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + // 格式化数字 + DecimalFormat nf = new DecimalFormat("0.00"); + switch (cell.getCellType()) { + case Cell.CELL_TYPE_STRING: + columnValue = cell.getStringCellValue(); + break; + case Cell.CELL_TYPE_NUMERIC: + if ("@".equals(cell.getCellStyle().getDataFormatString())) { + columnValue = df.format(cell.getNumericCellValue()); + } else if ("General".equals(cell.getCellStyle().getDataFormatString())) { + columnValue = nf.format(cell.getNumericCellValue()); + } else { + columnValue = sdf.format(HSSFDateUtil.getJavaDate(cell.getNumericCellValue())); + } + break; + case Cell.CELL_TYPE_BOOLEAN: + columnValue = cell.getBooleanCellValue(); + break; + case Cell.CELL_TYPE_BLANK: + columnValue = ""; + break; + case Cell.CELL_TYPE_FORMULA: + // 格式单元格 + FormulaEvaluator evaluator = wb.getCreationHelper().createFormulaEvaluator(); + evaluator.evaluateFormulaCell(cell); + CellValue cellValue = evaluator.evaluate(cell); + columnValue = cellValue.getNumberValue(); + break; + default: + columnValue = cell.toString(); + } + } + return columnValue; + } + + /** + * 在硬盘上写入excel文件 + * + * @param version + * @param excelSheets + * @param filePath + * @throws IOException + * @author JIANGYOUYAO + * @email 935090232@qq.com + * @date 2017年12月20日 + */ + public static void createWorkbookAtDisk(ExcelVersion version, List<ExcelSheetPO> excelSheets, String filePath) + throws IOException { + FileOutputStream fileOut = new FileOutputStream(filePath); + createWorkbookAtOutStream(version, excelSheets, fileOut, true); + } + + /** + * 把excel表格写入输出流中 + * + * @param version + * @param excelSheets + * @param outStream + * @param closeStream 是否关闭输出流 + * @throws IOException + * @author JIANGYOUYAO + * @email 935090232@qq.com + * @date 2017年12月20日 + */ + public static void createWorkbookAtOutStream(ExcelVersion version, List<ExcelSheetPO> excelSheets, + OutputStream outStream, boolean closeStream) throws IOException { + if (CollectionUtils.isNotEmpty(excelSheets)) { + Workbook wb = createWorkBook(version, excelSheets); + wb.write(outStream); + if (closeStream) { + outStream.close(); + } + } + } + + private static Workbook createWorkBook(ExcelVersion version, List<ExcelSheetPO> excelSheets) { + Workbook wb = getWorkbookInstance(version); + for (int i = 0; i < excelSheets.size(); i++) { + ExcelSheetPO excelSheetPO = excelSheets.get(i); + if (excelSheetPO.getSheetName() == null) { + excelSheetPO.setSheetName("sheet" + i); + } + // 过滤特殊字符 + Sheet tempSheet = wb.createSheet(WorkbookUtil.createSafeSheetName(excelSheetPO.getSheetName())); + buildSheetData(wb, tempSheet, excelSheetPO, version); + } + return wb; + } + + private static void buildSheetData(Workbook wb, Sheet sheet, ExcelSheetPO excelSheetPO, ExcelVersion version) { + sheet.setDefaultRowHeight((short) 400); + sheet.setDefaultColumnWidth((short) 10); + createTitle(sheet, excelSheetPO, wb, version); + createHeader(sheet, excelSheetPO, wb, version); + createBody(sheet, excelSheetPO, wb, version); + } + + private static void createBody(Sheet sheet, ExcelSheetPO excelSheetPO, Workbook wb, ExcelVersion version) { + List<List<Object>> dataList = excelSheetPO.getDataList(); + for (int i = 0; i < dataList.size() && i < version.getMaxRow(); i++) { + List<Object> values = dataList.get(i); + Row row = sheet.createRow(2 + i); + for (int j = 0; j < values.size() && j < version.getMaxColumn(); j++) { + Cell cell = row.createCell(j); + Object value = values.get(j); + if (value == null) { + value = ""; + } + cell.setCellValue(String.valueOf(value)); + } + } + } + + private static void createHeader(Sheet sheet, ExcelSheetPO excelSheetPO, Workbook wb, ExcelVersion version) { + String[] headers = excelSheetPO.getHeaders(); + Row row = sheet.createRow(1); + for (int i = 0; i < headers.length && i < version.getMaxColumn(); i++) { + Cell cellHeader = row.createCell(i); + cellHeader.setCellStyle(getStyle(STYLE_HEADER, wb)); + cellHeader.setCellValue(headers[i]); + } + + } + + private static void createTitle(Sheet sheet, ExcelSheetPO excelSheetPO, Workbook wb, ExcelVersion version) { + Row titleRow = sheet.createRow(0); + Cell titleCel = titleRow.createCell(0); + titleCel.setCellValue(excelSheetPO.getTitle()); + titleCel.setCellStyle(getStyle(STYLE_TITLE, wb)); + // 限制最大列数 + if (ArrayUtil.isNotEmpty(excelSheetPO.getHeaders())) { + int column = excelSheetPO.getHeaders().length > version.getMaxColumn() ? version.getMaxColumn() + : excelSheetPO.getHeaders().length; + sheet.addMergedRegion(new CellRangeAddress(0, 0, 0, column - 1)); + } + + } + + private static CellStyle getStyle(String type, Workbook wb) { + + HashMap<String, CellStyle> cellStyleMap = new HashMap<>(); + if (cellStyleMap.containsKey(type)) { + return cellStyleMap.get(type); + } + // 生成一个样式 + CellStyle style = wb.createCellStyle(); +// style.setBorderBottom(HSSFCellStyle.BORDER_THIN); +// style.setBorderLeft(HSSFCellStyle.BORDER_THIN); +// style.setBorderRight(HSSFCellStyle.BORDER_THIN); +// style.setBorderTop(HSSFCellStyle.BORDER_THIN); + style.setWrapText(true); + + if (STYLE_HEADER == type) { + style.setAlignment(HSSFCellStyle.ALIGN_CENTER); + Font font = wb.createFont(); + font.setFontHeightInPoints((short) 16); + font.setBoldweight(Font.BOLDWEIGHT_BOLD); + style.setFont(font); + } else if (STYLE_TITLE == type) { + style.setAlignment(HSSFCellStyle.ALIGN_CENTER); + Font font = wb.createFont(); + font.setFontHeightInPoints((short) 18); + font.setBoldweight(Font.BOLDWEIGHT_BOLD); + style.setFont(font); + } else if (STYLE_DATA == type) { + style.setAlignment(HSSFCellStyle.ALIGN_LEFT); + Font font = wb.createFont(); + font.setFontHeightInPoints((short) 12); + style.setFont(font); + } + cellStyleMap.put(type, style); + return style; + } + + private static Workbook getWorkbookInstance(ExcelVersion version) { + switch (version) { + case V2003: + return new HSSFWorkbook(); + case V2007: + return new XSSFWorkbook(); + case V_BIGDATA: + return new SXSSFWorkbook(2000); + default: + throw new IllegalArgumentException("param is not defind"); + } + } +} diff --git a/src/main/java/cc/mrbird/febs/common/utils/excl/ExcelVersion.java b/src/main/java/cc/mrbird/febs/common/utils/excl/ExcelVersion.java new file mode 100644 index 0000000..0d64528 --- /dev/null +++ b/src/main/java/cc/mrbird/febs/common/utils/excl/ExcelVersion.java @@ -0,0 +1,46 @@ +package cc.mrbird.febs.common.utils.excl; + +/** + * excel版本枚举 + * + * @author JIANGYOUYAO + * @email 935090232@qq.com + * @date 2017年12月20日 + */ +public enum ExcelVersion { + + /** + * 虽然V2007版本支持最大支持1048575 * 16383 , + * V2003版支持65535*255 + * 但是在实际应用中如果使用如此庞大的对象集合会导致内存溢出, + * 因此这里限制最大为10000*100,如果还要加大建议先通过单元测试进行性能测试。 + * 1000*100 全部导出预计时间为27s左右 + */ + V2003(".xls", 65535, 100), V2007(".xlsx", 65535, 100), V_BIGDATA(".xlsx", 5048576, 16384); + + private String suffix; + + private int maxRow; + + private int maxColumn; + + ExcelVersion(String suffix, int maxRow, int maxColumn) { + this.suffix = suffix; + this.maxRow = maxRow; + this.maxColumn = maxColumn; + } + + public String getSuffix() { + return this.suffix; + } + + public int getMaxRow() { + return maxRow; + } + + + public int getMaxColumn() { + return maxColumn; + } + +} diff --git a/src/main/java/cc/mrbird/febs/common/utils/excl/ResponseHeadUtil.java b/src/main/java/cc/mrbird/febs/common/utils/excl/ResponseHeadUtil.java new file mode 100644 index 0000000..2c51b41 --- /dev/null +++ b/src/main/java/cc/mrbird/febs/common/utils/excl/ResponseHeadUtil.java @@ -0,0 +1,18 @@ +package cc.mrbird.febs.common.utils.excl; + +import javax.servlet.http.HttpServletResponse; + +public class ResponseHeadUtil { + + /** + * 设置文件头部 + * @param response + */ + public static HttpServletResponse setExcelHead(HttpServletResponse response) { + response.setCharacterEncoding("UTF-8"); + response.setHeader("content-type", "application/octet-stream;charset=UTF-8"); + response.setContentType("application/octet-stream;charset=UTF-8"); + return response; + } + +} diff --git a/src/main/java/cc/mrbird/febs/generator/service/impl/GeneratorConfigServiceImpl.java b/src/main/java/cc/mrbird/febs/generator/service/impl/GeneratorConfigServiceImpl.java index de682c1..777900c 100644 --- a/src/main/java/cc/mrbird/febs/generator/service/impl/GeneratorConfigServiceImpl.java +++ b/src/main/java/cc/mrbird/febs/generator/service/impl/GeneratorConfigServiceImpl.java @@ -4,7 +4,7 @@ import cc.mrbird.febs.generator.mapper.GeneratorConfigMapper; import cc.mrbird.febs.generator.service.IGeneratorConfigService; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import org.apache.commons.collections4.CollectionUtils; +import org.apache.commons.collections.CollectionUtils; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Propagation; import org.springframework.transaction.annotation.Transactional; diff --git a/src/main/java/cc/mrbird/febs/mall/controller/AdminMallOrderController.java b/src/main/java/cc/mrbird/febs/mall/controller/AdminMallOrderController.java index c1ede1b..aa1317a 100644 --- a/src/main/java/cc/mrbird/febs/mall/controller/AdminMallOrderController.java +++ b/src/main/java/cc/mrbird/febs/mall/controller/AdminMallOrderController.java @@ -6,6 +6,10 @@ import cc.mrbird.febs.common.entity.FebsResponse; import cc.mrbird.febs.common.entity.QueryRequest; import cc.mrbird.febs.common.exception.FebsException; +import cc.mrbird.febs.common.utils.excl.ExcelSheetPO; +import cc.mrbird.febs.common.utils.excl.ExcelUtil; +import cc.mrbird.febs.common.utils.excl.ExcelVersion; +import cc.mrbird.febs.common.utils.excl.ResponseHeadUtil; import cc.mrbird.febs.mall.dto.*; import cc.mrbird.febs.mall.entity.*; import cc.mrbird.febs.mall.mapper.MallOrderRefundOperationMapper; @@ -14,13 +18,22 @@ import cc.mrbird.febs.mall.vo.AdminAddAddressTreeVo; import cc.mrbird.febs.mall.vo.AdminMallOrderRefundAddressVo; import cc.mrbird.febs.system.entity.Dept; +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.StrUtil; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; +import javax.servlet.http.HttpServletResponse; import javax.validation.Valid; import javax.validation.constraints.NotNull; +import java.io.*; +import java.net.URLEncoder; +import java.util.ArrayList; +import java.util.Date; import java.util.List; import java.util.Map; @@ -35,6 +48,7 @@ /** * 订单列表 + * * @param mallOrderInfo * @param request * @return @@ -56,6 +70,7 @@ /** * 订单列表-取消订单 + * * @param id * @return */ @@ -67,6 +82,7 @@ /** * 订单退款-列表 + * * @param mallOrderRefundDto * @param request * @return @@ -81,9 +97,9 @@ * 订单退款-详情 */ @GetMapping("/seeRefund") - public FebsResponse seeRefund(QueryRequest request, MallOrderRefund mallOrderRefund,Integer parentId) { - if(parentId==null){ - ViewMallOrderController.idFromRefund=0; + public FebsResponse seeRefund(QueryRequest request, MallOrderRefund mallOrderRefund, Integer parentId) { + if (parentId == null) { + ViewMallOrderController.idFromRefund = 0; } mallOrderRefund.setId(ViewMallOrderController.idFromRefund); Map<String, Object> dataTable = getDataTable(adminMallOrderService.seeRefund(request, mallOrderRefund)); @@ -92,6 +108,7 @@ /** * 订单退款-同意 + * * @param id * @return */ @@ -103,6 +120,7 @@ /** * 订单退款-拒绝 + * * @param id * @return */ @@ -114,6 +132,7 @@ /** * 订单退款-退款确认 + * * @param id * @return */ @@ -125,6 +144,7 @@ /** * 订单退款地址-列表 + * * @param mallOrderRefundAddressDto * @param request * @return @@ -146,6 +166,7 @@ /** * 订单退款地址-删除 + * * @param id * @return */ @@ -169,7 +190,7 @@ */ @GetMapping("addAddress/tree") @ControllerEndpoint(exceptionMessage = "获取地址失败") - public List<AdminAddAddressTreeVo> getRefundAddress(){ + public List<AdminAddAddressTreeVo> getRefundAddress() { return adminMallOrderService.getRefundAddress(); } @@ -184,6 +205,7 @@ /** * 商家支付方式-列表 + * * @param payMethodDto * @param request * @return @@ -203,36 +225,139 @@ return adminMallOrderService.payMethodEdit(payMethodEditDto); } + @GetMapping("exportOrderList") + @ControllerEndpoint(operation = "订单列表", exceptionMessage = "导出失败") + public FebsResponse exportOrderList(MallOrderInfo mallOrderInfo, HttpServletResponse response) throws IOException { + + List<ExcelSheetPO> res = new ArrayList<>(); + ExcelSheetPO orderSheet = new ExcelSheetPO(); + String title = "订单列表"; + orderSheet.setSheetName(title); + orderSheet.setTitle(title); + String[] header = {"订单编号", "订单金额", "下单时间", "配送方式", "收货姓名", "收货电话", "收货地址", "商品名称", "订单状态", "物流单号", "物流公司", "物流公司码"}; + orderSheet.setHeaders(header); + + QueryRequest request = new QueryRequest(); + request.setPageNum(1); + request.setPageSize(9999); + List<MallOrderInfo> dataList = adminMallOrderService.findOrderListInPage(mallOrderInfo, request).getRecords(); + List<List<Object>> list = new ArrayList<>(); + if (dataList.size() > 0) { + for (MallOrderInfo item : dataList) { + List<Object> temp = new ArrayList<>(); + temp.add(item.getOrderNo()); + temp.add(item.getAmount()); + temp.add(DateUtil.format(item.getOrderTime(), "yyyy-MM-dd HH:mm:ss")); + temp.add("快递配送"); + temp.add(item.getName()); + temp.add(item.getPhone()); + temp.add(item.getAddress()); + if (CollUtil.isNotEmpty(item.getItems())) { + StringBuilder sb = new StringBuilder(); + + for (MallOrderItem itemItem : item.getItems()) { + if (StrUtil.isNotBlank(sb)) { + sb.append(";" + itemItem.getGoodsName() + "*" + itemItem.getCnt()); + } else { + sb.append(itemItem.getGoodsName() + "*" + itemItem.getCnt()); + } + } + temp.add(sb.toString()); + } else { + temp.add(""); + } + + temp.add(item.getStatus()); + list.add(temp); + } + } + orderSheet.setDataList(list); + res.add(orderSheet); + response = ResponseHeadUtil.setExcelHead(response); + response.setHeader("Content-Disposition", + "attachment;filename=" + URLEncoder.encode(title + DateUtil.format(new Date(), "yyyyMMDDHHmmss") + ".xlsx".trim(), "UTF-8")); + OutputStream os = response.getOutputStream(); + ExcelUtil.createWorkbookAtOutStream(ExcelVersion.V2007, res, os, true); + return null; + } + + @PostMapping(value = "/importDeliver") + @ControllerEndpoint(operation = "导入发货", exceptionMessage = "导入失败") + public FebsResponse importDeliver(@RequestBody MultipartFile file) throws IOException { + if (file.isEmpty()) { + return new FebsResponse().fail(); + } + + String fileName = file.getOriginalFilename(); + String dirPath = "/Users/helius/Documents/"; + + File saveFile = new File(new File(dirPath).getAbsolutePath() + File.separator + fileName); + if (!saveFile.exists()) { + if (!saveFile.getParentFile().exists()) { + saveFile.getParentFile().mkdirs(); + } + } + + file.transferTo(saveFile); + + List<ExcelSheetPO> data = ExcelUtil.readExcel(saveFile, null, null); + if (CollUtil.isEmpty(data)) { + return new FebsResponse().fail(); + } + + List<List<Object>> dataList = data.get(0).getDataList(); + + int expressNoIndex = -1; + int expressComIndex = -1; + int expressCodeIndex = -1; + for (int i = 1; i < dataList.size(); i++) { + List<Object> objects = dataList.get(i); + + String expressNo = ""; + String expressCode = ""; + String expressCom = ""; + for (int j = 0; j < objects.size(); j++) { + Object obj = objects.get(j); + if ("物流单号".equals(obj)) { + expressNoIndex = j; + } + + if ("物流公司".equals(obj)) { + expressComIndex = j; + } + + if ("物流公司码".equals(obj)) { + expressCodeIndex = j; + } + + if (j == expressNoIndex) { + expressNo = (String) objects.get(j); + } + + if (j == expressComIndex) { + expressCom = (String) objects.get(j); + } + + if (j == expressCodeIndex) { + expressCode = (String) objects.get(j);; + } + + } + + if (StrUtil.isNotBlank(expressNo) && StrUtil.isNotBlank(expressCode) && StrUtil.isNotBlank(expressCom)) { + String orderNo = (String) objects.get(0); + + DeliverGoodsDto deliverGoods = new DeliverGoodsDto(); + deliverGoods.setOrderNo(orderNo); + deliverGoods.setExpressCom(expressCom); + deliverGoods.setExpressCode(expressCode); + deliverGoods.setExpressNo(expressNo); + adminMallOrderService.deliverGoodsByOrderNo(deliverGoods); + } - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + } + return new FebsResponse().success(); + } } diff --git a/src/main/java/cc/mrbird/febs/mall/dto/DeliverGoodsDto.java b/src/main/java/cc/mrbird/febs/mall/dto/DeliverGoodsDto.java index bc4131e..436bbd3 100644 --- a/src/main/java/cc/mrbird/febs/mall/dto/DeliverGoodsDto.java +++ b/src/main/java/cc/mrbird/febs/mall/dto/DeliverGoodsDto.java @@ -13,4 +13,8 @@ private String expressCom; + private String expressCode; + + private String orderNo; + } diff --git a/src/main/java/cc/mrbird/febs/mall/entity/MallExpressInfo.java b/src/main/java/cc/mrbird/febs/mall/entity/MallExpressInfo.java index 1d4fb70..b632a13 100644 --- a/src/main/java/cc/mrbird/febs/mall/entity/MallExpressInfo.java +++ b/src/main/java/cc/mrbird/febs/mall/entity/MallExpressInfo.java @@ -20,4 +20,6 @@ private String expressNo; private String expressCom; + + private String expressCode; } diff --git a/src/main/java/cc/mrbird/febs/mall/mapper/MallOrderInfoMapper.java b/src/main/java/cc/mrbird/febs/mall/mapper/MallOrderInfoMapper.java index 8f437dd..86b842e 100644 --- a/src/main/java/cc/mrbird/febs/mall/mapper/MallOrderInfoMapper.java +++ b/src/main/java/cc/mrbird/febs/mall/mapper/MallOrderInfoMapper.java @@ -23,6 +23,8 @@ **/ public interface MallOrderInfoMapper extends BaseMapper<MallOrderInfo> { + IPage<MallOrderInfo> selectInPage(@Param("record") MallOrderInfo mallOrderInfo, IPage<MallOrderInfo> page); + MallOrderInfo selectOrderByMemberIdAndId(@Param("memberId") Long memberId, @Param("id") Long id); IPage<AdminMallOrderInfoVo> selectOrderListInPage(Page<AdminMallOrderInfoVo> page, @Param("record") MallOrderInfoDto mallOrderInfo); @@ -48,4 +50,6 @@ BigDecimal selectTotalAmount(@Param("memberId") Long memberId); BigDecimal selectTotalAmountForDate(@Param("date") Date date, @Param("member") Long memberId); + + MallOrderInfo selectByOrderNo(@Param("orderNo") String orderNo); } diff --git a/src/main/java/cc/mrbird/febs/mall/service/IAdminMallOrderService.java b/src/main/java/cc/mrbird/febs/mall/service/IAdminMallOrderService.java index 1214367..03b3e22 100644 --- a/src/main/java/cc/mrbird/febs/mall/service/IAdminMallOrderService.java +++ b/src/main/java/cc/mrbird/febs/mall/service/IAdminMallOrderService.java @@ -13,12 +13,16 @@ public interface IAdminMallOrderService extends IService<MallOrderInfo> { + IPage<MallOrderInfo> findOrderListInPage(MallOrderInfo mallOrderInfo, QueryRequest request); + IPage<AdminMallOrderInfoVo> getOrderListInPage(MallOrderInfoDto mallOrderInfo, QueryRequest request); AdminMallOrderVo getMallOrderInfoById(long id); FebsResponse deliverGoods(DeliverGoodsDto deliverGoodsDto); + void deliverGoodsByOrderNo(DeliverGoodsDto deliverGoodsDto); + AdminOrderDetailVo getMallOrderDetailById(long id); IPage<AdminMallOrderRefundVo> getRefundListInPage(MallOrderRefundDto mallOrderRefundDto, QueryRequest request); diff --git a/src/main/java/cc/mrbird/febs/mall/service/impl/AdminMallOrderService.java b/src/main/java/cc/mrbird/febs/mall/service/impl/AdminMallOrderService.java index 2bbfb79..da38eb6 100644 --- a/src/main/java/cc/mrbird/febs/mall/service/impl/AdminMallOrderService.java +++ b/src/main/java/cc/mrbird/febs/mall/service/impl/AdminMallOrderService.java @@ -48,6 +48,12 @@ private final DataDictionaryCustomMapper dataDictionaryCustomMapper; @Override + public IPage<MallOrderInfo> findOrderListInPage(MallOrderInfo mallOrderInfo, QueryRequest request) { + Page<MallOrderInfo> page = new Page<>(request.getPageNum(), request.getPageSize()); + return this.baseMapper.selectInPage(mallOrderInfo, page); + } + + @Override public IPage<AdminMallOrderInfoVo> getOrderListInPage(MallOrderInfoDto mallOrderInfo, QueryRequest request) { Page<AdminMallOrderInfoVo> page = new Page<>(request.getPageNum(), request.getPageSize()); IPage<AdminMallOrderInfoVo> adminMallOrderInfoVos = this.baseMapper.selectOrderListInPage(page, mallOrderInfo); @@ -359,5 +365,22 @@ return adminMallMemberPaymentVo; } + @Override + public void deliverGoodsByOrderNo(DeliverGoodsDto deliverGoodsDto) { + MallOrderInfo mallOrderInfo = mallOrderInfoMapper.selectByOrderNo(deliverGoodsDto.getOrderNo()); + if (mallOrderInfo == null) { + return; + } + MallExpressInfo mallExpressInfo = new MallExpressInfo(); + mallExpressInfo.setMemberId(mallOrderInfo.getMemberId()); + mallExpressInfo.setOrderId(mallOrderInfo.getId()); + mallExpressInfo.setExpressNo(deliverGoodsDto.getExpressNo()); + mallExpressInfo.setExpressCom(deliverGoodsDto.getExpressCom()); + mallExpressInfo.setExpressCode(deliverGoodsDto.getExpressCode()); + mallExpressInfoMapper.insert(mallExpressInfo); + + mallOrderInfo.setStatus(3); + mallOrderInfoMapper.updateById(mallOrderInfo); + } } diff --git a/src/main/java/cc/mrbird/febs/monitor/controller/SessionController.java b/src/main/java/cc/mrbird/febs/monitor/controller/SessionController.java index aa8f216..7c6621c 100644 --- a/src/main/java/cc/mrbird/febs/monitor/controller/SessionController.java +++ b/src/main/java/cc/mrbird/febs/monitor/controller/SessionController.java @@ -4,7 +4,6 @@ import cc.mrbird.febs.monitor.entity.ActiveUser; import cc.mrbird.febs.monitor.service.ISessionService; import lombok.RequiredArgsConstructor; -import org.apache.commons.collections4.CollectionUtils; import org.apache.shiro.authz.annotation.RequiresPermissions; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; @@ -31,7 +30,7 @@ List<ActiveUser> list = sessionService.list(username); Map<String, Object> data = new HashMap<>(2); data.put("rows", list); - data.put("total", CollectionUtils.size(list)); + data.put("total", list.size()); return new FebsResponse().success().data(data); } diff --git a/src/main/java/cc/mrbird/febs/others/controller/EximportController.java b/src/main/java/cc/mrbird/febs/others/controller/EximportController.java index 7a91c47..415690e 100644 --- a/src/main/java/cc/mrbird/febs/others/controller/EximportController.java +++ b/src/main/java/cc/mrbird/febs/others/controller/EximportController.java @@ -15,7 +15,7 @@ import com.wuwenze.poi.pojo.ExcelErrorField; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.apache.commons.collections4.CollectionUtils; +import org.apache.commons.collections.CollectionUtils; import org.apache.commons.lang3.StringUtils; import org.apache.shiro.authz.annotation.RequiresPermissions; import org.springframework.web.bind.annotation.GetMapping; diff --git a/src/main/resources/mapper/modules/MallOrderInfoMapper.xml b/src/main/resources/mapper/modules/MallOrderInfoMapper.xml index 7ba6277..aa3e5b0 100644 --- a/src/main/resources/mapper/modules/MallOrderInfoMapper.xml +++ b/src/main/resources/mapper/modules/MallOrderInfoMapper.xml @@ -2,6 +2,43 @@ <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="cc.mrbird.febs.mall.mapper.MallOrderInfoMapper"> + <select id="selectInPage" resultMap="OrderInfoMap"> + select + a.*, + b.id item_id, + b.order_id, + b.goods_id, + b.sku_id, + b.goods_name, + b.style_name, + b.sku_name, + b.sku_image, + b.cnt, + b.price, + b.amount + from mall_order_info a + inner join mall_order_item b on a.id=b.order_id + <where> + a.del_flag=2 + <if test="record.status == 4 and record.status != 0"> + and a.status in (5,6) + </if> + <if test="record.status != 4 and record.status != 0 and record.status != 5"> + and a.status = #{record.status} + </if> + <if test="record.status == 5"> + and a.status = 7 + </if> + <if test="record.memberId != null"> + and a.member_id=#{record.memberId} + </if> + <if test="record.orderType != null"> + and a.order_type=#{record.orderType} + </if> + </where> + order by a.created_time desc + </select> + <select id="selectOrderByMemberIdAndId" resultType="cc.mrbird.febs.mall.entity.MallOrderInfo"> select * from mall_order_info where member_id=#{memberId} and id=#{id} </select> @@ -195,4 +232,8 @@ and date_format(a.receving_time, '%Y-%m-%d') = date_format(#{date}, '%Y-%m-%d') </if> </select> + + <select id="selectByOrderNo" resultType="cc.mrbird.febs.mall.entity.MallOrderInfo"> + select * from mall_order_info where order_no=#{orderNo} + </select> </mapper> \ No newline at end of file diff --git a/src/main/resources/templates/febs/views/modules/order/orderList.html b/src/main/resources/templates/febs/views/modules/order/orderList.html index f9fe296..b95c28e 100644 --- a/src/main/resources/templates/febs/views/modules/order/orderList.html +++ b/src/main/resources/templates/febs/views/modules/order/orderList.html @@ -79,14 +79,21 @@ <a lay-event="edit" shiro:hasPermission="user:update"><i class="layui-icon febs-edit-area febs-blue"></i></a> </script> +<script type="text/html" id="tableToolBar"> + <div class="layui-btn-container"> + <button class="layui-btn layui-btn-sm layui-btn-primary febs-button-blue-plain" lay-event="exportDeliver">导出未发货订单</button> + <button class="layui-btn layui-btn-sm layui-btn-primary febs-button-blue-plain" id="importDeliver" lay-event="importDeliver">导入发货</button> + </div> +</script> <!-- 表格操作栏 end --> <script data-th-inline="none" type="text/javascript"> // 引入组件并初始化 - layui.use([ 'jquery', 'form', 'table', 'febs'], function () { + layui.use([ 'jquery', 'form', 'table', 'febs', 'upload'], function () { var $ = layui.jquery, febs = layui.febs, form = layui.form, table = layui.table, + upload = layui.upload, $view = $('#febs-order'), $query = $view.find('#query'), $reset = $view.find('#reset'), @@ -99,6 +106,23 @@ // 表格初始化 initTable(); + + table.on('toolbar(orderTable)', function(obj){ + var event = obj.event; + + if (event == 'exportDeliver') { + window.location.href = ctx + "admin/order/exportOrderList?orderType=1&status=2"; + } + }); + + upload.render({ + elem: '#importDeliver' + ,url: 'admin/order/importDeliver' //此处配置你自己的上传接口即可 + ,accept: 'file' //普通文件 + ,done: function(res){ + console.log("123"); + } + }); // 初始化表格操作栏各个按钮功能 table.on('tool(orderTable)', function (obj) { @@ -171,6 +195,8 @@ elem: $view.find('table'), id: 'orderTable', url: ctx + 'admin/order/orderList?orderType=1', + defaultToolbar: [], + toolbar: '#tableToolBar', cols: [[ {field: 'orderNo', title: '订单编号', minWidth: 200,align:'left'}, {field: 'memberName', title: '购买人', minWidth: 120,align:'left'}, @@ -178,13 +204,6 @@ {field: 'memberBindPhone', title: '联系方式', minWidth: 120,align:'left'}, {field: 'amount', title: '订单金额', minWidth: 120,align:'left'}, {field: 'orderTime', title: '下单时间', minWidth: 200,align:'left'}, - {field: 'payMethod', title: '支付方式', minWidth: 120,align:'left'}, - {field: 'payTime', title: '支付时间', minWidth: 200,align:'left'}, - {field: 'payOrderNo', title: '支付订单号', minWidth: 200,align:'left'}, - {field: 'payImage', title: '支付凭证', - templet: function (d) { - return '<a lay-event="seePayImage"><img id="seePayImage'+d.id+'" src="'+d.payImage+'" alt=""></a>'; - }, minWidth: 100,align:'center'}, {field: 'status', title: '状态', templet: function (d) { if (d.status === 1) { @@ -205,25 +224,19 @@ return '' } }, minWidth: 80,align:'center'}, - {title: '操作', - templet: function (d) { - // if(d.payMethod === '支付宝支付' || d.payMethod === '微信支付'){ - // if (d.status === 2) { - // return '<button class="layui-btn layui-btn-normal layui-btn-xs" lay-event="deliverGoods" shiro:hasPermission="user:update">发货</button>' - // +'<button class="layui-btn layui-btn-normal layui-btn-xs" lay-event="cancelOrder" shiro:hasPermission="user:update">取消订单</button>' - // +'<button class="layui-btn layui-btn-normal layui-btn-xs" lay-event="seeOrder" shiro:hasPermission="user:update">详情</button>' - // }else{ - // return '<button class="layui-btn layui-btn-normal layui-btn-xs" lay-event="seeOrder" shiro:hasPermission="user:update">详情</button>' - // } - // }else{ - if (d.status === 2) { - return '<button class="layui-btn layui-btn-normal layui-btn-xs" lay-event="deliverGoods" shiro:hasPermission="user:update">发货</button>' - +'<button class="layui-btn layui-btn-normal layui-btn-xs" lay-event="seeOrder" shiro:hasPermission="user:update">详情</button>' - }else{ - return '<button class="layui-btn layui-btn-normal layui-btn-xs" lay-event="seeOrder" shiro:hasPermission="user:update">详情</button>' - } - // } - },minWidth: 300,align:'center'} + {field: 'payMethod', title: '支付方式', minWidth: 120,align:'left'}, + {field: 'payTime', title: '支付时间', minWidth: 200,align:'left'}, + {field: 'payOrderNo', title: '支付订单号', minWidth: 200,align:'left'}, + {title: '操作', + templet: function (d) { + if (d.status === 2) { + return '<button class="layui-btn layui-btn-normal layui-btn-xs" lay-event="deliverGoods" shiro:hasPermission="user:update">发货</button>' + +'<button class="layui-btn layui-btn-normal layui-btn-xs" lay-event="seeOrder" shiro:hasPermission="user:update">详情</button>' + }else{ + return '<button class="layui-btn layui-btn-normal layui-btn-xs" lay-event="seeOrder" shiro:hasPermission="user:update">详情</button>' + } + // } + },minWidth: 200,align:'center', fixed:'right'} ]] }); } diff --git a/src/main/resources/templates/febs/views/modules/score/orderList.html b/src/main/resources/templates/febs/views/modules/score/orderList.html index 6c7918b..132ce24 100644 --- a/src/main/resources/templates/febs/views/modules/score/orderList.html +++ b/src/main/resources/templates/febs/views/modules/score/orderList.html @@ -69,6 +69,12 @@ <a lay-event="edit" shiro:hasPermission="user:update"><i class="layui-icon febs-edit-area febs-blue"></i></a> </script> +<script type="text/html" id="tableToolBar"> + <div class="layui-btn-container"> + <button class="layui-btn layui-btn-sm layui-btn-primary febs-button-blue-plain" lay-event="exportDeliver">导出未发货订单</button> + <button class="layui-btn layui-btn-sm layui-btn-primary febs-button-blue-plain" id="importDeliver" lay-event="importDeliver">导入发货</button> + </div> +</script> <!-- 表格操作栏 end --> <script data-th-inline="none" type="text/javascript"> // 引入组件并初始化 @@ -89,6 +95,14 @@ // 表格初始化 initTable(); + + table.on('toolbar(orderTable)', function(obj){ + var event = obj.event; + + if (event == 'exportDeliver') { + window.location.href = ctx + "admin/order/exportOrderList?orderType=2&status=2"; + } + }); // 初始化表格操作栏各个按钮功能 table.on('tool(orderTable)', function (obj) { @@ -161,6 +175,8 @@ elem: $view.find('table'), id: 'orderTable', url: ctx + 'admin/order/orderList?orderType=2', + defaultToolbar: [], + toolbar: '#tableToolBar', cols: [[ {field: 'orderNo', title: '订单编号', minWidth: 200,align:'left'}, {field: 'memberName', title: '购买人', minWidth: 120,align:'left'}, -- Gitblit v1.9.1