From 5c863676b014e5ae2fa601d89a83160b6e7a6c07 Mon Sep 17 00:00:00 2001
From: “mitao” <“2763622819@qq.com”>
Date: 星期五, 15 五月 2026 18:07:26 +0800
Subject: [PATCH] Merge remote-tracking branch 'origin/1.1' into 1.1

---
 xp-robotaxi-api/src/main/java/com/xiaopeng/api/feignClient/order/XpOrderClient.java                  |    6 
 xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/service/IXpOrderService.java                 |    9 
 xp-robotaxi-account-boot/src/main/resources/mapper/account/XpPayFrontMapper.xml                      |    9 
 xp-robotaxi-api/src/main/java/com/xiaopeng/api/model/account/XpPayFront.java                         |   38 +++
 xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/controller/XpOrderController.java            |   64 +++--
 xp-robotaxi-account-boot/src/main/java/com/xiaopeng/account/mapper/XpPayFrontMapper.java             |   16 +
 xp-robotaxi-order-boot/src/main/resources/mapper/order/XpOrderMapper.xml                             |    2 
 xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/service/impl/XpOrderServiceImpl.java         |   89 ++++++-
 xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/controller/XpInvoiceController.java          |   79 ------
 xp-robotaxi-account-boot/src/main/java/com/xiaopeng/account/service/IXpPayFrontService.java          |   16 +
 xp-robotaxi-api/src/main/java/com/xiaopeng/api/dto/payFront/CreditOrderQueryDto.java                 |    4 
 xp-robotaxi-api/src/main/java/com/xiaopeng/api/factory/order/XpOrderClientFallbackFactory.java       |    6 
 xp-robotaxi-api/src/main/java/com/xiaopeng/api/model/order/XpOrder.java                              |    9 
 xp-robotaxi-itinerary-boot/src/main/java/com/xiaopeng/itinerary/controller/XpPricingController.java  |   13 +
 xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/utils/TaskOrderSendSmsUtil.java              |  107 +++++++++
 xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/model/vo/XpOrderHistoryListVO.java           |    2 
 xp-robotaxi-account-boot/src/main/java/com/xiaopeng/account/controller/XpAppUserController.java      |   94 ++++++++
 xp-robotaxi-api/src/main/java/com/xiaopeng/api/feignClient/payFront/XpPayFrontClient.java            |    6 
 xp-robotaxi-api/src/main/java/com/xiaopeng/api/factory/payFront/XpPayFrontClientFallbackFactory.java |    3 
 xp-robotaxi-account-boot/src/main/java/com/xiaopeng/account/controller/TokenController.java          |    2 
 xp-robotaxi-account-boot/src/main/java/com/xiaopeng/account/service/impl/XpPayFrontServiceImpl.java  |   20 +
 xp-robotaxi-api/src/main/java/com/xiaopeng/api/vo/order/OrderStatusFromOrderIdVo.java                |   12 +
 22 files changed, 475 insertions(+), 131 deletions(-)

diff --git a/xp-robotaxi-account-boot/src/main/java/com/xiaopeng/account/controller/TokenController.java b/xp-robotaxi-account-boot/src/main/java/com/xiaopeng/account/controller/TokenController.java
index ddf48c7..3189b93 100644
--- a/xp-robotaxi-account-boot/src/main/java/com/xiaopeng/account/controller/TokenController.java
+++ b/xp-robotaxi-account-boot/src/main/java/com/xiaopeng/account/controller/TokenController.java
@@ -154,7 +154,7 @@
     @PostMapping("/maintenance-app/base/v1/getVerificationCode")
     public R<?> verificationCodeLogin(@RequestBody AppLoginGetCodeDTO appLoginPasswordDTO) {
         if (StringUtils.isBlank(appLoginPasswordDTO.getPhoneNumber())) {
-            return R.fail("璐﹀彿涓嶅瓨鍦?");
+            return R.fail("手机号不能为空!");
         }
         XpOperationsUser xpOperationsUser = xpOperationsUserService.lambdaQuery()
                 .in(XpOperationsUser::getPhoneNumber, SensitiveDataCryptoUtil.queryValues(appLoginPasswordDTO.getPhoneNumber()))
diff --git a/xp-robotaxi-account-boot/src/main/java/com/xiaopeng/account/controller/XpAppUserController.java b/xp-robotaxi-account-boot/src/main/java/com/xiaopeng/account/controller/XpAppUserController.java
index 2c1deb8..7e7b0b2 100644
--- a/xp-robotaxi-account-boot/src/main/java/com/xiaopeng/account/controller/XpAppUserController.java
+++ b/xp-robotaxi-account-boot/src/main/java/com/xiaopeng/account/controller/XpAppUserController.java
@@ -1,11 +1,23 @@
 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;
+import com.xiaopeng.api.dto.payFront.CreditPaySignQueryDto;
+import com.xiaopeng.api.dto.payFront.UnsignCreditPayDto;
 import com.xiaopeng.api.dto.statistics.StatisticsQueryDTO;
 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.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;
@@ -34,6 +46,13 @@
 
     @Resource
     private IXpAppUserService xpAppUserService;
+
+    @Resource
+    private XpPayFrontClient xpPayFrontClient;
+
+
+    @Resource
+    private XpPayFrontMapper xpPayFrontMapper;
 
     /**
      * 获取用户统计数据(内部接口)
@@ -84,9 +103,25 @@
     public R<Boolean> appUserGetPayPwd(HttpServletRequest request) {
         // uid已通过拦截器otp校验,可以直接使用
         String uid = request.getHeader("XP-Uid");
-        //调用其他接口获取 免密结果 todo yyy
-        Boolean is = true;
-        return R.ok(is);
+        //调用其他接口获取 免密结果
+        Boolean signed = false;
+
+        CreditPaySignQueryDto creditPaySignQueryDto = new CreditPaySignQueryDto();
+        creditPaySignQueryDto.setUid(Long.valueOf(uid));
+        creditPaySignQueryDto.setBusinessId("xp-robotaxi");
+        creditPaySignQueryDto.setCategory("009001");
+        creditPaySignQueryDto.setBusinessOrderId(OrderCodeUtil.getOrderCode("MMZF"));
+        R<CreditPaySignQueryVo> creditPaySignQueryVoR = xpPayFrontClient.queryCreditPaySign(creditPaySignQueryDto);
+        if (creditPaySignQueryVoR.getCode()==200) {
+            CreditPaySignQueryVo data = creditPaySignQueryVoR.getData();
+            // 查看是否有签约的
+            long count = data.getSignList().stream().filter(e -> e.getStatus().equals("VALID")).count();
+            if (count > 0){
+                signed = true;
+            }
+        }
+
+        return R.ok(signed);
     }
 
     /**
@@ -95,12 +130,61 @@
     @PostMapping("/api/v1/mini-program/appUser/setPayPwd")
     @ApiOperation(value = "个人中心-设置免密结果", tags = {"小程序-设置免密结果"})
     @XpClientCheck(checkToken = false, checkOtpToken = true)
-    public R<?> appUserSetPayPwd(HttpServletRequest request) {
+    public R<?> appUserSetPayPwd(@RequestParam Integer status,HttpServletRequest request) {
         // uid已通过拦截器otp校验,可以直接使用
         String uid = request.getHeader("XP-Uid");
-        //调用其他接口设置免密结果 todo yyy
+        //调用其他接口设置免密结果
+        if(status==1){
+            CreditPaySignDto creditPaySignDto = new CreditPaySignDto();
+            creditPaySignDto.setUid(Long.valueOf(uid));
+            creditPaySignDto.setBusinessId("xp-robotaxi");
+            creditPaySignDto.setCategory("009001");
+            creditPaySignDto.setBusinessOrderId(OrderCodeUtil.getOrderCode("MMZF"));
+            creditPaySignDto.setPayType("13");
+            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);
+            }
+
+        }else {
+            UnsignCreditPayDto unsignCreditPayDto = new UnsignCreditPayDto();
+            unsignCreditPayDto.setUid(Long.valueOf(uid));
+            unsignCreditPayDto.setBusinessId("xp-robotaxi");
+            unsignCreditPayDto.setCategory("009001");
+
+
+            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<?> unsignCreditPayVoR = xpPayFrontClient.unsign(unsignCreditPayDto);
+            if(unsignCreditPayVoR.getCode()==200){
+                // 移除信息
+                xpPayFrontMapper.delete(new LambdaQueryWrapper<XpPayFront>().eq(XpPayFront::getUserId, Long.valueOf(uid)));
+                return R.ok();
+            }
+        }
+
         return R.ok();
     }
+
+
+
+
+
+
 //-----------------------------------------------app接口------------------------------------------
 
 }
diff --git a/xp-robotaxi-account-boot/src/main/java/com/xiaopeng/account/mapper/XpPayFrontMapper.java b/xp-robotaxi-account-boot/src/main/java/com/xiaopeng/account/mapper/XpPayFrontMapper.java
new file mode 100644
index 0000000..0d4f0e7
--- /dev/null
+++ b/xp-robotaxi-account-boot/src/main/java/com/xiaopeng/account/mapper/XpPayFrontMapper.java
@@ -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> {
+
+}
diff --git a/xp-robotaxi-account-boot/src/main/java/com/xiaopeng/account/service/IXpPayFrontService.java b/xp-robotaxi-account-boot/src/main/java/com/xiaopeng/account/service/IXpPayFrontService.java
new file mode 100644
index 0000000..cbabe9a
--- /dev/null
+++ b/xp-robotaxi-account-boot/src/main/java/com/xiaopeng/account/service/IXpPayFrontService.java
@@ -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> {
+
+}
diff --git a/xp-robotaxi-account-boot/src/main/java/com/xiaopeng/account/service/impl/XpPayFrontServiceImpl.java b/xp-robotaxi-account-boot/src/main/java/com/xiaopeng/account/service/impl/XpPayFrontServiceImpl.java
new file mode 100644
index 0000000..c02dc7e
--- /dev/null
+++ b/xp-robotaxi-account-boot/src/main/java/com/xiaopeng/account/service/impl/XpPayFrontServiceImpl.java
@@ -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 {
+
+}
diff --git a/xp-robotaxi-account-boot/src/main/resources/mapper/account/XpPayFrontMapper.xml b/xp-robotaxi-account-boot/src/main/resources/mapper/account/XpPayFrontMapper.xml
new file mode 100644
index 0000000..61cc6c7
--- /dev/null
+++ b/xp-robotaxi-account-boot/src/main/resources/mapper/account/XpPayFrontMapper.xml
@@ -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>
diff --git a/xp-robotaxi-api/src/main/java/com/xiaopeng/api/dto/payFront/CreditOrderQueryDto.java b/xp-robotaxi-api/src/main/java/com/xiaopeng/api/dto/payFront/CreditOrderQueryDto.java
index 868a7ed..d0f8881 100644
--- a/xp-robotaxi-api/src/main/java/com/xiaopeng/api/dto/payFront/CreditOrderQueryDto.java
+++ b/xp-robotaxi-api/src/main/java/com/xiaopeng/api/dto/payFront/CreditOrderQueryDto.java
@@ -12,7 +12,7 @@
 
     @ApiModelProperty(value = "业务方id")
     @NotBlank(message = "业务方id不能为空")
-    private String businessId;
+    private String businessId="xp-robotaxi";
 
     @ApiModelProperty(value = "业务方订单id")
     @NotBlank(message = "业务方订单id不能为空")
@@ -27,7 +27,7 @@
 
     @ApiModelProperty(value = "业务方类目,由支付中心分配")
     @NotBlank(message = "业务方类目不能为空")
-    private String category;
+    private String category="009001";
 
     @ApiModelProperty(value = "支付类型(芝麻后付or微信支付分),13: 微信支付分")
     @NotBlank(message = "支付类型不能为空")
diff --git a/xp-robotaxi-api/src/main/java/com/xiaopeng/api/factory/order/XpOrderClientFallbackFactory.java b/xp-robotaxi-api/src/main/java/com/xiaopeng/api/factory/order/XpOrderClientFallbackFactory.java
index 9398e17..33a8ac0 100644
--- a/xp-robotaxi-api/src/main/java/com/xiaopeng/api/factory/order/XpOrderClientFallbackFactory.java
+++ b/xp-robotaxi-api/src/main/java/com/xiaopeng/api/factory/order/XpOrderClientFallbackFactory.java
@@ -50,6 +50,12 @@
             }
 
             @Override
+            public R<Long> hasUnPayOrder(String uid) {
+                log.error("查询未支付订单失败,原因: {}", cause.getMessage());
+                return R.ok(0L);
+            }
+
+            @Override
             public R<XpOrder> queryOrderById(Long orderId) {
                 log.error("根据订单id查询订单信息查询失败,原因: {}", cause.getMessage());
                 return R.fail("根据订单id查询订单信息查询失败" + cause.getMessage());
diff --git a/xp-robotaxi-api/src/main/java/com/xiaopeng/api/factory/payFront/XpPayFrontClientFallbackFactory.java b/xp-robotaxi-api/src/main/java/com/xiaopeng/api/factory/payFront/XpPayFrontClientFallbackFactory.java
index 9b0cc1d..043e18c 100644
--- a/xp-robotaxi-api/src/main/java/com/xiaopeng/api/factory/payFront/XpPayFrontClientFallbackFactory.java
+++ b/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");
             }
 
diff --git a/xp-robotaxi-api/src/main/java/com/xiaopeng/api/feignClient/order/XpOrderClient.java b/xp-robotaxi-api/src/main/java/com/xiaopeng/api/feignClient/order/XpOrderClient.java
index bcb4ece..1eac4a0 100644
--- a/xp-robotaxi-api/src/main/java/com/xiaopeng/api/feignClient/order/XpOrderClient.java
+++ b/xp-robotaxi-api/src/main/java/com/xiaopeng/api/feignClient/order/XpOrderClient.java
@@ -43,6 +43,12 @@
     @PostMapping("/logan/inner/order/has-unpaid-order")
     R<Long> hasUnPaodOrder(@RequestParam String uid);
 
+    /**
+     * 查询是否有未支付订单
+     */
+    @PostMapping("/logan/inner/order/has-unpay-order")
+    R<Long> hasUnPayOrder(@RequestParam String uid);
+
 
     /**
      * 通过订单id查询订单信息
diff --git a/xp-robotaxi-api/src/main/java/com/xiaopeng/api/feignClient/payFront/XpPayFrontClient.java b/xp-robotaxi-api/src/main/java/com/xiaopeng/api/feignClient/payFront/XpPayFrontClient.java
index 9f9240b..2293388 100644
--- a/xp-robotaxi-api/src/main/java/com/xiaopeng/api/feignClient/payFront/XpPayFrontClient.java
+++ b/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;
@@ -35,9 +34,12 @@
         fallbackFactory = XpPayFrontClientFallbackFactory.class)
 public interface XpPayFrontClient {
 
+
+    // 微信支付分开通接口
     @PostMapping("/logan/pay/creditPay/sign")
     R<CreditPaySignVo> creditPaySign(@RequestBody CreditPaySignDto dto);
 
+    // 主动查询开通结果接口
     @PostMapping("/logan/pay/creditPay/sign/query")
     R<CreditPaySignQueryVo> queryCreditPaySign(@RequestBody CreditPaySignQueryDto dto);
 
@@ -60,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);
 }
diff --git a/xp-robotaxi-api/src/main/java/com/xiaopeng/api/model/account/XpPayFront.java b/xp-robotaxi-api/src/main/java/com/xiaopeng/api/model/account/XpPayFront.java
new file mode 100644
index 0000000..35df7f9
--- /dev/null
+++ b/xp-robotaxi-api/src/main/java/com/xiaopeng/api/model/account/XpPayFront.java
@@ -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;
+}
diff --git a/xp-robotaxi-api/src/main/java/com/xiaopeng/api/model/order/XpOrder.java b/xp-robotaxi-api/src/main/java/com/xiaopeng/api/model/order/XpOrder.java
index 19ce557..84dfef8 100644
--- a/xp-robotaxi-api/src/main/java/com/xiaopeng/api/model/order/XpOrder.java
+++ b/xp-robotaxi-api/src/main/java/com/xiaopeng/api/model/order/XpOrder.java
@@ -238,6 +238,10 @@
     @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
     private LocalDateTime tripEnd;
 
+    @ApiModelProperty(value = "短信发送状态 0=未发送 1=已发送")
+    @TableField("sms_status")
+    private Integer smsStatus;
+
 
     @ApiModelProperty(value = "队列名称")
     @TableField("queue_name")
@@ -273,4 +277,9 @@
     @ApiModelProperty(value = "发票id")
     @TableField("invoice_id")
     private String invoiceId;
+
+
+    @ApiModelProperty(value = "信用下单接口获取的支付中心授权单号(商户订单号)")
+    @TableField("auth_order_id")
+    private String authOrderId;
 }
diff --git a/xp-robotaxi-api/src/main/java/com/xiaopeng/api/vo/order/OrderStatusFromOrderIdVo.java b/xp-robotaxi-api/src/main/java/com/xiaopeng/api/vo/order/OrderStatusFromOrderIdVo.java
new file mode 100644
index 0000000..5426fbb
--- /dev/null
+++ b/xp-robotaxi-api/src/main/java/com/xiaopeng/api/vo/order/OrderStatusFromOrderIdVo.java
@@ -0,0 +1,12 @@
+package com.xiaopeng.api.vo.order;
+
+import io.swagger.annotations.ApiModel;
+import lombok.Data;
+
+@Data
+@ApiModel("订单支付状态VO")
+public class OrderStatusFromOrderIdVo {
+    private Long orderId;
+
+    private Integer status;
+}
diff --git a/xp-robotaxi-itinerary-boot/src/main/java/com/xiaopeng/itinerary/controller/XpPricingController.java b/xp-robotaxi-itinerary-boot/src/main/java/com/xiaopeng/itinerary/controller/XpPricingController.java
index 1812f23..60dd86a 100644
--- a/xp-robotaxi-itinerary-boot/src/main/java/com/xiaopeng/itinerary/controller/XpPricingController.java
+++ b/xp-robotaxi-itinerary-boot/src/main/java/com/xiaopeng/itinerary/controller/XpPricingController.java
@@ -7,6 +7,7 @@
 import com.xiaopeng.api.dto.map.RouteStaleCheckDto;
 import com.xiaopeng.api.dto.map.SelectNavigationRouteDto;
 import com.xiaopeng.api.dto.operation.LonLatDto;
+import com.xiaopeng.api.feignClient.order.XpOrderClient;
 import com.xiaopeng.api.model.operation.XpPricing;
 import com.xiaopeng.api.vo.HotFixInfoVo;
 import com.xiaopeng.api.vo.operation.MultiRouteAndFareVo;
@@ -52,13 +53,15 @@
     private final IXpGeoQueryEntityService xpGeoQueryEntityService;
     private final RedisService redisService;
     private final ImageTagProcessor imageTagProcessor;
+    private final XpOrderClient xpOrderClient;
 
 
-    public XpPricingController(XpPricingService xpPricingService, IXpGeoQueryEntityService xpGeoQueryEntityService, RedisService redisService, ImageTagProcessor imageTagProcessor) {
+    public XpPricingController(XpPricingService xpPricingService, IXpGeoQueryEntityService xpGeoQueryEntityService, RedisService redisService, ImageTagProcessor imageTagProcessor, XpOrderClient xpOrderClient) {
         this.xpPricingService = xpPricingService;
         this.xpGeoQueryEntityService = xpGeoQueryEntityService;
         this.redisService = redisService;
         this.imageTagProcessor = imageTagProcessor;
+        this.xpOrderClient = xpOrderClient;
     }
 
 
@@ -115,6 +118,14 @@
     @XpClientCheck(checkToken = false, checkOtpToken = true)
     public R<?> saveOrder(@RequestBody @Validated XpOrderDto dto, HttpServletRequest request) {
         String uid = request.getHeader("XP-Uid");
+        R<Long> hasOrderResult = xpOrderClient.hasUnPayOrder(uid);
+        if (hasOrderResult == null || R.isError(hasOrderResult)) {
+            return R.fail("订单状态查询失败");
+        }
+        Long existingOrderId = hasOrderResult.getData();
+        if (existingOrderId != null && existingOrderId > 0) {
+            return R.fail("有未支付订单");
+        }
         String orderId = xpPricingService.saveOrder(dto, uid);
         if(orderId==null){
             String language = request.getHeader("language");
diff --git a/xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/controller/XpInvoiceController.java b/xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/controller/XpInvoiceController.java
index cd8088a..18d8a00 100644
--- a/xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/controller/XpInvoiceController.java
+++ b/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>
diff --git a/xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/controller/XpOrderController.java b/xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/controller/XpOrderController.java
index 8c9a76e..d8ce167 100644
--- a/xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/controller/XpOrderController.java
+++ b/xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/controller/XpOrderController.java
@@ -151,6 +151,23 @@
     }
 
     /**
+     * 查询是否有未支付订单
+     * 返回0 可以下单,非0为未支付订单ID
+     */
+    @PostMapping("/logan/inner/order/has-unpay-order")
+    @ApiOperation(value = "查询是否有未支付订单", tags = {"内部接口"})
+    public R<Long> hasUnPayOrder(String uid) {
+        XpOrder order = xpOrderService.getOne(new LambdaQueryWrapper<XpOrder>()
+                .eq(XpOrder::getAppUserId, Long.parseLong(uid))
+                .eq(XpOrder::getStatus, 8)
+                .last("LIMIT 1"));
+        if (order != null) {
+            return R.ok(order.getId());
+        }
+        return R.ok(0L);
+    }
+
+    /**
      * 通过订单id查询订单信息
      *
      * @param orderId 订单id
@@ -281,12 +298,6 @@
      */
     @ApiOperation(value = "删除订单", tags = {"管理后台-交易管理-订单管理"})
     @DeleteMapping("/api/v1/order/deleteById")
-    @AdminOperationLog(
-            businessType = AdminBusinessType.ORDER_MANAGEMENT,
-            operationType = AdminOperationType.DELETE,
-            contentExpression = "'删除订单,id=' + #p0",
-            appendRequestData = false
-    )
     public R<?> deleteById(@ApiParam(value = "订单id", required = true) @RequestParam Long id) {
         xpOrderService.deleteOrder(id);
         return R.ok();
@@ -299,12 +310,6 @@
      */
     @ApiOperation(value = "订单导出", tags = {"管理后台-交易管理-订单管理"})
     @PostMapping("/api/v1/order/exportExcel")
-    @AdminOperationLog(
-            businessType = AdminBusinessType.ORDER_MANAGEMENT,
-            operationType = AdminOperationType.EXPORT,
-            content = "订单导出",
-            appendRequestData = true
-    )
     public void exportExcel(@RequestBody XpOrderExcelQuery query) {
         // 1. 查询导出数据
         List<XpOrderPageVO> dataList = xpOrderService.exportList(query);
@@ -346,12 +351,6 @@
      */
     @ApiOperation(value = "取消/关闭订单", tags = {"管理后台-交易管理-订单管理"})
     @PostMapping("/api/v1/order/cancelAndCloseById")
-    @AdminOperationLog(
-            businessType = AdminBusinessType.ORDER_MANAGEMENT,
-            operationType = AdminOperationType.EDIT,
-            content = "取消/关闭订单",
-            appendRequestData = true
-    )
     public R<?> cancelAndCloseById(@Validated @RequestBody XpOrderOperateDTO dto) {
         xpOrderService.cancelOrCloseOrder(dto.getOrderId(), dto.getType(),dto.getIsFree());
         return R.ok();
@@ -365,12 +364,6 @@
      */
     @ApiOperation(value = "改派订单", tags = {"管理后台-交易管理-订单管理"}, notes = "车辆列表在 vehicleConvoy.availableList 服务")
     @PostMapping("/api/v1/order/reassignById")
-    @AdminOperationLog(
-            businessType = AdminBusinessType.ORDER_MANAGEMENT,
-            operationType = AdminOperationType.EDIT,
-            content = "改派订单",
-            appendRequestData = true
-    )
     public R<?> reassignById(@Validated @RequestBody XpOrderReassignDTO dto) {
         xpOrderService.reassignOrder(
                 dto.getOrderId(),
@@ -387,12 +380,6 @@
             @ApiImplicitParam(name = "id", value = "订单ID", required = true, dataType = "Long"),
             @ApiImplicitParam(name = "amount", value = "新的订单金额", required = true, dataType = "BigDecimal")
     })
-    @AdminOperationLog(
-            businessType = AdminBusinessType.ORDER_MANAGEMENT,
-            operationType = AdminOperationType.EDIT,
-            contentExpression = "'订单改价,id=' + #p0 + ',amount=' + #p1",
-            appendRequestData = false
-    )
     public R<?> changeAmount(@RequestParam("id") Long id, @RequestParam("amount") BigDecimal amount) {
         xpOrderService.changeAmount(id, amount);
         return R.ok();
@@ -926,4 +913,21 @@
         XpOrderInfoVo xpOrderInfoVo = BeanUtil.copyProperties(xpOrder, XpOrderInfoVo.class);
         return R.ok(xpOrderInfoVo);
     }
+
+
+
+    @ApiOperation(value = "获取订单支付状态", tags = {"小程序-业务流程"})
+    @GetMapping("/api/v1/mini-program/order/queryOrderStatusFromOrderId")
+    @XpClientCheck(checkToken = false, checkOtpToken = true)
+    public R<OrderStatusFromOrderIdVo> queryOrderStatusFromOrderId(Long orderId) {
+
+        XpOrder order = xpOrderService.getById(orderId);
+
+        OrderStatusFromOrderIdVo orderStatusFromOrderIdVo = new OrderStatusFromOrderIdVo();
+        orderStatusFromOrderIdVo.setOrderId(order.getId());
+        orderStatusFromOrderIdVo.setStatus(order.getStatus());
+        return R.ok( xpOrderService.queryOrderStatusFromOrderId(orderId));
+
+    }
+
 }
diff --git a/xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/model/vo/XpOrderHistoryListVO.java b/xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/model/vo/XpOrderHistoryListVO.java
index 43aac79..6fe45d0 100644
--- a/xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/model/vo/XpOrderHistoryListVO.java
+++ b/xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/model/vo/XpOrderHistoryListVO.java
@@ -67,5 +67,7 @@
 
 
 
+    private Integer invoiceStatus;
+
 
 }
diff --git a/xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/service/IXpOrderService.java b/xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/service/IXpOrderService.java
index 5e4408c..6e7379f 100644
--- a/xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/service/IXpOrderService.java
+++ b/xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/service/IXpOrderService.java
@@ -301,4 +301,13 @@
      * @return
      */
     UserOrderInfoVo getOrderHistoryInfo(Long orderId);
+
+
+    /**
+     * 获取订单状态
+     * @param orderId
+     * @return
+     */
+    OrderStatusFromOrderIdVo queryOrderStatusFromOrderId(Long orderId);
+
 }
diff --git a/xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/service/impl/XpOrderServiceImpl.java b/xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/service/impl/XpOrderServiceImpl.java
index b587e5d..9849bf4 100644
--- a/xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/service/impl/XpOrderServiceImpl.java
+++ b/xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/service/impl/XpOrderServiceImpl.java
@@ -22,9 +22,7 @@
 import com.xiaopeng.api.dto.map.RouteAndFareDto;
 import com.xiaopeng.api.dto.operation.LonLatDto;
 import com.xiaopeng.api.dto.order.*;
-import com.xiaopeng.api.dto.payFront.CreditOrderCreateDto;
-import com.xiaopeng.api.dto.payFront.CreditPaySignQueryDto;
-import com.xiaopeng.api.dto.payFront.CreditPrecreateDto;
+import com.xiaopeng.api.dto.payFront.*;
 import com.xiaopeng.api.dto.pushMessage.SendMessageDTO;
 import com.xiaopeng.api.dto.statistics.DailyCountDTO;
 import com.xiaopeng.api.dto.statistics.OrderStatisticsDTO;
@@ -61,10 +59,8 @@
 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.payFront.CreditOrderCreateVo;
-import com.xiaopeng.api.vo.payFront.CreditPaySignQueryVo;
+import com.xiaopeng.api.vo.payFront.*;
 import com.xiaopeng.api.vo.order.FareBreakdownVo;
-import com.xiaopeng.api.vo.payFront.CreditPrecreateVo;
 import com.xiaopeng.api.vo.vehicleConvoy.AddTaxiPassengerVo;
 import com.xiaopeng.api.vo.vehicleConvoy.BluetoothDeliverVo;
 import com.xiaopeng.api.vo.vehicleConvoy.CancelTaxiPassengerVo;
@@ -78,6 +74,7 @@
 import com.xiaopeng.common.core.exception.ServiceException;
 import com.xiaopeng.common.core.utils.DateUtils;
 import com.xiaopeng.common.core.utils.GeodesyUtil;
+import com.xiaopeng.common.core.utils.OrderCodeUtil;
 import com.xiaopeng.common.core.utils.StringUtils;
 import com.xiaopeng.common.core.web.domain.BaseModel;
 import com.xiaopeng.common.core.web.page.PageInfo;
@@ -3327,6 +3324,8 @@
     public R payment(XpOrderPayDto dto, String uid) {
 
 
+        XpOrder order = this.getById(dto.getOrderId());
+
         HashMap<String, Object> resultMap = new HashMap<>();
 
         // 1.0 免密  //查询是否开通免密
@@ -3336,7 +3335,7 @@
         creditPaySignQueryDto.setUid(Long.valueOf(uid));
         creditPaySignQueryDto.setBusinessId("xp-robotaxi");
         creditPaySignQueryDto.setCategory("009001");
-        creditPaySignQueryDto.setBusinessOrderId("");
+        creditPaySignQueryDto.setBusinessOrderId(OrderCodeUtil.getOrderCode("MMZF"));
         R<CreditPaySignQueryVo> creditPaySignQueryVoR = xpPayFrontClient.queryCreditPaySign(creditPaySignQueryDto);
         if (creditPaySignQueryVoR.getCode()==200) {
             CreditPaySignQueryVo data = creditPaySignQueryVoR.getData();
@@ -3353,9 +3352,9 @@
             CreditOrderCreateDto creditOrderCreateDto = new CreditOrderCreateDto();
             creditOrderCreateDto.setUid(Long.valueOf(uid));
             creditOrderCreateDto.setBusinessId("xp-robotaxi");
-            creditOrderCreateDto.setCategory("xp_robotaxi_api");
+            creditOrderCreateDto.setCategory("009001");
             creditOrderCreateDto.setBusinessOrderId("");
-            creditOrderCreateDto.setSubject("009001");
+            creditOrderCreateDto.setSubject("小鹏集团|robotaxi");
             creditOrderCreateDto.setPayType("13");
 
 
@@ -3371,6 +3370,10 @@
                 CreditOrderCreateVo data = creditOrderCreateVoR.getData();
                 resultMap.put("status", 1);
                 resultMap.put("value", data);
+
+                order.setPayType(3);
+                order.setAuthOrderId(data.getAuthOrderId());
+
                 return R.ok(resultMap);
             }
 
@@ -3378,7 +3381,6 @@
 
             // 未签约
             // 调用预下单接口
-            XpOrder order = this.getById(dto.getOrderId());
             CreditPrecreateDto creditPrecreateDto = new CreditPrecreateDto();
             creditPrecreateDto.setUid(uid);
             creditPrecreateDto.setBizId("xp-robotaxi");
@@ -4705,6 +4707,59 @@
         return vo;
     }
 
+    /**
+     * 查询订单状态
+     * @param orderId
+     * @return
+     */
+    @Override
+    public OrderStatusFromOrderIdVo queryOrderStatusFromOrderId(Long orderId) {
+
+        XpOrder order = this.getById(orderId);
+        if(order==null){
+            return null;
+        }
+        if(order.getPayType()==3){
+            // 免密查询 如果成功则调用结算
+            CreditOrderQueryDto dto = new CreditOrderQueryDto();
+            dto.setBusinessOrderId(OrderCodeUtil.getOrderCode("MMZF"));
+            dto.setAuthOrderId(order.getAuthOrderId());
+            dto.setPayType("13");
+            R<CreditOrderQueryVo> creditOrderQueryVoR = xpPayFrontClient.queryCreditOrder(dto);
+            if(creditOrderQueryVoR.getCode()==200){
+                CreditOrderQueryVo creditOrderQueryVo = creditOrderQueryVoR.getData();
+                if(creditOrderQueryVo.getCreditOrderStatus().equals("DONE")){
+                    // 订单确认 需要吊起扣款
+                    CreditOrderWxPayDto creditOrderWxPayDto = new CreditOrderWxPayDto();
+                    creditOrderWxPayDto.setBusinessOrderId(OrderCodeUtil.getOrderCode("MMZF"));
+                    creditOrderWxPayDto.setAuthOrderId(order.getAuthOrderId());
+                    creditOrderWxPayDto.setPayCallbackUrl("13");
+                    creditOrderWxPayDto.setTotalAmount( order.getOrderMoney().multiply(BigDecimal.valueOf(100)).longValue());
+                    creditOrderWxPayDto.setSubject("小鹏集团|robotaxi");
+                    creditOrderWxPayDto.setPayType("13");
+
+                    List<CreditOrderCreateDto.PostPayment> postPayments = new ArrayList<>();
+                    CreditOrderCreateDto.PostPayment postPayment = new CreditOrderCreateDto.PostPayment();
+                    postPayment.setName("收费标准");
+                    postPayment.setDescription("行程价格动态浮动,具体详情可在费用详情或计价规则查看");
+                    postPayments.add(postPayment);
+                    creditOrderWxPayDto.setPostPayments(postPayments);
+                    R<CreditOrderWxPayVo> creditOrderWxPayVoR = xpPayFrontClient.creditOrderWxPay(creditOrderWxPayDto);
+                }else if(creditOrderQueryVo.getCreditOrderStatus().equals("CREATED") || creditOrderQueryVo.getCreditOrderStatus().equals("DOING")){
+
+                }
+            }
+
+        }else {
+            // 微信支付也需要查询下
+
+        }
+        OrderStatusFromOrderIdVo orderStatusFromOrderIdVo = new OrderStatusFromOrderIdVo();
+        orderStatusFromOrderIdVo.setOrderId(order.getId());
+        orderStatusFromOrderIdVo.setStatus(order.getStatus());
+        return orderStatusFromOrderIdVo;
+    }
+
 
     /**
      * 发票列表
@@ -4714,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()){
diff --git a/xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/utils/TaskOrderSendSmsUtil.java b/xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/utils/TaskOrderSendSmsUtil.java
new file mode 100644
index 0000000..cdb6ab7
--- /dev/null
+++ b/xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/utils/TaskOrderSendSmsUtil.java
@@ -0,0 +1,107 @@
+package com.xiaopeng.order.utils;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
+import com.xiaopeng.api.dto.account.UcUserInfo;
+import com.xiaopeng.api.dto.operation.SmsDto;
+import com.xiaopeng.api.feignClient.account.UserResourcesClient;
+import com.xiaopeng.api.feignClient.operation.SmsClient;
+import com.xiaopeng.api.model.order.XpOrder;
+import com.xiaopeng.api.vo.operation.SmsVo;
+import com.xiaopeng.common.core.enums.OrderStatusEnum;
+import com.xiaopeng.common.core.utils.StringUtils;
+import com.xiaopeng.order.service.IXpOrderService;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.scheduling.annotation.Scheduled;
+import org.springframework.stereotype.Component;
+
+import javax.annotation.Resource;
+import java.time.LocalDateTime;
+import java.util.HashMap;
+import java.util.List;
+
+@Slf4j
+@Component
+public class TaskOrderSendSmsUtil {
+
+    private static final int SMS_SENT = 1;
+    private static final int BATCH_SIZE = 200;
+
+    @Resource
+    private IXpOrderService xpOrderService;
+
+    @Resource
+    private UserResourcesClient userResourcesClient;
+
+    @Resource
+    private SmsClient smsClient;
+
+//    @Value("${sms.appid:}")
+//    private String smsAppId;
+//
+//    @Value("${sms.order-pay.template-code:RobotaxiOrderPaySmsTpl}")
+//    private String orderPayTemplateCode;
+//
+//    @Value("${sms.order-pay.app-push-config-code:RobotaxiOrderPaySms}")
+//    private String orderPayAppPushConfigCode;
+
+    /**
+     * 每分钟查询一次待支付超过24小时且未发送短信的订单。
+     */
+    @Scheduled(cron = "0 */1 * * * ?")
+    public void sendPendingPaymentSms() {
+        LocalDateTime deadline = LocalDateTime.now().minusHours(24);
+        List<XpOrder> orders = xpOrderService.list(new LambdaQueryWrapper<XpOrder>()
+                .eq(XpOrder::getStatus, OrderStatusEnum.APPROVAL_REJECTION.getCode())
+                .le(XpOrder::getTripEnd, deadline)
+                .and(wrapper -> wrapper.isNull(XpOrder::getSmsStatus).or().ne(XpOrder::getSmsStatus, SMS_SENT))
+                .orderByAsc(XpOrder::getTripEnd)
+                .last("LIMIT " + BATCH_SIZE));
+
+        if (orders == null || orders.isEmpty()) {
+            return;
+        }
+
+        for (XpOrder order : orders) {
+            try {
+                sendSms(order);
+            } catch (Exception e) {
+                log.error("待支付订单短信发送失败,订单ID: {}, 订单号: {}", order.getId(), order.getOrderNumber(), e);
+            }
+        }
+    }
+
+    private void sendSms(XpOrder order) {
+        if (order.getAppUserId() == null) {
+            log.warn("待支付订单短信发送跳过,用户ID为空,订单ID: {}", order.getId());
+            return;
+        }
+        UcUserInfo userInfo = userResourcesClient.getBaseUserByUid(String.valueOf(order.getAppUserId()));
+        if (userInfo == null || StringUtils.isBlank(userInfo.getMobile())) {
+            log.warn("待支付订单短信发送跳过,手机号为空,订单ID: {}, 用户ID: {}", order.getId(), order.getAppUserId());
+            return;
+        }
+
+        SmsVo smsVo = new SmsVo();
+        smsVo.setAppId("");
+        smsVo.setPushType(1);
+        smsVo.setReceivers(userInfo.getMobile());
+        smsVo.setTemplateCode("orderPayTemplateCode");
+        smsVo.setAppPushConfigCode("orderPayAppPushConfigCode");
+        smsVo.setParams(new HashMap<>());
+        smsVo.getParams().put("orderNo", order.getOrderNumber());
+
+        SmsDto result = smsClient.pushSms(smsVo);
+        if (result == null || result.getCode() == null || result.getCode() != 200) {
+            log.warn("待支付订单短信发送未成功,订单ID: {}, 返回: {}", order.getId(), result);
+            return;
+        }
+        order.setAppUserId(null);
+        order.setSmsStatus(SMS_SENT);
+        boolean updated = xpOrderService.updateById(order);
+        if (!updated) {
+            log.warn("待支付订单短信状态更新失败,订单ID: {}", order.getId());
+        }
+    }
+}
diff --git a/xp-robotaxi-order-boot/src/main/resources/mapper/order/XpOrderMapper.xml b/xp-robotaxi-order-boot/src/main/resources/mapper/order/XpOrderMapper.xml
index 732853f..6e66513 100644
--- a/xp-robotaxi-order-boot/src/main/resources/mapper/order/XpOrderMapper.xml
+++ b/xp-robotaxi-order-boot/src/main/resources/mapper/order/XpOrderMapper.xml
@@ -47,7 +47,7 @@
     <select id="getHistoryOrderList" resultType="com.xiaopeng.order.model.vo.XpOrderHistoryListVO">
         select start_point_name as originAddress, end_point_name as destinationAddress,start_point_id as startPointId,end_point_id as endPointId,
         DATE_FORMAT(create_time, '%H:%i') AS orderTime, pay_money as amount,create_time as time,DATE_FORMAT(create_time,'%Y-%m-%d') AS timeStr,
-        id as orderId,status from xp_order where app_user_id = #{uid} and is_deleted = 0
+        id as orderId,status,invoice_status invoiceStatus from xp_order where app_user_id = #{uid} and is_deleted = 0
         <if test="query.status != null">
             and status = #{query.status}
         </if>

--
Gitblit v1.7.1