|
|
@@ -1424,6 +1424,84 @@ public class LawyerConsultationOrderServiceImpl extends ServiceImpl<LawyerConsul
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
+ * 用户端完成订单
|
|
|
+ * <p>
|
|
|
+ * 完成订单前会进行以下校验和处理:
|
|
|
+ * 1. 参数校验:用户ID和订单ID不能为空
|
|
|
+ * 2. 订单存在性校验:订单必须存在
|
|
|
+ * 3. 订单归属校验:订单必须属于该用户
|
|
|
+ * 4. 订单状态校验:只有进行中(2)状态的订单可以完成
|
|
|
+ * 5. 更新订单状态为已完成(3),并更新完成时间
|
|
|
+ * </p>
|
|
|
+ *
|
|
|
+ * @param clientUserId 客户端用户ID
|
|
|
+ * @param orderId 订单ID
|
|
|
+ * @return 完成订单结果
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ @Transactional(rollbackFor = Exception.class)
|
|
|
+ public R<Boolean> completeOrder(Integer clientUserId, Integer orderId) {
|
|
|
+ log.info("开始完成订单,用户ID={}, 订单ID={}", clientUserId, orderId);
|
|
|
+
|
|
|
+ // 1. 参数校验
|
|
|
+ if (clientUserId == null || clientUserId <= 0) {
|
|
|
+ log.warn("完成订单失败:用户ID为空或无效,clientUserId={}", clientUserId);
|
|
|
+ return R.fail("用户ID不能为空");
|
|
|
+ }
|
|
|
+
|
|
|
+ if (orderId == null || orderId <= 0) {
|
|
|
+ log.warn("完成订单失败:订单ID为空或无效,orderId={}", orderId);
|
|
|
+ return R.fail("订单ID不能为空");
|
|
|
+ }
|
|
|
+
|
|
|
+ // 2. 查询订单信息
|
|
|
+ LawyerConsultationOrder order = consultationOrderMapper.selectById(orderId);
|
|
|
+ if (order == null) {
|
|
|
+ log.warn("完成订单失败:订单不存在,订单ID={}", orderId);
|
|
|
+ return R.fail("订单不存在");
|
|
|
+ }
|
|
|
+
|
|
|
+ // 3. 订单归属校验:订单必须属于该用户
|
|
|
+ if (!clientUserId.equals(order.getClientUserId())) {
|
|
|
+ log.warn("完成订单失败:订单不属于该用户,订单ID={}, 订单用户ID={}, 请求用户ID={}",
|
|
|
+ orderId, order.getClientUserId(), clientUserId);
|
|
|
+ return R.fail("订单不属于该用户,无法完成订单");
|
|
|
+ }
|
|
|
+
|
|
|
+ // 4. 订单状态校验:只有进行中(2)状态的订单可以完成
|
|
|
+ Integer orderStatus = order.getOrderStatus();
|
|
|
+ Integer inProgressStatus = LawyerStatusEnum.INPROGRESS.getStatus(); // 2:进行中
|
|
|
+ Integer completeStatus = LawyerStatusEnum.COMPLETE.getStatus(); // 3:已完成
|
|
|
+
|
|
|
+ if (!inProgressStatus.equals(orderStatus)) {
|
|
|
+ log.warn("完成订单失败:订单状态不允许完成,订单ID={}, 订单编号={}, 订单状态={}",
|
|
|
+ orderId, order.getOrderNumber(), orderStatus);
|
|
|
+ return R.fail("只有进行中的订单可以完成");
|
|
|
+ }
|
|
|
+
|
|
|
+ // 5. 更新订单状态为已完成(3),并更新咨询结束时间和更新时间
|
|
|
+ LambdaUpdateWrapper<LawyerConsultationOrder> updateWrapper = new LambdaUpdateWrapper<>();
|
|
|
+ Date now = new Date();
|
|
|
+ updateWrapper.eq(LawyerConsultationOrder::getId, orderId)
|
|
|
+ .set(LawyerConsultationOrder::getOrderStatus, completeStatus)
|
|
|
+ .set(LawyerConsultationOrder::getEndTime, now)
|
|
|
+ .set(LawyerConsultationOrder::getUpdatedTime, now);
|
|
|
+
|
|
|
+ int updateCount = consultationOrderMapper.update(null, updateWrapper);
|
|
|
+ boolean success = updateCount > 0;
|
|
|
+
|
|
|
+ // 6. 记录操作结果
|
|
|
+ if (success) {
|
|
|
+ log.info("完成订单成功,订单ID={}, 订单编号={}, 原状态={}, 新状态=已完成",
|
|
|
+ orderId, order.getOrderNumber(), orderStatus);
|
|
|
+ return R.data(true, "订单已完成");
|
|
|
+ } else {
|
|
|
+ log.error("完成订单失败:更新数据库失败,订单ID={}, 订单编号={}", orderId, order.getOrderNumber());
|
|
|
+ return R.fail("完成订单失败,请稍后重试");
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
* 格式化收益金额(分转元)
|
|
|
*
|
|
|
* @param revenueInCents 收益金额(单位:分)
|