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 com.cdzy.common.model.JsonResult;
import com.cdzy.common.model.PageParam;
import com.cdzy.ebikeoperate.enums.EbikeRegionInOperation;
import com.cdzy.ebikeoperate.enums.RegionLevelType;
import com.cdzy.ebikeoperate.mapper.EbikeOperationRegionMapper;
import com.cdzy.ebikeoperate.mapper.EbikePointMapper;
import com.cdzy.ebikeoperate.mapper.EbikeSiteImagesMapper;
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.ReqSiteRegionDto;
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_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_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);
}
@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 {
QueryWrapper queryWrapper = QueryWrapper.create()
.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.cdzy.common.enums.Code;
import com.cdzy.common.model.JsonResult;
import com.cdzy.common.model.ReqBatchRegionDto;
import com.cdzy.common.model.ResGPSDto;
import com.cdzy.common.utils.ConvertUtil;
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.UserOrdersMapper;
import com.cdzy.orders.model.dto.req.*;
import com.cdzy.orders.model.dto.res.RedisPoint;
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.dto.res.*;
import com.cdzy.orders.model.entity.EbikeOrderDetails;
import com.cdzy.orders.model.entity.EbikeUser;
import com.cdzy.orders.model.entity.EbikeUserOrders;
@ -127,7 +125,7 @@ public class UserOrdersServiceImpl extends ServiceImpl<UserOrdersMapper, EbikeUs
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);
userOrders.setBikeId(bikeInfoDto.getBikeId());
@ -173,7 +171,7 @@ public class UserOrdersServiceImpl extends ServiceImpl<UserOrdersMapper, EbikeUs
ResFeignEbikeSysRcostsetDto feignEbikeSysRcostsetDto = operateJsonResult.getData();
//费用计算
costCalculation(feignEbikeSysRcostsetDto, resGpsDto, regionDto, userOrders,Boolean.TRUE);
costCalculation(feignEbikeSysRcostsetDto, resGpsDto, regionDto, userOrders, Boolean.TRUE);
userOrdersMapper.update(userOrders);
//关锁,并且等待结果
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("关锁失败");
}
//添加还车单量
Long siteRegionId = redisUtil.isPointInSiteWithSiteRegionId(resGpsDto.getLongitude(), resGpsDto.getLatitude(),regionDto.getOperationRegionId());
Long siteRegionId = redisUtil.isPointInSiteWithSiteRegionId(resGpsDto.getLongitude(), resGpsDto.getLatitude(), regionDto.getOperationRegionId());
operateFeignClient.addReturn(siteRegionId);
return userOrders.getOrderId();
@ -304,6 +302,16 @@ public class UserOrdersServiceImpl extends ServiceImpl<UserOrdersMapper, EbikeUs
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
public void refund(Long orderId) {
QueryWrapper queryWrapper = QueryWrapper.create()
@ -324,6 +332,26 @@ public class UserOrdersServiceImpl extends ServiceImpl<UserOrdersMapper, EbikeUs
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
public RspOrderDetailsInfo orderDetailsInfo(Long orderId) {
return this.mapper.selectOneWithRelationsByIdAs(orderId, RspOrderDetailsInfo.class);
@ -355,7 +383,7 @@ public class UserOrdersServiceImpl extends ServiceImpl<UserOrdersMapper, EbikeUs
ResFeignEbikeSysRcostsetDto feignEbikeSysRcostsetDto = operateJsonResult.getData();
//费用计算
costCalculation(feignEbikeSysRcostsetDto, resGpsDto, regionDto, userOrders,Boolean.FALSE);
costCalculation(feignEbikeSysRcostsetDto, resGpsDto, regionDto, userOrders, Boolean.FALSE);
return userOrders.getTotalAmount();
}
@ -381,14 +409,14 @@ public class UserOrdersServiceImpl extends ServiceImpl<UserOrdersMapper, EbikeUs
//1-单次骑行 2-骑行卡购买 3-会员卡续费
switch (ot) {
case 1:
ebikePaymentDto.setGoodsTag("单次骑行");
break;
ebikePaymentDto.setGoodsTag("单次骑行");
break;
case 2:
ebikePaymentDto.setGoodsTag("骑行卡购买");
break;
ebikePaymentDto.setGoodsTag("骑行卡购买");
break;
case 3:
ebikePaymentDto.setGoodsTag("会员卡续费");
break;
ebikePaymentDto.setGoodsTag("会员卡续费");
break;
}
AmountDto amountDto = new AmountDto();
amountDto.setTotal(orderDetailsInfo.getActualAmount().doubleValue());
@ -432,7 +460,7 @@ public class UserOrdersServiceImpl extends ServiceImpl<UserOrdersMapper, EbikeUs
* @param regionDto 运营区域信息
* @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;
List<EbikeOrderDetails> list = new ArrayList<>();
//是否在运营区内
@ -473,7 +501,7 @@ public class UserOrdersServiceImpl extends ServiceImpl<UserOrdersMapper, EbikeUs
resGpsDto.setInOperation(pointInOperation);
resGpsDto.setInParking(pointInParking);
resGpsDto.setLatestTimestamp(System.currentTimeMillis());
redisUtil.set(resGpsDto.getEcuSn(),regionDto);
redisUtil.set(resGpsDto.getEcuSn(), regionDto);
//时长费用计算(已知超出免费时长
Character timeDivisionCharging = feignEbikeSysRcostsetDto.getTimeDivisionCharging();
BigDecimal decimal = switch (timeDivisionCharging) {
@ -490,7 +518,7 @@ public class UserOrdersServiceImpl extends ServiceImpl<UserOrdersMapper, EbikeUs
userOrders.setStatus(OrderStatus.PENDING_PAYMENT);
userOrders.setTotalAmount(totalAmount);
userOrders.setActualAmount(totalAmount);
if (orderDetailsCreate){
if (orderDetailsCreate) {
orderDetailsMapper.insertBatch(list);
}
}
@ -516,7 +544,7 @@ public class UserOrdersServiceImpl extends ServiceImpl<UserOrdersMapper, EbikeUs
LocalTime endTime = timePeriodDto.getEndTime();
LocalTime startupTime = timePeriodDto.getStartupTime();
boolean range = TimeUtils.isTimeWithinRange(localTime, startupTime, endTime);
if (range){
if (range) {
BigDecimal startupCost = timePeriodDto.getStartupCost();
Integer startupDuration = timePeriodDto.getStartupDuration();
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 {
decimal = defaultCostCalculation(list,userOrders,feignEbikeSysRcostsetDto,userOrders.getOrderId());
} else {
decimal = defaultCostCalculation(list, userOrders, feignEbikeSysRcostsetDto, userOrders.getOrderId());
}
return decimal;
}
@ -619,7 +647,7 @@ public class UserOrdersServiceImpl extends ServiceImpl<UserOrdersMapper, EbikeUs
/**
* 检查是否高峰时段
*
* @param start 骑行开始时间
* @param start 骑行开始时间
* @param feignEbikeSysRcostsetDto 计费规则
* @return 是否
*/
@ -630,7 +658,7 @@ public class UserOrdersServiceImpl extends ServiceImpl<UserOrdersMapper, EbikeUs
LocalTime endTime = timePeriodDto.getEndTime();
LocalTime startupTime = timePeriodDto.getStartupTime();
boolean range = TimeUtils.isTimeWithinRange(localTime, startupTime, endTime);
if (range){
if (range) {
return true;
}
}
@ -672,6 +700,7 @@ public class UserOrdersServiceImpl extends ServiceImpl<UserOrdersMapper, EbikeUs
}
return decimal;
}
/**
* 根据用户ID获取订单详情列表带分页
*
@ -679,21 +708,39 @@ public class UserOrdersServiceImpl extends ServiceImpl<UserOrdersMapper, EbikeUs
* @ 用户订单表详情
*/
@Override
public List<RspOrderDetailsUserList> orderDetailsUserList(ReqOrderDetailsDto params) {
public List<RspOrderDetailsUserList> orderDetailsUserList(ReqOrderDetailsDto params) {
String userId = params.getUserId().toString();
PageParam pageParam = params.getPageParam();
Integer pageNum= pageParam.getPageNum();
Integer pageSize= pageParam.getPageSize();
Integer pageNum = pageParam.getPageNum();
Integer pageSize = pageParam.getPageSize();
Integer offset = (pageNum - 1) * pageSize; // 计算OFFSET
List<RspOrderDetailsUserList> orderDetailsUserList = userOrdersMapper.getOrderDetailsUserList(userId,offset,pageSize);
List<RspOrderDetailsUserList> orderDetailsUserList = userOrdersMapper.getOrderDetailsUserList(userId, offset, pageSize);
return orderDetailsUserList;
}
@Override
public JsonResult<?> siteRegionList(ReqSiteDto siteDto) {
String operationId = redisUtil.isPointInAllOperationWithOperationId(siteDto.getLongitude(), siteDto.getLatitude());
public JsonResult<?> siteRegionList(ReqSiteDto siteDto) {
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) {
return JsonResult.success();
return JsonResult.success(List.of());
}
return operateFeignClient.selectSiteListByOperationRegionId(Long.valueOf(operationId));
}