Sfoglia il codice sorgente

新增律师订单统计逻辑

zhangchen 1 settimana fa
parent
commit
6ac1fdffe0

+ 59 - 0
alien-entity/src/main/java/shop/alien/entity/store/vo/LawyerOrderStatisticsVO.java

@@ -0,0 +1,59 @@
+package shop.alien.entity.store.vo;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+
+/**
+ * 律师订单统计数据VO
+ *
+ * @author system
+ * @since 2025-01-XX
+ */
+@Data
+@ApiModel(value = "LawyerOrderStatisticsVO对象", description = "律师订单统计数据VO")
+public class LawyerOrderStatisticsVO implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty(value = "本月订单量")
+    private Integer monthOrderCount;
+
+    @ApiModelProperty(value = "本月收益(元)")
+    private BigDecimal monthRevenue;
+
+    @ApiModelProperty(value = "总订单量")
+    private Integer totalOrderCount;
+
+    @ApiModelProperty(value = "总收益(元)")
+    private BigDecimal totalRevenue;
+
+    @ApiModelProperty(value = "进行中订单统计")
+    private OrderStatusStatistics inProgressOrder;
+
+    @ApiModelProperty(value = "待接单订单统计")
+    private OrderStatusStatistics pendingAcceptOrder;
+
+    @ApiModelProperty(value = "已退款订单统计")
+    private OrderStatusStatistics refundedOrder;
+
+    /**
+     * 订单状态统计内部类
+     */
+    @Data
+    @ApiModel(value = "OrderStatusStatistics对象", description = "订单状态统计数据")
+    public static class OrderStatusStatistics implements Serializable {
+
+        private static final long serialVersionUID = 1L;
+
+        @ApiModelProperty(value = "订单总数")
+        private Integer orderCount;
+
+        @ApiModelProperty(value = "金额合计(元)")
+        private BigDecimal totalAmount;
+    }
+}
+

+ 82 - 0
alien-entity/src/main/java/shop/alien/mapper/LawyerConsultationOrderMapper.java

@@ -514,5 +514,87 @@ public interface LawyerConsultationOrderMapper extends BaseMapper<LawyerConsulta
             @Param("clientUserId") Integer clientUserId,
             @Param("lawyerUserId") Integer lawyerUserId);
 
+    /**
+     * 统计本月订单量和本月收益
+     *
+     * @param lawyerUserId 律师用户ID
+     * @param startTime    本月开始时间
+     * @param endTime      本月结束时间
+     * @return 统计数据Map,包含monthOrderCount和monthRevenue(单位:分)
+     */
+    @Select("SELECT " +
+            "COUNT(*) as monthOrderCount, " +
+            "COALESCE(SUM(order_amount), 0) as monthRevenue " +
+            "FROM lawyer_consultation_order " +
+            "WHERE lawyer_user_id = #{lawyerUserId} " +
+            "AND delete_flag = 0 " +
+            "AND order_status = 3 " +
+            "AND created_time >= #{startTime} " +
+            "AND created_time < #{endTime}")
+    Map<String, Object> getMonthStatistics(
+            @Param("lawyerUserId") Integer lawyerUserId,
+            @Param("startTime") String startTime,
+            @Param("endTime") String endTime);
+
+    /**
+     * 统计总订单量和总收益
+     *
+     * @param lawyerUserId 律师用户ID
+     * @return 统计数据Map,包含totalOrderCount和totalRevenue(单位:分)
+     */
+    @Select("SELECT " +
+            "COUNT(*) as totalOrderCount, " +
+            "COALESCE(SUM(order_amount), 0) as totalRevenue " +
+            "FROM lawyer_consultation_order " +
+            "WHERE lawyer_user_id = #{lawyerUserId} " +
+            "AND order_status = 3 " +
+            "AND delete_flag = 0")
+    Map<String, Object> getTotalStatistics(@Param("lawyerUserId") Integer lawyerUserId);
+
+    /**
+     * 统计进行中订单(订单状态=2)
+     *
+     * @param lawyerUserId 律师用户ID
+     * @return 统计数据Map,包含orderCount和totalAmount(单位:分)
+     */
+    @Select("SELECT " +
+            "COUNT(*) as orderCount, " +
+            "COALESCE(SUM(order_amount), 0) as totalAmount " +
+            "FROM lawyer_consultation_order " +
+            "WHERE lawyer_user_id = #{lawyerUserId} " +
+            "AND delete_flag = 0 " +
+            "AND order_status = 2")
+    Map<String, Object> getInProgressStatistics(@Param("lawyerUserId") Integer lawyerUserId);
+
+    /**
+     * 统计待接单订单(订单状态=1)
+     *
+     * @param lawyerUserId 律师用户ID
+     * @return 统计数据Map,包含orderCount和totalAmount(单位:分)
+     */
+    @Select("SELECT " +
+            "COUNT(*) as orderCount, " +
+            "COALESCE(SUM(order_amount), 0) as totalAmount " +
+            "FROM lawyer_consultation_order " +
+            "WHERE lawyer_user_id = #{lawyerUserId} " +
+            "AND delete_flag = 0 " +
+            "AND order_status = 1")
+    Map<String, Object> getPendingAcceptStatistics(@Param("lawyerUserId") Integer lawyerUserId);
+
+    /**
+     * 统计已退款订单(申请退款状态=3)
+     *
+     * @param lawyerUserId 律师用户ID
+     * @return 统计数据Map,包含orderCount和totalAmount(单位:分)
+     */
+    @Select("SELECT " +
+            "COUNT(*) as orderCount, " +
+            "COALESCE(SUM(order_amount), 0) as totalAmount " +
+            "FROM lawyer_consultation_order " +
+            "WHERE lawyer_user_id = #{lawyerUserId} " +
+            "AND delete_flag = 0 " +
+            "AND order_status = 5")
+    Map<String, Object> getRefundedStatistics(@Param("lawyerUserId") Integer lawyerUserId);
+
 }
 

+ 43 - 0
alien-lawyer/src/main/java/shop/alien/lawyer/controller/LawyerStatisticsController.java

@@ -0,0 +1,43 @@
+package shop.alien.lawyer.controller;
+
+import io.swagger.annotations.*;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.web.bind.annotation.*;
+import shop.alien.entity.result.R;
+import shop.alien.entity.store.vo.LawyerOrderStatisticsVO;
+import shop.alien.lawyer.service.LawyerStatisticsService;
+
+/**
+ * 律师统计 前端控制器
+ *
+ * @author system
+ * @since 2025-01-XX
+ */
+@Slf4j
+@Api(tags = {"律师平台-统计管理"})
+@ApiSort(15)
+@CrossOrigin
+@RestController
+@RequestMapping("/lawyer/statistics")
+@RequiredArgsConstructor
+public class LawyerStatisticsController {
+
+    private final LawyerStatisticsService lawyerStatisticsService;
+
+    @ApiOperation("获取律师订单统计数据")
+    @ApiOperationSupport(order = 1)
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "lawyerUserId", value = "律师用户ID", dataType = "Integer", paramType = "query", required = true)
+    })
+    @GetMapping("/getOrderStatistics")
+    public R<LawyerOrderStatisticsVO> getOrderStatistics(@RequestParam(value = "lawyerUserId", required = true) Integer lawyerUserId) {
+        log.info("LawyerStatisticsController.getOrderStatistics?lawyerUserId={}", lawyerUserId);
+        if (lawyerUserId == null || lawyerUserId <= 0) {
+            log.warn("获取律师订单统计数据失败:律师用户ID为空或无效");
+            return R.fail("律师用户ID不能为空");
+        }
+        return lawyerStatisticsService.getOrderStatistics(lawyerUserId);
+    }
+}
+

+ 22 - 0
alien-lawyer/src/main/java/shop/alien/lawyer/service/LawyerStatisticsService.java

@@ -0,0 +1,22 @@
+package shop.alien.lawyer.service;
+
+import shop.alien.entity.result.R;
+import shop.alien.entity.store.vo.LawyerOrderStatisticsVO;
+
+/**
+ * 律师统计 服务类
+ *
+ * @author system
+ * @since 2025-01-XX
+ */
+public interface LawyerStatisticsService {
+
+    /**
+     * 获取律师订单统计数据
+     *
+     * @param lawyerUserId 律师用户ID
+     * @return 订单统计数据
+     */
+    R<LawyerOrderStatisticsVO> getOrderStatistics(Integer lawyerUserId);
+}
+

+ 190 - 0
alien-lawyer/src/main/java/shop/alien/lawyer/service/impl/LawyerStatisticsServiceImpl.java

@@ -0,0 +1,190 @@
+package shop.alien.lawyer.service.impl;
+
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+import shop.alien.entity.result.R;
+import shop.alien.entity.store.vo.LawyerOrderStatisticsVO;
+import shop.alien.lawyer.service.LawyerStatisticsService;
+import shop.alien.mapper.LawyerConsultationOrderMapper;
+
+import java.math.BigDecimal;
+import java.math.RoundingMode;
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+import java.time.format.DateTimeFormatter;
+import java.time.temporal.TemporalAdjusters;
+import java.util.Map;
+
+/**
+ * 律师统计 服务实现类
+ *
+ * @author system
+ * @since 2025-01-XX
+ */
+@Slf4j
+@Service
+@RequiredArgsConstructor
+public class LawyerStatisticsServiceImpl implements LawyerStatisticsService {
+
+    private final LawyerConsultationOrderMapper lawyerConsultationOrderMapper;
+
+    /**
+     * 金额单位转换:分转元
+     */
+    private static final int FEN_TO_YUAN = 100;
+
+    @Override
+    public R<LawyerOrderStatisticsVO> getOrderStatistics(Integer lawyerUserId) {
+        log.info("LawyerStatisticsServiceImpl.getOrderStatistics?lawyerUserId={}", lawyerUserId);
+
+        if (lawyerUserId == null || lawyerUserId <= 0) {
+            log.warn("获取律师订单统计数据失败:律师用户ID为空或无效");
+            return R.fail("律师用户ID不能为空");
+        }
+
+        try {
+            LawyerOrderStatisticsVO statistics = new LawyerOrderStatisticsVO();
+
+            // 获取本月开始和结束时间
+            LocalDate now = LocalDate.now();
+            LocalDate firstDayOfMonth = now.with(TemporalAdjusters.firstDayOfMonth());
+            LocalDate firstDayOfNextMonth = now.with(TemporalAdjusters.firstDayOfNextMonth());
+            LocalDateTime startDateTime = firstDayOfMonth.atStartOfDay();
+            LocalDateTime endDateTime = firstDayOfNextMonth.atStartOfDay();
+            DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
+            String startTime = startDateTime.format(formatter);
+            String endTime = endDateTime.format(formatter);
+
+            // 统计本月订单量和本月收益
+            Map<String, Object> monthStats = lawyerConsultationOrderMapper.getMonthStatistics(
+                    lawyerUserId, startTime, endTime);
+            if (monthStats != null) {
+                statistics.setMonthOrderCount(getIntegerValue(monthStats.get("monthOrderCount")));
+                Long monthRevenueFen = getLongValue(monthStats.get("monthRevenue"));
+                statistics.setMonthRevenue(convertFenToYuan(monthRevenueFen));
+            } else {
+                statistics.setMonthOrderCount(0);
+                statistics.setMonthRevenue(BigDecimal.ZERO);
+            }
+
+            // 统计总订单量和总收益
+            Map<String, Object> totalStats = lawyerConsultationOrderMapper.getTotalStatistics(lawyerUserId);
+            if (totalStats != null) {
+                statistics.setTotalOrderCount(getIntegerValue(totalStats.get("totalOrderCount")));
+                Long totalRevenueFen = getLongValue(totalStats.get("totalRevenue"));
+                statistics.setTotalRevenue(convertFenToYuan(totalRevenueFen));
+            } else {
+                statistics.setTotalOrderCount(0);
+                statistics.setTotalRevenue(BigDecimal.ZERO);
+            }
+
+            // 统计进行中订单
+            Map<String, Object> inProgressStats = lawyerConsultationOrderMapper.getInProgressStatistics(lawyerUserId);
+            LawyerOrderStatisticsVO.OrderStatusStatistics inProgressOrder = new LawyerOrderStatisticsVO.OrderStatusStatistics();
+            if (inProgressStats != null) {
+                inProgressOrder.setOrderCount(getIntegerValue(inProgressStats.get("orderCount")));
+                Long inProgressAmountFen = getLongValue(inProgressStats.get("totalAmount"));
+                inProgressOrder.setTotalAmount(convertFenToYuan(inProgressAmountFen));
+            } else {
+                inProgressOrder.setOrderCount(0);
+                inProgressOrder.setTotalAmount(BigDecimal.ZERO);
+            }
+            statistics.setInProgressOrder(inProgressOrder);
+
+            // 统计待接单订单
+            Map<String, Object> pendingAcceptStats = lawyerConsultationOrderMapper.getPendingAcceptStatistics(lawyerUserId);
+            LawyerOrderStatisticsVO.OrderStatusStatistics pendingAcceptOrder = new LawyerOrderStatisticsVO.OrderStatusStatistics();
+            if (pendingAcceptStats != null) {
+                pendingAcceptOrder.setOrderCount(getIntegerValue(pendingAcceptStats.get("orderCount")));
+                Long pendingAcceptAmountFen = getLongValue(pendingAcceptStats.get("totalAmount"));
+                pendingAcceptOrder.setTotalAmount(convertFenToYuan(pendingAcceptAmountFen));
+            } else {
+                pendingAcceptOrder.setOrderCount(0);
+                pendingAcceptOrder.setTotalAmount(BigDecimal.ZERO);
+            }
+            statistics.setPendingAcceptOrder(pendingAcceptOrder);
+
+            // 统计已退款订单
+            Map<String, Object> refundedStats = lawyerConsultationOrderMapper.getRefundedStatistics(lawyerUserId);
+            LawyerOrderStatisticsVO.OrderStatusStatistics refundedOrder = new LawyerOrderStatisticsVO.OrderStatusStatistics();
+            if (refundedStats != null) {
+                refundedOrder.setOrderCount(getIntegerValue(refundedStats.get("orderCount")));
+                Long refundedAmountFen = getLongValue(refundedStats.get("totalAmount"));
+                refundedOrder.setTotalAmount(convertFenToYuan(refundedAmountFen));
+            } else {
+                refundedOrder.setOrderCount(0);
+                refundedOrder.setTotalAmount(BigDecimal.ZERO);
+            }
+            statistics.setRefundedOrder(refundedOrder);
+
+            log.info("获取律师订单统计数据成功,律师ID={}, 本月订单量={}, 本月收益={}, 总订单量={}, 总收益={}",
+                    lawyerUserId, statistics.getMonthOrderCount(), statistics.getMonthRevenue(),
+                    statistics.getTotalOrderCount(), statistics.getTotalRevenue());
+
+            return R.data(statistics);
+        } catch (Exception e) {
+            log.error("获取律师订单统计数据异常,律师ID={}", lawyerUserId, e);
+            return R.fail("获取统计数据失败:" + e.getMessage());
+        }
+    }
+
+    /**
+     * 将分转换为元(保留2位小数)
+     *
+     * @param fen 分
+     * @return 元
+     */
+    private BigDecimal convertFenToYuan(Long fen) {
+        if (fen == null || fen == 0) {
+            return BigDecimal.ZERO;
+        }
+        return BigDecimal.valueOf(fen)
+                .divide(BigDecimal.valueOf(FEN_TO_YUAN), 2, RoundingMode.HALF_UP);
+    }
+
+    /**
+     * 从Map中获取Integer值
+     *
+     * @param value 对象值
+     * @return Integer值
+     */
+    private Integer getIntegerValue(Object value) {
+        if (value == null) {
+            return 0;
+        }
+        if (value instanceof Integer) {
+            return (Integer) value;
+        }
+        if (value instanceof Long) {
+            return ((Long) value).intValue();
+        }
+        if (value instanceof Number) {
+            return ((Number) value).intValue();
+        }
+        return 0;
+    }
+
+    /**
+     * 从Map中获取Long值
+     *
+     * @param value 对象值
+     * @return Long值
+     */
+    private Long getLongValue(Object value) {
+        if (value == null) {
+            return 0L;
+        }
+        if (value instanceof Long) {
+            return (Long) value;
+        }
+        if (value instanceof Integer) {
+            return ((Integer) value).longValue();
+        }
+        if (value instanceof Number) {
+            return ((Number) value).longValue();
+        }
+        return 0L;
+    }
+}
+