jinshihui 1 сар өмнө
parent
commit
f36b436c49

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

@@ -78,7 +78,7 @@ public class CancelOrderApplicationController extends BaseController {
             // 用户电话模糊查询
             queryWrapper.like(StringUtils.isNotBlank(cancelOrderApplication.getUserPhone()),
                     CancelOrderApplication::getUserPhone, cancelOrderApplication.getUserPhone());
-            // 审核状态精确查询(0:待审核,1:已审核,2:已拒绝
+            // 审核状态精确查询(0:待审核,1:已审核,2:已取消
             queryWrapper.eq(cancelOrderApplication.getAuditStatus() != null,
                     CancelOrderApplication::getAuditStatus, cancelOrderApplication.getAuditStatus());
             // 申请时间范围查询(开始时间到结束时间)
@@ -137,7 +137,7 @@ public class CancelOrderApplicationController extends BaseController {
             vo.setJsPhone(tech.getcPhone());
             if (application != null) {
                 // 设置服务时长(分钟)
-                vo.setServiceDuration(Integer.valueOf(application.getServiceDuration()));
+                vo.setServiceDuration(application.getServiceDuration());
                 JSONArray objects = order.getcGoods();
                 // 遍历商品列表,累加项目金额
                 BigDecimal projectPrice = BigDecimal.ZERO;
@@ -191,14 +191,14 @@ public class CancelOrderApplicationController extends BaseController {
             // 审核退单申请
             application.setRefundAmount(cancelOrderApplication.getRefundAmount());
             application.setAuditRemark(cancelOrderApplication.getAuditRemark());
+            application.setOrderStatus(8);
             application.setAuditStatus(cancelOrderApplication.getAuditStatus());
             // 审核通过,更新订单状态为退单审核通过
             if (application.getAuditStatus() == 1) {
-                application.setOrderStatus(7);
                 // 更新订单状态
                 TOrder order = new TOrder();
                 order.setcId(application.getOrderId());
-                order.setnStatus(7);
+                order.setnStatus(8);
                 orderService.updateById(order);
             }
             // 审核时间

+ 2 - 1
nightFragrance-admin/src/main/java/com/ylx/web/controller/massage/TOrderController.java

@@ -385,8 +385,9 @@ public class TOrderController extends BaseController {
     }
 
     /**
-     * 获取订单信息(H5 用户端)
+     * 获取订单信息(H5 用户端)
      *
+     * @param page
      * @param param
      * @return R
      */

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

@@ -337,10 +337,10 @@ public class TOrder implements Serializable {
      * 订单状态
      * -1-待付款 0-待接单 1-已接单 2-已到达 3-服务中 4-待评价(已完成)
      * 5-已完成(已评价) 6-已出发 -2-已取消 -3-已拒绝
-     * 6:退单待审核 7:退单审核通过
+     * 7:退单待审核 8:退单审核通过
      */
     @TableField("n_status")
-    @ApiModelProperty("订单状态: -1待付款 0待接单 1已接单 6已出发 2已到达 3服务中 4待评价 5已完成 6:退单待审核 7:退单审核通过  -2已取消 -3已拒绝")
+    @ApiModelProperty("订单状态: -1待付款 0待接单 1已接单 6已出发 2已到达 3服务中 4待评价 5已完成 7:退单待审核 8:退单审核通过  -2已取消 -3已拒绝")
     private Integer nStatus;
 
     /**
@@ -504,6 +504,13 @@ public class TOrder implements Serializable {
     @ApiModelProperty("订单状态名称")
     private String statusName;
 
+
+    /**
+     * 服务时长(分钟)
+     */
+    @TableField(exist = false)
+    private String serviceDuration;
+
     public String getcId() {
         return cId;
     }

+ 0 - 2
nightFragrance-massage/src/main/java/com/ylx/massage/domain/dto/PublishMomentDTO.java

@@ -28,7 +28,6 @@ public class PublishMomentDTO {
      * 动态内容
      */
     @ApiModelProperty(value = "动态内容", required = true)
-    @NotBlank(message = "动态内容不能为空")
     @Size(max = 1000, message = "动态内容不能超过300个字符")
     private String content;
 
@@ -36,7 +35,6 @@ public class PublishMomentDTO {
      * 媒体类型:1-图片,2-视频
      */
     @ApiModelProperty(value = "媒体类型:1-图片,2-视频", required = true)
-    @NotNull(message = "媒体类型不能为空")
     private Integer mediaType;
 
     /**

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

@@ -31,7 +31,7 @@ public class CancelOrderApplicationDetailVo extends TOrder {
     /**
      * 服务时长(分钟)
      */
-     private Integer serviceDuration;
+     //private Integer serviceDuration;
 
     /**
      * 项目金额

+ 2 - 1
nightFragrance-massage/src/main/java/com/ylx/massage/service/ITechnicianMomentService.java

@@ -2,6 +2,7 @@ package com.ylx.massage.service;
 
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.IService;
+import com.ylx.massage.domain.dto.EditMomentDTO;
 import com.ylx.massage.domain.dto.MomentAuditDTO;
 import com.ylx.massage.domain.dto.MomentManageQueryDTO;
 import com.ylx.massage.domain.dto.PublishMomentDTO;
@@ -72,7 +73,7 @@ public interface ITechnicianMomentService extends IService<com.ylx.massage.domai
      * @param openId   技师OpenID
      * @return 动态ID
      */
-    Long editMoment(com.ylx.massage.domain.dto.EditMomentDTO dto, String openId);
+    Long editMoment(EditMomentDTO dto, String openId);
 
     /**
      * 查询草稿箱列表

+ 131 - 14
nightFragrance-massage/src/main/java/com/ylx/massage/service/impl/CancelOrderApplicationServiceImpl.java

@@ -1,6 +1,7 @@
 package com.ylx.massage.service.impl;
 
 import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.ylx.common.exception.ServiceException;
@@ -32,7 +33,8 @@ import java.time.format.DateTimeFormatter;
  */
 @Slf4j
 @Service
-public class CancelOrderApplicationServiceImpl extends ServiceImpl<com.ylx.massage.mapper.CancelOrderApplicationMapper, CancelOrderApplication>
+public class CancelOrderApplicationServiceImpl
+        extends ServiceImpl<com.ylx.massage.mapper.CancelOrderApplicationMapper, CancelOrderApplication>
         implements CancelOrderApplicationService {
 
     @Autowired
@@ -47,14 +49,14 @@ public class CancelOrderApplicationServiceImpl extends ServiceImpl<com.ylx.massa
     /**
      * 创建退单申请
      *
-     * @param orderId 订单ID
+     * @param orderId      订单ID
      * @param cancelReason 退单原因
      * @return String 申请记录ID
      */
     @Override
     @Transactional(rollbackFor = Exception.class)
     public String createApplication(String orderId, String cancelReason) {
-        //  查询订单信息
+        // 查询订单信息
         TOrder order = orderService.getById(orderId);
         if (order == null) {
             throw new ServiceException("订单不存在");
@@ -74,8 +76,7 @@ public class CancelOrderApplicationServiceImpl extends ServiceImpl<com.ylx.massa
             throw new ServiceException("该订单已有待审核的退单申请,请勿重复提交");
         }
 
-
-        //  查询技师信息
+        // 查询技师信息
         TJs technician = null;
         if (StringUtils.isNotEmpty(order.getcJsId())) {
             technician = jsService.getById(order.getcJsId());
@@ -98,15 +99,20 @@ public class CancelOrderApplicationServiceImpl extends ServiceImpl<com.ylx.massa
         String projectName = extractProjectName(order);
         application.setProjectName(projectName);
 
+        // 提取并设置项目时长
+        Integer projectDuration = extractProjectDuration(order);
+        application.setProjectDuration(projectDuration != null ? String.valueOf(projectDuration) : "0");
+
         // 计算已服务时长
         Long serviceDuration = calculateServiceDuration(order);
         application.setServiceDuration(String.valueOf(serviceDuration));
 
         // 设置金额
         application.setOrderAmount(order.getTotalPrice() != null ? order.getTotalPrice() : BigDecimal.ZERO);
-        //application.setRefundAmount(order.getTotalPrice() != null ? order.getTotalPrice() : BigDecimal.ZERO);
-
 
+        // 计算退款金额
+        BigDecimal refundAmount = calculateRefundAmount(order, serviceDuration, projectDuration);
+        application.setRefundAmount(refundAmount);
 
         // 保存订单原始状态,用于取消申请时恢复订单状态
         application.setOrderStatus(currentStatus);
@@ -151,11 +157,11 @@ public class CancelOrderApplicationServiceImpl extends ServiceImpl<com.ylx.massa
      */
     private boolean isOrderInProgress(Integer status) {
         return status != null &&
-                (status.equals(OrderStatusEnum.WAIT_JD.getCode()) ||      // 待接单
-                        status.equals(OrderStatusEnum.RECEIVED_ORDER.getCode()) ||  // 已接单
-                        status.equals(OrderStatusEnum.DEPART.getCode()) ||          // 已出发
-                        status.equals(OrderStatusEnum.ARRIVED.getCode()) ||         // 已到达
-                        status.equals(OrderStatusEnum.SERVICE.getCode()));           // 服务中
+                (status.equals(OrderStatusEnum.WAIT_JD.getCode()) || // 待接单
+                        status.equals(OrderStatusEnum.RECEIVED_ORDER.getCode()) || // 已接单
+                        status.equals(OrderStatusEnum.DEPART.getCode()) || // 已出发
+                        status.equals(OrderStatusEnum.ARRIVED.getCode()) || // 已到达
+                        status.equals(OrderStatusEnum.SERVICE.getCode())); // 服务中
     }
 
     /**
@@ -180,7 +186,7 @@ public class CancelOrderApplicationServiceImpl extends ServiceImpl<com.ylx.massa
      * 计算已服务时长(分钟)
      *
      * @param order 订单对象
-     * @return String服务时长字符串,如"40分钟"
+     * @return Long 已服务时长(分钟)
      */
     private Long calculateServiceDuration(TOrder order) {
         try {
@@ -206,8 +212,119 @@ public class CancelOrderApplicationServiceImpl extends ServiceImpl<com.ylx.massa
     }
 
     /**
-     * 取消退单申请
+     * 从订单中提取项目时长(分钟)
      *
+     * @param order 订单对象
+     * @return Integer 项目时长(分钟)
+     */
+    private Integer extractProjectDuration(TOrder order) {
+        try {
+            if (order.getcGoods() != null && !order.getcGoods().isEmpty()) {
+                long totalMinutes = 0;
+                for (int i = 0; i < order.getcGoods().size(); i++) {
+                    JSONObject item = order.getcGoods().getJSONObject(i);
+                    Integer minutes = item.getInteger("nMinute");
+                    Integer number = item.getInteger("number");
+                    if (minutes != null && number != null) {
+                        totalMinutes += (minutes * number);
+                    }
+                }
+                return (int) totalMinutes;
+            }
+        } catch (Exception e) {
+            log.warn("解析订单项目时长失败,订单ID:{}", order.getcId(), e);
+        }
+        return null;
+    }
+
+    /**
+     * 计算退款金额
+     * <p>
+     * 退款规则:
+     * (1)订单已接单状态:技师未出发,不需要填写退单申请即可退款,退款比例100%
+     * (2)订单已到达之前状态(待接单、已接单、已出发):
+     * 1)免车费-需要填写退单申请,退款比例100%(自动带出,人工审核)
+     * 2)有车费-需要填写退单申请,退款金额=(项目金额-优惠金额)*100%+车费(自动带出,人工审核)
+     * (3)订单服务中:
+     * 1)免车费-需要填写退单申请,退款金额=(项目金额-优惠金额)*(服务时长/项目时长)100%(自动带出,人工审核)
+     * 2)有车费-需要填写退单申请,退款金额=(项目金额-优惠金额)*(服务时长/项目时长)100%+车费(自动带出,人工审核)
+     *
+     * @param order           订单对象
+     * @param serviceDuration 已服务时长(分钟)
+     * @param projectDuration 项目时长(分钟)
+     * @return BigDecimal 退款金额
+     */
+    private BigDecimal calculateRefundAmount(TOrder order, Long serviceDuration, Integer projectDuration) {
+        Integer orderStatus = order.getnStatus();
+        // 获取订单基础金额
+        // 项目金额
+        BigDecimal projectAmount = order.getdTotalMoney() != null ? order.getdTotalMoney() : BigDecimal.ZERO;
+        // 优惠金额
+        BigDecimal preferential = order.getPreferential() != null ? order.getPreferential() : BigDecimal.ZERO;
+        // 车费
+        BigDecimal fare = order.getFare() != null ? order.getFare() : BigDecimal.ZERO;
+
+        // 项目金额 - 优惠金额
+        BigDecimal projectAmountAfterDiscount = projectAmount.subtract(preferential);
+
+        // 判断是否有车费
+        boolean hasCarFee = fare.compareTo(BigDecimal.ZERO) > 0;
+
+        BigDecimal refundAmount = new BigDecimal("0");
+        if (OrderStatusEnum.RECEIVED_ORDER.getCode().equals(orderStatus)) {
+            // (1)订单已接单状态:技师未出发,退款比例100%
+            // 退款金额 = 项目金额 - 优惠金额 + 车费(如果有)
+            refundAmount = projectAmountAfterDiscount.add(fare);
+            log.info("订单已接单状态,退款金额=项目金额({})-优惠金额({})+车费({})={}", projectAmount, preferential, fare, refundAmount);
+        } else if (OrderStatusEnum.DEPART.getCode().equals(orderStatus)) {
+            // (2)订单已出发状态(已到达之前)
+            if (hasCarFee) {
+                //有车费:退款金额 = (项目金额 - 优惠金额)* 100% + 车费
+                refundAmount = projectAmountAfterDiscount.add(fare);
+                log.info("订单已出发状态且有车费,退款金额=(项目金额({})-优惠金额({})*100%+车费({})={}", projectAmount, preferential, fare, refundAmount);
+            } else {
+                //免车费:退款比例100%
+                refundAmount = projectAmountAfterDiscount;
+                log.info("订单已出发状态且免车费,退款金额=(项目金额({})-优惠金额({})*100%={}", projectAmount, preferential, refundAmount);
+            }
+        } else if (OrderStatusEnum.SERVICE.getCode().equals(orderStatus)) {
+            // (3)订单服务中
+            // 计算服务比例:服务时长 / 项目时长
+            double serviceRatio = (double) serviceDuration / projectDuration;
+            // 确保比例不超过1(不超过100%)
+            serviceRatio = Math.min(serviceRatio, 1.0);
+
+            // 计算退款金额
+            BigDecimal serviceRefundAmount = projectAmountAfterDiscount.multiply(BigDecimal.valueOf(serviceRatio)).setScale(2, BigDecimal.ROUND_HALF_UP);
+            if (hasCarFee) {
+                //有车费:退款金额 = (项目金额 - 优惠金额)*(服务时长/项目时长)100% + 车费
+                refundAmount = serviceRefundAmount.add(fare);
+                log.info("订单服务中且有车费,退款金额=(项目金额({})-优惠金额({})*({}/{})*100%+车费({})={}", projectAmount, preferential, serviceDuration, projectDuration, fare, refundAmount);
+            } else {
+                //免车费:退款金额 = (项目金额 - 优惠金额)*(服务时长/项目时长)100%
+                refundAmount = serviceRefundAmount;
+                log.info("订单服务中且免车费,退款金额=(项目金额({})-优惠金额({})*({}/{})*100%={}", projectAmount, preferential, serviceDuration, projectDuration, refundAmount);
+            }
+        }
+
+        // 确保退款金额不超过订单总价
+        BigDecimal maxRefund = order.getTotalPrice() != null ? order.getTotalPrice() : BigDecimal.ZERO;
+        if (refundAmount.compareTo(maxRefund) > 0) {
+            log.warn("计算退款金额({})超过订单总价({}),调整为订单总价", refundAmount, maxRefund);
+            refundAmount = maxRefund;
+        }
+        // 确保退款金额不为负数
+        if (refundAmount.compareTo(BigDecimal.ZERO) < 0) {
+            log.warn("计算退款金额({})为负数,调整为0", refundAmount);
+            refundAmount = BigDecimal.ZERO;
+        }
+        log.info("最终退款金额:{},订单ID:{},订单状态:{},服务时长:{}分钟,项目时长:{}分钟", refundAmount, order.getcId(), orderStatus, serviceDuration, projectDuration);
+        return refundAmount;
+    }
+
+    /**
+     * 取消退单申请
+     * <p>
      * 业务流程:
      * 1. 验证退单申请是否存在
      * 2. 验证退单申请状态是否为待审核(只有待审核的申请才能取消)

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

@@ -31,6 +31,7 @@ import org.springframework.transaction.annotation.Transactional;
 import javax.annotation.Resource;
 import java.math.BigDecimal;
 import java.math.RoundingMode;
+import java.time.Duration;
 import java.time.LocalDate;
 import java.time.LocalDateTime;
 import java.time.LocalTime;
@@ -1202,6 +1203,9 @@ public class TOrderServiceImpl extends ServiceImpl<TOrderMapper, TOrder> impleme
                 if (StringUtils.isNotBlank(orders.getOldJsId())) {
                     orders.setOldJs(jsService.getById(orders.getOldJsId()));
                 }
+                // 计算已服务时长
+                Long serviceDuration = calculateServiceDuration(orders);
+                orders.setServiceDuration(String.valueOf(serviceDuration));
                 ordersList.add(orders);
 
             });
@@ -1210,6 +1214,36 @@ public class TOrderServiceImpl extends ServiceImpl<TOrderMapper, TOrder> impleme
         return orderPage;
     }
 
+
+    /**
+     * 计算已服务时长(分钟)
+     *
+     * @param order 订单对象
+     * @return Long 已服务时长(分钟)
+     */
+    private Long calculateServiceDuration(TOrder order) {
+        try {
+            LocalDateTime startTime = order.getStartTime();
+            LocalDateTime endTime = order.getEndTime();
+
+            if (startTime != null && endTime != null) {
+                long minutes = Duration.between(startTime, endTime).toMinutes();
+                if (minutes > 0) {
+                    return minutes;
+                }
+            } else if (startTime != null) {
+                // 如果只有开始时间,计算到现在的时长
+                long minutes = Duration.between(startTime, LocalDateTime.now()).toMinutes();
+                if (minutes > 0) {
+                    return minutes;
+                }
+            }
+        } catch (Exception e) {
+            log.warn("计算服务时长失败,订单ID:{}", order.getcId(), e);
+        }
+        return 0L;
+    }
+
     @Override
     @Transactional(rollbackFor = Exception.class)
     public void takingOrders(TOrder order) {

+ 86 - 74
nightFragrance-massage/src/main/java/com/ylx/massage/service/impl/TechnicianMomentServiceImpl.java

@@ -56,7 +56,7 @@ public class TechnicianMomentServiceImpl extends ServiceImpl<TechnicianMomentMap
      *
      * @param pageNum  页码,默认1
      * @param pageSize 每页数量,默认10
-     * @return R<List<MomentListVO>> 动态列表
+     * @return R<List < MomentListVO>> 动态列表
      */
     @Override
     public List<MomentListVO> getRecommendedMoments(Integer pageNum, Integer pageSize) {
@@ -122,7 +122,7 @@ public class TechnicianMomentServiceImpl extends ServiceImpl<TechnicianMomentMap
      * @param latitude  纬度
      * @param pageNum   页码,默认1
      * @param pageSize  每页数量,默认10
-     * @return R<List<MomentListVO>> 动态列表
+     * @return R<List < MomentListVO>> 动态列表
      */
     @Override
     public List<MomentListVO> getNearbyMoments(BigDecimal longitude, BigDecimal latitude, Integer pageNum, Integer pageSize) {
@@ -257,7 +257,7 @@ public class TechnicianMomentServiceImpl extends ServiceImpl<TechnicianMomentMap
      * @param lat2 纬度2(技师纬度)
      * @param lon2 经度2(技师经度)
      * @return double 距离(单位:km)
-     *
+     * <p>
      * 使用Haversine公式
      */
     private double calculateDistance(double lat1, double lon1, double lat2, double lon2) {
@@ -284,15 +284,7 @@ public class TechnicianMomentServiceImpl extends ServiceImpl<TechnicianMomentMap
     @Override
     @Transactional(rollbackFor = Exception.class)
     public Long publishMoment(PublishMomentDTO dto, String openId) {
-        // 1. 参数校验
-        if (dto == null) {
-            throw new ServiceException("发布动态信息不能为空");
-        }
-        if (openId == null || openId.trim().isEmpty()) {
-            throw new ServiceException("openId不能为空");
-        }
-
-        // 2. 根据openId查询技师信息
+        // 根据openId查询技师信息
         LambdaQueryWrapper<TJs> queryWrapper = new LambdaQueryWrapper<>();
         queryWrapper.eq(TJs::getcOpenId, openId);
         TJs technician = tJsMapper.selectOne(queryWrapper);
@@ -300,33 +292,49 @@ public class TechnicianMomentServiceImpl extends ServiceImpl<TechnicianMomentMap
             throw new ServiceException("技师信息不存在");
         }
 
-        // 3. 校验媒体类型和媒体文件
-        if (dto.getMediaType() == null) {
-            throw new ServiceException("媒体类型不能为空");
-        }
-        if (dto.getMediaType() == 1) {
-            // 图片类型
-            if (dto.getImageUrls() == null || dto.getImageUrls().isEmpty()) {
-                throw new ServiceException("图片不能为空");
+        //查询是否保存为草稿
+        Integer isDraft = dto.getIsDraft();
+        if (isDraft == 1) {
+            //只校验标题
+            if (dto.getTitle() == null || dto.getTitle().trim().isEmpty()) {
+                throw new ServiceException("动态标题不能为空");
             }
-            if (dto.getImageUrls().size() > 9) {
-                throw new ServiceException("最多只能上传9张图片");
+        } else {
+            // 校验动态标题
+            if (dto.getTitle() == null || dto.getTitle().trim().isEmpty()) {
+                throw new ServiceException("动态标题不能为空");
             }
-        } else if (dto.getMediaType() == 2) {
-            // 视频类型
-            if (dto.getVideoUrl() == null || dto.getVideoUrl().trim().isEmpty()) {
-                throw new ServiceException("视频不能为空");
+            // 校验动态内容
+            if (dto.getContent() == null || dto.getContent().trim().isEmpty()) {
+                throw new ServiceException("动态内容不能为空");
+            }
+            // 校验媒体类型和媒体文件
+            if (dto.getMediaType() == null) {
+                throw new ServiceException("媒体类型不能为空");
+            }
+            if (dto.getMediaType() == 1) {
+                // 图片类型
+                if (dto.getImageUrls() == null || dto.getImageUrls().isEmpty()) {
+                    throw new ServiceException("图片不能为空");
+                }
+                if (dto.getImageUrls().size() > 9) {
+                    throw new ServiceException("最多只能上传9张图片");
+                }
+            } else if (dto.getMediaType() == 2) {
+                // 视频类型
+                if (dto.getVideoUrl() == null || dto.getVideoUrl().trim().isEmpty()) {
+                    throw new ServiceException("视频不能为空");
+                }
+            } else {
+                throw new ServiceException("媒体类型不正确");
+            }
+            // 校验可见范围
+            if (dto.getVisibleRange() == null || dto.getVisibleRange() != 1) {
+                throw new ServiceException("可见范围只能选择公开");
             }
-        } else {
-            throw new ServiceException("媒体类型不正确");
-        }
-
-        // 4. 校验可见范围
-        if (dto.getVisibleRange() == null || dto.getVisibleRange() != 1) {
-            throw new ServiceException("可见范围只能选择公开");
         }
 
-        // 5. 创建动态对象
+        // 创建动态对象
         TechnicianMoment moment = new TechnicianMoment();
         moment.setTechnicianId(technician.getId());
         moment.setTitle(dto.getTitle());
@@ -338,18 +346,20 @@ public class TechnicianMomentServiceImpl extends ServiceImpl<TechnicianMomentMap
         moment.setLocation(dto.getLocation());
         moment.setAddress(dto.getAddress());
 
-        // 设置封面图
-        if (dto.getMediaType() == 1) {
-            // 图片类型,默认取第一张作为封面
-            if (dto.getImageUrls() != null && !dto.getImageUrls().isEmpty()) {
-                moment.setCoverUrl(dto.getImageUrls().get(0));
+        if(Objects.nonNull(dto.getMediaType())){
+            // 设置封面图
+            if (dto.getMediaType() == 1) {
+                // 图片类型,默认取第一张作为封面
+                if (dto.getImageUrls() != null && !dto.getImageUrls().isEmpty()) {
+                    moment.setCoverUrl(dto.getImageUrls().get(0));
+                }
+            } else if (dto.getMediaType() == 2) {
+                // 视频类型,使用视频URL作为封面
+                moment.setCoverUrl(dto.getVideoUrl());
             }
-        } else if (dto.getMediaType() == 2) {
-            // 视频类型,使用视频URL作为封面
-            moment.setCoverUrl(dto.getVideoUrl());
         }
 
-        // 6. 设置审核状态和发布时间
+        // 设置审核状态和发布时间
         if (dto.getIsDraft() != null && dto.getIsDraft() == 1) {
             // 保存草稿
             moment.setAuditStatus(0);
@@ -360,7 +370,7 @@ public class TechnicianMomentServiceImpl extends ServiceImpl<TechnicianMomentMap
             moment.setPublishTime(LocalDateTime.now());
         }
 
-        // 7. 设置初始状态
+        // 设置初始状态
         moment.setStatus(1); // 正常
         moment.setViewCount(0);
         moment.setCreateTime(LocalDateTime.now());
@@ -375,31 +385,33 @@ public class TechnicianMomentServiceImpl extends ServiceImpl<TechnicianMomentMap
         Long momentId = moment.getId();
 
         // 9. 保存媒体信息到媒体表
-        if (dto.getMediaType() == 1) {
-            // 保存图片
-            if (dto.getImageUrls() != null && !dto.getImageUrls().isEmpty()) {
-                for (int i = 0; i < dto.getImageUrls().size(); i++) {
-                    MomentMedia media = new MomentMedia();
-                    media.setMomentId(momentId);
-                    media.setMediaUrl(dto.getImageUrls().get(i));
-                    media.setMediaType(1); // 图片
-                    media.setSortOrder(i + 1);
-                    media.setCreateTime(LocalDateTime.now());
-                    //获取文件的格式
-                    String fileFormat = dto.getImageUrls().get(i).substring(dto.getImageUrls().get(i).lastIndexOf(".") + 1);
-                    media.setFileFormat(fileFormat);
-                    mediaMapper.insert(media);
+        if(Objects.nonNull(dto.getMediaType())){
+            if (dto.getMediaType() == 1) {
+                // 保存图片
+                if (dto.getImageUrls() != null && !dto.getImageUrls().isEmpty()) {
+                    for (int i = 0; i < dto.getImageUrls().size(); i++) {
+                        MomentMedia media = new MomentMedia();
+                        media.setMomentId(momentId);
+                        media.setMediaUrl(dto.getImageUrls().get(i));
+                        media.setMediaType(1); // 图片
+                        media.setSortOrder(i + 1);
+                        media.setCreateTime(LocalDateTime.now());
+                        //获取文件的格式
+                        String fileFormat = dto.getImageUrls().get(i).substring(dto.getImageUrls().get(i).lastIndexOf(".") + 1);
+                        media.setFileFormat(fileFormat);
+                        mediaMapper.insert(media);
+                    }
                 }
+            } else if (dto.getMediaType() == 2) {
+                // 保存视频
+                MomentMedia media = new MomentMedia();
+                media.setMomentId(momentId);
+                media.setMediaUrl(dto.getVideoUrl());
+                media.setMediaType(2); // 视频
+                media.setSortOrder(1);
+                media.setCreateTime(LocalDateTime.now());
+                mediaMapper.insert(media);
             }
-        } else if (dto.getMediaType() == 2) {
-            // 保存视频
-            MomentMedia media = new MomentMedia();
-            media.setMomentId(momentId);
-            media.setMediaUrl(dto.getVideoUrl());
-            media.setMediaType(2); // 视频
-            media.setSortOrder(1);
-            media.setCreateTime(LocalDateTime.now());
-            mediaMapper.insert(media);
         }
         log.info("发布动态成功,动态ID:{},技师ID:{},是否草稿:{}", momentId, technician.getId(), dto.getIsDraft());
         return momentId;
@@ -447,7 +459,7 @@ public class TechnicianMomentServiceImpl extends ServiceImpl<TechnicianMomentMap
 
         // 5. 验证动态状态是否允许编辑(只能编辑草稿和审核拒绝的动态)
         if (moment.getAuditStatus() == null ||
-            (moment.getAuditStatus() != 0 && moment.getAuditStatus() != 3)) {
+                (moment.getAuditStatus() != 0 && moment.getAuditStatus() != 3)) {
             throw new ServiceException("只能编辑草稿或审核拒绝的动态");
         }
 
@@ -681,13 +693,13 @@ public class TechnicianMomentServiceImpl extends ServiceImpl<TechnicianMomentMap
     }
 
 
-     /**
+    /**
      * 根据技师ID查询动态列表(已发布的动态:审核中+审核通过)
      *
      * @param technicianId 技师ID
      * @return List<MomentListVO> 动态列表
      */
-     @Override
+    @Override
     public List<MomentListVO> getMomentsByTechnicianId(String technicianId) {
         // 1. 参数校验
         if (technicianId == null || technicianId.trim().isEmpty()) {
@@ -735,11 +747,11 @@ public class TechnicianMomentServiceImpl extends ServiceImpl<TechnicianMomentMap
         String technicianName = queryDTO.getTechnicianName();
         Integer auditStatus = queryDTO.getAuditStatus();
         String startTime = queryDTO.getStartTime();
-        if(StringUtils.isNotBlank(startTime)){
+        if (StringUtils.isNotBlank(startTime)) {
             startTime = startTime + " 00:00:00";
         }
         String endTime = queryDTO.getEndTime();
-        if(StringUtils.isNotBlank(endTime)){
+        if (StringUtils.isNotBlank(endTime)) {
             endTime = endTime + " 23:59:59";
         }
 
@@ -761,10 +773,10 @@ public class TechnicianMomentServiceImpl extends ServiceImpl<TechnicianMomentMap
             LambdaQueryWrapper<TJs> jsQueryWrapper = new LambdaQueryWrapper<>();
             jsQueryWrapper.like(TJs::getcNickName, technicianName);
             List<TJs> technicians = tJsMapper.selectList(jsQueryWrapper);
-            if(CollUtil.isNotEmpty(technicians)){
+            if (CollUtil.isNotEmpty(technicians)) {
                 // 构建查询条件,查询所有匹配的技师的动态
                 queryWrapper.in(TechnicianMoment::getTechnicianId, technicians.stream().map(TJs::getId).collect(Collectors.toList()));
-            }else{
+            } else {
                 // 没有匹配的技师,查询空字符串列表
                 queryWrapper.in(TechnicianMoment::getTechnicianId, Collections.singleton(""));
             }

+ 1 - 1
nightFragrance-massage/src/main/resources/mapper/massage/TOrderMapper.xml

@@ -84,7 +84,7 @@
         </association>
     </resultMap>
 
-    <!-- 查询所有订单(PC端) -->
+    <!-- 查询所有订单(PC端 H5端) -->
     <select id="getAll" resultMap="getAllMap">
         select t_order.c_id,
         t_order.order_no,