diff --git a/yami-shop-admin/src/main/java/com/yami/shop/admin/controller/OrderController.java b/yami-shop-admin/src/main/java/com/yami/shop/admin/controller/OrderController.java new file mode 100644 index 0000000..caef8f1 --- /dev/null +++ b/yami-shop-admin/src/main/java/com/yami/shop/admin/controller/OrderController.java @@ -0,0 +1,309 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.admin.controller; // 定义类所在的包 + +import cn.hutool.core.date.DatePattern; // 引入Hutool工具类库中的日期格式化工具类 +import cn.hutool.core.date.DateUtil; // 引入Hutool工具类库中的日期工具类 +import cn.hutool.core.io.IORuntimeException; // 引入Hutool工具类库中的IO运行时异常类 +import cn.hutool.core.io.IoUtil; // 引入Hutool工具类库中的IO工具类 +import cn.hutool.poi.excel.ExcelUtil; // 引入Hutool工具类库中的Excel工具类 +import cn.hutool.poi.excel.ExcelWriter; // 引入Hutool工具类库中的Excel写入工具类 +import com.baomidou.mybatisplus.core.metadata.IPage; // 引入MyBatis-Plus的分页接口 +import com.google.common.base.Objects; // 引入Google Guava库中的Objects工具类 +import com.yami.shop.bean.enums.OrderStatus; // 引入订单状态枚举类 +import com.yami.shop.bean.model.Order; // 引入订单模型类 +import com.yami.shop.bean.model.OrderItem; // 引入订单项模型类 +import com.yami.shop.bean.model.UserAddrOrder; // 引入用户地址订单模型类 +import com.yami.shop.bean.param.DeliveryOrderParam; // 引入发货订单参数类 +import com.yami.shop.bean.param.OrderParam; // 引入订单参数类 +import com.yami.shop.common.exception.YamiShopBindException; // 引入自定义异常类 +import com.yami.shop.common.response.ServerResponseEntity; // 引入服务器响应实体类 +import com.yami.shop.common.util.PageParam; // 引入分页参数工具类 +import com.yami.shop.security.admin.util.SecurityUtils; // 引入安全工具类 +import com.yami.shop.service.*; // 引入各种服务类 +import jakarta.servlet.ServletOutputStream; // 引入Servlet输出流类 +import jakarta.servlet.http.HttpServletResponse; // 引入HTTP响应类 +import lombok.extern.slf4j.Slf4j; // 引入Lombok的日志记录注解 +import org.apache.poi.ss.usermodel.Sheet; // 引入Apache POI的Sheet类 +import org.springframework.beans.factory.annotation.Autowired; // 引入Spring的@Autowired注解 +import org.springframework.format.annotation.DateTimeFormat; // 引入Spring的日期时间格式化注解 +import org.springframework.security.access.prepost.PreAuthorize; // 引入Spring Security的PreAuthorize注解 +import org.springframework.web.bind.annotation.*; // 引入Spring Web的注解 + +import java.io.IOException; // 引入Java的IO异常类 +import java.util.Arrays; // 引入Java的Arrays工具类 +import java.util.Date; // 引入Java的Date类 +import java.util.List; // 引入Java的List接口 + +/** + * OrderController类,用于管理订单操作,包括分页获取、查看详情、发货、导出订单信息等功能。 + * @作者 lgh on 2018/09/15. + */ +@Slf4j // 标注这是一个需要日志记录的类 +@RestController // 标注这是一个控制器类,并且其返回结果直接写入HTTP响应体中,而不是视图名称 +@RequestMapping("/order/order") // 定义请求路径的根地址为/order/order +public class OrderController { + + @Autowired + private OrderService orderService; // 自动注入订单服务类 + + @Autowired + private OrderItemService orderItemService; // 自动注入订单项服务类 + + @Autowired + private UserAddrOrderService userAddrOrderService; // 自动注入用户地址订单服务类 + + @Autowired + private ProductService productService; // 自动注入商品服务类 + + @Autowired + private SkuService skuService; // 自动注入SKU服务类 + + /** + * 分页获取订单信息 + * @param orderParam 订单查询参数 + * @param page 分页参数 + * @return 服务器响应实体,包含分页后的订单信息 + */ + @GetMapping("/page") + @PreAuthorize("@pms.hasPermission('order:order:page')") // 权限检查 + public ServerResponseEntity> page(OrderParam orderParam, PageParam page) { + Long shopId = SecurityUtils.getSysUser().getShopId(); + orderParam.setShopId(shopId); + IPage orderPage = orderService.pageOrdersDetailByOrderParam(page, orderParam); + return ServerResponseEntity.success(orderPage); // 返回分页结果 + } + + /** + * 获取订单详情信息 + * @param orderNumber 订单编号 + * @return 服务器响应实体,包含订单的详细信息 + */ + @GetMapping("/orderInfo/{orderNumber}") + @PreAuthorize("@pms.hasPermission('order:order:info')") // 权限检查 + public ServerResponseEntity info(@PathVariable("orderNumber") String orderNumber) { + Long shopId = SecurityUtils.getSysUser().getShopId(); + Order order = orderService.getOrderByOrderNumber(orderNumber); + if (!Objects.equal(shopId, order.getShopId())) { + throw new YamiShopBindException("您没有权限获取该订单信息"); + } + List orderItems = orderItemService.getOrderItemsByOrderNumber(orderNumber); + order.setOrderItems(orderItems); + UserAddrOrder userAddrOrder = userAddrOrderService.getById(order.getAddrOrderId()); + order.setUserAddrOrder(userAddrOrder); + return ServerResponseEntity.success(order); + } + + /** + * 发货 + * @param deliveryOrderParam 发货订单参数 + * @return 服务器响应实体 + */ + @PutMapping("/delivery") + @PreAuthorize("@pms.hasPermission('order:order:delivery')") // 权限检查 + public ServerResponseEntity delivery(@RequestBody DeliveryOrderParam deliveryOrderParam) { + Long shopId = SecurityUtils.getSysUser().getShopId(); + Order order = orderService.getOrderByOrderNumber(deliveryOrderParam.getOrderNumber()); + if (!Objects.equal(shopId, order.getShopId())) { + throw new YamiShopBindException("您没有权限修改该订单信息"); + } + + Order orderParam = new Order(); + orderParam.setOrderId(order.getOrderId()); + orderParam.setDvyId(deliveryOrderParam.getDvyId()); + orderParam.setDvyFlowId(deliveryOrderParam.getDvyFlowId()); + orderParam.setDvyTime(new Date()); + orderParam.setStatus(OrderStatus.CONSIGNMENT.value()); + orderParam.setUserId(order.getUserId()); + + orderService.delivery(orderParam); + + List orderItems = orderItemService.getOrderItemsByOrderNumber(deliveryOrderParam.getOrderNumber()); + for (OrderItem orderItem : orderItems) { + productService.removeProductCacheByProdId(orderItem.getProdId()); + skuService.removeSkuCacheBySkuId(orderItem.getSkuId(), orderItem.getProdId()); + } + return ServerResponseEntity.success(); + } + + /** + * 打印待发货的订单表 + * @param order 订单对象 + * @param consignmentName 发件人姓名 + * @param consignmentMobile 发货人手机号 + * @param consignmentAddr 发货地址 + * @param startTime 开始时间 + * @param endTime 结束时间 + * @param response HTTP响应对象 + */ + * @param order 订单对象 + * @param startTime 开始时间 + * @param endTime 结束时间 + * @param response HTTP响应对象 + */ + @GetMapping("/waitingConsignmentExcel") + @PreAuthorize("@pms.hasPermission('order:order:waitingConsignmentExcel')") // 权限检查 + public void waitingConsignmentExcel(Order order, @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") Date startTime, + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") Date endTime, String consignmentName, String consignmentMobile, + String consignmentAddr, HttpServletResponse response) { + Long shopId = SecurityUtils.getSysUser().getShopId(); + order.setShopId(shopId); + order.setStatus(OrderStatus.PADYED.value()); + List orders = orderService.listOrdersDetailByOrder(order, startTime, endTime); + + // 通过工具类创建ExcelWriter + ExcelWriter writer = ExcelUtil.getBigWriter(); + Sheet sheet = writer.getSheet(); + sheet.setColumnWidth(0, 20 * 256); + sheet.setColumnWidth(1, 20 * 256); + sheet.setColumnWidth(2, 20 * 256); + sheet.setColumnWidth(3, 60 * 256); + sheet.setColumnWidth(4, 60 * 256); + sheet.setColumnWidth(7, 60 * 256); + sheet.setColumnWidth(8, 60 * 256); + sheet.setColumnWidth(9, 60 * 256); + // 待发货 + String[] hearder = {"订单编号", "收件人", "手机", "收货地址", "商品名称", "数量", "发件人姓名", "发件人手机号", "发货地址", "备注"}; + writer.merge(hearder.length - 1, "发货信息整理"); + writer.writeRow(Arrays.asList(hearder)); + + int row = 1; + for (Order dbOrder : orders) { + UserAddrOrder addr = dbOrder.getUserAddrOrder(); + String addrInfo = addr.getProvince() + addr.getCity() + addr.getArea() + addr.getAddr(); + List orderItems = dbOrder.getOrderItems(); + row++; + for (OrderItem orderItem : orderItems) { + // 第0列开始 + int col = 0; + writer.writeCellValue(col++, row, dbOrder.getOrderNumber()); + writer.writeCellValue(col++, row, addr.getReceiver()); + writer.writeCellValue(col++, row, addr.getMobile()); + writer.writeCellValue(col++, row, addrInfo); + writer.writeCellValue(col++, row, orderItem.getProdName()); + writer.writeCellValue(col++, row, orderItem.getProdCount()); + writer.writeCellValue(col++, row, consignmentName); + writer.writeCellValue(col++, row, consignmentMobile); + writer.writeCellValue(col++, row, consignmentAddr); + writer.writeCellValue(col++, row, dbOrder.getRemarks()); + } + } + writeExcel(response, writer); + } + + /** + * 已销售订单 + * @param order 订单对象 + * @param startTime 开始时间 + * @param endTime 结束时间 + * @param response HTTP响应对象 + */ + + @GetMapping("/soldExcel") + @PreAuthorize("@pms.hasPermission('order:order:soldExcel')") // 权限检查 + public void soldExcel(Order order, @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") Date startTime, + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") Date endTime, HttpServletResponse response) { + Long shopId = SecurityUtils.getSysUser().getShopId(); + order.setShopId(shopId); + order.setIsPayed(1); + List orders = orderService.listOrdersDetailByOrder(order, startTime, endTime); + + // 通过工具类创建ExcelWriter + ExcelWriter writer = ExcelUtil.getBigWriter(); + String[] hearder = {"订单编号", "下单时间", "收件人", "手机", "收货地址", "商品名称", "数量", "订单应付", "订单运费", "订单实付"}; + Sheet sheet = writer.getSheet(); + sheet.setColumnWidth(0, 20 * 256); + sheet.setColumnWidth(1, 20 * 256); + sheet.setColumnWidth(3, 20 * 256); + sheet.setColumnWidth(4, 60 * 256); + sheet.setColumnWidth(5, 60 * 256); + + writer.merge(hearder.length - 1, "销售信息整理"); + writer.writeRow(Arrays.asList(hearder)); + + int row = 1; + for (Order dbOrder : orders) { + UserAddrOrder addr = dbOrder.getUserAddrOrder(); + String addrInfo = addr.getProvince() + addr.getCity() + addr.getArea() + addr.getAddr(); + List orderItems = dbOrder.getOrderItems(); + int firstRow = row + 1; + int lastRow = row + orderItems.size(); + int col = -1; + // 订单编号 + mergeIfNeed(writer, firstRow, lastRow, ++col, col, dbOrder.getOrderNumber()); + // 下单时间 + mergeIfNeed(writer, firstRow, lastRow, ++col, col, dbOrder.getCreateTime()); + // 收件人 + mergeIfNeed(writer, firstRow, lastRow, ++col, col, addr.getReceiver()); + // 手机 + mergeIfNeed(writer, firstRow, lastRow, ++col, col, addr.getMobile()); + // 收货地址 + mergeIfNeed(writer, firstRow, lastRow, ++col, col, addrInfo); + int prodNameCol = ++col; + int prodCountCol = ++col; + for (OrderItem orderItem : orderItems) { + row++; + // 商品名称 + writer.writeCellValue(prodNameCol, row, orderItem.getProdName()); + // 数量 + writer.writeCellValue(prodCountCol, row, orderItem.getProdCount()); + } + // 订单应付 + mergeIfNeed(writer, firstRow, lastRow, ++col, col, dbOrder.getTotal()); + // 订单运费 + mergeIfNeed(writer, firstRow, lastRow, ++col, col, dbOrder.getFreightAmount()); + // 订单实付 + mergeIfNeed(writer, firstRow, lastRow, ++col, col, dbOrder.getActualTotal()); + } + writeExcel(response, writer); + } + + /** + * 如果需要合并的话,就合并 + * @param writer ExcelWriter对象 + * @param firstRow 起始行 + * @param lastRow 结束行 + * @param firstColumn 起始列 + * @param lastColumn 结束列 + * @param content 合并内容 + */ + private void mergeIfNeed(ExcelWriter writer, int firstRow, int lastRow, int firstColumn, int lastColumn, Object content) { + if (content instanceof Date) { + content = DateUtil.format((Date) content, DatePattern.NORM_DATETIME_PATTERN); + } + if (lastRow - firstRow > 0 || lastColumn - firstColumn > 0) { + writer.merge(firstRow, lastRow, firstColumn, lastColumn, content, false); + } else { + writer.writeCellValue(firstColumn, firstRow, content); + } + } + + /** + * 写出Excel文件 + * @param response HTTP响应对象 + * @param writer ExcelWriter对象 + */ + private void writeExcel(HttpServletResponse response, ExcelWriter writer) { + response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"); + response.setHeader("Content-Disposition", "attachment;filename=1.xls"); + + ServletOutputStream servletOutputStream = null; + try { + servletOutputStream = response.getOutputStream(); + writer.flush(servletOutputStream); + servletOutputStream.flush(); + } catch (IORuntimeException | IOException e) { + log.error("写出Excel错误:", e); + } finally { + IoUtil.close(writer); + } + } +} \ No newline at end of file