ldz 1 місяць тому
батько
коміт
4148af7639

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

@@ -237,5 +237,41 @@ public interface LawyerConsultationOrderMapper extends BaseMapper<LawyerConsulta
             "\tlur.id = lco.client_user_id ${ew.customSqlSegment}")
     List<Map<String, Object>> getLawyerStatisticsInfo(@Param(Constants.WRAPPER) QueryWrapper<LawyerConsultationOrderVO> queryWrapper);
 
+
+    //查询咨询订单
+    @Select("SELECT " +
+            "id, " +
+            "order_number, " +
+            "client_user_id, " +
+            "lawyer_user_id, " +
+            "problem_scenario_id, " +
+            "problem_description, " +
+            "order_amount, " +
+            "consultation_fee, " +
+            "start_time, " +
+            "end_time, " +
+            "order_status, " +
+            "payment_status, " +
+            "order_time, " +
+            "payment_time, " +
+            "validity_period, " +
+            "rating, " +
+            "comment, " +
+            "delete_flag, " +
+            "created_time, " +
+            "created_user_id, " +
+            "updated_time, " +
+            "updated_user_id, " +
+            "alipay_no, " +
+            "order_str " +
+            "FROM " +
+            "lawyer_consultation_order " +
+            "WHERE client_user_id = #{clientUserId} " +
+            "AND lawyer_user_id = #{lawyerUserId} " +
+            "AND order_status = 2")
+    List<LawyerConsultationOrder> selectOrder(
+            @Param("clientUserId") Integer clientUserId,
+            @Param("lawyerUserId") Integer lawyerUserId);
+
 }
 

+ 17 - 4
alien-lawyer/src/main/java/shop/alien/lawyer/controller/LawyerConsultationOrderController.java

@@ -209,12 +209,12 @@ public class LawyerConsultationOrderController {
     @ApiOperation("立即咨询")
     @ApiOperationSupport(order = 9)
     @ApiImplicitParams({
-            @ApiImplicitParam(name = "clientUserId", value = "客户端用户ID", dataType = "Integer", paramType = "query"),
-            @ApiImplicitParam(name = "lawyerUserId", value = "律师用户ID", dataType = "Integer", paramType = "query"),
+            @ApiImplicitParam(name = "clientUserId", value = "客户端用户ID", dataType = "Integer", paramType = "query", required = true),
+            @ApiImplicitParam(name = "lawyerUserId", value = "律师用户ID", dataType = "Integer", paramType = "query", required = true),
             @ApiImplicitParam(name = "problemScenarioId", value = "法律问题场景ID", dataType = "String", paramType = "query"),
             @ApiImplicitParam(name = "problemDescription", value = "问题描述", dataType = "String", paramType = "query"),
-            @ApiImplicitParam(name = "alipayNo", value = "支付宝订单编号", dataType = "String", paramType = "query"),
-            @ApiImplicitParam(name = "orderStr", value = "支付宝订单字符串", dataType = "String", paramType = "query"),
+            @ApiImplicitParam(name = "alipayNo", value = "支付宝订单编号", dataType = "String", paramType = "query", required = true),
+            @ApiImplicitParam(name = "orderStr", value = "支付宝订单字符串", dataType = "String", paramType = "query", required = true),
 //            @ApiImplicitParam(name = "lawyerName", value = "律师姓名(支持模糊查询,关联查询)", dataType = "String", paramType = "query"),
 //            @ApiImplicitParam(name = "consultationFee", value = "咨询费用,单位分", dataType = "Integer", paramType = "query"),
 //            @ApiImplicitParam(name = "startTime", value = "咨询开始时间", dataType = "Date", paramType = "query"),
@@ -330,5 +330,18 @@ public class LawyerConsultationOrderController {
         return R.data(consultationOrderService.getLawyerConsultationOrderInfo(pageNum, pageSize, startDate, endDate, clientUserName, orderStatus, lawyerId));
     }
 
+
+    @ApiOperation("创建订单前的校验")
+    @ApiOperationSupport(order = 15)
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "clientUserId", value = "客户端用户ID", dataType = "Integer", paramType = "query", required = true),
+            @ApiImplicitParam(name = "lawyerUserId", value = "律师用户ID", dataType = "Integer", paramType = "query", required = true),
+    })
+    @PostMapping("/checkOrder")
+    public R<Map<String, String>> checkOrder( @RequestParam Integer clientUserId, @RequestParam Integer lawyerUserId) {
+        log.info("LawyerConsultationOrderController.checkOrder?clientUserId={},lawyerUserId{}", clientUserId, lawyerUserId);
+        return consultationOrderService.checkOrder(clientUserId, lawyerUserId);
+    }
+
 }
 

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

@@ -2,6 +2,7 @@ package shop.alien.lawyer.service;
 
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.service.IService;
+import org.springframework.web.bind.annotation.RequestParam;
 import shop.alien.entity.result.R;
 import shop.alien.entity.store.LawyerConsultationOrder;
 import shop.alien.entity.store.dto.LawyerConsultationOrderDto;
@@ -113,5 +114,14 @@ public interface LawyerConsultationOrderService extends IService<LawyerConsultat
      * @return IPage<LawyerConsultationOrderVO>
      */
     Map<String, Object> getLawyerConsultationOrderInfo(int pageNum, int pageSize, String startDate, String endDate, String clientUserName, String orderStatus, String lawyerId);
+
+    /**
+     * 订单检查
+     *
+     * @param clientUserId
+     * @param lawyerUserId
+     * @return
+     */
+   R<Map<String, String>> checkOrder(Integer clientUserId,Integer lawyerUserId);
 }
 

+ 30 - 1
alien-lawyer/src/main/java/shop/alien/lawyer/service/impl/LawyerConsultationOrderServiceImpl.java

@@ -394,7 +394,13 @@ public class LawyerConsultationOrderServiceImpl extends ServiceImpl<LawyerConsul
     @Override
     public R<LawyerConsultationOrderDto> consultNow(LawyerConsultationOrder lawyerConsultationOrder) {
         log.info("LawyerConsultationOrderController.consultNow?lawyerConsultationOrder={}", lawyerConsultationOrder);
-         LawyerConsultationOrderDto order = new LawyerConsultationOrderDto();
+//        Integer clientUserId= lawyerConsultationOrder.getClientUserId();
+//        Integer lawyerUserId= lawyerConsultationOrder.getLawyerUserId();
+//        List<LawyerConsultationOrder>  orderDto  =consultationOrderMapper.selectOrder(clientUserId, lawyerUserId);
+//        if (CollectionUtils.isNotEmpty(orderDto)){
+//            return R.fail("您已存在咨询该律师的订单");
+//        }
+        LawyerConsultationOrderDto order = new LawyerConsultationOrderDto();
         order.setClientUserId(lawyerConsultationOrder.getClientUserId());
         order.setLawyerUserId(lawyerConsultationOrder.getLawyerUserId());
         order.setProblemScenarioId(lawyerConsultationOrder.getProblemScenarioId());
@@ -828,6 +834,8 @@ public class LawyerConsultationOrderServiceImpl extends ServiceImpl<LawyerConsul
         return resultMap;
     }
 
+
+
     /**
      * 为待支付订单计算倒计时(30分钟有效期)
      *
@@ -886,5 +894,26 @@ public class LawyerConsultationOrderServiceImpl extends ServiceImpl<LawyerConsul
         orderVO.setNickName(lawyerUser.getNickName());
         orderVO.setPersonalIntroduction(lawyerUser.getPersonalIntroduction());
     }
+
+    /**
+     * 查询律师订单列表
+     *
+
+     * @param clientUserId 用户id
+     * @param lawyerUserId 律师ID
+     * @return 订单列表
+     */
+    @Override
+    public R<Map<String, String>> checkOrder(Integer clientUserId, Integer lawyerUserId) {
+        log.info("LawyerConsultationOrderController.checkOrder?clientUserId={},lawyerUserId{}", clientUserId, lawyerUserId);
+        List<LawyerConsultationOrder>  orderDto  =consultationOrderMapper.selectOrder(clientUserId, lawyerUserId);
+        if (CollectionUtils.isNotEmpty(orderDto)){
+            return R.fail("您已存在咨询该律师的订单");
+        }
+        return R.success("可以咨询该律师");
+    }
+
+
+
 }
 

+ 19 - 1
alien-store/src/main/java/shop/alien/store/controller/LawyerConsultationOrderController.java

@@ -1,5 +1,6 @@
 package shop.alien.store.controller;
 
+import com.alibaba.nacos.common.utils.CollectionUtils;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import io.swagger.annotations.*;
 import lombok.RequiredArgsConstructor;
@@ -15,6 +16,7 @@ import shop.alien.store.service.OrderExpirationService;
 import shop.alien.util.myBaticsPlus.QueryBuilder;
 
 import java.util.List;
+import java.util.Map;
 
 /**
  * 咨询订单 前端控制器
@@ -227,7 +229,10 @@ public class LawyerConsultationOrderController {
         log.info("LawyerConsultationOrderController.consultNow?lawyerConsultationOrder={}", lawyerConsultationOrder);
         //创建订单时,存储redis中,设置过期时间
         R<LawyerConsultationOrderDto> layerConsultationOrderDto = consultationOrderService.consultNow(lawyerConsultationOrder);
-        orderExpirationService.setOrderPaymentTimeout(layerConsultationOrderDto.getData().getOrderNumber(), 1800);
+        if (R.isSuccess(layerConsultationOrderDto) && layerConsultationOrderDto.getData()!=null){
+            orderExpirationService.setOrderPaymentTimeout(layerConsultationOrderDto.getData().getOrderNumber(), 1800);
+        }
+
         return layerConsultationOrderDto;
     }
 
@@ -325,5 +330,18 @@ public class LawyerConsultationOrderController {
         return consultationOrderService.getLawyerConsultationOrderList(pageNum, pageSize, startDate, endDate, lawyerId);
     }
 
+    @ApiOperation("创建订单前的校验")
+    @ApiOperationSupport(order = 15)
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "clientUserId", value = "客户端用户ID", dataType = "Integer", paramType = "query", required = true),
+            @ApiImplicitParam(name = "lawyerUserId", value = "律师用户ID", dataType = "Integer", paramType = "query", required = true),
+    })
+    @PostMapping("/checkOrder")
+    public R<Map<String, String>> checkOrder(@RequestParam Integer clientUserId, @RequestParam Integer lawyerUserId) {
+        log.info("LawyerConsultationOrderController.checkOrder?clientUserId={},lawyerUserId{}", clientUserId, lawyerUserId);
+        return consultationOrderService.checkOrder(clientUserId, lawyerUserId);
+    }
+
+
 }
 

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

@@ -114,5 +114,14 @@ public interface LawyerConsultationOrderService extends IService<LawyerConsultat
      * @return IPage<LawyerConsultationOrderVO>
      */
     R<IPage<LawyerConsultationOrderVO>> getLawyerConsultationOrderList(int pageNum, int pageSize, String startDate, String endDate, String lawyerId);
+
+    /**
+     * 订单检查
+     *
+     * @param clientUserId
+     * @param lawyerUserId
+     * @return
+     */
+    R<Map<String, String>> checkOrder(Integer clientUserId,Integer lawyerUserId);
 }
 

+ 55 - 152
alien-store/src/main/java/shop/alien/store/service/impl/LawyerConsultationOrderServiceImpl.java

@@ -395,165 +395,49 @@ public class LawyerConsultationOrderServiceImpl extends ServiceImpl<LawyerConsul
     }*/
 
 
-    /**
-     * 默认佣金率(百分比)
-     */
-    private static final int DEFAULT_COMMISSION_RATE = 3;
-    
-    /**
-     * 订单号生成最大重试次数
-     */
-    private static final int MAX_ORDER_NUMBER_RETRY = 5;
-    
-    /**
-     * 订单支付超时时间(秒),30分钟
-     */
-    private static final long ORDER_PAYMENT_TIMEOUT_SECONDS = 30 * 60;
-
-    /**
-     * 立即咨询 - 创建咨询订单
-     * <p>
-     * 创建订单前会进行以下校验:
-     * 1. 参数校验:客户端用户ID、律师用户ID、订单金额不能为空
-     * 2. 律师信息校验:律师必须存在且未被删除
-     * 3. 订单号唯一性校验:确保生成的订单号唯一
-     * </p>
-     * <p>
-     * 创建订单后会:
-     * 1. 计算咨询费用(根据律师佣金率)
-     * 2. 设置订单支付超时监听(30分钟)
-     * </p>
-     *
-     * @param lawyerConsultationOrder 咨询订单信息
-     * @return 创建结果
-     */
     @Override
-    @Transactional(rollbackFor = Exception.class)
     public R<LawyerConsultationOrderDto> consultNow(LawyerConsultationOrder lawyerConsultationOrder) {
-        log.info("开始创建咨询订单,clientUserId={}, lawyerUserId={}, orderAmount={}", 
-                lawyerConsultationOrder.getClientUserId(), 
-                lawyerConsultationOrder.getLawyerUserId(),
-                lawyerConsultationOrder.getOrderAmount());
-        
-        try {
-            // 1. 参数校验
-            if (lawyerConsultationOrder.getClientUserId() == null) {
-                log.warn("创建咨询订单失败:客户端用户ID为空");
-                return R.fail("客户端用户ID不能为空");
-            }
-            if (lawyerConsultationOrder.getLawyerUserId() == null) {
-                log.warn("创建咨询订单失败:律师用户ID为空");
-                return R.fail("律师用户ID不能为空");
-            }
-            if (lawyerConsultationOrder.getOrderAmount() == null || 
-                lawyerConsultationOrder.getOrderAmount().compareTo(BigDecimal.ZERO) <= 0) {
-                log.warn("创建咨询订单失败:订单金额无效,orderAmount={}", lawyerConsultationOrder.getOrderAmount());
-                return R.fail("订单金额必须大于0");
-            }
-            
-            // 2. 校验律师信息
-            LawyerUser lawyerUser = lawyerUserMapper.selectById(lawyerConsultationOrder.getLawyerUserId());
-            if (lawyerUser == null) {
-                log.warn("创建咨询订单失败:律师不存在,lawyerUserId={}", lawyerConsultationOrder.getLawyerUserId());
-                return R.fail("律师不存在");
-            }
-            if (lawyerUser.getDeleteFlag() != null && lawyerUser.getDeleteFlag() == 1) {
-                log.warn("创建咨询订单失败:律师已被删除,lawyerUserId={}", lawyerConsultationOrder.getLawyerUserId());
-                return R.fail("律师已被删除");
-            }
-            
-            // 3. 创建订单对象
-            LawyerConsultationOrderDto order = new LawyerConsultationOrderDto();
-            BeanUtils.copyProperties(lawyerConsultationOrder, order);
-            
-            // 4. 设置订单基本信息
-            Date now = new Date();
-            order.setOrderStatus(LawyerStatusEnum.WAIT_PAY.getStatus()); // 待支付
-            order.setPaymentStatus(0); // 未支付
-            order.setOrderTime(now);
-            order.setCreatedTime(now);
-            order.setUpdatedTime(now);
-            order.setDeleteFlag(0);
-            
-            // 5. 生成唯一订单号
-            String orderNumber = generateUniqueOrderNumber();
-            order.setOrderNumber(orderNumber);
-            log.info("生成订单号:{}", orderNumber);
-            
-            // 6. 计算咨询费用(根据律师佣金率)
+        log.info("LawyerConsultationOrderController.consultNow?lawyerConsultationOrder={}", lawyerConsultationOrder);
+        LawyerConsultationOrderDto order = new LawyerConsultationOrderDto();
+        order.setClientUserId(lawyerConsultationOrder.getClientUserId());
+        order.setLawyerUserId(lawyerConsultationOrder.getLawyerUserId());
+        order.setProblemScenarioId(lawyerConsultationOrder.getProblemScenarioId());
+        order.setProblemDescription(lawyerConsultationOrder.getProblemDescription());
+        order.setOrderAmount(lawyerConsultationOrder.getOrderAmount());
+        order.setOrderStatus(0);
+        order.setPaymentStatus(0);
+        order.setOrderTime(new Date());
+//        order.setValidityPeriod(DateUtils.addDays(new Date(), 7));
+        order.setCreatedTime(new Date());
+        order.setUpdatedTime(new Date());
+        order.setDeleteFlag(0);
+        order.setAlipayNo(lawyerConsultationOrder.getAlipayNo());
+        order.setOrderStr(lawyerConsultationOrder.getOrderStr());
+        //订单编号想要LAW+年月日(8位数字)+随机5位数字这种格式的
+        String orderNumber = "LAW" + new SimpleDateFormat("yyyyMMdd").format(new Date()) + String.format("%05d", RandomUtils.nextInt(100000));
+        order.setOrderNumber(orderNumber);
+        //计算本单收益
+        LawyerUser lawyerUser = lawyerUserMapper.selectById(lawyerConsultationOrder.getLawyerUserId());
+        if(lawyerUser != null){
             Integer commissionRate = lawyerUser.getCommissionRate();
-            int rate = (commissionRate != null && commissionRate > 0) ? commissionRate : DEFAULT_COMMISSION_RATE;
-            BigDecimal orderAmount = lawyerConsultationOrder.getOrderAmount();
-            // 修复计算逻辑:使用 BigDecimal 进行精确计算
-            BigDecimal rateDecimal = new BigDecimal(rate).divide(new BigDecimal(100), 4, RoundingMode.HALF_UP);
-            BigDecimal platformFee = orderAmount.multiply(rateDecimal)
+            int rate = commissionRate!=null&&commissionRate>0?commissionRate:3;
+            BigDecimal orderAmount =  lawyerConsultationOrder.getOrderAmount();
+            BigDecimal result2 = orderAmount.multiply(new BigDecimal(rate/100))
                     .setScale(0, RoundingMode.HALF_UP);
-            BigDecimal consultationFee = orderAmount.subtract(platformFee);
+            order.setConsultationFee(result2.intValue());
+        }
+        int num = consultationOrderMapper.insertOrder(order);
 
-            order.setConsultationFee(consultationFee.intValue());
-            log.info("计算咨询费用:订单金额={}, 佣金率={}%, 咨询费用={}", 
-                    orderAmount, rate, consultationFee);
-            
-            // 7. 插入订单
-            int insertResult = consultationOrderMapper.insertOrder(order);
-            if (insertResult <= 0) {
-                log.error("创建咨询订单失败:数据库插入失败,订单号={}", orderNumber);
-                return R.fail("创建订单失败");
-            }
-            
-            // 8. 设置订单支付超时监听(30分钟)
-            try {
-                orderExpirationService.setOrderPaymentTimeout(orderNumber, ORDER_PAYMENT_TIMEOUT_SECONDS);
-                log.info("已设置订单支付超时监听,订单号={}, 超时时间={}秒", orderNumber, ORDER_PAYMENT_TIMEOUT_SECONDS);
-            } catch (Exception e) {
-                log.error("设置订单支付超时监听失败,订单号={}", orderNumber, e);
-                // 不影响订单创建,仅记录日志
-            }
-            
-            log.info("创建咨询订单成功,订单号={}, 订单ID={}", orderNumber, order.getId());
+
+//        boolean result = this.save(order);
+//        if (result) {
+//            return R.data(order);
+//        }
+//        return R.fail("新增失败");
+        if (num >0){
             return R.data(order);
-            
-        } catch (Exception e) {
-            log.error("创建咨询订单异常", e);
-            return R.fail("创建订单失败:" + e.getMessage());
         }
-    }
-    
-    /**
-     * 生成唯一的订单号
-     * 格式:LAW + 年月日(8位数字)+ 随机5位数字
-     * 如果订单号已存在,会重试生成(最多重试5次)
-     *
-     * @return 唯一的订单号
-     */
-    private String generateUniqueOrderNumber() {
-        String dateStr = new SimpleDateFormat("yyyyMMdd").format(new Date());
-        String prefix = "LAW" + dateStr;
-        
-        for (int i = 0; i < MAX_ORDER_NUMBER_RETRY; i++) {
-            // 生成5位随机数字
-            int randomNum = RandomUtils.nextInt(100000);
-            String orderNumber = prefix + String.format("%05d", randomNum);
-            
-            // 检查订单号是否已存在
-            LambdaQueryWrapper<LawyerConsultationOrder> queryWrapper = new LambdaQueryWrapper<>();
-            queryWrapper.eq(LawyerConsultationOrder::getOrderNumber, orderNumber)
-                       .last("LIMIT 1");
-            LawyerConsultationOrder existingOrder = consultationOrderMapper.selectOne(queryWrapper);
-            
-            if (existingOrder == null) {
-                // 订单号唯一,返回
-                return orderNumber;
-            }
-            
-            log.warn("订单号已存在,重新生成,orderNumber={}, retry={}", orderNumber, i + 1);
-        }
-        
-        // 如果重试5次后仍然重复,使用时间戳确保唯一性
-        String timestamp = String.valueOf(System.currentTimeMillis());
-        String fallbackOrderNumber = prefix + timestamp.substring(timestamp.length() - 5);
-        log.warn("订单号生成重试{}次后仍重复,使用时间戳生成:{}", MAX_ORDER_NUMBER_RETRY, fallbackOrderNumber);
-        return fallbackOrderNumber;
+        return null;
     }
 
 
@@ -940,5 +824,24 @@ public class LawyerConsultationOrderServiceImpl extends ServiceImpl<LawyerConsul
         orderVO.setNickName(lawyerUser.getNickName());
         orderVO.setPersonalIntroduction(lawyerUser.getPersonalIntroduction());
     }
+
+
+    /**
+     * 查询律师订单列表
+     *
+
+     * @param clientUserId 用户id
+     * @param lawyerUserId 律师ID
+     * @return 订单列表
+     */
+    @Override
+    public R<Map<String, String>> checkOrder(Integer clientUserId, Integer lawyerUserId) {
+        log.info("LawyerConsultationOrderController.checkOrder?clientUserId={},lawyerUserId{}", clientUserId, lawyerUserId);
+        List<LawyerConsultationOrder>  orderDto  =consultationOrderMapper.selectOrder(clientUserId, lawyerUserId);
+        if (CollectionUtils.isNotEmpty(orderDto)){
+            return R.fail("您已存在咨询该律师的订单");
+        }
+        return R.success("可以咨询该律师");
+    }
 }