From da5cf3d82ea1044c338513147b0078be031465a0 Mon Sep 17 00:00:00 2001
From: puzhibing <393733352@qq.com>
Date: 星期三, 20 五月 2026 14:54:10 +0800
Subject: [PATCH] Merge branch '1.1' of http://120.76.84.145:10101/gitblit/r/java/Robotaxi into 1.0

---
 xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/controller/XpOrderController.java                            |    7 -
 xp-robotaxi-account-boot/src/main/java/com/xiaopeng/account/controller/XpOperationsUserController.java               |   22 ++++
 xp-robotaxi-api/src/main/java/com/xiaopeng/api/factory/account/XpOperationUserClientFallbackFactory.java             |    6 +
 xp-robotaxi-api/src/main/java/com/xiaopeng/api/feignClient/account/XpOperationUserClient.java                        |   10 ++
 xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/vo/XpCruiseCheckInRuleInfoVo.java                |    2 
 xp-robotaxi-api/src/main/java/com/xiaopeng/api/vo/order/XpInvoiceVo.java                                             |   24 +++-
 xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/service/IXpCruiseCheckInRuleService.java         |    5 +
 xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/dto/XpCruiseCheckInRuleDto.java                  |    2 
 xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/service/impl/XpOrderServiceImpl.java                         |   92 ++++++++++++++---
 xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/service/impl/XpCruiseCheckInRuleServiceImpl.java |   65 ++++++++++++-
 xp-robotaxi-api/src/main/java/com/xiaopeng/api/model/maintenance/XpCruiseCheckInRule.java                            |    2 
 xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/controller/XpCruiseCheckInRuleController.java    |   15 +++
 12 files changed, 211 insertions(+), 41 deletions(-)

diff --git a/xp-robotaxi-account-boot/src/main/java/com/xiaopeng/account/controller/XpOperationsUserController.java b/xp-robotaxi-account-boot/src/main/java/com/xiaopeng/account/controller/XpOperationsUserController.java
index 8913b7f..1d409f9 100644
--- a/xp-robotaxi-account-boot/src/main/java/com/xiaopeng/account/controller/XpOperationsUserController.java
+++ b/xp-robotaxi-account-boot/src/main/java/com/xiaopeng/account/controller/XpOperationsUserController.java
@@ -47,7 +47,9 @@
 import javax.servlet.http.HttpServletResponse;
 import javax.validation.Valid;
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.List;
+import java.util.stream.Collectors;
 import com.xiaopeng.common.log.annotation.AdminOperationLog;
 import com.xiaopeng.common.log.enums.AdminBusinessType;
 import com.xiaopeng.common.log.enums.AdminOperationType;
@@ -132,6 +134,26 @@
     }
 
     /**
+     * 根据ID查询运维用户信息
+     * @return 用户列表
+     */
+    @GetMapping("/logan/inner/xpOperationsUser/queryByIds")
+    R<List<XpOperationsUser>> queryByIds(@RequestParam String operationsUserId) {
+        List<Long> ids = Arrays.stream(operationsUserId.split(","))
+                .map(Long::parseLong)
+                .collect(Collectors.toList());
+        List<XpOperationsUser> operationsUser = xpOperationsUserService.listByIds(ids);
+        for (XpOperationsUser xpOperationsUser : operationsUser) {
+            XpOperationsRole role = xpOperationsRoleMapper.selectOne(new QueryWrapper<XpOperationsRole>().eq("operations_user_id", xpOperationsUser.getId()));
+            SysRole sysRole = sysRoleService.getById(role.getRoleId());
+            xpOperationsUser.setRoleName(sysRole.getRoleName());
+            xpOperationsUser.setPhoneNumber(SensitiveDataCryptoUtil.decryptIfPossible(xpOperationsUser.getPhoneNumber()));
+        }
+
+        return R.ok(operationsUser);
+    }
+
+    /**
      * 根据昵称查询运维用户信息
      *
      * @param nickName 昵称
diff --git a/xp-robotaxi-api/src/main/java/com/xiaopeng/api/factory/account/XpOperationUserClientFallbackFactory.java b/xp-robotaxi-api/src/main/java/com/xiaopeng/api/factory/account/XpOperationUserClientFallbackFactory.java
index c4c1408..f146969 100644
--- a/xp-robotaxi-api/src/main/java/com/xiaopeng/api/factory/account/XpOperationUserClientFallbackFactory.java
+++ b/xp-robotaxi-api/src/main/java/com/xiaopeng/api/factory/account/XpOperationUserClientFallbackFactory.java
@@ -98,6 +98,12 @@
                 log.error("根据id列表获取运维人员列表失败,原因:{}", cause.getMessage());
                 return R.fail("根据id列表获取运维人员列表失败)" + cause.getMessage());
             }
+
+            @Override
+            public R<List<XpOperationsUser>> queryByIds(String operationsUserId) {
+                log.error("根据id查询运维人员用户信息失败,原因: {}", cause.getMessage());
+                return R.ok(null);
+            }
         };
     }
 }
diff --git a/xp-robotaxi-api/src/main/java/com/xiaopeng/api/feignClient/account/XpOperationUserClient.java b/xp-robotaxi-api/src/main/java/com/xiaopeng/api/feignClient/account/XpOperationUserClient.java
index d4fddf9..6931dbe 100644
--- a/xp-robotaxi-api/src/main/java/com/xiaopeng/api/feignClient/account/XpOperationUserClient.java
+++ b/xp-robotaxi-api/src/main/java/com/xiaopeng/api/feignClient/account/XpOperationUserClient.java
@@ -114,4 +114,14 @@
 
     @PostMapping("/logan/inner/xpOperationsUser/pageListByIds")
     R<PageInfo<XpOperationsUserWithRoleVO>> listByQueryIds(@RequestBody OptionalUsersPageListQuery query);
+
+    /**
+     * 根据多个id查询运维用户信息
+     * @param operationsUserId
+     * @return
+     */
+    @GetMapping("/logan/inner/xpOperationsUser/queryByIds")
+    R<List<XpOperationsUser>> queryByIds(@RequestParam String operationsUserId);
+
+
 }
diff --git a/xp-robotaxi-api/src/main/java/com/xiaopeng/api/model/maintenance/XpCruiseCheckInRule.java b/xp-robotaxi-api/src/main/java/com/xiaopeng/api/model/maintenance/XpCruiseCheckInRule.java
index 6970f46..8334a60 100644
--- a/xp-robotaxi-api/src/main/java/com/xiaopeng/api/model/maintenance/XpCruiseCheckInRule.java
+++ b/xp-robotaxi-api/src/main/java/com/xiaopeng/api/model/maintenance/XpCruiseCheckInRule.java
@@ -35,7 +35,7 @@
      */
     @TableField("operations_user_id")
     @ApiModelProperty(value = "运维人id")
-    private Long operationsUserId;
+    private String operationsUserId;
     /**
      * 任务开始时间
      */
diff --git a/xp-robotaxi-api/src/main/java/com/xiaopeng/api/vo/order/XpInvoiceVo.java b/xp-robotaxi-api/src/main/java/com/xiaopeng/api/vo/order/XpInvoiceVo.java
index 9ca1fb9..575d2fc 100644
--- a/xp-robotaxi-api/src/main/java/com/xiaopeng/api/vo/order/XpInvoiceVo.java
+++ b/xp-robotaxi-api/src/main/java/com/xiaopeng/api/vo/order/XpInvoiceVo.java
@@ -127,17 +127,22 @@
         @ApiModelProperty(value = "行程结束日期,格式:yyyy-MM-dd")
         private String tripEndDate;
 
+
+        @ApiModelProperty(value = "用户名")
+        private String userName;
+
+        @ApiModelProperty(value = "用户账号")
+        private String userAccount;
+
         @ApiModelProperty(value = "行程人手机号")
         private String phone;
-
-        @ApiModelProperty(value = "车型")
-        private String carType;
 
         @ApiModelProperty(value = "上车时间")
         private String pickupTime;
 
-        @ApiModelProperty(value = "城市")
-        private String city;
+        @ApiModelProperty(value = "下车时间")
+        private String dropOffTime;
+
 
         @ApiModelProperty(value = "起点")
         private String startPoint;
@@ -148,10 +153,13 @@
         @ApiModelProperty(value = "里程(公里)")
         private String mileage;
 
-        @ApiModelProperty(value = "金额(元)")
-        private BigDecimal amount;
-
         @ApiModelProperty(value = "备注")
         private String remark;
+
+        @ApiModelProperty(value = "原价金额")
+        private String oldPrice;
+
+        @ApiModelProperty(value = "币种")
+        private String currency;
     }
 }
diff --git a/xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/controller/XpCruiseCheckInRuleController.java b/xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/controller/XpCruiseCheckInRuleController.java
index b84a2e8..0b2444c 100644
--- a/xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/controller/XpCruiseCheckInRuleController.java
+++ b/xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/controller/XpCruiseCheckInRuleController.java
@@ -133,6 +133,21 @@
         return R.ok();
     }
 
+
+
+    @ApiOperation(value = "编辑巡游打卡规则", tags = {"管理后台-巡游打卡规则管理"})
+    @PostMapping("/maintenance-admin/api/v1/cruiseCheckInRecord/updateXpCruiseCheckInRule")
+    @AdminOperationLog(
+            businessType = AdminBusinessType.CRUISE_CHECK_IN_RULE_MANAGEMENT,
+            operationType = AdminOperationType.EDIT,
+            content = "编辑巡游打卡规则",
+            appendRequestData = true
+    )
+    public R<?> updateXpCruiseCheckInRule(@RequestBody XpCruiseCheckInRuleDto dto){
+        xpCruiseCheckInRuleService.updateXpCruiseCheckInRule(dto);
+        return R.ok();
+    }
+
     @ApiOperation(value = "删除巡游打卡规则", tags = {"管理后台-巡游打卡规则管理"})
     @PostMapping("/maintenance-admin/api/v1/cruiseCheckInRecord/delXpCruiseCheckInRule/{id}")
     @AdminOperationLog(
diff --git a/xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/dto/XpCruiseCheckInRuleDto.java b/xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/dto/XpCruiseCheckInRuleDto.java
index e0e2c64..bbde801 100644
--- a/xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/dto/XpCruiseCheckInRuleDto.java
+++ b/xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/dto/XpCruiseCheckInRuleDto.java
@@ -12,7 +12,7 @@
 @ApiModel
 public class XpCruiseCheckInRuleDto extends XpCruiseCheckInRule {
     @ApiModelProperty("关联人id")
-    private Long relationId;
+    private String relationId;
     @ApiModelProperty("打卡点位id")
     private List<XpCruiseCheckInRuleLocation> points;
 }
diff --git a/xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/service/IXpCruiseCheckInRuleService.java b/xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/service/IXpCruiseCheckInRuleService.java
index 37f5aa2..15a1543 100644
--- a/xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/service/IXpCruiseCheckInRuleService.java
+++ b/xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/service/IXpCruiseCheckInRuleService.java
@@ -76,6 +76,11 @@
      * @param dto
      */
     void addXpCruiseCheckInRule(XpCruiseCheckInRuleDto dto);
+    /**
+     * 编辑巡游打卡规则
+     * @param dto
+     */
+    void updateXpCruiseCheckInRule(XpCruiseCheckInRuleDto dto);
 
 
     /**
diff --git a/xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/service/impl/XpCruiseCheckInRuleServiceImpl.java b/xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/service/impl/XpCruiseCheckInRuleServiceImpl.java
index 2a54996..6f18e7d 100644
--- a/xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/service/impl/XpCruiseCheckInRuleServiceImpl.java
+++ b/xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/service/impl/XpCruiseCheckInRuleServiceImpl.java
@@ -40,6 +40,7 @@
 import java.time.ZoneOffset;
 import java.time.format.DateTimeFormatter;
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.Collections;
 import java.util.List;
 import java.util.Map;
@@ -313,9 +314,7 @@
             throw new ServiceException("巡游打卡规则名称已存在");
         }
         // 校验同一运维人员是否已存在有效规则(未删除且非循环模式或时间在有效期内)
-        long count = this.count(new LambdaQueryWrapper<XpCruiseCheckInRule>()
-                .eq(XpCruiseCheckInRule::getOperationsUserId, dto.getRelationId())
-                .eq(XpCruiseCheckInRule::getDeleted, false));
+        long count = countByAnyOperationsUserId(dto.getRelationId(), null);
         if (count > 0) {
             throw new ServiceException("该运维人员已存在有效的巡游打卡规则");
         }
@@ -325,6 +324,36 @@
         xpCruiseCheckInRule.setDeleted(false);
         xpCruiseCheckInRule.setOperationsUserId(dto.getRelationId());
         this.save(xpCruiseCheckInRule);
+        dto.getPoints().forEach(s->{
+            s.setCruiseCheckInRuleId(xpCruiseCheckInRule.getId());
+        });
+        xpCruiseCheckInRuleLocationService.saveBatch(dto.getPoints());
+    }
+
+
+    /**
+     * 编辑巡游打卡规则
+     * @param dto
+     */
+    @Override
+    public void updateXpCruiseCheckInRule(XpCruiseCheckInRuleDto dto) {
+        XpCruiseCheckInRule one = this.getOne(new QueryWrapper<XpCruiseCheckInRule>().like("name", dto.getName()).ne("id", dto.getId()).eq("is_deleted", 0));
+        if(null != one){
+            throw new ServiceException("巡游打卡规则名称已存在");
+        }
+        // 校验同一运维人员是否已存在有效规则(未删除且非循环模式或时间在有效期内)
+        long count = countByAnyOperationsUserId(dto.getRelationId(), dto.getId());
+        if (count > 0) {
+            throw new ServiceException("该运维人员已存在有效的巡游打卡规则");
+        }
+
+        XpCruiseCheckInRule xpCruiseCheckInRule = new XpCruiseCheckInRule();
+        BeanUtils.copyProperties(dto, xpCruiseCheckInRule);
+        xpCruiseCheckInRule.setDeleted(false);
+        xpCruiseCheckInRule.setOperationsUserId(dto.getRelationId());
+        this.updateById(xpCruiseCheckInRule);
+        // 移除原来的id
+        xpCruiseCheckInRuleLocationService.remove(new LambdaQueryWrapper<XpCruiseCheckInRuleLocation>().eq(XpCruiseCheckInRuleLocation::getCruiseCheckInRuleId, xpCruiseCheckInRule.getId()));
         dto.getPoints().forEach(s->{
             s.setCruiseCheckInRuleId(xpCruiseCheckInRule.getId());
         });
@@ -353,10 +382,36 @@
 
         }).collect(Collectors.toList());
         info.setLocationList(collect);
-        XpOperationsUser xpOperationsUser = xpOperationsUserClient.queryById(byId.getOperationsUserId()).getData();
+        List<XpOperationsUser> xpOperationsUser = xpOperationsUserClient.queryByIds(byId.getOperationsUserId()).getData();
         if(null != xpOperationsUser){
-            info.setOperationsUser(xpOperationsUser.getNickName());
+            info.setOperationsUser(xpOperationsUser.stream().map(XpOperationsUser::getNickName).collect(Collectors.toList()));
         }
         return info;
     }
+
+    private long countByAnyOperationsUserId(String relationId, Integer excludeRuleId) {
+        if (StringUtils.isEmpty(relationId)) {
+            return 0;
+        }
+        List<String> relationIds = Arrays.stream(relationId.split(","))
+                .map(String::trim)
+                .filter(StringUtils::isNotEmpty)
+                .collect(Collectors.toList());
+        if (relationIds.isEmpty()) {
+            return 0;
+        }
+
+        LambdaQueryWrapper<XpCruiseCheckInRule> queryWrapper = new LambdaQueryWrapper<XpCruiseCheckInRule>()
+                .eq(XpCruiseCheckInRule::getDeleted, false)
+                .and(wrapper -> {
+                    wrapper.apply("find_in_set({0}, operations_user_id)", relationIds.get(0));
+                    for (int i = 1; i < relationIds.size(); i++) {
+                        wrapper.or().apply("find_in_set({0}, operations_user_id)", relationIds.get(i));
+                    }
+                });
+        if (excludeRuleId != null) {
+            queryWrapper.ne(XpCruiseCheckInRule::getId, excludeRuleId);
+        }
+        return this.count(queryWrapper);
+    }
 }
diff --git a/xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/vo/XpCruiseCheckInRuleInfoVo.java b/xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/vo/XpCruiseCheckInRuleInfoVo.java
index adfdff5..06d163c 100644
--- a/xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/vo/XpCruiseCheckInRuleInfoVo.java
+++ b/xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/vo/XpCruiseCheckInRuleInfoVo.java
@@ -16,5 +16,5 @@
     private List<CruiseCheckInLocationVo> locationList;
 
     @ApiModelProperty("关联人名称")
-    private String operationsUser;
+    private List<String> operationsUser;
 }
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 201b275..39375a7 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
@@ -1007,13 +1007,8 @@
     @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(orderStatusFromOrderIdVo);
 
-    }
+        return R.ok( xpOrderService.queryOrderStatusFromOrderId(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 fc3b1a3..0072100 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
@@ -4883,7 +4883,7 @@
         if(order.getPayType()==3){
             // 免密查询 如果成功则调用结算
             CreditOrderQueryDto dto = new CreditOrderQueryDto();
-            dto.setBusinessOrderId(OrderCodeUtil.getOrderCode("MMZF"));
+            dto.setBusinessOrderId(order.getBusinessOrderId());
             dto.setAuthOrderId(order.getAuthOrderId());
             dto.setPayType("13");
             R<CreditOrderQueryVo> creditOrderQueryVoR = xpPayFrontClient.queryCreditOrder(dto);
@@ -5093,17 +5093,46 @@
 
         ArrayList<XpInvoiceVo> xpInvoiceVoList = new ArrayList<>(list.size());
 
-        R<List<XpVehicle>> r = xpVehicleClient.listByIds(list.stream().map(XpOrder::getVehicleId).collect(Collectors.toList()));
-        List<XpVehicle> vehicleList = r.getData();
-
         // 数据组装
         for (XpOrder xpOrder : list) {
             XpInvoiceVo xpInvoiceVo = new XpInvoiceVo();
             xpInvoiceVo.setUid(xpOrder.getAppUserId().toString());
             xpInvoiceVo.setOrderNo(xpOrder.getOrderNumber());
-            xpInvoiceVo.setOrderTotalAmount(xpOrder.getOrderMoney());
+
+            BigDecimal orderMoney = xpOrder.getOrderMoney() == null ? BigDecimal.ZERO : xpOrder.getOrderMoney();
+            XpInvoiceVo.GoodsDetail goodsDetail = new XpInvoiceVo.GoodsDetail();
+            goodsDetail.setProductName("Robotaxi出行服务");
+            goodsDetail.setProductCode(null);
+            goodsDetail.setProductSpecCode("XE2000398");
+            goodsDetail.setProductSpec(null);
+            goodsDetail.setProductUnit("次");
+            goodsDetail.setQuantity(1);
+            goodsDetail.setUnitPrice(orderMoney);
+            goodsDetail.setInTaxAmount(orderMoney);
+            goodsDetail.setTaxRate(null);
+            goodsDetail.setTaxAmount(null);
+            goodsDetail.setExTaxAmount(null);
+            goodsDetail.setItemId(xpOrder.getOrderNumber());
+            goodsDetail.setCouponAmount(xpOrder.getCouponMoney());
+            goodsDetail.setCompanyCode("8000");
+            xpInvoiceVo.setGoodsDetail(JSON.toJSONString(goodsDetail));
+
+            xpInvoiceVo.setOrderTotalAmount(xpOrder.getPayMoney());
+            xpInvoiceVo.setOrderBusAmount(xpOrder.getOrderMoney());
+
             xpInvoiceVo.setOrderDiscountAmount(xpOrder.getCouponMoney());
             xpInvoiceVo.setOrderFinishTime(xpOrder.getTripEnd()!=null?String.valueOf(xpOrder.getTripEnd()):"");
+
+
+            JSONObject extData = new JSONObject();
+            extData.put("companyCode", "8000");
+            extData.put("realCompanyCode", null);
+            extData.put("siteName",null);
+            extData.put("pile", null);
+            extData.put("payFag", null);
+            extData.put("supplierCode", null);
+            xpInvoiceVo.setExtData(JSON.toJSONString(extData));
+
             xpInvoiceVo.setXpInvoiceFlag(true);
             xpInvoiceVo.setInvoiceStatus(xpOrder.getInvoiceStatus());
             XpInvoiceVo.Itinerary itinerary = new XpInvoiceVo.Itinerary();
@@ -5112,14 +5141,11 @@
             itinerary.setTripEndDate(xpOrder.getTripEnd()!=null?xpOrder.getTripEnd().format(DateTimeFormatter.ofPattern("yyyy-MM-dd")):"");
 
 
-            XpVehicle xpVehicle = vehicleList.stream().filter(vehicle -> vehicle.getId().equals(xpOrder.getVehicleId())).findFirst().get();
-            itinerary.setCarType(xpVehicle.getVehicleModel());
             itinerary.setTripStartDate(xpOrder.getBoardingTime()!=null?xpOrder.getBoardingTime().format(DateTimeFormatter.ofPattern("yyyy-MM-dd")):"");
 
-            itinerary.setCity(xpOrder.getCityName());
             itinerary.setStartPoint(xpOrder.getStartAddress());
             itinerary.setEndPoint(xpOrder.getEndAddress());
-            itinerary.setMileage(null == xpOrder.getMileageKilometers() ? "0" : xpOrder.getMileageKilometers().toString());
+            itinerary.setMileage(xpOrder.getMileageKilometers()!=null ? xpOrder.getMileageKilometers().toString() :"0");
             itinerary.setAmount(xpOrder.getOrderMoney());
 
             xpInvoiceVo.setItinerary(itinerary);
@@ -5155,26 +5181,54 @@
             XpInvoiceVo xpInvoiceVo = new XpInvoiceVo();
             xpInvoiceVo.setUid(xpOrder.getAppUserId().toString());
             xpInvoiceVo.setOrderNo(xpOrder.getOrderNumber());
-            xpInvoiceVo.setOrderTotalAmount(xpOrder.getOrderMoney());
+
+            BigDecimal orderMoney = xpOrder.getOrderMoney() == null ? BigDecimal.ZERO : xpOrder.getOrderMoney();
+            XpInvoiceVo.GoodsDetail goodsDetail = new XpInvoiceVo.GoodsDetail();
+            goodsDetail.setProductName("Robotaxi出行服务");
+            goodsDetail.setProductCode(null);
+            goodsDetail.setProductSpecCode("XE2000398");
+            goodsDetail.setProductSpec(null);
+            goodsDetail.setProductUnit("次");
+            goodsDetail.setQuantity(1);
+            goodsDetail.setUnitPrice(orderMoney);
+            goodsDetail.setInTaxAmount(orderMoney);
+            goodsDetail.setTaxRate(null);
+            goodsDetail.setTaxAmount(null);
+            goodsDetail.setExTaxAmount(null);
+            goodsDetail.setItemId(xpOrder.getOrderNumber());
+            goodsDetail.setCouponAmount(xpOrder.getCouponMoney());
+            goodsDetail.setCompanyCode("8000");
+            xpInvoiceVo.setGoodsDetail(JSON.toJSONString(goodsDetail));
+
+            xpInvoiceVo.setOrderTotalAmount(xpOrder.getPayMoney());
+            xpInvoiceVo.setOrderBusAmount(xpOrder.getOrderMoney());
+
             xpInvoiceVo.setOrderDiscountAmount(xpOrder.getCouponMoney());
-            xpInvoiceVo.setOrderFinishTime(String.valueOf(xpOrder.getTripEnd()));
+            xpInvoiceVo.setOrderFinishTime(xpOrder.getTripEnd()!=null?String.valueOf(xpOrder.getTripEnd()):"");
+
+
+            JSONObject extData = new JSONObject();
+            extData.put("companyCode", "8000");
+            extData.put("realCompanyCode", null);
+            extData.put("siteName",null);
+            extData.put("pile", null);
+            extData.put("payFag", null);
+            extData.put("supplierCode", null);
+            xpInvoiceVo.setExtData(JSON.toJSONString(extData));
+
             xpInvoiceVo.setXpInvoiceFlag(true);
             xpInvoiceVo.setInvoiceStatus(xpOrder.getInvoiceStatus());
             XpInvoiceVo.Itinerary itinerary = new XpInvoiceVo.Itinerary();
             // yyyy-MM-dd格式
-            itinerary.setTripStartDate(xpOrder.getAcceptanceTime().format(DateTimeFormatter.ofPattern("yyyy-MM-dd")));
-            itinerary.setTripEndDate(xpOrder.getTripEnd().format(DateTimeFormatter.ofPattern("yyyy-MM-dd")));
+            itinerary.setTripStartDate(xpOrder.getAcceptanceTime()!=null?xpOrder.getAcceptanceTime().format(DateTimeFormatter.ofPattern("yyyy-MM-dd")):"");
+            itinerary.setTripEndDate(xpOrder.getTripEnd()!=null?xpOrder.getTripEnd().format(DateTimeFormatter.ofPattern("yyyy-MM-dd")):"");
 
 
-            XpVehicle xpVehicle = vehicleList.stream().filter(vehicle -> vehicle.getId().equals(xpOrder.getVehicleId())).findFirst().get();
-            itinerary.setCarType(xpVehicle.getVehicleModel());
-            itinerary.setTripStartDate(xpOrder.getBoardingTime().format(DateTimeFormatter.ofPattern("yyyy-MM-dd")));
+            itinerary.setTripStartDate(xpOrder.getBoardingTime()!=null?xpOrder.getBoardingTime().format(DateTimeFormatter.ofPattern("yyyy-MM-dd")):"");
 
-            itinerary.setCity(xpOrder.getCityName());
             itinerary.setStartPoint(xpOrder.getStartAddress());
             itinerary.setEndPoint(xpOrder.getEndAddress());
-            itinerary.setMileage(xpOrder.getMileageKilometers().toString());
-            itinerary.setAmount(xpOrder.getOrderMoney());
+            itinerary.setMileage(xpOrder.getMileageKilometers()!=null ? xpOrder.getMileageKilometers().toString() :"0");
 
             xpInvoiceVo.setItinerary(itinerary);
             xpInvoiceVoList.add(xpInvoiceVo);

--
Gitblit v1.7.1