|
|
@@ -17,18 +17,24 @@ import com.ylx.massage.domain.TWxUser;
|
|
|
import com.ylx.massage.domain.vo.HomeBlock;
|
|
|
import com.ylx.massage.domain.vo.OrderVerificationVo;
|
|
|
import com.ylx.massage.domain.vo.TechnicianAvailabilityVo;
|
|
|
+import com.ylx.massage.service.CouponService;
|
|
|
import com.ylx.massage.service.IMaTechnicianService;
|
|
|
import com.ylx.massage.service.TAddressService;
|
|
|
+import com.ylx.massage.service.TWxUserService;
|
|
|
import com.ylx.massage.utils.OrderNumberGenerator;
|
|
|
import com.ylx.order.domain.TOrder;
|
|
|
import com.ylx.order.domain.dto.OrderDateQueryDTO;
|
|
|
import com.ylx.order.domain.dto.OrderSubmitDTO;
|
|
|
import com.ylx.order.domain.vo.OrderDateQueryVo;
|
|
|
import com.ylx.order.enums.OrderStatusEnum;
|
|
|
+import com.ylx.order.enums.PaymentMethodEnum;
|
|
|
import com.ylx.order.mapper.TOrderMapper;
|
|
|
import com.ylx.order.service.TOrderService;
|
|
|
import com.ylx.project.domain.Project;
|
|
|
import com.ylx.project.service.ProjectService;
|
|
|
+import com.ylx.shopingfundsdetail.domain.vo.ShoppingFundsDetailAddDto;
|
|
|
+import com.ylx.shopingfundsdetail.enums.ShoppingFundsExpenseTypeEnum;
|
|
|
+import com.ylx.shopingfundsdetail.service.ShoppingFundsDetailService;
|
|
|
import lombok.extern.slf4j.Slf4j;
|
|
|
import org.springframework.beans.BeanUtils;
|
|
|
import org.springframework.stereotype.Service;
|
|
|
@@ -60,6 +66,12 @@ public class TOrderServiceImpl extends ServiceImpl<TOrderMapper, TOrder> impleme
|
|
|
private IMaTechnicianService maTechnicianService;
|
|
|
@Resource
|
|
|
private OrderNumberGenerator orderNumberGenerator;
|
|
|
+ @Resource
|
|
|
+ private TWxUserService wxUserService;
|
|
|
+ @Resource
|
|
|
+ private ShoppingFundsDetailService shoppingFundsDetailService;
|
|
|
+ @Resource
|
|
|
+ private CouponService couponService;
|
|
|
|
|
|
@Override
|
|
|
public TOrder addOrder(TOrder order) {
|
|
|
@@ -205,7 +217,9 @@ public class TOrderServiceImpl extends ServiceImpl<TOrderMapper, TOrder> impleme
|
|
|
throw new ServiceException("用户未登录");
|
|
|
}
|
|
|
|
|
|
- order.setUserId(Long.parseLong(wxLoginUser.getId()));
|
|
|
+ Long userId = Long.parseLong(wxLoginUser.getId());
|
|
|
+
|
|
|
+ order.setUserId(userId);
|
|
|
|
|
|
// 2. 获取项目信息
|
|
|
Project project = this.projectService.getById(dto.getProjectId());
|
|
|
@@ -253,9 +267,12 @@ public class TOrderServiceImpl extends ServiceImpl<TOrderMapper, TOrder> impleme
|
|
|
// 5. 设置价格信息
|
|
|
LocalDateTime appointmentStartTime = dto.getAppointmentStartTime();
|
|
|
|
|
|
- Integer paymentMethod = dto.getPaymentMethod();
|
|
|
// 优惠券优惠
|
|
|
- BigDecimal couponDiscount = Optional.ofNullable(dto.getCouponDiscount()).orElse(BigDecimal.ZERO);
|
|
|
+ BigDecimal couponDiscount = BigDecimal.ZERO;
|
|
|
+ order.setCouponId(dto.getCouponId());
|
|
|
+ if (ObjectUtil.isNotNull(dto.getCouponId())) {
|
|
|
+ couponDiscount = this.couponService.calculateDiscountAmount(dto.getCouponId(), wxLoginUser.getCOpenid(), project.getPrice());
|
|
|
+ }
|
|
|
// 车费
|
|
|
BigDecimal trafficFee = Optional.ofNullable(dto.getTrafficFee()).orElse(BigDecimal.ZERO);
|
|
|
// 商品原价
|
|
|
@@ -268,7 +285,6 @@ public class TOrderServiceImpl extends ServiceImpl<TOrderMapper, TOrder> impleme
|
|
|
order.setCouponDiscount(couponDiscount);
|
|
|
order.setTrafficFee(trafficFee);
|
|
|
order.setFinalAmount(finalAmount);
|
|
|
- order.setPaymentMethod(paymentMethod);
|
|
|
|
|
|
order.setCreateTime(DateUtils.getNowDate());
|
|
|
order.setAppointmentStartTime(appointmentStartTime);
|
|
|
@@ -297,14 +313,53 @@ public class TOrderServiceImpl extends ServiceImpl<TOrderMapper, TOrder> impleme
|
|
|
order.setVirtualLatitude(new BigDecimal(addr.getLatitude()));
|
|
|
});
|
|
|
|
|
|
+ // 7. 判断支付方式
|
|
|
+ Integer paymentMethod = dto.getPaymentMethod();
|
|
|
+ order.setPaymentMethod(paymentMethod);
|
|
|
+ // 余额支付
|
|
|
+ if (ObjectUtil.equals(PaymentMethodEnum.BALANCE.getCode(), paymentMethod)) {
|
|
|
+ order.setStatus(OrderStatusEnum.PENDING_DISPATCH.getCode());
|
|
|
+ order.setPaidTime(LocalDateTime.now());
|
|
|
+ } else {
|
|
|
+ order.setStatus(OrderStatusEnum.PENDING_PAYMENT.getCode());
|
|
|
+ }
|
|
|
+
|
|
|
boolean saveResult = this.save(order);
|
|
|
if (!saveResult) {
|
|
|
throw new ServiceException("添加订单失败");
|
|
|
}
|
|
|
+
|
|
|
+ // 8. 处理用户余额数据
|
|
|
+ if (ObjectUtil.equals(PaymentMethodEnum.BALANCE.getCode(), paymentMethod)) {
|
|
|
+
|
|
|
+ // 处理用户余额
|
|
|
+ TWxUser user = this.wxUserService.getById(userId);
|
|
|
+ BigDecimal newBalance = user.getdBalance().add(finalAmount);
|
|
|
+ this.wxUserService.lambdaUpdate()
|
|
|
+ .set(TWxUser::getdBalance, newBalance)
|
|
|
+ .eq(TWxUser::getId, user.getId())
|
|
|
+ .update();
|
|
|
+
|
|
|
+ // 记录购物金明细
|
|
|
+ ShoppingFundsDetailAddDto shoppingFundsDetailAddDto = new ShoppingFundsDetailAddDto();
|
|
|
+ shoppingFundsDetailAddDto.setUserId(userId.toString());
|
|
|
+ shoppingFundsDetailAddDto.setAmount(finalAmount);
|
|
|
+ shoppingFundsDetailAddDto.setOrderNo(orderNo);
|
|
|
+ shoppingFundsDetailAddDto.setExpenseType(ShoppingFundsExpenseTypeEnum.CONSUMPTION.getCode());
|
|
|
+ shoppingFundsDetailAddDto.setBalance(newBalance);
|
|
|
+ shoppingFundsDetailService.addShoppingFundsDetail(shoppingFundsDetailAddDto);
|
|
|
+
|
|
|
+ }
|
|
|
+ // 9. 判断有没有使用优惠券
|
|
|
+ if (couponDiscount.compareTo(BigDecimal.ZERO) > 0) {
|
|
|
+ this.couponService.useCoupon(dto.getCouponId(), wxLoginUser.getCOpenid(), order.getId(), 1);
|
|
|
+ }
|
|
|
+
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* 用户端订单列表
|
|
|
+ *
|
|
|
* @param dto
|
|
|
* @return
|
|
|
*/
|
|
|
@@ -351,6 +406,7 @@ public class TOrderServiceImpl extends ServiceImpl<TOrderMapper, TOrder> impleme
|
|
|
|
|
|
/**
|
|
|
* 用户端逻辑删除
|
|
|
+ *
|
|
|
* @param orderId
|
|
|
*/
|
|
|
@Override
|
|
|
@@ -394,12 +450,14 @@ public class TOrderServiceImpl extends ServiceImpl<TOrderMapper, TOrder> impleme
|
|
|
|
|
|
return vo;
|
|
|
}
|
|
|
+
|
|
|
/**
|
|
|
* 订单状态码 -> 中文描述
|
|
|
*/
|
|
|
private String getOrderStatusName(Integer status) {
|
|
|
return OrderStatusEnum.getInfoByCode(status);
|
|
|
}
|
|
|
+
|
|
|
/**
|
|
|
* 拼接服务时间字符串,例如 “2026-06-08 14:30 (90分钟)”
|
|
|
*/
|