ソースを参照

计算车费代码提交

wangzhijun 4 日 前
コミット
0ed2785ca9

+ 2 - 0
nightFragrance-massage/src/main/java/com/ylx/fareSetting/domian/dto/FareCalculateDTO.java

@@ -1,5 +1,6 @@
 package com.ylx.fareSetting.domian.dto;
 package com.ylx.fareSetting.domian.dto;
 
 
+import com.fasterxml.jackson.annotation.JsonFormat;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 import lombok.Data;
@@ -24,6 +25,7 @@ public class FareCalculateDTO implements Serializable {
 
 
     @ApiModelProperty(value = "预约开始时间", example = "2024-01-07 15:30:00")
     @ApiModelProperty(value = "预约开始时间", example = "2024-01-07 15:30:00")
     @NotNull(message = "预约时间不能为空")
     @NotNull(message = "预约时间不能为空")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
     private LocalDateTime appointmentStartTime;
     private LocalDateTime appointmentStartTime;
 
 
     @ApiModelProperty("城市编码")
     @ApiModelProperty("城市编码")

+ 21 - 14
nightFragrance-massage/src/main/java/com/ylx/fareSetting/service/impl/MaProjectFareSettingServiceImpl.java

@@ -45,15 +45,16 @@ public class MaProjectFareSettingServiceImpl extends ServiceImpl<MaProjectFareSe
         // 1.获取商户的默认地址
         // 1.获取商户的默认地址
         TAddress address = this.addressService.getOne(new LambdaQueryWrapper<TAddress>()
         TAddress address = this.addressService.getOne(new LambdaQueryWrapper<TAddress>()
                 .eq(TAddress::getMerchantId, dto.getMerchantId())
                 .eq(TAddress::getMerchantId, dto.getMerchantId())
-                .eq(TAddress::getType, 1));
+                .eq(TAddress::getIsDefault, 1)
+                .eq(TAddress::getIsDelete, 0));
         if (ObjectUtil.isNull(address)) {
         if (ObjectUtil.isNull(address)) {
             throw new ServiceException("无法获取商户的默认地址");
             throw new ServiceException("无法获取商户的默认地址");
         }
         }
 
 
         // 2. 计算直线距离(公里)
         // 2. 计算直线距离(公里)
         String distanceStr = DistanceUtil.formatDistanceInKilometers(
         String distanceStr = DistanceUtil.formatDistanceInKilometers(
-                dto.getLongitude(), dto.getLatitude(),
-                address.getLongitude(), address.getLatitude()
+                dto.getLatitude(),dto.getLongitude(),
+                address.getLatitude(),address.getLongitude()
         );
         );
         double straightLineKm;
         double straightLineKm;
         if ("未知".equals(distanceStr)) {
         if ("未知".equals(distanceStr)) {
@@ -101,20 +102,22 @@ public class MaProjectFareSettingServiceImpl extends ServiceImpl<MaProjectFareSe
             }
             }
         }
         }
 
 
-        if (ObjectUtil.isNull(finalConfig)) {
-            throw new ServiceException("无法获取有效的车费计算规则");
-        }
+        BigDecimal merchantFreeKm = BigDecimal.ZERO;
+        
+        if (ObjectUtil.isNotNull(finalConfig)) {
 
 
-        // 商户配置的免车费距离(用于扣减)
-        BigDecimal merchantFreeKm = isDay ? finalConfig.getDayFreeKm() : finalConfig.getNightFreeKm();
+            // 商户配置的免车费距离(用于扣减)
+            merchantFreeKm = isDay ? finalConfig.getDayFreeKm() : finalConfig.getNightFreeKm();
 
 
-        if (ObjectUtil.isNull(merchantFreeKm) || merchantFreeKm.compareTo(BigDecimal.ZERO) <= 0) {
-            merchantFreeKm = BigDecimal.ZERO;
-            log.info("商户[{}]配置的免车费距离为 null 或 <= 0, 视为 0", dto.getMerchantId());
-        } else {
-            log.info("商户[{}]使用配置ID={}, 免费公里数: {}", dto.getMerchantId(), finalConfig.getId(), merchantFreeKm);
+            if (ObjectUtil.isNull(merchantFreeKm) || merchantFreeKm.compareTo(BigDecimal.ZERO) <= 0) {
+                merchantFreeKm = BigDecimal.ZERO;
+                log.info("商户[{}]配置的免车费距离为 null 或 <= 0, 视为 0", dto.getMerchantId());
+            } else {
+                log.info("商户[{}]使用配置ID={}, 免费公里数: {}", dto.getMerchantId(), finalConfig.getId(), merchantFreeKm);
+            }
         }
         }
 
 
+
         // 4. 计算【打车距离】(即计费里程)
         // 4. 计算【打车距离】(即计费里程)
         BigDecimal straightLineBigDecimal = new BigDecimal(straightLineKm).setScale(6, RoundingMode.HALF_UP);
         BigDecimal straightLineBigDecimal = new BigDecimal(straightLineKm).setScale(6, RoundingMode.HALF_UP);
         BigDecimal effectiveDistance = straightLineBigDecimal.subtract(merchantFreeKm);
         BigDecimal effectiveDistance = straightLineBigDecimal.subtract(merchantFreeKm);
@@ -125,7 +128,7 @@ public class MaProjectFareSettingServiceImpl extends ServiceImpl<MaProjectFareSe
                 straightLineKm, merchantFreeKm, effectiveDistance);
                 straightLineKm, merchantFreeKm, effectiveDistance);
 
 
         // 5. 获取城市车费规则(用于最终计费)
         // 5. 获取城市车费规则(用于最终计费)
-        TFareSettingVo cityFare = fareSettingService.getFareSetting(appointmentStartTime.toString(), dto.getCityCode());
+        TFareSettingVo cityFare = fareSettingService.getFareSetting(appointmentStartTime, dto.getCityCode());
         if (ObjectUtil.isNull(cityFare)) {
         if (ObjectUtil.isNull(cityFare)) {
             throw new ServiceException("未找到城市[" + dto.getCityCode() + "]的车费配置");
             throw new ServiceException("未找到城市[" + dto.getCityCode() + "]的车费配置");
         }
         }
@@ -158,6 +161,10 @@ public class MaProjectFareSettingServiceImpl extends ServiceImpl<MaProjectFareSe
         }
         }
 
 
         // 7. 设置结果
         // 7. 设置结果
+        result.setFreeKm(merchantFreeKm);
+        result.setBaseFare(baseFare);
+        result.setBaseDistance(baseDistance);
+        result.setAdditionalFarePer(additionalFarePer);
         result.setActualDistanceKm(straightLineBigDecimal.setScale(2, RoundingMode.HALF_UP)); // 原始直线距离(展示用)
         result.setActualDistanceKm(straightLineBigDecimal.setScale(2, RoundingMode.HALF_UP)); // 原始直线距离(展示用)
         result.setEstimatedFare(estimatedFare);
         result.setEstimatedFare(estimatedFare);
         result.setIsFree(isFree);
         result.setIsFree(isFree);

+ 3 - 1
nightFragrance-massage/src/main/java/com/ylx/massage/service/TFareSettingService.java

@@ -4,6 +4,8 @@ import com.baomidou.mybatisplus.extension.service.IService;
 import com.ylx.massage.domain.TFareSetting;
 import com.ylx.massage.domain.TFareSetting;
 import com.ylx.massage.domain.vo.TFareSettingVo;
 import com.ylx.massage.domain.vo.TFareSettingVo;
 
 
+import java.time.LocalDateTime;
+
 /**
 /**
  * 车费设置表(TFareSetting)表服务接口
  * 车费设置表(TFareSetting)表服务接口
  *
  *
@@ -33,7 +35,7 @@ public interface TFareSettingService extends IService<TFareSetting> {
      * @param cityCode
      * @param cityCode
      * @return
      * @return
      */
      */
-    TFareSettingVo getFareSetting(String userBookingTime,String cityCode);
+    TFareSettingVo getFareSetting(LocalDateTime userBookingTime, String cityCode);
 
 
 }
 }
 
 

+ 6 - 15
nightFragrance-massage/src/main/java/com/ylx/massage/service/impl/TFareSettingServiceImpl.java

@@ -7,17 +7,17 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.ylx.common.constant.MassageConstants;
 import com.ylx.common.constant.MassageConstants;
 import com.ylx.common.core.domain.entity.SysDictData;
 import com.ylx.common.core.domain.entity.SysDictData;
 import com.ylx.common.exception.ServiceException;
 import com.ylx.common.exception.ServiceException;
+import com.ylx.common.utils.DictUtils;
 import com.ylx.common.utils.StringUtils;
 import com.ylx.common.utils.StringUtils;
 import com.ylx.massage.domain.vo.TFareSettingVo;
 import com.ylx.massage.domain.vo.TFareSettingVo;
 import com.ylx.massage.mapper.TFareSettingMapper;
 import com.ylx.massage.mapper.TFareSettingMapper;
 import com.ylx.massage.domain.TFareSetting;
 import com.ylx.massage.domain.TFareSetting;
-import com.ylx.system.service.ISysDictTypeService;
 import io.jsonwebtoken.lang.Collections;
 import io.jsonwebtoken.lang.Collections;
 import lombok.extern.slf4j.Slf4j;
 import lombok.extern.slf4j.Slf4j;
-import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.stereotype.Service;
 import com.ylx.massage.service.TFareSettingService;
 import com.ylx.massage.service.TFareSettingService;
 
 
+import java.time.LocalDateTime;
 import java.time.LocalTime;
 import java.time.LocalTime;
 import java.time.format.DateTimeParseException;
 import java.time.format.DateTimeParseException;
 import java.util.Calendar;
 import java.util.Calendar;
@@ -36,9 +36,6 @@ import java.util.stream.Collectors;
 public class TFareSettingServiceImpl extends ServiceImpl<TFareSettingMapper, TFareSetting> implements TFareSettingService {
 public class TFareSettingServiceImpl extends ServiceImpl<TFareSettingMapper, TFareSetting> implements TFareSettingService {
     private static final String DAY_TIME = "day_time";
     private static final String DAY_TIME = "day_time";
 
 
-    @Autowired
-    private ISysDictTypeService dictTypeService;
-
     @Override
     @Override
     public boolean add(TFareSetting tFareSetting) {
     public boolean add(TFareSetting tFareSetting) {
         //判断部门重复设置
         //判断部门重复设置
@@ -84,9 +81,9 @@ public class TFareSettingServiceImpl extends ServiceImpl<TFareSettingMapper, TFa
      * @return
      * @return
      */
      */
     @Override
     @Override
-    public TFareSettingVo getFareSetting(String userbookingTime, String cityCode) {
+    public TFareSettingVo getFareSetting(LocalDateTime userbookingTime, String cityCode) {
         // 参数校验
         // 参数校验
-        if (StringUtils.isBlank(userbookingTime) || StringUtils.isBlank(cityCode)) {
+        if (ObjectUtil.isNull(userbookingTime) || StringUtils.isBlank(cityCode)) {
             throw new IllegalArgumentException("预约时间和城市编码不能为空");
             throw new IllegalArgumentException("预约时间和城市编码不能为空");
         }
         }
 
 
@@ -97,18 +94,12 @@ public class TFareSettingServiceImpl extends ServiceImpl<TFareSettingMapper, TFa
         }
         }
 
 
         // 解析预约时间
         // 解析预约时间
-        Date bookingDate;
-        try {
-            // 假设格式为 yyyy-MM-dd HH:mm:ss,可根据实际调整
-            bookingDate = DateUtil.parse(userbookingTime, "yyyy-MM-dd HH:mm:ss");
-        } catch (Exception e) {
-            throw new IllegalArgumentException("预约时间格式错误");
-        }
+        Date bookingDate = DateUtil.date(userbookingTime);;
         Calendar cal = Calendar.getInstance();
         Calendar cal = Calendar.getInstance();
         cal.setTime(bookingDate);
         cal.setTime(bookingDate);
         LocalTime bookingTime = LocalTime.of(cal.get(Calendar.HOUR_OF_DAY), cal.get(Calendar.MINUTE));
         LocalTime bookingTime = LocalTime.of(cal.get(Calendar.HOUR_OF_DAY), cal.get(Calendar.MINUTE));
         // 定义白天时间段(比如 6:00 - 22:00),读取字典表配置
         // 定义白天时间段(比如 6:00 - 22:00),读取字典表配置
-        List<SysDictData> dataDayTimes = dictTypeService.selectDictDataByType(DAY_TIME);
+        List<SysDictData> dataDayTimes = DictUtils.getSortedDictCache(DAY_TIME);
         if (dataDayTimes == null || dataDayTimes.size() < 2) {
         if (dataDayTimes == null || dataDayTimes.size() < 2) {
             throw new IllegalStateException("白天时段字典配置缺失,请检查 dat_time 类型");
             throw new IllegalStateException("白天时段字典配置缺失,请检查 dat_time 类型");
         }
         }