Bladeren bron

律师端开发

ldz 4 weken geleden
bovenliggende
commit
d580c0fa95

+ 46 - 0
alien-entity/src/main/java/shop/alien/entity/store/vo/OrderRevenueVO.java

@@ -0,0 +1,46 @@
+package shop.alien.entity.store.vo;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * 订单收益统计VO
+ *
+ * @author system
+ * @since 2025-01-XX
+ */
+@Data
+@ApiModel(value = "OrderRevenueVO对象", description = "订单收益统计")
+public class OrderRevenueVO implements Serializable {
+
+    @ApiModelProperty(value = "全部收益-订单总数")
+    private Long allOrderCount;
+
+    @ApiModelProperty(value = "全部收益-收益合计(单位:分)")
+    private Long allRevenue;
+
+    @ApiModelProperty(value = "全部收益-收益合计(单位:分,格式化显示)")
+    private Long allRevenueStr;
+
+    @ApiModelProperty(value = "进行中-订单总数")
+    private Long inProgressOrderCount;
+
+    @ApiModelProperty(value = "进行中-收益合计(单位:分)")
+    private Long inProgressRevenue;
+
+    @ApiModelProperty(value = "进行中-收益合计(单位:分,格式化显示)")
+    private Long inProgressRevenueStr;
+
+    @ApiModelProperty(value = "已完成-订单总数")
+    private Long completedOrderCount;
+
+    @ApiModelProperty(value = "已完成-收益合计(单位:分)")
+    private Long completedRevenue;
+
+    @ApiModelProperty(value = "已完成-收益合计(单位:分,格式化显示)")
+    private Long completedRevenueStr;
+}
+

+ 70 - 0
alien-entity/src/main/java/shop/alien/mapper/LawyerUserMapper.java

@@ -2,6 +2,7 @@ package shop.alien.mapper;
 
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Update;
 import shop.alien.entity.store.LawyerUser;
 
 /**
@@ -15,5 +16,74 @@ import shop.alien.entity.store.LawyerUser;
 @Mapper
 public interface LawyerUserMapper extends BaseMapper<LawyerUser> {
 
+
+@Update("<script>" +
+        "UPDATE lawyer_user " +
+        "<set>" +
+        "<if test='firmId != null'>firm_id = #{firmId},</if>" +
+        "<if test='phone != null'>phone = #{phone},</if>" +
+        "<if test='name != null'>name = #{name},</if>" +
+        "<if test='idCard != null'>id_card = #{idCard},</if>" +
+        "<if test='password != null'>password = #{password},</if>" +
+        "<if test='payPassword != null'>pay_password = #{payPassword},</if>" +
+        "<if test='money != null'>money = #{money},</if>" +
+        "<if test='status != null'>status = #{status},</if>" +
+        "<if test='passType != null'>pass_type = #{passType},</if>" +
+        "<if test='deleteFlag != null'>delete_flag = #{deleteFlag},</if>" +
+        "<if test='createdTime != null'>created_time = #{createdTime},</if>" +
+        "<if test='createdUserId != null'>created_user_id = #{createdUserId},</if>" +
+        "<if test='updatedTime != null'>updated_time = #{updatedTime},</if>" +
+        "<if test='updatedUserId != null'>updated_user_id = #{updatedUserId},</if>" +
+        "<if test='logoutFlag != null'>logout_flag = #{logoutFlag},</if>" +
+        "<if test='logoutReason != null'>logout_reason = #{logoutReason},</if>" +
+        "<if test='logoutTime != null'>logout_time = #{logoutTime},</if>" +
+        "<if test='logoutCode != null'>logout_code = #{logoutCode},</if>" +
+        "<if test='nickName != null'>nick_name = #{nickName},</if>" +
+        "<if test='accountBlurb != null'>account_blurb = #{accountBlurb},</if>" +
+        "<if test='headImg != null'>head_img = #{headImg},</if>" +
+        "<if test='alipayAccount != null'>alipay_account = #{alipayAccount},</if>" +
+        "<if test='lawyerCertificateNo != null'>lawyer_certificate_no = #{lawyerCertificateNo},</if>" +
+        "<if test='lawFirm != null'>law_firm = #{lawFirm},</if>" +
+        "<if test='practiceYears != null'>practice_years = #{practiceYears},</if>" +
+        "<if test='practiceStartDate != null'>practice_start_date = #{practiceStartDate},</if>" +
+        "<if test='specialtyFields != null'>specialty_fields = #{specialtyFields},</if>" +
+        "<if test='certificationStatus != null'>certification_status = #{certificationStatus},</if>" +
+        "<if test='certificationFailReason != null'>certification_fail_reason = #{certificationFailReason},</if>" +
+        "<if test='certificationTime != null'>certification_time = #{certificationTime},</if>" +
+        "<if test='certificationReviewerId != null'>certification_reviewer_id = #{certificationReviewerId},</if>" +
+        "<if test='certificateImage != null'>certificate_image = #{certificateImage},</if>" +
+        "<if test='idCardFrontImage != null'>id_card_front_image = #{idCardFrontImage},</if>" +
+        "<if test='idCardBackImage != null'>id_card_back_image = #{idCardBackImage},</if>" +
+        "<if test='serviceScore != null'>service_score = #{serviceScore},</if>" +
+        "<if test='serviceCount != null'>service_count = #{serviceCount},</if>" +
+        "<if test='goodReviewCount != null'>good_review_count = #{goodReviewCount},</if>" +
+        "<if test='mediumReviewCount != null'>medium_review_count = #{mediumReviewCount},</if>" +
+        "<if test='badReviewCount != null'>bad_review_count = #{badReviewCount},</if>" +
+        "<if test='consultationFee != null'>consultation_fee = #{consultationFee},</if>" +
+        "<if test='agencyFee != null'>agency_fee = #{agencyFee},</if>" +
+        "<if test='province != null'>province = #{province},</if>" +
+        "<if test='city != null'>city = #{city},</if>" +
+        "<if test='district != null'>district = #{district},</if>" +
+        "<if test='address != null'>address = #{address},</if>" +
+        "<if test='email != null'>email = #{email},</if>" +
+        "<if test='gender != null'>gender = #{gender},</if>" +
+        "<if test='birthday != null'>birthday = #{birthday},</if>" +
+        "<if test='personalIntroduction != null'>personal_introduction = #{personalIntroduction},</if>" +
+        "<if test='educationBackground != null'>education_background = #{educationBackground},</if>" +
+        "<if test='workExperience != null'>work_experience = #{workExperience},</if>" +
+        "<if test='expertiseCases != null'>expertise_cases = #{expertiseCases},</if>" +
+        "<if test='isOnline != null'>is_online = #{isOnline},</if>" +
+        "<if test='lastOnlineTime != null'>last_online_time = #{lastOnlineTime},</if>" +
+        "<if test='isRecommended != null'>is_recommended = #{isRecommended},</if>" +
+        "<if test='recommendSort != null'>recommend_sort = #{recommendSort},</if>" +
+        "<if test='orderReceivingStatus != null'>order_receiving_status = #{orderReceivingStatus},</if>" +
+        "<if test='lawyerExpertiseAreaId != null'>lawyer_expertise_area_id = #{lawyerExpertiseAreaId},</if>" +
+        "<if test='commissionRate != null'>commission_rate = #{commissionRate},</if>" +
+        "<if test='paymentNum != null'>payment_num = #{paymentNum},</if>" +
+        "</set>" +
+        "WHERE id = #{id}" +
+        "</script>")
+Integer updateLawyerUser(LawyerUser user);
+
 }
 

+ 18 - 0
alien-lawyer/src/main/java/shop/alien/lawyer/controller/LawyerConsultationOrderController.java

@@ -342,5 +342,23 @@ public class LawyerConsultationOrderController {
         return consultationOrderService.checkOrder(clientUserId, lawyerUserId);
     }
 
+    @ApiOperation("订单收益统计接口")
+    @ApiOperationSupport(order = 16)
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "lawyerUserId", value = "律师用户ID", dataType = "Integer", paramType = "query", required = true),
+    })
+    @GetMapping("/getOrderIncome")
+    public R<Map<String, Object>> getOrderIncome(@RequestParam Integer lawyerUserId) {
+        log.info("LawyerConsultationOrderController.getOrderIncome?lawyerUserId={}", lawyerUserId);
+        
+        // 参数校验
+        if (lawyerUserId == null) {
+            log.warn("查询订单收益失败:律师用户ID为空");
+            return R.fail("律师用户ID不能为空");
+        }
+        
+        return consultationOrderService.getOrderIncome(lawyerUserId);
+    }
+
 }
 

+ 9 - 0
alien-lawyer/src/main/java/shop/alien/lawyer/service/LawyerConsultationOrderService.java

@@ -123,5 +123,14 @@ public interface LawyerConsultationOrderService extends IService<LawyerConsultat
      * @return
      */
    R<Map<String, String>> checkOrder(Integer clientUserId,Integer lawyerUserId);
+
+
+   /**
+   * 获取律师订单收益统计
+   *
+   * @param lawyerUserId 律师用户ID
+   * @return 订单收益统计信息
+   */
+   R<Map<String, Object>> getOrderIncome(Integer lawyerUserId);
 }
 

+ 142 - 0
alien-lawyer/src/main/java/shop/alien/lawyer/service/impl/LawyerConsultationOrderServiceImpl.java

@@ -21,6 +21,7 @@ import shop.alien.entity.store.LawyerUser;
 import shop.alien.entity.store.dto.LawyerConsultationOrderDto;
 import shop.alien.entity.store.dto.PayStatusRequest;
 import shop.alien.entity.store.vo.LawyerConsultationOrderVO;
+import shop.alien.entity.store.vo.OrderRevenueVO;
 import shop.alien.lawyer.service.LawyerConsultationOrderService;
 import shop.alien.lawyer.service.LawyerUserService;
 import shop.alien.lawyer.service.OrderExpirationService;
@@ -30,6 +31,9 @@ import shop.alien.mapper.LawyerServiceAreaMapper;
 import shop.alien.mapper.LawyerUserMapper;
 import shop.alien.util.common.constant.LawyerStatusEnum;
 
+import java.math.BigDecimal;
+import java.math.RoundingMode;
+
 import java.text.SimpleDateFormat;
 import java.time.LocalDateTime;
 import java.time.ZoneId;
@@ -910,6 +914,144 @@ public class LawyerConsultationOrderServiceImpl extends ServiceImpl<LawyerConsul
         return R.success("可以咨询该律师");
     }
 
+    /**
+     * 获取律师订单收益统计
+     * <p>
+     * 统计三个维度的收益数据:
+     * 1. 全部收益:所有已支付订单的订单总数和收益合计
+     * 2. 进行中:订单状态=2(进行中)且已支付的订单总数和收益合计
+     * 3. 已完成:订单状态=3(已完成)且已支付的订单总数和收益合计
+     * </p>
+     *
+     * @param lawyerUserId 律师用户ID
+     * @return 订单收益统计信息
+     */
+    @Override
+    public R<Map<String, Object>> getOrderIncome(Integer lawyerUserId) {
+        log.info("LawyerConsultationOrderServiceImpl.getOrderIncome?lawyerUserId={}", lawyerUserId);
+
+        // 参数校验
+        if (lawyerUserId == null) {
+            log.warn("查询订单收益失败:律师用户ID为空");
+            return R.fail("律师用户ID不能为空");
+        }
+
+        Map<String, Object> resultMap = new HashMap<>();
+        OrderRevenueVO revenueVO = new OrderRevenueVO();
+
+        try {
+            // 构建查询条件:查询已支付的订单(paymentStatus = 1)
+            LambdaQueryWrapper<LawyerConsultationOrder> allRevenueWrapper = new LambdaQueryWrapper<>();
+            allRevenueWrapper.eq(LawyerConsultationOrder::getLawyerUserId, lawyerUserId)
+                    .eq(LawyerConsultationOrder::getPaymentStatus, 1) // 已支付
+                    .eq(LawyerConsultationOrder::getDeleteFlag, 0);
+
+            // 查询全部已支付订单的统计
+            List<LawyerConsultationOrder> allPaidOrders = consultationOrderMapper.selectList(allRevenueWrapper);
+            long allOrderCount = allPaidOrders.size();
+            long allRevenue = allPaidOrders.stream()
+                    .filter(order -> order.getOrderAmount() != null)
+                    .mapToLong(LawyerConsultationOrder::getOrderAmount)
+                    .sum();
+
+            long consultationFee = allPaidOrders.stream()
+                    .filter(order -> order.getConsultationFee() != null)
+                    .mapToLong(LawyerConsultationOrder::getConsultationFee)
+                    .sum();
+
+            revenueVO.setAllOrderCount(allOrderCount);
+            revenueVO.setAllRevenue(allRevenue-consultationFee);
+
+
+            // 查询进行中订单的统计(orderStatus = 2 且已支付)
+            LambdaQueryWrapper<LawyerConsultationOrder> inProgressWrapper = new LambdaQueryWrapper<>();
+            inProgressWrapper.eq(LawyerConsultationOrder::getLawyerUserId, lawyerUserId)
+                    .eq(LawyerConsultationOrder::getOrderStatus, LawyerStatusEnum.INPROGRESS.getStatus()) // 2:进行中
+                    .eq(LawyerConsultationOrder::getPaymentStatus, 1) // 已支付
+                    .eq(LawyerConsultationOrder::getDeleteFlag, 0);
+
+            List<LawyerConsultationOrder> inProgressOrders = consultationOrderMapper.selectList(inProgressWrapper);
+            long inProgressOrderCount = inProgressOrders.size();
+
+            long inProgressRevenue = inProgressOrders.stream()
+                    .filter(order -> order.getOrderAmount() != null)
+                    .mapToLong(LawyerConsultationOrder::getOrderAmount)
+                    .sum();
+
+            long inProgressFee = inProgressOrders.stream()
+                    .filter(order -> order.getConsultationFee() != null)
+                    .mapToLong(LawyerConsultationOrder::getConsultationFee)
+                    .sum();
+
+            revenueVO.setInProgressOrderCount(inProgressOrderCount);
+            revenueVO.setInProgressRevenue(inProgressRevenue-inProgressFee);
+
+
+            // 查询已完成订单的统计(orderStatus = 3 且已支付)
+            LambdaQueryWrapper<LawyerConsultationOrder> completedWrapper = new LambdaQueryWrapper<>();
+            completedWrapper.eq(LawyerConsultationOrder::getLawyerUserId, lawyerUserId)
+                    .eq(LawyerConsultationOrder::getOrderStatus, LawyerStatusEnum.COMPLETE.getStatus()) // 3:已完成
+                    .eq(LawyerConsultationOrder::getPaymentStatus, 1) // 已支付
+                    .eq(LawyerConsultationOrder::getDeleteFlag, 0);
+
+            List<LawyerConsultationOrder> completedOrders = consultationOrderMapper.selectList(completedWrapper);
+            long completedOrderCount = completedOrders.size();
+            long completedRevenue = completedOrders.stream()
+                    .filter(order -> order.getOrderAmount() != null)
+                    .mapToLong(LawyerConsultationOrder::getOrderAmount)
+                    .sum();
+
+            long completedFee = completedOrders.stream()
+                    .filter(order -> order.getConsultationFee() != null)
+                    .mapToLong(LawyerConsultationOrder::getConsultationFee)
+                    .sum();
+
+            revenueVO.setCompletedOrderCount(completedOrderCount);
+            revenueVO.setCompletedRevenue(completedRevenue-completedFee);
+
+            // 构建返回结果
+            Map<String, Object> allRevenueMap = new HashMap<>();
+            allRevenueMap.put("orderCount", revenueVO.getAllOrderCount());
+            allRevenueMap.put("totalRevenue", revenueVO.getAllRevenue());
+            resultMap.put("allRevenue", allRevenueMap);
+
+            Map<String, Object> inProgressMap = new HashMap<>();
+            inProgressMap.put("orderCount", revenueVO.getInProgressOrderCount());
+            inProgressMap.put("totalRevenue", revenueVO.getInProgressRevenue());
+            resultMap.put("inProgress", inProgressMap);
+
+            Map<String, Object> completedMap = new HashMap<>();
+            completedMap.put("orderCount", revenueVO.getCompletedOrderCount());
+            completedMap.put("totalRevenue", revenueVO.getCompletedRevenue());
+            resultMap.put("completed", completedMap);
+
+            log.info("查询订单收益成功,律师ID={}, 全部订单数={}, 全部收益={}, 进行中订单数={}, 进行中收益={}, 已完成订单数={}, 已完成收益={}",
+                    lawyerUserId, allOrderCount, allRevenue, inProgressOrderCount, inProgressRevenue,
+                    completedOrderCount, completedRevenue);
+
+            return R.data(resultMap);
+
+        } catch (Exception e) {
+            log.error("查询订单收益失败,律师ID={}", lawyerUserId, e);
+            return R.fail("查询订单收益失败:" + e.getMessage());
+        }
+    }
+
+    /**
+     * 格式化收益金额(分转元)
+     *
+     * @param revenueInCents 收益金额(单位:分)
+     * @return 格式化后的金额字符串(单位:元)
+     */
+    private String formatRevenue(long revenueInCents) {
+        if (revenueInCents == 0) {
+            return "0";
+        }
+        BigDecimal revenue = new BigDecimal(revenueInCents);
+        BigDecimal revenueInYuan = revenue.divide(new BigDecimal(100), 2, RoundingMode.HALF_UP);
+        return revenueInYuan.toString();
+    }
+
 
 }
 

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

@@ -539,8 +539,9 @@ public class LawyerUserServiceImpl extends ServiceImpl<LawyerUserMapper, LawyerU
         log.info("LawyerUserController.upDateLawyerUser?lawyerUserVo={}", lawyerUserVo);
         LawyerUser lawyerUser = new LawyerUser();
         BeanUtils.copyProperties(lawyerUserVo, lawyerUser);
-        boolean result=this.updateById(lawyerUser);
-        if (!result){
+//        Boolean result=this.updateById(lawyerUser);
+        Integer result=lawyerUserMapper.updateLawyerUser(lawyerUser);
+        if (result<=0){
             return R.fail("修改律师信息失败");
         }
         return R.success("修改律师信息失败");