Compare commits

...

2 Commits

Author SHA1 Message Date
bd05aaa23a Merge remote-tracking branch 'origin/main'
# Conflicts:
#	ebike-operate/src/main/java/com/cdzy/ebikeoperate/service/impl/EbikeSiteRegionServiceImpl.java
#	ebike-orders/src/main/java/com/cdzy/orders/service/impl/UserOrdersServiceImpl.java
2025-05-20 14:51:24 +08:00
fe1f19a2b1 用户端:所在运营区内的全部站点(运营中 2025-05-20 14:46:01 +08:00
2 changed files with 89 additions and 31 deletions

View File

@ -3,12 +3,13 @@ package com.cdzy.ebikeoperate.service.impl;
import cn.dev33.satoken.stp.StpUtil; import cn.dev33.satoken.stp.StpUtil;
import com.cdzy.common.model.JsonResult; import com.cdzy.common.model.JsonResult;
import com.cdzy.common.model.PageParam; import com.cdzy.common.model.PageParam;
import com.cdzy.ebikeoperate.enums.EbikeRegionInOperation;
import com.cdzy.ebikeoperate.enums.RegionLevelType; import com.cdzy.ebikeoperate.enums.RegionLevelType;
import com.cdzy.ebikeoperate.mapper.EbikeOperationRegionMapper; import com.cdzy.ebikeoperate.mapper.EbikeOperationRegionMapper;
import com.cdzy.ebikeoperate.mapper.EbikePointMapper; import com.cdzy.ebikeoperate.mapper.EbikePointMapper;
import com.cdzy.ebikeoperate.mapper.EbikeSiteImagesMapper; import com.cdzy.ebikeoperate.mapper.EbikeSiteImagesMapper;
import com.cdzy.ebikeoperate.mapper.EbikeSiteRegionMapper; import com.cdzy.ebikeoperate.mapper.EbikeSiteRegionMapper;
import com.cdzy.ebikeoperate.model.dto.request.ReqBatchRegionDto; import com.cdzy.common.model.ReqBatchRegionDto;
import com.cdzy.ebikeoperate.model.dto.request.ReqEbikePointDto; import com.cdzy.ebikeoperate.model.dto.request.ReqEbikePointDto;
import com.cdzy.ebikeoperate.model.dto.request.ReqSiteRegionDto; import com.cdzy.ebikeoperate.model.dto.request.ReqSiteRegionDto;
import com.cdzy.ebikeoperate.model.dto.response.ResEbikeSiteRegionInfoDto; import com.cdzy.ebikeoperate.model.dto.response.ResEbikeSiteRegionInfoDto;
@ -147,10 +148,20 @@ public class EbikeSiteRegionServiceImpl extends ServiceImpl<EbikeSiteRegionMappe
.leftJoin(EBIKE_REGION_LEVEL).on(EBIKE_REGION_LEVEL.LEVEL_VALUE.eq(EBIKE_SITE_REGION.SITE_LEVEL)) .leftJoin(EBIKE_REGION_LEVEL).on(EBIKE_REGION_LEVEL.LEVEL_VALUE.eq(EBIKE_SITE_REGION.SITE_LEVEL))
.leftJoin(EBIKE_SITE_TYPE).on(EBIKE_SITE_TYPE.SITE_TYPE_VALUE.eq(EBIKE_SITE_REGION.SITE_LEVEL)) .leftJoin(EBIKE_SITE_TYPE).on(EBIKE_SITE_TYPE.SITE_TYPE_VALUE.eq(EBIKE_SITE_REGION.SITE_LEVEL))
.where(EBIKE_REGION_LEVEL.LEVEL_TYPE.eq(RegionLevelType.SITE)) .where(EBIKE_REGION_LEVEL.LEVEL_TYPE.eq(RegionLevelType.SITE))
.where(EBIKE_OPERATION_REGION.OPERATION_REGION_ID.eq(operationRegionId, Objects.nonNull(operationRegionId))); .where(EBIKE_OPERATION_REGION.OPERATION_REGION_ID.eq(operationRegionId, Objects.nonNull(operationRegionId)))
.where(EBIKE_OPERATION_REGION.IN_OPERATION.eq(EbikeRegionInOperation.IN));
return this.mapper.selectListWithRelationsByQueryAs(queryWrapper,ResEbikeSiteRegionPageDto.class); return this.mapper.selectListWithRelationsByQueryAs(queryWrapper,ResEbikeSiteRegionPageDto.class);
} }
@Override
public List<Long> getInOperationIds(List<Long> operationRegionIds){
QueryWrapper queryWrapper = QueryWrapper.create()
.select(EBIKE_OPERATION_REGION.OPERATION_REGION_ID)
.where(EBIKE_OPERATION_REGION.OPERATION_REGION_ID.in(operationRegionIds))
.where(EBIKE_OPERATION_REGION.IN_OPERATION.eq(EbikeRegionInOperation.IN));
return operationRegionMapper.selectListByQueryAs(queryWrapper,Long.class);
}
private void delImages(Long siteRegionId) throws Exception { private void delImages(Long siteRegionId) throws Exception {
QueryWrapper queryWrapper = QueryWrapper.create() QueryWrapper queryWrapper = QueryWrapper.create()
.where(EBIKE_SITE_IMAGES.SITE_REGION_ID.eq(siteRegionId)); .where(EBIKE_SITE_IMAGES.SITE_REGION_ID.eq(siteRegionId));

View File

@ -3,6 +3,7 @@ package com.cdzy.orders.service.impl;
import com.alibaba.fastjson2.JSONObject; import com.alibaba.fastjson2.JSONObject;
import com.cdzy.common.enums.Code; import com.cdzy.common.enums.Code;
import com.cdzy.common.model.JsonResult; import com.cdzy.common.model.JsonResult;
import com.cdzy.common.model.ReqBatchRegionDto;
import com.cdzy.common.model.ResGPSDto; import com.cdzy.common.model.ResGPSDto;
import com.cdzy.common.utils.ConvertUtil; import com.cdzy.common.utils.ConvertUtil;
import com.cdzy.orders.component.EbikeCoreHandler; import com.cdzy.orders.component.EbikeCoreHandler;
@ -10,10 +11,7 @@ import com.cdzy.orders.enums.*;
import com.cdzy.orders.mapper.EbikeOrderDetailsMapper; import com.cdzy.orders.mapper.EbikeOrderDetailsMapper;
import com.cdzy.orders.mapper.UserOrdersMapper; import com.cdzy.orders.mapper.UserOrdersMapper;
import com.cdzy.orders.model.dto.req.*; import com.cdzy.orders.model.dto.req.*;
import com.cdzy.orders.model.dto.res.RedisPoint; import com.cdzy.orders.model.dto.res.*;
import com.cdzy.orders.model.dto.res.RspBikeDto;
import com.cdzy.orders.model.dto.res.RspOrderDetailsInfo;
import com.cdzy.orders.model.dto.res.RspOrderDetailsUserList;
import com.cdzy.orders.model.entity.EbikeOrderDetails; import com.cdzy.orders.model.entity.EbikeOrderDetails;
import com.cdzy.orders.model.entity.EbikeUser; import com.cdzy.orders.model.entity.EbikeUser;
import com.cdzy.orders.model.entity.EbikeUserOrders; import com.cdzy.orders.model.entity.EbikeUserOrders;
@ -127,7 +125,7 @@ public class UserOrdersServiceImpl extends ServiceImpl<UserOrdersMapper, EbikeUs
throw new RuntimeException("开锁失败"); throw new RuntimeException("开锁失败");
} }
//添加借车单量 //添加借车单量
Long siteRegionId = redisUtil.isPointInSiteWithSiteRegionId(resGpsDto.getLongitude(), resGpsDto.getLatitude(),regionDto.getOperationRegionId()); Long siteRegionId = redisUtil.isPointInSiteWithSiteRegionId(resGpsDto.getLongitude(), resGpsDto.getLatitude(), regionDto.getOperationRegionId());
operateFeignClient.addBorrowing(siteRegionId); operateFeignClient.addBorrowing(siteRegionId);
userOrders.setBikeId(bikeInfoDto.getBikeId()); userOrders.setBikeId(bikeInfoDto.getBikeId());
@ -173,7 +171,7 @@ public class UserOrdersServiceImpl extends ServiceImpl<UserOrdersMapper, EbikeUs
ResFeignEbikeSysRcostsetDto feignEbikeSysRcostsetDto = operateJsonResult.getData(); ResFeignEbikeSysRcostsetDto feignEbikeSysRcostsetDto = operateJsonResult.getData();
//费用计算 //费用计算
costCalculation(feignEbikeSysRcostsetDto, resGpsDto, regionDto, userOrders,Boolean.TRUE); costCalculation(feignEbikeSysRcostsetDto, resGpsDto, regionDto, userOrders, Boolean.TRUE);
userOrdersMapper.update(userOrders); userOrdersMapper.update(userOrders);
//关锁,并且等待结果 //关锁,并且等待结果
CompletableFuture<String> stringCompletableFuture = ebikeCoreHandler.executeCommand(ecuInfo, CmdCode.LOCK, Long.valueOf(bikeInfoDto.getBikeId()), userId); CompletableFuture<String> stringCompletableFuture = ebikeCoreHandler.executeCommand(ecuInfo, CmdCode.LOCK, Long.valueOf(bikeInfoDto.getBikeId()), userId);
@ -183,7 +181,7 @@ public class UserOrdersServiceImpl extends ServiceImpl<UserOrdersMapper, EbikeUs
throw new RuntimeException("关锁失败"); throw new RuntimeException("关锁失败");
} }
//添加还车单量 //添加还车单量
Long siteRegionId = redisUtil.isPointInSiteWithSiteRegionId(resGpsDto.getLongitude(), resGpsDto.getLatitude(),regionDto.getOperationRegionId()); Long siteRegionId = redisUtil.isPointInSiteWithSiteRegionId(resGpsDto.getLongitude(), resGpsDto.getLatitude(), regionDto.getOperationRegionId());
operateFeignClient.addReturn(siteRegionId); operateFeignClient.addReturn(siteRegionId);
return userOrders.getOrderId(); return userOrders.getOrderId();
@ -304,6 +302,16 @@ public class UserOrdersServiceImpl extends ServiceImpl<UserOrdersMapper, EbikeUs
return redisUtil.isPointInParking(resGpsDto.getLongitude(), resGpsDto.getLatitude(), regionDto.getOperationRegionId()); return redisUtil.isPointInParking(resGpsDto.getLongitude(), resGpsDto.getLatitude(), regionDto.getOperationRegionId());
} }
@Override
public void refundApply(Long orderId) {
QueryWrapper queryWrapper = QueryWrapper.create()
.where(EBIKE_USER_ORDERS.ORDER_ID.eq(orderId))
.where(EBIKE_USER_ORDERS.STATUS.eq(OrderStatus.PAID));
EbikeUserOrders userOrders = this.mapper.selectOneByQuery(queryWrapper);
userOrders.setStatus(OrderStatus.REFUND_APPLYING);
this.mapper.update(userOrders);
}
@Override @Override
public void refund(Long orderId) { public void refund(Long orderId) {
QueryWrapper queryWrapper = QueryWrapper.create() QueryWrapper queryWrapper = QueryWrapper.create()
@ -324,6 +332,26 @@ public class UserOrdersServiceImpl extends ServiceImpl<UserOrdersMapper, EbikeUs
this.mapper.update(userOrders); this.mapper.update(userOrders);
} }
@Override
public void rejectRefund(Long orderId) {
QueryWrapper queryWrapper = QueryWrapper.create()
.where(EBIKE_USER_ORDERS.ORDER_ID.eq(orderId))
.where(EBIKE_USER_ORDERS.STATUS.eq(OrderStatus.REFUNDING));
EbikeUserOrders userOrders = this.mapper.selectOneByQuery(queryWrapper);
userOrders.setStatus(OrderStatus.REFUND_REJECTED);
this.mapper.update(userOrders);
}
@Override
public void failRefund(Long orderId) {
QueryWrapper queryWrapper = QueryWrapper.create()
.where(EBIKE_USER_ORDERS.ORDER_ID.eq(orderId))
.where(EBIKE_USER_ORDERS.STATUS.eq(OrderStatus.REFUNDING));
EbikeUserOrders userOrders = this.mapper.selectOneByQuery(queryWrapper);
userOrders.setStatus(OrderStatus.REFUND_FAILED);
this.mapper.update(userOrders);
}
@Override @Override
public RspOrderDetailsInfo orderDetailsInfo(Long orderId) { public RspOrderDetailsInfo orderDetailsInfo(Long orderId) {
return this.mapper.selectOneWithRelationsByIdAs(orderId, RspOrderDetailsInfo.class); return this.mapper.selectOneWithRelationsByIdAs(orderId, RspOrderDetailsInfo.class);
@ -355,7 +383,7 @@ public class UserOrdersServiceImpl extends ServiceImpl<UserOrdersMapper, EbikeUs
ResFeignEbikeSysRcostsetDto feignEbikeSysRcostsetDto = operateJsonResult.getData(); ResFeignEbikeSysRcostsetDto feignEbikeSysRcostsetDto = operateJsonResult.getData();
//费用计算 //费用计算
costCalculation(feignEbikeSysRcostsetDto, resGpsDto, regionDto, userOrders,Boolean.FALSE); costCalculation(feignEbikeSysRcostsetDto, resGpsDto, regionDto, userOrders, Boolean.FALSE);
return userOrders.getTotalAmount(); return userOrders.getTotalAmount();
} }
@ -381,14 +409,14 @@ public class UserOrdersServiceImpl extends ServiceImpl<UserOrdersMapper, EbikeUs
//1-单次骑行 2-骑行卡购买 3-会员卡续费 //1-单次骑行 2-骑行卡购买 3-会员卡续费
switch (ot) { switch (ot) {
case 1: case 1:
ebikePaymentDto.setGoodsTag("单次骑行"); ebikePaymentDto.setGoodsTag("单次骑行");
break; break;
case 2: case 2:
ebikePaymentDto.setGoodsTag("骑行卡购买"); ebikePaymentDto.setGoodsTag("骑行卡购买");
break; break;
case 3: case 3:
ebikePaymentDto.setGoodsTag("会员卡续费"); ebikePaymentDto.setGoodsTag("会员卡续费");
break; break;
} }
AmountDto amountDto = new AmountDto(); AmountDto amountDto = new AmountDto();
amountDto.setTotal(orderDetailsInfo.getActualAmount().doubleValue()); amountDto.setTotal(orderDetailsInfo.getActualAmount().doubleValue());
@ -432,7 +460,7 @@ public class UserOrdersServiceImpl extends ServiceImpl<UserOrdersMapper, EbikeUs
* @param regionDto 运营区域信息 * @param regionDto 运营区域信息
* @param userOrders 订单信息 * @param userOrders 订单信息
*/ */
void costCalculation(ResFeignEbikeSysRcostsetDto feignEbikeSysRcostsetDto, ResGPSDto resGpsDto, FeignEbikeRegionDto regionDto, EbikeUserOrders userOrders,boolean orderDetailsCreate) { void costCalculation(ResFeignEbikeSysRcostsetDto feignEbikeSysRcostsetDto, ResGPSDto resGpsDto, FeignEbikeRegionDto regionDto, EbikeUserOrders userOrders, boolean orderDetailsCreate) {
BigDecimal totalAmount = BigDecimal.ZERO; BigDecimal totalAmount = BigDecimal.ZERO;
List<EbikeOrderDetails> list = new ArrayList<>(); List<EbikeOrderDetails> list = new ArrayList<>();
//是否在运营区内 //是否在运营区内
@ -473,7 +501,7 @@ public class UserOrdersServiceImpl extends ServiceImpl<UserOrdersMapper, EbikeUs
resGpsDto.setInOperation(pointInOperation); resGpsDto.setInOperation(pointInOperation);
resGpsDto.setInParking(pointInParking); resGpsDto.setInParking(pointInParking);
resGpsDto.setLatestTimestamp(System.currentTimeMillis()); resGpsDto.setLatestTimestamp(System.currentTimeMillis());
redisUtil.set(resGpsDto.getEcuSn(),regionDto); redisUtil.set(resGpsDto.getEcuSn(), regionDto);
//时长费用计算(已知超出免费时长 //时长费用计算(已知超出免费时长
Character timeDivisionCharging = feignEbikeSysRcostsetDto.getTimeDivisionCharging(); Character timeDivisionCharging = feignEbikeSysRcostsetDto.getTimeDivisionCharging();
BigDecimal decimal = switch (timeDivisionCharging) { BigDecimal decimal = switch (timeDivisionCharging) {
@ -490,7 +518,7 @@ public class UserOrdersServiceImpl extends ServiceImpl<UserOrdersMapper, EbikeUs
userOrders.setStatus(OrderStatus.PENDING_PAYMENT); userOrders.setStatus(OrderStatus.PENDING_PAYMENT);
userOrders.setTotalAmount(totalAmount); userOrders.setTotalAmount(totalAmount);
userOrders.setActualAmount(totalAmount); userOrders.setActualAmount(totalAmount);
if (orderDetailsCreate){ if (orderDetailsCreate) {
orderDetailsMapper.insertBatch(list); orderDetailsMapper.insertBatch(list);
} }
} }
@ -516,7 +544,7 @@ public class UserOrdersServiceImpl extends ServiceImpl<UserOrdersMapper, EbikeUs
LocalTime endTime = timePeriodDto.getEndTime(); LocalTime endTime = timePeriodDto.getEndTime();
LocalTime startupTime = timePeriodDto.getStartupTime(); LocalTime startupTime = timePeriodDto.getStartupTime();
boolean range = TimeUtils.isTimeWithinRange(localTime, startupTime, endTime); boolean range = TimeUtils.isTimeWithinRange(localTime, startupTime, endTime);
if (range){ if (range) {
BigDecimal startupCost = timePeriodDto.getStartupCost(); BigDecimal startupCost = timePeriodDto.getStartupCost();
Integer startupDuration = timePeriodDto.getStartupDuration(); Integer startupDuration = timePeriodDto.getStartupDuration();
EbikeOrderDetails startupCostDetails = new EbikeOrderDetails(userOrders.getOrderId(), OrderDetailsType.TRAVEL_EXPENSES_DURING_PEAK_HOURS, "高峰时段起步费用", startupCost, JSONObject.toJSONString(feignEbikeSysRcostsetDto), null, LocalDateTime.now()); EbikeOrderDetails startupCostDetails = new EbikeOrderDetails(userOrders.getOrderId(), OrderDetailsType.TRAVEL_EXPENSES_DURING_PEAK_HOURS, "高峰时段起步费用", startupCost, JSONObject.toJSONString(feignEbikeSysRcostsetDto), null, LocalDateTime.now());
@ -540,8 +568,8 @@ public class UserOrdersServiceImpl extends ServiceImpl<UserOrdersMapper, EbikeUs
} }
} }
} }
}else { } else {
decimal = defaultCostCalculation(list,userOrders,feignEbikeSysRcostsetDto,userOrders.getOrderId()); decimal = defaultCostCalculation(list, userOrders, feignEbikeSysRcostsetDto, userOrders.getOrderId());
} }
return decimal; return decimal;
} }
@ -619,7 +647,7 @@ public class UserOrdersServiceImpl extends ServiceImpl<UserOrdersMapper, EbikeUs
/** /**
* 检查是否高峰时段 * 检查是否高峰时段
* *
* @param start 骑行开始时间 * @param start 骑行开始时间
* @param feignEbikeSysRcostsetDto 计费规则 * @param feignEbikeSysRcostsetDto 计费规则
* @return 是否 * @return 是否
*/ */
@ -630,7 +658,7 @@ public class UserOrdersServiceImpl extends ServiceImpl<UserOrdersMapper, EbikeUs
LocalTime endTime = timePeriodDto.getEndTime(); LocalTime endTime = timePeriodDto.getEndTime();
LocalTime startupTime = timePeriodDto.getStartupTime(); LocalTime startupTime = timePeriodDto.getStartupTime();
boolean range = TimeUtils.isTimeWithinRange(localTime, startupTime, endTime); boolean range = TimeUtils.isTimeWithinRange(localTime, startupTime, endTime);
if (range){ if (range) {
return true; return true;
} }
} }
@ -672,6 +700,7 @@ public class UserOrdersServiceImpl extends ServiceImpl<UserOrdersMapper, EbikeUs
} }
return decimal; return decimal;
} }
/** /**
* 根据用户ID获取订单详情列表带分页 * 根据用户ID获取订单详情列表带分页
* *
@ -679,21 +708,39 @@ public class UserOrdersServiceImpl extends ServiceImpl<UserOrdersMapper, EbikeUs
* @ 用户订单表详情 * @ 用户订单表详情
*/ */
@Override @Override
public List<RspOrderDetailsUserList> orderDetailsUserList(ReqOrderDetailsDto params) { public List<RspOrderDetailsUserList> orderDetailsUserList(ReqOrderDetailsDto params) {
String userId = params.getUserId().toString(); String userId = params.getUserId().toString();
PageParam pageParam = params.getPageParam(); PageParam pageParam = params.getPageParam();
Integer pageNum= pageParam.getPageNum(); Integer pageNum = pageParam.getPageNum();
Integer pageSize= pageParam.getPageSize(); Integer pageSize = pageParam.getPageSize();
Integer offset = (pageNum - 1) * pageSize; // 计算OFFSET Integer offset = (pageNum - 1) * pageSize; // 计算OFFSET
List<RspOrderDetailsUserList> orderDetailsUserList = userOrdersMapper.getOrderDetailsUserList(userId,offset,pageSize); List<RspOrderDetailsUserList> orderDetailsUserList = userOrdersMapper.getOrderDetailsUserList(userId, offset, pageSize);
return orderDetailsUserList; return orderDetailsUserList;
} }
@Override @Override
public JsonResult<?> siteRegionList(ReqSiteDto siteDto) { public JsonResult<?> siteRegionList(ReqSiteDto siteDto) {
String operationId = redisUtil.isPointInAllOperationWithOperationId(siteDto.getLongitude(), siteDto.getLatitude()); List<ResOperationInAllDto> area = redisUtil.findNearbyAreaByOperationInAll(siteDto.getLongitude(), siteDto.getLatitude());
List<Long> ids = area.stream().map(dto -> {
String areaId = dto.getAreaId();
return Long.valueOf(areaId);
}).toList();
JsonResult<List<Long>> jsonResult = operateFeignClient.operationRegionIdFilter(new ReqBatchRegionDto(ids));
if (jsonResult.getCode() != Code.SUCCESS) {
throw new RuntimeException("获取运营区信息错误");
}
List<Long> data = jsonResult.getData();
if (data == null || !data.isEmpty()) {
return JsonResult.success(List.of());
}
List<ResOperationInAllDto> list = area.stream().filter(dto -> {
String areaId = dto.getAreaId();
Long aLong = Long.valueOf(areaId);
return data.contains(aLong);
}).toList();
String operationId = redisUtil.isPointInAllOperationWithOperationId(siteDto.getLongitude(), siteDto.getLatitude(),list);
if (operationId == null) { if (operationId == null) {
return JsonResult.success(); return JsonResult.success(List.of());
} }
return operateFeignClient.selectSiteListByOperationRegionId(Long.valueOf(operationId)); return operateFeignClient.selectSiteListByOperationRegionId(Long.valueOf(operationId));
} }