Преглед на файлове

Merge remote-tracking branch 'origin/dev' into dev

qxy преди 3 седмици
родител
ревизия
4c28518a87

+ 3 - 0
alien-entity/src/main/java/shop/alien/entity/store/dto/OrderReviewDto.java

@@ -42,5 +42,8 @@ public class OrderReviewDto {
 
     @ApiModelProperty(value = "是否匿名评价,0:否,1:是")
     private Integer isAnonymous;
+
+    @ApiModelProperty(value = "用户id")
+    private Integer userId;
 }
 

+ 3 - 0
alien-entity/src/main/java/shop/alien/entity/store/dto/ReviewCommentDto.java

@@ -19,5 +19,8 @@ public class ReviewCommentDto {
 
     @ApiModelProperty(value = "评论内容")
     private String commentContent;
+
+    @ApiModelProperty(value = "用户id")
+    private Integer userId;
 }
 

+ 1 - 1
alien-lawyer/src/main/java/shop/alien/lawyer/controller/LawyerClientConsultationOrderController.java

@@ -78,7 +78,7 @@ public class LawyerClientConsultationOrderController {
             @ApiImplicitParam(name = "startDate", value = "开始时间", dataType = "String", paramType = "query"),
             @ApiImplicitParam(name = "endDate", value = "结束时间", dataType = "String", paramType = "query"),
             @ApiImplicitParam(name = "clientUserName", value = "用户姓名", dataType = "String", paramType = "query"),
-            @ApiImplicitParam(name = "orderStatus", value = "订单状态(2 进行中,3 已完成)", dataType = "String", paramType = "query"),
+            @ApiImplicitParam(name = "orderStatus", value = "订单状态, 0:待支付,1.待接单 2:进行中, 3:已完成, 4:已取消,5.已退款", dataType = "String", paramType = "query"),
             @ApiImplicitParam(name = "lawyerId", value = "律师ID", dataType = "String", paramType = "query", required = true)
     })
     @GetMapping("/getLawyerConsultationOrderInfo")

+ 5 - 3
alien-lawyer/src/main/java/shop/alien/lawyer/controller/LawyerUserViolationController.java

@@ -145,9 +145,11 @@ public class LawyerUserViolationController {
             @RequestParam(defaultValue = "10") int pageSize,
             @RequestParam(required = false) String orderId,
             @RequestParam(required = false) String processingStatus,
-            @RequestParam(required = false) String reportingUserName) {
-        log.info("LawyerUserViolationController.getViolationPage?pageNum={},pageSize={},orderId={},processingStatus={},reportingUserName={}", pageNum, pageSize, orderId, processingStatus, reportingUserName);
-        return R.data(lawyerUserViolationService.getViolationPage(pageNum, pageSize, orderId, processingStatus, reportingUserName));
+            @RequestParam(required = false) String reportedUserName,
+            @RequestParam(required = false) String violationReason
+    ) {
+        log.info("LawyerUserViolationController.getViolationPage?pageNum={},pageSize={},orderId={},processingStatus={},reportedUserName={},violationReason={}", pageNum, pageSize, orderId, processingStatus, reportedUserName, violationReason);
+        return R.data(lawyerUserViolationService.getViolationPage(pageNum, pageSize, orderId, processingStatus, reportedUserName, violationReason));
     }
 
     @ApiOperation(value = "举报审核")

+ 16 - 14
alien-lawyer/src/main/java/shop/alien/lawyer/controller/OrderReviewController.java

@@ -34,13 +34,12 @@ public class OrderReviewController {
     @ApiOperation("创建订单评价(只有订单用户才能评价)")
     @ApiOperationSupport(order = 1)
     @PostMapping("/create")
-    public R<OrderReview> createReview(@RequestBody OrderReviewDto reviewDto,
-                                        @TokenInfo UserLoginInfo userLoginInfo) {
-        log.info("OrderReviewController.createReview?reviewDto={}, userLoginInfo={}", reviewDto, userLoginInfo);
-        if (userLoginInfo == null) {
+    public R<OrderReview> createReview(@RequestBody OrderReviewDto reviewDto) {
+        log.info("OrderReviewController.createReview?reviewDto={}, ", reviewDto);
+        if (reviewDto.getUserId() == null) {
             return R.fail("用户未登录");
         }
-        return orderReviewService.createReview(reviewDto, userLoginInfo.getUserId());
+        return orderReviewService.createReview(reviewDto);
     }
 
     @ApiOperation("分页查询评价列表")
@@ -75,22 +74,25 @@ public class OrderReviewController {
 
     @ApiOperation("删除评价(删除评价时,会级联删除该评价下的所有评论和回复)")
     @ApiOperationSupport(order = 4)
-    @ApiImplicitParam(name = "reviewId", value = "评价ID", dataType = "int", paramType = "path", required = true)
-    @DeleteMapping("/delete/{reviewId}")
-    public R<Boolean> deleteReview(@PathVariable Integer reviewId,
-                                    @TokenInfo UserLoginInfo userLoginInfo) {
-        log.info("OrderReviewController.deleteReview?reviewId={}, userLoginInfo={}", reviewId, userLoginInfo);
-        if (userLoginInfo == null) {
+    @ApiImplicitParams({
+    @ApiImplicitParam(name = "reviewId", value = "评价ID", dataType = "int", paramType = "path", required = true),
+    @ApiImplicitParam(name = "userId", value = "用户ID", dataType = "int", paramType = "path", required = true)
+             })
+    @DeleteMapping("/delete/reviewId")
+    public R<Boolean> deleteReview(Integer reviewId,
+                                   Integer userId) {
+        log.info("OrderReviewController.deleteReview?reviewId={}, userId={}", reviewId, userId);
+        if (userId == null) {
             return R.fail("用户未登录");
         }
-        return orderReviewService.deleteReview(reviewId, userLoginInfo.getUserId());
+        return orderReviewService.deleteReview(reviewId, userId);
     }
 
     @ApiOperation("根据订单ID查询评价")
     @ApiOperationSupport(order = 5)
     @ApiImplicitParam(name = "orderId", value = "订单ID", dataType = "int", paramType = "path", required = true)
-    @GetMapping("/order/{orderId}")
-    public R<OrderReviewVo> getReviewByOrderId(@PathVariable Integer orderId) {
+    @GetMapping("/order/orderId")
+    public R<OrderReviewVo> getReviewByOrderId( Integer orderId) {
         log.info("OrderReviewController.getReviewByOrderId?orderId={}", orderId);
         return orderReviewService.getReviewByOrderId(orderId);
     }

+ 4 - 5
alien-lawyer/src/main/java/shop/alien/lawyer/controller/ReviewCommentController.java

@@ -34,13 +34,12 @@ public class ReviewCommentController {
     @ApiOperation("创建评论(其他用户对评价的评论)")
     @ApiOperationSupport(order = 1)
     @PostMapping("/create")
-    public R<ReviewComment> createComment(@RequestBody ReviewCommentDto commentDto,
-                                          @TokenInfo UserLoginInfo userLoginInfo) {
-        log.info("ReviewCommentController.createComment?commentDto={}, userLoginInfo={}", commentDto, userLoginInfo);
-        if (userLoginInfo == null) {
+    public R<ReviewComment> createComment(@RequestBody ReviewCommentDto commentDto) {
+        log.info("ReviewCommentController.createComment?commentDto={}", commentDto);
+        if (commentDto.getUserId() == null) {
             return R.fail("用户未登录");
         }
-        return reviewCommentService.createComment(commentDto, userLoginInfo.getUserId());
+        return reviewCommentService.createComment(commentDto);
     }
 
     @ApiOperation("根据评价ID查询评论列表")

+ 1 - 1
alien-lawyer/src/main/java/shop/alien/lawyer/service/LawyerUserViolationService.java

@@ -46,7 +46,7 @@ public interface LawyerUserViolationService extends IService<LawyerUserViolation
      */
     LawyerUserViolationVo reportListById(String id);
 
-    IPage<LawyerUserViolationDto> getViolationPage(int page, int size, String orderId, String processingStatus, String reportingUserName);
+    IPage<LawyerUserViolationDto> getViolationPage(int page, int size, String orderId, String processingStatus, String reportedUserName, String violationReason);
 
     void approve(int id, String processingStatus, String reportResult);
 

+ 2 - 2
alien-lawyer/src/main/java/shop/alien/lawyer/service/OrderReviewService.java

@@ -20,10 +20,10 @@ public interface OrderReviewService extends IService<OrderReview> {
      * 创建订单评价(只有订单用户才能评价)
      *
      * @param reviewDto 评价DTO
-     * @param userId 用户ID
+     *
      * @return R<OrderReview>
      */
-    R<OrderReview> createReview(OrderReviewDto reviewDto, Integer userId);
+    R<OrderReview> createReview(OrderReviewDto reviewDto);
 
     /**
      * 分页查询评价列表

+ 2 - 2
alien-lawyer/src/main/java/shop/alien/lawyer/service/ReviewCommentService.java

@@ -20,10 +20,10 @@ public interface ReviewCommentService extends IService<ReviewComment> {
      * 创建评论(其他用户对评价的评论)
      *
      * @param commentDto 评论DTO
-     * @param userId 用户ID
+     *
      * @return R<ReviewComment>
      */
-    R<ReviewComment> createComment(ReviewCommentDto commentDto, Integer userId);
+    R<ReviewComment> createComment(ReviewCommentDto commentDto);
 
     /**
      * 根据评价ID查询评论列表

+ 6 - 3
alien-lawyer/src/main/java/shop/alien/lawyer/service/impl/LawyerClientConsultationOrderServiceImpl.java

@@ -421,17 +421,20 @@ public class LawyerClientConsultationOrderServiceImpl extends ServiceImpl<Lawyer
         Integer inProgressStatus = LawyerStatusEnum.INPROGRESS.getStatus();
         Integer completeStatus = LawyerStatusEnum.COMPLETE.getStatus();
         Integer refundedStatus = LawyerStatusEnum.REFUNDED.getStatus();
+        Integer cancelStatus = LawyerStatusEnum.CANCEL.getStatus();
 
         int waitAcceptCount = statusCountMap.getOrDefault(waitAcceptStatus, 0);
         int inProgressCount = statusCountMap.getOrDefault(inProgressStatus, 0);
         int completeCount = statusCountMap.getOrDefault(completeStatus, 0);
         int refundedCount = statusCountMap.getOrDefault(refundedStatus, 0);
+        int cancelCount = statusCountMap.getOrDefault(cancelStatus, 0);
 
         statistics.put("waitAcceptCount", waitAcceptCount);
         statistics.put("inProgressCount", inProgressCount);
         statistics.put("completeCount", completeCount);
         statistics.put("refundedCount", refundedCount);
-        statistics.put("totalCount", waitAcceptCount + inProgressCount + completeCount + refundedCount);
+        statistics.put("cancelCount", cancelCount);
+        statistics.put("totalCount", waitAcceptCount + inProgressCount + completeCount + refundedCount + cancelCount);
 
         return statistics;
     }
@@ -482,9 +485,9 @@ public class LawyerClientConsultationOrderServiceImpl extends ServiceImpl<Lawyer
         } else {
             // 默认查询非待支付和已取消的订单
             Integer waitPayStatus = LawyerStatusEnum.WAIT_PAY.getStatus();
-            Integer cancelStatus = LawyerStatusEnum.CANCEL.getStatus();
+            //Integer cancelStatus = LawyerStatusEnum.CANCEL.getStatus();
             queryWrapper.notIn("lco.order_status",
-                    Arrays.asList(String.valueOf(cancelStatus), String.valueOf(waitPayStatus)));
+                    Arrays.asList( String.valueOf(waitPayStatus)));
         }
 
         // 律师ID条件

+ 172 - 31
alien-lawyer/src/main/java/shop/alien/lawyer/service/impl/LawyerUserViolationServiceImpl.java

@@ -87,6 +87,21 @@ public class LawyerUserViolationServiceImpl extends ServiceImpl<LawyerUserViolat
      */
     private static final String REPORT_CONTEXT_TYPE_ORDER = "6";
 
+    /**
+     * 删除标志:未删除
+     */
+    private static final Integer DELETE_FLAG_NOT_DELETED = 0;
+
+    /**
+     * 图片分隔符
+     */
+    private static final String IMAGE_SEPARATOR = ",";
+
+    /**
+     * 最大分页大小
+     */
+    private static final int MAX_PAGE_SIZE = 100;
+
     private final LawyerUserViolationMapper lawyerUserViolationMapper;
 
     private final LawyerUserMapper lawyerUserMapper;
@@ -735,52 +750,178 @@ public class LawyerUserViolationServiceImpl extends ServiceImpl<LawyerUserViolat
         }
     }
 
+    /**
+     * 分页查询违规举报信息
+     * <p>
+     * 根据查询条件分页查询律师用户违规举报信息,支持按订单号、处理状态、
+     * 被举报人名称、违规原因等条件进行筛选查询
+     * </p>
+     *
+     * @param page            当前页码,从1开始,必须大于0
+     * @param size            每页大小,必须大于0且不超过最大值
+     * @param orderId         订单号,支持模糊查询,可为空
+     * @param processingStatus 处理状态,精确匹配,可为空
+     * @param reportedUserName 被举报人名称,支持模糊查询,可为空
+     * @param violationReason 违规原因,精确匹配,可为空
+     * @return 分页查询结果,包含违规举报DTO列表
+     * @throws RuntimeException 当分页参数无效时抛出
+     * @author system
+     * @since 2025-01-XX
+     */
     @Override
-    public IPage<LawyerUserViolationDto> getViolationPage(int page, int size, String orderId, String processingStatus, String reportingUserName) {
-        IPage<LawyerUserViolationVo> pageRequest = new Page<>(page, size);
+    public IPage<LawyerUserViolationDto> getViolationPage(int page, int size, String orderId,
+                                                           String processingStatus, String reportedUserName,
+                                                           String violationReason) {
+        // 参数校验
+        validatePageParams(page, size);
+
+        try {
+            // 构建分页对象
+            IPage<LawyerUserViolationVo> pageRequest = new Page<>(page, size);
+
+            // 构建查询条件
+            QueryWrapper<LawyerUserViolationVo> queryWrapper = buildQueryWrapper(orderId,
+                    processingStatus, reportedUserName, violationReason);
+
+            // 执行分页查询
+            IPage<LawyerUserViolationVo> resultPage = lawyerUserViolationMapper.getViolationPage(pageRequest,
+                    queryWrapper);
+
+            // 转换为DTO并处理数据
+            return convertToDtoPage(resultPage);
+
+        } catch (Exception e) {
+            log.error("分页查询违规举报信息异常,页码:{},每页大小:{},异常信息:{}", page, size, e.getMessage(), e);
+            throw new RuntimeException("分页查询违规举报信息失败:" + e.getMessage(), e);
+        }
+    }
+
+    /**
+     * 校验分页参数
+     *
+     * @param page 当前页码
+     * @param size 每页大小
+     * @throws RuntimeException 当参数无效时抛出
+     */
+    private void validatePageParams(int page, int size) {
+        if (page < 1) {
+            log.warn("分页查询参数无效,页码:{}", page);
+            throw new RuntimeException("页码必须大于0");
+        }
+        if (size < 1) {
+            log.warn("分页查询参数无效,每页大小:{}", size);
+            throw new RuntimeException("每页大小必须大于0");
+        }
+        if (size > MAX_PAGE_SIZE) {
+            log.warn("分页查询参数无效,每页大小超过最大值:{}", size);
+            throw new RuntimeException("每页大小不能超过" + MAX_PAGE_SIZE);
+        }
+    }
+
+    /**
+     * 构建查询条件
+     *
+     * @param orderId          订单号
+     * @param processingStatus 处理状态
+     * @param reportedUserName 被举报人名称
+     * @param violationReason  违规原因
+     * @return 查询条件包装器
+     */
+    private QueryWrapper<LawyerUserViolationVo> buildQueryWrapper(String orderId, String processingStatus,
+                                                                   String reportedUserName, String violationReason) {
         QueryWrapper<LawyerUserViolationVo> queryWrapper = new QueryWrapper<>();
 
-        // 基础查询条件
-        queryWrapper.eq("luv.delete_flag", 0)
-                .eq("luv.report_context_type", 6);
+        // 基础查询条件:未删除且为订单举报
+        queryWrapper.eq("luv.delete_flag", DELETE_FLAG_NOT_DELETED)
+                .eq("luv.report_context_type", REPORT_CONTEXT_TYPE_ORDER);
+
+        // 动态查询条件:订单号模糊查询
+        if (StringUtils.isNotEmpty(orderId)) {
+            queryWrapper.like("luv.order_id", orderId);
+        }
 
-        // 动态查询条件
-        queryWrapper.like(StringUtils.isNotEmpty(orderId), "luv.order_id", orderId);
+        // 动态查询条件:处理状态精确匹配
         if (StringUtils.isNotEmpty(processingStatus)) {
             queryWrapper.eq("luv.processing_status", processingStatus);
         }
-        // 举报人名称模糊查询
-        if (StringUtils.isNotEmpty(reportingUserName)) {
-            queryWrapper.like("ui.nick_name", reportingUserName);
+
+        // 动态查询条件:被举报人名称模糊查询
+        if (StringUtils.isNotEmpty(reportedUserName)) {
+            queryWrapper.like("ui_reported.nick_name", reportedUserName);
+        }
+
+        // 动态查询条件:违规原因精确匹配
+        if (StringUtils.isNotEmpty(violationReason)) {
+            queryWrapper.eq("luv.violation_reason", violationReason);
         }
 
+        // 排序:按更新时间倒序
         queryWrapper.orderByDesc("luv.updated_time");
 
-        IPage<LawyerUserViolationVo> resultPage = lawyerUserViolationMapper.getViolationPage(pageRequest, queryWrapper);
+        return queryWrapper;
+    }
 
-        return resultPage.convert(e -> {
-            LawyerUserViolationDto dto = new LawyerUserViolationDto();
-            BeanUtils.copyProperties(e, dto);
+    /**
+     * 将VO分页结果转换为DTO分页结果
+     *
+     * @param voPage VO分页结果
+     * @return DTO分页结果
+     */
+    private IPage<LawyerUserViolationDto> convertToDtoPage(IPage<LawyerUserViolationVo> voPage) {
+        return voPage.convert(this::convertToDto);
+    }
 
-            // 处理举报凭证图片
-            if (Objects.nonNull(e.getReportEvidenceImg())) {
-                List<String> imageList = Arrays.stream(e.getReportEvidenceImg().split(","))
-                        .map(String::trim)
-                        .filter(StringUtils::isNotEmpty)
-                        .collect(Collectors.toList());
+    /**
+     * 将VO对象转换为DTO对象
+     *
+     * @param vo VO对象
+     * @return DTO对象
+     */
+    private LawyerUserViolationDto convertToDto(LawyerUserViolationVo vo) {
+        LawyerUserViolationDto dto = new LawyerUserViolationDto();
+        BeanUtils.copyProperties(vo, dto);
 
-                if (!imageList.isEmpty()) {
-                    dto.setImage(imageList.get(0));
-                    dto.setImageList(imageList);
-                }
-            }
+        // 处理举报凭证图片
+        processReportEvidenceImages(vo, dto);
 
-            // 设置举报人和被举报人名称
-            dto.setNickname(e.getNickName());
-            dto.setReportUserName(e.getReportUserName());
-            dto.setReportedUserName(e.getReportedUserName());
-            return dto;
-        });
+        // 设置用户名称信息
+        setUserNames(vo, dto);
+
+        return dto;
+    }
+
+    /**
+     * 处理举报凭证图片
+     *
+     * @param vo  VO对象
+     * @param dto DTO对象
+     */
+    private void processReportEvidenceImages(LawyerUserViolationVo vo, LawyerUserViolationDto dto) {
+        if (Objects.isNull(vo.getReportEvidenceImg())) {
+            return;
+        }
+
+        List<String> imageList = Arrays.stream(vo.getReportEvidenceImg().split(IMAGE_SEPARATOR))
+                .map(String::trim)
+                .filter(StringUtils::isNotEmpty)
+                .collect(Collectors.toList());
+
+        if (!imageList.isEmpty()) {
+            dto.setImage(imageList.get(0));
+            dto.setImageList(imageList);
+        }
+    }
+
+    /**
+     * 设置用户名称信息
+     *
+     * @param vo  VO对象
+     * @param dto DTO对象
+     */
+    private void setUserNames(LawyerUserViolationVo vo, LawyerUserViolationDto dto) {
+        dto.setNickname(vo.getNickName());
+        dto.setReportUserName(vo.getReportUserName());
+        dto.setReportedUserName(vo.getReportedUserName());
     }
 
     /**

+ 9 - 3
alien-lawyer/src/main/java/shop/alien/lawyer/service/impl/OrderReviewServiceImpl.java

@@ -42,8 +42,9 @@ public class OrderReviewServiceImpl extends ServiceImpl<OrderReviewMapper, Order
     private final CommentReplyMapper commentReplyMapper;
 
     @Override
-    public R<OrderReview> createReview(OrderReviewDto reviewDto, Integer userId) {
-        log.info("OrderReviewServiceImpl.createReview?reviewDto={}, userId={}", reviewDto, userId);
+    public R<OrderReview> createReview(OrderReviewDto reviewDto) {
+        log.info("OrderReviewServiceImpl.createReview?reviewDto={}", reviewDto);
+
 
         // 参数校验
         if (reviewDto == null) {
@@ -52,6 +53,7 @@ public class OrderReviewServiceImpl extends ServiceImpl<OrderReviewMapper, Order
         if (reviewDto.getOrderId() == null) {
             return R.fail("订单ID不能为空");
         }
+        Integer userId = reviewDto.getUserId();
         if (userId == null) {
             return R.fail("用户ID不能为空");
         }
@@ -92,8 +94,12 @@ public class OrderReviewServiceImpl extends ServiceImpl<OrderReviewMapper, Order
         review.setReviewContent(reviewDto.getReviewContent());
         
         // 处理评价图片
+//        if (reviewDto.getReviewImages() != null && !reviewDto.getReviewImages().isEmpty()) {
+//            review.setReviewImages(JSON.toJSONString(reviewDto.getReviewImages()));
+//        }
+
         if (reviewDto.getReviewImages() != null && !reviewDto.getReviewImages().isEmpty()) {
-            review.setReviewImages(JSON.toJSONString(reviewDto.getReviewImages()));
+            review.setReviewImages(String.join(",", reviewDto.getReviewImages()));
         }
         
         review.setIsAnonymous(reviewDto.getIsAnonymous() != null ? reviewDto.getIsAnonymous() : 0);

+ 3 - 2
alien-lawyer/src/main/java/shop/alien/lawyer/service/impl/ReviewCommentServiceImpl.java

@@ -42,8 +42,8 @@ public class ReviewCommentServiceImpl extends ServiceImpl<ReviewCommentMapper, R
     }
 
     @Override
-    public R<ReviewComment> createComment(ReviewCommentDto commentDto, Integer userId) {
-        log.info("ReviewCommentServiceImpl.createComment?commentDto={}, userId={}", commentDto, userId);
+    public R<ReviewComment> createComment(ReviewCommentDto commentDto) {
+        log.info("ReviewCommentServiceImpl.createComment?commentDto={}", commentDto);
 
         // 参数校验
         if (commentDto == null) {
@@ -55,6 +55,7 @@ public class ReviewCommentServiceImpl extends ServiceImpl<ReviewCommentMapper, R
         if (commentDto.getCommentContent() == null || commentDto.getCommentContent().trim().isEmpty()) {
             return R.fail("评论内容不能为空");
         }
+        Integer userId=commentDto.getUserId() ;
         if (userId == null) {
             return R.fail("用户ID不能为空");
         }