“mitao”
2026-03-21 838ec6603d7b9a114a55bcc12004128da9d1b65c
feat:专车、出租车下单增加先付
6个文件已修改
193 ■■■■■ 已修改文件
UserYKDTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/specialTrain/model/OrderPrivateCar.java 28 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
UserYKDTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/specialTrain/server/impl/OrderPrivateCarServiceImpl.java 65 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
UserYKDTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/IServerCarModelService.java 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
UserYKDTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/taxi/dao/mapping/OrderTaxiMapper.xml 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
UserYKDTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/taxi/model/OrderTaxi.java 28 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
UserYKDTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/taxi/service/impl/OrderTaxiServiceImpl.java 52 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
UserYKDTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/specialTrain/model/OrderPrivateCar.java
@@ -520,6 +520,18 @@
    private Date payTime;
    /**
     * 预估金额(先付模式下单时计算并存储)
     */
    @TableField("estimateAmount")
    private Double estimateAmount;
    /**
     * 下单时系统支付模式(1=先付,2=后付)
     */
    @TableField("paymentMode")
    private Integer paymentMode;
    public Date getSuccessTime() {
        return successTime;
    }
@@ -1384,6 +1396,22 @@
        this.payTime = payTime;
    }
    public Double getEstimateAmount() {
        return estimateAmount;
    }
    public void setEstimateAmount(Double estimateAmount) {
        this.estimateAmount = estimateAmount;
    }
    public Integer getPaymentMode() {
        return paymentMode;
    }
    public void setPaymentMode(Integer paymentMode) {
        this.paymentMode = paymentMode;
    }
    public String getAbnormalRemark() {
        return abnormalRemark;
    }
UserYKDTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/specialTrain/server/impl/OrderPrivateCarServiceImpl.java
@@ -167,6 +167,12 @@
    private TDriverPromotionActivityService driverPromotionActivityService;
    private CarMapper carMapper;
    @Autowired
    private ITSysPaymentModeService tSysPaymentModeService;
    @Autowired
    private IServerCarModelService serverCarModelService;
    /**
     * 专车下单操作
     *
@@ -297,6 +303,65 @@
                    orderPrivateCar.setPassengersPhone(userInfo.getPhone());
                }
                orderPrivateCar.setState(1);
                // ===== 先付/后付模式判断 =====
                if (orderSource != 2) { // 扫码下单跳过先付判断(扫码下单已有固定司机)
                    TSysPaymentMode paymentMode = tSysPaymentModeService.selectOne(
                            new EntityWrapper<TSysPaymentMode>().last("LIMIT 1"));
                    if (paymentMode != null && Integer.valueOf(1).equals(paymentMode.getPrivateType())) {
                        // 先付模式:计算预估金额,订单状态改为7(待支付)
                        Company payCompany = companyCityService.query(geocode.get("districtCode"));
                        if (payCompany != null) {
                            try {
                                // 复用已获取的预估距离(米)和预估时间(分钟),还原为 getPrice 所需单位
                                double distanceMeters = orderPrivateCar.getEstimateMileage() != null
                                        ? orderPrivateCar.getEstimateMileage() : 0;
                                long durationSeconds = orderPrivateCar.getEstimateTime() != null
                                        ? (long) (orderPrivateCar.getEstimateTime() * 60) : 0;
                                List<ServerCarModelWarpper> priceList = serverCarModelService.getPrice(
                                        payCompany.getId(), distanceMeters, durationSeconds, 0L, 1, geocode);
                                if (priceList != null && !priceList.isEmpty()) {
                                    // 按 serverCarModelId 精确匹配,找不到则取第一条
                                    ServerCarModelWarpper matched = priceList.stream()
                                            .filter(w -> w.getId() != null && w.getId().equals(serverCarModelId))
                                            .findFirst()
                                            .orElse(priceList.get(0));
                                    // 根据 rideType 取对应金额 Map(key="zongfeiyong")
                                    Map<String, Object> amountMap = null;
                                    if (Integer.valueOf(2).equals(rideType)) {
                                        amountMap = matched.getBuyNowAmount();         // 一口价
                                    } else if (Integer.valueOf(3).equals(rideType)) {
                                        amountMap = matched.getPutTogetherOneAmount(); // 拼车(1人拼成)
                                    } else {
                                        amountMap = matched.getAmount();               // 独享(默认)
                                    }
                                    if (amountMap != null && amountMap.get("zongfeiyong") != null) {
                                        Double estimateMoney = Double.valueOf(amountMap.get("zongfeiyong").toString());
                                        orderPrivateCar.setEstimateAmount(estimateMoney);
                                        orderPrivateCar.setOrderMoney(estimateMoney);
                                    }
                                }
                                // 先付模式:覆盖状态为7(待支付),不进行派单
                                orderPrivateCar.setState(7);
                                orderPrivateCar.setCompanyId(payCompany.getId());
                                orderPrivateCar.setPaymentMode(1); // 记录先付模式
                            } catch (Exception e) {
                                e.printStackTrace();
                                // 降级:计算失败时保持后付逻辑(state=1,正常派单)
                                orderPrivateCar.setPaymentMode(2); // 降级记录后付
                            }
                        } else {
                            orderPrivateCar.setPaymentMode(1); // 公司未找到,仍记录配置为先付
                        }
                    } else {
                        // 后付模式(无配置 或 privateType=2)
                        orderPrivateCar.setPaymentMode(
                                (paymentMode != null && paymentMode.getPrivateType() != null)
                                        ? paymentMode.getPrivateType()
                                        : 2
                        );
                    }
                }
                // ===== 先付/后付判断结束 =====
                orderPrivateCar.setInsertTime(new Date());
                orderPrivateCar.setTravelTime(travelTime);
                orderPrivateCar.setOrderType(reservation);
UserYKDTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/IServerCarModelService.java
@@ -28,4 +28,18 @@
     * @return
     */
    List<Map<String, Object>> queryServerCarModels(Integer type);
    /**
     * 计算各车型预估金额
     * @param companyId  企业id
     * @param distance   预估距离(米)
     * @param duration   预估时间(秒)
     * @param wait       等待时长(秒)
     * @param type       业务类型(专车=1)
     * @param geocode    地理编码(含 districtCode/cityCode/provinceCode)
     * @return           车型预估金额列表
     * @throws Exception
     */
    List<ServerCarModelWarpper> getPrice(Integer companyId, double distance, long duration,
                                         long wait, Integer type, Map<String, String> geocode) throws Exception;
}
UserYKDTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/taxi/dao/mapping/OrderTaxiMapper.xml
@@ -50,6 +50,8 @@
        <result column="discountAmount" property="discountAmount"/>
        <result column="companyId" property="companyId"/>
        <result column="payMoney" property="payMoney"/>
        <result column="estimateAmount" property="estimateAmount"/>
        <result column="paymentMode" property="paymentMode"/>
        <result column="thankYouFee" property="thankYouFee"/>
        <result column="substitute" property="substitute"/>
        <result column="passengers" property="passengers"/>
@@ -117,6 +119,8 @@
        activityId as activityId,
        companyId as companyId,
        payMoney as payMoney,
        estimateAmount as estimateAmount,
        paymentMode as paymentMode,
        substitute as substitute,
        passengers as passengers,
        passengersPhone as passengersPhone,
@@ -461,4 +465,4 @@
        boardingLat
        from t_order_taxi where userId = #{uid}  and state in (8, 9) order by insertTime desc
    </select>
</mapper>
</mapper>
UserYKDTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/taxi/model/OrderTaxi.java
@@ -242,6 +242,16 @@
     */
    @TableField("payMoney")
    private Double payMoney;
    /**
     * 预估金额(先付模式下单时计算并存储)
     */
    @TableField("estimateAmount")
    private Double estimateAmount;
    /**
     * 下单时系统支付模式(1=先付,2=后付)
     */
    @TableField("paymentMode")
    private Integer paymentMode;
    //感谢费
    @TableField("thankYouFee")
    private Double thankYouFee;
@@ -955,6 +965,22 @@
        this.orderSource = orderSource;
    }
    public Double getEstimateAmount() {
        return estimateAmount;
    }
    public void setEstimateAmount(Double estimateAmount) {
        this.estimateAmount = estimateAmount;
    }
    public Integer getPaymentMode() {
        return paymentMode;
    }
    public void setPaymentMode(Integer paymentMode) {
        this.paymentMode = paymentMode;
    }
    public Integer getInvoiceId() {
        return invoiceId;
@@ -1233,6 +1259,8 @@
                ", activityId=" + activityId +
                ", companyId=" + companyId +
                ", payMoney=" + payMoney +
                ", estimateAmount=" + estimateAmount +
                ", paymentMode=" + paymentMode +
                ", substitute=" + substitute +
                ", passengers='" + passengers + '\'' +
                ", passengersPhone='" + passengersPhone + '\'' +
UserYKDTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/taxi/service/impl/OrderTaxiServiceImpl.java
@@ -21,6 +21,7 @@
import com.stylefeng.guns.modular.system.service.*;
import com.stylefeng.guns.modular.system.util.*;
import com.stylefeng.guns.modular.system.warpper.*;
import com.stylefeng.guns.modular.system.service.impl.ServerCarModelServiceImpl;
import com.stylefeng.guns.modular.taxi.dao.OrderTaxiMapper;
import com.stylefeng.guns.modular.taxi.model.OrderTaxi;
import com.stylefeng.guns.modular.taxi.model.PaymentRecord;
@@ -182,6 +183,12 @@
    @Autowired
    private ITSysPushTypeService tSysPushTypeService;
    @Autowired
    private ITSysPaymentModeService tSysPaymentModeService;
    @Autowired
    private ServerCarModelServiceImpl serverCarModelService;
    
    public static List<Integer> orderIds = new ArrayList<>();
    
@@ -305,6 +312,45 @@
            orderTaxi.setPassengersPhone(userInfo.getPhone());
        }
        orderTaxi.setState(1);//待接单
        if (orderTaxi.getOrderSource() != 2) {
            TSysPaymentMode paymentMode = tSysPaymentModeService.selectOne(new EntityWrapper<TSysPaymentMode>().last("LIMIT 1"));
            if (paymentMode != null && Integer.valueOf(1).equals(paymentMode.getTaxiType())) {
                try {
                    Map<String, String> startGeocode = gdMapGeocodingUtil.geocode(String.valueOf(orderTaxi.getStartLon()), String.valueOf(orderTaxi.getStartLat()));
                    if (orderTaxi.getEndLon() != null && orderTaxi.getEndLat() != null && startGeocode != null) {
                        Map<String, String> distance = gdMapElectricFenceUtil.getDistance(
                                orderTaxi.getStartLon() + "," + orderTaxi.getStartLat(),
                                orderTaxi.getEndLon() + "," + orderTaxi.getEndLat(),
                                1
                        );
                        if (distance != null) {
                            double distanceMeters = Double.parseDouble(distance.get("distance"));
                            long durationSeconds = Long.parseLong(distance.get("duration"));
                            ServerCarModelWarpper textPrice = serverCarModelService.getTextPrice(query.getId(), distanceMeters, durationSeconds, 0, 2, startGeocode);
                            if (textPrice != null && textPrice.getAmount() != null && textPrice.getAmount().get("zongfeiyong") != null) {
                                Double estimateAmount = Double.valueOf(textPrice.getAmount().get("zongfeiyong").toString());
                                orderTaxi.setEstimateAmount(estimateAmount);
                                orderTaxi.setOrderMoney(estimateAmount);
                                orderTaxi.setPaymentMode(1);
                                orderTaxi.setState(7);
                            } else {
                                orderTaxi.setPaymentMode(2);
                            }
                        } else {
                            orderTaxi.setPaymentMode(2);
                        }
                    } else {
                        orderTaxi.setPaymentMode(2);
                    }
                } catch (Exception e) {
                    e.printStackTrace();
                    orderTaxi.setPaymentMode(2);
                    orderTaxi.setState(1);
                }
            } else {
                orderTaxi.setPaymentMode(paymentMode != null && paymentMode.getTaxiType() != null ? paymentMode.getTaxiType() : 2);
            }
        }
        if (orderTaxi.getOrderSource() == 2 && null != orderTaxi.getDriverId()) {//扫码下单,
            Driver driver = driverService.selectById(orderTaxi.getDriverId());
            if (null == driver) {
@@ -372,7 +418,11 @@
        }
        
        //添加消息
        systemNoticeService.addSystemNotice(1, "您的出租车订单已下单成功,我们正在为您指派司机,请稍后!", orderTaxi.getUserId(), 1);
        if (orderTaxi.getState() == 7) {
            systemNoticeService.addSystemNotice(1, "您的出租车订单已生成,请先完成支付。", orderTaxi.getUserId(), 1);
        } else {
            systemNoticeService.addSystemNotice(1, "您的出租车订单已下单成功,我们正在为您指派司机,请稍后!", orderTaxi.getUserId(), 1);
        }
        
        BaseWarpper baseWarpper = new BaseWarpper();
        baseWarpper.setId(orderTaxi.getId());