Merge remote-tracking branch 'origin/main'

This commit is contained in:
jkcdev 2025-04-22 09:49:28 +08:00
commit 1c61276a0b
5 changed files with 168 additions and 7 deletions

View File

@ -45,7 +45,7 @@ public interface EbikeBikeInfoMapper extends BaseMapper<EbikeBikeInfo> {
@Update({ @Update({
"<script>", "<script>",
"UPDATE ebike_bike_info", "UPDATE ebike_bike_info",
"SET state = #{status} SET REGION_ID = #{regionId}", "SET state = #{status},regin_id = #{reginId}",
"WHERE bike_code IN", "WHERE bike_code IN",
"<foreach collection='bikeCodes' item='bikeCode' open='(' separator=',' close=')'>", "<foreach collection='bikeCodes' item='bikeCode' open='(' separator=',' close=')'>",
"#{bikeCode}", "#{bikeCode}",
@ -53,5 +53,5 @@ public interface EbikeBikeInfoMapper extends BaseMapper<EbikeBikeInfo> {
"</script>" "</script>"
}) })
int vehicleLeaveWarehouse(@Param("bikeCodes") List<String> bikeCodes, int vehicleLeaveWarehouse(@Param("bikeCodes") List<String> bikeCodes,
@Param("status") String status, @Param("regionId") String regionId); @Param("status") String status, @Param("reginId") String reginId);
} }

View File

@ -28,5 +28,5 @@ public class ReqBulkDeliveryDto {
/** /**
* 区域id * 区域id
*/ */
private String regionId; private String reginId;
} }

View File

@ -364,7 +364,7 @@ public class EbikeBikeInfoServiceImpl extends ServiceImpl<EbikeBikeInfoMapper, E
try { try {
ebikeBikeInfoMapper.vehicleLeaveWarehouse(reqBulkDeliveryDto.getBikeCode(), ebikeBikeInfoMapper.vehicleLeaveWarehouse(reqBulkDeliveryDto.getBikeCode(),
reqBulkDeliveryDto.getStatus(), reqBulkDeliveryDto.getRegionId()); reqBulkDeliveryDto.getStatus(), reqBulkDeliveryDto.getReginId());
return true; return true;
} catch (Exception e) { } catch (Exception e) {
log.error("vehicleLeaveWarehouse===>{}", e.getMessage() + Arrays.toString(e.getStackTrace())); log.error("vehicleLeaveWarehouse===>{}", e.getMessage() + Arrays.toString(e.getStackTrace()));

View File

@ -5,7 +5,10 @@ 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.*; import com.cdzy.orders.enums.CmdCode;
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;
@ -13,6 +16,7 @@ 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.UserOrders; import com.cdzy.orders.model.entity.UserOrders;
import com.cdzy.orders.service.UserOrdersService; import com.cdzy.orders.service.UserOrdersService;
import com.cdzy.orders.uitls.NumberUtils;
import com.cdzy.orders.uitls.RedisUtil; import com.cdzy.orders.uitls.RedisUtil;
import com.cdzy.orders.uitls.TimeUtils; import com.cdzy.orders.uitls.TimeUtils;
import com.ebike.feign.clients.MaintenanceFeignClient; import com.ebike.feign.clients.MaintenanceFeignClient;
@ -33,7 +37,8 @@ import java.util.List;
import java.util.Objects; import java.util.Objects;
import java.util.concurrent.CompletableFuture; import java.util.concurrent.CompletableFuture;
import static com.cdzy.orders.enums.TimeDivisionCharging.*; import static com.cdzy.orders.enums.TimeDivisionCharging.TIME_SLOT;
import static com.cdzy.orders.enums.TimeDivisionCharging.WEEK;
import static com.cdzy.orders.model.entity.table.UserOrdersTableDef.USER_ORDERS; import static com.cdzy.orders.model.entity.table.UserOrdersTableDef.USER_ORDERS;
/** /**
@ -310,7 +315,26 @@ public class UserOrdersServiceImpl extends ServiceImpl<UserOrdersMapper, UserOrd
* @return 计费后总金额 * @return 计费后总金额
*/ */
BigDecimal defaultCostCalculation(BigDecimal totalAmount,long minutes,ResFeignEbikeSysRcostsetDto feignEbikeSysRcostsetDto){ BigDecimal defaultCostCalculation(BigDecimal totalAmount,long minutes,ResFeignEbikeSysRcostsetDto feignEbikeSysRcostsetDto){
Integer startupDuration = feignEbikeSysRcostsetDto.getStartupDuration();
BigDecimal startupCost = feignEbikeSysRcostsetDto.getStartupCost();
totalAmount = totalAmount.add(startupCost);
//超出起步时长计费
if (minutes > startupDuration){
BigDecimal minutesNew = BigDecimal.valueOf(minutes);
BigDecimal startupDurationNew = BigDecimal.valueOf(startupDuration);
//超出时长
BigDecimal subtract = minutesNew.subtract(startupDurationNew);
//时长计费
BigDecimal durationCost = feignEbikeSysRcostsetDto.getDurationCost();
//时长多久计费一次
Integer duration = feignEbikeSysRcostsetDto.getDuration();
//总计费几次向上取整
int ceil = NumberUtils.divideAndCeil(duration, subtract.intValue());
BigDecimal ceilCost = BigDecimal.valueOf(ceil);
//最终值
BigDecimal multiply = durationCost.multiply(ceilCost);
totalAmount = totalAmount.add(multiply);
}
return totalAmount; return totalAmount;
} }
} }

View File

@ -0,0 +1,137 @@
package com.cdzy.orders.uitls;
import java.util.Arrays;
/**
* 数字计算工具类提供安全的数学运算方法
*/
public final class NumberUtils {
private NumberUtils() {
// 防止实例化
}
/**
* 除法向上取整
* @param dividend 被除数
* @param divisor 除数
* @return 向上取整后的结果
* @throws IllegalArgumentException 如果除数为0
*/
public static int divideAndCeil(int dividend, int divisor) {
if (divisor == 0) throw new IllegalArgumentException("Divisor cannot be zero");
return (int) Math.ceil((double) dividend / divisor);
}
/**
* 安全转换字符串为整数
* @param str 要转换的字符串
* @param defaultValue 转换失败时的默认值
* @return 转换结果或默认值
*/
public static int parseIntSafe(String str, int defaultValue) {
if (str == null) return defaultValue;
try {
return Integer.parseInt(str.trim());
} catch (NumberFormatException e) {
return defaultValue;
}
}
/**
* 计算最大值
* @param numbers 输入数字
* @return 最大值
* @throws IllegalArgumentException 如果输入为空或null
*/
public static int max(int... numbers) {
validateArray(numbers);
return Arrays.stream(numbers).max().getAsInt();
}
/**
* 计算最小值
* @param numbers 输入数字
* @return 最小值
* @throws IllegalArgumentException 如果输入为空或null
*/
public static int min(int... numbers) {
validateArray(numbers);
return Arrays.stream(numbers).min().getAsInt();
}
/**
* 计算平均值避免int溢出
* @param numbers 输入数字
* @return 平均值
* @throws IllegalArgumentException 如果输入为空或null
*/
public static double average(int... numbers) {
validateArray(numbers);
long sum = 0;
for (int num : numbers) {
sum += num;
}
return (double) sum / numbers.length;
}
/**
* 安全绝对值计算
* @param value 输入值
* @return 绝对值
* @throws ArithmeticException 如果值为Integer.MIN_VALUE
*/
public static int absExact(int value) {
if (value == Integer.MIN_VALUE) {
throw new ArithmeticException("Absolute value of Integer.MIN_VALUE overflows");
}
return Math.abs(value);
}
/**
* 安全加法溢出时返回边界值
* @param a 第一个操作数
* @param b 第二个操作数
* @return 计算结果或边界值
*/
public static int addExact(int a, int b) {
long res = (long) a + b;
return clampToInt(res);
}
/**
* 安全减法溢出时返回边界值
* @param a 被减数
* @param b 减数
* @return 计算结果或边界值
*/
public static int subtractExact(int a, int b) {
long res = (long) a - b;
return clampToInt(res);
}
/**
* 安全乘法溢出时返回边界值
* @param a 第一个因子
* @param b 第二个因子
* @return 计算结果或边界值
*/
public static int multiplyExact(int a, int b) {
long res = (long) a * b;
return clampToInt(res);
}
// 验证数组有效性
private static void validateArray(int[] array) {
if (array == null || array.length == 0) {
throw new IllegalArgumentException("Input array must not be null or empty");
}
}
// 将long值钳制到int范围
private static int clampToInt(long value) {
if (value > Integer.MAX_VALUE) return Integer.MAX_VALUE;
if (value < Integer.MIN_VALUE) return Integer.MIN_VALUE;
return (int) value;
}
}