用户扫码记录

This commit is contained in:
attiya 2025-08-01 10:38:41 +08:00
parent e79a4762dc
commit f8b201102f
8 changed files with 151 additions and 11 deletions

View File

@ -6,6 +6,7 @@ import com.cdzy.common.model.JsonResult;
import com.ebike.feign.component.FeignTokenInterceptor;
import com.ebike.feign.config.ExampleFeignConfiguration;
import com.ebike.feign.model.res.ResFeignOrderPaymentDto;
import com.ebike.feign.model.rsp.FeignRideRecord;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
@ -89,4 +90,12 @@ public interface OrdersFeignClient {
@GetMapping("userOrders/failRefund")
JsonResult<?> failRefund(@RequestParam("orderId")Long orderId);
/**
* 车辆扫码记录
* @param bikeId 车辆ID
* @return @ {@code 200} 成功{@code 500} 失败
*/
@GetMapping("userOrders/getRideRecord")
JsonResult<List<FeignRideRecord>> getRideRecord(@RequestParam("bikeId")String bikeId);
}

View File

@ -0,0 +1,28 @@
package com.ebike.feign.model.rsp;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.time.LocalDateTime;
/**
* @author attiya
* @since 2025-08-01
*/
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class FeignRideRecord {
private LocalDateTime rideTime;
private String ridePoint;
private String userName;
private String phone;
}

View File

@ -4,15 +4,17 @@ import com.alibaba.fastjson2.JSONObject;
import com.cdzy.common.model.EcuSnDto;
import com.cdzy.common.model.JsonResult;
import com.cdzy.common.model.ResGPSDto;
import com.cdzy.common.utils.ConvertUtil;
import com.cdzy.ebikemaintenance.model.dto.request.*;
import com.cdzy.ebikemaintenance.model.dto.response.*;
import com.cdzy.ebikemaintenance.model.pojo.*;
import com.cdzy.ebikemaintenance.service.*;
import com.cdzy.common.utils.ConvertUtil;
import com.cdzy.ebikemaintenance.utils.MinioUtil;
import com.cdzy.ebikemaintenance.utils.RedisUtil;
import com.ebike.feign.clients.OrdersFeignClient;
import com.ebike.feign.model.res.ReqEcuSnDto;
import com.ebike.feign.model.rsp.EbikeBikeBaseInfo;
import com.ebike.feign.model.rsp.FeignRideRecord;
import com.ebike.feign.model.rsp.RspBikeInfo;
import com.mybatisflex.core.paginate.Page;
import com.mybatisflex.core.query.QueryWrapper;
@ -20,7 +22,6 @@ import com.mybatisflex.core.update.UpdateChain;
import jakarta.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
@ -46,6 +47,9 @@ public class EbikeBikeInfoController {
@Resource
private EbikeBikeInfoService ebikeBikeInfoService;
@Resource
private OrdersFeignClient ordersFeignClient;
@Resource
private EbikeEcuInfoService ebikeEcuInfoService;
@ -622,7 +626,7 @@ public class EbikeBikeInfoController {
try {
return JsonResult.success(ebikeBikeInfoService.getOrientationInfo(reqEbikeGetBikeDetailsDto));
} catch (Exception e) {
log.error("getOrientationInfo===>" + e.getMessage() + Arrays.toString(e.getStackTrace()));
log.error("getOrientationInfo===>{}{}", e.getMessage(), Arrays.toString(e.getStackTrace()));
return JsonResult.failed("获取信息失败");
}
}
@ -912,7 +916,7 @@ public class EbikeBikeInfoController {
return JsonResult.success();
}
;
/**
* 根据车辆id将车辆设置为待使用状态
@ -929,5 +933,16 @@ public class EbikeBikeInfoController {
return JsonResult.success();
}
;
/**
* 根据车辆id将车辆设置为待使用状态
*
* @param bikeId 车辆id
* @return 结果
*/
@GetMapping("getRideRecord")
JsonResult<?> getRideRecord(@RequestParam("bikeId") String bikeId) {
JsonResult<List<FeignRideRecord>> rideRecord = ordersFeignClient.getRideRecord(bikeId);
return JsonResult.success(rideRecord.getData());
}
}

View File

@ -12,6 +12,7 @@ import com.cdzy.orders.model.dto.res.RspOrderDetailsUserList;
import com.cdzy.orders.model.entity.EbikeUserOrders;
import com.cdzy.orders.service.UserOrdersService;
import com.ebike.feign.model.res.ResFeignOrderPaymentDto;
import com.ebike.feign.model.rsp.FeignRideRecord;
import com.mybatisflex.core.paginate.Page;
import com.mybatisflex.core.query.QueryWrapper;
import jakarta.annotation.Resource;
@ -291,9 +292,18 @@ public class EbikeUserOrdersController {
*/
@GetMapping("getRefundOrderInfo/{orderId}")
public JsonResult<?> getRefundOrderInfo(@PathVariable("orderId") String orderId) {
EbikeUserOrders userOrders = userOrdersService.getById(orderId);
return JsonResult.success(userOrders);
}
/**
* 获取车辆扫码记录
* @param bikeId 车辆id
* @return 结果
*/
@GetMapping("getRideRecord")
public JsonResult<?> getRideRecord(@RequestParam("bikeId") String bikeId) {
List<FeignRideRecord> record = userOrdersService.getRideRecord(bikeId);
return JsonResult.success(record);
}
}

View File

@ -10,6 +10,7 @@ import com.cdzy.orders.model.dto.res.RspOrderDetailsInfo;
import com.cdzy.orders.model.dto.res.RspOrderDetailsUserList;
import com.cdzy.orders.model.entity.EbikeUserOrders;
import com.ebike.feign.model.res.ResFeignOrderPaymentDto;
import com.ebike.feign.model.rsp.FeignRideRecord;
import com.mybatisflex.core.service.IService;
import java.math.BigDecimal;
@ -144,4 +145,11 @@ public interface UserOrdersService extends IService<EbikeUserOrders> {
* @return 站点列表
*/
JsonResult<?> siteRegionList(ReqSiteDto siteDto);
/**
* 获取车辆扫码记录
* @param bikeId 车辆id
* @return 扫码记录
*/
List<FeignRideRecord> getRideRecord(String bikeId);
}

View File

@ -1,12 +1,19 @@
package com.cdzy.orders.service.impl;
import com.alibaba.fastjson2.JSON;
import com.alibaba.fastjson2.JSONObject;
import com.cdp.product.security.context.SecurityContext;
import com.cdp.product.security.exception.DecryptFailureException;
import com.cdp.product.security.exception.EncryptFailureException;
import com.cdp.product.security.exception.SignFailureException;
import com.cdp.product.security.strategyImpl.SM2StrategyImpl;
import com.cdzy.common.enums.Code;
import com.cdzy.common.model.EcuSnDto;
import com.cdzy.common.model.JsonResult;
import com.cdzy.common.model.ReqBatchRegionDto;
import com.cdzy.common.model.ResGPSDto;
import com.cdzy.orders.component.EbikeCoreHandler;
import com.cdzy.orders.config.RealNameVerifyConfig;
import com.cdzy.orders.enums.*;
import com.cdzy.orders.mapper.EbikeOrderDetailsMapper;
import com.cdzy.orders.mapper.UserOrdersMapper;
@ -20,6 +27,7 @@ import com.cdzy.orders.service.UserOrdersService;
import com.cdzy.orders.uitls.NumberUtils;
import com.cdzy.orders.uitls.RedisUtil;
import com.cdzy.orders.uitls.TimeUtils;
import com.cdzy.orders.uitls.VerifyUtil;
import com.ebike.feign.clients.MaintenanceFeignClient;
import com.ebike.feign.clients.OperateFeignClient;
import com.ebike.feign.model.res.ResFeignEbikeSysRcostsetDto;
@ -31,17 +39,17 @@ import com.mybatisflex.core.keygen.impl.SnowFlakeIDKeyGenerator;
import com.mybatisflex.core.query.QueryWrapper;
import com.mybatisflex.spring.service.impl.ServiceImpl;
import jakarta.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
import okhttp3.OkHttpClient;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.io.IOException;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.*;
import java.util.concurrent.CompletableFuture;
import java.util.function.Function;
import java.util.stream.Collectors;
@ -49,6 +57,8 @@ import java.util.stream.Collectors;
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.EbikeUserOrdersTableDef.EBIKE_USER_ORDERS;
import static com.cdzy.orders.model.entity.table.EbikeUserRealinfoTableDef.EBIKE_USER_REALINFO;
import static com.cdzy.orders.model.entity.table.EbikeUserTableDef.EBIKE_USER;
/**
* 用户订单表 服务层实现
@ -56,6 +66,7 @@ import static com.cdzy.orders.model.entity.table.EbikeUserOrdersTableDef.EBIKE_U
* @author attiya
* @since 2025-03-28
*/
@Slf4j
@Service
public class UserOrdersServiceImpl extends ServiceImpl<UserOrdersMapper, EbikeUserOrders> implements UserOrdersService {
@ -80,8 +91,13 @@ public class UserOrdersServiceImpl extends ServiceImpl<UserOrdersMapper, EbikeUs
@Resource
EbikePaymentService paymentService;
@Resource
private VerifyUtil verifyUtil;
private static final SnowFlakeIDKeyGenerator snowFlakeIDKeyGenerator = new SnowFlakeIDKeyGenerator();
@Override
@Transactional
public Long saveRide(ReqOrderDto orderDto) {
@ -733,4 +749,43 @@ public class UserOrdersServiceImpl extends ServiceImpl<UserOrdersMapper, EbikeUs
}
return operateFeignClient.selectSiteListByOperationRegionId(Long.valueOf(operationId));
}
@Override
public List<FeignRideRecord> getRideRecord(String bikeId) {
QueryWrapper queryWrapper = QueryWrapper.create()
.select(
EBIKE_USER_ORDERS.START_TIME.as(FeignRideRecord::getRideTime),
EBIKE_USER_ORDERS.RIDE_POINT.as(FeignRideRecord::getRidePoint),
EBIKE_USER_REALINFO.USER_REAL_NAME.as(FeignRideRecord::getUserName),
EBIKE_USER.MOBILE.as(FeignRideRecord::getPhone)
)
.from(EBIKE_USER_ORDERS)
.where(EBIKE_USER_ORDERS.BIKE_ID.eq(bikeId))
.leftJoin(EBIKE_USER).on(EBIKE_USER.USER_ID.eq(EBIKE_USER_ORDERS.USER_ID))
.leftJoin(EBIKE_USER_REALINFO).on(EBIKE_USER_REALINFO.USER_ID.eq(EBIKE_USER_ORDERS.USER_ID));
List<FeignRideRecord> records = userOrdersMapper.selectListByQueryAs(queryWrapper, FeignRideRecord.class);
for (FeignRideRecord record : records) {
try {
String realName = verifyUtil.decryptRealName(record.getUserName());
record.setUserName(maskString(realName,'*'));
} catch (DecryptFailureException e) {
log.error("结果解密失败", e);
throw new RuntimeException("结果解密失败");
}
}
return records;
}
/**
* 将字符串除首位外的字符替换为指定字符
*/
public static String maskString(String str, char maskChar) {
if (str == null || str.isEmpty()) {
return str; // 返回空或null值
}
// 创建掩码字符串首字符 + 重复的掩码字符
return str.charAt(0) +
String.valueOf(maskChar).repeat(str.length() - 1);
}
}

View File

@ -306,4 +306,12 @@ public class VerifyUtil {
}
return secureComponent;
}
/**
* 解密用户真名
* @return 真名
*/
public String decryptRealName(String name) throws DecryptFailureException {
return securityContext.decrypt(name,privateKey);
}
}

View File

@ -10,6 +10,7 @@ import com.cdzy.orders.mapper.UserOrdersMapper;
import com.cdzy.orders.model.dto.res.ResOperationInAllDto;
import com.cdzy.orders.model.dto.res.TimeSegment;
import com.cdzy.orders.model.entity.EbikeUserOrders;
import com.cdzy.orders.service.UserOrdersService;
import com.cdzy.orders.uitls.RedisUtil;
import com.ebike.feign.clients.OperateFeignClient;
import com.ebike.feign.model.res.ResFeignEbikeSysRcostsetDto;
@ -155,4 +156,10 @@ class EbikeOrdersApplicationTests {
System.out.println("成功");
}
@Test
void check() {
boolean checked = redisUtil.isPointInOperation(103.915756, 30.572008, 258106438092689409L, 275024268783185920L);
System.out.println("是否在运营区内:" + checked);
}
}