xp-robotaxi-account-boot/src/main/java/com/xiaopeng/account/controller/XpAppUserController.java
@@ -1,5 +1,8 @@ package com.xiaopeng.account.controller; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.xiaopeng.account.mapper.XpPayFrontMapper; import com.xiaopeng.account.model.dto.CollectAddrDTO; import com.xiaopeng.account.service.IXpAppUserService; import com.xiaopeng.api.dto.payFront.CreditPaySignDto; @@ -9,11 +12,12 @@ import com.xiaopeng.api.dto.statistics.UserStatisticsDTO; import com.xiaopeng.api.feignClient.payFront.XpPayFrontClient; import com.xiaopeng.api.model.account.XpAppUser; import com.xiaopeng.api.model.account.XpPayFront; import com.xiaopeng.api.vo.payFront.CreditPaySignQueryVo; import com.xiaopeng.api.vo.payFront.CreditPaySignVo; import com.xiaopeng.api.vo.payFront.UnsignCreditPayVo; import com.xiaopeng.common.core.domain.R; import com.xiaopeng.common.core.utils.OrderCodeUtil; import com.xiaopeng.common.core.web.domain.BaseModel; import com.xiaopeng.unifiedverification.interceptor.XpClientCheck; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; @@ -45,6 +49,10 @@ @Resource private XpPayFrontClient xpPayFrontClient; @Resource private XpPayFrontMapper xpPayFrontMapper; /** * 获取用户统计数据(内部接口) @@ -136,6 +144,10 @@ R<CreditPaySignVo> creditPaySignVoR = xpPayFrontClient.creditPaySign(creditPaySignDto); if(creditPaySignVoR.getCode()==200){ CreditPaySignVo data = creditPaySignVoR.getData(); XpPayFront xpPayFront = new XpPayFront(); xpPayFront.setUserId(Long.valueOf(uid)); xpPayFront.setBusinessOrderId(OrderCodeUtil.getOrderCode("MMZF")); xpPayFrontMapper.insert(xpPayFront); return R.ok(data); } @@ -144,12 +156,24 @@ unsignCreditPayDto.setUid(Long.valueOf(uid)); unsignCreditPayDto.setBusinessId("xp-robotaxi"); unsignCreditPayDto.setCategory("009001"); unsignCreditPayDto.setBusinessOrderId(OrderCodeUtil.getOrderCode("MMZF")); String businessOrderId= null; // 查询用户开通的id List<XpPayFront> xpPayFronts = xpPayFrontMapper.selectList(new LambdaQueryWrapper<XpPayFront>().eq(XpPayFront::getUserId, Long.valueOf(uid)).orderByDesc(BaseModel::getCreateTime)); if(xpPayFronts.size()>0){ businessOrderId = xpPayFronts.get(0).getBusinessOrderId(); } if(businessOrderId==null){ return R.ok(); } unsignCreditPayDto.setBusinessOrderId(businessOrderId); unsignCreditPayDto.setPayType("13"); R<UnsignCreditPayVo> unsignCreditPayVoR = xpPayFrontClient.unsign(unsignCreditPayDto); R<?> unsignCreditPayVoR = xpPayFrontClient.unsign(unsignCreditPayDto); if(unsignCreditPayVoR.getCode()==200){ UnsignCreditPayVo data = unsignCreditPayVoR.getData(); return R.ok(data); // 移除信息 xpPayFrontMapper.delete(new LambdaQueryWrapper<XpPayFront>().eq(XpPayFront::getUserId, Long.valueOf(uid))); return R.ok(); } } xp-robotaxi-account-boot/src/main/java/com/xiaopeng/account/mapper/XpPayFrontMapper.java
New file @@ -0,0 +1,16 @@ package com.xiaopeng.account.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.xiaopeng.api.model.account.XpPayFront; /** * <p> * 用户免密支付记录 Mapper 接口 * </p> * * @author xiaopeng * @since 2026-05-14 */ public interface XpPayFrontMapper extends BaseMapper<XpPayFront> { } xp-robotaxi-account-boot/src/main/java/com/xiaopeng/account/service/IXpPayFrontService.java
New file @@ -0,0 +1,16 @@ package com.xiaopeng.account.service; import com.baomidou.mybatisplus.extension.service.IService; import com.xiaopeng.api.model.account.XpPayFront; /** * <p> * 用户免密支付记录 服务类 * </p> * * @author xiaopeng * @since 2026-05-14 */ public interface IXpPayFrontService extends IService<XpPayFront> { } xp-robotaxi-account-boot/src/main/java/com/xiaopeng/account/service/impl/XpPayFrontServiceImpl.java
New file @@ -0,0 +1,20 @@ package com.xiaopeng.account.service.impl; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.xiaopeng.account.mapper.XpPayFrontMapper; import com.xiaopeng.account.service.IXpPayFrontService; import com.xiaopeng.api.model.account.XpPayFront; import org.springframework.stereotype.Service; /** * <p> * 用户免密支付记录 服务实现类 * </p> * * @author xiaopeng * @since 2026-05-14 */ @Service public class XpPayFrontServiceImpl extends ServiceImpl<XpPayFrontMapper, XpPayFront> implements IXpPayFrontService { } xp-robotaxi-account-boot/src/main/resources/mapper/account/XpPayFrontMapper.xml
New file @@ -0,0 +1,9 @@ <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.xiaopeng.account.mapper.XpPayFrontMapper"> <sql id="Base_Column_List"> id, user_id, business_order_id, is_deleted, create_time, update_time, create_by, update_by </sql> </mapper> xp-robotaxi-api/src/main/java/com/xiaopeng/api/factory/payFront/XpPayFrontClientFallbackFactory.java
@@ -18,7 +18,6 @@ import com.xiaopeng.api.vo.payFront.CreditPaySignVo; import com.xiaopeng.api.vo.payFront.CreditPrecreateVo; import com.xiaopeng.api.vo.payFront.RefundVo; import com.xiaopeng.api.vo.payFront.UnsignCreditPayVo; import com.xiaopeng.common.core.domain.R; import lombok.extern.slf4j.Slf4j; import org.springframework.cloud.openfeign.FallbackFactory; @@ -78,7 +77,7 @@ } @Override public R<UnsignCreditPayVo> unsign(UnsignCreditPayDto dto) { public R<?> unsign(UnsignCreditPayDto dto) { return fail("credit pay unsign failed"); } xp-robotaxi-api/src/main/java/com/xiaopeng/api/feignClient/payFront/XpPayFrontClient.java
@@ -18,7 +18,6 @@ import com.xiaopeng.api.vo.payFront.CreditPaySignVo; import com.xiaopeng.api.vo.payFront.CreditPrecreateVo; import com.xiaopeng.api.vo.payFront.RefundVo; import com.xiaopeng.api.vo.payFront.UnsignCreditPayVo; import com.xiaopeng.common.core.domain.R; import com.xiaopeng.common.core.dto.ServiceNameConstantsEnum; import org.springframework.cloud.openfeign.FeignClient; @@ -63,5 +62,5 @@ R<CreditPrecreateVo> precreate(@RequestBody CreditPrecreateDto dto); @PostMapping("/logan/pay/creditPay/unsign") R<UnsignCreditPayVo> unsign(@RequestBody UnsignCreditPayDto dto); R<?> unsign(@RequestBody UnsignCreditPayDto dto); } xp-robotaxi-api/src/main/java/com/xiaopeng/api/model/account/XpPayFront.java
New file @@ -0,0 +1,38 @@ package com.xiaopeng.api.model.account; import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import com.xiaopeng.common.core.web.domain.BaseModel; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import lombok.EqualsAndHashCode; import lombok.experimental.Accessors; /** * <p> * 用户免密支付记录 * </p> * * @author xiaopeng * @since 2026-05-14 */ @Data @EqualsAndHashCode(callSuper = false) @Accessors(chain = true) @TableName("xp_pay_front") @ApiModel(value = "XpPayFront对象", description = "用户免密支付记录") public class XpPayFront extends BaseModel { private static final long serialVersionUID = 1L; @TableId(value = "id", type = IdType.ASSIGN_ID) private Long id; @ApiModelProperty(value = "用户ID") private Long userId; @ApiModelProperty(value = "开通免密的businessOrderId") private String businessOrderId; } xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/controller/XpInvoiceController.java
@@ -1,88 +1,23 @@ package com.xiaopeng.order.controller; import cn.afterturn.easypoi.excel.ExcelExportUtil; import cn.afterturn.easypoi.excel.entity.ExportParams; import cn.hutool.core.bean.BeanUtil; import com.alibaba.fastjson2.JSON; import com.alibaba.fastjson2.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.xiaopeng.api.dto.QueryOrderRouteDTO; import com.xiaopeng.api.dto.operation.LonLatDto; import com.xiaopeng.api.dto.order.GetOrderNumDto; import com.xiaopeng.api.dto.order.PopOrderDto; import com.xiaopeng.api.dto.order.UpdateInvoiceStatusDto; import com.xiaopeng.api.dto.statistics.OrderStatisticsDTO; import com.xiaopeng.api.dto.statistics.StatisticsQueryDTO; import com.xiaopeng.api.dto.vehicleConvoy.BaseVehicleUserDto; import com.xiaopeng.api.feignClient.account.SysGroupMenuClient; import com.xiaopeng.api.feignClient.operation.XpWhiteListClient; import com.xiaopeng.api.feignClient.vehicleConvoy.VehicleMacClient; import com.xiaopeng.api.feignClient.vehicleConvoy.XpVehicleClient; import com.xiaopeng.api.model.operation.XpOfficialPartner; import com.xiaopeng.api.model.operation.XpWhitelist; import com.xiaopeng.api.model.order.XpOrder; import com.xiaopeng.api.model.vehicleConvoy.XpVehicle; import com.xiaopeng.api.query.order.InvoiceOrdersQuery; import com.xiaopeng.api.query.order.XpOrderInvoiceQuery; import com.xiaopeng.api.vo.operation.NavigationVo; import com.xiaopeng.api.vo.operation.NearestNextVo; import com.xiaopeng.api.vo.operation.RouteVo; import com.xiaopeng.api.vo.order.*; import com.xiaopeng.api.vo.vehicleConvoy.GetBleInfoVo; import com.xiaopeng.api.vo.order.XpInvoiceVo; import com.xiaopeng.common.core.domain.R; import com.xiaopeng.common.core.exception.ServiceException; import com.xiaopeng.common.core.utils.StringUtils; import com.xiaopeng.common.core.utils.WebUtils; import com.xiaopeng.common.core.web.page.PageInfo; import com.xiaopeng.common.redis.service.RedisService; import com.xiaopeng.common.security.service.TokenService; import com.xiaopeng.order.dto.OrderNavigationDto; import com.xiaopeng.order.mangodb.model.OrderTrajectory; import com.xiaopeng.order.model.dto.XpOrderCommentDto; import com.xiaopeng.order.model.dto.XpOrderOperateDTO; import com.xiaopeng.order.model.dto.XpOrderPayDto; import com.xiaopeng.order.model.dto.XpOrderReassignDTO; import com.xiaopeng.order.model.exportExcel.XpOrderExportExcel; import com.xiaopeng.order.model.query.XpHistoryOrderListQuery; import com.xiaopeng.order.model.query.XpOrderExcelQuery; import com.xiaopeng.order.model.query.XpOrderPageQuery; import com.xiaopeng.order.model.vo.XpOrderDetailVO; import com.xiaopeng.order.model.vo.XpOrderHistoryVO; import com.xiaopeng.order.model.vo.XpOrderPageVO; import com.xiaopeng.order.service.IXpOrderService; import com.xiaopeng.order.vo.BluetoothTokenVo; import com.xiaopeng.order.vo.OrderDetailVo; import com.xiaopeng.order.vo.UpdateOrderStatusVo; import com.xiaopeng.order.vo.XpOrderInfoVo; import com.xiaopeng.unifiedverification.interceptor.XpClientCheck; import io.swagger.annotations.*; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import lombok.RequiredArgsConstructor; import org.apache.poi.ss.usermodel.Workbook; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Lazy; import org.springframework.data.domain.Sort; import org.springframework.data.mongodb.core.MongoTemplate; import org.springframework.data.mongodb.core.query.Criteria; import org.springframework.data.mongodb.core.query.Query; import org.springframework.util.CollectionUtils; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RestController; import javax.annotation.Resource; import javax.servlet.ServletOutputStream; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.validation.Valid; import java.io.IOException; import java.math.BigDecimal; import java.math.RoundingMode; import java.net.URLEncoder; import java.time.LocalDateTime; import java.time.ZoneOffset; import java.util.*; import java.util.stream.Collectors; import java.util.List; /** * <p> xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/service/impl/XpOrderServiceImpl.java
@@ -4769,18 +4769,22 @@ @Override public List<XpInvoiceVo> invoiceList(XpOrderInvoiceQuery query) { // 格式:yyyyMM 转yyyy-MM query.setStartTime(query.getStartTime().substring(0, 4) + "-" + query.getStartTime().substring(4, 6)); query.setEndTime(query.getEndTime().substring(0, 4) + "-" + query.getEndTime().substring(4, 6)); DateTimeFormatter monthFormatter = DateTimeFormatter.ofPattern("yyyyMM"); LocalDateTime startTime = YearMonth.parse(query.getStartTime(), monthFormatter) .atDay(1) .atStartOfDay(); LocalDateTime endTime = YearMonth.parse(query.getEndTime(), monthFormatter) .atEndOfMonth() .atTime(23, 59, 59); List<XpOrder> list =null; // 通过uid 和时间查出来数据 先判断是否传入了分页 if (query.getPageNo()!=null && query.getPageSize()!=null) { Page<XpOrder> page = new Page<>(query.getPageNo(), query.getPageSize()); Page<XpOrder> orderPage = this.baseMapper.selectPage(page, new LambdaQueryWrapper<XpOrder>().eq(XpOrder::getAppUserId, Long.valueOf(query.getUid())).ge(XpOrder::getStatus, 9).between(BaseModel::getCreateTime, query.getStartTime(), query.getEndTime())); Page<XpOrder> orderPage = this.baseMapper.selectPage(page, new LambdaQueryWrapper<XpOrder>().eq(XpOrder::getAppUserId, Long.valueOf(query.getUid())).ge(XpOrder::getStatus, 9).between(BaseModel::getCreateTime, startTime, endTime)); list = orderPage.getRecords(); }else { list = this.baseMapper.selectList(new LambdaQueryWrapper<XpOrder>().eq(XpOrder::getAppUserId, Long.valueOf(query.getUid())).ge(XpOrder::getStatus, 9).between(BaseModel::getCreateTime, query.getStartTime(), query.getEndTime())); list = this.baseMapper.selectList(new LambdaQueryWrapper<XpOrder>().eq(XpOrder::getAppUserId, Long.valueOf(query.getUid())).ge(XpOrder::getStatus, 9).between(BaseModel::getCreateTime, startTime, endTime)); } if(list.isEmpty()){