jinshihui hace 2 días
padre
commit
3b1cfce874

+ 215 - 0
nightFragrance-admin/src/main/java/com/ylx/web/controller/massage/CancelOrderApplicationController.java

@@ -0,0 +1,215 @@
+package com.ylx.web.controller.massage;
+
+import com.alibaba.fastjson.JSON;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ylx.common.core.controller.BaseController;
+import com.ylx.common.core.domain.R;
+import com.ylx.common.utils.SecurityUtils;
+import com.ylx.common.utils.StringUtils;
+import com.ylx.massage.domain.CancelOrderApplication;
+import com.ylx.massage.domain.TJs;
+import com.ylx.massage.domain.TOrder;
+import com.ylx.massage.domain.vo.CancelOrderApplicationDetailVo;
+import com.ylx.massage.service.CancelOrderApplicationService;
+import com.ylx.massage.service.TJsService;
+import com.ylx.massage.service.TOrderService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.BeanUtils;
+import org.springframework.web.bind.annotation.*;
+
+import javax.annotation.Resource;
+import java.time.LocalDateTime;
+
+/**
+ * 退单申请控制器
+ *
+ * @author jinshihui
+ */
+@Slf4j
+@RestController
+@RequestMapping("api/order/cancelOrderApplication")
+@Api(tags = "退单申请")
+public class CancelOrderApplicationController extends BaseController {
+
+    @Resource
+    private CancelOrderApplicationService cancelOrderApplicationService;
+
+    @Resource
+    private TOrderService orderService;
+
+    @Resource
+    private TJsService jsService;
+
+
+    /**
+     * 分页查询退单申请列表
+     *
+     * @param page                   分页对象
+     * @param cancelOrderApplication 查询条件
+     * @return R<Page < CancelOrderApplication>>分页结果
+     */
+    @GetMapping("list")
+    @ApiOperation("分页查询退单申请列表")
+    public R<Page<CancelOrderApplication>> queryByPage(Page<CancelOrderApplication> page, CancelOrderApplication cancelOrderApplication) {
+        try {
+            log.info("开始查询退单申请列表,查询条件:{}", JSON.toJSONString(cancelOrderApplication));
+
+            // 构建查询条件
+            LambdaQueryWrapper<CancelOrderApplication> queryWrapper = new LambdaQueryWrapper<>();
+            // 订单号模糊查询
+            queryWrapper.like(StringUtils.isNotBlank(cancelOrderApplication.getOrderNo()),
+                    CancelOrderApplication::getOrderNo, cancelOrderApplication.getOrderNo());
+            // 技师姓名模糊查询
+            queryWrapper.like(StringUtils.isNotBlank(cancelOrderApplication.getTechName()),
+                    CancelOrderApplication::getTechName, cancelOrderApplication.getTechName());
+            // 技师电话模糊查询
+            queryWrapper.like(StringUtils.isNotBlank(cancelOrderApplication.getTechPhone()),
+                    CancelOrderApplication::getTechPhone, cancelOrderApplication.getTechPhone());
+            // 技师昵称模糊查询
+            queryWrapper.like(StringUtils.isNotBlank(cancelOrderApplication.getTechNickName()),
+                    CancelOrderApplication::getTechNickName, cancelOrderApplication.getTechNickName());
+            // 用户电话模糊查询
+            queryWrapper.like(StringUtils.isNotBlank(cancelOrderApplication.getUserPhone()),
+                    CancelOrderApplication::getUserPhone, cancelOrderApplication.getUserPhone());
+            // 审核状态精确查询(0:待审核,1:已审核,2:已拒绝)
+            queryWrapper.eq(cancelOrderApplication.getAuditStatus() != null,
+                    CancelOrderApplication::getAuditStatus, cancelOrderApplication.getAuditStatus());
+            // 申请时间范围查询(开始时间到结束时间)
+            queryWrapper.between(org.apache.commons.lang3.StringUtils.isNotBlank(cancelOrderApplication.getStartTime()) && org.apache.commons.lang3.StringUtils.isNotBlank(cancelOrderApplication.getEndTime()),
+                    CancelOrderApplication::getApplicationTime, cancelOrderApplication.getStartTime(), cancelOrderApplication.getEndTime());
+            // 按申请时间倒序排列(最新的申请在前)
+            queryWrapper.orderByDesc(CancelOrderApplication::getApplicationTime);
+            // 执行分页查询
+            Page<CancelOrderApplication> pageResult = cancelOrderApplicationService.page(page, queryWrapper);
+            log.info("查询退单申请列表成功,共查询到{}条记录", pageResult.getTotal());
+            return R.ok(pageResult);
+        } catch (Exception e) {
+            log.error("查询退单申请列表失败", e);
+            return R.fail("查询失败:" + e.getMessage());
+        }
+    }
+
+
+    /**
+     * 根据主键ID查询订单详情
+     *
+     * @param orderId
+     * @return R<CancelOrderApplicationDetailVo> 订单详情
+     */
+    @ApiOperation("根据订单ID查询订单详情")
+    @GetMapping(value = "/getByOrderId")
+    public R<CancelOrderApplicationDetailVo> getByOrderId(@RequestParam("id") String id) {
+        try {
+            if (StringUtils.isBlank(id)) {
+                return R.fail("ID不能为空");
+            }
+            //通过ID查询退单申请
+            CancelOrderApplication application = cancelOrderApplicationService.getById(id);
+            String orderId = application.getOrderId();
+            TOrder order = orderService.getById(orderId);
+            if (order == null) {
+                return R.fail("订单不存在");
+            }
+            CancelOrderApplicationDetailVo vo = new CancelOrderApplicationDetailVo();
+            BeanUtils.copyProperties(order, vo);
+            vo.setId(id);
+
+            //获取技师ID
+            String techId = order.getcJsId();
+            //根据技师ID查询技师信息
+            TJs tech = jsService.getById(techId);
+            vo.setJsName(tech.getcName());
+            vo.setCNickName(tech.getcNickName());
+            vo.setJsPhone(tech.getcPhone());
+            if (application != null) {
+                // 设置服务时长(分钟)
+                vo.setServiceDuration(Integer.valueOf(application.getServiceDuration()));
+            }
+            return R.ok(vo);
+        } catch (Exception e) {
+            e.printStackTrace();
+            throw new RuntimeException(e);
+        }
+    }
+
+    /**
+     * 审核退单申请
+     *
+     * @param cancelOrderApplicationDetailVo 退单申请详情
+     * @return R<CancelOrderApplication> 审核结果
+     */
+    @ApiOperation("审核退单申请")
+    @PostMapping("/audit")
+    public R audit(@RequestBody CancelOrderApplication cancelOrderApplication) {
+        try {
+            if (StringUtils.isBlank(cancelOrderApplication.getId())) {
+                return R.fail("退单申请ID不能为空");
+            }
+            // 检查申请是否存在
+            CancelOrderApplication application = cancelOrderApplicationService.getById(cancelOrderApplication.getId());
+            if (application == null) {
+                return R.fail("退单申请不存在");
+            }
+            //检查当前审核状态是否为待审核
+            if (application.getAuditStatus() != 0) {
+                return R.fail("退单申请当前状态不是待审核");
+            }
+
+            // 审核退单申请
+            application.setRefundAmount(cancelOrderApplication.getRefundAmount());
+            application.setAuditRemark(cancelOrderApplication.getAuditRemark());
+            application.setAuditStatus(cancelOrderApplication.getAuditStatus());
+            // 审核通过,更新订单状态为退单审核通过
+            if (application.getAuditStatus() == 1) {
+                application.setOrderStatus(7);
+                // 更新订单状态
+                TOrder order = new TOrder();
+                order.setcId(application.getOrderId());
+                order.setnStatus(7);
+                orderService.updateById(order);
+            }
+            // 审核时间
+            application.setAuditTime(LocalDateTime.now());
+            // 审核人ID
+            application.setAuditUserId(SecurityUtils.getUserId().toString());
+            // 审核人姓名
+            application.setAuditUserName(SecurityUtils.getUsername());
+            boolean b = cancelOrderApplicationService.updateById(application);
+            if (!b) {
+                return R.fail("审核退单申请失败");
+            }
+            return R.ok("审核退单申请成功");
+        } catch (Exception e) {
+            log.error("审核退单申请失败,申请ID:{}", cancelOrderApplication.getId(), e);
+            return R.fail("审核退单申请失败:" + e.getMessage());
+        }
+    }
+
+
+    /**
+     * 根据主键ID查询退单申请详情
+     *
+     * @param id 退单申请ID
+     * @return R<CancelOrderApplication> 退单申请详情
+     */
+    @GetMapping("{id}")
+    @ApiOperation("查询退单申请详情")
+    public R<CancelOrderApplication> queryById(@PathVariable("id") String id) {
+        try {
+            if (StringUtils.isBlank(id)) {
+                return R.fail("退单申请ID不能为空");
+            }
+            CancelOrderApplication application = cancelOrderApplicationService.getById(id);
+            if (application == null) {
+                return R.fail("退单申请不存在");
+            }
+            return R.ok(application);
+        } catch (Exception e) {
+            log.error("查询退单申请详情失败,申请ID:{}", id, e);
+            return R.fail("查询失败:" + e.getMessage());
+        }
+    }
+}

+ 36 - 13
nightFragrance-admin/src/main/java/com/ylx/web/controller/massage/TOrderController.java

@@ -156,16 +156,11 @@ public class TOrderController extends BaseController {
      * 4. 系统创建退单申请记录,状态为待审核
      * 5. 等待客服审核
      *
-     * 请求参数示例:
-     * {
-     *   "cId": "订单ID",
-     *   "cNote": "退单原因"
-     * }
      *
-     * @param order 订单对象,必须包含cId(订单ID)和cNote(退单原因)
-     * @return R 成功返回"申请已提交,等待客服审核"
+     * @param order 订单对象
+     * @return R
      */
-    @Log(title = "取消订单申请", businessType = BusinessType.UPDATE)
+    //@Log(title = "取消订单申请", businessType = BusinessType.UPDATE)
     @ApiOperation("取消订单申请")
     @RequestMapping(value = "wx/applyCancle", method = RequestMethod.POST)
     public R applyCancle(@RequestBody TOrder order) {
@@ -358,7 +353,7 @@ public class TOrderController extends BaseController {
     }
 
     /**
-     * 获取订单信息
+     * 获取订单信息(H5 用户端)
      *
      * @param param
      * @return R
@@ -439,6 +434,12 @@ public class TOrderController extends BaseController {
     }
 
 
+    /**
+     * 更新订单数据
+     *
+     * @param borrow
+     * @return R 操作结果
+     */
     @ApiOperation("更新订单数据")
     @Log(title = "更新订单数据", businessType = BusinessType.OTHER)
     @RequestMapping(value = "/update", method = RequestMethod.POST)
@@ -456,17 +457,39 @@ public class TOrderController extends BaseController {
         }
     }
 
-
+    /**
+     * 根据订单ID删除订单数据
+     *
+     * @param borrow
+     * @return R 操作结果
+     */
     @ApiOperation("删除数据")
     @RequestMapping(value = "/del", method = RequestMethod.POST)
     public R del(@RequestBody TOrder borrow) {
-        return R.ok(orderService.removeById(borrow));
+        try {
+            log.info("删除订单ID:{}", borrow.getcId());
+            return R.ok(orderService.removeById(borrow));
+        } catch (Exception e) {
+            e.printStackTrace();
+            throw new RuntimeException(e);
+        }
     }
 
-    @ApiOperation("根据id查询")
+    /**
+     * 根据订单ID查询订单详情
+     *
+     * @param borrow
+     * @return R<TOrder> 订单详情
+     */
+    @ApiOperation("根据订单ID查询订单详情")
     @RequestMapping(value = "/getByid", method = RequestMethod.POST)
     public R<TOrder> getByid(@RequestBody TOrder borrow) {
-        return R.ok(orderService.getById(borrow.getcId()));
+        try {
+            return R.ok(orderService.getById(borrow.getcId()));
+        } catch (Exception e) {
+            e.printStackTrace();
+            throw new RuntimeException(e);
+        }
     }
 
     /**

+ 47 - 13
nightFragrance-massage/src/main/java/com/ylx/massage/domain/CancelOrderApplication.java

@@ -1,15 +1,17 @@
 package com.ylx.massage.domain;
 
-import com.baomidou.mybatisplus.annotation.IdType;
-import com.baomidou.mybatisplus.annotation.TableId;
-import com.baomidou.mybatisplus.annotation.TableLogic;
-import com.baomidou.mybatisplus.annotation.TableName;
+import com.baomidou.mybatisplus.annotation.*;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.fasterxml.jackson.annotation.JsonIgnore;
 import lombok.Data;
 
 import java.io.Serializable;
 import java.math.BigDecimal;
 import java.time.LocalDateTime;
 
+/**
+ * 退单申请实体类
+ */
 @Data
 @TableName("t_cancel_order_application")
 public class CancelOrderApplication implements Serializable {
@@ -63,11 +65,21 @@ public class CancelOrderApplication implements Serializable {
      */
     private String techNickName;
 
+     /**
+     * 技师电话
+     */
+    private String techPhone;
+
     /**
      * 服务项目名称
      */
     private String projectName;
 
+    /**
+     * 项目时长
+     */
+     private String projectDuration;
+
     /**
      * 服务时长(分钟)
      */
@@ -83,6 +95,11 @@ public class CancelOrderApplication implements Serializable {
      */
     private BigDecimal refundAmount;
 
+    /**
+     * 订单状态(订单状态(-1:待付款 0:待接单 1:已接单 6:已出发 2:已到达 3:服务中 4:待评价 5:已完成 6:退单待审核 7:退单审核通过 8:退单审核拒绝  -2:已取消 -3:已拒绝)
+     */
+     private Integer orderStatus;
+
     /**
      * 审核状态(0:待审核,1:已审核,2:已拒绝)
      */
@@ -91,6 +108,7 @@ public class CancelOrderApplication implements Serializable {
     /**
      * 申请时间
      */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
     private LocalDateTime applicationTime;
 
     /**
@@ -98,44 +116,60 @@ public class CancelOrderApplication implements Serializable {
      */
     private String cancelOrderReason;
 
-     /**
+    /**
      * 审核人ID
      */
     private String auditUserId;
 
-     /**
+    /**
      * 审核人姓名
      */
     private String auditUserName;
 
-     /**
+    /**
      * 审核时间
      */
     private LocalDateTime auditTime;
 
-     /**
+    /**
      * 审核备注
      */
     private String auditRemark;
 
-     /**
+    /**
      * 退单处理时间
      */
     private LocalDateTime cancelOrderProcessTime;
 
-     /**
+    /**
      * 创建时间
      */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
     private LocalDateTime createTime;
 
-     /**
+    /**
      * 更新时间
      */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
     private LocalDateTime updateTime;
 
-     /**
+    /**
      * 删除状态(0:正常,1:已删除)
      */
     @TableLogic
     private Integer isDelete;
-}
+
+    /**
+     * 申请开始时间
+     */
+    @JsonIgnore
+    @TableField(exist = false)
+    private String startTime;
+
+    /**
+     * 申请结束时间
+     */
+    @JsonIgnore
+    @TableField(exist = false)
+    private String endTime;
+}

+ 2 - 1
nightFragrance-massage/src/main/java/com/ylx/massage/domain/TOrder.java

@@ -333,9 +333,10 @@ public class TOrder implements Serializable {
      * 订单状态
      * -1-待付款 0-待接单 1-已接单 2-已到达 3-服务中 4-待评价(已完成)
      * 5-已完成(已评价) 6-已出发 -2-已取消 -3-已拒绝
+     * 6:退单待审核 7:退单审核通过
      */
     @TableField("n_status")
-    @ApiModelProperty("订单状态: -1待付款 0待接单 1已接单 2已到达 3服务中 4待评价 5已完成 6已出发 -2已取消 -3已拒绝")
+    @ApiModelProperty("订单状态: -1待付款 0待接单 1已接单 6已出发 2已到达 3服务中 4待评价 5已完成 6:退单待审核 7:退单审核通过  -2已取消 -3已拒绝")
     private Integer nStatus;
 
     /**

+ 28 - 0
nightFragrance-massage/src/main/java/com/ylx/massage/domain/vo/CancelOrderApplicationDetailVo.java

@@ -0,0 +1,28 @@
+package com.ylx.massage.domain.vo;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.ylx.massage.domain.TOrder;
+import lombok.Data;
+
+/**
+ * 退单申请详情VO
+ */
+@Data
+public class CancelOrderApplicationDetailVo extends TOrder {
+
+    /**
+     * 退单申请ID
+     */
+    @JsonProperty(index = 0)
+    private String id;
+
+    /**
+     * 项目时长
+     */
+     private Integer projectDuration;
+
+    /**
+     * 服务时长(分钟)
+     */
+     private Integer serviceDuration;
+}

+ 3 - 3
nightFragrance-massage/src/main/java/com/ylx/massage/service/CancelOrderApplicationService.java

@@ -21,10 +21,10 @@ public interface CancelOrderApplicationService extends IService<CancelOrderAppli
     String createApplication(String orderId, String cancelReason);
 
     /**
-     * 根据订单ID查询最新的退单申请
+     * 根据订单ID查询退单申请记录
      *
      * @param orderId 订单ID
-     * @return 退单申请记录
+     * @return CancelOrderApplication 退单申请记录
      */
-    CancelOrderApplication getLatestByOrderId(String orderId);
+    CancelOrderApplication getInfoByOrderId(String orderId);
 }

+ 11 - 12
nightFragrance-massage/src/main/java/com/ylx/massage/service/impl/CancelOrderApplicationServiceImpl.java

@@ -76,12 +76,13 @@ public class CancelOrderApplicationServiceImpl extends ServiceImpl<com.ylx.massa
         // 3. 校验订单状态 - 只有进行中的订单才能申请退单
         // 进行中状态包括: 待接单(0)、已接单(1)、已出发(6)、已到达(2)、服务中(3)
         Integer currentStatus = order.getnStatus();
+        log.info("订单当前状态:{}", currentStatus);
         if (!isOrderInProgress(currentStatus)) {
             throw new ServiceException("当前订单状态不允许申请退单,只有进行中的订单可以申请退单");
         }
 
         // 4. 检查是否已有待审核的退单申请
-        CancelOrderApplication existingApplication = getLatestByOrderId(orderId);
+        CancelOrderApplication existingApplication = getInfoByOrderId(orderId);
         if (existingApplication != null && existingApplication.getAuditStatus() == 0) {
             throw new ServiceException("该订单已有待审核的退单申请,请勿重复提交");
         }
@@ -109,8 +110,8 @@ public class CancelOrderApplicationServiceImpl extends ServiceImpl<com.ylx.massa
         application.setProjectName(projectName);
 
         // 计算已服务时长
-        String serviceDuration = calculateServiceDuration(order);
-        application.setServiceDuration(serviceDuration);
+        Long serviceDuration = calculateServiceDuration(order);
+        application.setServiceDuration(String.valueOf(serviceDuration));
 
         // 设置金额
         application.setOrderAmount(order.getTotalPrice() != null ? order.getTotalPrice() : BigDecimal.ZERO);
@@ -136,17 +137,15 @@ public class CancelOrderApplicationServiceImpl extends ServiceImpl<com.ylx.massa
     }
 
     /**
-     * 根据订单ID查询最新的退单申请
+     * 根据订单ID查询退单申请记录
      *
      * @param orderId 订单ID
      * @return CancelOrderApplication 退单申请记录
      */
     @Override
-    public CancelOrderApplication getLatestByOrderId(String orderId) {
+    public CancelOrderApplication getInfoByOrderId(String orderId) {
         LambdaQueryWrapper<CancelOrderApplication> wrapper = new LambdaQueryWrapper<>();
-        wrapper.eq(CancelOrderApplication::getOrderId, orderId)
-                .orderByDesc(CancelOrderApplication::getCreateTime)
-                .last("LIMIT 1");
+        wrapper.eq(CancelOrderApplication::getOrderId, orderId);
         return this.getOne(wrapper);
     }
 
@@ -190,7 +189,7 @@ public class CancelOrderApplicationServiceImpl extends ServiceImpl<com.ylx.massa
      * @param order 订单对象
      * @return String服务时长字符串,如"40分钟"
      */
-    private String calculateServiceDuration(TOrder order) {
+    private Long calculateServiceDuration(TOrder order) {
         try {
             LocalDateTime startTime = order.getStartTime();
             LocalDateTime endTime = order.getEndTime();
@@ -198,18 +197,18 @@ public class CancelOrderApplicationServiceImpl extends ServiceImpl<com.ylx.massa
             if (startTime != null && endTime != null) {
                 long minutes = Duration.between(startTime, endTime).toMinutes();
                 if (minutes > 0) {
-                    return minutes + "分钟";
+                    return minutes;
                 }
             } else if (startTime != null) {
                 // 如果只有开始时间,计算到现在的时长
                 long minutes = Duration.between(startTime, LocalDateTime.now()).toMinutes();
                 if (minutes > 0) {
-                    return minutes + "分钟";
+                    return minutes;
                 }
             }
         } catch (Exception e) {
             log.warn("计算服务时长失败,订单ID:{}", order.getcId(), e);
         }
-        return "0分钟";
+        return 0L;
     }
 }

+ 3 - 1
nightFragrance-massage/src/main/java/com/ylx/massage/service/impl/TOrderServiceImpl.java

@@ -277,8 +277,10 @@ public class TOrderServiceImpl extends ServiceImpl<TOrderMapper, TOrder> impleme
             order.setLatitude(borrow.getLatitude());
             order.setLongitude(borrow.getLongitude());
             TJs js = jsService.getById(order.getcJsId());
-            //添加位置信息
+
+            //添加技师位置信息
             locationUtil.geoAdd(LocationUtil.GEO_KEY_USER, js.getcOpenId() + order.getOrderNo(), Double.parseDouble(js.getLongitude().toString()), Double.parseDouble(js.getLatitude().toString()));
+            //添加用户位置信息
             locationUtil.geoAdd(LocationUtil.GEO_KEY_USER, order.getcOpenId() + order.getOrderNo(), Double.parseDouble(borrow.getLongitude().toString()), Double.parseDouble(borrow.getLatitude().toString()));
             double distance = locationUtil.getDistance(js.getcOpenId() + order.getOrderNo(), order.getcOpenId() + order.getOrderNo());
             locationUtil.remove(LocationUtil.GEO_KEY_USER, js.getcOpenId() + order.getOrderNo(), order.getcOpenId() + order.getOrderNo());