Quellcode durchsuchen

用户端根据日期范围等条件查询订单、逻辑删除订单

郭子栋 vor 2 Tagen
Ursprung
Commit
fa845a4509

+ 21 - 0
nightFragrance-massage/src/main/java/com/ylx/order/controller/OrderController.java

@@ -1,7 +1,11 @@
 package com.ylx.order.controller;
 
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.ylx.common.core.domain.R;
+import com.ylx.order.domain.dto.OrderDateQueryDTO;
+import com.ylx.order.domain.dto.OrderDeleteDTO;
 import com.ylx.order.domain.dto.OrderSubmitDTO;
+import com.ylx.order.domain.vo.OrderDateQueryVo;
 import com.ylx.order.service.TOrderService;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
@@ -14,6 +18,8 @@ import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
 
 import javax.annotation.Resource;
+import javax.validation.Valid;
+import java.util.List;
 
 @RestController
 @RequestMapping("/order")
@@ -32,4 +38,19 @@ public class OrderController {
         return R.ok();
     }
 
+    @PreAuthorize("@customerAuth.isCustomer()")
+    @ApiOperation("根据日期范围等条件查询订单")
+    @PostMapping("/queryByDate")
+    public R<Page<OrderDateQueryVo>> queryOrderByDate(@Valid @RequestBody OrderDateQueryDTO dto) {
+        Page<OrderDateQueryVo> page = orderService.queryOrderList(dto);
+        return R.ok(page);
+    }
+
+    @PreAuthorize("@customerAuth.isCustomer()")
+    @ApiOperation("逻辑删除订单(移入回收站)")
+    @PostMapping("/delete")
+    public R<?> deleteOrder(@Valid @RequestBody OrderDeleteDTO dto) {
+        orderService.logicDeleteOrder(dto.getId());
+        return R.ok("删除成功");
+    }
 }

+ 50 - 0
nightFragrance-massage/src/main/java/com/ylx/order/domain/dto/OrderDateQueryDTO.java

@@ -0,0 +1,50 @@
+package com.ylx.order.domain.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import javax.validation.constraints.Min;
+import java.time.LocalDate;
+
+/**
+ * 类描述:用户端订单列表DTO
+ *
+ * @author Administrator
+ * @version 1.0
+ * @date 2026/6/8 9:26
+ */
+@Data
+public class OrderDateQueryDTO {
+    @ApiModelProperty("页码,默认1")
+    @Min(value = 1, message = "页码最小为1")
+    private Integer pageNum = 1;
+
+    @ApiModelProperty("每页条数,默认10")
+    @Min(value = 1, message = "每页条数最小为1")
+    private Integer pageSize = 10;
+    /**
+     * 起始日期(可选),例如 2025-11-11
+     */
+    @DateTimeFormat(pattern = "yyyy-MM-dd")
+    @ApiModelProperty("起始日期(可选)")
+    private LocalDate startDate;
+
+    /**
+     *  /终止日期(可选)
+     */
+    @DateTimeFormat(pattern = "yyyy-MM-dd")
+    @ApiModelProperty("终止日期(可选)")
+    private LocalDate endDate;
+
+    /**
+     * 项目名称
+     */
+    @ApiModelProperty("项目名称")
+    private String projectName;
+    /**
+     * 商户昵称
+     */
+    @ApiModelProperty("商户昵称")
+    private String merchantNickName;
+}

+ 21 - 0
nightFragrance-massage/src/main/java/com/ylx/order/domain/dto/OrderDeleteDTO.java

@@ -0,0 +1,21 @@
+package com.ylx.order.domain.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotNull;
+
+/**
+ * 类描述:用户端逻辑删除订单
+ *
+ * @author Administrator
+ * @version 1.0
+ * @date 2026/6/8 10:26
+ */
+@Data
+public class OrderDeleteDTO {
+
+    @NotNull(message = "订单ID不能为空")
+    @ApiModelProperty("主键ID")
+    private Long id;
+}

+ 80 - 0
nightFragrance-massage/src/main/java/com/ylx/order/domain/vo/OrderDateQueryVo.java

@@ -0,0 +1,80 @@
+package com.ylx.order.domain.vo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.math.BigDecimal;
+
+/**
+ * 类描述:用户端订单查询列表
+ *
+ * @author Administrator
+ * @version 1.0
+ * @date 2026/6/8 9:43
+ */
+@Data
+public class OrderDateQueryVo {
+    /**
+     * 商户头像
+     */
+    @ApiModelProperty("商户头像")
+    private String merchantAvatar;
+
+    /**
+     * 服务时间范围
+     */
+    @ApiModelProperty("服务时间范围")
+    private String serviceTime;
+
+    /**
+     * 订单状态
+     */
+    @ApiModelProperty("订单状态")
+    private Integer orderStatus;
+
+    /**
+     * 订单状态中文
+     */
+    @ApiModelProperty("订单状态中文")
+    private String orderStatusName;
+
+    /**
+     * 项目名称
+     */
+    @ApiModelProperty("项目名称")
+    private String projectName;
+
+    /**
+     * 项目时长
+     */
+    @ApiModelProperty("项目时长")
+    private Integer projectDuration;
+    /**
+     * 项目封面图
+     */
+    @ApiModelProperty("项目封面图")
+    private String projectCover;
+    /**
+     * 项目亮点
+     */
+    @ApiModelProperty("项目亮点")
+    private String highlight;
+    /**
+     * 最终应付/实付金额
+     */
+    @ApiModelProperty("最终应付/实付金额")
+    private BigDecimal finalAmount;
+    /**
+     * 交通费
+     */
+    @ApiModelProperty("交通费")
+    private BigDecimal trafficFee;
+
+    /**
+     * 项目标价/售价
+     */
+    @ApiModelProperty("项目标价/售价")
+    private BigDecimal basePrice;
+
+
+}

+ 16 - 0
nightFragrance-massage/src/main/java/com/ylx/order/enums/OrderStatusEnum.java

@@ -25,4 +25,20 @@ public enum OrderStatusEnum {
         this.info = info;
     }
 
+    public static OrderStatusEnum fromCode(Integer code) {
+        if (code == null) {
+            return null;
+        }
+        for (OrderStatusEnum status : values()) {
+            if (status.code.equals(code)) {
+                return status;
+            }
+        }
+        return null;
+    }
+
+    public static String getInfoByCode(Integer code) {
+        OrderStatusEnum status = fromCode(code);
+        return status == null ? "未知" : status.getInfo();
+    }
 }

+ 14 - 0
nightFragrance-massage/src/main/java/com/ylx/order/service/TOrderService.java

@@ -8,7 +8,9 @@ import com.ylx.massage.domain.TWxUser;
 import com.ylx.massage.domain.vo.HomeBlock;
 import com.ylx.massage.domain.vo.OrderVerificationVo;
 import com.ylx.massage.domain.vo.TechnicianAvailabilityVo;
+import com.ylx.order.domain.dto.OrderDateQueryDTO;
 import com.ylx.order.domain.dto.OrderSubmitDTO;
+import com.ylx.order.domain.vo.OrderDateQueryVo;
 
 import java.math.BigDecimal;
 import java.util.Date;
@@ -152,4 +154,16 @@ public interface TOrderService extends IService<TOrder> {
     public List<Map<String, Object>> myIncomeDetail(TWxUser user, Integer wStatus);
 
     void submitOrder(OrderSubmitDTO dto);
+
+    /**
+     * 用户端订单列表
+     * @param dto
+     * @return
+     */
+    Page<OrderDateQueryVo> queryOrderList(OrderDateQueryDTO dto);
+
+    /*
+     * 逻辑删除订单
+     */
+    void logicDeleteOrder(Long orderId);
 }

+ 120 - 0
nightFragrance-massage/src/main/java/com/ylx/order/service/impl/TOrderServiceImpl.java

@@ -2,6 +2,7 @@ package com.ylx.order.service.impl;
 
 import cn.hutool.core.collection.CollUtil;
 import cn.hutool.core.util.ObjectUtil;
+import cn.hutool.core.util.StrUtil;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
@@ -20,19 +21,26 @@ import com.ylx.massage.service.IMaTechnicianService;
 import com.ylx.massage.service.TAddressService;
 import com.ylx.massage.utils.OrderNumberGenerator;
 import com.ylx.order.domain.TOrder;
+import com.ylx.order.domain.dto.OrderDateQueryDTO;
 import com.ylx.order.domain.dto.OrderSubmitDTO;
+import com.ylx.order.domain.vo.OrderDateQueryVo;
+import com.ylx.order.enums.OrderStatusEnum;
 import com.ylx.order.mapper.TOrderMapper;
 import com.ylx.order.service.TOrderService;
 import com.ylx.project.domain.Project;
 import com.ylx.project.service.ProjectService;
 import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.BeanUtils;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
 import javax.annotation.Resource;
 import java.math.BigDecimal;
 import java.time.LocalDateTime;
+import java.time.LocalTime;
+import java.time.format.DateTimeFormatter;
 import java.util.*;
+import java.util.stream.Collectors;
 
 
 /**
@@ -42,6 +50,8 @@ import java.util.*;
 @Slf4j
 public class TOrderServiceImpl extends ServiceImpl<TOrderMapper, TOrder> implements TOrderService {
 
+    private final DateTimeFormatter dateFormatter = DateTimeFormatter.ofPattern("M月d日");
+    private final DateTimeFormatter timeFormatter = DateTimeFormatter.ofPattern("HH:mm");
     @Resource
     private ProjectService projectService;
     @Resource
@@ -292,4 +302,114 @@ public class TOrderServiceImpl extends ServiceImpl<TOrderMapper, TOrder> impleme
             throw new ServiceException("添加订单失败");
         }
     }
+
+    /**
+     * 用户端订单列表
+     * @param dto
+     * @return
+     */
+    @Override
+    public Page<OrderDateQueryVo> queryOrderList(OrderDateQueryDTO dto) {
+        // 1. 构造分页对象
+        Page<TOrder> page = new Page<>(dto.getPageNum(), dto.getPageSize());
+
+        // 2. 构造查询条件
+        LambdaQueryWrapper<TOrder> wrapper = new LambdaQueryWrapper<>();
+        if (dto.getStartDate() != null) {
+            LocalDateTime start = dto.getStartDate().atStartOfDay();
+            wrapper.ge(TOrder::getCreateTime, start);
+        }
+        if (dto.getEndDate() != null) {
+            LocalDateTime end = dto.getEndDate().atTime(LocalTime.MAX);
+            wrapper.le(TOrder::getCreateTime, end);
+        }
+        if (StrUtil.isNotBlank(dto.getProjectName())) {
+            wrapper.like(TOrder::getProjectName, dto.getProjectName());
+        }
+        if (StrUtil.isNotBlank(dto.getMerchantNickName())) {
+            wrapper.like(TOrder::getMerchantNickName, dto.getMerchantNickName());
+        }
+        wrapper.eq(TOrder::getIsDelete, 0);
+        wrapper.orderByDesc(TOrder::getCreateTime);
+
+        // 3. 执行分页查询
+        Page<TOrder> orderPage = baseMapper.selectPage(page, wrapper);
+
+        // 4. 转换 VO
+        List<OrderDateQueryVo> voList = orderPage.getRecords().stream()
+                .map(this::convertToVo)
+                .collect(Collectors.toList());
+
+
+        // 5. 返回分页结果
+
+        Page<OrderDateQueryVo> voPage = new Page<>(orderPage.getCurrent(), orderPage.getSize(), orderPage.getTotal());
+        voPage.setRecords(voList);
+
+        return voPage;
+    }
+
+    /**
+     * 用户端逻辑删除
+     * @param orderId
+     */
+    @Override
+    public void logicDeleteOrder(Long orderId) {
+        // 1. 查询订单是否存在
+        TOrder order = getById(orderId);
+        if (order == null) {
+            throw new ServiceException("订单不存在");
+        }
+
+        // 3. 如果已经是删除状态,可提示或直接返回
+        if (Integer.valueOf(1).equals(order.getIsDelete())) {
+            throw new ServiceException("订单已在回收站中");
+        }
+
+        // 4. 执行逻辑删除
+        order.setIsDelete(1);
+        order.setDeletedTime(LocalDateTime.now());
+        boolean updated = updateById(order);
+        if (!updated) {
+            throw new ServiceException("删除失败,请稍后重试");
+        }
+        // 5. 事务成功,返回(Controller中会返回 success 信息)
+    }
+
+
+    /**
+     * 将 TOrder 转换为 OrderDateQueryVo,并处理 serviceTime 字段
+     */
+    private OrderDateQueryVo convertToVo(TOrder order) {
+        OrderDateQueryVo vo = new OrderDateQueryVo();
+        // 拷贝相同字段
+        BeanUtils.copyProperties(order, vo);
+        // 手动设置字段名不一致或需要特殊处理的
+        vo.setOrderStatus(order.getStatus());
+        vo.setOrderStatusName(getOrderStatusName(order.getStatus()));
+        // 服务时间范围:预约开始时间 + 项目时长(分钟)
+        // 使用 startTime 和 completedTime 构建服务时间展示
+        String serviceTime = buildServiceTime(order.getStartTime(), order.getCompletedTime());
+        vo.setServiceTime(serviceTime);
+
+        return vo;
+    }
+    /**
+     * 订单状态码 -> 中文描述
+     */
+    private String getOrderStatusName(Integer status) {
+        return OrderStatusEnum.getInfoByCode(status);
+    }
+    /**
+     * 拼接服务时间字符串,例如 “2026-06-08 14:30 (90分钟)”
+     */
+    private String buildServiceTime(LocalDateTime startTime, LocalDateTime completedTime) {
+        if (startTime == null || completedTime == null) {
+            return "";
+        }
+        String date = startTime.format(dateFormatter);
+        String start = startTime.format(timeFormatter);
+        String end = completedTime.format(timeFormatter);
+        return date + " " + start + "-" + end;
+    }
 }