|
@@ -0,0 +1,276 @@
|
|
|
|
|
+package com.haha.admin.controller;
|
|
|
|
|
+
|
|
|
|
|
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
|
|
|
|
+import com.baomidou.mybatisplus.core.metadata.IPage;
|
|
|
|
|
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
|
|
|
|
+import com.haha.common.vo.Result;
|
|
|
|
|
+import com.haha.entity.Order;
|
|
|
|
|
+import com.haha.service.OrderService;
|
|
|
|
|
+import lombok.extern.slf4j.Slf4j;
|
|
|
|
|
+import org.springframework.beans.factory.annotation.Autowired;
|
|
|
|
|
+import org.springframework.web.bind.annotation.*;
|
|
|
|
|
+
|
|
|
|
|
+import java.time.LocalDate;
|
|
|
|
|
+import java.time.LocalDateTime;
|
|
|
|
|
+import java.time.LocalTime;
|
|
|
|
|
+import java.util.HashMap;
|
|
|
|
|
+import java.util.Map;
|
|
|
|
|
+
|
|
|
|
|
+/**
|
|
|
|
|
+ * 订单管理控制器
|
|
|
|
|
+ */
|
|
|
|
|
+@Slf4j
|
|
|
|
|
+@RestController
|
|
|
|
|
+@RequestMapping("/order")
|
|
|
|
|
+public class OrderController {
|
|
|
|
|
+
|
|
|
|
|
+ @Autowired
|
|
|
|
|
+ private OrderService orderService;
|
|
|
|
|
+
|
|
|
|
|
+ /**
|
|
|
|
|
+ * 分页查询订单列表
|
|
|
|
|
+ * @param params 查询参数
|
|
|
|
|
+ * @return 订单列表
|
|
|
|
|
+ */
|
|
|
|
|
+ @GetMapping("/list")
|
|
|
|
|
+ public Result<Map<String, Object>> list(@RequestParam Map<String, Object> params) {
|
|
|
|
|
+ try {
|
|
|
|
|
+ // 分页参数(处理空字符串)
|
|
|
|
|
+ int page = 1;
|
|
|
|
|
+ int pageSize = 10;
|
|
|
|
|
+
|
|
|
|
|
+ Object pageObj = params.get("page");
|
|
|
|
|
+ if (pageObj != null && !pageObj.toString().isEmpty()) {
|
|
|
|
|
+ page = Integer.parseInt(pageObj.toString());
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ Object pageSizeObj = params.get("pageSize");
|
|
|
|
|
+ if (pageSizeObj != null && !pageSizeObj.toString().isEmpty()) {
|
|
|
|
|
+ pageSize = Integer.parseInt(pageSizeObj.toString());
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ // 查询条件
|
|
|
|
|
+ String orderNo = (String) params.get("orderNo");
|
|
|
|
|
+ String deviceId = (String) params.get("deviceId");
|
|
|
|
|
+ String payStatus = (String) params.get("payStatus");
|
|
|
|
|
+ Integer status = null;
|
|
|
|
|
+ Object statusObj = params.get("status");
|
|
|
|
|
+ if (statusObj != null && !statusObj.toString().isEmpty()) {
|
|
|
|
|
+ status = Integer.valueOf(statusObj.toString());
|
|
|
|
|
+ }
|
|
|
|
|
+ String startDate = (String) params.get("startDate");
|
|
|
|
|
+ String endDate = (String) params.get("endDate");
|
|
|
|
|
+
|
|
|
|
|
+ // 构建查询条件
|
|
|
|
|
+ LambdaQueryWrapper<Order> wrapper = new LambdaQueryWrapper<>();
|
|
|
|
|
+ wrapper.like(orderNo != null && !orderNo.isEmpty(), Order::getOrderNo, orderNo)
|
|
|
|
|
+ .like(deviceId != null && !deviceId.isEmpty(), Order::getDeviceId, deviceId)
|
|
|
|
|
+ .eq(payStatus != null && !payStatus.isEmpty(), Order::getPayStatus, payStatus)
|
|
|
|
|
+ .eq(status != null, Order::getStatus, status);
|
|
|
|
|
+
|
|
|
|
|
+ // 时间范围查询
|
|
|
|
|
+ if (startDate != null && !startDate.isEmpty()) {
|
|
|
|
|
+ LocalDateTime startDateTime = LocalDate.parse(startDate).atStartOfDay();
|
|
|
|
|
+ wrapper.ge(Order::getCreateTime, startDateTime);
|
|
|
|
|
+ }
|
|
|
|
|
+ if (endDate != null && !endDate.isEmpty()) {
|
|
|
|
|
+ LocalDateTime endDateTime = LocalDate.parse(endDate).atTime(LocalTime.MAX);
|
|
|
|
|
+ wrapper.le(Order::getCreateTime, endDateTime);
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ // 按创建时间倒序
|
|
|
|
|
+ wrapper.orderByDesc(Order::getCreateTime);
|
|
|
|
|
+
|
|
|
|
|
+ // 分页查询
|
|
|
|
|
+ Page<Order> pageResult = new Page<>(page, pageSize);
|
|
|
|
|
+ IPage<Order> orderPage = orderService.page(pageResult, wrapper);
|
|
|
|
|
+
|
|
|
|
|
+ // 填充标签字段
|
|
|
|
|
+ for (Order order : orderPage.getRecords()) {
|
|
|
|
|
+ fillOrderLabels(order);
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ Map<String, Object> data = new HashMap<>();
|
|
|
|
|
+ data.put("list", orderPage.getRecords());
|
|
|
|
|
+ data.put("total", orderPage.getTotal());
|
|
|
|
|
+ data.put("pageSize", orderPage.getSize());
|
|
|
|
|
+ data.put("currentPage", orderPage.getCurrent());
|
|
|
|
|
+
|
|
|
|
|
+ return Result.success("查询成功", data);
|
|
|
|
|
+
|
|
|
|
|
+ } catch (Exception e) {
|
|
|
|
|
+ log.error("查询订单列表失败: {}", e.getMessage(), e);
|
|
|
|
|
+ return Result.error(500, "查询订单列表失败: " + e.getMessage());
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ /**
|
|
|
|
|
+ * 获取订单详情
|
|
|
|
|
+ * @param id 订单ID
|
|
|
|
|
+ * @return 订单详情
|
|
|
|
|
+ */
|
|
|
|
|
+ @GetMapping("/{id}")
|
|
|
|
|
+ public Result<Order> getById(@PathVariable Long id) {
|
|
|
|
|
+ try {
|
|
|
|
|
+ Order order = orderService.getById(id);
|
|
|
|
|
+ if (order == null) {
|
|
|
|
|
+ return Result.error(404, "订单不存在");
|
|
|
|
|
+ }
|
|
|
|
|
+ fillOrderLabels(order);
|
|
|
|
|
+ return Result.success("查询成功", order);
|
|
|
|
|
+ } catch (Exception e) {
|
|
|
|
|
+ log.error("查询订单详情失败: orderId={}, error={}", id, e.getMessage(), e);
|
|
|
|
|
+ return Result.error(500, "查询订单详情失败: " + e.getMessage());
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ /**
|
|
|
|
|
+ * 获取订单统计数据
|
|
|
|
|
+ * @return 统计数据
|
|
|
|
|
+ */
|
|
|
|
|
+ @GetMapping("/statistics")
|
|
|
|
|
+ public Result<Map<String, Object>> getStatistics() {
|
|
|
|
|
+ try {
|
|
|
|
|
+ Map<String, Object> statistics = new HashMap<>();
|
|
|
|
|
+
|
|
|
|
|
+ // 总订单数
|
|
|
|
|
+ long totalOrders = orderService.count();
|
|
|
|
|
+ statistics.put("totalOrders", totalOrders);
|
|
|
|
|
+
|
|
|
|
|
+ // 今日订单数
|
|
|
|
|
+ LocalDateTime todayStart = LocalDate.now().atStartOfDay();
|
|
|
|
|
+ long todayOrders = orderService.lambdaQuery()
|
|
|
|
|
+ .ge(Order::getCreateTime, todayStart)
|
|
|
|
|
+ .count();
|
|
|
|
|
+ statistics.put("todayOrders", todayOrders);
|
|
|
|
|
+
|
|
|
|
|
+ // 各状态订单数
|
|
|
|
|
+ long unpaidOrders = orderService.lambdaQuery()
|
|
|
|
|
+ .eq(Order::getPayStatus, Order.PAY_STATUS_未支付)
|
|
|
|
|
+ .count();
|
|
|
|
|
+ statistics.put("unpaidOrders", unpaidOrders);
|
|
|
|
|
+
|
|
|
|
|
+ long completedOrders = orderService.lambdaQuery()
|
|
|
|
|
+ .eq(Order::getStatus, Order.ORDER_STATUS_已完成)
|
|
|
|
|
+ .count();
|
|
|
|
|
+ statistics.put("completedOrders", completedOrders);
|
|
|
|
|
+
|
|
|
|
|
+ long cancelledOrders = orderService.lambdaQuery()
|
|
|
|
|
+ .eq(Order::getStatus, Order.ORDER_STATUS_已取消)
|
|
|
|
|
+ .count();
|
|
|
|
|
+ statistics.put("cancelledOrders", cancelledOrders);
|
|
|
|
|
+
|
|
|
|
|
+ long refundOrders = orderService.lambdaQuery()
|
|
|
|
|
+ .eq(Order::getPayStatus, Order.PAY_STATUS_已退款)
|
|
|
|
|
+ .count();
|
|
|
|
|
+ statistics.put("refundOrders", refundOrders);
|
|
|
|
|
+
|
|
|
|
|
+ // 总销售额(已完成订单)
|
|
|
|
|
+ Double totalAmount = orderService.lambdaQuery()
|
|
|
|
|
+ .eq(Order::getStatus, Order.ORDER_STATUS_已完成)
|
|
|
|
|
+ .eq(Order::getPayStatus, Order.PAY_STATUS_已支付)
|
|
|
|
|
+ .list()
|
|
|
|
|
+ .stream()
|
|
|
|
|
+ .mapToDouble(Order::getTotalAmount)
|
|
|
|
|
+ .sum();
|
|
|
|
|
+ statistics.put("totalAmount", String.format("%.2f", totalAmount));
|
|
|
|
|
+
|
|
|
|
|
+ // 今日销售额
|
|
|
|
|
+ Double todayAmount = orderService.lambdaQuery()
|
|
|
|
|
+ .ge(Order::getCreateTime, todayStart)
|
|
|
|
|
+ .eq(Order::getStatus, Order.ORDER_STATUS_已完成)
|
|
|
|
|
+ .eq(Order::getPayStatus, Order.PAY_STATUS_已支付)
|
|
|
|
|
+ .list()
|
|
|
|
|
+ .stream()
|
|
|
|
|
+ .mapToDouble(Order::getTotalAmount)
|
|
|
|
|
+ .sum();
|
|
|
|
|
+ statistics.put("todayAmount", String.format("%.2f", todayAmount));
|
|
|
|
|
+
|
|
|
|
|
+ // 平均订单金额
|
|
|
|
|
+ double averageAmount = completedOrders > 0 ? totalAmount / completedOrders : 0;
|
|
|
|
|
+ statistics.put("averageAmount", String.format("%.2f", averageAmount));
|
|
|
|
|
+
|
|
|
|
|
+ return Result.success("查询成功", statistics);
|
|
|
|
|
+
|
|
|
|
|
+ } catch (Exception e) {
|
|
|
|
|
+ log.error("查询订单统计失败: {}", e.getMessage(), e);
|
|
|
|
|
+ return Result.error(500, "查询订单统计失败: " + e.getMessage());
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ /**
|
|
|
|
|
+ * 订单退款
|
|
|
|
|
+ * @param id 订单ID
|
|
|
|
|
+ * @param params 退款参数
|
|
|
|
|
+ * @return 退款结果
|
|
|
|
|
+ */
|
|
|
|
|
+ @PostMapping("/{id}/refund")
|
|
|
|
|
+ public Result<Void> refund(@PathVariable Long id, @RequestBody Map<String, Object> params) {
|
|
|
|
|
+ try {
|
|
|
|
|
+ Order order = orderService.getById(id);
|
|
|
|
|
+ if (order == null) {
|
|
|
|
|
+ return Result.error(404, "订单不存在");
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ // 检查订单状态
|
|
|
|
|
+ if (!Order.PAY_STATUS_已支付.equals(order.getPayStatus())) {
|
|
|
|
|
+ return Result.error(400, "只有已支付的订单才能退款");
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ String reason = (String) params.get("reason");
|
|
|
|
|
+ log.info("订单退款: orderId={}, orderNo={}, reason={}", id, order.getOrderNo(), reason);
|
|
|
|
|
+
|
|
|
|
|
+ // 更新支付状态为已退款
|
|
|
|
|
+ boolean success = orderService.updatePayStatus(order.getOrderNo(), Order.PAY_STATUS_已退款);
|
|
|
|
|
+
|
|
|
|
|
+ if (success) {
|
|
|
|
|
+ return Result.success("退款成功", null);
|
|
|
|
|
+ } else {
|
|
|
|
|
+ return Result.error(500, "退款失败");
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ } catch (Exception e) {
|
|
|
|
|
+ log.error("订单退款失败: orderId={}, error={}", id, e.getMessage(), e);
|
|
|
|
|
+ return Result.error(500, "退款失败: " + e.getMessage());
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ /**
|
|
|
|
|
+ * 填充订单标签字段
|
|
|
|
|
+ * @param order 订单对象
|
|
|
|
|
+ */
|
|
|
|
|
+ private void fillOrderLabels(Order order) {
|
|
|
|
|
+ // 填充支付状态标签
|
|
|
|
|
+ switch (order.getPayStatus()) {
|
|
|
|
|
+ case Order.PAY_STATUS_未支付:
|
|
|
|
|
+ order.setPayStatusLabel("未支付");
|
|
|
|
|
+ break;
|
|
|
|
|
+ case Order.PAY_STATUS_已支付:
|
|
|
|
|
+ order.setPayStatusLabel("已支付");
|
|
|
|
|
+ break;
|
|
|
|
|
+ case Order.PAY_STATUS_已退款:
|
|
|
|
|
+ order.setPayStatusLabel("已退款");
|
|
|
|
|
+ break;
|
|
|
|
|
+ default:
|
|
|
|
|
+ order.setPayStatusLabel("未知");
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ // 填充订单状态标签
|
|
|
|
|
+ switch (order.getStatus()) {
|
|
|
|
|
+ case Order.ORDER_STATUS_已取消:
|
|
|
|
|
+ order.setStatusLabel("已取消");
|
|
|
|
|
+ break;
|
|
|
|
|
+ case Order.ORDER_STATUS_待支付:
|
|
|
|
|
+ order.setStatusLabel("待支付");
|
|
|
|
|
+ break;
|
|
|
|
|
+ case Order.ORDER_STATUS_已完成:
|
|
|
|
|
+ order.setStatusLabel("已完成");
|
|
|
|
|
+ break;
|
|
|
|
|
+ case Order.ORDER_STATUS_已关闭:
|
|
|
|
|
+ order.setStatusLabel("已关闭");
|
|
|
|
|
+ break;
|
|
|
|
|
+ default:
|
|
|
|
|
+ order.setStatusLabel("未知");
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+}
|