默认计费订单计费详情
This commit is contained in:
parent
6ba6096c6d
commit
3fa6ccaa1b
@ -0,0 +1,39 @@
|
|||||||
|
package com.cdzy.orders.enums;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author attiya
|
||||||
|
* @since 2025-04-25
|
||||||
|
*/
|
||||||
|
public interface OrderDetailsType {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 默认时长计费
|
||||||
|
*/
|
||||||
|
int CYCLING_DURATION_FEE = 1;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 运营区调度费用
|
||||||
|
*/
|
||||||
|
int OPERATION_AREA_SCHEDULING_FEE = 2;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 停车区调度费用
|
||||||
|
*/
|
||||||
|
int PARKING_AREA_DISPATCH_FEE = 3;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 高峰时段出行费用
|
||||||
|
*/
|
||||||
|
int TRAVEL_EXPENSES_DURING_PEAK_HOURS = 4;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 高峰日出行费用
|
||||||
|
*/
|
||||||
|
int TRAVEL_EXPENSES_ON_PEAK_DAYS = 5;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 起步费用
|
||||||
|
*/
|
||||||
|
int STARTING_FEE = 6;
|
||||||
|
|
||||||
|
}
|
||||||
@ -33,12 +33,12 @@ public class EbikeOrderDetails implements Serializable {
|
|||||||
* 费用项ID
|
* 费用项ID
|
||||||
*/
|
*/
|
||||||
@Id
|
@Id
|
||||||
private String itemId;
|
private Long itemId;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 订单ID
|
* 订单ID
|
||||||
*/
|
*/
|
||||||
private String orderId;
|
private Long orderId;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 费用类型:1-骑行时长费 2-运营区调度费用 3-停车区调度费用 4-高峰时段出行费用 5-高峰日出行费用
|
* 费用类型:1-骑行时长费 2-运营区调度费用 3-停车区调度费用 4-高峰时段出行费用 5-高峰日出行费用
|
||||||
|
|||||||
@ -5,15 +5,13 @@ import com.cdzy.common.enums.Code;
|
|||||||
import com.cdzy.common.model.JsonResult;
|
import com.cdzy.common.model.JsonResult;
|
||||||
import com.cdzy.common.model.ResGPSDto;
|
import com.cdzy.common.model.ResGPSDto;
|
||||||
import com.cdzy.orders.component.EbikeCoreHandler;
|
import com.cdzy.orders.component.EbikeCoreHandler;
|
||||||
import com.cdzy.orders.enums.CmdCode;
|
import com.cdzy.orders.enums.*;
|
||||||
import com.cdzy.orders.enums.EbikeRegionInOperation;
|
|
||||||
import com.cdzy.orders.enums.OrderStatus;
|
|
||||||
import com.cdzy.orders.enums.OrderType;
|
|
||||||
import com.cdzy.orders.mapper.UserOrdersMapper;
|
import com.cdzy.orders.mapper.UserOrdersMapper;
|
||||||
import com.cdzy.orders.model.dto.req.ReqBikeDto;
|
import com.cdzy.orders.model.dto.req.ReqBikeDto;
|
||||||
import com.cdzy.orders.model.dto.req.ReqOrderDto;
|
import com.cdzy.orders.model.dto.req.ReqOrderDto;
|
||||||
import com.cdzy.orders.model.dto.res.RedisPoint;
|
import com.cdzy.orders.model.dto.res.RedisPoint;
|
||||||
import com.cdzy.orders.model.dto.res.RspBikeDto;
|
import com.cdzy.orders.model.dto.res.RspBikeDto;
|
||||||
|
import com.cdzy.orders.model.entity.EbikeOrderDetails;
|
||||||
import com.cdzy.orders.model.entity.EbikeUserOrders;
|
import com.cdzy.orders.model.entity.EbikeUserOrders;
|
||||||
import com.cdzy.orders.service.UserOrdersService;
|
import com.cdzy.orders.service.UserOrdersService;
|
||||||
import com.cdzy.orders.uitls.NumberUtils;
|
import com.cdzy.orders.uitls.NumberUtils;
|
||||||
@ -34,6 +32,7 @@ import org.springframework.transaction.annotation.Transactional;
|
|||||||
|
|
||||||
import java.math.BigDecimal;
|
import java.math.BigDecimal;
|
||||||
import java.time.LocalDateTime;
|
import java.time.LocalDateTime;
|
||||||
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.concurrent.CompletableFuture;
|
import java.util.concurrent.CompletableFuture;
|
||||||
|
|
||||||
@ -144,7 +143,7 @@ public class UserOrdersServiceImpl extends ServiceImpl<UserOrdersMapper, EbikeUs
|
|||||||
String jsonString = JSONObject.toJSONString(redisUtil.get(ecuInfo.getEcuSn()));
|
String jsonString = JSONObject.toJSONString(redisUtil.get(ecuInfo.getEcuSn()));
|
||||||
ResGPSDto resGpsDto = JSONObject.parseObject(jsonString, ResGPSDto.class);
|
ResGPSDto resGpsDto = JSONObject.parseObject(jsonString, ResGPSDto.class);
|
||||||
userOrders.setReturnPoint(resGpsDto.getLongitude() + "," + resGpsDto.getLatitude());
|
userOrders.setReturnPoint(resGpsDto.getLongitude() + "," + resGpsDto.getLatitude());
|
||||||
//计算骑行时长
|
|
||||||
JsonResult<ResFeignEbikeSysRcostsetDto> operateJsonResult = operateFeignClient.getRegionFeeConfigById(bikeInfoDto.getReginId());
|
JsonResult<ResFeignEbikeSysRcostsetDto> operateJsonResult = operateFeignClient.getRegionFeeConfigById(bikeInfoDto.getReginId());
|
||||||
if (operateJsonResult.getCode() != Code.SUCCESS) {
|
if (operateJsonResult.getCode() != Code.SUCCESS) {
|
||||||
throw new RuntimeException("获取计费规则失败");
|
throw new RuntimeException("获取计费规则失败");
|
||||||
@ -333,6 +332,7 @@ public class UserOrdersServiceImpl extends ServiceImpl<UserOrdersMapper, EbikeUs
|
|||||||
*/
|
*/
|
||||||
void costCalculation(ResFeignEbikeSysRcostsetDto feignEbikeSysRcostsetDto, ResGPSDto resGpsDto, FeignEbikeRegionDto regionDto, EbikeUserOrders userOrders) {
|
void costCalculation(ResFeignEbikeSysRcostsetDto feignEbikeSysRcostsetDto, ResGPSDto resGpsDto, FeignEbikeRegionDto regionDto, EbikeUserOrders userOrders) {
|
||||||
BigDecimal totalAmount = new BigDecimal(0);
|
BigDecimal totalAmount = new BigDecimal(0);
|
||||||
|
List<EbikeOrderDetails> list = new ArrayList<>();
|
||||||
//是否在运营区内
|
//是否在运营区内
|
||||||
boolean pointInOperation = bikeInOperation(resGpsDto.getLongitude(), resGpsDto.getLatitude(), regionDto.getOrgId(), regionDto.getRegionId());
|
boolean pointInOperation = bikeInOperation(resGpsDto.getLongitude(), resGpsDto.getLatitude(), regionDto.getOrgId(), regionDto.getRegionId());
|
||||||
//是否在停车区内
|
//是否在停车区内
|
||||||
@ -347,19 +347,34 @@ public class UserOrdersServiceImpl extends ServiceImpl<UserOrdersMapper, EbikeUs
|
|||||||
if (pointInOperation && !pointInParking) {
|
if (pointInOperation && !pointInParking) {
|
||||||
//停车区调度费用
|
//停车区调度费用
|
||||||
BigDecimal parkingAreaOutDispatchFee = feignEbikeSysRcostsetDto.getParkingAreaOutDispatchFee();
|
BigDecimal parkingAreaOutDispatchFee = feignEbikeSysRcostsetDto.getParkingAreaOutDispatchFee();
|
||||||
|
EbikeOrderDetails orderDetails = new EbikeOrderDetails();
|
||||||
|
orderDetails.setOrderId(userOrders.getOrderId());
|
||||||
|
orderDetails.setItemAmount(parkingAreaOutDispatchFee);
|
||||||
|
orderDetails.setItemType(OrderDetailsType.PARKING_AREA_DISPATCH_FEE);
|
||||||
|
orderDetails.setItemName("停车区调度费用");
|
||||||
|
orderDetails.setCalculationRule(JSONObject.toJSONString(feignEbikeSysRcostsetDto));
|
||||||
|
list.add(orderDetails);
|
||||||
totalAmount = totalAmount.add(parkingAreaOutDispatchFee);
|
totalAmount = totalAmount.add(parkingAreaOutDispatchFee);
|
||||||
} else if (!pointInOperation) {
|
} else if (!pointInOperation) {
|
||||||
//运营区调度费用
|
//运营区调度费用
|
||||||
BigDecimal dispatchFeeOutOperateArea = feignEbikeSysRcostsetDto.getDispatchFeeOutOperateArea();
|
BigDecimal operationAreaSchedulingFee = feignEbikeSysRcostsetDto.getDispatchFeeOutOperateArea();
|
||||||
totalAmount = totalAmount.add(dispatchFeeOutOperateArea);
|
EbikeOrderDetails orderDetails = new EbikeOrderDetails();
|
||||||
|
orderDetails.setOrderId(userOrders.getOrderId());
|
||||||
|
orderDetails.setItemAmount(operationAreaSchedulingFee);
|
||||||
|
orderDetails.setItemType(OrderDetailsType.OPERATION_AREA_SCHEDULING_FEE);
|
||||||
|
orderDetails.setItemName("运营区调度费用");
|
||||||
|
orderDetails.setCalculationRule(JSONObject.toJSONString(feignEbikeSysRcostsetDto));
|
||||||
|
list.add(orderDetails);
|
||||||
|
totalAmount = totalAmount.add(operationAreaSchedulingFee);
|
||||||
}
|
}
|
||||||
//时长费用计算
|
//时长费用计算
|
||||||
Character timeDivisionCharging = feignEbikeSysRcostsetDto.getTimeDivisionCharging();
|
Character timeDivisionCharging = feignEbikeSysRcostsetDto.getTimeDivisionCharging();
|
||||||
totalAmount = switch (timeDivisionCharging) {
|
BigDecimal decimal = switch (timeDivisionCharging) {
|
||||||
case TIME_SLOT -> timeSlotCostCalculation(totalAmount, minutes, userOrders, feignEbikeSysRcostsetDto);
|
case TIME_SLOT -> timeSlotCostCalculation(list,minutes, userOrders, feignEbikeSysRcostsetDto,userOrders.getOrderId());
|
||||||
case WEEK -> weekCostCalculation(totalAmount, minutes, userOrders, feignEbikeSysRcostsetDto);
|
case WEEK -> weekCostCalculation(list,minutes, userOrders, feignEbikeSysRcostsetDto,userOrders.getOrderId());
|
||||||
default -> defaultCostCalculation(totalAmount, minutes, feignEbikeSysRcostsetDto);
|
default -> defaultCostCalculation(list,minutes, feignEbikeSysRcostsetDto,userOrders.getOrderId());
|
||||||
};
|
};
|
||||||
|
totalAmount = totalAmount.add(decimal);
|
||||||
userOrders.setStatus(OrderStatus.PENDING_PAYMENT);
|
userOrders.setStatus(OrderStatus.PENDING_PAYMENT);
|
||||||
userOrders.setTotalAmount(totalAmount);
|
userOrders.setTotalAmount(totalAmount);
|
||||||
}
|
}
|
||||||
@ -367,41 +382,46 @@ public class UserOrdersServiceImpl extends ServiceImpl<UserOrdersMapper, EbikeUs
|
|||||||
/**
|
/**
|
||||||
* 按照特殊时间段计费
|
* 按照特殊时间段计费
|
||||||
*
|
*
|
||||||
* @param totalAmount 当前金额(时间段计费前
|
|
||||||
* @param minutes (骑行总分钟
|
* @param minutes (骑行总分钟
|
||||||
* @param userOrders 订单信息
|
* @param userOrders 订单信息
|
||||||
* @param feignEbikeSysRcostsetDto 计费规则
|
* @param feignEbikeSysRcostsetDto 计费规则
|
||||||
* @return 计费后总金额
|
* @return 计费后总金额
|
||||||
*/
|
*/
|
||||||
BigDecimal timeSlotCostCalculation(BigDecimal totalAmount, long minutes, EbikeUserOrders userOrders, ResFeignEbikeSysRcostsetDto feignEbikeSysRcostsetDto) {
|
BigDecimal timeSlotCostCalculation(List<EbikeOrderDetails> list, long minutes, EbikeUserOrders userOrders, ResFeignEbikeSysRcostsetDto feignEbikeSysRcostsetDto,long orderId) {
|
||||||
return totalAmount;
|
return new BigDecimal(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 按照时间段计费
|
* 按照时间段计费
|
||||||
*
|
*
|
||||||
* @param totalAmount 当前金额(时间段计费前
|
|
||||||
* @param minutes (骑行总分钟
|
* @param minutes (骑行总分钟
|
||||||
* @param userOrders 订单信息
|
* @param userOrders 订单信息
|
||||||
* @param feignEbikeSysRcostsetDto 计费规则
|
* @param feignEbikeSysRcostsetDto 计费规则
|
||||||
* @return 计费后总金额
|
* @return 计费后总金额
|
||||||
*/
|
*/
|
||||||
BigDecimal weekCostCalculation(BigDecimal totalAmount, long minutes, EbikeUserOrders userOrders, ResFeignEbikeSysRcostsetDto feignEbikeSysRcostsetDto) {
|
BigDecimal weekCostCalculation(List<EbikeOrderDetails> list, long minutes, EbikeUserOrders userOrders, ResFeignEbikeSysRcostsetDto feignEbikeSysRcostsetDto,long orderId) {
|
||||||
return totalAmount;
|
return new BigDecimal(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 按照时间段计费(默认
|
* 按照时间段计费(默认
|
||||||
*
|
*
|
||||||
* @param totalAmount 当前金额(时间段计费前
|
|
||||||
* @param minutes (骑行总分钟
|
* @param minutes (骑行总分钟
|
||||||
* @param feignEbikeSysRcostsetDto 计费规则
|
* @param feignEbikeSysRcostsetDto 计费规则
|
||||||
* @return 计费后总金额
|
* @return 计费后总金额
|
||||||
*/
|
*/
|
||||||
BigDecimal defaultCostCalculation(BigDecimal totalAmount, long minutes, ResFeignEbikeSysRcostsetDto feignEbikeSysRcostsetDto) {
|
BigDecimal defaultCostCalculation(List<EbikeOrderDetails> list, long minutes, ResFeignEbikeSysRcostsetDto feignEbikeSysRcostsetDto,long orderId) {
|
||||||
|
BigDecimal decimal = new BigDecimal(0);
|
||||||
Integer startupDuration = feignEbikeSysRcostsetDto.getStartupDuration();
|
Integer startupDuration = feignEbikeSysRcostsetDto.getStartupDuration();
|
||||||
BigDecimal startupCost = feignEbikeSysRcostsetDto.getStartupCost();
|
BigDecimal startupCost = feignEbikeSysRcostsetDto.getStartupCost();
|
||||||
totalAmount = totalAmount.add(startupCost);
|
EbikeOrderDetails orderDetails = new EbikeOrderDetails();
|
||||||
|
orderDetails.setOrderId(orderId);
|
||||||
|
orderDetails.setItemAmount(startupCost);
|
||||||
|
orderDetails.setItemType(OrderDetailsType.STARTING_FEE);
|
||||||
|
orderDetails.setItemName("起步费用");
|
||||||
|
orderDetails.setCalculationRule(JSONObject.toJSONString(feignEbikeSysRcostsetDto));
|
||||||
|
list.add(orderDetails);
|
||||||
|
decimal = decimal.add(startupCost);
|
||||||
//超出起步时长计费
|
//超出起步时长计费
|
||||||
if (minutes > startupDuration) {
|
if (minutes > startupDuration) {
|
||||||
BigDecimal minutesNew = BigDecimal.valueOf(minutes);
|
BigDecimal minutesNew = BigDecimal.valueOf(minutes);
|
||||||
@ -417,8 +437,16 @@ public class UserOrdersServiceImpl extends ServiceImpl<UserOrdersMapper, EbikeUs
|
|||||||
BigDecimal ceilCost = BigDecimal.valueOf(ceil);
|
BigDecimal ceilCost = BigDecimal.valueOf(ceil);
|
||||||
//最终值
|
//最终值
|
||||||
BigDecimal multiply = durationCost.multiply(ceilCost);
|
BigDecimal multiply = durationCost.multiply(ceilCost);
|
||||||
totalAmount = totalAmount.add(multiply);
|
|
||||||
|
EbikeOrderDetails durationCostOrderDetails = new EbikeOrderDetails();
|
||||||
|
durationCostOrderDetails.setOrderId(orderId);
|
||||||
|
durationCostOrderDetails.setItemAmount(multiply);
|
||||||
|
durationCostOrderDetails.setItemType(OrderDetailsType.CYCLING_DURATION_FEE);
|
||||||
|
durationCostOrderDetails.setItemName("时长计费");
|
||||||
|
durationCostOrderDetails.setCalculationRule(JSONObject.toJSONString(feignEbikeSysRcostsetDto));
|
||||||
|
list.add(durationCostOrderDetails);
|
||||||
|
decimal = decimal.add(multiply);
|
||||||
}
|
}
|
||||||
return totalAmount;
|
return decimal;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user