From c96fbe6b0aeb413a17c429133ee6d81d138144b9 Mon Sep 17 00:00:00 2001
From: liujie <1793218484@qq.com>
Date: 星期二, 09 六月 2026 10:58:52 +0800
Subject: [PATCH] Merge branch '1.0' of http://120.76.84.145:10101/gitblit/r/java/Robotaxi into 1.0

---
 xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/service/impl/XpPricingServiceImpl.java |  120 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++--
 1 files changed, 115 insertions(+), 5 deletions(-)

diff --git a/xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/service/impl/XpPricingServiceImpl.java b/xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/service/impl/XpPricingServiceImpl.java
index c8c251b..4a37637 100644
--- a/xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/service/impl/XpPricingServiceImpl.java
+++ b/xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/service/impl/XpPricingServiceImpl.java
@@ -1,10 +1,12 @@
 package com.xiaopeng.operation.service.impl;
 
 
+import cn.hutool.core.lang.Snowflake;
 import com.alibaba.fastjson2.JSON;
 import com.alibaba.fastjson2.JSONArray;
 import com.alibaba.fastjson2.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
@@ -13,9 +15,10 @@
 import com.xiaopeng.api.dto.operation.LonLatDto;
 import com.xiaopeng.api.feignClient.account.XpAppUserClient;
 import com.xiaopeng.api.feignClient.account.XpAppUserCouponClient;
+import com.xiaopeng.api.feignClient.maintenance.XpVehicleModelClient;
 import com.xiaopeng.api.feignClient.map.XpMapClient;
 import com.xiaopeng.api.feignClient.order.XpOrderClient;
-import com.xiaopeng.api.model.account.XpAppUser;
+import com.xiaopeng.api.model.maintenance.XpVehicleModel;
 import com.xiaopeng.api.model.operation.*;
 import com.xiaopeng.api.model.order.XpOrder;
 import com.xiaopeng.api.vo.account.UserCouponVo;
@@ -33,17 +36,18 @@
 import com.xiaopeng.common.redis.service.RedisService;
 import com.xiaopeng.operation.constant.I18nKeyConstant;
 import com.xiaopeng.operation.dto.*;
+import com.xiaopeng.operation.job.base.QuartzManager;
+import com.xiaopeng.operation.job.base.TimeJobType;
+import com.xiaopeng.operation.job.jobs.DynamicPricingCheckJob;
 import com.xiaopeng.operation.mapper.*;
 import com.xiaopeng.operation.query.PricingPageListQuery;
 import com.xiaopeng.operation.service.IXpGeoQueryEntityService;
 import com.xiaopeng.operation.service.XpPointService;
 import com.xiaopeng.operation.service.XpPricingService;
-import com.xiaopeng.operation.job.base.QuartzManager;
-import com.xiaopeng.operation.job.base.TimeJobType;
-import com.xiaopeng.operation.job.jobs.DynamicPricingCheckJob;
 import com.xiaopeng.operation.utils.XpPricingUtil;
 import com.xiaopeng.operation.utils.holiday.HolidayUtil;
 import com.xiaopeng.operation.utils.map.FastDistanceCalculator;
+import com.xiaopeng.operation.vo.PricingInfoVo;
 import com.xiaopeng.operation.vo.PricingPageListVO;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -104,6 +108,8 @@
 
 
     @Resource
+    private XpVehicleModelClient xpVehicleModelClient;
+    @Resource
     private XpWhitelistMapper xpWhitelistMapper;
 
     @Resource
@@ -120,6 +126,9 @@
 
     @Autowired
     private XpPointService xpPointService;
+
+    @Resource(name = "hutoolSnowflake")
+    private Snowflake snowflake;
 
 
     // 自定义线程池用于并行执行任务
@@ -339,6 +348,7 @@
         fareVo.setOriginalFare(xpPricingCardVo.getTotalPrice());
         if (userCouponVo != null) {
             fareVo.setDiscountAmount(userCouponVo.getMoney());
+            fareVo.setCouponType(userCouponVo.getCouponType());
             fareVo.setFinalFare(fareVo.getOriginalFare() - fareVo.getDiscountAmount());
             fareVo.setCouponId(userCouponVo.getId());
         } else {
@@ -488,7 +498,7 @@
 //        xpOrder.setStartMileage(Double.valueOf(startMileage));
 
         xpOrder.setAppUserId(Long.valueOf(uid));
-        xpOrder.setOrderNumber("XP" + System.currentTimeMillis());
+        xpOrder.setOrderNumber(getOrderNumber());
         xpOrder.setPlacementLon(dto.getPlacementLon());
         xpOrder.setPlacementLat(dto.getPlacementLat());
         xpOrder.setPlacementAddress(dto.getPlacementAddress());
@@ -512,6 +522,8 @@
         xpOrder.setEndPointId(dto.getEndPointId());
         xpOrder.setStartPointName(xpPoint.getPointName());
         xpOrder.setEndPointName(endXpPoint.getPointName());
+        xpOrder.setXpuStartTaskId(snowflake.nextId() + "");
+        xpOrder.setXpuEndTaskId(snowflake.nextId() + "");
 
         // 当前时段
         String currentTimeSlot = DateUtils.getCurrentTimeSlot();
@@ -631,6 +643,11 @@
     }
 
 
+    private String getOrderNumber(){
+        int random = Double.valueOf(Math.random() * 1000).intValue();
+        return "XP" + random + System.currentTimeMillis();
+    }
+
     private Boolean isInOperationTime(String operationStrategy) {
         JSONArray jsonArray = JSONArray.parseArray(operationStrategy);
         Integer holidayToday = holidayUtil.isHolidayToday();
@@ -680,6 +697,23 @@
         Page<PricingPageListVO> page = this.baseMapper.pageList(pageInfo, query);
         pageInfo.setRecords(page.getRecords());
         pageInfo.setTotal(page.getTotal());
+        if(page.getRecords() != null){
+            Set<String> vehicleModelIds = page.getRecords().stream().map(PricingPageListVO::getVehicleModel).collect(Collectors.toSet());
+            R<List<XpVehicleModel>> listR = xpVehicleModelClient.listByIds(vehicleModelIds);
+            if(listR != null && listR.getData() != null){
+                List<XpVehicleModel> vehicleModels = listR.getData();
+                Map<String, XpVehicleModel> vehicleModelMap = new HashMap<>();
+                for (XpVehicleModel vehicleModel : vehicleModels) {
+                    vehicleModelMap.put(vehicleModel.getId().toString(), vehicleModel);
+                }
+                for (PricingPageListVO record : page.getRecords()) {
+                    XpVehicleModel xpVehicleModel = vehicleModelMap.get(record.getVehicleModel());
+                    if(xpVehicleModel != null){
+                        record.setVehicleModelName(xpVehicleModel.getName());
+                    }
+                }
+            }
+        }
         return pageInfo;
     }
 
@@ -800,4 +834,80 @@
         this.updateById(update);
     }
 
+
+    @Override
+    public void savePrice(PricingInfoVo dto, XpOfficialPartner officialPartner) {
+        XpOpenCity openCity = xpOpenCityMapper.selectOne(new QueryWrapper<XpOpenCity>().eq("city_code", dto.getCityCode()));
+        if (openCity == null) {
+            throw new ServiceException("城市未开通");
+        }
+
+        XpPricing pricing = this.lambdaQuery()
+                .eq(XpPricing::getVehicleModel, dto.getVehicleModel())
+                .eq(XpPricing::getChannel, officialPartner.getBrandName())
+                .eq(XpPricing::getCityId, openCity.getId().intValue())
+                .eq(XpPricing::getOfficialPartnerId, officialPartner.getId())
+                .one();
+
+        if(null == pricing){
+            pricing = new XpPricing();
+            pricing.setOfficialPartnerId(officialPartner.getId());
+            pricing.setVehicleModel(dto.getVehicleModel());
+            pricing.setChannel(officialPartner.getBrandName());
+            pricing.setCityId(openCity.getId());
+            pricing.setRemark(dto.getRemark());
+            pricing.setPricingType(dto.getPricingType());
+            pricing.setBasicPricingJson("{}");
+            pricing.setStartingFareJson("[]");
+            pricing.setDynamicPricingJson("{}");
+            pricing.setIsDynamicPrice(0);
+            this.save(pricing);
+        }
+
+        try {
+            if (StringUtils.isNotBlank(dto.getBasicPricingJson())) {
+                JSONObject.parseObject(dto.getBasicPricingJson());
+            }
+            if (StringUtils.isNotBlank(dto.getStartingFareJson())) {
+                JSONArray.parseArray(dto.getStartingFareJson());
+            }
+            if (StringUtils.isNotBlank(dto.getDynamicPricingJson())) {
+                JSONObject.parseObject(dto.getDynamicPricingJson());
+            }
+        } catch (Exception e) {
+            throw new ServiceException("价格配置JSON格式不正确", I18nKeyConstant.PRICING_JSON_INVALID);
+        }
+
+        XpPricing update = new XpPricing();
+        update.setId(pricing.getId());
+        update.setBasicPricingJson(dto.getBasicPricingJson());
+        update.setStartingFareJson(StringUtils.isNotBlank(dto.getStartingFareJson()) ? dto.getStartingFareJson() : null);
+        update.setDynamicPricingJson(dto.getDynamicPricingJson());
+        update.setIsDynamicPrice(dto.getIsDynamicPrice());
+        update.setPriceRule(dto.getPriceRule());
+        this.updateById(update);
+
+        // 动态调价 Quartz 任务调度
+        String jobName = DynamicPricingCheckJob.JOB_PREFIX + pricing.getId();
+        if (Integer.valueOf(1).equals(dto.getIsDynamicPrice())
+                && StringUtils.isNotBlank(dto.getDynamicPricingJson())) {
+            JSONObject dynamicJson = JSONObject.parseObject(dto.getDynamicPricingJson());
+            Integer periodMinutes = dynamicJson.getInteger("num1");
+            if (periodMinutes != null && periodMinutes > 0) {
+                // 先移除可能存在的旧任务,再注册新任务(num1 分钟后首次执行)
+                QuartzManager.removeJob(jobName, TimeJobType.DYNAMIC_PRICING_CHECK);
+                Date triggerTime = new Date(System.currentTimeMillis() + periodMinutes * 60_000L);
+                Map<String, Object> jobData = new HashMap<>();
+                jobData.put("pricingId", pricing.getId());
+                QuartzManager.addJob(DynamicPricingCheckJob.class, jobName,
+                        TimeJobType.DYNAMIC_PRICING_CHECK, triggerTime, jobData);
+                log.info("动态调价任务已注册 pricingId={}, 供需计算周期={}分钟", pricing.getId(), periodMinutes);
+            }
+        } else {
+            // 关闭动态调价时,移除已存在的任务
+            QuartzManager.removeJob(jobName, TimeJobType.DYNAMIC_PRICING_CHECK);
+            log.info("动态调价任务已移除 pricingId={}", pricing.getId());
+        }
+
+    }
 }

--
Gitblit v1.7.1