|
|
|
@ -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<IPage<Order>> page(OrderParam orderParam, PageParam<Order> page) {
|
|
|
|
|
Long shopId = SecurityUtils.getSysUser().getShopId();
|
|
|
|
|
orderParam.setShopId(shopId);
|
|
|
|
|
IPage<Order> orderPage = orderService.pageOrdersDetailByOrderParam(page, orderParam);
|
|
|
|
|
return ServerResponseEntity.success(orderPage); // 返回分页结果
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 获取订单详情信息
|
|
|
|
|
* @param orderNumber 订单编号
|
|
|
|
|
* @return 服务器响应实体,包含订单的详细信息
|
|
|
|
|
*/
|
|
|
|
|
@GetMapping("/orderInfo/{orderNumber}")
|
|
|
|
|
@PreAuthorize("@pms.hasPermission('order:order:info')") // 权限检查
|
|
|
|
|
public ServerResponseEntity<Order> 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<OrderItem> 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<Void> 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<OrderItem> 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<Order> 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<OrderItem> 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<Order> 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<OrderItem> 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);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|