diff --git a/ebike-feign/src/main/java/com/ebike/feign/clients/OrdersFeignClient.java b/ebike-feign/src/main/java/com/ebike/feign/clients/OrdersFeignClient.java index fccbee11..0586687d 100644 --- a/ebike-feign/src/main/java/com/ebike/feign/clients/OrdersFeignClient.java +++ b/ebike-feign/src/main/java/com/ebike/feign/clients/OrdersFeignClient.java @@ -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> getRideRecord(@RequestParam("bikeId")String bikeId); + } diff --git a/ebike-feign/src/main/java/com/ebike/feign/model/rsp/FeignRideRecord.java b/ebike-feign/src/main/java/com/ebike/feign/model/rsp/FeignRideRecord.java new file mode 100644 index 00000000..2b29f28d --- /dev/null +++ b/ebike-feign/src/main/java/com/ebike/feign/model/rsp/FeignRideRecord.java @@ -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; + +} diff --git a/ebike-maintenance/src/main/java/com/cdzy/ebikemaintenance/controller/EbikeBikeInfoController.java b/ebike-maintenance/src/main/java/com/cdzy/ebikemaintenance/controller/EbikeBikeInfoController.java index 6d53139f..787a8a13 100644 --- a/ebike-maintenance/src/main/java/com/cdzy/ebikemaintenance/controller/EbikeBikeInfoController.java +++ b/ebike-maintenance/src/main/java/com/cdzy/ebikemaintenance/controller/EbikeBikeInfoController.java @@ -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> rideRecord = ordersFeignClient.getRideRecord(bikeId); + return JsonResult.success(rideRecord.getData()); + } } diff --git a/ebike-orders/src/main/java/com/cdzy/orders/controller/EbikeUserOrdersController.java b/ebike-orders/src/main/java/com/cdzy/orders/controller/EbikeUserOrdersController.java index 629e340c..5fb77be7 100644 --- a/ebike-orders/src/main/java/com/cdzy/orders/controller/EbikeUserOrdersController.java +++ b/ebike-orders/src/main/java/com/cdzy/orders/controller/EbikeUserOrdersController.java @@ -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 record = userOrdersService.getRideRecord(bikeId); + return JsonResult.success(record); + } } diff --git a/ebike-orders/src/main/java/com/cdzy/orders/service/UserOrdersService.java b/ebike-orders/src/main/java/com/cdzy/orders/service/UserOrdersService.java index 9d70f3d6..2cb6e129 100644 --- a/ebike-orders/src/main/java/com/cdzy/orders/service/UserOrdersService.java +++ b/ebike-orders/src/main/java/com/cdzy/orders/service/UserOrdersService.java @@ -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 { * @return 站点列表 */ JsonResult siteRegionList(ReqSiteDto siteDto); + + /** + * 获取车辆扫码记录 + * @param bikeId 车辆id + * @return 扫码记录 + */ + List getRideRecord(String bikeId); } diff --git a/ebike-orders/src/main/java/com/cdzy/orders/service/impl/UserOrdersServiceImpl.java b/ebike-orders/src/main/java/com/cdzy/orders/service/impl/UserOrdersServiceImpl.java index 56827f36..9d5ee40e 100644 --- a/ebike-orders/src/main/java/com/cdzy/orders/service/impl/UserOrdersServiceImpl.java +++ b/ebike-orders/src/main/java/com/cdzy/orders/service/impl/UserOrdersServiceImpl.java @@ -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 implements UserOrdersService { @@ -80,8 +91,13 @@ public class UserOrdersServiceImpl extends ServiceImpl 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 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); + } } diff --git a/ebike-orders/src/main/java/com/cdzy/orders/uitls/VerifyUtil.java b/ebike-orders/src/main/java/com/cdzy/orders/uitls/VerifyUtil.java index 954f5753..fc3d52c1 100644 --- a/ebike-orders/src/main/java/com/cdzy/orders/uitls/VerifyUtil.java +++ b/ebike-orders/src/main/java/com/cdzy/orders/uitls/VerifyUtil.java @@ -306,4 +306,12 @@ public class VerifyUtil { } return secureComponent; } + + /** + * 解密用户真名 + * @return 真名 + */ + public String decryptRealName(String name) throws DecryptFailureException { + return securityContext.decrypt(name,privateKey); + } } diff --git a/ebike-orders/src/test/java/com/cdzy/orders/EbikeOrdersApplicationTests.java b/ebike-orders/src/test/java/com/cdzy/orders/EbikeOrdersApplicationTests.java index d75fed34..0e1b58b7 100644 --- a/ebike-orders/src/test/java/com/cdzy/orders/EbikeOrdersApplicationTests.java +++ b/ebike-orders/src/test/java/com/cdzy/orders/EbikeOrdersApplicationTests.java @@ -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); + } + }