Parcourir la source

开发批量审核用户评论(PC端)接口

jinshihui il y a 5 jours
Parent
commit
1a6ce772cb
17 fichiers modifiés avec 898 ajouts et 45 suppressions
  1. 68 11
      nightFragrance-admin/src/main/java/com/ylx/web/controller/massage/TCommentUserController.java
  2. 6 0
      nightFragrance-admin/src/main/java/com/ylx/web/controller/massage/TJsController.java
  3. 2 4
      nightFragrance-admin/src/main/java/com/ylx/web/controller/massage/TOrderController.java
  4. 19 0
      nightFragrance-common/src/main/java/com/ylx/common/config/WechatAccountConfig.java
  5. 3 0
      nightFragrance-massage/src/main/java/com/ylx/massage/domain/TComment.java
  6. 3 2
      nightFragrance-massage/src/main/java/com/ylx/massage/enums/JsStatusEnum.java
  7. 1 1
      nightFragrance-massage/src/main/java/com/ylx/massage/enums/OrderStatusEnum.java
  8. 83 0
      nightFragrance-massage/src/main/java/com/ylx/massage/service/OrderNotificationService.java
  9. 123 0
      nightFragrance-massage/src/main/java/com/ylx/massage/service/TCommentUserAuditService.java
  10. 361 0
      nightFragrance-massage/src/main/java/com/ylx/massage/service/impl/OrderNotificationServiceImpl.java
  11. 94 0
      nightFragrance-massage/src/main/java/com/ylx/massage/service/impl/TCommentUserAuditServiceImpl.java
  12. 2 2
      nightFragrance-massage/src/main/java/com/ylx/massage/service/impl/TCommentUserServiceImpl.java
  13. 19 4
      nightFragrance-massage/src/main/java/com/ylx/massage/service/impl/TJsServiceImpl.java
  14. 37 9
      nightFragrance-massage/src/main/java/com/ylx/massage/service/impl/TOrderServiceImpl.java
  15. 7 12
      nightFragrance-massage/src/main/java/com/ylx/massage/utils/WeChatUtil.java
  16. 48 0
      nightFragrance-system/src/main/java/com/ylx/system/domain/vo/BatchAuditCommentsDto.java
  17. 22 0
      nightFragrance-system/src/main/java/com/ylx/system/domain/vo/ReviewUserCommentsDto.java

+ 68 - 11
nightFragrance-admin/src/main/java/com/ylx/web/controller/massage/TCommentUserController.java

@@ -1,9 +1,11 @@
 package com.ylx.web.controller.massage;
 
+import com.alibaba.fastjson.JSON;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.github.pagehelper.PageHelper;
+import com.github.pagehelper.PageInfo;
 import com.ylx.common.core.controller.BaseController;
 import com.ylx.common.core.domain.R;
 import com.ylx.common.core.domain.model.WxLoginUser;
@@ -12,6 +14,8 @@ import com.ylx.massage.domain.TComment;
 import com.ylx.massage.domain.TCommentUser;
 import com.ylx.massage.service.TCommentUserAuditService;
 import com.ylx.massage.service.TCommentUserService;
+import com.ylx.system.domain.vo.ReviewUserCommentsDto;
+import com.ylx.system.domain.vo.BatchAuditCommentsDto;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
@@ -54,7 +58,9 @@ public class TCommentUserController extends BaseController {
     public R selectAll(@RequestParam Integer current, @RequestParam Integer size, TCommentUser tCommentUser) {
         try {
             PageHelper.startPage(current, size);
-            return R.ok(tCommentUserService.selectAll(tCommentUser));
+            List<TCommentUser> tCommentUsers = tCommentUserService.selectAll(tCommentUser);
+            PageInfo<TCommentUser> pageInfo = new PageInfo<>(tCommentUsers);
+            return R.ok(pageInfo);
         } catch (Exception e) {
             e.printStackTrace();
             throw new RuntimeException(e);
@@ -97,8 +103,8 @@ public class TCommentUserController extends BaseController {
     @RequestMapping(value = "wx/add", method = RequestMethod.POST)
     public R add(@RequestBody TCommentUser commentUser) {
         try {
-            //WxLoginUser wxLoginUser = getWxLoginUser();
-            return R.ok(tCommentUserService.saveComment(commentUser, null));
+            WxLoginUser wxLoginUser = getWxLoginUser();
+            return R.ok(tCommentUserService.saveComment(commentUser, wxLoginUser));
         } catch (Exception e) {
             e.printStackTrace();
             throw new RuntimeException(e);
@@ -144,24 +150,21 @@ public class TCommentUserController extends BaseController {
      */
     @PostMapping("audit")
     @ApiOperation("审核用户评论")
-    public R auditComment(
-            @RequestParam String commentId,
-            @RequestParam Integer auditStatus,
-            @RequestParam(required = false) String auditReason) {
+    public R auditComment(@RequestBody ReviewUserCommentsDto reviewUserCommentsDto) {
         try {
+            logger.info("reviewUserCommentsDto参数的值:{}", JSON.toJSONString(reviewUserCommentsDto));
             // 获取当前登录用户信息
             String auditorId = SecurityUtils.getUserId().toString();
             String auditorName = SecurityUtils.getUsername();
 
             // 调用审核服务
             Boolean result = tCommentUserAuditService.auditComment(
-                    commentId,
-                    auditStatus,
-                    auditReason,
+                    reviewUserCommentsDto.getCommentId(),
+                    reviewUserCommentsDto.getAuditStatus(),
+                    reviewUserCommentsDto.getAuditReason(),
                     auditorId,
                     auditorName
             );
-
             if (result) {
                 return R.ok("审核成功");
             } else {
@@ -172,5 +175,59 @@ public class TCommentUserController extends BaseController {
             return R.fail(e.getMessage());
         }
     }
+
+    /**
+     * 批量审核用户评论
+     * <p>
+     * 管理员批量审核多条用户评论,支持统一通过或拒绝。
+     * 审核通过后,所有评论状态更新为"通过";
+     * 审核拒绝时,需要填写拒绝理由,所有评论状态更新为"拒绝"。
+     * 返回审核结果统计,包括成功数量、失败数量和失败详情。
+     * </p>
+     *
+     * @param batchAuditCommentsDto 批量审核请求参数
+     * @return R 操作结果
+     */
+    @PostMapping("batchAudit")
+    @ApiOperation("批量审核用户评论")
+    public R batchAuditComments(@RequestBody BatchAuditCommentsDto batchAuditCommentsDto) {
+        try {
+            logger.info("batchAuditCommentsDto参数的值:{}", JSON.toJSONString(batchAuditCommentsDto));
+
+            // 获取当前登录用户信息
+            String auditorId = SecurityUtils.getUserId().toString();
+            String auditorName = SecurityUtils.getUsername();
+
+            // 调用批量审核服务
+            TCommentUserAuditService.BatchAuditResult result = tCommentUserAuditService.batchAuditComments(
+                    batchAuditCommentsDto.getCommentIds(),
+                    batchAuditCommentsDto.getAuditStatus(),
+                    batchAuditCommentsDto.getAuditReason(),
+                    auditorId,
+                    auditorName
+            );
+
+            // 构建响应数据
+            java.util.Map<String, Object> responseData = new java.util.HashMap<>();
+            responseData.put("successCount", result.getSuccessCount());
+            responseData.put("failCount", result.getFailCount());
+            responseData.put("totalCount", result.getTotalCount());
+            responseData.put("allSuccess", result.isAllSuccess());
+
+            // 如果有失败的,添加失败详情
+            if (!result.isAllSuccess() && result.getFailDetails() != null && !result.getFailDetails().isEmpty()) {
+                responseData.put("failDetails", result.getFailDetails());
+            }
+
+            // 构建响应消息
+            String message = String.format("批量审核完成,成功:%d条,失败:%d条", result.getSuccessCount(), result.getFailCount());
+            // 返回结果
+            return R.ok(responseData, message);
+        } catch (Exception e) {
+            logger.error("批量审核失败", e);
+            e.printStackTrace();
+            return R.fail(e.getMessage());
+        }
+    }
 }
 

+ 6 - 0
nightFragrance-admin/src/main/java/com/ylx/web/controller/massage/TJsController.java

@@ -448,6 +448,12 @@ public class TJsController extends BaseController {
         return false;
     }
 
+    /**
+     * 公众号新订单处理通知
+     *
+     * @param openId
+     * @return boolean
+     */
     @ApiOperation("公众号新订单处理通知")
     @RequestMapping(value = "/notification", method = RequestMethod.GET)
     public boolean newOrderNotification(String openId) {

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

@@ -129,13 +129,12 @@ public class TOrderController extends BaseController {
      * 取消订单
      *
      * @param order
-     * @return
+     * @return R
      */
     @Log(title = "取消订单", businessType = BusinessType.UPDATE)
     @ApiOperation("取消订单")
     @RequestMapping(value = "wx/cancle", method = RequestMethod.POST)
     public R cancle(@RequestBody TOrder order) {
-
         try {
             return R.ok(orderService.cancle(order));
         } catch (ServiceException s) {
@@ -146,7 +145,6 @@ public class TOrderController extends BaseController {
             log.error("系统出错,错误信息:" + e + " at " + stackTraceElement.getClassName() + "." + stackTraceElement.getMethodName() + ":" + stackTraceElement.getLineNumber());
             return R.fail("系统异常");
         }
-
     }
 
     /**
@@ -259,7 +257,7 @@ public class TOrderController extends BaseController {
      * 确认订单
      *
      * @param order
-     * @return
+     * @return R
      */
     @Log(title = "确认服务完成", businessType = BusinessType.UPDATE)
     @ApiOperation("确认服务完成")

+ 19 - 0
nightFragrance-common/src/main/java/com/ylx/common/config/WechatAccountConfig.java

@@ -53,5 +53,24 @@ public class WechatAccountConfig {
      */
     private String menu;
 
+    /**
+     * 订单未接单提醒消息模版ID
+     */
+    private String template1;
+
+     /**
+     * 接单成功通知消息模版ID
+     */
+    private String template2;
+
+     /**
+     * 订单完成通知消息模版
+     */
+    private String template3;
+
+     /**
+     * 取消订单通知消息模版ID
+     */
+    private String template4;
 
 }

+ 3 - 0
nightFragrance-massage/src/main/java/com/ylx/massage/domain/TComment.java

@@ -88,6 +88,9 @@ public class TComment implements Serializable {
     @ApiModelProperty("技师姓名")
     private String name;
 
+    /**
+     * 是否删除 0否1是
+     */
     @ApiModelProperty("是否删除0否1是")
     @TableLogic
     private Integer isDelete;

+ 3 - 2
nightFragrance-massage/src/main/java/com/ylx/massage/enums/JsStatusEnum.java

@@ -6,8 +6,9 @@ package com.ylx.massage.enums;
  * 技师状态枚举
  */
 public enum JsStatusEnum {
-
-    /*** 技师服务状态*/
+    /**
+     * 可服务
+     */
     JS_SERVICEABLE(0, "可服务"),
 
     /**

+ 1 - 1
nightFragrance-massage/src/main/java/com/ylx/massage/enums/OrderStatusEnum.java

@@ -37,7 +37,7 @@ public enum OrderStatusEnum {
     ARRIVED(2, "已到达"),
 
     /**
-     *
+     * 服务中
      */
     SERVICE(3, "服务中"),
 

+ 83 - 0
nightFragrance-massage/src/main/java/com/ylx/massage/service/OrderNotificationService.java

@@ -0,0 +1,83 @@
+package com.ylx.massage.service;
+
+import com.ylx.massage.domain.TOrder;
+
+/**
+ * 订单消息通知服务接口
+ * <p>
+ * 提供订单生命周期各阶段的消息通知功能,包括:
+ * 待接单提醒、已接单通知、完成通知、取消通知
+ * </p>
+ *
+ * @author ylx
+ * @version 1.0
+ * @since 2024
+ */
+public interface OrderNotificationService {
+
+    /**
+     * 订单已接单通知(用户侧)
+     * <p>
+     * 当技师接单后,向用户发送已接单确认消息。
+     * 包含订单号、项目名称、预约时间、用户电话、服务地址等信息。
+     * </p>
+     *
+     * @param order 订单信息
+     */
+    void sendReceivedNotification(TOrder order);
+
+    /**
+     * 订单完成通知(用户侧)
+     * <p>
+     * 当订单服务完成后,向用户发送订单完成通知。
+     * 包含订单号、项目名称、完成时间等信息。
+     * </p>
+     *
+     * @param order 订单信息
+     */
+    void sendCompletedNotification(TOrder order);
+
+    /**
+     * 订单取消通知(用户侧)
+     * <p>
+     * 当订单被取消后,向用户发送订单取消通知。
+     * 包含订单号、取消原因、项目名称等信息。
+     * </p>
+     *
+     * @param order 订单信息
+     */
+    void sendCancelledNotification(TOrder order);
+
+    /**
+     * 订单待接单提醒(技师侧)
+     * <p>
+     * 当订单支付成功后,向技师发送待接单提醒消息。
+     * 包含订单号、项目名称、预约时间、用户电话、服务地址等信息。
+     * </p>
+     *
+     * @param order 订单信息
+     */
+    void sendPendingRemindNotification(TOrder order);
+
+    /**
+     * 订单已接单通知(技师侧)
+     * <p>
+     * 当技师确认接单后,向技师发送接单成功的通知消息。
+     * 包含订单号、项目名称、用户姓名、联系电话、服务地址、下单时间等信息。
+     * </p>
+     *
+     * @param order 订单信息
+     */
+    void sendTechnicianReceivedNotification(TOrder order);
+
+    /**
+     * 订单取消通知(技师侧)
+     * <p>
+     * 当订单被用户取消后,向技师发送订单取消通知消息。
+     * 包含订单号、取消原因、项目名称等信息。
+     * </p>
+     *
+     * @param order 订单信息
+     */
+    void sendTechnicianCancelledNotification(TOrder order);
+}

+ 123 - 0
nightFragrance-massage/src/main/java/com/ylx/massage/service/TCommentUserAuditService.java

@@ -3,6 +3,11 @@ package com.ylx.massage.service;
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.ylx.massage.domain.CommentUserAudit;
 
+import java.io.Serializable;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
 /**
  * 用户评论审核服务接口
  * <p>
@@ -32,4 +37,122 @@ public interface TCommentUserAuditService extends IService<CommentUserAudit> {
      * @return 审核是否成功
      */
     Boolean auditComment(String commentId, Integer auditStatus, String auditReason, String auditorId, String auditorName);
+
+    /**
+     * 批量审核用户评论
+     * <p>
+     * 批量审核多条用户评论,支持统一通过或拒绝。
+     * 对每条评论进行独立的验证和处理,记录详细的审核结果。
+     * 返回审核结果统计,包括成功数量、失败数量和失败详情。
+     * </p>
+     *
+     * @param commentIds 评论ID列表,用于标识待审核的多条评论
+     * @param auditStatus 审核状态:1-通过,2-拒绝
+     * @param auditReason 审核原因/拒绝理由,审核拒绝时必填,审核通过时可为空
+     * @param auditorId 审核人ID,当前登录管理员的ID
+     * @param auditorName 审核人姓名,当前登录管理员的姓名
+     * @return 审核结果对象,包含成功数量、失败数量和失败详情
+     */
+    BatchAuditResult batchAuditComments(List<String> commentIds, Integer auditStatus,
+                                       String auditReason, String auditorId, String auditorName);
+
+    /**
+     * 批量审核结果
+     * <p>
+     * 封装批量审核操作的执行结果,包括成功和失败的统计信息。
+     * </p>
+     */
+    class BatchAuditResult implements Serializable {
+        private static final long serialVersionUID = 1L;
+
+        /**
+         * 成功审核的评论数量
+         */
+        private int successCount;
+
+        /**
+         * 审核失败的评论数量
+         */
+        private int failCount;
+
+        /**
+         * 失败详情
+         * Key: 评论ID
+         * Value: 失败原因
+         */
+        private Map<String, String> failDetails;
+
+        public BatchAuditResult() {
+            this.successCount = 0;
+            this.failCount = 0;
+            this.failDetails = new HashMap<>();
+        }
+
+        public int getSuccessCount() {
+            return successCount;
+        }
+
+        public void setSuccessCount(int successCount) {
+            this.successCount = successCount;
+        }
+
+        public int getFailCount() {
+            return failCount;
+        }
+
+        public void setFailCount(int failCount) {
+            this.failCount = failCount;
+        }
+
+        public java.util.Map<String, String> getFailDetails() {
+            return failDetails;
+        }
+
+        public void setFailDetails(java.util.Map<String, String> failDetails) {
+            this.failDetails = failDetails;
+        }
+
+        /**
+         * 增加成功计数
+         */
+        public void incrementSuccess() {
+            this.successCount++;
+        }
+
+        /**
+         * 增加失败计数
+         */
+        public void incrementFail() {
+            this.failCount++;
+        }
+
+        /**
+         * 添加失败详情
+         *
+         * @param commentId 评论ID
+         * @param reason 失败原因
+         */
+        public void addFailDetail(String commentId, String reason) {
+            this.failDetails.put(commentId, reason);
+            this.incrementFail();
+        }
+
+        /**
+         * 获取总数量
+         *
+         * @return 成功数量 + 失败数量
+         */
+        public int getTotalCount() {
+            return successCount + failCount;
+        }
+
+        /**
+         * 是否全部成功
+         *
+         * @return true-全部成功,false-存在失败
+         */
+        public boolean isAllSuccess() {
+            return failCount == 0;
+        }
+    }
 }

+ 361 - 0
nightFragrance-massage/src/main/java/com/ylx/massage/service/impl/OrderNotificationServiceImpl.java

@@ -0,0 +1,361 @@
+package com.ylx.massage.service.impl;
+
+import cn.hutool.json.JSONUtil;
+import com.alibaba.fastjson.JSONObject;
+import com.ylx.common.config.WechatAccountConfig;
+import com.ylx.massage.domain.TOrder;
+import com.ylx.massage.domain.TXiangmu;
+import com.ylx.massage.service.OrderNotificationService;
+import com.ylx.massage.service.TJsService;
+import com.ylx.massage.utils.DateTimeUtils;
+import com.ylx.massage.utils.WeChatUtil;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+import java.time.LocalDateTime;
+import java.time.ZoneId;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * 订单消息通知服务实现类
+ * <p>
+ * 负责处理订单生命周期中各阶段的消息通知功能。
+ * 所有通知通过微信公众号模板消息推送给用户。
+ * </p>
+ *
+ * @author ylx
+ * @version 1.0
+ * @since 2024
+ */
+@Service
+@Slf4j
+public class OrderNotificationServiceImpl implements OrderNotificationService {
+
+    @Resource
+    private WeChatUtil weChatUtil;
+
+    @Resource
+    private WechatAccountConfig wxPayProperties;
+
+    @Resource
+    private TJsService jsService;
+
+    /**
+     * 订单待接单提醒(用户侧)
+     * <p>
+     * 消息模板ID:template1
+     * 包含字段:订单号、项目名称、预约时间、用户电话、服务地址
+     * </p>
+     *
+     * @param order 订单信息
+     */
+    @Override
+    public void sendPendingRemindNotification(TOrder order) {
+        try {
+            cn.hutool.json.JSONObject param = buildPendingRemindParams(order);
+            weChatUtil.notification(order.getcOpenId(), wxPayProperties.getTemplate1(), param);
+            log.info("订单待接单提醒发送成功,订单号:{}", order.getOrderNo());
+        } catch (Exception e) {
+            log.error("订单待接单提醒发送失败,订单号:{}", order.getOrderNo(), e);
+        }
+    }
+
+    /**
+     * 订单已接单通知(用户侧)
+     * <p>
+     * 消息模板ID:template1
+     * 包含字段:订单号、项目名称、预约时间、用户电话、服务地址
+     * </p>
+     *
+     * @param order 订单信息
+     */
+    @Override
+    public void sendReceivedNotification(TOrder order) {
+        try {
+            cn.hutool.json.JSONObject param = buildReceivedNotificationParams(order);
+            weChatUtil.notification(order.getcOpenId(), wxPayProperties.getTemplate1(), param);
+            log.info("订单已接单通知发送成功,订单号:{}", order.getOrderNo());
+        } catch (Exception e) {
+            log.error("订单已接单通知发送失败,订单号:{}", order.getOrderNo(), e);
+        }
+    }
+
+    /**
+     * 订单完成通知(用户侧)
+     * <p>
+     * 消息模板ID:template1
+     * 包含字段:订单号、项目名称、完成时间
+     * </p>
+     *
+     * @param order 订单信息
+     */
+    @Override
+    public void sendCompletedNotification(TOrder order) {
+        try {
+            cn.hutool.json.JSONObject param = buildCompletedNotificationParams(order);
+            weChatUtil.notification(order.getcOpenId(), wxPayProperties.getTemplate1(), param);
+            log.info("订单完成通知发送成功,订单号:{}", order.getOrderNo());
+        } catch (Exception e) {
+            log.error("订单完成通知发送失败,订单号:{}", order.getOrderNo(), e);
+        }
+    }
+
+    /**
+     * 订单取消通知(用户侧)
+     * <p>
+     * 消息模板ID:template1
+     * 包含字段:订单号、取消原因、项目名称
+     * </p>
+     *
+     * @param order 订单信息
+     */
+    @Override
+    public void sendCancelledNotification(TOrder order) {
+        try {
+            cn.hutool.json.JSONObject param = buildCancelledNotificationParams(order);
+            weChatUtil.notification(order.getcOpenId(), wxPayProperties.getTemplate1(), param);
+            log.info("订单取消通知发送成功,订单号:{}", order.getOrderNo());
+        } catch (Exception e) {
+            log.error("订单取消通知发送失败,订单号:{}", order.getOrderNo(), e);
+        }
+    }
+
+    /**
+     * 构建待接单提醒消息参数
+     *
+     * @param order 订单信息
+     * @return 消息参数
+     */
+    private cn.hutool.json.JSONObject buildPendingRemindParams(TOrder order) {
+        cn.hutool.json.JSONObject param = JSONUtil.createObj();
+        // 订单号
+        param.set("character_string9", JSONUtil.createObj().set("value", order.getOrderNo()));
+        // 项目名称
+        String projectNames = getProjectNames(order);
+        param.set("thing10", JSONUtil.createObj().set("value", projectNames));
+        // 预约时间
+        LocalDateTime startTime = order.getStartTime();
+        Date date = Date.from(startTime.atZone(ZoneId.systemDefault()).toInstant());
+        param.set("time6", JSONUtil.createObj().set("value", DateTimeUtils.formatDate(date, "yyyy-MM-dd HH:mm")));
+        // 用户电话
+        param.set("phone_number3", JSONUtil.createObj().set("value", order.getcPhone()));
+        // 服务地址
+        param.set("thing13", JSONUtil.createObj().set("value", order.getAddress()));
+        return param;
+    }
+
+    /**
+     * 构建已接单通知消息参数
+     *
+     * @param order 订单信息
+     * @return 消息参数
+     */
+    private cn.hutool.json.JSONObject buildReceivedNotificationParams(TOrder order) {
+        cn.hutool.json.JSONObject param = JSONUtil.createObj();
+        // 订单号
+        param.set("character_string1", JSONUtil.createObj().set("value", order.getOrderNo()));
+        // 项目名称
+        String projectNames = getProjectNames(order);
+        param.set("thing4", JSONUtil.createObj().set("value", projectNames));
+        // 预约时间
+        LocalDateTime startTime = order.getStartTime();
+        Date date = Date.from(startTime.atZone(ZoneId.systemDefault()).toInstant());
+        param.set("time3", JSONUtil.createObj().set("value", DateTimeUtils.formatDate(date, "yyyy-MM-dd HH:mm")));
+        // 用户电话
+        param.set("phone_number5", JSONUtil.createObj().set("value", order.getcPhone()));
+        // 服务地址
+        param.set("thing14", JSONUtil.createObj().set("value", order.getAddress()));
+        return param;
+    }
+
+    /**
+     * 构建完成通知消息参数
+     *
+     * @param order 订单信息
+     * @return 消息参数
+     */
+    private cn.hutool.json.JSONObject buildCompletedNotificationParams(TOrder order) {
+        cn.hutool.json.JSONObject param = JSONUtil.createObj();
+        // 订单号
+        param.set("character_string8", JSONUtil.createObj().set("value", order.getOrderNo()));
+        // 项目名称
+        String projectNames = getProjectNames(order);
+        param.set("thing19", JSONUtil.createObj().set("value", projectNames));
+        // 完成时间
+        LocalDateTime completeTime = order.getEndTime();
+        Date date = Date.from(completeTime.atZone(ZoneId.systemDefault()).toInstant());
+        param.set("time18", JSONUtil.createObj().set("value", DateTimeUtils.formatDate(date, "yyyy-MM-dd HH:mm")));
+        return param;
+    }
+
+    /**
+     * 构建取消通知消息参数
+     *
+     * @param order 订单信息
+     * @return 消息参数
+     */
+    private cn.hutool.json.JSONObject buildCancelledNotificationParams(TOrder order) {
+        cn.hutool.json.JSONObject param = JSONUtil.createObj();
+        // 订单号
+        param.set("character_string2", JSONUtil.createObj().set("value", order.getOrderNo()));
+        // 取消原因
+        param.set("thing5", JSONUtil.createObj().set("value", "用户个人原因"));
+        // 项目名称
+        String projectNames = getProjectNames(order);
+        param.set("thing25", JSONUtil.createObj().set("value", projectNames));
+        return param;
+    }
+
+    /**
+     * 从订单中提取项目名称
+     * <p>
+     * 解析订单的商品列表,将多个项目名称用逗号连接
+     * </p>
+     *
+     * @param order 订单信息
+     * @return 项目名称字符串,多个项目用逗号分隔
+     */
+    private String getProjectNames(TOrder order) {
+        List<TXiangmu> list = JSONObject.parseArray(order.getcGoods().toJSONString(), TXiangmu.class);
+        StringBuilder sb = new StringBuilder();
+        for (TXiangmu xiangmu : list) {
+            sb.append(xiangmu.getcTitle()).append(",");
+        }
+        // 移除最后一个逗号
+        if (sb.length() > 0) {
+            sb.setLength(sb.length() - 1);
+        }
+        return sb.toString();
+    }
+
+    /**
+     * 订单已接单通知(技师侧)
+     * <p>
+     * 消息模板ID:templateId1
+     * 包含字段:订单号、用户姓名、联系电话、服务地址、下单时间、项目名称
+     * </p>
+     *
+     * @param order 订单信息
+     */
+    @Override
+    public void sendTechnicianReceivedNotification(TOrder order) {
+        try {
+            // 获取技师信息
+            String jsOpenId = getTechnicianOpenId(order);
+            if (jsOpenId == null) {
+                log.warn("技师信息不存在,无法发送已接单通知,订单号:{}", order.getOrderNo());
+                return;
+            }
+
+            cn.hutool.json.JSONObject param = buildTechnicianReceivedNotificationParams(order);
+            weChatUtil.notification(jsOpenId, wxPayProperties.getTemplateId1(), param);
+            log.info("技师侧已接单通知发送成功,订单号:{}", order.getOrderNo());
+        } catch (Exception e) {
+            log.error("技师侧已接单通知发送失败,订单号:{}", order.getOrderNo(), e);
+        }
+    }
+
+    /**
+     * 订单取消通知(技师侧)
+     * <p>
+     * 消息模板ID:templateId1
+     * 包含字段:订单号、取消原因、项目名称
+     * </p>
+     *
+     * @param order 订单信息
+     */
+    @Override
+    public void sendTechnicianCancelledNotification(TOrder order) {
+        try {
+            // 获取技师信息
+            String jsOpenId = getTechnicianOpenId(order);
+            if (jsOpenId == null) {
+                log.warn("技师信息不存在,无法发送取消通知,订单号:{}", order.getOrderNo());
+                return;
+            }
+
+            cn.hutool.json.JSONObject param = buildTechnicianCancelledNotificationParams(order);
+            weChatUtil.notification(jsOpenId, wxPayProperties.getTemplateId1(), param);
+            log.info("技师侧取消订单通知发送成功,订单号:{}", order.getOrderNo());
+        } catch (Exception e) {
+            log.error("技师侧取消订单通知发送失败,订单号:{}", order.getOrderNo(), e);
+        }
+    }
+
+    /**
+     * 构建技师侧已接单通知消息参数
+     * <p>
+     * 参考原有的 newOrderNotification 方法实现
+     * </p>
+     *
+     * @param order 订单信息
+     * @return 消息参数
+     */
+    private cn.hutool.json.JSONObject buildTechnicianReceivedNotificationParams(TOrder order) {
+        cn.hutool.json.JSONObject param = JSONUtil.createObj();
+        // 订单号
+        param.set("character_string9", JSONUtil.createObj().set("value", order.getOrderNo()));
+        // 用户电话
+        param.set("phone_number14", JSONUtil.createObj().set("value", order.getcPhone()));
+        // 用户姓名
+        param.set("thing18", JSONUtil.createObj().set("value", order.getcName()));
+        // 下单时间
+        param.set("time6", JSONUtil.createObj().set("value", DateTimeUtils.formatDate(new Date(), DateTimeUtils.DATE_NUMBER_YEAR_MONTH_FORMAT)));
+        // 服务地址
+        param.set("thing27", JSONUtil.createObj().set("value", order.getName()));
+        return param;
+    }
+
+    /**
+     * 构建技师侧取消通知消息参数
+     *
+     * @param order 订单信息
+     * @return 消息参数
+     */
+    private cn.hutool.json.JSONObject buildTechnicianCancelledNotificationParams(TOrder order) {
+        cn.hutool.json.JSONObject param = JSONUtil.createObj();
+        // 订单号
+        param.set("character_string2", JSONUtil.createObj().set("value", order.getOrderNo()));
+        // 取消原因
+        param.set("thing5", JSONUtil.createObj().set("value", getCancelReason(order)));
+        // 项目名称
+        String projectNames = getProjectNames(order);
+        param.set("thing25", JSONUtil.createObj().set("value", projectNames));
+        return param;
+    }
+
+    /**
+     * 获取技师的 OpenId
+     *
+     * @param order 订单信息
+     * @return 技师 OpenId,如果技师不存在则返回 null
+     */
+    private String getTechnicianOpenId(TOrder order) {
+        if (order.getcJsId() == null) {
+            return null;
+        }
+        try {
+            return jsService.getById(order.getcJsId()).getcOpenId();
+        } catch (Exception e) {
+            log.error("获取技师信息失败,技师ID:{}", order.getcJsId(), e);
+            return null;
+        }
+    }
+
+    /**
+     * 获取订单取消原因
+     *
+     * @param order 订单信息
+     * @return 取消原因描述
+     */
+    private String getCancelReason(TOrder order) {
+        // 如果订单中有具体的取消原因,使用订单中的原因
+        if (order.getReasonRefusal() != null && !order.getReasonRefusal().trim().isEmpty()) {
+            return order.getReasonRefusal();
+        }
+        // 默认取消原因
+        return "用户取消订单";
+    }
+}

+ 94 - 0
nightFragrance-massage/src/main/java/com/ylx/massage/service/impl/TCommentUserAuditServiceImpl.java

@@ -14,6 +14,7 @@ import org.springframework.transaction.annotation.Transactional;
 
 import javax.annotation.Resource;
 import java.util.Date;
+import java.util.List;
 
 /**
  * 用户评论审核服务实现类
@@ -97,4 +98,97 @@ public class TCommentUserAuditServiceImpl extends ServiceImpl<TCommentUserAuditM
         }
         return true;
     }
+
+    /**
+     * 批量审核用户评论
+     * <p>
+     * 批量审核多条用户评论,支持统一通过或拒绝。
+     * 对每条评论进行独立的验证和处理,记录详细的审核结果。
+     * 返回审核结果统计,包括成功数量、失败数量和失败详情。
+     * </p>
+     *
+     * @param commentIds 评论ID列表,用于标识待审核的多条评论
+     * @param auditStatus 审核状态:1-通过,2-拒绝
+     * @param auditReason 审核原因/拒绝理由,审核拒绝时必填,审核通过时可为空
+     * @param auditorId 审核人ID,当前登录管理员的ID
+     * @param auditorName 审核人姓名,当前登录管理员的姓名
+     * @return 审核结果对象,包含成功数量、失败数量和失败详情
+     */
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public BatchAuditResult batchAuditComments(List<String> commentIds, Integer auditStatus, String auditReason, String auditorId, String auditorName) {
+        // 创建批量审核结果对象
+        BatchAuditResult result = new BatchAuditResult();
+
+        // 基础参数校验
+        if (commentIds == null || commentIds.isEmpty()) {
+            throw new ServiceException("评论ID列表不能为空");
+        }
+        if (auditStatus == null || (auditStatus != 1 && auditStatus != 2)) {
+            throw new ServiceException("审核状态无效,必须为1(通过)或2(拒绝)");
+        }
+        if (auditStatus == 2 && StringUtils.isBlank(auditReason)) {
+            throw new ServiceException("审核拒绝时必须填写拒绝理由");
+        }
+        if (StringUtils.isBlank(auditorId) || StringUtils.isBlank(auditorName)) {
+            throw new ServiceException("审核人信息不能为空");
+        }
+
+        // 记录当前审核时间
+        Date auditTime = new Date();
+
+        // 遍历评论ID列表,逐个进行审核
+        for (String commentId : commentIds) {
+            try {
+                // 参数校验:跳过空白的评论ID
+                if (StringUtils.isBlank(commentId)) {
+                    result.addFailDetail(commentId, "评论ID为空");
+                    continue;
+                }
+
+                // 查询评论是否存在
+                TCommentUser commentUser = tCommentUserService.getById(commentId);
+                if (commentUser == null) {
+                    result.addFailDetail(commentId, "评论不存在");
+                    continue;
+                }
+
+                // 查询审核记录是否存在
+                LambdaQueryWrapper<CommentUserAudit> queryWrapper = new LambdaQueryWrapper<>();
+                queryWrapper.eq(CommentUserAudit::getCommentId, commentId);
+                CommentUserAudit auditRecord = this.getOne(queryWrapper);
+
+                if (auditRecord == null) {
+                    result.addFailDetail(commentId, "审核记录不存在");
+                    continue;
+                }
+
+                // 检查是否已审核
+                if (auditRecord.getAuditStatus() != 0) {
+                    result.addFailDetail(commentId, "该评论已审核,请勿重复操作");
+                    continue;
+                }
+
+                // 更新审核记录
+                auditRecord.setAuditStatus(auditStatus);
+                auditRecord.setAuditReason(auditReason);
+                auditRecord.setAuditorId(auditorId);
+                auditRecord.setAuditorName(auditorName);
+                auditRecord.setAuditTime(auditTime);
+                auditRecord.setUpdateTime(new Date());
+
+                boolean updateResult = this.updateById(auditRecord);
+                if (updateResult) {
+                    result.incrementSuccess();
+                } else {
+                    result.addFailDetail(commentId, "审核记录更新失败");
+                }
+
+            } catch (Exception e) {
+                // 捕获单个评论审核的异常,继续处理其他评论
+                result.addFailDetail(commentId, "审核失败:" + e.getMessage());
+            }
+        }
+        return result;
+    }
 }

+ 2 - 2
nightFragrance-massage/src/main/java/com/ylx/massage/service/impl/TCommentUserServiceImpl.java

@@ -63,8 +63,8 @@ public class TCommentUserServiceImpl extends ServiceImpl<TCommentUserMapper, TCo
         if(StringUtils.isBlank(comment.getName())){
             throw new ServiceException("技师姓名不能空");
         }
-        //comment.setOpenId(wxLoginUser.getCOpenid());
-        comment.setOpenId("o-HEJ6RAjBDjFvuZcAdHRX8mIZXw");
+        comment.setOpenId(wxLoginUser.getCOpenid());
+        //comment.setOpenId("o-HEJ6RAjBDjFvuZcAdHRX8mIZXw");
         comment.setCommentTime(new Date());
         this.save(comment);
 

+ 19 - 4
nightFragrance-massage/src/main/java/com/ylx/massage/service/impl/TJsServiceImpl.java

@@ -5,6 +5,7 @@ import cn.hutool.core.collection.CollectionUtil;
 
 import cn.hutool.json.JSONException;
 import cn.hutool.json.JSONUtil;
+import com.alibaba.fastjson2.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
@@ -195,16 +196,30 @@ public class TJsServiceImpl extends ServiceImpl<TJsMapper, TJs> implements TJsSe
 //        时间 2022年11月11日22:22
 //        服务地址 湖南长沙岳麓
 
-
-        cn.hutool.json.JSONObject param = JSONUtil.createObj();
+        /*cn.hutool.json.JSONObject param = JSONUtil.createObj();
         //订单号
         param.set("character_string9", JSONUtil.createObj().set("value", "23010000010101"));
         //点话
         param.set("phone_number14", JSONUtil.createObj().set("value", "18360233903"));
         param.set("thing18", JSONUtil.createObj().set("value", "李四"));
         param.set("time6", JSONUtil.createObj().set("value", "2022年11月11日 22:22"));
-        param.set("thing27", JSONUtil.createObj().set("value", "湖南长沙岳麓"));
-//        weChatUtil.notification(openId, param);
+        param.set("thing27", JSONUtil.createObj().set("value", "湖南长沙岳麓"));*/
+
+        cn.hutool.json.JSONObject param = JSONUtil.createObj();
+        /**
+         * 订单未接单提醒
+         */
+        //设置订单号
+        param.set("character_string9", JSONUtil.createObj().set("value", "123456"));
+        //设置项目
+        param.set("thing10", JSONUtil.createObj().set("value", "按摩"));
+        //设置预约时间
+        param.set("time6", JSONUtil.createObj().set("value", "2022年11月11日 22:22"));
+        //设置用户电话
+        param.set("phone_number3", JSONUtil.createObj().set("value", "18360233903"));
+        //设置下单地址
+        param.set("thing13", JSONUtil.createObj().set("value", "信达国际"));
+        weChatUtil.notification(openId, wxPayProperties.getTemplate1(), param);
 
     }
 

+ 37 - 9
nightFragrance-massage/src/main/java/com/ylx/massage/service/impl/TOrderServiceImpl.java

@@ -5,7 +5,6 @@ import cn.hutool.json.JSONUtil;
 import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
-import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
 import com.baomidou.mybatisplus.core.toolkit.StringUtils;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
@@ -92,6 +91,9 @@ public class TOrderServiceImpl extends ServiceImpl<TOrderMapper, TOrder> impleme
     @Resource
     private OrderValidationService orderValidationService;
 
+    @Resource
+    private OrderNotificationService orderNotificationService;
+
     /**
      * 判断是否免车费
      * 时间段判断:
@@ -231,6 +233,7 @@ public class TOrderServiceImpl extends ServiceImpl<TOrderMapper, TOrder> impleme
             log.error("订单 {} 未支付状态不存在", outTradeNo);
             return;
         }
+        // 设置微信支付
         orderNew.setPayType(1);
         TWxUser user = wxUserService.getByOpenId(orderNew.getcOpenId());
         orderPayManage(user, orderNew);
@@ -432,7 +435,6 @@ public class TOrderServiceImpl extends ServiceImpl<TOrderMapper, TOrder> impleme
             return resp;
         }
 
-        // 从对应账户扣款
         TWxUser user = wxUserService.getByOpenId(orderNew.getcOpenId());
         if (null == user) {
             throw new ServiceException("用户不存在");
@@ -452,8 +454,13 @@ public class TOrderServiceImpl extends ServiceImpl<TOrderMapper, TOrder> impleme
     }
 
 
-    public void newOrderNotification(TOrder order) {
 
+    /**
+     * 新订单通知
+     *
+     * @param order
+     */
+    public void newOrderNotification(TOrder order) {
         cn.hutool.json.JSONObject param = JSONUtil.createObj();
         //订单号
         param.set("character_string9", JSONUtil.createObj().set("value", order.getOrderNo()));
@@ -467,6 +474,12 @@ public class TOrderServiceImpl extends ServiceImpl<TOrderMapper, TOrder> impleme
 
     }
 
+    /**
+     * 订单支付管理
+     *
+     * @param user
+     * @param orderNew
+     */
     @Transactional(rollbackFor = Exception.class)
     public void orderPayManage(TWxUser user, TOrder orderNew) {
         //更新优惠卷状态
@@ -482,6 +495,7 @@ public class TOrderServiceImpl extends ServiceImpl<TOrderMapper, TOrder> impleme
         // 更新用户金额 及下单此时
         TWxUser paramUser = new TWxUser();
         paramUser.setcOpenid(user.getcOpenid());
+        // 余额支付
         if (orderNew.getPayType().equals(MassageConstants.INTEGER_TWO)) {
             paramUser.setdBalance(user.getdBalance().subtract(orderNew.getTotalPrice()));
         }
@@ -529,6 +543,7 @@ public class TOrderServiceImpl extends ServiceImpl<TOrderMapper, TOrder> impleme
         //更新及技师状态
         updateJs(orderNew);
         updateById(orderParam);
+        //
         this.newOrderNotification(orderNew);
         //电话通知
         TJs js = jsService.getById(orderNew.getcJsId());
@@ -614,7 +629,7 @@ public class TOrderServiceImpl extends ServiceImpl<TOrderMapper, TOrder> impleme
      * 确认服务完成
      *
      * @param order
-     * @return
+     * @return Boolean
      */
     @Override
     @Transactional(rollbackFor = Exception.class)
@@ -634,6 +649,7 @@ public class TOrderServiceImpl extends ServiceImpl<TOrderMapper, TOrder> impleme
                 .ge(TOrder::getDtCreateTime, DateTimeUtils.addDays(new Date(), -3))
                 .ge(TOrder::getnStatus, OrderStatusEnum.WAIT_EVALUATE.getCode()));
         if (list.size() >= 2) {
+            // 设置热度标识:1
             jsParam.setnB3(MassageConstants.INTEGER_ONE);
         }
         // 更新技师状态
@@ -677,9 +693,14 @@ public class TOrderServiceImpl extends ServiceImpl<TOrderMapper, TOrder> impleme
             }
         }
         // 更新订单
+        // 订单状态:待评价
         orderNew.setnStatus(OrderStatusEnum.WAIT_EVALUATE.getCode());
         orderNew.setEndTime(LocalDateTime.now());
-        return updateById(orderNew);
+        updateById(orderNew);
+
+        // 添加订单完成消息通知
+        orderNotificationService.sendCompletedNotification(orderNew);
+        return true;
     }
 
     private void extracted(TOrder orderNew, TWxUser jsUp) {
@@ -708,7 +729,7 @@ public class TOrderServiceImpl extends ServiceImpl<TOrderMapper, TOrder> impleme
      * 取消订单
      *
      * @param order
-     * @return
+     * @return Boolean
      */
     @Override
     @Transactional(rollbackFor = Exception.class)
@@ -728,6 +749,7 @@ public class TOrderServiceImpl extends ServiceImpl<TOrderMapper, TOrder> impleme
             tConsumptionLog.setAmount(orderNew.getTotalPrice());
             tConsumptionLog.setBillNo(orderNew.getOrderNo());
             tConsumptionLog.setOpenId(orderNew.getcOpenId());
+            // 余额支付
             if (orderNew.getPayType() == 2) {
                 // 金额归还对应账户
                 paramUser.setdBalance(user.getdBalance().add(orderNew.getTotalPrice()));
@@ -783,12 +805,14 @@ public class TOrderServiceImpl extends ServiceImpl<TOrderMapper, TOrder> impleme
             TOrder orderParam = new TOrder();
             orderParam.setcId(orderNew.getcId());
             orderParam.setnStatus(OrderStatusEnum.CANCEL.getCode());
-            return updateById(orderParam);
+            updateById(orderParam);
+            // 添加取消订单通知
+            orderNotificationService.sendCancelledNotification(orderNew);
+            return true;
         } else {
             return false;
         }
 
-
     }
 
     @Override
@@ -841,7 +865,7 @@ public class TOrderServiceImpl extends ServiceImpl<TOrderMapper, TOrder> impleme
             throw new IllegalArgumentException("订单对象不能为空");
         }
 
-        TOrder orderNew = this.getById(order);
+        TOrder orderNew = this.getById(order.getcId());
 
         // 【新增】订单状态锁校验 - 检查技师是否可以接单
         log.info("开始校验技师 {} 是否可以接单,订单号:{}", orderNew.getcJsId(), orderNew.getOrderNo());
@@ -853,9 +877,13 @@ public class TOrderServiceImpl extends ServiceImpl<TOrderMapper, TOrder> impleme
         // 更新订单状态
         TOrder orderParam = new TOrder();
         orderParam.setcId(order.getcId());
+        //设置订单状态:已接单
         orderParam.setnStatus(OrderStatusEnum.RECEIVED_ORDER.getCode());
         orderParam.setAcceptanceTime(LocalDateTime.now());
         this.updateById(orderParam);
+
+        // 已接单消息通知
+        orderNotificationService.sendReceivedNotification(orderNew);
     }
 
     private void updateJs(TOrder orderNew) {

+ 7 - 12
nightFragrance-massage/src/main/java/com/ylx/massage/utils/WeChatUtil.java

@@ -54,8 +54,6 @@ public class WeChatUtil {
     private RedisCache redisCache;
 
 
-
-
     /**
      * 获取微信授权code
      *
@@ -141,7 +139,7 @@ public class WeChatUtil {
     public String getFollowers(String beginDate, String endDate) {
         String token = this.getToken();
 
-        String urlStr  = "https://api.weixin.qq.com/datacube/getusersummary?access_token="+token;
+        String urlStr = "https://api.weixin.qq.com/datacube/getusersummary?access_token=" + token;
         cn.hutool.json.JSONObject param1 = JSONUtil.createObj();
         param1.set("begin_date", beginDate);
         param1.set("end_date", endDate);
@@ -282,8 +280,7 @@ public class WeChatUtil {
      * 生成公众号码技师 ticket
      *
      * @param token access_token
-     * @param jsId 技师id
-     *
+     * @param jsId  技师id
      * @return 返回包含微信公众号码ticket的Map
      */
     public Map<?, ?> getJsTicket(String token, String jsId) {
@@ -298,9 +295,6 @@ public class WeChatUtil {
     }
 
 
-
-
-
     /**
      * 生成公众号码ticket
      *
@@ -323,11 +317,12 @@ public class WeChatUtil {
     /**
      * 公众号消息通知
      *
-     * @param token access_token
-     * @return 返回包含微信公众号码ticket的Map
+     * @param openid     用户的openid
+     * @param templateId 模板id
+     * @param data       消息数据
+     * @return Map<?, ?> 返回包含微信公众号码ticket的Map
      */
-    public Map<?, ?> notification(String openid, String templateId,cn.hutool.json.JSONObject data) {
-
+    public Map<?, ?> notification(String openid, String templateId, cn.hutool.json.JSONObject data) {
         String token = this.getToken();
         log.info("notification-access_token:{}", token);
 

+ 48 - 0
nightFragrance-system/src/main/java/com/ylx/system/domain/vo/BatchAuditCommentsDto.java

@@ -0,0 +1,48 @@
+package com.ylx.system.domain.vo;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotNull;
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ * 批量审核用户评论 DTO
+ * <p>
+ * 用于批量审核用户评论的数据传输对象,支持一次性审核多条评论。
+ * </p>
+ *
+ * @author ylx
+ * @version 1.0
+ * @since 2025-01-09
+ */
+@Data
+@ApiModel(value = "批量审核用户评论DTO", description = "批量审核用户评论请求参数")
+public class BatchAuditCommentsDto implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 待审核的评论ID列表
+     */
+    @ApiModelProperty(value = "评论ID列表", required = true, example = "[\"1701234567890\", \"1701234567891\"]")
+    @NotNull(message = "评论ID列表不能为空")
+    private List<@NotBlank(message = "评论ID不能为空") String> commentIds;
+
+    /**
+     * 审核状态:1-通过,2-拒绝
+     */
+    @ApiModelProperty(value = "审核状态:1-通过,2-拒绝", required = true, example = "1")
+    @NotNull(message = "审核状态不能为空")
+    private Integer auditStatus;
+
+    /**
+     * 审核原因/拒绝理由
+     * 当审核状态为拒绝(2)时,此字段必填
+     */
+    @ApiModelProperty(value = "审核原因/拒绝理由(审核拒绝时必填)", example = "评论内容包含违规信息")
+    private String auditReason;
+}

+ 22 - 0
nightFragrance-system/src/main/java/com/ylx/system/domain/vo/ReviewUserCommentsDto.java

@@ -0,0 +1,22 @@
+package com.ylx.system.domain.vo;
+import lombok.Data;
+import java.io.Serializable;
+@Data
+public class ReviewUserCommentsDto implements Serializable {
+
+    /**
+     * 评论ID
+     */
+    private String commentId;
+
+    /**
+     * 审核状态
+     */
+    private Integer auditStatus;
+
+    /**
+     * 审核原因/拒绝理由
+     */
+    private String auditReason;
+
+}