package com.ruoyi.user.service.impl;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.admin.api.entity.Prize;
import com.ruoyi.common.core.constant.Constants;
import com.ruoyi.common.core.exception.GlobalException;
import com.ruoyi.common.core.utils.SnowflakeIdWorker;
import com.ruoyi.order.api.entity.UserOrderRequest;
import com.ruoyi.order.api.feignClient.OrderClient;
import com.ruoyi.user.entity.Order;
import com.ruoyi.user.entity.RecoveryServe;
import com.ruoyi.user.entity.RecoveryServePrice;
import com.ruoyi.user.entity.UserRecipient;
import com.ruoyi.user.mapper.OrderMapper;
import com.ruoyi.user.request.OrderRequest;
import com.ruoyi.user.service.OrderService;
import com.ruoyi.user.service.RecoveryServePriceService;
import com.ruoyi.user.service.RecoveryServeService;
import com.ruoyi.user.service.UserRecipientService;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.util.List;
import java.util.Random;
import java.util.stream.Collectors;
/**
*
* 订单管理 服务实现类
*
*
* @author hjl
* @since 2024-06-07
*/
@Service
public class OrderServiceImpl extends ServiceImpl implements OrderService {
@Resource
private UserRecipientService userRecipientService;
@Resource
private RecoveryServeService recoveryServeService;
@Resource
private OrderClient orderClient;
@Resource
private RecoveryServePriceService servePriceService;
/**
* 雪花算法类
*/
private static final SnowflakeIdWorker SNOW_FLAKE_ID_WORKER = new SnowflakeIdWorker(5, 5);
@Override
public Object obtainAllowance(List prizeList) {
// 过滤中奖概率为空的奖品
List prizes = prizeList.stream().filter(data -> data.getProbability() != 0).collect(Collectors.toList());
// 转盘逻辑
double sum = prizes.stream().map(Prize::getProbability).mapToDouble(Double::doubleValue).sum();
Prize result = null;
boolean v = true;
while (v) {
for (Prize prize : prizes) {
double item = prize.getProbability() / sum;
// 随机数对象
Random random = new Random();
// 生成一个介于0到1之间的随机小数
double randomDouble = random.nextDouble();
if (item >= randomDouble) {
result = prize;
break;
}
}
if (null != result) {
v = false;
}
}
// 抽中的商品
return result;
}
@Override
public Boolean placeOrder(OrderRequest orderRequest, Integer userId) {
Integer serveId = orderRequest.getServeId();
Integer addressId = orderRequest.getAddressId();
// 下单相关信息
RecoveryServe recoveryServe = recoveryServeService.lambdaQuery().eq(RecoveryServe::getId, serveId)
.eq(RecoveryServe::getIsDelete, 0).one();
UserRecipient userRecipient = userRecipientService.lambdaQuery().eq(UserRecipient::getId, addressId)
.eq(UserRecipient::getIsDelete, 0).one();
if (null == recoveryServe || null == userRecipient) {
throw new GlobalException("下单失败,预约服务信息或收货地址信息异常!");
}
String address = userRecipient.getAddress();
if (address.contains(Constants.PROVINCE) && address.contains(Constants.MARKET)) {
}
UserOrderRequest userOrderRequest = new UserOrderRequest();
userOrderRequest.setOrderNumber(orderRequest.getOrderNumber());
userOrderRequest.setServeId(orderRequest.getServeId());
userOrderRequest.setReservationName(orderRequest.getReservationName());
userOrderRequest.setReservationPhone(orderRequest.getReservationPhone());
userOrderRequest.setAddressId(orderRequest.getAddressId());
userOrderRequest.setTime(orderRequest.getTime());
userOrderRequest.setReservationRemark(orderRequest.getReservationRemark());
userOrderRequest.setLongitude(orderRequest.getLongitude());
userOrderRequest.setLatitude(orderRequest.getLatitude());
userOrderRequest.setSubsidy(orderRequest.getSubsidy());
userOrderRequest.setDefaultPrice(recoveryServe.getDefaultPrice());
userOrderRequest.setServeName(recoveryServe.getServeName());
userOrderRequest.setAddress(userRecipient.getAddress());
userOrderRequest.setAddressDetail(userRecipient.getAddressDetail());
userOrderRequest.setUserId(userId);
return orderClient.placeOrder(userOrderRequest).getData();
}
@Override
public String orderEstimate(OrderRequest orderRequest, Integer userid) {
Integer serveId = orderRequest.getServeId();
orderRequest.setOrderNumber(String.valueOf(SNOW_FLAKE_ID_WORKER.nextId()));
Integer addressId = orderRequest.getAddressId();
// 下单相关信息
RecoveryServe recoveryServe = recoveryServeService.lambdaQuery().eq(RecoveryServe::getId, serveId)
.eq(RecoveryServe::getIsDelete, 0).one();
RecoveryServePrice price = servePriceService.lambdaQuery()
.eq(RecoveryServePrice::getRecoveryServeId, serveId)
.eq(RecoveryServePrice::getCity, orderRequest.getCity())
.eq(RecoveryServePrice::getIsDelete, 0).one();
if (null == recoveryServe) {
throw new GlobalException("下单失败,预约服务信息或收货地址信息异常!");
}
UserOrderRequest userOrderRequest = new UserOrderRequest();
if (null != orderRequest.getAddressId()) {
UserRecipient userRecipient = userRecipientService.lambdaQuery().eq(UserRecipient::getId, addressId)
.eq(UserRecipient::getIsDelete, 0).one();
userOrderRequest.setAddress(userRecipient.getAddress());
userOrderRequest.setAddressDetail(userRecipient.getAddressDetail());
} else {
userOrderRequest.setAddressDetail(orderRequest.getFillAddress());
}
userOrderRequest.setOrderNumber(orderRequest.getOrderNumber());
userOrderRequest.setServeId(orderRequest.getServeId());
userOrderRequest.setReservationName(orderRequest.getReservationName());
userOrderRequest.setReservationPhone(orderRequest.getReservationPhone());
userOrderRequest.setAddressId(orderRequest.getAddressId());
userOrderRequest.setTime(orderRequest.getTime());
userOrderRequest.setReservationRemark(orderRequest.getReservationRemark());
userOrderRequest.setLongitude(orderRequest.getLongitude());
userOrderRequest.setLatitude(orderRequest.getLatitude());
userOrderRequest.setSubsidy(orderRequest.getSubsidy());
// 城市回收价
if (null == price) {
userOrderRequest.setDefaultPrice(recoveryServe.getDefaultPrice());
} else {
userOrderRequest.setDefaultPrice(price.getRecoveryPrice());
}
userOrderRequest.setServeName(recoveryServe.getServeName());
userOrderRequest.setUserId(userid);
return orderClient.orderEstimate(userOrderRequest).getData();
}
}