Pu Zhibing
7 天以前 6e0bccef16f74b5aa80eb51d7792a36ed7e20c38
UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/crossCity/server/impl/OrderCrossCityServiceImpl.java
@@ -63,1441 +63,1449 @@
@Service
@Transactional(isolation = Isolation.READ_UNCOMMITTED, propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
public class OrderCrossCityServiceImpl extends ServiceImpl<OrderCrossCityMapper, OrderCrossCity> implements IOrderCrossCityService {
    @Resource
    private OrderCrossCityMapper orderCrossCityMapper;
    @Resource
    private LinePriceMapper linePriceMapper;
    @Resource
    private UserActivityDiscount1Mapper userActivityDiscount1Mapper;
    @Resource
    private SysIntegralMapper sysIntegralMapper;
    @Resource
    private LineShiftDriverMapper lineShiftDriverMapper;
    @Resource
    private OrderPrivateCarMapper orderPrivateCarMapper;
    @Resource
    private OrderTaxiMapper orderTaxiMapper;
    @Resource
    private RegionMapper regionMapper;
    @Resource
    private SensitiveWordsMapper sensitiveWordsMapper;
    @Autowired
    private GDMapElectricFenceUtil gdMapElectricFenceUtil;
    @Autowired
    private IUserInfoService userInfoService;
    @Autowired
    private IUserCouponRecordService userCouponRecordService;
    @Autowired
    private IUserRedPacketRecordService userRedPacketRecordService;
    @Autowired
    private IPaymentRecordService paymentRecordService;
    @Autowired
    private ITransactionDetailsService transactionDetailsService;
    @Autowired
    private IOrderPrivateCarService orderPrivateCarService;
    @Autowired
    private ILineService lineService;
    @Autowired
    private IIncomeService incomeService;
    @Autowired
    private IDriverService driverService;
    @Autowired
    private PushUtil pushUtil;
    @Autowired
    private ISystemNoticeService systemNoticeService;
    @Autowired
    private DateUtil dateUtil;
    @Autowired
    private GDMapGeocodingUtil gdMapGeocodingUtil;
    @Autowired
    private ChinaMobileUtil chinaMobileUtil;
    @Autowired
    private GDFalconUtil gdFalconUtil;
    @Resource
    private RedisTemplate<String, Object> redisTemplate;
    @Autowired
    private ICancleOrderService cancleOrderService;
    @Autowired
    private IOrderCancelService orderCancelService;
    @Autowired
    private RestTemplate internalRestTemplate;
    @Autowired
    private IUserActivityRedenvelopeService userActivityRedenvelopeService;
    @Autowired
    private IOrderPositionService orderPositionService;
    @Autowired
    private IOrderTaxiService orderTaxiService;
    @Autowired
    private ICompanyCityService companyCityService;
    @Autowired
    private IPushOrderService pushOrderService;
    @Autowired
    private IOpenCityService openCityService;
    @Autowired
    private PayMoneyUtil payMoneyUtil;
    @Autowired
    private IOrderLogisticsService orderLogisticsService;
    @Autowired
    private ITaxiCardPaymentService taxiCardPaymentService;
    @Autowired
    private ICompanyService companyService;
    @Autowired
    private ITaxiCardService taxiCardService;
    @Autowired
    private IUserUserService userUserService;
    @Autowired
    private IUserTaxiCardService userTaxiCardService;
    @Autowired
    private IRegionService regionService;
    @Value("${callbackPath}")
    private String callbackPath;
    public Map<String, Thread> threadMap = new HashMap<>();
    //存储摆渡车无接单后推送标识,实现多个类型的摆渡车订单无人接单后只给前端推送一次
    public static Map<Integer, Boolean> pushEndMap = new HashMap<>();
    /**
     * 计算支付金额
     * @param startLonLat
     * @param endLonLat
     * @param peopleNumber
     * @param travelMode
     * @param lineId
     * @param serverCarModelId
     * @return
     * @throws Exception
     */
    @Override
    public ResultUtil queryOrderMoney(String startLonLat, String endLonLat, Integer peopleNumber, Integer travelMode, Integer lineId,
                                      Integer serverCarModelId, Integer totalSeat, String seatNumber) throws Exception {
        // TODO: 2023/11/4 无法修改
        Map<String, String> distance = gdMapElectricFenceUtil.getDistance(startLonLat, endLonLat, 1);//调用高德计算距离
        if(null != distance){
            return this.getPrice(Double.valueOf(distance.get("distance")), peopleNumber, travelMode, lineId, serverCarModelId, totalSeat, seatNumber);
        }
        return ResultUtil.error("计算行程距离出错啦!");
    }
    /**
     * 获取用户余额和可用优惠券数量
     * @param orderId
     * @param uid
     * @return
     * @throws Exception
     */
    @Override
    public Map<String, Object> queryBalance(Integer orderId, Integer uid) throws Exception {
        Map<String, Object> map = new HashMap<>();
        UserInfo userInfo = userInfoService.selectById(uid);
        map.put("balance", userInfo.getBalance());
        OrderCrossCity orderCrossCity = this.selectById(orderId);
        int i = userCouponRecordService.queryAvailable(uid, orderCrossCity.getCompanyId(), 1, 3, orderCrossCity.getOrderMoney());
        i = i + userCouponRecordService.queryAvailable(uid, orderCrossCity.getCompanyId(), 1, 0, orderCrossCity.getOrderMoney());
        map.put("coupon", i);
        return map;
    }
    @Override
    public PreferentialDataVo queryBalance1(Integer orderId, Integer uid) throws Exception {
        UserInfo userInfo = userInfoService.selectById(uid);
        PreferentialDataVo preferentialDataVo = new PreferentialDataVo();
        preferentialDataVo.setBalance(userInfo.getBalance());
        OrderCrossCity orderCrossCity = this.selectById(orderId);
        Integer ids = userInfoService.getDiscount();
        if(ids!=null){
            List<UserActivityDiscount1> userActivityId = userActivityDiscount1Mapper.selectList(new EntityWrapper<UserActivityDiscount1>().eq("userActivityId", ids));
            if(userActivityId.size()>0){
                preferentialDataVo.setDiscount(userActivityId.get(0).getLogistics());
            }
        }
        // 查出当前用户的红包 并将订单的修改
        List<UserRedPacketRecord> userRedPacketRecords = userRedPacketRecordService.selectList(new EntityWrapper<UserRedPacketRecord>().eq("userId", uid).eq("state", 1).le("money",orderCrossCity.getOrderMoney()).gt("expirationTime", new Date()).gt("endTime", new Date()));
        if(userRedPacketRecords.size()>0){
            preferentialDataVo.setRedPacket(userRedPacketRecords.get(0).getMoney());
            orderCrossCity.setRedPacketId(userRedPacketRecords.get(0).getId());
            orderCrossCity.setRedPacketMoney(userRedPacketRecords.get(0).getMoney());
            this.updateById(orderCrossCity);
        }
        //获取优惠券中最优数据
        List<UserCouponRecord> list = userCouponRecordService.selectList(new EntityWrapper<UserCouponRecord>().eq("companyId", orderCrossCity.getCompanyId()).eq("state", 1).le("money",orderCrossCity.getOrderMoney()).in("couponUseType", Arrays.asList(0, 3)).eq("userId", uid).where("now() < expirationTime"));
        Integer id = null;
        Double price = 0d;
        Integer type = 0;
        for (UserCouponRecord userCouponRecord : list){
            if(userCouponRecord.getCouponType() == 1){//抵扣券
                if(price.compareTo(userCouponRecord.getMoney()) < 0){
                    price = userCouponRecord.getMoney();
                    id = userCouponRecord.getId();
                    type = 1;
                }
            }else{//满减券
                if(orderCrossCity.getOrderMoney().compareTo(userCouponRecord.getFullMoney()) >= 0 && price.compareTo(userCouponRecord.getMoney()) < 0){
                    price = userCouponRecord.getMoney();
                    id = userCouponRecord.getId();
                    type = 1;
                }
            }
        }
        //获取打车卡中最优数
        Map<String, String> geocode = gdMapGeocodingUtil.geocode(orderCrossCity.getStartLon().toString(), orderCrossCity.getStartLat().toString());
        CompanyCity companyCity = companyCityService.selectOne(new EntityWrapper<CompanyCity>().eq("companyId", orderCrossCity.getCompanyId()).eq("areaCode", geocode.get("districtCode")).eq("state", 1));
        if(null == companyCity){
            companyCity = companyCityService.selectOne(new EntityWrapper<CompanyCity>().eq("companyId", orderCrossCity.getCompanyId()).eq("cityCode", geocode.get("cityCode")).eq("state", 1));
        }
        if(null == companyCity){
            companyCity = companyCityService.selectOne(new EntityWrapper<CompanyCity>().eq("companyId", orderCrossCity.getCompanyId()).eq("provinceCode", geocode.get("provinceCode")).eq("state", 1));
        }
        List<UserTaxiCard> userTaxiCards=new ArrayList<>();
        if(companyCity!=null) {
             userTaxiCards = userTaxiCardService.selectList(new EntityWrapper<UserTaxiCard>().like("companyCityId", "%" + companyCity.getId() + "%")
                    .in("type", Arrays.asList(1, 2, 3, 4)).eq("userId", uid).where("now() between startTime and endTime"));
        }
        //全国卡
        List<TaxiCard> taxiCards = taxiCardService.selectList(new EntityWrapper<TaxiCard>().eq("taxiCardType", 2).in("type", Arrays.asList(1, 2, 3, 4)).eq("state", 1));
        if(taxiCards.size() > 0) {
            List<UserTaxiCard> userTaxiCards2 = userTaxiCardService.selectList(new EntityWrapper<UserTaxiCard>().eq("userId", uid)
                    .in("type", Arrays.asList(1, 2, 3, 4)).in("taxiCardId", taxiCards.stream().map(TaxiCard::getId).collect(Collectors.toList())).where("now() between startTime and endTime"));
            userTaxiCards.addAll(userTaxiCards2);
        }
        Map<String, Object> map = getOptimalTaxiCards(orderCrossCity, price, id, type, userTaxiCards);
        price = Double.valueOf(map.get("price").toString());
        id = null != map.get("id") ? Integer.valueOf(map.get("id").toString()) : null;
        type = Integer.valueOf(map.get("type").toString());
        //亲密账户
        List<UserTaxiCard> userTaxiCards_ = new ArrayList<>();
        List<UserUser> bindUserId = userUserService.selectList(new EntityWrapper<UserUser>().eq("bindUserId", uid));
        CompanyCity finalCompanyCity = companyCity;
        bindUserId.forEach(userUser -> {
            if(finalCompanyCity !=null) {
                List<UserTaxiCard> userTaxiCards1 = userTaxiCardService.selectList(new EntityWrapper<UserTaxiCard>().in("type", Arrays.asList(1, 2, 3, 4))
                        .like("companyCityId", "%" + finalCompanyCity.getId() + "%").eq("userId", userUser.getUserId()).where("now() between startTime and endTime"));
                userTaxiCards_.addAll(userTaxiCards1);
            }
            //全国卡
            if(taxiCards.size() > 0) {
                List<UserTaxiCard> userTaxiCards2 = userTaxiCardService.selectList(new EntityWrapper<UserTaxiCard>().eq("userId", userUser.getUserId())
                        .in("type", Arrays.asList(1, 2, 3, 4)).in("taxiCardId", taxiCards.stream().map(TaxiCard::getId).collect(Collectors.toList())).where("now() between startTime and endTime"));
                userTaxiCards_.addAll(userTaxiCards2);
            }
        });
        map = getOptimalTaxiCards(orderCrossCity, price, id, type, userTaxiCards_);
        price = Double.valueOf(map.get("price").toString());
        id = null != map.get("id") ? Integer.valueOf(map.get("id").toString()) : null;
        type = Integer.valueOf(map.get("type").toString());
        if(price<=orderCrossCity.getOrderMoney() || type==2){
            preferentialDataVo.setObjectId(id);
            preferentialDataVo.setDiscountAmount(price);
            preferentialDataVo.setType(type);
        }
        return preferentialDataVo;
    }
    public Map<String, Object> getOptimalTaxiCards(OrderCrossCity orderCrossCity, Double price, Integer id, Integer type, List<UserTaxiCard> userTaxiCards) throws Exception{
        Map<String, Object> map = new HashMap<>();
        for(UserTaxiCard t : userTaxiCards){
            JSONObject jsonObject = JSON.parseObject(t.getContent());
            List<Integer> integers = jsonObject.getJSONArray("businessTypes").toJavaList(Integer.class);
            if(!integers.contains(3)){
                continue;
            }
            if(t.getType() == 1){//打折次数卡{"businessTypes":[1,2,3],"time":5,"timeQuantum":["08:00:00 - 09:00:00","17:00:00 - 18:00:00"],"discount":5}
                Integer time = jsonObject.getInteger("time");
                if(time == 0){
                    continue;
                }
                JSONArray timeQuantum = jsonObject.getJSONArray("timeQuantum");
                Double discount = jsonObject.getDouble("discount");
                SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
                SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
                Date date = new Date();
                for(int i = 0; i < timeQuantum.size(); i++){
                    String[] split = timeQuantum.getString(i).split(" - ");
                    Date s = sdf1.parse(sdf.format(date) + " " + split[0]);
                    Date e = sdf1.parse(sdf.format(date) + " " + split[1]);
                    if(s.getTime() <= System.currentTimeMillis() && System.currentTimeMillis() < e.getTime()){
                        double v = new BigDecimal(orderCrossCity.getOrderMoney()).multiply(new BigDecimal((10 - discount) / 10)).setScale(2, RoundingMode.HALF_EVEN).doubleValue();
                        if(price.compareTo(v) < 0){
                            price = v;
                            id = t.getId();
                            type = 2;
                        }
                    }
                }
            }
            if(t.getType() == 2){//优惠卡{"businessTypes":[1,2,3],"fullReduction":[[50,3],[100,5],[150,10]]}
                JSONArray timeQuantum = jsonObject.getJSONArray("timeQuantum");
                JSONArray fullReduction = jsonObject.getJSONArray("fullReduction");
                SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
                SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
                Date date = new Date();
                for(int i = 0; i < timeQuantum.size(); i++){
                    String[] split = timeQuantum.getString(i).split(" - ");
                    Date s = sdf1.parse(sdf.format(date) + " " + split[0]);
                    Date e = sdf1.parse(sdf.format(date) + " " + split[1]);
                    if(s.getTime() <= System.currentTimeMillis() && System.currentTimeMillis() < e.getTime()){
                        for(int j = fullReduction.size() - 1; j >= 0; j--){
                            JSONArray jsonArray = fullReduction.getJSONArray(j);
                            Double p = jsonArray.getDouble(0);//满金额
                            Double y = jsonArray.getDouble(1);//优惠金额
                            if(orderCrossCity.getOrderMoney().compareTo(p) >= 0 && price.compareTo(y) < 0){
                                price = y;
                                id = t.getId();
                                type = 2;
                            }
                        }
                    }
                }
            }
            if(t.getType() == 3){//次数卡{"businessTypes":[1,2,3],"time":1,"discountAmount":10}
                Integer time = jsonObject.getInteger("time");
                if(time == 0){
                    continue;
                }
                JSONArray timeQuantum = jsonObject.getJSONArray("timeQuantum");
                Double discountAmount = jsonObject.getDouble("discountAmount");
                SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
                SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
                Date date = new Date();
                for(int i = 0; i < timeQuantum.size(); i++){
                    String[] split = timeQuantum.getString(i).split(" - ");
                    Date s = sdf1.parse(sdf.format(date) + " " + split[0]);
                    Date e = sdf1.parse(sdf.format(date) + " " + split[1]);
                    if(s.getTime() <= System.currentTimeMillis() && System.currentTimeMillis() < e.getTime()){
                        if(price.compareTo(discountAmount) < 0){
                            price = discountAmount;
                            id = t.getId();
                            type = 2;
                        }
                    }
                }
            }
            if(t.getType() == 4){//打折天数卡{"businessTypes":[1,2,3],"discount":5,"timeQuantum":["08:00:00 - 09:00:00","17:00:00 - 18:00:00"]}
                Double discount = jsonObject.getDouble("discount");//折扣
                JSONArray timeQuantum = jsonObject.getJSONArray("timeQuantum");//使用时间段
                SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
                SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
                Date date = new Date();
                for(int i = 0; i < timeQuantum.size(); i++){
                    String[] split = timeQuantum.getString(i).split(" - ");
                    Date s = sdf1.parse(sdf.format(date) + " " + split[0]);
                    Date e = sdf1.parse(sdf.format(date) + " " + split[1]);
                    if(s.getTime() <= System.currentTimeMillis() && System.currentTimeMillis() < e.getTime()){
                        double v = new BigDecimal(orderCrossCity.getOrderMoney()).multiply(new BigDecimal((10 - discount) / 10)).setScale(2, RoundingMode.HALF_EVEN).doubleValue();
                        if(price.compareTo(v) < 0){
                            price = v;
                            id = t.getId();
                            type = 2;
                        }
                    }
                }
            }
        }
        map.put("price", price);
        map.put("id", id);
        map.put("type", type);
        return map;
    }
    /**
     * 获取支付页面的优惠券列表
     * @param orderId
     * @param uid
     * @param pageNum
     * @param size
     * @return
     * @throws Exception
     */
    @Override
    public List<Map<String, Object>> queryCoupon(Integer orderId, Integer uid, Integer pageNum, Integer size) throws Exception {
        OrderCrossCity orderCrossCity = this.selectById(orderId);
        List<Map<String, Object>> list = userCouponRecordService.queryCoupon(uid, orderCrossCity.getCompanyId(), 1, 3, orderCrossCity.getOrderMoney(), pageNum, size);
        List<Map<String, Object>> list1 = userCouponRecordService.queryCoupon(uid, orderCrossCity.getCompanyId(), 1, 0, orderCrossCity.getOrderMoney(), pageNum, size);
        list.addAll(list1);
        return list;
    }
    @Override
    public List<CouponsListVo> queryCouponList(Integer orderId, Integer uid, Integer pageNum, Integer size) throws Exception {
        pageNum = (pageNum - 1) * size;
        OrderCrossCity orderCrossCity = this.selectById(orderId);
        List<CouponsListVo> rows = new ArrayList<>();
        List<UserCouponRecord> list = userCouponRecordService.selectList(new EntityWrapper<UserCouponRecord>().eq("companyId", orderCrossCity.getCompanyId())
                .eq("state", 1).in("couponUseType", Arrays.asList(0, 3)).eq("userId", uid).where("expirationTime >= now()"));
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        for (UserCouponRecord userCouponRecord : list){
            if(userCouponRecord.getCouponType() == 2){//满减券
                if(orderCrossCity.getOrderMoney().compareTo(userCouponRecord.getFullMoney()) < 0){
                    continue;
                }
            }
            CouponsListVo couponsListVo = new CouponsListVo();
            couponsListVo.setId(userCouponRecord.getId());
            couponsListVo.setDataType(1);
            couponsListVo.setMoney(userCouponRecord.getMoney());
            couponsListVo.setUserType(userCouponRecord.getCouponUseType());
            couponsListVo.setTime(sdf.format(userCouponRecord.getExpirationTime()));
            couponsListVo.setType(userCouponRecord.getCouponType());
            couponsListVo.setFullMoney(userCouponRecord.getFullMoney());
            couponsListVo.setState(userCouponRecord.getState());
            Company company = companyService.selectById(userCouponRecord.getCompanyId());
            couponsListVo.setCompany(company.getName());
            rows.add(couponsListVo);
        }
        Map<String, String> geocode = gdMapGeocodingUtil.geocode(orderCrossCity.getStartLon().toString(), orderCrossCity.getStartLat().toString());
        CompanyCity companyCity = companyCityService.selectOne(new EntityWrapper<CompanyCity>().eq("companyId", orderCrossCity.getCompanyId()).eq("areaCode", geocode.get("districtCode")).eq("state", 1));
        if(null == companyCity){
            companyCity = companyCityService.selectOne(new EntityWrapper<CompanyCity>().eq("companyId", orderCrossCity.getCompanyId()).eq("cityCode", geocode.get("cityCode")).eq("state", 1));
        }
        if(null == companyCity){
            companyCity = companyCityService.selectOne(new EntityWrapper<CompanyCity>().eq("companyId", orderCrossCity.getCompanyId()).eq("provinceCode", geocode.get("provinceCode")).eq("state", 1));
        }
        List<UserTaxiCard> userTaxiCards = userTaxiCardService.selectList(new EntityWrapper<UserTaxiCard>().eq("userId", uid)
                .in("type", Arrays.asList(1, 2, 3, 4)).like("companyCityId", "%" + companyCity.getId() + "%").where("now() between startTime and endTime"));
        //全国卡
        List<TaxiCard> taxiCards = taxiCardService.selectList(new EntityWrapper<TaxiCard>().eq("taxiCardType", 2).in("type", Arrays.asList(1, 2, 3, 4)).eq("state", 1));
        if(taxiCards.size() > 0){
            List<UserTaxiCard> userTaxiCards1 = userTaxiCardService.selectList(new EntityWrapper<UserTaxiCard>().eq("userId", uid)
                    .in("type", Arrays.asList(1, 2, 3, 4)).in("taxiCardId", taxiCards.stream().map(TaxiCard::getId).collect(Collectors.toList())).where("now() between startTime and endTime"));
            userTaxiCards.addAll(userTaxiCards1);
        }
        //亲密账户
        List<UserUser> bindUserId = userUserService.selectList(new EntityWrapper<UserUser>().eq("bindUserId", uid));
        CompanyCity finalCompanyCity = companyCity;
        bindUserId.forEach(userUser -> {
            List<UserTaxiCard> taxiCardPayments1 = userTaxiCardService.selectList(new EntityWrapper<UserTaxiCard>().in("type", Arrays.asList(1, 2, 3, 4))
                    .like("companyCityId", "%" + finalCompanyCity.getId() + "%").eq("userId", userUser.getUserId()).where("now() between startTime and endTime"));
            userTaxiCards.addAll(taxiCardPayments1);
            //全国卡
            if(taxiCards.size() > 0){
                List<UserTaxiCard> userTaxiCards1 = userTaxiCardService.selectList(new EntityWrapper<UserTaxiCard>().eq("userId", userUser.getUserId())
                        .in("type", Arrays.asList(1, 2, 3, 4)).in("taxiCardId", taxiCards.stream().map(TaxiCard::getId).collect(Collectors.toList())).where("now() between startTime and endTime"));
                userTaxiCards.addAll(userTaxiCards1);
            }
        });
        for(UserTaxiCard t : userTaxiCards){
            try {
                CouponsListVo couponsListVo = new CouponsListVo();
                couponsListVo.setId(t.getId());
                couponsListVo.setDataType(2);
                couponsListVo.setUserType(1);
                couponsListVo.setTaxiCardType(t.getType());
                couponsListVo.setTime(sdf.format(t.getEndTime()));
                couponsListVo.setState(1);
                Company company = companyService.selectById(t.getCompanyId());
                couponsListVo.setCompany(company.getName());
                couponsListVo.setName(taxiCardService.selectById(t.getTaxiCardId()).getName());
                JSONObject jsonObject = JSON.parseObject(t.getContent());
                JSONArray businessTypes = jsonObject.getJSONArray("businessTypes");
                if(!businessTypes.toJavaList(Integer.class).contains(3)){
                    continue;
                }
                if(t.getType() == 1){//{"businessTypes":[1,2,3],"time":5,"timeQuantum":["08:00:00 - 09:00:00","17:00:00 - 18:00:00"],"discount":5}
                    Integer time = jsonObject.getInteger("time");
                    if(time == 0){
                        continue;
                    }
                    JSONArray timeQuantum = jsonObject.getJSONArray("timeQuantum");
                    SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd");
                    boolean b = true;
                    for(int i = 0; i < timeQuantum.size(); i++){
                        String[] split = timeQuantum.getString(i).split(" - ");
                        Date s = sdf.parse(sdf1.format(new Date()) + " " + split[0]);
                        Date e = sdf.parse(sdf1.format(new Date()) + " " + split[1]);
                        if(s.getTime() <= System.currentTimeMillis() && System.currentTimeMillis() < e.getTime()){
                            b = false;
                            break;
                        }
                    }
                    if(b){
                        continue;
                    }
                    couponsListVo.setMoney(jsonObject.getDouble("discount"));
                    couponsListVo.setType(1);
                }
                if(t.getType() == 2){//{"businessTypes":[1,2,3],"fullReduction":[[50,3],[100,5],[150,10]]}
                    JSONArray timeQuantum = jsonObject.getJSONArray("timeQuantum");
                    SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd");
                    boolean b = true;
                    for(int i = 0; i < timeQuantum.size(); i++){
                        String[] split = timeQuantum.getString(i).split(" - ");
                        Date s = sdf.parse(sdf1.format(new Date()) + " " + split[0]);
                        Date e = sdf.parse(sdf1.format(new Date()) + " " + split[1]);
                        if(s.getTime() <= System.currentTimeMillis() && System.currentTimeMillis() < e.getTime()){
                            b = false;
                            break;
                        }
                    }
                    if(b){
                        continue;
                    }
                    JSONArray fullReduction = jsonObject.getJSONArray("fullReduction");
                    b = true;
                    for(int i = fullReduction.size() - 1; i >= 0; i--){
                        Double m = fullReduction.getJSONArray(i).getDouble(0);
                        Double y = fullReduction.getJSONArray(i).getDouble(1);
                        if(m.compareTo(orderCrossCity.getOrderMoney()) <= 0){
                            couponsListVo.setMoney(y);
                            couponsListVo.setFullMoney(m);
                            b = false;
                            break;
                        }
                    }
                    if(b){
                        continue;
                    }
                    couponsListVo.setType(2);
                }
                if(t.getType() == 3){//{"businessTypes":[1,2,3],"time":1,"discountAmount":10}
                    Integer time = jsonObject.getInteger("time");
                    if(time == 0){
                        continue;
                    }
                    JSONArray timeQuantum = jsonObject.getJSONArray("timeQuantum");
                    SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd");
                    boolean b = true;
                    for(int i = 0; i < timeQuantum.size(); i++){
                        String[] split = timeQuantum.getString(i).split(" - ");
                        Date s = sdf.parse(sdf1.format(new Date()) + " " + split[0]);
                        Date e = sdf.parse(sdf1.format(new Date()) + " " + split[1]);
                        if(s.getTime() <= System.currentTimeMillis() && System.currentTimeMillis() < e.getTime()){
                            b = false;
                            break;
                        }
                    }
                    if(b){
                        continue;
                    }
                    couponsListVo.setMoney(jsonObject.getDouble("discountAmount"));
                    couponsListVo.setType(2);
                }
                if(t.getType() == 4){//{"businessTypes":[1,2,3],"discount":5,"timeQuantum":["08:00:00 - 09:00:00","17:00:00 - 18:00:00"]}
                    JSONArray timeQuantum = jsonObject.getJSONArray("timeQuantum");
                    SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd");
                    boolean b = true;
                    for(int i = 0; i < timeQuantum.size(); i++){
                        String[] split = timeQuantum.getString(i).split(" - ");
                        Date s = sdf.parse(sdf1.format(new Date()) + " " + split[0]);
                        Date e = sdf.parse(sdf1.format(new Date()) + " " + split[1]);
                        if(s.getTime() <= System.currentTimeMillis() && System.currentTimeMillis() < e.getTime()){
                            b = false;
                            break;
                        }
                    }
                    if(b){
                        continue;
                    }
                    couponsListVo.setMoney(jsonObject.getDouble("discount"));
                    couponsListVo.setType(1);
                }
                String str = "";
                TaxiCard taxiCard = taxiCardService.selectById(t.getTaxiCardId());
                if(taxiCard.getTaxiCardType() == 1){
                    String[] split = taxiCard.getCompanyCityId().split(";");
                    for(String c : split){
                        CompanyCity companyCity1 = companyCityService.selectById(c);
                        if(ToolUtil.isNotEmpty(companyCity1.getAreaCode())){
                            Region region = regionService.selectOne(new EntityWrapper<Region>().eq("code", companyCity1.getAreaCode()));
                            str += region.getName() + ";";
                            continue;
                        }
                        if(ToolUtil.isNotEmpty(companyCity1.getCityCode())){
                            Region region = regionService.selectOne(new EntityWrapper<Region>().eq("code", companyCity1.getCityCode()));
                            str += region.getName() + ";";
                            continue;
                        }
                        if(ToolUtil.isNotEmpty(companyCity1.getProvinceCode())){
                            Region region = regionService.selectOne(new EntityWrapper<Region>().eq("code", companyCity1.getProvinceCode()));
                            str += region.getName() + ";";
                            continue;
                        }
                    }
                }else{
                    str = "全国;";
                }
                couponsListVo.setCity(str.substring(0, str.length() - 1));
                rows.add(couponsListVo);
            }catch (Exception e){
                e.printStackTrace();
            }
        }
        Collections.sort(rows, new Comparator<CouponsListVo>() {
            public int compare(CouponsListVo s1, CouponsListVo s2) {
                return Integer.compare(s1.getId(), s2.getId());
            }
        });
        if(rows.size() >= (pageNum + 1) * size){
            rows = rows.subList(pageNum, pageNum + size);
        }else if(pageNum < rows.size() && rows.size() < (pageNum + 1) * size){
            rows = rows.subList(pageNum, rows.size());
        }else{
            rows = new ArrayList<>();
        }
        rows = rows.stream().filter(e->e.getMoney()<=orderCrossCity.getOrderMoney()|| e.getDataType()==2).collect(Collectors.toList());
        return rows;
    }
    /**
     * 订单支付
     * @param payType
     * @param orderId
     * @param couponId
     * @param type
     * @return
     * @throws Exception
     */
    @Override
    public ResultUtil payCrossCityOrder(Integer payType, Integer orderId, Integer couponId, Integer type) throws Exception {
        OrderCrossCity orderCrossCity = this.selectById(orderId);
        if(orderCrossCity.getState() != 7){
            return ResultUtil.error("订单已完成支付,不允许重复支付", "");
        }
        Integer uid = orderCrossCity.getUserId();
        Double orderMoney = orderCrossCity.getOrderMoney();
        UserInfo userInfo = userInfoService.selectById(uid);
        ResultUtil resultUtil = ResultUtil.success(new Object());
        orderCrossCity.setCouponMoney(0D);//初始化历史数据
        orderCrossCity.setCouponId(null);
        //计算优惠券
        UserCouponRecord userCouponRecord = null;
        if(null != couponId){
            userCouponRecord = userCouponRecordService.selectById(couponId);
            if(null != userCouponRecord){
                if(userCouponRecord.getCompanyId() != orderCrossCity.getCompanyId()){
                    return ResultUtil.error("优惠券不能用于此订单", "");
                }
                if(userCouponRecord.getState() == 2){
                    return ResultUtil.error("优惠券已使用", "");
                }
                if(userCouponRecord.getState() == 3){
                    return ResultUtil.error("优惠券已过期", "");
                }
                if(userCouponRecord.getCouponUseType() != 0 && userCouponRecord.getCouponUseType() != 3){
                    return ResultUtil.error("优惠券不能用于此类型订单", "");
                }
                if(userCouponRecord.getCouponType() == 2 && orderMoney.compareTo(userCouponRecord.getFullMoney()) < 0){
                    return ResultUtil.error("优惠券不能用于此订单", "");
                }
                orderMoney = orderMoney - userCouponRecord.getMoney();
                orderCrossCity.setCouponMoney(userCouponRecord.getMoney());
                orderCrossCity.setCouponId(couponId);
            }
        }
        //计算红包
        UserRedPacketRecord query = userRedPacketRecordService.query(uid, orderCrossCity.getCompanyId(), 1, 3, orderMoney);
        if(null != query && orderMoney.compareTo(query.getMoney()) > 0){
            orderMoney = orderMoney - query.getMoney();
            orderCrossCity.setRedPacketMoney(query.getMoney());
            orderCrossCity.setRedPacketId(query.getId());
        }
        //计算折扣
        UserActivityDiscount1 query2 = userActivityDiscount1Mapper.query(orderCrossCity.getCompanyId());
        if(null != query2){
            Double special = query2.getSpecial();
            orderCrossCity.setDiscount(special);
            double v = new BigDecimal(orderMoney).multiply(new BigDecimal(special / 10)).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue();
            if(orderMoney.compareTo(v) > 0){
                orderCrossCity.setDiscountMoney(orderMoney - v);
                orderCrossCity.setActivityId(query2.getId());
                orderMoney = v;
            }
        }
        if(payType == 1){//微信支付
            String app = type == 1 ? "APP" : "JSAPI";
            resultUtil = payMoneyUtil.weixinpay("完成订单", "", orderId + "_3_" + UUIDUtil.getRandomCode(5), orderMoney.toString(), "/base/wxPayOrderTaxi", app, userInfo.getAppletsOpenId());
            paymentRecordService.saveData(1, orderCrossCity.getUserId(), 1, orderId, 3, 1, orderMoney, "", 1);//添加预支付数据
        }
        if(payType == 2){//支付宝支付
            resultUtil = payMoneyUtil.alipay("完成订单", "完成订单", "", orderId + "_3_" + UUIDUtil.getRandomCode(5), orderMoney.toString(), "/base/aliPayOrderTaxi");
            paymentRecordService.saveData(1, orderCrossCity.getUserId(), 1, orderId, 3, 2, orderMoney, "", 1);//添加预支付数据
        }
        if(payType == 3){//余额支付
            if(userInfo.getBalance() == null || userInfo.getBalance() < orderMoney){
                return ResultUtil.error("余额不足,无法完成支付", "");
            }
            userInfo.setBalance(new BigDecimal(userInfo.getBalance()).subtract(new BigDecimal(orderMoney)).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue());
            SysIntegral query1 = sysIntegralMapper.query(orderCrossCity.getCompanyId());
            userInfo.setIntegral(userInfo.getIntegral() + (orderMoney.intValue() * query1.getIntegral()));//积分
            //添加交易明细
            transactionDetailsService.saveData(uid, "跨城出行订单", orderMoney, 2, 1, 1, 3, orderId);
            userInfoService.updateById(userInfo);
            orderCrossCity.setState(2);//跨城支付完成后才开始服务
            orderCrossCity.setPayType(3);
            orderCrossCity.setPayMoney(orderMoney);
            //处理优惠券和红包
            if(null != userCouponRecord){
                userCouponRecord.setState(2);
                userCouponRecord.setEndTime(new Date());
                userCouponRecordService.updateById(userCouponRecord);
            }
            if(null != query){
                query.setState(2);
                query.setEndTime(new Date());
                userRedPacketRecordService.updateById(query);
            }
            // TODO: 2020/5/24 这里需要给司机和用户推送订单状态
            new Thread(new Runnable() {
                @Override
                public void run() {
                    pushUtil.pushOrderState(1, orderCrossCity.getUserId(), orderCrossCity.getId(), 3, orderCrossCity.getState(), 0);
                    pushUtil.pushOrderState(2, orderCrossCity.getDriverId(), orderCrossCity.getId(), 3, orderCrossCity.getState(), 0);
                    pushUtil.pushDriverPosition(orderCrossCity.getId(), 3);
                }
            }).start();
            systemNoticeService.addSystemNotice(1, "您已使用余额成功完成出行订单支付,谢谢使用!", uid, 1);
        }
        this.updateAllColumnById(orderCrossCity);
        return resultUtil;
    }
    @Override
    @Transactional(propagation = Propagation.REQUIRES_NEW)
    public ResultUtil payCrossCityOrder1(Integer payType, Integer orderId, Integer objectId, Integer objectType, Integer type) throws Exception {
        OrderCrossCity orderCrossCity = this.selectById(orderId);
        if(orderCrossCity.getState() != 7){
            return ResultUtil.error("订单已完成支付,不允许重复支付", "");
        }
        Integer uid = orderCrossCity.getUserId();
        Double orderMoney = orderCrossCity.getOrderMoney();
        UserInfo userInfo = userInfoService.selectById(uid);
        ResultUtil resultUtil = ResultUtil.success(new Object());
        orderCrossCity.setCouponMoney(0D);//初始化历史数据
        orderCrossCity.setCouponId(null);
        //计算优惠券
        UserCouponRecord userCouponRecord = null;
        if(null != objectId && 1 == objectType){
            userCouponRecord = userCouponRecordService.selectById(objectId);
            if(userCouponRecord.getCompanyId() != orderCrossCity.getCompanyId()){
                return ResultUtil.error("优惠券不能用于此订单", "");
            }
            if(userCouponRecord.getState() == 2){
                return ResultUtil.error("优惠券已使用", "");
            }
            if(userCouponRecord.getState() == 3){
                return ResultUtil.error("优惠券已过期", "");
            }
            if(userCouponRecord.getCouponUseType() != 0 && userCouponRecord.getCouponUseType() != 3){
                return ResultUtil.error("优惠券不能用于此类型订单", "");
            }
            if(userCouponRecord.getCouponType() == 2 && orderMoney.compareTo(userCouponRecord.getFullMoney()) < 0){
                return ResultUtil.error("优惠券不能用于此订单", "");
            }
            orderMoney = orderMoney - userCouponRecord.getMoney();
            orderCrossCity.setCouponMoney(userCouponRecord.getMoney());
            orderCrossCity.setCouponId(objectId);
        }
        //打车卡
        UserTaxiCard userTaxiCard = null;
        if(null != objectId && objectType == 2){
            userTaxiCard = userTaxiCardService.selectById(objectId);
            TaxiCard taxiCard = taxiCardService.selectById(userTaxiCard.getTaxiCardId());
            if(taxiCard.getTaxiCardType() == 1 && userTaxiCard.getCompanyId() != orderCrossCity.getCompanyId()){
                return ResultUtil.error("打车卡不能用于此订单", "");
            }
            if(System.currentTimeMillis() > userTaxiCard.getEndTime().getTime()){
                return ResultUtil.error("打车卡已过期", "");
            }
            if(userTaxiCard.getType() == 1 || userTaxiCard.getType() == 3){
                Integer time = JSON.parseObject(userTaxiCard.getContent()).getInteger("time");
                if(0 == time){
                    return ResultUtil.error("打车卡已使用完", "");
                }
            }
            List<Integer> integers = JSON.parseObject(userTaxiCard.getContent()).getJSONArray("businessTypes").toJavaList(Integer.class);
            if(!integers.contains(3)){
                return ResultUtil.error("打车卡不能用于此类型订单", "");
            }
            Double yh = 0D;
            JSONObject jsonObject = JSON.parseObject(userTaxiCard.getContent());
            if(userTaxiCard.getType() == 1){//打折次数卡{"businessTypes":[1,2,3],"time":5,"timeQuantum":["08:00:00 - 09:00:00","17:00:00 - 18:00:00"],"discount":5}
                JSONArray timeQuantum = jsonObject.getJSONArray("timeQuantum");
                Double discount = jsonObject.getDouble("discount");
                SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
                SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
                Date date = new Date();
                for(int i = 0; i < timeQuantum.size(); i++){
                    String[] split = timeQuantum.getString(i).split(" - ");
                    Date s = sdf1.parse(sdf.format(date) + " " + split[0]);
                    Date e = sdf1.parse(sdf.format(date) + " " + split[1]);
                    if(s.getTime() <= System.currentTimeMillis() && System.currentTimeMillis() < e.getTime()){
                        yh = new BigDecimal(orderCrossCity.getOrderMoney()).multiply(new BigDecimal((10 - discount) / 10)).setScale(2, RoundingMode.HALF_EVEN).doubleValue();
                        jsonObject.put("time", jsonObject.getInteger("time") - 1);
                        userTaxiCard.setContent(jsonObject.toJSONString());
                        break;
                    }
                }
            }
            if(userTaxiCard.getType() == 2){//优惠卡{"businessTypes":[1,2,3],"fullReduction":[[50,3],[100,5],[150,10]]}
                JSONArray timeQuantum = jsonObject.getJSONArray("timeQuantum");
                JSONArray fullReduction = jsonObject.getJSONArray("fullReduction");
                SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
                SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
                Date date = new Date();
                for(int i = 0; i < timeQuantum.size(); i++){
                    String[] split = timeQuantum.getString(i).split(" - ");
                    Date s = sdf1.parse(sdf.format(date) + " " + split[0]);
                    Date e = sdf1.parse(sdf.format(date) + " " + split[1]);
                    if(s.getTime() <= System.currentTimeMillis() && System.currentTimeMillis() < e.getTime()){
                        for(int j = fullReduction.size() - 1; j >= 0 ; j--){
                            JSONArray jsonArray = fullReduction.getJSONArray(j);
                            Double p = jsonArray.getDouble(0);//满金额
                            if(orderCrossCity.getOrderMoney().compareTo(p) >= 0){
                                yh = jsonArray.getDouble(1);//优惠金额
                                break;
                            }
                        }
                    }
                }
            }
            if(userTaxiCard.getType() == 3){//次数卡{"businessTypes":[1,2,3],"time":1,"discountAmount":10}
                JSONArray timeQuantum = jsonObject.getJSONArray("timeQuantum");
                SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
                SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
                Date date = new Date();
                for(int i = 0; i < timeQuantum.size(); i++){
                    String[] split = timeQuantum.getString(i).split(" - ");
                    Date s = sdf1.parse(sdf.format(date) + " " + split[0]);
                    Date e = sdf1.parse(sdf.format(date) + " " + split[1]);
                    if(s.getTime() <= System.currentTimeMillis() && System.currentTimeMillis() < e.getTime()){
                        yh = jsonObject.getDouble("discountAmount");
                        jsonObject.put("time", jsonObject.getInteger("time") - 1);
                        userTaxiCard.setContent(jsonObject.toJSONString());
                    }
                }
            }
            if(userTaxiCard.getType() == 4){//打折天数卡{"businessTypes":[1,2,3],"discount":5,"timeQuantum":["08:00:00 - 09:00:00","17:00:00 - 18:00:00"]}
                Double discount = jsonObject.getDouble("discount");//折扣
                JSONArray timeQuantum = jsonObject.getJSONArray("timeQuantum");//使用时间段
                SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
                SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
                Date date = new Date();
                for(int i = 0; i < timeQuantum.size(); i++){
                    String[] split = timeQuantum.getString(i).split(" - ");
                    Date s = sdf1.parse(sdf.format(date) + " " + split[0]);
                    Date e = sdf1.parse(sdf.format(date) + " " + split[1]);
                    if(s.getTime() <= System.currentTimeMillis() && System.currentTimeMillis() < e.getTime()){
                        yh = new BigDecimal(orderCrossCity.getOrderMoney()).multiply(new BigDecimal((10 - discount) / 10)).setScale(2, RoundingMode.HALF_EVEN).doubleValue();
                        break;
                    }
                }
            }
            orderMoney = orderMoney - yh;
            orderCrossCity.setTaxiCardId(userTaxiCard.getTaxiCardId());
            orderCrossCity.setUserTaxiCardId(objectId);
            orderCrossCity.setDiscountAmount(yh);
        }
        //计算红包
        UserRedPacketRecord query = userRedPacketRecordService.query(uid, orderCrossCity.getCompanyId(), 1, 3, orderMoney);
        if(null != query && orderMoney.compareTo(query.getMoney()) > 0){
            orderMoney = orderMoney - query.getMoney();
            orderCrossCity.setRedPacketMoney(query.getMoney());
            orderCrossCity.setRedPacketId(query.getId());
        }
        //计算折扣
        UserActivityDiscount1 query2 = userActivityDiscount1Mapper.query(orderCrossCity.getCompanyId());
        if(null != query2){
            Double special = query2.getSpecial();
            orderCrossCity.setDiscount(special);
            double v = new BigDecimal(orderMoney).multiply(new BigDecimal(special / 10)).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue();
            if(orderMoney.compareTo(v) > 0){
                orderCrossCity.setDiscountMoney(orderMoney - v);
                orderCrossCity.setActivityId(query2.getId());
                orderMoney = v;
            }
        }
        orderMoney = new BigDecimal(orderMoney).setScale(2, RoundingMode.HALF_UP).doubleValue();
        orderMoney = orderMoney < 0 ? 0 : orderMoney;
        System.out.println("!!!!!!"+orderMoney+"!!!!!!!");
        if(payType == 1){//微信支付
            if(orderMoney == 0){
                return ResultUtil.error("请使用余额支付");
            }
            String app = type == 1 ? "APP" : "JSAPI";
            resultUtil = payMoneyUtil.weixinpay("完成订单", "", orderId + "_3_" + UUIDUtil.getRandomCode(5), orderMoney.toString(), "/base/wxPayOrderTaxi", app, userInfo.getAppletsOpenId());
            paymentRecordService.saveData(1, orderCrossCity.getUserId(), 1, orderId, 3, 1, orderMoney, "", 1);//添加预支付数据
        }
        if(payType == 2){//支付宝支付
            if(orderMoney == 0){
                return ResultUtil.error("请使用余额支付");
            }
            resultUtil = payMoneyUtil.alipay("完成订单", "完成订单", "", orderId + "_3_" + UUIDUtil.getRandomCode(5), orderMoney.toString(), "/base/aliPayOrderTaxi");
            paymentRecordService.saveData(1, orderCrossCity.getUserId(), 1, orderId, 3, 2, orderMoney, "", 1);//添加预支付数据
        }
        if(payType == 3){//余额支付
            if (userInfo.getBalance() == null || userInfo.getBalance() < orderMoney) {
                return ResultUtil.error("余额不足,无法完成支付");
            }
   @Resource
   private OrderCrossCityMapper orderCrossCityMapper;
   @Resource
   private LinePriceMapper linePriceMapper;
   @Resource
   private UserActivityDiscount1Mapper userActivityDiscount1Mapper;
   @Resource
   private SysIntegralMapper sysIntegralMapper;
   @Resource
   private LineShiftDriverMapper lineShiftDriverMapper;
   @Resource
   private OrderPrivateCarMapper orderPrivateCarMapper;
   @Resource
   private OrderTaxiMapper orderTaxiMapper;
   @Resource
   private RegionMapper regionMapper;
   @Resource
   private SensitiveWordsMapper sensitiveWordsMapper;
   @Autowired
   private GDMapElectricFenceUtil gdMapElectricFenceUtil;
   @Autowired
   private IUserInfoService userInfoService;
   @Autowired
   private IUserCouponRecordService userCouponRecordService;
   @Autowired
   private IUserRedPacketRecordService userRedPacketRecordService;
   @Autowired
   private IPaymentRecordService paymentRecordService;
   @Autowired
   private ITransactionDetailsService transactionDetailsService;
   @Autowired
   private IOrderPrivateCarService orderPrivateCarService;
   @Autowired
   private ILineService lineService;
   @Autowired
   private IIncomeService incomeService;
   @Autowired
   private IDriverService driverService;
   @Autowired
   private PushUtil pushUtil;
   @Autowired
   private ISystemNoticeService systemNoticeService;
   @Autowired
   private DateUtil dateUtil;
   @Autowired
   private GDMapGeocodingUtil gdMapGeocodingUtil;
   @Autowired
   private ChinaMobileUtil chinaMobileUtil;
   @Autowired
   private GDFalconUtil gdFalconUtil;
   @Resource
   private RedisTemplate<String, Object> redisTemplate;
   @Autowired
   private ICancleOrderService cancleOrderService;
   @Autowired
   private IOrderCancelService orderCancelService;
   @Autowired
   private RestTemplate internalRestTemplate;
   @Autowired
   private IUserActivityRedenvelopeService userActivityRedenvelopeService;
   @Autowired
   private IOrderPositionService orderPositionService;
   @Autowired
   private IOrderTaxiService orderTaxiService;
   @Autowired
   private ICompanyCityService companyCityService;
   @Autowired
   private IPushOrderService pushOrderService;
   @Autowired
   private IOpenCityService openCityService;
   @Autowired
   private PayMoneyUtil payMoneyUtil;
   @Autowired
   private IOrderLogisticsService orderLogisticsService;
   @Autowired
   private ITaxiCardPaymentService taxiCardPaymentService;
   @Autowired
   private ICompanyService companyService;
   @Autowired
   private ITaxiCardService taxiCardService;
   @Autowired
   private IUserUserService userUserService;
   @Autowired
   private IUserTaxiCardService userTaxiCardService;
   @Autowired
   private IRegionService regionService;
   @Value("${callbackPath}")
   private String callbackPath;
   public Map<String, Thread> threadMap = new HashMap<>();
   //存储摆渡车无接单后推送标识,实现多个类型的摆渡车订单无人接单后只给前端推送一次
   public static Map<Integer, Boolean> pushEndMap = new HashMap<>();
   /**
    * 计算支付金额
    *
    * @param startLonLat
    * @param endLonLat
    * @param peopleNumber
    * @param travelMode
    * @param lineId
    * @param serverCarModelId
    * @return
    * @throws Exception
    */
   @Override
   public ResultUtil queryOrderMoney(String startLonLat, String endLonLat, Integer peopleNumber, Integer travelMode, Integer lineId,
                                     Integer serverCarModelId, Integer totalSeat, String seatNumber) throws Exception {
      // TODO: 2023/11/4 无法修改
      Map<String, String> distance = gdMapElectricFenceUtil.getDistance(startLonLat, endLonLat, 1);//调用高德计算距离
      if (null != distance) {
         return this.getPrice(Double.valueOf(distance.get("distance")), peopleNumber, travelMode, lineId, serverCarModelId, totalSeat, seatNumber);
      }
      return ResultUtil.error("计算行程距离出错啦!");
   }
   /**
    * 获取用户余额和可用优惠券数量
    *
    * @param orderId
    * @param uid
    * @return
    * @throws Exception
    */
   @Override
   public Map<String, Object> queryBalance(Integer orderId, Integer uid) throws Exception {
      Map<String, Object> map = new HashMap<>();
      UserInfo userInfo = userInfoService.selectById(uid);
      map.put("balance", userInfo.getBalance());
      OrderCrossCity orderCrossCity = this.selectById(orderId);
      int i = userCouponRecordService.queryAvailable(uid, orderCrossCity.getCompanyId(), 1, 3, orderCrossCity.getOrderMoney());
      i = i + userCouponRecordService.queryAvailable(uid, orderCrossCity.getCompanyId(), 1, 0, orderCrossCity.getOrderMoney());
      map.put("coupon", i);
      return map;
   }
   @Override
   public PreferentialDataVo queryBalance1(Integer orderId, Integer uid) throws Exception {
      UserInfo userInfo = userInfoService.selectById(uid);
      PreferentialDataVo preferentialDataVo = new PreferentialDataVo();
      preferentialDataVo.setBalance(userInfo.getBalance());
      OrderCrossCity orderCrossCity = this.selectById(orderId);
      Integer ids = userInfoService.getDiscount();
      if (ids != null) {
         List<UserActivityDiscount1> userActivityId = userActivityDiscount1Mapper.selectList(new EntityWrapper<UserActivityDiscount1>().eq("userActivityId", ids));
         if (userActivityId.size() > 0) {
            preferentialDataVo.setDiscount(userActivityId.get(0).getLogistics());
         }
      }
      // 查出当前用户的红包 并将订单的修改
      List<UserRedPacketRecord> userRedPacketRecords = userRedPacketRecordService.selectList(new EntityWrapper<UserRedPacketRecord>().eq("userId", uid).eq("state", 1).le("money", orderCrossCity.getOrderMoney()).gt("expirationTime", new Date()).gt("endTime", new Date()));
      if (userRedPacketRecords.size() > 0) {
         preferentialDataVo.setRedPacket(userRedPacketRecords.get(0).getMoney());
         orderCrossCity.setRedPacketId(userRedPacketRecords.get(0).getId());
         orderCrossCity.setRedPacketMoney(userRedPacketRecords.get(0).getMoney());
         this.updateById(orderCrossCity);
      }
      //获取优惠券中最优数据
      List<UserCouponRecord> list = userCouponRecordService.selectList(new EntityWrapper<UserCouponRecord>().eq("companyId", orderCrossCity.getCompanyId()).eq("state", 1).le("money", orderCrossCity.getOrderMoney()).in("couponUseType", Arrays.asList(0, 3)).eq("userId", uid).where("now() < expirationTime"));
      Integer id = null;
      Double price = 0d;
      Integer type = 0;
      for (UserCouponRecord userCouponRecord : list) {
         if (userCouponRecord.getCouponType() == 1) {//抵扣券
            if (price.compareTo(userCouponRecord.getMoney()) < 0) {
               price = userCouponRecord.getMoney();
               id = userCouponRecord.getId();
               type = 1;
            }
         } else {//满减券
            if (orderCrossCity.getOrderMoney().compareTo(userCouponRecord.getFullMoney()) >= 0 && price.compareTo(userCouponRecord.getMoney()) < 0) {
               price = userCouponRecord.getMoney();
               id = userCouponRecord.getId();
               type = 1;
            }
         }
      }
      //获取打车卡中最优数
      Map<String, String> geocode = gdMapGeocodingUtil.geocode(orderCrossCity.getStartLon().toString(), orderCrossCity.getStartLat().toString());
      CompanyCity companyCity = companyCityService.selectOne(new EntityWrapper<CompanyCity>().eq("companyId", orderCrossCity.getCompanyId()).eq("areaCode", geocode.get("districtCode")).eq("state", 1));
      if (null == companyCity) {
         companyCity = companyCityService.selectOne(new EntityWrapper<CompanyCity>().eq("companyId", orderCrossCity.getCompanyId()).eq("cityCode", geocode.get("cityCode")).eq("state", 1));
      }
      if (null == companyCity) {
         companyCity = companyCityService.selectOne(new EntityWrapper<CompanyCity>().eq("companyId", orderCrossCity.getCompanyId()).eq("provinceCode", geocode.get("provinceCode")).eq("state", 1));
      }
      List<UserTaxiCard> userTaxiCards = new ArrayList<>();
      if (companyCity != null) {
         userTaxiCards = userTaxiCardService.selectList(new EntityWrapper<UserTaxiCard>().like("companyCityId", "%" + companyCity.getId() + "%")
               .in("type", Arrays.asList(1, 2, 3, 4)).eq("userId", uid).where("now() between startTime and endTime"));
      }
      //全国卡
      List<TaxiCard> taxiCards = taxiCardService.selectList(new EntityWrapper<TaxiCard>().eq("taxiCardType", 2).in("type", Arrays.asList(1, 2, 3, 4)).eq("state", 1));
      if (taxiCards.size() > 0) {
         List<UserTaxiCard> userTaxiCards2 = userTaxiCardService.selectList(new EntityWrapper<UserTaxiCard>().eq("userId", uid)
               .in("type", Arrays.asList(1, 2, 3, 4)).in("taxiCardId", taxiCards.stream().map(TaxiCard::getId).collect(Collectors.toList())).where("now() between startTime and endTime"));
         userTaxiCards.addAll(userTaxiCards2);
      }
      Map<String, Object> map = getOptimalTaxiCards(orderCrossCity, price, id, type, userTaxiCards);
      price = Double.valueOf(map.get("price").toString());
      id = null != map.get("id") ? Integer.valueOf(map.get("id").toString()) : null;
      type = Integer.valueOf(map.get("type").toString());
      //亲密账户
      List<UserTaxiCard> userTaxiCards_ = new ArrayList<>();
      List<UserUser> bindUserId = userUserService.selectList(new EntityWrapper<UserUser>().eq("bindUserId", uid));
      CompanyCity finalCompanyCity = companyCity;
      bindUserId.forEach(userUser -> {
         if (finalCompanyCity != null) {
            List<UserTaxiCard> userTaxiCards1 = userTaxiCardService.selectList(new EntityWrapper<UserTaxiCard>().in("type", Arrays.asList(1, 2, 3, 4))
                  .like("companyCityId", "%" + finalCompanyCity.getId() + "%").eq("userId", userUser.getUserId()).where("now() between startTime and endTime"));
            userTaxiCards_.addAll(userTaxiCards1);
         }
         //全国卡
         if (taxiCards.size() > 0) {
            List<UserTaxiCard> userTaxiCards2 = userTaxiCardService.selectList(new EntityWrapper<UserTaxiCard>().eq("userId", userUser.getUserId())
                  .in("type", Arrays.asList(1, 2, 3, 4)).in("taxiCardId", taxiCards.stream().map(TaxiCard::getId).collect(Collectors.toList())).where("now() between startTime and endTime"));
            userTaxiCards_.addAll(userTaxiCards2);
         }
      });
      map = getOptimalTaxiCards(orderCrossCity, price, id, type, userTaxiCards_);
      price = Double.valueOf(map.get("price").toString());
      id = null != map.get("id") ? Integer.valueOf(map.get("id").toString()) : null;
      type = Integer.valueOf(map.get("type").toString());
      if (price <= orderCrossCity.getOrderMoney() || type == 2) {
         preferentialDataVo.setObjectId(id);
         preferentialDataVo.setDiscountAmount(price);
         preferentialDataVo.setType(type);
      }
      return preferentialDataVo;
   }
   public Map<String, Object> getOptimalTaxiCards(OrderCrossCity orderCrossCity, Double price, Integer id, Integer type, List<UserTaxiCard> userTaxiCards) throws Exception {
      Map<String, Object> map = new HashMap<>();
      for (UserTaxiCard t : userTaxiCards) {
         JSONObject jsonObject = JSON.parseObject(t.getContent());
         List<Integer> integers = jsonObject.getJSONArray("businessTypes").toJavaList(Integer.class);
         if (!integers.contains(3)) {
            continue;
         }
         if (t.getType() == 1) {//打折次数卡{"businessTypes":[1,2,3],"time":5,"timeQuantum":["08:00:00 - 09:00:00","17:00:00 - 18:00:00"],"discount":5}
            Integer time = jsonObject.getInteger("time");
            if (time == 0) {
               continue;
            }
            JSONArray timeQuantum = jsonObject.getJSONArray("timeQuantum");
            Double discount = jsonObject.getDouble("discount");
            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
            SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
            Date date = new Date();
            for (int i = 0; i < timeQuantum.size(); i++) {
               String[] split = timeQuantum.getString(i).split(" - ");
               Date s = sdf1.parse(sdf.format(date) + " " + split[0]);
               Date e = sdf1.parse(sdf.format(date) + " " + split[1]);
               if (s.getTime() <= System.currentTimeMillis() && System.currentTimeMillis() < e.getTime()) {
                  double v = new BigDecimal(orderCrossCity.getOrderMoney()).multiply(new BigDecimal((10 - discount) / 10)).setScale(2, RoundingMode.HALF_EVEN).doubleValue();
                  if (price.compareTo(v) < 0) {
                     price = v;
                     id = t.getId();
                     type = 2;
                  }
               }
            }
         }
         if (t.getType() == 2) {//优惠卡{"businessTypes":[1,2,3],"fullReduction":[[50,3],[100,5],[150,10]]}
            JSONArray timeQuantum = jsonObject.getJSONArray("timeQuantum");
            JSONArray fullReduction = jsonObject.getJSONArray("fullReduction");
            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
            SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
            Date date = new Date();
            for (int i = 0; i < timeQuantum.size(); i++) {
               String[] split = timeQuantum.getString(i).split(" - ");
               Date s = sdf1.parse(sdf.format(date) + " " + split[0]);
               Date e = sdf1.parse(sdf.format(date) + " " + split[1]);
               if (s.getTime() <= System.currentTimeMillis() && System.currentTimeMillis() < e.getTime()) {
                  for (int j = fullReduction.size() - 1; j >= 0; j--) {
                     JSONArray jsonArray = fullReduction.getJSONArray(j);
                     Double p = jsonArray.getDouble(0);//满金额
                     Double y = jsonArray.getDouble(1);//优惠金额
                     if (orderCrossCity.getOrderMoney().compareTo(p) >= 0 && price.compareTo(y) < 0) {
                        price = y;
                        id = t.getId();
                        type = 2;
                     }
                  }
               }
            }
         }
         if (t.getType() == 3) {//次数卡{"businessTypes":[1,2,3],"time":1,"discountAmount":10}
            Integer time = jsonObject.getInteger("time");
            if (time == 0) {
               continue;
            }
            JSONArray timeQuantum = jsonObject.getJSONArray("timeQuantum");
            Double discountAmount = jsonObject.getDouble("discountAmount");
            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
            SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
            Date date = new Date();
            for (int i = 0; i < timeQuantum.size(); i++) {
               String[] split = timeQuantum.getString(i).split(" - ");
               Date s = sdf1.parse(sdf.format(date) + " " + split[0]);
               Date e = sdf1.parse(sdf.format(date) + " " + split[1]);
               if (s.getTime() <= System.currentTimeMillis() && System.currentTimeMillis() < e.getTime()) {
                  if (price.compareTo(discountAmount) < 0) {
                     price = discountAmount;
                     id = t.getId();
                     type = 2;
                  }
               }
            }
         }
         if (t.getType() == 4) {//打折天数卡{"businessTypes":[1,2,3],"discount":5,"timeQuantum":["08:00:00 - 09:00:00","17:00:00 - 18:00:00"]}
            Double discount = jsonObject.getDouble("discount");//折扣
            JSONArray timeQuantum = jsonObject.getJSONArray("timeQuantum");//使用时间段
            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
            SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
            Date date = new Date();
            for (int i = 0; i < timeQuantum.size(); i++) {
               String[] split = timeQuantum.getString(i).split(" - ");
               Date s = sdf1.parse(sdf.format(date) + " " + split[0]);
               Date e = sdf1.parse(sdf.format(date) + " " + split[1]);
               if (s.getTime() <= System.currentTimeMillis() && System.currentTimeMillis() < e.getTime()) {
                  double v = new BigDecimal(orderCrossCity.getOrderMoney()).multiply(new BigDecimal((10 - discount) / 10)).setScale(2, RoundingMode.HALF_EVEN).doubleValue();
                  if (price.compareTo(v) < 0) {
                     price = v;
                     id = t.getId();
                     type = 2;
                  }
               }
            }
         }
      }
      map.put("price", price);
      map.put("id", id);
      map.put("type", type);
      return map;
   }
   /**
    * 获取支付页面的优惠券列表
    *
    * @param orderId
    * @param uid
    * @param pageNum
    * @param size
    * @return
    * @throws Exception
    */
   @Override
   public List<Map<String, Object>> queryCoupon(Integer orderId, Integer uid, Integer pageNum, Integer size) throws Exception {
      OrderCrossCity orderCrossCity = this.selectById(orderId);
      List<Map<String, Object>> list = userCouponRecordService.queryCoupon(uid, orderCrossCity.getCompanyId(), 1, 3, orderCrossCity.getOrderMoney(), pageNum, size);
      List<Map<String, Object>> list1 = userCouponRecordService.queryCoupon(uid, orderCrossCity.getCompanyId(), 1, 0, orderCrossCity.getOrderMoney(), pageNum, size);
      list.addAll(list1);
      return list;
   }
   @Override
   public List<CouponsListVo> queryCouponList(Integer orderId, Integer uid, Integer pageNum, Integer size) throws Exception {
      pageNum = (pageNum - 1) * size;
      OrderCrossCity orderCrossCity = this.selectById(orderId);
      List<CouponsListVo> rows = new ArrayList<>();
      List<UserCouponRecord> list = userCouponRecordService.selectList(new EntityWrapper<UserCouponRecord>().eq("companyId", orderCrossCity.getCompanyId())
            .eq("state", 1).in("couponUseType", Arrays.asList(0, 3)).eq("userId", uid).where("expirationTime >= now()"));
      SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
      for (UserCouponRecord userCouponRecord : list) {
         if (userCouponRecord.getCouponType() == 2) {//满减券
            if (orderCrossCity.getOrderMoney().compareTo(userCouponRecord.getFullMoney()) < 0) {
               continue;
            }
         }
         CouponsListVo couponsListVo = new CouponsListVo();
         couponsListVo.setId(userCouponRecord.getId());
         couponsListVo.setDataType(1);
         couponsListVo.setMoney(userCouponRecord.getMoney());
         couponsListVo.setUserType(userCouponRecord.getCouponUseType());
         couponsListVo.setTime(sdf.format(userCouponRecord.getExpirationTime()));
         couponsListVo.setType(userCouponRecord.getCouponType());
         couponsListVo.setFullMoney(userCouponRecord.getFullMoney());
         couponsListVo.setState(userCouponRecord.getState());
         Company company = companyService.selectById(userCouponRecord.getCompanyId());
         couponsListVo.setCompany(company.getName());
         rows.add(couponsListVo);
      }
      Map<String, String> geocode = gdMapGeocodingUtil.geocode(orderCrossCity.getStartLon().toString(), orderCrossCity.getStartLat().toString());
      CompanyCity companyCity = companyCityService.selectOne(new EntityWrapper<CompanyCity>().eq("companyId", orderCrossCity.getCompanyId()).eq("areaCode", geocode.get("districtCode")).eq("state", 1));
      if (null == companyCity) {
         companyCity = companyCityService.selectOne(new EntityWrapper<CompanyCity>().eq("companyId", orderCrossCity.getCompanyId()).eq("cityCode", geocode.get("cityCode")).eq("state", 1));
      }
      if (null == companyCity) {
         companyCity = companyCityService.selectOne(new EntityWrapper<CompanyCity>().eq("companyId", orderCrossCity.getCompanyId()).eq("provinceCode", geocode.get("provinceCode")).eq("state", 1));
      }
      List<UserTaxiCard> userTaxiCards = userTaxiCardService.selectList(new EntityWrapper<UserTaxiCard>().eq("userId", uid)
            .in("type", Arrays.asList(1, 2, 3, 4)).like("companyCityId", "%" + companyCity.getId() + "%").where("now() between startTime and endTime"));
      //全国卡
      List<TaxiCard> taxiCards = taxiCardService.selectList(new EntityWrapper<TaxiCard>().eq("taxiCardType", 2).in("type", Arrays.asList(1, 2, 3, 4)).eq("state", 1));
      if (taxiCards.size() > 0) {
         List<UserTaxiCard> userTaxiCards1 = userTaxiCardService.selectList(new EntityWrapper<UserTaxiCard>().eq("userId", uid)
               .in("type", Arrays.asList(1, 2, 3, 4)).in("taxiCardId", taxiCards.stream().map(TaxiCard::getId).collect(Collectors.toList())).where("now() between startTime and endTime"));
         userTaxiCards.addAll(userTaxiCards1);
      }
      //亲密账户
      List<UserUser> bindUserId = userUserService.selectList(new EntityWrapper<UserUser>().eq("bindUserId", uid));
      CompanyCity finalCompanyCity = companyCity;
      bindUserId.forEach(userUser -> {
         List<UserTaxiCard> taxiCardPayments1 = userTaxiCardService.selectList(new EntityWrapper<UserTaxiCard>().in("type", Arrays.asList(1, 2, 3, 4))
               .like("companyCityId", "%" + finalCompanyCity.getId() + "%").eq("userId", userUser.getUserId()).where("now() between startTime and endTime"));
         userTaxiCards.addAll(taxiCardPayments1);
         //全国卡
         if (taxiCards.size() > 0) {
            List<UserTaxiCard> userTaxiCards1 = userTaxiCardService.selectList(new EntityWrapper<UserTaxiCard>().eq("userId", userUser.getUserId())
                  .in("type", Arrays.asList(1, 2, 3, 4)).in("taxiCardId", taxiCards.stream().map(TaxiCard::getId).collect(Collectors.toList())).where("now() between startTime and endTime"));
            userTaxiCards.addAll(userTaxiCards1);
         }
      });
      for (UserTaxiCard t : userTaxiCards) {
         try {
            CouponsListVo couponsListVo = new CouponsListVo();
            couponsListVo.setId(t.getId());
            couponsListVo.setDataType(2);
            couponsListVo.setUserType(1);
            couponsListVo.setTaxiCardType(t.getType());
            couponsListVo.setTime(sdf.format(t.getEndTime()));
            couponsListVo.setState(1);
            Company company = companyService.selectById(t.getCompanyId());
            couponsListVo.setCompany(company.getName());
            couponsListVo.setName(taxiCardService.selectById(t.getTaxiCardId()).getName());
            JSONObject jsonObject = JSON.parseObject(t.getContent());
            JSONArray businessTypes = jsonObject.getJSONArray("businessTypes");
            if (!businessTypes.toJavaList(Integer.class).contains(3)) {
               continue;
            }
            if (t.getType() == 1) {//{"businessTypes":[1,2,3],"time":5,"timeQuantum":["08:00:00 - 09:00:00","17:00:00 - 18:00:00"],"discount":5}
               Integer time = jsonObject.getInteger("time");
               if (time == 0) {
                  continue;
               }
               JSONArray timeQuantum = jsonObject.getJSONArray("timeQuantum");
               SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd");
               boolean b = true;
               for (int i = 0; i < timeQuantum.size(); i++) {
                  String[] split = timeQuantum.getString(i).split(" - ");
                  Date s = sdf.parse(sdf1.format(new Date()) + " " + split[0]);
                  Date e = sdf.parse(sdf1.format(new Date()) + " " + split[1]);
                  if (s.getTime() <= System.currentTimeMillis() && System.currentTimeMillis() < e.getTime()) {
                     b = false;
                     break;
                  }
               }
               if (b) {
                  continue;
               }
               couponsListVo.setMoney(jsonObject.getDouble("discount"));
               couponsListVo.setType(1);
            }
            if (t.getType() == 2) {//{"businessTypes":[1,2,3],"fullReduction":[[50,3],[100,5],[150,10]]}
               JSONArray timeQuantum = jsonObject.getJSONArray("timeQuantum");
               SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd");
               boolean b = true;
               for (int i = 0; i < timeQuantum.size(); i++) {
                  String[] split = timeQuantum.getString(i).split(" - ");
                  Date s = sdf.parse(sdf1.format(new Date()) + " " + split[0]);
                  Date e = sdf.parse(sdf1.format(new Date()) + " " + split[1]);
                  if (s.getTime() <= System.currentTimeMillis() && System.currentTimeMillis() < e.getTime()) {
                     b = false;
                     break;
                  }
               }
               if (b) {
                  continue;
               }
               JSONArray fullReduction = jsonObject.getJSONArray("fullReduction");
               b = true;
               for (int i = fullReduction.size() - 1; i >= 0; i--) {
                  Double m = fullReduction.getJSONArray(i).getDouble(0);
                  Double y = fullReduction.getJSONArray(i).getDouble(1);
                  if (m.compareTo(orderCrossCity.getOrderMoney()) <= 0) {
                     couponsListVo.setMoney(y);
                     couponsListVo.setFullMoney(m);
                     b = false;
                     break;
                  }
               }
               if (b) {
                  continue;
               }
               couponsListVo.setType(2);
            }
            if (t.getType() == 3) {//{"businessTypes":[1,2,3],"time":1,"discountAmount":10}
               Integer time = jsonObject.getInteger("time");
               if (time == 0) {
                  continue;
               }
               JSONArray timeQuantum = jsonObject.getJSONArray("timeQuantum");
               SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd");
               boolean b = true;
               for (int i = 0; i < timeQuantum.size(); i++) {
                  String[] split = timeQuantum.getString(i).split(" - ");
                  Date s = sdf.parse(sdf1.format(new Date()) + " " + split[0]);
                  Date e = sdf.parse(sdf1.format(new Date()) + " " + split[1]);
                  if (s.getTime() <= System.currentTimeMillis() && System.currentTimeMillis() < e.getTime()) {
                     b = false;
                     break;
                  }
               }
               if (b) {
                  continue;
               }
               couponsListVo.setMoney(jsonObject.getDouble("discountAmount"));
               couponsListVo.setType(2);
            }
            if (t.getType() == 4) {//{"businessTypes":[1,2,3],"discount":5,"timeQuantum":["08:00:00 - 09:00:00","17:00:00 - 18:00:00"]}
               JSONArray timeQuantum = jsonObject.getJSONArray("timeQuantum");
               SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd");
               boolean b = true;
               for (int i = 0; i < timeQuantum.size(); i++) {
                  String[] split = timeQuantum.getString(i).split(" - ");
                  Date s = sdf.parse(sdf1.format(new Date()) + " " + split[0]);
                  Date e = sdf.parse(sdf1.format(new Date()) + " " + split[1]);
                  if (s.getTime() <= System.currentTimeMillis() && System.currentTimeMillis() < e.getTime()) {
                     b = false;
                     break;
                  }
               }
               if (b) {
                  continue;
               }
               couponsListVo.setMoney(jsonObject.getDouble("discount"));
               couponsListVo.setType(1);
            }
            String str = "";
            TaxiCard taxiCard = taxiCardService.selectById(t.getTaxiCardId());
            if (taxiCard.getTaxiCardType() == 1) {
               String[] split = taxiCard.getCompanyCityId().split(";");
               for (String c : split) {
                  CompanyCity companyCity1 = companyCityService.selectById(c);
                  if (ToolUtil.isNotEmpty(companyCity1.getAreaCode())) {
                     Region region = regionService.selectOne(new EntityWrapper<Region>().eq("code", companyCity1.getAreaCode()));
                     str += region.getName() + ";";
                     continue;
                  }
                  if (ToolUtil.isNotEmpty(companyCity1.getCityCode())) {
                     Region region = regionService.selectOne(new EntityWrapper<Region>().eq("code", companyCity1.getCityCode()));
                     str += region.getName() + ";";
                     continue;
                  }
                  if (ToolUtil.isNotEmpty(companyCity1.getProvinceCode())) {
                     Region region = regionService.selectOne(new EntityWrapper<Region>().eq("code", companyCity1.getProvinceCode()));
                     str += region.getName() + ";";
                     continue;
                  }
               }
            } else {
               str = "全国;";
            }
            couponsListVo.setCity(str.substring(0, str.length() - 1));
            rows.add(couponsListVo);
         } catch (Exception e) {
            e.printStackTrace();
         }
      }
      Collections.sort(rows, new Comparator<CouponsListVo>() {
         public int compare(CouponsListVo s1, CouponsListVo s2) {
            return Integer.compare(s1.getId(), s2.getId());
         }
      });
      if (rows.size() >= (pageNum + 1) * size) {
         rows = rows.subList(pageNum, pageNum + size);
      } else if (pageNum < rows.size() && rows.size() < (pageNum + 1) * size) {
         rows = rows.subList(pageNum, rows.size());
      } else {
         rows = new ArrayList<>();
      }
      rows = rows.stream().filter(e -> e.getMoney() <= orderCrossCity.getOrderMoney() || e.getDataType() == 2).collect(Collectors.toList());
      return rows;
   }
   /**
    * 订单支付
    *
    * @param payType
    * @param orderId
    * @param couponId
    * @param type
    * @return
    * @throws Exception
    */
   @Override
   public ResultUtil payCrossCityOrder(Integer payType, Integer orderId, Integer couponId, Integer type) throws Exception {
      OrderCrossCity orderCrossCity = this.selectById(orderId);
      if (orderCrossCity.getState() != 7) {
         return ResultUtil.error("订单已完成支付,不允许重复支付", "");
      }
      Integer uid = orderCrossCity.getUserId();
      Double orderMoney = orderCrossCity.getOrderMoney();
      UserInfo userInfo = userInfoService.selectById(uid);
      ResultUtil resultUtil = ResultUtil.success(new Object());
      orderCrossCity.setCouponMoney(0D);//初始化历史数据
      orderCrossCity.setCouponId(null);
      //计算优惠券
      UserCouponRecord userCouponRecord = null;
      if (null != couponId) {
         userCouponRecord = userCouponRecordService.selectById(couponId);
         if (null != userCouponRecord) {
            if (userCouponRecord.getCompanyId() != orderCrossCity.getCompanyId()) {
               return ResultUtil.error("优惠券不能用于此订单", "");
            }
            if (userCouponRecord.getState() == 2) {
               return ResultUtil.error("优惠券已使用", "");
            }
            if (userCouponRecord.getState() == 3) {
               return ResultUtil.error("优惠券已过期", "");
            }
            if (userCouponRecord.getCouponUseType() != 0 && userCouponRecord.getCouponUseType() != 3) {
               return ResultUtil.error("优惠券不能用于此类型订单", "");
            }
            if (userCouponRecord.getCouponType() == 2 && orderMoney.compareTo(userCouponRecord.getFullMoney()) < 0) {
               return ResultUtil.error("优惠券不能用于此订单", "");
            }
            orderMoney = orderMoney - userCouponRecord.getMoney();
            orderCrossCity.setCouponMoney(userCouponRecord.getMoney());
            orderCrossCity.setCouponId(couponId);
         }
      }
      //计算红包
      UserRedPacketRecord query = userRedPacketRecordService.query(uid, orderCrossCity.getCompanyId(), 1, 3, orderMoney);
      if (null != query && orderMoney.compareTo(query.getMoney()) > 0) {
         orderMoney = orderMoney - query.getMoney();
         orderCrossCity.setRedPacketMoney(query.getMoney());
         orderCrossCity.setRedPacketId(query.getId());
      }
      //计算折扣
      UserActivityDiscount1 query2 = userActivityDiscount1Mapper.query(orderCrossCity.getCompanyId());
      if (null != query2) {
         Double special = query2.getSpecial();
         orderCrossCity.setDiscount(special);
         double v = new BigDecimal(orderMoney).multiply(new BigDecimal(special / 10)).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue();
         if (orderMoney.compareTo(v) > 0) {
            orderCrossCity.setDiscountMoney(orderMoney - v);
            orderCrossCity.setActivityId(query2.getId());
            orderMoney = v;
         }
      }
      if (payType == 1) {//微信支付
         String app = type == 1 ? "APP" : "JSAPI";
         resultUtil = payMoneyUtil.weixinpay("完成订单", "", orderId + "_3_" + UUIDUtil.getRandomCode(5), orderMoney.toString(), "/base/wxPayOrderTaxi", app, userInfo.getAppletsOpenId());
         paymentRecordService.saveData(1, orderCrossCity.getUserId(), 1, orderId, 3, 1, orderMoney, "", 1);//添加预支付数据
      }
      if (payType == 2) {//支付宝支付
         resultUtil = payMoneyUtil.alipay("完成订单", "完成订单", "", orderId + "_3_" + UUIDUtil.getRandomCode(5), orderMoney.toString(), "/base/aliPayOrderTaxi");
         paymentRecordService.saveData(1, orderCrossCity.getUserId(), 1, orderId, 3, 2, orderMoney, "", 1);//添加预支付数据
      }
      if (payType == 3) {//余额支付
         if (userInfo.getBalance() == null || userInfo.getBalance() < orderMoney) {
            return ResultUtil.error("余额不足,无法完成支付", "");
         }
         userInfo.setBalance(new BigDecimal(userInfo.getBalance()).subtract(new BigDecimal(orderMoney)).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue());
         OpenCity openCity = openCityService.openCity1(orderCrossCity.getStartLon().toString(), orderCrossCity.getStartLat().toString());
         SysIntegral query1 = sysIntegralMapper.query(openCity.getId());
         userInfo.setIntegral(userInfo.getIntegral() + (orderMoney.intValue() * query1.getIntegral()));//积分
         //添加交易明细
         transactionDetailsService.saveData(uid, "跨城出行订单", orderMoney, 2, 1, 1, 3, orderId);
         userInfoService.updateById(userInfo);
         orderCrossCity.setState(2);//跨城支付完成后才开始服务
         orderCrossCity.setPayType(3);
         orderCrossCity.setPayMoney(orderMoney);
         //处理优惠券和红包
         if (null != userCouponRecord) {
            userCouponRecord.setState(2);
            userCouponRecord.setEndTime(new Date());
            userCouponRecordService.updateById(userCouponRecord);
         }
         if (null != query) {
            query.setState(2);
            query.setEndTime(new Date());
            userRedPacketRecordService.updateById(query);
         }
         // TODO: 2020/5/24 这里需要给司机和用户推送订单状态
         new Thread(new Runnable() {
            @Override
            public void run() {
               pushUtil.pushOrderState(1, orderCrossCity.getUserId(), orderCrossCity.getId(), 3, orderCrossCity.getState(), 0);
               pushUtil.pushOrderState(2, orderCrossCity.getDriverId(), orderCrossCity.getId(), 3, orderCrossCity.getState(), 0);
               pushUtil.pushDriverPosition(orderCrossCity.getId(), 3);
            }
         }).start();
         systemNoticeService.addSystemNotice(1, "您已使用余额成功完成出行订单支付,谢谢使用!", uid, 1);
      }
      this.updateAllColumnById(orderCrossCity);
      return resultUtil;
   }
   @Override
   @Transactional(propagation = Propagation.REQUIRES_NEW)
   public ResultUtil payCrossCityOrder1(Integer payType, Integer orderId, Integer objectId, Integer objectType, Integer type) throws Exception {
      OrderCrossCity orderCrossCity = this.selectById(orderId);
      if (orderCrossCity.getState() != 7) {
         return ResultUtil.error("订单已完成支付,不允许重复支付", "");
      }
      Integer uid = orderCrossCity.getUserId();
      Double orderMoney = orderCrossCity.getOrderMoney();
      UserInfo userInfo = userInfoService.selectById(uid);
      ResultUtil resultUtil = ResultUtil.success(new Object());
      orderCrossCity.setCouponMoney(0D);//初始化历史数据
      orderCrossCity.setCouponId(null);
      //计算优惠券
      UserCouponRecord userCouponRecord = null;
      if (null != objectId && 1 == objectType) {
         userCouponRecord = userCouponRecordService.selectById(objectId);
         if (userCouponRecord.getCompanyId() != orderCrossCity.getCompanyId()) {
            return ResultUtil.error("优惠券不能用于此订单", "");
         }
         if (userCouponRecord.getState() == 2) {
            return ResultUtil.error("优惠券已使用", "");
         }
         if (userCouponRecord.getState() == 3) {
            return ResultUtil.error("优惠券已过期", "");
         }
         if (userCouponRecord.getCouponUseType() != 0 && userCouponRecord.getCouponUseType() != 3) {
            return ResultUtil.error("优惠券不能用于此类型订单", "");
         }
         if (userCouponRecord.getCouponType() == 2 && orderMoney.compareTo(userCouponRecord.getFullMoney()) < 0) {
            return ResultUtil.error("优惠券不能用于此订单", "");
         }
         orderMoney = orderMoney - userCouponRecord.getMoney();
         orderCrossCity.setCouponMoney(userCouponRecord.getMoney());
         orderCrossCity.setCouponId(objectId);
      }
      //打车卡
      UserTaxiCard userTaxiCard = null;
      if (null != objectId && objectType == 2) {
         userTaxiCard = userTaxiCardService.selectById(objectId);
         TaxiCard taxiCard = taxiCardService.selectById(userTaxiCard.getTaxiCardId());
         if (taxiCard.getTaxiCardType() == 1 && userTaxiCard.getCompanyId() != orderCrossCity.getCompanyId()) {
            return ResultUtil.error("打车卡不能用于此订单", "");
         }
         if (System.currentTimeMillis() > userTaxiCard.getEndTime().getTime()) {
            return ResultUtil.error("打车卡已过期", "");
         }
         if (userTaxiCard.getType() == 1 || userTaxiCard.getType() == 3) {
            Integer time = JSON.parseObject(userTaxiCard.getContent()).getInteger("time");
            if (0 == time) {
               return ResultUtil.error("打车卡已使用完", "");
            }
         }
         List<Integer> integers = JSON.parseObject(userTaxiCard.getContent()).getJSONArray("businessTypes").toJavaList(Integer.class);
         if (!integers.contains(3)) {
            return ResultUtil.error("打车卡不能用于此类型订单", "");
         }
         Double yh = 0D;
         JSONObject jsonObject = JSON.parseObject(userTaxiCard.getContent());
         if (userTaxiCard.getType() == 1) {//打折次数卡{"businessTypes":[1,2,3],"time":5,"timeQuantum":["08:00:00 - 09:00:00","17:00:00 - 18:00:00"],"discount":5}
            JSONArray timeQuantum = jsonObject.getJSONArray("timeQuantum");
            Double discount = jsonObject.getDouble("discount");
            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
            SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
            Date date = new Date();
            for (int i = 0; i < timeQuantum.size(); i++) {
               String[] split = timeQuantum.getString(i).split(" - ");
               Date s = sdf1.parse(sdf.format(date) + " " + split[0]);
               Date e = sdf1.parse(sdf.format(date) + " " + split[1]);
               if (s.getTime() <= System.currentTimeMillis() && System.currentTimeMillis() < e.getTime()) {
                  yh = new BigDecimal(orderCrossCity.getOrderMoney()).multiply(new BigDecimal((10 - discount) / 10)).setScale(2, RoundingMode.HALF_EVEN).doubleValue();
                  jsonObject.put("time", jsonObject.getInteger("time") - 1);
                  userTaxiCard.setContent(jsonObject.toJSONString());
                  break;
               }
            }
         }
         if (userTaxiCard.getType() == 2) {//优惠卡{"businessTypes":[1,2,3],"fullReduction":[[50,3],[100,5],[150,10]]}
            JSONArray timeQuantum = jsonObject.getJSONArray("timeQuantum");
            JSONArray fullReduction = jsonObject.getJSONArray("fullReduction");
            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
            SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
            Date date = new Date();
            for (int i = 0; i < timeQuantum.size(); i++) {
               String[] split = timeQuantum.getString(i).split(" - ");
               Date s = sdf1.parse(sdf.format(date) + " " + split[0]);
               Date e = sdf1.parse(sdf.format(date) + " " + split[1]);
               if (s.getTime() <= System.currentTimeMillis() && System.currentTimeMillis() < e.getTime()) {
                  for (int j = fullReduction.size() - 1; j >= 0; j--) {
                     JSONArray jsonArray = fullReduction.getJSONArray(j);
                     Double p = jsonArray.getDouble(0);//满金额
                     if (orderCrossCity.getOrderMoney().compareTo(p) >= 0) {
                        yh = jsonArray.getDouble(1);//优惠金额
                        break;
                     }
                  }
               }
            }
         }
         if (userTaxiCard.getType() == 3) {//次数卡{"businessTypes":[1,2,3],"time":1,"discountAmount":10}
            JSONArray timeQuantum = jsonObject.getJSONArray("timeQuantum");
            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
            SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
            Date date = new Date();
            for (int i = 0; i < timeQuantum.size(); i++) {
               String[] split = timeQuantum.getString(i).split(" - ");
               Date s = sdf1.parse(sdf.format(date) + " " + split[0]);
               Date e = sdf1.parse(sdf.format(date) + " " + split[1]);
               if (s.getTime() <= System.currentTimeMillis() && System.currentTimeMillis() < e.getTime()) {
                  yh = jsonObject.getDouble("discountAmount");
                  jsonObject.put("time", jsonObject.getInteger("time") - 1);
                  userTaxiCard.setContent(jsonObject.toJSONString());
               }
            }
         }
         if (userTaxiCard.getType() == 4) {//打折天数卡{"businessTypes":[1,2,3],"discount":5,"timeQuantum":["08:00:00 - 09:00:00","17:00:00 - 18:00:00"]}
            Double discount = jsonObject.getDouble("discount");//折扣
            JSONArray timeQuantum = jsonObject.getJSONArray("timeQuantum");//使用时间段
            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
            SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
            Date date = new Date();
            for (int i = 0; i < timeQuantum.size(); i++) {
               String[] split = timeQuantum.getString(i).split(" - ");
               Date s = sdf1.parse(sdf.format(date) + " " + split[0]);
               Date e = sdf1.parse(sdf.format(date) + " " + split[1]);
               if (s.getTime() <= System.currentTimeMillis() && System.currentTimeMillis() < e.getTime()) {
                  yh = new BigDecimal(orderCrossCity.getOrderMoney()).multiply(new BigDecimal((10 - discount) / 10)).setScale(2, RoundingMode.HALF_EVEN).doubleValue();
                  break;
               }
            }
         }
         orderMoney = orderMoney - yh;
         orderCrossCity.setTaxiCardId(userTaxiCard.getTaxiCardId());
         orderCrossCity.setUserTaxiCardId(objectId);
         orderCrossCity.setDiscountAmount(yh);
      }
      //计算红包
      UserRedPacketRecord query = userRedPacketRecordService.query(uid, orderCrossCity.getCompanyId(), 1, 3, orderMoney);
      if (null != query && orderMoney.compareTo(query.getMoney()) > 0) {
         orderMoney = orderMoney - query.getMoney();
         orderCrossCity.setRedPacketMoney(query.getMoney());
         orderCrossCity.setRedPacketId(query.getId());
      }
      //计算折扣
      UserActivityDiscount1 query2 = userActivityDiscount1Mapper.query(orderCrossCity.getCompanyId());
      if (null != query2) {
         Double special = query2.getSpecial();
         orderCrossCity.setDiscount(special);
         double v = new BigDecimal(orderMoney).multiply(new BigDecimal(special / 10)).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue();
         if (orderMoney.compareTo(v) > 0) {
            orderCrossCity.setDiscountMoney(orderMoney - v);
            orderCrossCity.setActivityId(query2.getId());
            orderMoney = v;
         }
      }
      orderMoney = new BigDecimal(orderMoney).setScale(2, RoundingMode.HALF_UP).doubleValue();
      orderMoney = orderMoney < 0 ? 0 : orderMoney;
      System.out.println("!!!!!!" + orderMoney + "!!!!!!!");
      if (payType == 1) {//微信支付
         if (orderMoney == 0) {
            return ResultUtil.error("请使用余额支付");
         }
         String app = type == 1 ? "APP" : "JSAPI";
         resultUtil = payMoneyUtil.weixinpay("完成订单", "", orderId + "_3_" + UUIDUtil.getRandomCode(5), orderMoney.toString(), "/base/wxPayOrderTaxi", app, userInfo.getAppletsOpenId());
         paymentRecordService.saveData(1, orderCrossCity.getUserId(), 1, orderId, 3, 1, orderMoney, "", 1);//添加预支付数据
      }
      if (payType == 2) {//支付宝支付
         if (orderMoney == 0) {
            return ResultUtil.error("请使用余额支付");
         }
         resultUtil = payMoneyUtil.alipay("完成订单", "完成订单", "", orderId + "_3_" + UUIDUtil.getRandomCode(5), orderMoney.toString(), "/base/aliPayOrderTaxi");
         paymentRecordService.saveData(1, orderCrossCity.getUserId(), 1, orderId, 3, 2, orderMoney, "", 1);//添加预支付数据
      }
      if (payType == 3) {//余额支付
         if (userInfo.getBalance() == null || userInfo.getBalance() < orderMoney) {
            return ResultUtil.error("余额不足,无法完成支付");
         }
//            if(orderMoney > 0){
//                resultUtil= appOrderController.moneyPay(orderId,userInfo.getId(),orderMoney);
//                if(resultUtil.getCode()==500){
//                    return ResultUtil.error("电子余额不足,无法完成支付");
//                }
//            }
            userInfo.setBalance(new BigDecimal(userInfo.getBalance()).subtract(new BigDecimal(orderMoney)).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue());
            SysIntegral query1 = sysIntegralMapper.query(orderCrossCity.getCompanyId());
            userInfo.setIntegral(userInfo.getIntegral() + (orderMoney.intValue() * query1.getIntegral()));//积分
            //添加交易明细
            transactionDetailsService.saveData(uid, "跨城出行订单", orderMoney, 2, 1, 1, 3, orderId);
            userInfoService.updateById(userInfo);
            orderCrossCity.setState(2);//跨城支付完成后才开始服务
            orderCrossCity.setPayType(3);
            orderCrossCity.setPayMoney(orderMoney);
            //处理优惠券和红包
            if(null != userCouponRecord){
                userCouponRecord.setState(2);
                userCouponRecord.setEndTime(new Date());
                userCouponRecordService.updateById(userCouponRecord);
            }
            //处理打车卡
            if(null != userTaxiCard){
                userTaxiCardService.updateById(userTaxiCard);
            }
            if(null != query){
                query.setState(2);
                query.setEndTime(new Date());
                userRedPacketRecordService.updateById(query);
            }
            // TODO: 2020/5/24 这里需要给司机和用户推送订单状态
            new Thread(new Runnable() {
                @Override
                public void run() {
                    pushUtil.pushOrderState(1, orderCrossCity.getUserId(), orderCrossCity.getId(), 3, orderCrossCity.getState(), 0);
                    pushUtil.pushOrderState(2, orderCrossCity.getDriverId(), orderCrossCity.getId(), 3, orderCrossCity.getState(), 0);
                    pushUtil.pushDriverPosition(orderCrossCity.getId(), 3);
                }
            }).start();
            systemNoticeService.addSystemNotice(1, "您已使用余额成功完成出行订单支付,谢谢使用!", uid, 1);
        }else if(payType == 4){
            if(orderMoney == 0){
                return ResultUtil.error("请使用余额支付");
            }
            Double payMoney = orderCrossCity.getOrderMoney();
            Integer integer = paymentRecordService.saveData(1, orderCrossCity.getUserId(), 1, orderId, 3, 4, orderMoney, "", 1);
            resultUtil = appOrderController.placeAnOrder(new BigDecimal(orderMoney), 4,orderId,3,integer);
        }
        this.updateAllColumnById(orderCrossCity);
        return resultUtil;
    }
    public static void main(String[] args) {
        double a= 1.189999995;
        double v = new BigDecimal(a).setScale(2, RoundingMode.HALF_UP).doubleValue();
        System.out.println(v);
    }
    @Autowired
    private AppOrderController appOrderController;
    /**
     * 支付成功后的回调操作
     * @param id            订单=id
     * @param order_id      工行支付单号
     * @param type          1=微信,2=支付宝
     * @throws Exception
     */
    @Override
    public void payOrderCrossCityCallback(Integer id, String order_id, Integer type,String no) throws Exception {
        OrderCrossCity orderCrossCity = this.selectById(id);
        PaymentRecord query = paymentRecordService.query(1, orderCrossCity.getUserId(), 1, Integer.valueOf(id), 3, type, 1);
        if(null != query && query.getState() == 1){
            //添加交易明细
            transactionDetailsService.saveData(orderCrossCity.getUserId(), "跨城出行订单", query.getAmount(), 2, 1, 1, 3, query.getOrderId());
            orderCrossCity.setState(2);//先支付再服务
            orderCrossCity.setPayType(type);
            orderCrossCity.setPayMoney(query.getAmount());
            orderCrossCity.setBillNo(no);
            this.updateById(orderCrossCity);
            UserInfo userInfo = userInfoService.selectById(orderCrossCity.getUserId());
            SysIntegral query1 = sysIntegralMapper.query(orderCrossCity.getCompanyId());
            userInfo.setIntegral(userInfo.getIntegral() + (query.getAmount().intValue() * query1.getIntegral()));//积分
            userInfoService.updateById(userInfo);
            //处理优惠券和红包
            if(null != orderCrossCity.getCouponId()){
                UserCouponRecord userCouponRecord = userCouponRecordService.selectById(orderCrossCity.getCouponId());
                userCouponRecord.setState(2);
                userCouponRecord.setEndTime(new Date());
                userCouponRecordService.updateById(userCouponRecord);
            }
            if(null != orderCrossCity.getUserTaxiCardId()){
                UserTaxiCard userTaxiCard = userTaxiCardService.selectById(orderCrossCity.getUserTaxiCardId());
                if(userTaxiCard.getType() == 1 || userTaxiCard.getType() == 3){
                    JSONObject jsonObject = JSON.parseObject(userTaxiCard.getContent());
                    jsonObject.put("time", jsonObject.getInteger("time") - 1);
                    userTaxiCard.setContent(jsonObject.toJSONString());
                    userTaxiCardService.updateById(userTaxiCard);
                }
            }
            if(null != orderCrossCity.getRedPacketId()){
                UserRedPacketRecord userRedPacketRecord = userRedPacketRecordService.selectById(orderCrossCity.getRedPacketId());
                userRedPacketRecord.setState(2);
                userRedPacketRecord.setEndTime(new Date());
                userRedPacketRecordService.updateById(userRedPacketRecord);
            }
            query.setState(2);
            query.setCode(order_id);
            paymentRecordService.updateById(query);
            // TODO: 2020/5/24 这里需要给司机和用户推送订单状态
            new Thread(new Runnable() {
                @Override
                public void run() {
                    pushUtil.pushOrderState(1, orderCrossCity.getUserId(), orderCrossCity.getId(), 3, orderCrossCity.getState(), 0);
                    pushUtil.pushOrderState(2, orderCrossCity.getDriverId(), orderCrossCity.getId(), 3, orderCrossCity.getState(), 0);
                    pushUtil.pushDriverPosition(orderCrossCity.getId(), 3);
                }
            }).start();
            systemNoticeService.addSystemNotice(1, "您已使用" + (type == 1 ? "微信" : (type==2?"支付宝":"云闪付")) + "成功完成出行订单支付,谢谢使用!", orderCrossCity.getUserId(), 1);
        }else{
            System.err.println("预支付数据异常(orderId = "  + id + ")");
        }
    }
    /**
     * 跨城下单操作
     * @param orderCrossCityWarpper
     * @param uid
     * @return
     * @throws Exception
     */
    @Override
    public synchronized ResultUtil<BaseWarpper> orderCrossCity(OrderCrossCityWarpper orderCrossCityWarpper, Integer uid) throws Exception {
        System.out.println("aaaaaaaaaaaaaaa"+orderCrossCityWarpper.getDriverId()+":"+orderCrossCityWarpper.getLineShiftDriverId());
        /**
         * 1.出租车、专车、跨城有待支付的订单不能叫车
         * 2.小件物流有未完成的订单可以下跨城、专车、出租车
         * 3.出租车、专车、跨城有预约单可以下即时单
         */
        List<OrderPrivateCar> orderPrivateCars = orderPrivateCarMapper.queryByState(uid, 1, 1, 1, 2, 3, 4, 5, 6, 7, 11, 12);
        if(orderPrivateCars.size() > 0){
            return ResultUtil.error("有未完成的订单");
        }
        List<OrderTaxi> list = orderTaxiMapper.queryByState_(uid, 1, 1, 1, 2, 3, 4, 5, 6, 7, 11, 12);
        if(list.size() > 0){
            return ResultUtil.error("有未完成的订单");
        }
        List<OrderCrossCity> orderCrossCities1 = orderCrossCityMapper.queryByState(uid, 1, 2, 3, 4, 5, 6, 7, 11, 12);
        if(orderCrossCities1.size() > 0){
            return ResultUtil.error("有未完成的订单");
        }
        List<OrderCrossCity> orderCrossCities2 = orderCrossCityMapper.queryOrders(orderCrossCityWarpper.getDriverId(), orderCrossCityWarpper.getLineShiftDriverId(), Arrays.asList(5));
        if(orderCrossCities2.size() > 0){
            return ResultUtil.error("司机正在服务中");
        }
        /**
         * 先判断司机座位数是否符合出行人数
         */
        LineShiftDriver lineShiftDriver = lineShiftDriverMapper.selectById(orderCrossCityWarpper.getLineShiftDriverId());
        if(orderCrossCityWarpper.getTravelMode() == 1){//拼车判断座位数
            if(lineShiftDriver.getLaveSeat() < orderCrossCityWarpper.getPeopleNumber()){
                return ResultUtil.error("司机剩余座位数小于出行人数");
            }
        }else{
            if(lineShiftDriver.getLaveSeat() != lineShiftDriver.getTotalSeat()){
                return ResultUtil.error("司机车辆上已经有人占座了,不能下包车订单");
            }
            if(lineShiftDriver.getLaveSeat() == 0){
                return ResultUtil.error("司机车辆没有剩余空位了");
            }
        }
        Driver driver = driverService.selectById(orderCrossCityWarpper.getDriverId());
        if(driver.getState() == 1){
            return ResultUtil.error("司机处于离线状态");
        }
        OrderCrossCity orderCrossCity = new OrderCrossCity();
        orderCrossCity.setUserId(uid);
        orderCrossCity.setServerCarModelId(orderCrossCityWarpper.getServerCarModelId());
        orderCrossCity.setDriverId(orderCrossCityWarpper.getDriverId());
        orderCrossCity.setLineId(orderCrossCityWarpper.getLineId());
        orderCrossCity.setLineShiftDriverId(orderCrossCityWarpper.getLineShiftDriverId());
        orderCrossCity.setCarId(orderCrossCityWarpper.getCarId());
        orderCrossCity.setOrderNum(this.getOrderNum(orderCrossCityWarpper.getDriverId(),orderCrossCityWarpper.getLineShiftDriverId()));
        orderCrossCity.setPlacementLon(orderCrossCityWarpper.getPlacementLon());
        orderCrossCity.setPlacementLat(orderCrossCityWarpper.getPlacementLat());
        String placementAddress = orderCrossCityWarpper.getPlacementAddress();
        placementAddress = placementAddress.replaceAll("& #40;", "(");
        placementAddress = placementAddress.replaceAll("& #41;", ")");
        orderCrossCity.setPlacementAddress(placementAddress);
        orderCrossCity.setStartLon(orderCrossCityWarpper.getStartLon());
        orderCrossCity.setStartLat(orderCrossCityWarpper.getStartLat());
        String startAddress = orderCrossCityWarpper.getStartAddress();
        startAddress = startAddress.replaceAll("& #40;", "(");
        startAddress = startAddress.replaceAll("& #41;", ")");
        orderCrossCity.setStartAddress(startAddress);
        orderCrossCity.setEndLon(orderCrossCityWarpper.getEndLon());
        orderCrossCity.setEndLat(orderCrossCityWarpper.getEndLat());
        String endAddress = orderCrossCityWarpper.getEndAddress();
        endAddress = endAddress.replaceAll("& #40;", "(");
        endAddress = endAddress.replaceAll("& #41;", ")");
        orderCrossCity.setEndAddress(endAddress);
        orderCrossCity.setMileage(0D);
        ResultUtil<Map<String, Object>> price = this.getPrice(orderCrossCityWarpper.getDistance(), orderCrossCityWarpper.getPeopleNumber(), orderCrossCityWarpper.getTravelMode(), orderCrossCityWarpper.getLineId(),
                orderCrossCityWarpper.getServerCarModelId(), orderCrossCityWarpper.getTotalSeat(), orderCrossCityWarpper.getSeatNumber());
        Double money = Double.valueOf(price.getData().get("price").toString());
        orderCrossCity.setOrderMoney(money);
        Integer companyId = driver.getCompanyId();
        orderCrossCity.setCompanyId(companyId);
        UserInfo userInfo = userInfoService.selectById(uid);
        orderCrossCity.setPassengers(userInfo.getNickName());
        orderCrossCity.setPassengersPhone(userInfo.getPhone());
        orderCrossCity.setPeopleNumber(orderCrossCityWarpper.getPeopleNumber());
        orderCrossCity.setSeatNumber(orderCrossCityWarpper.getSeatNumber());
        List<OrderCrossCity> orderCrossCities = this.selectList(new EntityWrapper<OrderCrossCity>().eq("orderNum", orderCrossCity.getOrderNum()).eq("isDelete", 1));
        orderCrossCity.setSort(orderCrossCities.size() + 1);
        orderCrossCity.setState(7);//待支付
        orderCrossCity.setInsertTime(new Date());
        orderCrossCity.setTravelTime(orderCrossCityWarpper.getTravelTime());
        orderCrossCity.setSnatchOrderTime(new Date());
        orderCrossCity.setTravelMode(orderCrossCityWarpper.getTravelMode());
        orderCrossCity.setOrderSource(orderCrossCityWarpper.getOrderSource());
        orderCrossCity.setIsDelete(1);
        orderCrossCity.setRemark(orderCrossCityWarpper.getRemark());
        orderCrossCity.setIsReassign(1);
         userInfo.setBalance(new BigDecimal(userInfo.getBalance()).subtract(new BigDecimal(orderMoney)).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue());
         OpenCity openCity = openCityService.openCity1(orderCrossCity.getStartLon().toString(), orderCrossCity.getStartLat().toString());
         SysIntegral query1 = sysIntegralMapper.query(openCity.getId());
         userInfo.setIntegral(userInfo.getIntegral() + (orderMoney.intValue() * query1.getIntegral()));//积分
         //添加交易明细
         transactionDetailsService.saveData(uid, "跨城出行订单", orderMoney, 2, 1, 1, 3, orderId);
         userInfoService.updateById(userInfo);
         orderCrossCity.setState(2);//跨城支付完成后才开始服务
         orderCrossCity.setPayType(3);
         orderCrossCity.setPayMoney(orderMoney);
         //处理优惠券和红包
         if (null != userCouponRecord) {
            userCouponRecord.setState(2);
            userCouponRecord.setEndTime(new Date());
            userCouponRecordService.updateById(userCouponRecord);
         }
         //处理打车卡
         if (null != userTaxiCard) {
            userTaxiCardService.updateById(userTaxiCard);
         }
         if (null != query) {
            query.setState(2);
            query.setEndTime(new Date());
            userRedPacketRecordService.updateById(query);
         }
         // TODO: 2020/5/24 这里需要给司机和用户推送订单状态
         new Thread(new Runnable() {
            @Override
            public void run() {
               pushUtil.pushOrderState(1, orderCrossCity.getUserId(), orderCrossCity.getId(), 3, orderCrossCity.getState(), 0);
               pushUtil.pushOrderState(2, orderCrossCity.getDriverId(), orderCrossCity.getId(), 3, orderCrossCity.getState(), 0);
               pushUtil.pushDriverPosition(orderCrossCity.getId(), 3);
            }
         }).start();
         systemNoticeService.addSystemNotice(1, "您已使用余额成功完成出行订单支付,谢谢使用!", uid, 1);
      } else if (payType == 4) {
         if (orderMoney == 0) {
            return ResultUtil.error("请使用余额支付");
         }
         Double payMoney = orderCrossCity.getOrderMoney();
         Integer integer = paymentRecordService.saveData(1, orderCrossCity.getUserId(), 1, orderId, 3, 4, orderMoney, "", 1);
         resultUtil = appOrderController.placeAnOrder(new BigDecimal(orderMoney), 4, orderId, 3, integer);
      }
      this.updateAllColumnById(orderCrossCity);
      return resultUtil;
   }
   public static void main(String[] args) {
      double a = 1.189999995;
      double v = new BigDecimal(a).setScale(2, RoundingMode.HALF_UP).doubleValue();
      System.out.println(v);
   }
   @Autowired
   private AppOrderController appOrderController;
   /**
    * 支付成功后的回调操作
    *
    * @param id       订单=id
    * @param order_id 工行支付单号
    * @param type     1=微信,2=支付宝
    * @throws Exception
    */
   @Override
   public void payOrderCrossCityCallback(Integer id, String order_id, Integer type, String no) throws Exception {
      OrderCrossCity orderCrossCity = this.selectById(id);
      PaymentRecord query = paymentRecordService.query(1, orderCrossCity.getUserId(), 1, Integer.valueOf(id), 3, type, 1);
      if (null != query && query.getState() == 1) {
         //添加交易明细
         transactionDetailsService.saveData(orderCrossCity.getUserId(), "跨城出行订单", query.getAmount(), 2, 1, 1, 3, query.getOrderId());
         orderCrossCity.setState(2);//先支付再服务
         orderCrossCity.setPayType(type);
         orderCrossCity.setPayMoney(query.getAmount());
         orderCrossCity.setBillNo(no);
         this.updateById(orderCrossCity);
         UserInfo userInfo = userInfoService.selectById(orderCrossCity.getUserId());
         OpenCity openCity = openCityService.openCity1(orderCrossCity.getStartLon().toString(), orderCrossCity.getStartLat().toString());
         SysIntegral query1 = sysIntegralMapper.query(openCity.getId());
         userInfo.setIntegral(userInfo.getIntegral() + (query.getAmount().intValue() * query1.getIntegral()));//积分
         userInfoService.updateById(userInfo);
         //处理优惠券和红包
         if (null != orderCrossCity.getCouponId()) {
            UserCouponRecord userCouponRecord = userCouponRecordService.selectById(orderCrossCity.getCouponId());
            userCouponRecord.setState(2);
            userCouponRecord.setEndTime(new Date());
            userCouponRecordService.updateById(userCouponRecord);
         }
         if (null != orderCrossCity.getUserTaxiCardId()) {
            UserTaxiCard userTaxiCard = userTaxiCardService.selectById(orderCrossCity.getUserTaxiCardId());
            if (userTaxiCard.getType() == 1 || userTaxiCard.getType() == 3) {
               JSONObject jsonObject = JSON.parseObject(userTaxiCard.getContent());
               jsonObject.put("time", jsonObject.getInteger("time") - 1);
               userTaxiCard.setContent(jsonObject.toJSONString());
               userTaxiCardService.updateById(userTaxiCard);
            }
         }
         if (null != orderCrossCity.getRedPacketId()) {
            UserRedPacketRecord userRedPacketRecord = userRedPacketRecordService.selectById(orderCrossCity.getRedPacketId());
            userRedPacketRecord.setState(2);
            userRedPacketRecord.setEndTime(new Date());
            userRedPacketRecordService.updateById(userRedPacketRecord);
         }
         query.setState(2);
         query.setCode(order_id);
         paymentRecordService.updateById(query);
         // TODO: 2020/5/24 这里需要给司机和用户推送订单状态
         new Thread(new Runnable() {
            @Override
            public void run() {
               pushUtil.pushOrderState(1, orderCrossCity.getUserId(), orderCrossCity.getId(), 3, orderCrossCity.getState(), 0);
               pushUtil.pushOrderState(2, orderCrossCity.getDriverId(), orderCrossCity.getId(), 3, orderCrossCity.getState(), 0);
               pushUtil.pushDriverPosition(orderCrossCity.getId(), 3);
            }
         }).start();
         systemNoticeService.addSystemNotice(1, "您已使用" + (type == 1 ? "微信" : (type == 2 ? "支付宝" : "云闪付")) + "成功完成出行订单支付,谢谢使用!", orderCrossCity.getUserId(), 1);
      } else {
         System.err.println("预支付数据异常(orderId = " + id + ")");
      }
   }
   /**
    * 跨城下单操作
    *
    * @param orderCrossCityWarpper
    * @param uid
    * @return
    * @throws Exception
    */
   @Override
   public synchronized ResultUtil<BaseWarpper> orderCrossCity(OrderCrossCityWarpper orderCrossCityWarpper, Integer uid) throws Exception {
      System.out.println("aaaaaaaaaaaaaaa" + orderCrossCityWarpper.getDriverId() + ":" + orderCrossCityWarpper.getLineShiftDriverId());
      /**
       * 1.出租车、专车、跨城有待支付的订单不能叫车
       * 2.小件物流有未完成的订单可以下跨城、专车、出租车
       * 3.出租车、专车、跨城有预约单可以下即时单
       */
      List<OrderPrivateCar> orderPrivateCars = orderPrivateCarMapper.queryByState(uid, 1, 1, 1, 2, 3, 4, 5, 6, 7, 11, 12);
      if (orderPrivateCars.size() > 0) {
         return ResultUtil.error("有未完成的订单");
      }
      List<OrderTaxi> list = orderTaxiMapper.queryByState_(uid, 1, 1, 1, 2, 3, 4, 5, 6, 7, 11, 12);
      if (list.size() > 0) {
         return ResultUtil.error("有未完成的订单");
      }
      List<OrderCrossCity> orderCrossCities1 = orderCrossCityMapper.queryByState(uid, 1, 2, 3, 4, 5, 6, 7, 11, 12);
      if (orderCrossCities1.size() > 0) {
         return ResultUtil.error("有未完成的订单");
      }
      List<OrderCrossCity> orderCrossCities2 = orderCrossCityMapper.queryOrders(orderCrossCityWarpper.getDriverId(), orderCrossCityWarpper.getLineShiftDriverId(), Arrays.asList(5));
      if (orderCrossCities2.size() > 0) {
         return ResultUtil.error("司机正在服务中");
      }
      /**
       * 先判断司机座位数是否符合出行人数
       */
      LineShiftDriver lineShiftDriver = lineShiftDriverMapper.selectById(orderCrossCityWarpper.getLineShiftDriverId());
      if (orderCrossCityWarpper.getTravelMode() == 1) {//拼车判断座位数
         if (lineShiftDriver.getLaveSeat() < orderCrossCityWarpper.getPeopleNumber()) {
            return ResultUtil.error("司机剩余座位数小于出行人数");
         }
      } else {
         if (lineShiftDriver.getLaveSeat() != lineShiftDriver.getTotalSeat()) {
            return ResultUtil.error("司机车辆上已经有人占座了,不能下包车订单");
         }
         if (lineShiftDriver.getLaveSeat() == 0) {
            return ResultUtil.error("司机车辆没有剩余空位了");
         }
      }
      Driver driver = driverService.selectById(orderCrossCityWarpper.getDriverId());
      if (driver.getState() == 1) {
         return ResultUtil.error("司机处于离线状态");
      }
      OrderCrossCity orderCrossCity = new OrderCrossCity();
      orderCrossCity.setUserId(uid);
      orderCrossCity.setServerCarModelId(orderCrossCityWarpper.getServerCarModelId());
      orderCrossCity.setDriverId(orderCrossCityWarpper.getDriverId());
      orderCrossCity.setLineId(orderCrossCityWarpper.getLineId());
      orderCrossCity.setLineShiftDriverId(orderCrossCityWarpper.getLineShiftDriverId());
      orderCrossCity.setCarId(orderCrossCityWarpper.getCarId());
      orderCrossCity.setOrderNum(this.getOrderNum(orderCrossCityWarpper.getDriverId(), orderCrossCityWarpper.getLineShiftDriverId()));
      orderCrossCity.setPlacementLon(orderCrossCityWarpper.getPlacementLon());
      orderCrossCity.setPlacementLat(orderCrossCityWarpper.getPlacementLat());
      String placementAddress = orderCrossCityWarpper.getPlacementAddress();
      placementAddress = placementAddress.replaceAll("& #40;", "(");
      placementAddress = placementAddress.replaceAll("& #41;", ")");
      orderCrossCity.setPlacementAddress(placementAddress);
      orderCrossCity.setStartLon(orderCrossCityWarpper.getStartLon());
      orderCrossCity.setStartLat(orderCrossCityWarpper.getStartLat());
      String startAddress = orderCrossCityWarpper.getStartAddress();
      startAddress = startAddress.replaceAll("& #40;", "(");
      startAddress = startAddress.replaceAll("& #41;", ")");
      orderCrossCity.setStartAddress(startAddress);
      orderCrossCity.setEndLon(orderCrossCityWarpper.getEndLon());
      orderCrossCity.setEndLat(orderCrossCityWarpper.getEndLat());
      String endAddress = orderCrossCityWarpper.getEndAddress();
      endAddress = endAddress.replaceAll("& #40;", "(");
      endAddress = endAddress.replaceAll("& #41;", ")");
      orderCrossCity.setEndAddress(endAddress);
      orderCrossCity.setMileage(0D);
      ResultUtil<Map<String, Object>> price = this.getPrice(orderCrossCityWarpper.getDistance(), orderCrossCityWarpper.getPeopleNumber(), orderCrossCityWarpper.getTravelMode(), orderCrossCityWarpper.getLineId(),
            orderCrossCityWarpper.getServerCarModelId(), orderCrossCityWarpper.getTotalSeat(), orderCrossCityWarpper.getSeatNumber());
      Double money = Double.valueOf(price.getData().get("price").toString());
      orderCrossCity.setOrderMoney(money);
      Integer companyId = driver.getCompanyId();
      orderCrossCity.setCompanyId(companyId);
      UserInfo userInfo = userInfoService.selectById(uid);
      orderCrossCity.setPassengers(userInfo.getNickName());
      orderCrossCity.setPassengersPhone(userInfo.getPhone());
      orderCrossCity.setPeopleNumber(orderCrossCityWarpper.getPeopleNumber());
      orderCrossCity.setSeatNumber(orderCrossCityWarpper.getSeatNumber());
      List<OrderCrossCity> orderCrossCities = this.selectList(new EntityWrapper<OrderCrossCity>().eq("orderNum", orderCrossCity.getOrderNum()).eq("isDelete", 1));
      orderCrossCity.setSort(orderCrossCities.size() + 1);
      orderCrossCity.setState(7);//待支付
      orderCrossCity.setInsertTime(new Date());
      orderCrossCity.setTravelTime(orderCrossCityWarpper.getTravelTime());
      orderCrossCity.setSnatchOrderTime(new Date());
      orderCrossCity.setTravelMode(orderCrossCityWarpper.getTravelMode());
      orderCrossCity.setOrderSource(orderCrossCityWarpper.getOrderSource());
      orderCrossCity.setIsDelete(1);
      orderCrossCity.setRemark(orderCrossCityWarpper.getRemark());
      orderCrossCity.setIsReassign(1);
//        //调用高德创建轨迹
//        String s = gdFalconUtil.selectTerminal(driver.getPhone());
//        String track = gdFalconUtil.createTrack(s);
//        orderCrossCity.setTrackId(track);
        if(orderCrossCity.getTravelMode() == 2){//包车
      if (orderCrossCity.getTravelMode() == 2) {//包车
//            orderCrossCity.setSeatNumber(lineShiftDriver.getLaveSeatNumber());
//            orderCrossCity.setPeopleNumber(lineShiftDriver.getLaveSeat());
        }
        //调用移动的小号接口
        Map<String, String> map = chinaMobileUtil.midAxbBindSend(orderCrossCity.getPassengersPhone(), driver.getPhone(), (System.currentTimeMillis() + 86400000));
        if(String.valueOf(map.get("code")).equals("200")){
            orderCrossCity.setTelX(map.get("telX"));
            orderCrossCity.setBindId(map.get("bindId"));
        }
        this.insert(orderCrossCity);
        if(driver.getState() == 2){
            driver.setState(3);
            driverService.updateById(driver);
        }
        //修改预约班次的数据
        if(orderCrossCity.getTravelMode() == 2){//包车
            lineShiftDriver.setLaveSeat(0);
            lineShiftDriver.setLaveSeatNumber("");
        }else{//拼车
            lineShiftDriver.setLaveSeat((lineShiftDriver.getLaveSeat() - orderCrossCity.getPeopleNumber()) < 0 ? 0 : lineShiftDriver.getLaveSeat() - orderCrossCity.getPeopleNumber());
            String[] split = orderCrossCity.getSeatNumber().split(",");
            String[] split1 = lineShiftDriver.getLaveSeatNumber().split(",");
            String seatNumber = "";
            //先判断选中座位号和剩余座位号是否匹配
            for(String spl : split){
                boolean b = true;
                for(String sp : split1){
                    if(ToolUtil.isNotEmpty(spl) && ToolUtil.isNotEmpty(sp) && sp.equals(spl)){
                        b = false;
                        break;
                    }
                }
                if(b){
                    throw new SystemException("您选中的" + spl + "号座位已被占用,请选择其他座位!");
                }
            }
            for(String sp : split1){
                boolean b = true;
                for(String spl : split){
                    if(ToolUtil.isNotEmpty(spl) && ToolUtil.isNotEmpty(sp) && sp.equals(spl)){
                        b = false;
                        break;
                    }
                }
                if(b && ToolUtil.isNotEmpty(sp)){
                    seatNumber += (sp + ",");
                }
            }
            lineShiftDriver.setLaveSeatNumber((ToolUtil.isNotEmpty(seatNumber) && seatNumber.length() > 0) ?
                    seatNumber.substring(0, seatNumber.length() - 1) : "");
        }
        lineShiftDriverMapper.updateById(lineShiftDriver);
        //添加消息
        systemNoticeService.addSystemNotice(1, "您的跨城订单已下单成功!", orderCrossCity.getUserId(), 1);
        BaseWarpper baseWarpper = new BaseWarpper();
        baseWarpper.setId(orderCrossCity.getId());
        //创建定时任务,取消订单30分钟
        TimerTask timerTask = new TimerTask() {
            @Override
            public void run() {
                OrderCrossCity orderCrossCity1 = orderCrossCityMapper.selectById(orderCrossCity.getId());
                if(orderCrossCity1.getState() == 7 && orderCrossCity1.getPayMoney() == null){
                    orderCrossCity1.setState(10);
                    orderCrossCityMapper.updateById(orderCrossCity1);
                    OrderCancel orderCancel = new OrderCancel();
                    orderCancel.setOrderId(orderCrossCity.getId());
                    orderCancel.setOrderType(3);
                    orderCancel.setReason("用户未及时付款,系统自动取消订单");
                    orderCancel.setRemark("用户未及时付款,系统自动取消订单");
                    orderCancel.setState(2);
                    orderCancel.setInsertTime(new Date());
                    orderCancel.setUserType(2);
                    orderCancelService.insert(orderCancel);
                    //修改司机座位
                    LineShiftDriver lineShiftDriver = lineShiftDriverMapper.selectById(orderCrossCity.getLineShiftDriverId());
                    lineShiftDriver.setLaveSeat(lineShiftDriver.getLaveSeat() + orderCrossCity.getPeopleNumber());
                    lineShiftDriver.setLaveSeatNumber(lineShiftDriver.getLaveSeatNumber() + (orderCrossCity.getTravelMode() == 1 ? "," : "") + orderCrossCity.getSeatNumber());
                    lineShiftDriverMapper.updateById(lineShiftDriver);
                    //修改司机为空闲
                    List<OrderCrossCity> orderCrossCities = orderCrossCityMapper.queryByDriverId(orderCrossCity.getDriverId(), 2, 3, 4, 5, 11);
                    if(orderCrossCities.size() == 0){
                        Driver driver = driverService.selectById(orderCrossCity.getDriverId());
                        driver.setState(2);
                        driverService.updateById(driver);
                    }
                }
            }
        };
        Timer timer = new Timer();
        timer.schedule(timerTask, 30 * 60 * 1000);
        return ResultUtil.success(baseWarpper);
    }
    /**
     * 获取订单
     * @param uid
     * @param state
     * @return
     * @throws Exception
     */
    @Override
    public List<OrderCrossCity> queryOrder(Integer uid, Integer... state) throws Exception {
        return orderCrossCityMapper.queryByState(uid, state);
    }
    /**
     * 获取订单详情
     * @param orderId
     * @return
     * @throws Exception
     */
    @Override
    public Map<String, Object> queryOrderInfo(Integer orderId) throws Exception {
        Map<String, Object> map = orderCrossCityMapper.queryOrderInfo(orderId);
        if(null != map.get("reassignNotice") && Integer.valueOf(String.valueOf(map.get("reassignNotice"))) == 2){//改派完成,重新获取了新的司机数据,开始修改数据防止继续调用
            OrderCrossCity orderCrossCity = this.selectById(orderId);
            orderCrossCity.setReassignNotice(0);
            this.updateById(orderCrossCity);
        }
        if(Integer.valueOf(String.valueOf(map.get("state"))) == 11){
            map.put("state", map.get("oldState"));
        }
        Map<String, String> geocode = gdMapGeocodingUtil.geocode(map.get("startLon").toString(), map.get("startLat").toString());
        map.put("startCity", geocode.get("city"));
        geocode = gdMapGeocodingUtil.geocode(map.get("endLon").toString(), map.get("endLat").toString());
        map.put("endCity", geocode.get("city"));
        String driverId = (String) redisTemplate.opsForValue().get("DEVICE_" + map.get("driverId"));
        map.put("device", ToolUtil.isNotEmpty(driverId) ? 2 : 1);
        map.put("orderType", 3);
        return map;
    }
    /**
     * 获取取消订单的支付费用
     * @param id
     * @return
     * @throws Exception
     */
    @Override
    public ResultUtil<BaseWarpper> queryCancleAmount(Integer id) throws Exception {
        OrderCrossCity orderCrossCity = this.selectById(id);
        BaseWarpper baseWarpper = new BaseWarpper();
        if(null == orderCrossCity){
            return ResultUtil.error("获取数据失败,订单信息有误");
        }
        double amount = 0;
        CancleOrder query = cancleOrderService.query(1, 3, orderCrossCity.getCompanyId());
        if(null != orderCrossCity.getDriverId() &&
                (orderCrossCity.getSnatchOrderTime().getTime() + query.getMinuteNum() * 60 * 1000) < new Date().getTime()){//收费的情况
            if(null != query){
                amount += query.getMoney();
            }
        }
        baseWarpper.setAmount(amount);
        return ResultUtil.success(baseWarpper);
    }
    /**
     * 取消订单操作
     * @param id
     * @param payType
     * @param cancleId
     * @param type
     * @return
     * @throws Exception
     */
    @Override
    @Transactional(propagation = Propagation.REQUIRES_NEW)
    public ResultUtil cancleOrderCrossCity(Integer id, Integer payType, Integer cancleId, Integer type) throws Exception {
        OrderCrossCity orderCrossCity = this.selectById(id);
        Integer uid = orderCrossCity.getUserId();
        UserInfo userInfo = userInfoService.selectById(uid);
        ResultUtil resultUtil = ResultUtil.success(new Object());
        if(null == orderCrossCity){
            return ResultUtil.error("取消订单失败,订单信息有误", "");
        }
        if(orderCrossCity.getState() != 12){
            return ResultUtil.error("取消订单失败,不合法的操作", "");
        }
        OrderCancel orderCancel = null;
        if(null == cancleId){
            orderCancel = orderCancelService.query(id, 3, null, null, 1);
        }else{
            orderCancel = orderCancelService.selectById(cancleId);
        }
        CancleOrder query = cancleOrderService.query(1, 3, orderCrossCity.getCompanyId());
        if(null != query){
            if(payType == 1){//微信支付
                String value = (String) redisTemplate.opsForValue().get("appletOpenId");
                String appletsOpenId = null;
                if(ToolUtil.isNotEmpty(value)){
                    JSONObject jsonObject = JSON.parseObject(value);
                    appletsOpenId = jsonObject.getString(uid.toString());
                }else{
                    appletsOpenId = userInfo.getAppletsOpenId();
                }
                orderCancel.setPayType(1);
                orderCancelService.updateById(orderCancel);
                String app = type == 1 ? "APP" : "JSAPI";
                resultUtil = payMoneyUtil.weixinpay("订单取消", "", id + "_3_" + UUIDUtil.getRandomCode(5), query.getMoney().toString(), "/base/wxCancelOrderTaxi", app, userInfo.getAppletsOpenId());
                paymentRecordService.saveData(1, orderCrossCity.getUserId(), 1, id, 3, 1, query.getMoney(), "", 1);//添加预支付数据
      }
      //调用移动的小号接口
//        Map<String, String> map = chinaMobileUtil.midAxbBindSend(orderCrossCity.getPassengersPhone(), driver.getPhone(), (System.currentTimeMillis() + 86400000));
//        if(String.valueOf(map.get("code")).equals("200")){
//            orderCrossCity.setTelX(map.get("telX"));
//            orderCrossCity.setBindId(map.get("bindId"));
//        }
      this.insert(orderCrossCity);
      if (driver.getState() == 2) {
         driver.setState(3);
         driverService.updateById(driver);
      }
      //修改预约班次的数据
      if (orderCrossCity.getTravelMode() == 2) {//包车
         lineShiftDriver.setLaveSeat(0);
         lineShiftDriver.setLaveSeatNumber("");
      } else {//拼车
         lineShiftDriver.setLaveSeat((lineShiftDriver.getLaveSeat() - orderCrossCity.getPeopleNumber()) < 0 ? 0 : lineShiftDriver.getLaveSeat() - orderCrossCity.getPeopleNumber());
         String[] split = orderCrossCity.getSeatNumber().split(",");
         String[] split1 = lineShiftDriver.getLaveSeatNumber().split(",");
         String seatNumber = "";
         //先判断选中座位号和剩余座位号是否匹配
         for (String spl : split) {
            boolean b = true;
            for (String sp : split1) {
               if (ToolUtil.isNotEmpty(spl) && ToolUtil.isNotEmpty(sp) && sp.equals(spl)) {
                  b = false;
                  break;
               }
            }
            if (b) {
               throw new SystemException("您选中的" + spl + "号座位已被占用,请选择其他座位!");
            }
         }
         for (String sp : split1) {
            boolean b = true;
            for (String spl : split) {
               if (ToolUtil.isNotEmpty(spl) && ToolUtil.isNotEmpty(sp) && sp.equals(spl)) {
                  b = false;
                  break;
               }
            }
            if (b && ToolUtil.isNotEmpty(sp)) {
               seatNumber += (sp + ",");
            }
         }
         lineShiftDriver.setLaveSeatNumber((ToolUtil.isNotEmpty(seatNumber) && seatNumber.length() > 0) ?
               seatNumber.substring(0, seatNumber.length() - 1) : "");
      }
      lineShiftDriverMapper.updateById(lineShiftDriver);
      //添加消息
      systemNoticeService.addSystemNotice(1, "您的跨城订单已下单成功!", orderCrossCity.getUserId(), 1);
      BaseWarpper baseWarpper = new BaseWarpper();
      baseWarpper.setId(orderCrossCity.getId());
      //创建定时任务,取消订单30分钟
      TimerTask timerTask = new TimerTask() {
         @Override
         public void run() {
            OrderCrossCity orderCrossCity1 = orderCrossCityMapper.selectById(orderCrossCity.getId());
            if (orderCrossCity1.getState() == 7 && orderCrossCity1.getPayMoney() == null) {
               orderCrossCity1.setState(10);
               orderCrossCityMapper.updateById(orderCrossCity1);
               OrderCancel orderCancel = new OrderCancel();
               orderCancel.setOrderId(orderCrossCity.getId());
               orderCancel.setOrderType(3);
               orderCancel.setReason("用户未及时付款,系统自动取消订单");
               orderCancel.setRemark("用户未及时付款,系统自动取消订单");
               orderCancel.setState(2);
               orderCancel.setInsertTime(new Date());
               orderCancel.setUserType(2);
               orderCancelService.insert(orderCancel);
               //修改司机座位
               LineShiftDriver lineShiftDriver = lineShiftDriverMapper.selectById(orderCrossCity.getLineShiftDriverId());
               lineShiftDriver.setLaveSeat(lineShiftDriver.getLaveSeat() + orderCrossCity.getPeopleNumber());
               lineShiftDriver.setLaveSeatNumber(lineShiftDriver.getLaveSeatNumber() + (orderCrossCity.getTravelMode() == 1 ? "," : "") + orderCrossCity.getSeatNumber());
               lineShiftDriverMapper.updateById(lineShiftDriver);
               //修改司机为空闲
               List<OrderCrossCity> orderCrossCities = orderCrossCityMapper.queryByDriverId(orderCrossCity.getDriverId(), 2, 3, 4, 5, 11);
               if (orderCrossCities.size() == 0) {
                  Driver driver = driverService.selectById(orderCrossCity.getDriverId());
                  driver.setState(2);
                  driverService.updateById(driver);
               }
            }
         }
      };
      Timer timer = new Timer();
      timer.schedule(timerTask, 30 * 60 * 1000);
      return ResultUtil.success(baseWarpper);
   }
   /**
    * 获取订单
    *
    * @param uid
    * @param state
    * @return
    * @throws Exception
    */
   @Override
   public List<OrderCrossCity> queryOrder(Integer uid, Integer... state) throws Exception {
      return orderCrossCityMapper.queryByState(uid, state);
   }
   /**
    * 获取订单详情
    *
    * @param orderId
    * @return
    * @throws Exception
    */
   @Override
   public Map<String, Object> queryOrderInfo(Integer orderId) throws Exception {
      Map<String, Object> map = orderCrossCityMapper.queryOrderInfo(orderId);
      if (null != map.get("reassignNotice") && Integer.valueOf(String.valueOf(map.get("reassignNotice"))) == 2) {//改派完成,重新获取了新的司机数据,开始修改数据防止继续调用
         OrderCrossCity orderCrossCity = this.selectById(orderId);
         orderCrossCity.setReassignNotice(0);
         this.updateById(orderCrossCity);
      }
      if (Integer.valueOf(String.valueOf(map.get("state"))) == 11) {
         map.put("state", map.get("oldState"));
      }
      Map<String, String> geocode = gdMapGeocodingUtil.geocode(map.get("startLon").toString(), map.get("startLat").toString());
      map.put("startCity", geocode.get("city"));
      geocode = gdMapGeocodingUtil.geocode(map.get("endLon").toString(), map.get("endLat").toString());
      map.put("endCity", geocode.get("city"));
      String driverId = (String) redisTemplate.opsForValue().get("DEVICE_" + map.get("driverId"));
      map.put("device", ToolUtil.isNotEmpty(driverId) ? 2 : 1);
      map.put("orderType", 3);
      return map;
   }
   /**
    * 获取取消订单的支付费用
    *
    * @param id
    * @return
    * @throws Exception
    */
   @Override
   public ResultUtil<BaseWarpper> queryCancleAmount(Integer id) throws Exception {
      OrderCrossCity orderCrossCity = this.selectById(id);
      BaseWarpper baseWarpper = new BaseWarpper();
      if (null == orderCrossCity) {
         return ResultUtil.error("获取数据失败,订单信息有误");
      }
      OpenCity openCity = openCityService.openCity1(orderCrossCity.getStartLon().toString(), orderCrossCity.getStartLat().toString());
      double amount = 0;
      CancleOrder query = cancleOrderService.query(1, 3, openCity.getId());
      if (null != orderCrossCity.getDriverId() &&
            (orderCrossCity.getSnatchOrderTime().getTime() + query.getMinuteNum() * 60 * 1000) < new Date().getTime()) {//收费的情况
         if (null != query) {
            amount += query.getMoney();
         }
      }
      baseWarpper.setAmount(amount);
      return ResultUtil.success(baseWarpper);
   }
   /**
    * 取消订单操作
    *
    * @param id
    * @param payType
    * @param cancleId
    * @param type
    * @return
    * @throws Exception
    */
   @Override
   @Transactional(propagation = Propagation.REQUIRES_NEW)
   public ResultUtil cancleOrderCrossCity(Integer id, Integer payType, Integer cancleId, Integer type) throws Exception {
      OrderCrossCity orderCrossCity = this.selectById(id);
      Integer uid = orderCrossCity.getUserId();
      UserInfo userInfo = userInfoService.selectById(uid);
      ResultUtil resultUtil = ResultUtil.success(new Object());
      if (null == orderCrossCity) {
         return ResultUtil.error("取消订单失败,订单信息有误", "");
      }
      if (orderCrossCity.getState() != 12) {
         return ResultUtil.error("取消订单失败,不合法的操作", "");
      }
      OrderCancel orderCancel = null;
      if (null == cancleId) {
         orderCancel = orderCancelService.query(id, 3, null, null, 1);
      } else {
         orderCancel = orderCancelService.selectById(cancleId);
      }
      OpenCity openCity = openCityService.openCity1(orderCrossCity.getStartLon().toString(), orderCrossCity.getStartLat().toString());
      CancleOrder query = cancleOrderService.query(1, 3, openCity.getId());
      if (null != query) {
         if (payType == 1) {//微信支付
            String value = (String) redisTemplate.opsForValue().get("appletOpenId");
            String appletsOpenId = null;
            if (ToolUtil.isNotEmpty(value)) {
               JSONObject jsonObject = JSON.parseObject(value);
               appletsOpenId = jsonObject.getString(uid.toString());
            } else {
               appletsOpenId = userInfo.getAppletsOpenId();
            }
            orderCancel.setPayType(1);
            orderCancelService.updateById(orderCancel);
            String app = type == 1 ? "APP" : "JSAPI";
            resultUtil = payMoneyUtil.weixinpay("订单取消", "", id + "_3_" + UUIDUtil.getRandomCode(5), query.getMoney().toString(), "/base/wxCancelOrderTaxi", app, userInfo.getAppletsOpenId());
            paymentRecordService.saveData(1, orderCrossCity.getUserId(), 1, id, 3, 1, query.getMoney(), "", 1);//添加预支付数据
//                Map<String, String> map = icbcPayUtil.placeAnOrder(id + ",3", 9, 5, uid.toString(), "订单取消", query.getMoney(), callbackPath + "/base/wxCancelOrderTaxi", "", type, appletsOpenId);
//                if(map.get("code").equals("200")){
@@ -1506,13 +1514,13 @@
//                }else{
//                    resultUtil = ResultUtil.error(map.get("msg"), "");
//                }
            }
            if(payType == 2){//支付宝支付
                orderCancel.setPayType(2);
                orderCancelService.updateById(orderCancel);
                resultUtil = payMoneyUtil.alipay("订单取消", "订单取消", "", id + "_3_" + UUIDUtil.getRandomCode(5), query.getMoney().toString(), "/base/aliCancelOrderTaxi");
                paymentRecordService.saveData(1, orderCrossCity.getUserId(), 1, id, 3, 2, query.getMoney(), "", 1);//添加预支付数据
         }
         if (payType == 2) {//支付宝支付
            orderCancel.setPayType(2);
            orderCancelService.updateById(orderCancel);
            resultUtil = payMoneyUtil.alipay("订单取消", "订单取消", "", id + "_3_" + UUIDUtil.getRandomCode(5), query.getMoney().toString(), "/base/aliCancelOrderTaxi");
            paymentRecordService.saveData(1, orderCrossCity.getUserId(), 1, id, 3, 2, query.getMoney(), "", 1);//添加预支付数据
//                Map<String, String> map = icbcPayUtil.placeAnOrder(id + ",3", 10, 5, uid.toString(), "订单取消", query.getMoney(), callbackPath + "/base/aliCancelOrderTaxi", "", type, null);
//                if(map.get("code").equals("200")){
@@ -1521,39 +1529,39 @@
//                }else{
//                    resultUtil = ResultUtil.error(map.get("msg"), "");
//                }
            }
            if(payType == 3) {//余额支付
                if (userInfo.getBalance() != null && userInfo.getBalance() < query.getMoney()) {
                    return ResultUtil.error("余额不足,无法完成支付");
                }
         }
         if (payType == 3) {//余额支付
            if (userInfo.getBalance() != null && userInfo.getBalance() < query.getMoney()) {
               return ResultUtil.error("余额不足,无法完成支付");
            }
//                resultUtil= appOrderController.moneyPay(id,userInfo.getId(),query.getMoney());
//                if(resultUtil.getCode()==500){
//                    return ResultUtil.error("电子余额不足,无法完成支付");
//                }
                userInfo.setBalance(new BigDecimal(userInfo.getBalance()).subtract(new BigDecimal(query.getMoney())).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue());
                //添加交易明细
                transactionDetailsService.saveData(uid, "跨城出行取消订单", query.getMoney(), 2, 1, 1, 3, id);
                userInfoService.updateById(userInfo);
                //解除小号绑定
                if (orderCrossCity.getBindId() != null) {
                    chinaMobileUtil.midAxbUnBindSend(orderCrossCity.getBindId(), orderCrossCity.getTelX(), (System.currentTimeMillis() + 600000));
                }
                orderCrossCity.setState(10);
                orderCrossCity.setTelX("");
                orderCrossCity.setBindId("");
                this.updateById(orderCrossCity);
                orderCancel.setState(2);
                orderCancel.setPayType(3);
                orderCancelService.updateById(orderCancel);
                //添加已收入明细
                incomeService.saveData(1, orderCrossCity.getCompanyId(), 3, orderCrossCity.getId(), 3, query.getMoney());
                this.deleteTask(id);//删除定时任务
            userInfo.setBalance(new BigDecimal(userInfo.getBalance()).subtract(new BigDecimal(query.getMoney())).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue());
            //添加交易明细
            transactionDetailsService.saveData(uid, "跨城出行取消订单", query.getMoney(), 2, 1, 1, 3, id);
            userInfoService.updateById(userInfo);
            //解除小号绑定
            if (orderCrossCity.getBindId() != null) {
               chinaMobileUtil.midAxbUnBindSend(orderCrossCity.getBindId(), orderCrossCity.getTelX(), (System.currentTimeMillis() + 600000));
            }
            orderCrossCity.setState(10);
            orderCrossCity.setTelX("");
            orderCrossCity.setBindId("");
            this.updateById(orderCrossCity);
            orderCancel.setState(2);
            orderCancel.setPayType(3);
            orderCancelService.updateById(orderCancel);
            //添加已收入明细
            incomeService.saveData(1, orderCrossCity.getCompanyId(), 3, orderCrossCity.getId(), 3, query.getMoney());
            this.deleteTask(id);//删除定时任务
//                new Thread(new Runnable() {
//                    @Override
@@ -1561,1097 +1569,1117 @@
//                        pushUtil.pushOrderState(2, orderCrossCity.getDriverId(), orderCrossCity.getId(), 3, orderCrossCity.getState(), 0);
//                    }
//                }).start();
                //添加消息
                systemNoticeService.addSystemNotice(1, "您已使用余额成功支付取消订单费用,谢谢使用!", orderCrossCity.getUserId(), 1);
            }else if(payType == 4){
                Double payMoney = orderCrossCity.getOrderMoney();
                Integer integer = paymentRecordService.saveData(1, orderCrossCity.getUserId(), 1, id, 3, 4, query.getMoney(), "", 1);
                resultUtil = appOrderController.placeAnOrder(new BigDecimal(query.getMoney()), 4,id,4,integer);
            }
        }
        return resultUtil;
    }
    /**
     * 计算价格
     * @param distance
     * @param peopleNumber
     * @param travelMode
     * @param lineId
     * @param serverCarModelId
     * @param totalSeat
     * @param seatNumber
     * @return
     */
    public ResultUtil<Map<String, Object>> getPrice(Double distance, Integer peopleNumber, Integer travelMode, Integer lineId, Integer serverCarModelId, Integer totalSeat, String seatNumber){
        if(0 >= peopleNumber && peopleNumber > 6){
            return ResultUtil.error("请输入正确的乘车人数");
        }
        Map<String, Object> map = new HashMap<>();
        double distance1 = distance.doubleValue() / 1000;//公里
        map.put("distance", distance);
        /**
         * 1.固定价格的包车是整车价格
         * 2.五座车和七座车的优惠系数是中间特殊位置的优惠折扣
         * 3.包车的情况不享受中间特殊位置的优惠折扣
         * 4.浮动计费拼车如果选中中间特殊位置既享受优惠系数又享受中间特殊位置的优惠折扣
         */
        Map<String, Object> query = linePriceMapper.query(lineId, serverCarModelId);
        if(null == query){
            map.put("distance", 0);
            map.put("price", 0);
            return ResultUtil.success(map);
        }
        String content = query.get("content").toString();
        JSONObject jsonObject = JSON.parseObject(content);
        if(Integer.valueOf(query.get("type").toString()) == 1){//固定金额
            double num1 = Double.valueOf(jsonObject.getString("num1")).doubleValue();
            double num2 = Double.valueOf(jsonObject.getString("num2")).doubleValue();
            double num3 = Double.valueOf(jsonObject.getString("num3")).doubleValue();
            double num4 = Double.valueOf(jsonObject.getString("num4")).doubleValue();
            if(travelMode == 1){//拼车
                String[] split = seatNumber.split(",");
                boolean b = false;
                for(String s : split){
                    if((totalSeat == 4 && s.equals("3")) || (totalSeat == 6 && s.equals("5"))){
                        b = true;
                        break;
                    }
                }
                double price1 = 0D;
                if(b){
                    price1 = num1 * (totalSeat == 4 ? num3 : num4);
                    peopleNumber -= 1;
                }
                double price = (num1 * peopleNumber) + price1;
                map.put("price", new BigDecimal(price).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue());
            }else{
                map.put("price", num2);//包车价
            }
        }else{//浮动计费
            //计算公式:实际历程 * 基础单价 * (参考费用 / (参考里程 * 基础单价)) + (实际历程 - 参考里程) * 基础单价 * 优惠系数
            double num1 = Double.valueOf(jsonObject.getString("num1")).doubleValue();//参考价格
            double num2 = Double.valueOf(jsonObject.getString("num2")).doubleValue();//参考里程
            double num3 = Double.valueOf(jsonObject.getString("num3")).doubleValue();//保底价
            double num4 = Double.valueOf(jsonObject.getString("num4")).doubleValue();//超出参考里程优惠系数
            double num5 = Double.valueOf(jsonObject.getString("num5")).doubleValue();//低于参考里程优惠系数
            double num6 = Double.valueOf(jsonObject.getString("num6")).doubleValue();//包车系数
            double num7 = Double.valueOf(jsonObject.getString("num7")).doubleValue();//五座系数
            double num8 = Double.valueOf(jsonObject.getString("num8")).doubleValue();//七座系数
            /**
             * 1、实际里程>=参考里程
             *    参考价+((实际里程-参考里程)*(参考价/参考里程)*超出参考里程优惠系数)
             *
             * 2、实际里程<参考里程
             *    参考价-(参考里程-实际路程)*(参考价/参考里程)*低于参考里程优惠系数
             */
            double unitPrice = 0d;
            if(distance1 > num2){//1
                unitPrice = num1 + ((distance1 - num2) * (num1 / num2) * num4);
            }
            if(distance1 < num2){//2
                unitPrice = num1 - ((num2 - distance1) * (num1 / num2) * num5);
            }
            if(distance1 == num2){
                unitPrice = num1;
            }
            if(travelMode == 1){//拼车
                String[] split = seatNumber.split(",");
                boolean b = false;
                for(String s : split){
                    if((totalSeat == 4 && s.equals("3")) || (totalSeat == 6 && s.equals("5"))){
                        b = true;
                        break;
                    }
                }
                double price1 = 0D;
                if(b){
                    price1 = unitPrice * (totalSeat == 4 ? num7 : num8);
                    peopleNumber -= 1;
                }
                double price = (unitPrice * peopleNumber) + price1;
                map.put("price", new BigDecimal(num3 > price ? num3 : price).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue());
            }else{
                double price = unitPrice * totalSeat * num6;
                map.put("price", new BigDecimal(num3 > price ? num3 : price).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue());
            }
        }
        return ResultUtil.success(map);
    }
    /**
     * 删除定时任务
     * @param orderId
     */
    @Override
    public void deleteTask(Integer orderId){
        //发送验证码短信
        HttpHeaders headers = new HttpHeaders();
        // 以表单的方式提交
        headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED);
        //将请求头部和参数合成一个请求
        MultiValueMap<String, Object> params = new LinkedMultiValueMap<>();
        params.add("orderId", orderId + "");
        params.add("orderType", "3");
        HttpEntity<MultiValueMap<String, Object>> requestEntity = new HttpEntity<>(params, headers);
        String s = internalRestTemplate.postForObject("http://driver-server/base/netty/deleteTask", requestEntity, String.class);
        JSONObject jsonObject = JSON.parseObject(s, JSONObject.class);
        if(jsonObject.getIntValue("code") != 200){
            System.err.println("调用driver-server出错了");
        }
    }
    /**
     * 获取红包
     * @param orderId
     * @return
     * @throws Exception
     */
    @Override
    public synchronized ResultUtil<BaseWarpper> queryRedMoney(Integer orderId) throws Exception {
        OrderCrossCity orderCrossCity = this.selectById(orderId);
        Integer companyId = orderCrossCity.getCompanyId();
        Map<String, Object> query = userActivityRedenvelopeService.query(companyId, orderCrossCity.getTravelTime());
        Double money = 0D;
        BaseWarpper baseWarpper = new BaseWarpper();
        if(null != query){
            Integer type = Integer.valueOf(String.valueOf(query.get("type")));
            if(type == 1){//固定金额
                money = Double.valueOf(String.valueOf(query.get("money")));
            }else{//随机金额
                Double startMoney = Double.valueOf(String.valueOf(query.get("startMoney")));
                Double endMoney = Double.valueOf(String.valueOf(query.get("endMoney")));
                int i = new BigDecimal(endMoney).subtract(new BigDecimal(startMoney)).intValue();
                Random random = new Random();
                int num = random.nextInt(i);
                money = new BigDecimal(startMoney).add(new BigDecimal(num)).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue();
            }
            //判断当前红包是否大于剩余可领取总金额
            if(money.compareTo(Double.valueOf(query.get("lavePrice").toString())) > 0){
                baseWarpper.setAmount(0D);
                return ResultUtil.success(baseWarpper);
            }
        }
        baseWarpper.setAmount(money);
        if(money > 0){
            //添加临时红包数据
            UserRedPacketRecord userRedPacketRecord = new UserRedPacketRecord();
            userRedPacketRecord.setMoney(money);
            Calendar calendar = Calendar.getInstance();
            calendar.setTime(new Date());
            calendar.set(Calendar.DAY_OF_MONTH, calendar.get(Calendar.DAY_OF_MONTH) + Integer.valueOf(String.valueOf(query.get("effective"))));
            userRedPacketRecord.setExpirationTime(calendar.getTime());
            userRedPacketRecord.setInsertTime(new Date());
            userRedPacketRecord.setCompanyId(Integer.valueOf(String.valueOf(query.get("companyId"))));
            userRedPacketRecord.setState(0);
            userRedPacketRecord.setOrderId(orderCrossCity.getId());
            userRedPacketRecord.setOrderType(3);
            userRedPacketRecord.setUserId(orderCrossCity.getUserId());
            userRedPacketRecordService.insert(userRedPacketRecord);
        }
        appOrderController.moneyPay(orderCrossCity.getId(),orderCrossCity.getUserId(),money);
        return ResultUtil.success(baseWarpper);
    }
    /**
     * 分享成功后添加红包
     * @param orderId
     * @return
     * @throws Exception
     */
    @Override
    public synchronized ResultUtil shareRedEnvelope(Integer orderId) throws Exception {
        OrderCrossCity orderCrossCity = this.selectById(orderId);
        UserRedPacketRecord query = userRedPacketRecordService.query_(orderCrossCity.getUserId(), orderCrossCity.getCompanyId(), 0, 3, null);
        if(null != query){
            Double money = query.getMoney();
            Map<String, Object> map = userActivityRedenvelopeService.query(orderCrossCity.getCompanyId(), orderCrossCity.getTravelTime());
            Double laveMoney = Double.valueOf(String.valueOf(map.get("laveMoney")));
            if(money.compareTo(laveMoney) > 0){
                return ResultUtil.error("手速太慢了,红包已派发完啦!");
            }
            //判断当前红包是否大于剩余可领取总金额
            if(money.compareTo(Double.valueOf(map.get("lavePrice").toString())) > 0){
                return ResultUtil.error("手速太慢了,红包已派发完啦!");
            }
            double v = new BigDecimal(laveMoney).subtract(new BigDecimal(money)).doubleValue();
            UserActivityRedenvelope id = userActivityRedenvelopeService.selectById(String.valueOf(map.get("id")));
            id.setLaveMoney(v);
            id.setLavePrice(new BigDecimal(id.getLavePrice() - money).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue());
            userActivityRedenvelopeService.updateById(id);
            query.setState(1);
            query.setRedPacketActivityId(id.getId());
            userRedPacketRecordService.updateById(query);
        }
        return ResultUtil.success();
    }
    /**
     * 取消订单支付后的处理
     * @param id            订单=id
     * @param order_id      工行支付单号
     * @param type          1=微信,2=支付宝
     * @throws Exception
     */
    @Override
    public void payCancelOrderCrossCity(Integer id, String order_id, Integer type) throws Exception {
        OrderCrossCity orderCrossCity = this.selectById(id);
        PaymentRecord query = paymentRecordService.query(1, orderCrossCity.getUserId(), 1, Integer.valueOf(id), 3, type, 1);
        if(null != query){
            //添加交易明细
            transactionDetailsService.saveData(orderCrossCity.getUserId(), "跨城出行取消订单", query.getAmount(), 2, 1, 1, 3, query.getOrderId());
            orderCrossCity.setState(10);
            //解除小号绑定
            if(orderCrossCity.getBindId() != null){
                chinaMobileUtil.midAxbUnBindSend(orderCrossCity.getBindId(), orderCrossCity.getTelX(), (System.currentTimeMillis() + 600000));
            }
            orderCrossCity.setBindId("");
            orderCrossCity.setTelX("");
            this.updateById(orderCrossCity);
            query.setState(2);
            query.setCode(order_id);
            paymentRecordService.updateById(query);
            OrderCancel query1 = orderCancelService.query(query.getOrderId(), query.getOrderType(), query.getAmount(), query.getPayType(), 1);
            if (null != query1){
                query1.setState(2);
                orderCancelService.updateById(query1);
            }
            //添加已收入明细
            incomeService.saveData(1, orderCrossCity.getCompanyId(), 3, orderCrossCity.getId(), 3, query.getAmount());
            this.deleteTask(orderCrossCity.getId());//删除定时任务
            // TODO: 2020/5/24 这里需要给司机和用户推送订单状态
            //添加消息
            systemNoticeService.addSystemNotice(1, "您已使用余额成功支付取消订单费用,谢谢使用!", orderCrossCity.getUserId(), 1);
         } else if (payType == 4) {
            Double payMoney = orderCrossCity.getOrderMoney();
            Integer integer = paymentRecordService.saveData(1, orderCrossCity.getUserId(), 1, id, 3, 4, query.getMoney(), "", 1);
            resultUtil = appOrderController.placeAnOrder(new BigDecimal(query.getMoney()), 4, id, 4, integer);
         }
      }
      return resultUtil;
   }
   /**
    * 计算价格
    *
    * @param distance
    * @param peopleNumber
    * @param travelMode
    * @param lineId
    * @param serverCarModelId
    * @param totalSeat
    * @param seatNumber
    * @return
    */
   public ResultUtil<Map<String, Object>> getPrice(Double distance, Integer peopleNumber, Integer travelMode, Integer lineId, Integer serverCarModelId, Integer totalSeat, String seatNumber) {
      if (0 >= peopleNumber && peopleNumber > 6) {
         return ResultUtil.error("请输入正确的乘车人数");
      }
      Map<String, Object> map = new HashMap<>();
      double distance1 = distance.doubleValue() / 1000;//公里
      map.put("distance", distance);
      /**
       * 1.固定价格的包车是整车价格
       * 2.五座车和七座车的优惠系数是中间特殊位置的优惠折扣
       * 3.包车的情况不享受中间特殊位置的优惠折扣
       * 4.浮动计费拼车如果选中中间特殊位置既享受优惠系数又享受中间特殊位置的优惠折扣
       */
      Map<String, Object> query = linePriceMapper.query(lineId, serverCarModelId);
      if (null == query) {
         map.put("distance", 0);
         map.put("price", 0);
         return ResultUtil.success(map);
      }
      String content = query.get("content").toString();
      JSONObject jsonObject = JSON.parseObject(content);
      if (Integer.valueOf(query.get("type").toString()) == 1) {//固定金额
         double num1 = Double.valueOf(jsonObject.getString("num1")).doubleValue();
         double num2 = Double.valueOf(jsonObject.getString("num2")).doubleValue();
         double num3 = Double.valueOf(jsonObject.getString("num3")).doubleValue();
         double num4 = Double.valueOf(jsonObject.getString("num4")).doubleValue();
         if (travelMode == 1) {//拼车
            String[] split = seatNumber.split(",");
            boolean b = false;
            for (String s : split) {
               if ((totalSeat == 4 && s.equals("3")) || (totalSeat == 6 && s.equals("5"))) {
                  b = true;
                  break;
               }
            }
            double price1 = 0D;
            if (b) {
               price1 = num1 * (totalSeat == 4 ? num3 : num4);
               peopleNumber -= 1;
            }
            double price = (num1 * peopleNumber) + price1;
            map.put("price", new BigDecimal(price).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue());
         } else {
            map.put("price", num2);//包车价
         }
      } else {//浮动计费
         //计算公式:实际历程 * 基础单价 * (参考费用 / (参考里程 * 基础单价)) + (实际历程 - 参考里程) * 基础单价 * 优惠系数
         double num1 = Double.valueOf(jsonObject.getString("num1")).doubleValue();//参考价格
         double num2 = Double.valueOf(jsonObject.getString("num2")).doubleValue();//参考里程
         double num3 = Double.valueOf(jsonObject.getString("num3")).doubleValue();//保底价
         double num4 = Double.valueOf(jsonObject.getString("num4")).doubleValue();//超出参考里程优惠系数
         double num5 = Double.valueOf(jsonObject.getString("num5")).doubleValue();//低于参考里程优惠系数
         double num6 = Double.valueOf(jsonObject.getString("num6")).doubleValue();//包车系数
         double num7 = Double.valueOf(jsonObject.getString("num7")).doubleValue();//五座系数
         double num8 = Double.valueOf(jsonObject.getString("num8")).doubleValue();//七座系数
         /**
          * 1、实际里程>=参考里程
          *    参考价+((实际里程-参考里程)*(参考价/参考里程)*超出参考里程优惠系数)
          *
          * 2、实际里程<参考里程
          *    参考价-(参考里程-实际路程)*(参考价/参考里程)*低于参考里程优惠系数
          */
         double unitPrice = 0d;
         if (distance1 > num2) {//1
            unitPrice = num1 + ((distance1 - num2) * (num1 / num2) * num4);
         }
         if (distance1 < num2) {//2
            unitPrice = num1 - ((num2 - distance1) * (num1 / num2) * num5);
         }
         if (distance1 == num2) {
            unitPrice = num1;
         }
         if (travelMode == 1) {//拼车
            String[] split = seatNumber.split(",");
            boolean b = false;
            for (String s : split) {
               if ((totalSeat == 4 && s.equals("3")) || (totalSeat == 6 && s.equals("5"))) {
                  b = true;
                  break;
               }
            }
            double price1 = 0D;
            if (b) {
               price1 = unitPrice * (totalSeat == 4 ? num7 : num8);
               peopleNumber -= 1;
            }
            double price = (unitPrice * peopleNumber) + price1;
            map.put("price", new BigDecimal(num3 > price ? num3 : price).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue());
         } else {
            double price = unitPrice * totalSeat * num6;
            map.put("price", new BigDecimal(num3 > price ? num3 : price).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue());
         }
      }
      return ResultUtil.success(map);
   }
   /**
    * 删除定时任务
    *
    * @param orderId
    */
   @Override
   public void deleteTask(Integer orderId) {
      //发送验证码短信
      HttpHeaders headers = new HttpHeaders();
      // 以表单的方式提交
      headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED);
      //将请求头部和参数合成一个请求
      MultiValueMap<String, Object> params = new LinkedMultiValueMap<>();
      params.add("orderId", orderId + "");
      params.add("orderType", "3");
      HttpEntity<MultiValueMap<String, Object>> requestEntity = new HttpEntity<>(params, headers);
      String s = internalRestTemplate.postForObject("http://driver-server/base/netty/deleteTask", requestEntity, String.class);
      JSONObject jsonObject = JSON.parseObject(s, JSONObject.class);
      if (jsonObject.getIntValue("code") != 200) {
         System.err.println("调用driver-server出错了");
      }
   }
   /**
    * 获取红包
    *
    * @param orderId
    * @return
    * @throws Exception
    */
   @Override
   public synchronized ResultUtil<BaseWarpper> queryRedMoney(Integer orderId) throws Exception {
      OrderCrossCity orderCrossCity = this.selectById(orderId);
      Integer companyId = orderCrossCity.getCompanyId();
      Map<String, Object> query = userActivityRedenvelopeService.query(companyId, orderCrossCity.getTravelTime());
      Double money = 0D;
      BaseWarpper baseWarpper = new BaseWarpper();
      if (null != query) {
         Integer type = Integer.valueOf(String.valueOf(query.get("type")));
         if (type == 1) {//固定金额
            money = Double.valueOf(String.valueOf(query.get("money")));
         } else {//随机金额
            Double startMoney = Double.valueOf(String.valueOf(query.get("startMoney")));
            Double endMoney = Double.valueOf(String.valueOf(query.get("endMoney")));
            int i = new BigDecimal(endMoney).subtract(new BigDecimal(startMoney)).intValue();
            Random random = new Random();
            int num = random.nextInt(i);
            money = new BigDecimal(startMoney).add(new BigDecimal(num)).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue();
         }
         //判断当前红包是否大于剩余可领取总金额
         if (money.compareTo(Double.valueOf(query.get("lavePrice").toString())) > 0) {
            baseWarpper.setAmount(0D);
            return ResultUtil.success(baseWarpper);
         }
      }
      baseWarpper.setAmount(money);
      if (money > 0) {
         //添加临时红包数据
         UserRedPacketRecord userRedPacketRecord = new UserRedPacketRecord();
         userRedPacketRecord.setMoney(money);
         Calendar calendar = Calendar.getInstance();
         calendar.setTime(new Date());
         calendar.set(Calendar.DAY_OF_MONTH, calendar.get(Calendar.DAY_OF_MONTH) + Integer.valueOf(String.valueOf(query.get("effective"))));
         userRedPacketRecord.setExpirationTime(calendar.getTime());
         userRedPacketRecord.setInsertTime(new Date());
         userRedPacketRecord.setCompanyId(Integer.valueOf(String.valueOf(query.get("companyId"))));
         userRedPacketRecord.setState(0);
         userRedPacketRecord.setOrderId(orderCrossCity.getId());
         userRedPacketRecord.setOrderType(3);
         userRedPacketRecord.setUserId(orderCrossCity.getUserId());
         userRedPacketRecordService.insert(userRedPacketRecord);
      }
      appOrderController.moneyPay(orderCrossCity.getId(), orderCrossCity.getUserId(), money);
      return ResultUtil.success(baseWarpper);
   }
   /**
    * 分享成功后添加红包
    *
    * @param orderId
    * @return
    * @throws Exception
    */
   @Override
   public synchronized ResultUtil shareRedEnvelope(Integer orderId) throws Exception {
      OrderCrossCity orderCrossCity = this.selectById(orderId);
      UserRedPacketRecord query = userRedPacketRecordService.query_(orderCrossCity.getUserId(), orderCrossCity.getCompanyId(), 0, 3, null);
      if (null != query) {
         Double money = query.getMoney();
         Map<String, Object> map = userActivityRedenvelopeService.query(orderCrossCity.getCompanyId(), orderCrossCity.getTravelTime());
         Double laveMoney = Double.valueOf(String.valueOf(map.get("laveMoney")));
         if (money.compareTo(laveMoney) > 0) {
            return ResultUtil.error("手速太慢了,红包已派发完啦!");
         }
         //判断当前红包是否大于剩余可领取总金额
         if (money.compareTo(Double.valueOf(map.get("lavePrice").toString())) > 0) {
            return ResultUtil.error("手速太慢了,红包已派发完啦!");
         }
         double v = new BigDecimal(laveMoney).subtract(new BigDecimal(money)).doubleValue();
         UserActivityRedenvelope id = userActivityRedenvelopeService.selectById(String.valueOf(map.get("id")));
         id.setLaveMoney(v);
         id.setLavePrice(new BigDecimal(id.getLavePrice() - money).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue());
         userActivityRedenvelopeService.updateById(id);
         query.setState(1);
         query.setRedPacketActivityId(id.getId());
         userRedPacketRecordService.updateById(query);
      }
      return ResultUtil.success();
   }
   /**
    * 取消订单支付后的处理
    *
    * @param id       订单=id
    * @param order_id 工行支付单号
    * @param type     1=微信,2=支付宝
    * @throws Exception
    */
   @Override
   public void payCancelOrderCrossCity(Integer id, String order_id, Integer type) throws Exception {
      OrderCrossCity orderCrossCity = this.selectById(id);
      PaymentRecord query = paymentRecordService.query(1, orderCrossCity.getUserId(), 1, Integer.valueOf(id), 3, type, 1);
      if (null != query) {
         //添加交易明细
         transactionDetailsService.saveData(orderCrossCity.getUserId(), "跨城出行取消订单", query.getAmount(), 2, 1, 1, 3, query.getOrderId());
         orderCrossCity.setState(10);
         //解除小号绑定
         if (orderCrossCity.getBindId() != null) {
            chinaMobileUtil.midAxbUnBindSend(orderCrossCity.getBindId(), orderCrossCity.getTelX(), (System.currentTimeMillis() + 600000));
         }
         orderCrossCity.setBindId("");
         orderCrossCity.setTelX("");
         this.updateById(orderCrossCity);
         query.setState(2);
         query.setCode(order_id);
         paymentRecordService.updateById(query);
         OrderCancel query1 = orderCancelService.query(query.getOrderId(), query.getOrderType(), query.getAmount(), query.getPayType(), 1);
         if (null != query1) {
            query1.setState(2);
            orderCancelService.updateById(query1);
         }
         //添加已收入明细
         incomeService.saveData(1, orderCrossCity.getCompanyId(), 3, orderCrossCity.getId(), 3, query.getAmount());
         this.deleteTask(orderCrossCity.getId());//删除定时任务
         // TODO: 2020/5/24 这里需要给司机和用户推送订单状态
//            new Thread(new Runnable() {
//                @Override
//                public void run() {
//                    pushUtil.pushOrderState(2, orderCrossCity.getDriverId(), orderCrossCity.getId(), 3, orderCrossCity.getState(), 0);
//                }
//            }).start();
            //添加消息
            systemNoticeService.addSystemNotice(1, "您已使用" + (type == 1 ? "微信" : (type==2?"支付宝":"云闪付")) + "成功支付取消订单费用,谢谢使用!", orderCrossCity.getUserId(), 1);
        }else{
            System.err.println("预支付数据异常(orderId = "  + id + ")");
        }
    }
    /**
     * 获取个人中心订单列表
     * @param uid
     * @param pageNum
     * @param size
     * @return
     * @throws Exception
     */
    @Override
    public List<Map<String, Object>> queryMyOrderList(Integer uid, Integer pageNum, Integer size) throws Exception {
        pageNum = (pageNum - 1) * size;
        List<Map<String, Object>> maps = orderCrossCityMapper.queryMyOrderList(uid, pageNum, size);
        for(Map<String, Object> map : maps){
            if(Integer.valueOf(String.valueOf(map.get("state"))) == 11){
                map.put("state", map.get("oldState"));
            }
        }
        return maps;
    }
    @Override
    public List<Map<String, Object>> queryMyTravelRecord(Integer uid) {
        return orderCrossCityMapper.queryMyTravelRecord(uid);
    }
    @Override
    public List<Map<String, Object>> queryInvoiceOrder(Integer type, Date startTime, Date endTime, Double startMoney, Double endMoney, Integer uid) throws Exception {
        startTime = dateUtil.getStartOrEndDate(startTime, "start");
        endTime = dateUtil.getStartOrEndDate(endTime, "end");
        return orderCrossCityMapper.queryInvoiceOrder(type, startTime, endTime, startMoney, endMoney, uid);
    }
    /**
     * 获取红包使用记录
     * @param uid
     * @return
     * @throws Exception
     */
    @Override
    public List<Map<String, Object>> queryRedEnvelope(Integer uid) throws Exception {
        return orderCrossCityMapper.queryRedEnvelope(uid);
    }
    /**
     * 添加跨城取消(直接取消不需要支付费用,退款)
     * @param id
     * @param reason
     * @param remark
     * @param uid
     * @return
     * @throws Exception
     */
    @Override
    public ResultUtil addCancle(Integer id, String reason, String remark, Integer uid) throws Exception {
        if(ToolUtil.isNotEmpty(remark)){
            if(ToolUtil.isNotEmpty(remark)){
                List<SensitiveWords> sensitiveWords = sensitiveWordsMapper.selectList(null);
                for(SensitiveWords s : sensitiveWords){
                    remark = remark.replaceAll(s.getContent(), "***");
                }
            }
        }
        OrderCrossCity orderCrossCity = this.selectById(id);
        Integer integer = null;
        if(null == orderCrossCity){
            return ResultUtil.error("取消订单失败,订单信息有误");
        }
        if(orderCrossCity.getState() >= 5 && orderCrossCity.getState() != 7 && orderCrossCity.getState() != 11){
            return ResultUtil.error("取消订单失败,不合法的操作");
        }
        //还原座位
        CancleOrder query1 = cancleOrderService.query(1, 3, orderCrossCity.getCompanyId());
        if (null != query1) {
            if((orderCrossCity.getSnatchOrderTime().getTime() + query1.getMinuteNum() * 60 * 1000) < new Date().getTime()  && query1.getMoney().compareTo(0D) > 0){//需要付费的情况
                integer = orderCancelService.saveData(id, 3, reason, remark, null, query1.getMoney(), 1, 1, uid);
                orderCrossCity.setState(12);
            }else{
                integer = orderCancelService.saveData(id, 3, reason, remark, null, null, 2, 1, uid);
                orderCrossCity.setState(10);
            }
            this.updateById(orderCrossCity);
            if(orderCrossCity.getState() != 7){//已经支付的情况推送给司机提醒
                new Thread(new Runnable() {
                    @Override
                    public void run() {
                        pushUtil.pushOrderState(2, orderCrossCity.getDriverId(), orderCrossCity.getId(), 3, orderCrossCity.getState(), 0);
                        System.err.println("推送取消操作---------------------");
                    }
                }).start();
            }
            //修改司机座位
            LineShiftDriver lineShiftDriver = lineShiftDriverMapper.selectById(orderCrossCity.getLineShiftDriverId());
            lineShiftDriver.setLaveSeat(lineShiftDriver.getLaveSeat() + orderCrossCity.getPeopleNumber());
            lineShiftDriver.setLaveSeatNumber(lineShiftDriver.getLaveSeatNumber() + (orderCrossCity.getTravelMode() == 1 ? "," : "") + orderCrossCity.getSeatNumber());
            lineShiftDriverMapper.updateById(lineShiftDriver);
            //修改司机为空闲
            List<OrderCrossCity> orderCrossCities = orderCrossCityMapper.queryByDriverId(orderCrossCity.getDriverId(), 2, 3, 4, 5, 11);
            if(orderCrossCities.size() == 0){
                Driver driver = driverService.selectById(orderCrossCity.getDriverId());
                driver.setState(2);
                driverService.updateById(driver);
            }
        }else{
            return ResultUtil.error("请完善后台取消规则设置");
        }
        //已支付的情况下进行退款操作
        if(null != orderCrossCity.getPayType() && null != orderCrossCity.getPayMoney()){
            // 退款
            if(orderCrossCity.getPayType()==5){
                Driver driver = driverService.selectById(orderCrossCity.getDriverId());
                if(orderCrossCity.getPayMoney()!=null && orderCrossCity.getPayMoney()>0) {
                    appOrderController.createAllocationReqDriver(1, driver.getId(), 1, orderCrossCity.getPayMoney());
                }
            }
            if(orderCrossCity.getPayType() == 3){//余额支付
                UserInfo userInfo = userInfoService.selectById(orderCrossCity.getUserId());
                userInfo.setBalance(userInfo.getBalance() + orderCrossCity.getPayMoney());
                userInfoService.updateById(userInfo);
                //添加交易明细
                transactionDetailsService.saveData(orderCrossCity.getUserId(), "跨城出行取消退款", orderCrossCity.getPayMoney(), 1, 1, 1, 3, id);
                appOrderController.createAllocationReqUser(1, orderCrossCity.getUserId(), 1,orderCrossCity.getPayMoney());
            }else{
                PaymentRecord query = null;
                if(orderCrossCity.getOrderSource() == 4){
                    query = paymentRecordService.query(1, orderCrossCity.getDriverId(), 2, id, 3, orderCrossCity.getPayType(), 2);
                    if(ToolUtil.isEmpty(query)){
                        query = paymentRecordService.query(1, orderCrossCity.getUserId(), 1, id, 3, orderCrossCity.getPayType(), 2);
                    }
                }else{
                    query = paymentRecordService.query(1, orderCrossCity.getUserId(), 1, id, 3, orderCrossCity.getPayType(), 2);
                }
                if(null == query){
                    return ResultUtil.error("订单还未进行支付");
                }
                if(query.getPayType() == 1){//微信
                    Map<String, String> map = payMoneyUtil.wxRefund(query.getCode(), id + "_3", query.getAmount().toString(), query.getAmount().toString(), "/base/cancleOrderWXPay");
                    if(!"SUCCESS".equals(map.get("return_code"))){
                        return ResultUtil.error(map.get("return_msg"));
                    }
                }else if(query.getPayType()==4){ // 云闪付
                    // TODO 退款
                    UserInfo userInfo = userInfoService.selectById(orderCrossCity.getUserId());
                    userInfo.setBalance(userInfo.getBalance() + orderCrossCity.getPayMoney());
                    userInfoService.updateById(userInfo);
                    //添加交易明细
                    transactionDetailsService.saveData(orderCrossCity.getUserId(), "跨城出行取消退款", orderCrossCity.getPayMoney(), 1, 1, 1, 3, id);
                    if(orderCrossCity.getOrderSource() == 4){
                        // 退给司机
                        appOrderController.createAllocationReqDriver(1,orderCrossCity.getDriverId(),1,orderCrossCity.getPayMoney());
                    }else {
                        appOrderController.createAllocationReqUser(1, orderCrossCity.getUserId(), 1,orderCrossCity.getPayMoney());
                    }
                }else{//支付宝
                    Map<String, String> map = payMoneyUtil.aliRefund(query.getCode(), query.getAmount().toString());
                    if(!"10000".equals(map.get("code"))){
                        return ResultUtil.error(map.get("msg"));
                    }
                    //添加交易明细
                    transactionDetailsService.saveData(orderCrossCity.getUserId(), "跨城出行取消退款", query.getAmount(), 1, 1, 1, 3, id);
                }
            }
            //添加负的收入明细
            List<Income> incomes = incomeService.selectList(new EntityWrapper<Income>().eq("type", 2).eq("incomeId", id).eq("orderType", 3));
            for(Income income : incomes){
                if(income.getUserType() == 2){//处理司机的收入
                    Driver driver = driverService.selectById(income.getObjectId());
                    driver.setBalance(driver.getBalance() - income.getMoney());
                    driver.setBusinessMoney(driver.getBusinessMoney() - income.getMoney());
                    driver.setLaveBusinessMoney(driver.getLaveBusinessMoney() - income.getMoney());
                    driverService.updateById(driver);
                }
                Income income1 = new Income();
                BeanUtils.copyProperties(income, income1);
                income1.setMoney(income.getMoney() * -1);
                income1.setId(null);
                income1.setInsertTime(new Date());
                incomeService.insert(income1);
            }
        }
        //添加消息
        systemNoticeService.addSystemNotice(1, "您已成功取消出行订单,谢谢使用!", orderCrossCity.getUserId(), 1);
        Map<String, Object> map = new HashMap<>();
        map.put("id", integer);
        return ResultUtil.success(map);
    }
    /**
     * 获取服务中的订单数据
     * @param uid
     * @return
     * @throws Exception
     */
    @Override
    public OrderServerWarpper queryOrderServer(Integer orderId, Integer uid) throws Exception {
        OrderCrossCity orderCrossCity = this.selectById(orderId);
        //计算预计距离和剩余时间
        String value = (String) redisTemplate.opsForValue().get("DRIVER" + String.valueOf(orderCrossCity.getDriverId()));
        if(null == value || "".equals(value)){
            System.err.println("司机没有上传位置信息");
            //调用获取轨迹中的数据
            List<Map<String, Object>> list = orderPositionService.queryTrack(orderId, 3);
            if(list.size() > 0){
                Map<String, Object> map = list.get(list.size() - 1);
                value = map.get("lon") + "," + map.get("lat");
            }
        }
        OrderServerWarpper orderServerWarpper = new OrderServerWarpper();
        orderServerWarpper.setOrderId(orderCrossCity.getId());
        orderServerWarpper.setOrderType(3);
        orderServerWarpper.setState(orderCrossCity.getState());
        orderServerWarpper.setLon(null != value ? value.split(",")[0] : "0.0");
        orderServerWarpper.setLat(null != value ? value.split(",")[1] : "0.0");
        orderServerWarpper.setReassignNotice(orderCrossCity.getReassignNotice());
        if(orderCrossCity.getState() == 2 || orderCrossCity.getState() == 3){//前往预约地
            // TODO: 2023/11/4 无法修改
            Map<String, String> distance = gdMapElectricFenceUtil.getDistance(value, orderCrossCity.getStartLon() + "," + orderCrossCity.getStartLat(), 1);
            String d = "0";
            String t = "0";
            if(null == distance){
                System.err.println("查询距离出错了");
            }else{
                d = new BigDecimal(distance.get("distance")).divide(new BigDecimal(1000), new MathContext(2, RoundingMode.HALF_EVEN)).toString();
                t = new BigDecimal(distance.get("duration")).divide(new BigDecimal(60), new MathContext(2, RoundingMode.HALF_EVEN)).intValue() + "";
            }
            orderServerWarpper.setReservationMileage(d);
            orderServerWarpper.setReservationTime(t);
            orderServerWarpper.setServedMileage("0");
            orderServerWarpper.setServedTime("0");
            orderServerWarpper.setLaveMileage("0");
            orderServerWarpper.setLaveTime("0");
        }
        if(orderCrossCity.getState() == 5 || orderCrossCity.getState() == 6){//服务中
            // TODO: 2023/11/4 无法修改
            Map<String, String> distance = gdMapElectricFenceUtil.getDistance(value, orderCrossCity.getEndLon() + "," + orderCrossCity.getEndLat(), 1);
            String d = "0";
            String t = "0";
            if(null == distance){
                System.err.println("查询距离出错了");
            }else{
                d = new BigDecimal(distance.get("distance")).divide(new BigDecimal(1000), new MathContext(2, RoundingMode.HALF_EVEN)).toString();
                t = new BigDecimal(distance.get("duration")).divide(new BigDecimal(60), new MathContext(2, RoundingMode.HALF_EVEN)).intValue() + "";
            }
            orderServerWarpper.setReservationMileage("0");
            orderServerWarpper.setReservationTime("0");
            orderServerWarpper.setServedMileage(String.valueOf(orderCrossCity.getMileage() / 1000));
            orderServerWarpper.setServedTime(Long.valueOf((new Date().getTime() - orderCrossCity.getStartServiceTime().getTime()) / 60000).intValue() + "");
            orderServerWarpper.setLaveMileage(d);
            orderServerWarpper.setLaveTime(t);
        }
        return orderServerWarpper;
    }
    /**
     * 摆渡下单
     * @param serverCarModelIds
     * @param travelTime
     * @param placementLon
     * @param placementLat
     * @param startLon
     * @param startLat
     * @param startAddress
     * @param endLon
     * @param endLat
     * @param endAddress
     * @return
     */
    @Override
    public ResultUtil<BaseWarpper> saveOrderFerry(String serverCarModelIds, Date travelTime, String placementLon, String placementLat, String startLon,
                                              String startLat, String startAddress, String endLon, String endLat, String endAddress, Integer crossCityOrderId,
                                                  Integer place, Integer orderSource, Integer uid) throws Exception {
        if(ToolUtil.isEmpty(serverCarModelIds)){
            return ResultUtil.error("请选择服务车型");
        }
        Map<String, String> geocode = gdMapGeocodingUtil.geocode(startLon, startLat);
        boolean b = openCityService.openCity(geocode.get("districtCode"));
        if(!b){
            return ResultUtil.error("起点暂未开通");
        }
        String[] split = serverCarModelIds.split(",");
        List<Map<String, Integer>> list = new ArrayList<>();
        Integer orderId = null;
        for(String serverModelId : split){
            Map<String, Integer> map = new HashMap<>();
            if(serverModelId.equals("0")){//出租车
                ResultUtil<BaseWarpper> resultUtil = this.orderText(travelTime, placementLon, placementLat, startLon, startLat, startAddress, endLon, endLat, endAddress, crossCityOrderId, place, orderSource, uid);
                if(resultUtil.getCode() != 200){
                    return resultUtil;
                }
                map.put("orderType", 2);
                map.put("orderId", resultUtil.getData().getId());
            }else{
                ResultUtil<BaseWarpper> resultUtil = this.orderPrivateCar(Integer.valueOf(serverModelId), travelTime, placementLon, placementLat, startLon, startLat, startAddress, endLon, endLat, endAddress, crossCityOrderId, place, orderSource, uid);
                if(resultUtil.getCode() != 200){
                    return resultUtil;
                }
                map.put("orderType", 1);
                map.put("orderId", resultUtil.getData().getId());
                orderId = resultUtil.getData().getId();
            }
            list.add(map);
        }
        //推单操作
        this.pushOrder(list);
        BaseWarpper baseWarpper = new BaseWarpper();
        baseWarpper.setId(null == orderId ? list.get(0).get("orderId") : orderId);
        return ResultUtil.success(baseWarpper);
    }
    /**
     * 出租车摆渡单
     * @param travelTime
     * @param placementLon
     * @param placementLat
     * @param startLon
     * @param startLat
     * @param startAddress
     * @param endLon
     * @param endLat
     * @param endAddress
     * @param orderSource
     * @param uid
     * @return
     * @throws Exception
     */
    private synchronized ResultUtil<BaseWarpper> orderText(Date travelTime, String placementLon, String placementLat, String startLon, String startLat,
                                 String startAddress, String endLon, String endLat, String endAddress, Integer crossCityOrderId, Integer place, Integer orderSource, Integer uid) throws Exception{
        //定义用户所属公司
        OrderTaxi orderTaxi = new OrderTaxi();
        UserInfo userInfo1 = userInfoService.selectById(uid);
        Company query = companyCityService.query(startLon, startLat);
        if(null == query){
            return ResultUtil.error("出发点暂未开通");
        }
        if(null != userInfo1.getCompanyId() && 0 != userInfo1.getCompanyId()){
            userInfo1.setCompanyId(query.getId());
            userInfoService.updateById(userInfo1);
        }
        if(travelTime.getTime() > (System.currentTimeMillis() + 600000)){
            orderTaxi.setOrderType(2);
        }
        orderTaxi.setType(2);
        orderTaxi.setCrossCityOrderId(crossCityOrderId);
        orderTaxi.setPlace(place);
        orderTaxi.setSubstitute(0);
        orderTaxi.setOrderType(1);
        orderTaxi.setOrderSource(orderSource);
        orderTaxi.setTravelTime(travelTime);
        orderTaxi.setPlacementLon(Double.valueOf(placementLon));
        orderTaxi.setPlacementLat(Double.valueOf(placementLat));
        orderTaxi.setStartLon(Double.valueOf(startLon));
        orderTaxi.setStartLat(Double.valueOf(startLat));
        orderTaxi.setStartAddress(startAddress);
        orderTaxi.setEndLon(Double.valueOf(endLon));
        orderTaxi.setEndLat(Double.valueOf(endLat));
        orderTaxi.setEndAddress(endAddress);
        orderTaxi.setOrderNum(orderTaxiService.getOrderNum());
        Map<String, String> geocode = gdMapGeocodingUtil.geocode(placementLon, placementLat);
        orderTaxi.setPlacementAddress(geocode.get("address"));
        String startAddress1 = orderTaxi.getStartAddress();
        startAddress1 = startAddress1.replaceAll("& #40;", "(");
        startAddress1 = startAddress1.replaceAll("& #41;", ")");
        orderTaxi.setStartAddress(startAddress1);//特殊字符转义
        String endAddress1 = orderTaxi.getEndAddress();
        endAddress1 = endAddress1.replaceAll("& #40;", "(");
        endAddress1 = endAddress1.replaceAll("& #41;", ")");
        orderTaxi.setEndAddress(endAddress1);
        orderTaxi.setUserId(uid);
        orderTaxi.setMileage(0D);
        orderTaxi.setOrderMoney(0D);
        orderTaxi.setTravelMoney(0D);
        orderTaxi.setParkMoney(0D);
        orderTaxi.setRoadTollMoney(0D);
        orderTaxi.setRedPacketMoney(0D);
        orderTaxi.setCouponMoney(0D);
        orderTaxi.setInsertTime(new Date());
        orderTaxi.setIsReassign(1);
        if(orderTaxi.getSubstitute() == 0){//不是代下单
            UserInfo userInfo = userInfoService.selectById(uid);
            if(ToolUtil.isEmpty(userInfo.getPhone())){
                return ResultUtil.error("请先绑定手机号码");
            }
            orderTaxi.setPassengers(userInfo.getName());
            orderTaxi.setPassengersPhone(userInfo.getPhone());
        }
        orderTaxi.setState(1);//待接单
        orderTaxiService.insert(orderTaxi);
        //添加消息
        systemNoticeService.addSystemNotice(1, "您的出租车订单已下单成功,我们正在为您指派司机,请稍后!", orderTaxi.getUserId(), 1);
        BaseWarpper baseWarpper = new BaseWarpper();
        baseWarpper.setId(orderTaxi.getId());
        return ResultUtil.success(baseWarpper);
    }
    /**
     * 专车摆渡单
     * @param serverCarModelId
     * @param travelTime
     * @param placementLon
     * @param placementLat
     * @param startLon
     * @param startLat
     * @param startAddress
     * @param endLon
     * @param endLat
     * @param endAddress
     * @param orderSource
     * @param uid
     * @return
     * @throws Exception
     */
    private synchronized ResultUtil<BaseWarpper> orderPrivateCar(Integer serverCarModelId, Date travelTime, String placementLon, String placementLat, String startLon, String startLat,
                                       String startAddress, String endLon, String endLat, String endAddress, Integer crossCityOrderId, Integer place, Integer orderSource, Integer uid) throws Exception{
        //如果出行时间大于当前10分钟则默认为预约单
        Integer reservation = 1;
        if(travelTime.getTime() > (System.currentTimeMillis() + 600000)){
            reservation = 2;
        }
        startAddress = startAddress.replaceAll("& #40;", "(");
        startAddress = startAddress.replaceAll("& #41;", ")");
        endAddress = endAddress.replaceAll("& #40;", "(");
        endAddress = endAddress.replaceAll("& #41;", ")");
        if((orderSource == 1 || orderSource == 3) && null == serverCarModelId){
            return ResultUtil.error("请选择服务车型");
        }
        OrderPrivateCar orderPrivateCar = new OrderPrivateCar();
        orderPrivateCar.setType(2);
        orderPrivateCar.setCrossCityOrderId(crossCityOrderId);
        orderPrivateCar.setPlace(place);
        orderPrivateCar.setUserId(uid);
        orderPrivateCar.setServerCarModelId(serverCarModelId);
        orderPrivateCar.setOrderNum(orderPrivateCarService.getOrderNum());
        orderPrivateCar.setPlacementLon(Double.valueOf(placementLon));
        orderPrivateCar.setPlacementLat(Double.valueOf(placementLat));
        Map<String, String> geocode = gdMapGeocodingUtil.geocode(placementLon, placementLat);
        orderPrivateCar.setPlacementAddress(geocode.get("address"));
        orderPrivateCar.setStartLon(Double.valueOf(startLon));
        orderPrivateCar.setStartLat(Double.valueOf(startLat));
        orderPrivateCar.setStartAddress(startAddress);
        orderPrivateCar.setEndLon(Double.valueOf(endLon));
        orderPrivateCar.setEndLat(Double.valueOf(endLat));
        orderPrivateCar.setEndAddress(endAddress);
        orderPrivateCar.setSubstitute(0);
        if(orderPrivateCar.getSubstitute() == 0 || ToolUtil.isEmpty(orderPrivateCar.getPassengers())){
            UserInfo userInfo = userInfoService.selectById(uid);
            if(ToolUtil.isEmpty(userInfo.getPhone())){
                return ResultUtil.error("请先绑定手机号码");
            }
            orderPrivateCar.setPassengers(userInfo.getName());
            orderPrivateCar.setPassengersPhone(userInfo.getPhone());
        }
        orderPrivateCar.setState(1);
        orderPrivateCar.setInsertTime(new Date());
        orderPrivateCar.setTravelTime(travelTime);
        orderPrivateCar.setOrderType(reservation);
        orderPrivateCar.setOrderSource(orderSource);
        orderPrivateCar.setIsReassign(1);
        orderPrivateCar.setIsDelete(1);
        orderPrivateCarMapper.insert(orderPrivateCar);
        //添加消息
        systemNoticeService.addSystemNotice(1, "您的快车订单已下单成功,我们正在为您指派司机,请稍后!", orderPrivateCar.getUserId(), 1);
        BaseWarpper baseWarpper = new BaseWarpper();
        baseWarpper.setId(orderPrivateCar.getId());
        return ResultUtil.success(baseWarpper);
    }
    /**
     * 摆渡车推单操作
     * @param list
     * @throws Exception
     */
    public void pushOrder(List<Map<String, Integer>> list) throws Exception{
        for(Map<String, Integer> map : list){
            Integer orderType = map.get("orderType");
            Integer orderId = map.get("orderId");
            Thread thread = new Thread(new Runnable() {
                @Override
                public void run() {
                    List<Map<String, Integer>> datas = list;
                    String vehicle = (String) redisTemplate.opsForValue().get("VEHICLE");
                    List<Integer> integers = new ArrayList<>();
                    if(ToolUtil.isNotEmpty(vehicle)){
                        integers = JSON.parseArray(vehicle).toJavaList(Integer.class);
                    }
                    try {
                        if(orderType == 1){//专车
                            OrderPrivateCar orderPrivateCar = orderPrivateCarMapper.selectById(orderId);
                            OrderPrivateCarServiceImpl.orderIds.add(orderPrivateCar.getId());//添加记录,防止调用接口重复提醒无人接单
                            Company query = companyCityService.query(String.valueOf(orderPrivateCar.getStartLon()), String.valueOf(orderPrivateCar.getStartLat()));//获取起点所属分公司
                            List<PushOrder> querys = pushOrderService.querys(null, 1, query.getId());//获取需要推送的次数
                            for(int i = 1; i <= querys.size(); i++){
                                //订单被抢后的处理
                                Integer state = orderPrivateCarMapper.selectById(orderId).getState();
                                if(state != 1){
                                    //关闭其他推送线程
                                    Set<String> keySet = threadMap.keySet();
                                    for(String key : keySet){
                                        if(!key.equals(orderId + "_1")){
                                            Thread thread1 = threadMap.get(key);//中断线程
                                            if(null != thread1){
                                                thread1.interrupt();
                                            }
                                            threadMap.remove(key);
                                        }
                                    }
                                    //删除其他无效数据
                                    for(Map<String, Integer> map : datas){
                                        Integer orderType = map.get("orderType");
                                        Integer orderId = map.get("orderId");
                                        if(orderType == 1 && orderId != orderPrivateCar.getId()){
                                            orderPrivateCarMapper.deleteById(orderId);
                                        }
                                        if(orderType == 2){
                                            orderTaxiMapper.deleteById(orderId);
                                        }
                                    }
                                    break;
                                }
                                //开始进行推送的处理
                                PushOrder pushOrder = pushOrderService.querys(i, 1, query.getId()).get(0);
                                //获取空闲司机
                                List<Driver> list = driverService.queryIdleDriver(1, orderPrivateCar.getServerCarModelId(), orderPrivateCar.getStartLon(), orderPrivateCar.getStartLat(), pushOrder.getPushDistance(), null);//所有附近空闲司机
                                if(list.size() > 0){
                                    double driverProportion = pushOrder.getDriverProportion() / 100;//推送占比计算成小数
                                    int lastIndex = Double.valueOf(list.size() * driverProportion).intValue();//计算占比转成整数(下标截取)
                                    list = list.subList(0, lastIndex);//获取空闲司机中占比数据
                                    for(Driver driver : list){//开始进行推送
                                        boolean bo = false;
                                        for(Integer integer : integers){
                                            if(integer.compareTo(driver.getId()) == 0){
                                                bo = true;
                                                break;
                                            }
                                        }
                                        if(bo){
                                            continue;
                                        }
                                        pushUtil.pushOrderState(2, driver.getId(), orderPrivateCar.getId(), 1, orderPrivateCar.getState(), pushOrder.getPushTime());
                                    }
                                }
                                //所有推送完后的处理
                                Boolean b = pushEndMap.get(orderPrivateCar.getCrossCityOrderId());
                                if(i == querys.size() && state == 1 && (null != b && !b.booleanValue())){
                                    pushUtil.pushEndPush(1, orderPrivateCar.getUserId(), orderPrivateCar.getId(), 1);
                                    OrderPrivateCarServiceImpl.orderIds.remove(orderPrivateCar.getId());
                                    pushEndMap.put(orderPrivateCar.getCrossCityOrderId(), Boolean.TRUE);//推送后添加标识
                                    break;
                                }
                                Thread.sleep(pushOrder.getPushTime() * 1000);//设置等待时间
                            }
                        }
                        if(orderType == 2){//出租车
                            OrderTaxi orderTaxi = orderTaxiMapper.selectById(orderId);
                            OrderTaxiServiceImpl.orderIds.add(orderTaxi.getId());//添加记录,防止调用接口重复提醒无人接单
                            Company query = companyCityService.query(String.valueOf(orderTaxi.getStartLon()), String.valueOf(orderTaxi.getStartLat()));//获取起点所属分公司
                            List<PushOrder> querys = pushOrderService.querys(null, 2, query.getId());//获取需要推送的次数
                            for(int i = 1; i <= querys.size(); i++){
                                //处理订单被抢
                                Integer state = orderTaxiMapper.selectById(orderId).getState();
                                if(state != 1){
                                    //关闭其他推送任务
                                    Set<String> keySet = threadMap.keySet();
                                    for(String key : keySet){
                                        if(!key.equals(orderId + "_2")){
                                            Thread thread1 = threadMap.get(key);//中断线程
                                            if(null != thread1){
                                                thread1.interrupt();
                                            }
                                            threadMap.remove(key);
                                        }
                                    }
                                    //删除其他无效数据
                                    for(Map<String, Integer> map : datas){
                                        Integer orderType = map.get("orderType");
                                        Integer orderId = map.get("orderId");
                                        if(orderType == 1){
                                            orderPrivateCarMapper.deleteById(orderId);
                                        }
                                        if(orderType == 2 && orderId != orderTaxi.getId()){
                                            orderTaxiMapper.deleteById(orderId);
                                        }
                                    }
                                    break;
                                }
                                //开始进行推送
                                PushOrder pushOrder = pushOrderService.querys(i, 2, query.getId()).get(0);
                                //获取空闲司机
                                List<Driver> list = driverService.queryIdleDriver(2, orderTaxi.getStartLon(), orderTaxi.getStartLat(), pushOrder.getPushDistance(), null);//所有附近空闲司机
                                if(list.size() > 0){
                                    double driverProportion = pushOrder.getDriverProportion() / 100;//推送占比计算成小数
                                    int lastIndex = Double.valueOf(list.size() * driverProportion).intValue();//计算占比转成整数(下标截取)
                                    list = list.subList(0, lastIndex);//获取空闲司机中占比数据
                                    for(Driver driver : list){//开始进行推送
                                        boolean bo = false;
                                        for(Integer integer : integers){
                                            if(integer.compareTo(driver.getId()) == 0){
                                                bo = true;
                                                break;
                                            }
                                        }
                                        if(bo){
                                            continue;
                                        }
                                        pushUtil.pushOrderState(2, driver.getId(), orderTaxi.getId(), 2, orderTaxi.getState(), pushOrder.getPushTime());
                                    }
                                }
                                //所有推送完后的处理
                                Boolean b = pushEndMap.get(orderTaxi.getCrossCityOrderId());
                                if(i == querys.size() && state == 1 && (null != b && !b.booleanValue())){
                                    pushUtil.pushEndPush(1, orderTaxi.getUserId(), orderTaxi.getId(), 2);
                                    OrderTaxiServiceImpl.orderIds.remove(orderTaxi.getId());
                                    pushEndMap.put(orderTaxi.getCrossCityOrderId(), Boolean.TRUE);//推送后添加标识
                                }
                                Thread.sleep(pushOrder.getPushTime() * 1000);//设置等待时间
                            }
                        }
                    }catch (Exception e){
                        e.printStackTrace();
                    }
                }
            });
            thread.start();
            threadMap.put(orderId + "_" + orderType, thread);
        }
    }
    @Override
    public List<OrderCrossCity> queryListOrder(Integer driverId, Integer lineShiftId, List<Integer> state, String day) throws Exception {
        return orderCrossCityMapper.queryListOrder(driverId, lineShiftId, state, day);
    }
    /**
     * 获取订单编号
     * @return
     * @throws Exception
     */
    public synchronized String getOrderNum(Integer driverId, Integer lineShiftDriverId) throws Exception{
        System.out.println(driverId+"|"+lineShiftDriverId);
        List<OrderCrossCity> orderCrossCities = orderCrossCityMapper.queryOrders(driverId, lineShiftDriverId, Arrays.asList(2, 3, 4, 7));
        if(orderCrossCities.size() > 0){
            return orderCrossCities.get(0).getOrderNum();
        }
        int size = this.selectCount(null);
        while (true){
            String orderNum = "CROSS" + String.valueOf(1000000 + size + 1).substring(1);
            List<OrderCrossCity> orderNum1 = this.selectList(new EntityWrapper<OrderCrossCity>().eq("orderNum", orderNum));
            if(orderNum1.size() == 0){
                return orderNum;
            }
            size++;
        }
    }
    @Override
    @Transactional(propagation = Propagation.REQUIRES_NEW)
    public ResultUtil payThankYouFee(Integer uid, Integer orderId, Double money, Integer payType, Integer type) throws Exception {
        UserInfo userInfo = userInfoService.selectById(uid);
        OrderCrossCity orderCrossCity = this.selectById(orderId);
        ResultUtil resultUtil = ResultUtil.success();
        if(payType == 1){//微信支付
            String app = type == 1 ? "APP" : "JSAPI";
            resultUtil = payMoneyUtil.weixinpay("感谢费", "", orderId + "_3_" + UUIDUtil.getRandomCode(5), money.toString(), "/base/wxPayThankYouFee", app, userInfo.getAppletsOpenId());
            paymentRecordService.saveData(3, uid, 1, orderId, 3, 1, money, "", 1);//添加预支付数据
        }
        if(payType == 2){//支付宝支付
            resultUtil = payMoneyUtil.alipay("感谢费", "感谢费", "", orderId + "_3_" + UUIDUtil.getRandomCode(5), money.toString(), "/base/aliPayThankYouFee");
            paymentRecordService.saveData(1, uid, 1, orderId, 3, 2, money, "", 1);//添加预支付数据
        }
        if(payType == 3) {//余额支付
            if (userInfo.getBalance() == null || userInfo.getBalance() < money) {
                return ResultUtil.error("余额不足,无法完成支付");
            }
         //添加消息
         systemNoticeService.addSystemNotice(1, "您已使用" + (type == 1 ? "微信" : (type == 2 ? "支付宝" : "云闪付")) + "成功支付取消订单费用,谢谢使用!", orderCrossCity.getUserId(), 1);
      } else {
         System.err.println("预支付数据异常(orderId = " + id + ")");
      }
   }
   /**
    * 获取个人中心订单列表
    *
    * @param uid
    * @param pageNum
    * @param size
    * @return
    * @throws Exception
    */
   @Override
   public List<Map<String, Object>> queryMyOrderList(Integer uid, Integer pageNum, Integer size) throws Exception {
      pageNum = (pageNum - 1) * size;
      List<Map<String, Object>> maps = orderCrossCityMapper.queryMyOrderList(uid, pageNum, size);
      for (Map<String, Object> map : maps) {
         if (Integer.valueOf(String.valueOf(map.get("state"))) == 11) {
            map.put("state", map.get("oldState"));
         }
      }
      return maps;
   }
   @Override
   public List<Map<String, Object>> queryMyTravelRecord(Integer uid) {
      return orderCrossCityMapper.queryMyTravelRecord(uid);
   }
   @Override
   public List<Map<String, Object>> queryInvoiceOrder(Integer type, Date startTime, Date endTime, Double startMoney, Double endMoney, Integer uid) throws Exception {
      startTime = dateUtil.getStartOrEndDate(startTime, "start");
      endTime = dateUtil.getStartOrEndDate(endTime, "end");
      return orderCrossCityMapper.queryInvoiceOrder(type, startTime, endTime, startMoney, endMoney, uid);
   }
   /**
    * 获取红包使用记录
    *
    * @param uid
    * @return
    * @throws Exception
    */
   @Override
   public List<Map<String, Object>> queryRedEnvelope(Integer uid) throws Exception {
      return orderCrossCityMapper.queryRedEnvelope(uid);
   }
   /**
    * 添加跨城取消(直接取消不需要支付费用,退款)
    *
    * @param id
    * @param reason
    * @param remark
    * @param uid
    * @return
    * @throws Exception
    */
   @Override
   public ResultUtil addCancle(Integer id, String reason, String remark, Integer uid) throws Exception {
      if (ToolUtil.isNotEmpty(remark)) {
         if (ToolUtil.isNotEmpty(remark)) {
            List<SensitiveWords> sensitiveWords = sensitiveWordsMapper.selectList(null);
            for (SensitiveWords s : sensitiveWords) {
               remark = remark.replaceAll(s.getContent(), "***");
            }
         }
      }
      OrderCrossCity orderCrossCity = this.selectById(id);
      Integer integer = null;
      if (null == orderCrossCity) {
         return ResultUtil.error("取消订单失败,订单信息有误");
      }
      if (orderCrossCity.getState() >= 5 && orderCrossCity.getState() != 7 && orderCrossCity.getState() != 11) {
         return ResultUtil.error("取消订单失败,不合法的操作");
      }
      //还原座位
      OpenCity openCity = openCityService.openCity1(orderCrossCity.getStartLon().toString(), orderCrossCity.getStartLat().toString());
      CancleOrder query1 = cancleOrderService.query(1, 3, openCity.getId());
      if (null != query1) {
         if ((orderCrossCity.getSnatchOrderTime().getTime() + query1.getMinuteNum() * 60 * 1000) < new Date().getTime() && query1.getMoney().compareTo(0D) > 0) {//需要付费的情况
            integer = orderCancelService.saveData(id, 3, reason, remark, null, query1.getMoney(), 1, 1, uid);
            orderCrossCity.setState(12);
         } else {
            integer = orderCancelService.saveData(id, 3, reason, remark, null, null, 2, 1, uid);
            orderCrossCity.setState(10);
         }
         this.updateById(orderCrossCity);
         if (orderCrossCity.getState() != 7) {//已经支付的情况推送给司机提醒
            new Thread(new Runnable() {
               @Override
               public void run() {
                  pushUtil.pushOrderState(2, orderCrossCity.getDriverId(), orderCrossCity.getId(), 3, orderCrossCity.getState(), 0);
                  System.err.println("推送取消操作---------------------");
               }
            }).start();
         }
         //修改司机座位
         LineShiftDriver lineShiftDriver = lineShiftDriverMapper.selectById(orderCrossCity.getLineShiftDriverId());
         lineShiftDriver.setLaveSeat(lineShiftDriver.getLaveSeat() + orderCrossCity.getPeopleNumber());
         lineShiftDriver.setLaveSeatNumber(lineShiftDriver.getLaveSeatNumber() + (orderCrossCity.getTravelMode() == 1 ? "," : "") + orderCrossCity.getSeatNumber());
         lineShiftDriverMapper.updateById(lineShiftDriver);
         //修改司机为空闲
         List<OrderCrossCity> orderCrossCities = orderCrossCityMapper.queryByDriverId(orderCrossCity.getDriverId(), 2, 3, 4, 5, 11);
         if (orderCrossCities.size() == 0) {
            Driver driver = driverService.selectById(orderCrossCity.getDriverId());
            driver.setState(2);
            driverService.updateById(driver);
         }
      } else {
         return ResultUtil.error("请完善后台取消规则设置");
      }
      //已支付的情况下进行退款操作
      if (null != orderCrossCity.getPayType() && null != orderCrossCity.getPayMoney()) {
         // 退款
         if (orderCrossCity.getPayType() == 5) {
            Driver driver = driverService.selectById(orderCrossCity.getDriverId());
            if (orderCrossCity.getPayMoney() != null && orderCrossCity.getPayMoney() > 0) {
               appOrderController.createAllocationReqDriver(1, driver.getId(), 1, orderCrossCity.getPayMoney());
            }
         }
         if (orderCrossCity.getPayType() == 3) {//余额支付
            UserInfo userInfo = userInfoService.selectById(orderCrossCity.getUserId());
            userInfo.setBalance(userInfo.getBalance() + orderCrossCity.getPayMoney());
            userInfoService.updateById(userInfo);
            //添加交易明细
            transactionDetailsService.saveData(orderCrossCity.getUserId(), "跨城出行取消退款", orderCrossCity.getPayMoney(), 1, 1, 1, 3, id);
            appOrderController.createAllocationReqUser(1, orderCrossCity.getUserId(), 1, orderCrossCity.getPayMoney());
         } else {
            PaymentRecord query = null;
            if (orderCrossCity.getOrderSource() == 4) {
               query = paymentRecordService.query(1, orderCrossCity.getDriverId(), 2, id, 3, orderCrossCity.getPayType(), 2);
               if (ToolUtil.isEmpty(query)) {
                  query = paymentRecordService.query(1, orderCrossCity.getUserId(), 1, id, 3, orderCrossCity.getPayType(), 2);
               }
            } else {
               query = paymentRecordService.query(1, orderCrossCity.getUserId(), 1, id, 3, orderCrossCity.getPayType(), 2);
            }
            if (null == query) {
               return ResultUtil.error("订单还未进行支付");
            }
            if (query.getPayType() == 1) {//微信
               Map<String, String> map = payMoneyUtil.wxRefund(query.getCode(), id + "_3", query.getAmount().toString(), query.getAmount().toString(), "/base/cancleOrderWXPay");
               if (!"SUCCESS".equals(map.get("return_code"))) {
                  return ResultUtil.error(map.get("return_msg"));
               }
            } else if (query.getPayType() == 4) { // 云闪付
               // TODO 退款
               UserInfo userInfo = userInfoService.selectById(orderCrossCity.getUserId());
               userInfo.setBalance(userInfo.getBalance() + orderCrossCity.getPayMoney());
               userInfoService.updateById(userInfo);
               //添加交易明细
               transactionDetailsService.saveData(orderCrossCity.getUserId(), "跨城出行取消退款", orderCrossCity.getPayMoney(), 1, 1, 1, 3, id);
               if (orderCrossCity.getOrderSource() == 4) {
                  // 退给司机
                  appOrderController.createAllocationReqDriver(1, orderCrossCity.getDriverId(), 1, orderCrossCity.getPayMoney());
               } else {
                  appOrderController.createAllocationReqUser(1, orderCrossCity.getUserId(), 1, orderCrossCity.getPayMoney());
               }
            } else {//支付宝
               Map<String, String> map = payMoneyUtil.aliRefund(query.getCode(), query.getAmount().toString());
               if (!"10000".equals(map.get("code"))) {
                  return ResultUtil.error(map.get("msg"));
               }
               //添加交易明细
               transactionDetailsService.saveData(orderCrossCity.getUserId(), "跨城出行取消退款", query.getAmount(), 1, 1, 1, 3, id);
            }
         }
         //添加负的收入明细
         List<Income> incomes = incomeService.selectList(new EntityWrapper<Income>().eq("type", 2).eq("incomeId", id).eq("orderType", 3));
         for (Income income : incomes) {
            if (income.getUserType() == 2) {//处理司机的收入
               Driver driver = driverService.selectById(income.getObjectId());
               driver.setBalance(driver.getBalance() - income.getMoney());
               driver.setBusinessMoney(driver.getBusinessMoney() - income.getMoney());
               driver.setLaveBusinessMoney(driver.getLaveBusinessMoney() - income.getMoney());
               driverService.updateById(driver);
            }
            Income income1 = new Income();
            BeanUtils.copyProperties(income, income1);
            income1.setMoney(income.getMoney() * -1);
            income1.setId(null);
            income1.setInsertTime(new Date());
            incomeService.insert(income1);
         }
      }
      //添加消息
      systemNoticeService.addSystemNotice(1, "您已成功取消出行订单,谢谢使用!", orderCrossCity.getUserId(), 1);
      Map<String, Object> map = new HashMap<>();
      map.put("id", integer);
      return ResultUtil.success(map);
   }
   /**
    * 获取服务中的订单数据
    *
    * @param uid
    * @return
    * @throws Exception
    */
   @Override
   public OrderServerWarpper queryOrderServer(Integer orderId, Integer uid) throws Exception {
      OrderCrossCity orderCrossCity = this.selectById(orderId);
      //计算预计距离和剩余时间
      String value = (String) redisTemplate.opsForValue().get("DRIVER" + String.valueOf(orderCrossCity.getDriverId()));
      if (null == value || "".equals(value)) {
         System.err.println("司机没有上传位置信息");
         //调用获取轨迹中的数据
         List<Map<String, Object>> list = orderPositionService.queryTrack(orderId, 3);
         if (list.size() > 0) {
            Map<String, Object> map = list.get(list.size() - 1);
            value = map.get("lon") + "," + map.get("lat");
         }
      }
      OrderServerWarpper orderServerWarpper = new OrderServerWarpper();
      orderServerWarpper.setOrderId(orderCrossCity.getId());
      orderServerWarpper.setOrderType(3);
      orderServerWarpper.setState(orderCrossCity.getState());
      orderServerWarpper.setLon(null != value ? value.split(",")[0] : "0.0");
      orderServerWarpper.setLat(null != value ? value.split(",")[1] : "0.0");
      orderServerWarpper.setReassignNotice(orderCrossCity.getReassignNotice());
      if (orderCrossCity.getState() == 2 || orderCrossCity.getState() == 3) {//前往预约地
         // TODO: 2023/11/4 无法修改
         Map<String, String> distance = gdMapElectricFenceUtil.getDistance(value, orderCrossCity.getStartLon() + "," + orderCrossCity.getStartLat(), 1);
         String d = "0";
         String t = "0";
         if (null == distance) {
            System.err.println("查询距离出错了");
         } else {
            d = new BigDecimal(distance.get("distance")).divide(new BigDecimal(1000), new MathContext(2, RoundingMode.HALF_EVEN)).toString();
            t = new BigDecimal(distance.get("duration")).divide(new BigDecimal(60), new MathContext(2, RoundingMode.HALF_EVEN)).intValue() + "";
         }
         orderServerWarpper.setReservationMileage(d);
         orderServerWarpper.setReservationTime(t);
         orderServerWarpper.setServedMileage("0");
         orderServerWarpper.setServedTime("0");
         orderServerWarpper.setLaveMileage("0");
         orderServerWarpper.setLaveTime("0");
      }
      if (orderCrossCity.getState() == 5 || orderCrossCity.getState() == 6) {//服务中
         // TODO: 2023/11/4 无法修改
         Map<String, String> distance = gdMapElectricFenceUtil.getDistance(value, orderCrossCity.getEndLon() + "," + orderCrossCity.getEndLat(), 1);
         String d = "0";
         String t = "0";
         if (null == distance) {
            System.err.println("查询距离出错了");
         } else {
            d = new BigDecimal(distance.get("distance")).divide(new BigDecimal(1000), new MathContext(2, RoundingMode.HALF_EVEN)).toString();
            t = new BigDecimal(distance.get("duration")).divide(new BigDecimal(60), new MathContext(2, RoundingMode.HALF_EVEN)).intValue() + "";
         }
         orderServerWarpper.setReservationMileage("0");
         orderServerWarpper.setReservationTime("0");
         orderServerWarpper.setServedMileage(String.valueOf(orderCrossCity.getMileage() / 1000));
         orderServerWarpper.setServedTime(Long.valueOf((new Date().getTime() - orderCrossCity.getStartServiceTime().getTime()) / 60000).intValue() + "");
         orderServerWarpper.setLaveMileage(d);
         orderServerWarpper.setLaveTime(t);
      }
      return orderServerWarpper;
   }
   /**
    * 摆渡下单
    *
    * @param serverCarModelIds
    * @param travelTime
    * @param placementLon
    * @param placementLat
    * @param startLon
    * @param startLat
    * @param startAddress
    * @param endLon
    * @param endLat
    * @param endAddress
    * @return
    */
   @Override
   public ResultUtil<BaseWarpper> saveOrderFerry(String serverCarModelIds, Date travelTime, String placementLon, String placementLat, String startLon,
                                                 String startLat, String startAddress, String endLon, String endLat, String endAddress, Integer crossCityOrderId,
                                                 Integer place, Integer orderSource, Integer uid) throws Exception {
      if (ToolUtil.isEmpty(serverCarModelIds)) {
         return ResultUtil.error("请选择服务车型");
      }
      Map<String, String> geocode = gdMapGeocodingUtil.geocode(startLon, startLat);
      boolean b = openCityService.openCity(geocode.get("districtCode"));
      if (!b) {
         return ResultUtil.error("起点暂未开通");
      }
      String[] split = serverCarModelIds.split(",");
      List<Map<String, Integer>> list = new ArrayList<>();
      Integer orderId = null;
      for (String serverModelId : split) {
         Map<String, Integer> map = new HashMap<>();
         if (serverModelId.equals("0")) {//出租车
            ResultUtil<BaseWarpper> resultUtil = this.orderText(travelTime, placementLon, placementLat, startLon, startLat, startAddress, endLon, endLat, endAddress, crossCityOrderId, place, orderSource, uid);
            if (resultUtil.getCode() != 200) {
               return resultUtil;
            }
            map.put("orderType", 2);
            map.put("orderId", resultUtil.getData().getId());
         } else {
            ResultUtil<BaseWarpper> resultUtil = this.orderPrivateCar(Integer.valueOf(serverModelId), travelTime, placementLon, placementLat, startLon, startLat, startAddress, endLon, endLat, endAddress, crossCityOrderId, place, orderSource, uid);
            if (resultUtil.getCode() != 200) {
               return resultUtil;
            }
            map.put("orderType", 1);
            map.put("orderId", resultUtil.getData().getId());
            orderId = resultUtil.getData().getId();
         }
         list.add(map);
      }
      //推单操作
      this.pushOrder(list);
      BaseWarpper baseWarpper = new BaseWarpper();
      baseWarpper.setId(null == orderId ? list.get(0).get("orderId") : orderId);
      return ResultUtil.success(baseWarpper);
   }
   /**
    * 出租车摆渡单
    *
    * @param travelTime
    * @param placementLon
    * @param placementLat
    * @param startLon
    * @param startLat
    * @param startAddress
    * @param endLon
    * @param endLat
    * @param endAddress
    * @param orderSource
    * @param uid
    * @return
    * @throws Exception
    */
   private synchronized ResultUtil<BaseWarpper> orderText(Date travelTime, String placementLon, String placementLat, String startLon, String startLat,
                                                          String startAddress, String endLon, String endLat, String endAddress, Integer crossCityOrderId, Integer place, Integer orderSource, Integer uid) throws Exception {
      //定义用户所属公司
      OrderTaxi orderTaxi = new OrderTaxi();
      UserInfo userInfo1 = userInfoService.selectById(uid);
      Company query = companyCityService.query(startLon, startLat);
      if (null == query) {
         return ResultUtil.error("出发点暂未开通");
      }
      if (null != userInfo1.getCompanyId() && 0 != userInfo1.getCompanyId()) {
         userInfo1.setCompanyId(query.getId());
         userInfoService.updateById(userInfo1);
      }
      if (travelTime.getTime() > (System.currentTimeMillis() + 600000)) {
         orderTaxi.setOrderType(2);
      }
      orderTaxi.setType(2);
      orderTaxi.setCrossCityOrderId(crossCityOrderId);
      orderTaxi.setPlace(place);
      orderTaxi.setSubstitute(0);
      orderTaxi.setOrderType(1);
      orderTaxi.setOrderSource(orderSource);
      orderTaxi.setTravelTime(travelTime);
      orderTaxi.setPlacementLon(Double.valueOf(placementLon));
      orderTaxi.setPlacementLat(Double.valueOf(placementLat));
      orderTaxi.setStartLon(Double.valueOf(startLon));
      orderTaxi.setStartLat(Double.valueOf(startLat));
      orderTaxi.setStartAddress(startAddress);
      orderTaxi.setEndLon(Double.valueOf(endLon));
      orderTaxi.setEndLat(Double.valueOf(endLat));
      orderTaxi.setEndAddress(endAddress);
      orderTaxi.setOrderNum(orderTaxiService.getOrderNum());
      Map<String, String> geocode = gdMapGeocodingUtil.geocode(placementLon, placementLat);
      orderTaxi.setPlacementAddress(geocode.get("address"));
      String startAddress1 = orderTaxi.getStartAddress();
      startAddress1 = startAddress1.replaceAll("& #40;", "(");
      startAddress1 = startAddress1.replaceAll("& #41;", ")");
      orderTaxi.setStartAddress(startAddress1);//特殊字符转义
      String endAddress1 = orderTaxi.getEndAddress();
      endAddress1 = endAddress1.replaceAll("& #40;", "(");
      endAddress1 = endAddress1.replaceAll("& #41;", ")");
      orderTaxi.setEndAddress(endAddress1);
      orderTaxi.setUserId(uid);
      orderTaxi.setMileage(0D);
      orderTaxi.setOrderMoney(0D);
      orderTaxi.setTravelMoney(0D);
      orderTaxi.setParkMoney(0D);
      orderTaxi.setRoadTollMoney(0D);
      orderTaxi.setRedPacketMoney(0D);
      orderTaxi.setCouponMoney(0D);
      orderTaxi.setInsertTime(new Date());
      orderTaxi.setIsReassign(1);
      if (orderTaxi.getSubstitute() == 0) {//不是代下单
         UserInfo userInfo = userInfoService.selectById(uid);
         if (ToolUtil.isEmpty(userInfo.getPhone())) {
            return ResultUtil.error("请先绑定手机号码");
         }
         orderTaxi.setPassengers(userInfo.getName());
         orderTaxi.setPassengersPhone(userInfo.getPhone());
      }
      orderTaxi.setState(1);//待接单
      orderTaxiService.insert(orderTaxi);
      //添加消息
      systemNoticeService.addSystemNotice(1, "您的出租车订单已下单成功,我们正在为您指派司机,请稍后!", orderTaxi.getUserId(), 1);
      BaseWarpper baseWarpper = new BaseWarpper();
      baseWarpper.setId(orderTaxi.getId());
      return ResultUtil.success(baseWarpper);
   }
   /**
    * 专车摆渡单
    *
    * @param serverCarModelId
    * @param travelTime
    * @param placementLon
    * @param placementLat
    * @param startLon
    * @param startLat
    * @param startAddress
    * @param endLon
    * @param endLat
    * @param endAddress
    * @param orderSource
    * @param uid
    * @return
    * @throws Exception
    */
   private synchronized ResultUtil<BaseWarpper> orderPrivateCar(Integer serverCarModelId, Date travelTime, String placementLon, String placementLat, String startLon, String startLat,
                                                                String startAddress, String endLon, String endLat, String endAddress, Integer crossCityOrderId, Integer place, Integer orderSource, Integer uid) throws Exception {
      //如果出行时间大于当前10分钟则默认为预约单
      Integer reservation = 1;
      if (travelTime.getTime() > (System.currentTimeMillis() + 600000)) {
         reservation = 2;
      }
      startAddress = startAddress.replaceAll("& #40;", "(");
      startAddress = startAddress.replaceAll("& #41;", ")");
      endAddress = endAddress.replaceAll("& #40;", "(");
      endAddress = endAddress.replaceAll("& #41;", ")");
      if ((orderSource == 1 || orderSource == 3) && null == serverCarModelId) {
         return ResultUtil.error("请选择服务车型");
      }
      OrderPrivateCar orderPrivateCar = new OrderPrivateCar();
      orderPrivateCar.setType(2);
      orderPrivateCar.setCrossCityOrderId(crossCityOrderId);
      orderPrivateCar.setPlace(place);
      orderPrivateCar.setUserId(uid);
      orderPrivateCar.setServerCarModelId(serverCarModelId);
      orderPrivateCar.setOrderNum(orderPrivateCarService.getOrderNum());
      orderPrivateCar.setPlacementLon(Double.valueOf(placementLon));
      orderPrivateCar.setPlacementLat(Double.valueOf(placementLat));
      Map<String, String> geocode = gdMapGeocodingUtil.geocode(placementLon, placementLat);
      orderPrivateCar.setPlacementAddress(geocode.get("address"));
      orderPrivateCar.setStartLon(Double.valueOf(startLon));
      orderPrivateCar.setStartLat(Double.valueOf(startLat));
      orderPrivateCar.setStartAddress(startAddress);
      orderPrivateCar.setEndLon(Double.valueOf(endLon));
      orderPrivateCar.setEndLat(Double.valueOf(endLat));
      orderPrivateCar.setEndAddress(endAddress);
      orderPrivateCar.setSubstitute(0);
      if (orderPrivateCar.getSubstitute() == 0 || ToolUtil.isEmpty(orderPrivateCar.getPassengers())) {
         UserInfo userInfo = userInfoService.selectById(uid);
         if (ToolUtil.isEmpty(userInfo.getPhone())) {
            return ResultUtil.error("请先绑定手机号码");
         }
         orderPrivateCar.setPassengers(userInfo.getName());
         orderPrivateCar.setPassengersPhone(userInfo.getPhone());
      }
      orderPrivateCar.setState(1);
      orderPrivateCar.setInsertTime(new Date());
      orderPrivateCar.setTravelTime(travelTime);
      orderPrivateCar.setOrderType(reservation);
      orderPrivateCar.setOrderSource(orderSource);
      orderPrivateCar.setIsReassign(1);
      orderPrivateCar.setIsDelete(1);
      orderPrivateCarMapper.insert(orderPrivateCar);
      //添加消息
      systemNoticeService.addSystemNotice(1, "您的快车订单已下单成功,我们正在为您指派司机,请稍后!", orderPrivateCar.getUserId(), 1);
      BaseWarpper baseWarpper = new BaseWarpper();
      baseWarpper.setId(orderPrivateCar.getId());
      return ResultUtil.success(baseWarpper);
   }
   /**
    * 摆渡车推单操作
    *
    * @param list
    * @throws Exception
    */
   public void pushOrder(List<Map<String, Integer>> list) throws Exception {
      for (Map<String, Integer> map : list) {
         Integer orderType = map.get("orderType");
         Integer orderId = map.get("orderId");
         Thread thread = new Thread(new Runnable() {
            @Override
            public void run() {
               List<Map<String, Integer>> datas = list;
               String vehicle = (String) redisTemplate.opsForValue().get("VEHICLE");
               List<Integer> integers = new ArrayList<>();
               if (ToolUtil.isNotEmpty(vehicle)) {
                  integers = JSON.parseArray(vehicle).toJavaList(Integer.class);
               }
               try {
                  if (orderType == 1) {//专车
                     OrderPrivateCar orderPrivateCar = orderPrivateCarMapper.selectById(orderId);
                     OrderPrivateCarServiceImpl.orderIds.add(orderPrivateCar.getId());//添加记录,防止调用接口重复提醒无人接单
                     OpenCity openCity = openCityService.openCity1(orderPrivateCar.getStartLon().toString(), orderPrivateCar.getStartLat().toString());
                     List<PushOrder> querys = pushOrderService.querys(null, 1, openCity.getId());//获取需要推送的次数
                     for (int i = 1; i <= querys.size() + 5; i++) {
                        //订单被抢后的处理
                        Integer state = orderPrivateCarMapper.selectById(orderId).getState();
                        if (state != 1) {
                           //关闭其他推送线程
                           Set<String> keySet = threadMap.keySet();
                           for (String key : keySet) {
                              if (!key.equals(orderId + "_1")) {
                                 Thread thread1 = threadMap.get(key);//中断线程
                                 if (null != thread1) {
                                    thread1.interrupt();
                                 }
                                 threadMap.remove(key);
                              }
                           }
                           //删除其他无效数据
                           for (Map<String, Integer> map : datas) {
                              Integer orderType = map.get("orderType");
                              Integer orderId = map.get("orderId");
                              if (orderType == 1 && orderId != orderPrivateCar.getId()) {
                                 orderPrivateCarMapper.deleteById(orderId);
                              }
                              if (orderType == 2) {
                                 orderTaxiMapper.deleteById(orderId);
                              }
                           }
                           break;
                        }
                        //开始进行推送的处理
                        int finalI = i;
                        PushOrder pushOrder = querys.stream().filter(s -> s.getType() == (finalI <= 3 ? finalI : 3)).findFirst().orElse(null);
                        //获取空闲司机
                        List<Driver> list = driverService.queryIdleDriver(1, orderPrivateCar.getServerCarModelId(), orderPrivateCar.getStartLon(), orderPrivateCar.getStartLat(), pushOrder.getPushDistance(), null);//所有附近空闲司机
                        if (list.size() > 0) {
                           double driverProportion = pushOrder.getDriverProportion() / 100;//推送占比计算成小数
                           int lastIndex = Double.valueOf(list.size() * driverProportion).intValue();//计算占比转成整数(下标截取)
                           list = list.subList(0, lastIndex);//获取空闲司机中占比数据
                           for (Driver driver : list) {//开始进行推送
                              boolean bo = false;
                              for (Integer integer : integers) {
                                 if (integer.compareTo(driver.getId()) == 0) {
                                    bo = true;
                                    break;
                                 }
                              }
                              if (bo) {
                                 continue;
                              }
                              pushUtil.pushOrderState(2, driver.getId(), orderPrivateCar.getId(), 1, orderPrivateCar.getState(), pushOrder.getPushTime());
                           }
                        }
                        //所有推送完后的处理
                        Boolean b = pushEndMap.get(orderPrivateCar.getCrossCityOrderId());
                        if (i == querys.size() + 5 && state == 1 && (null != b && !b.booleanValue())) {
                           pushUtil.pushEndPush(1, orderPrivateCar.getUserId(), orderPrivateCar.getId(), 1);
                           OrderPrivateCarServiceImpl.orderIds.remove(orderPrivateCar.getId());
                           pushEndMap.put(orderPrivateCar.getCrossCityOrderId(), Boolean.TRUE);//推送后添加标识
                           break;
                        }
                        Thread.sleep(pushOrder.getPushTime() * 1000);//设置等待时间
                     }
                  }
                  if (orderType == 2) {//出租车
                     OrderTaxi orderTaxi = orderTaxiMapper.selectById(orderId);
                     OrderTaxiServiceImpl.orderIds.add(orderTaxi.getId());//添加记录,防止调用接口重复提醒无人接单
                     OpenCity openCity = openCityService.openCity1(orderTaxi.getStartLon().toString(), orderTaxi.getStartLat().toString());
                     List<PushOrder> querys = pushOrderService.querys(null, 2, openCity.getId());//获取需要推送的次数
                     for (int i = 1; i <= querys.size() + 5; i++) {
                        //处理订单被抢
                        Integer state = orderTaxiMapper.selectById(orderId).getState();
                        if (state != 1) {
                           //关闭其他推送任务
                           Set<String> keySet = threadMap.keySet();
                           for (String key : keySet) {
                              if (!key.equals(orderId + "_2")) {
                                 Thread thread1 = threadMap.get(key);//中断线程
                                 if (null != thread1) {
                                    thread1.interrupt();
                                 }
                                 threadMap.remove(key);
                              }
                           }
                           //删除其他无效数据
                           for (Map<String, Integer> map : datas) {
                              Integer orderType = map.get("orderType");
                              Integer orderId = map.get("orderId");
                              if (orderType == 1) {
                                 orderPrivateCarMapper.deleteById(orderId);
                              }
                              if (orderType == 2 && orderId != orderTaxi.getId()) {
                                 orderTaxiMapper.deleteById(orderId);
                              }
                           }
                           break;
                        }
                        //开始进行推送
                        int finalI = i;
                        PushOrder pushOrder = querys.stream().filter(s -> s.getType() == (finalI <= 3 ? finalI : 3)).findFirst().orElse(null);
                        //获取空闲司机
                        List<Driver> list = driverService.queryIdleDriver(2, orderTaxi.getStartLon(), orderTaxi.getStartLat(), pushOrder.getPushDistance(), null);//所有附近空闲司机
                        if (list.size() > 0) {
                           double driverProportion = pushOrder.getDriverProportion() / 100;//推送占比计算成小数
                           int lastIndex = Double.valueOf(list.size() * driverProportion).intValue();//计算占比转成整数(下标截取)
                           list = list.subList(0, lastIndex);//获取空闲司机中占比数据
                           for (Driver driver : list) {//开始进行推送
                              boolean bo = false;
                              for (Integer integer : integers) {
                                 if (integer.compareTo(driver.getId()) == 0) {
                                    bo = true;
                                    break;
                                 }
                              }
                              if (bo) {
                                 continue;
                              }
                              pushUtil.pushOrderState(2, driver.getId(), orderTaxi.getId(), 2, orderTaxi.getState(), pushOrder.getPushTime());
                           }
                        }
                        //所有推送完后的处理
                        Boolean b = pushEndMap.get(orderTaxi.getCrossCityOrderId());
                        if (i == querys.size() + 5 && state == 1 && (null != b && !b.booleanValue())) {
                           pushUtil.pushEndPush(1, orderTaxi.getUserId(), orderTaxi.getId(), 2);
                           OrderTaxiServiceImpl.orderIds.remove(orderTaxi.getId());
                           pushEndMap.put(orderTaxi.getCrossCityOrderId(), Boolean.TRUE);//推送后添加标识
                        }
                        Thread.sleep(pushOrder.getPushTime() * 1000);//设置等待时间
                     }
                  }
               } catch (Exception e) {
                  e.printStackTrace();
               }
            }
         });
         thread.start();
         threadMap.put(orderId + "_" + orderType, thread);
      }
   }
   @Override
   public List<OrderCrossCity> queryListOrder(Integer driverId, Integer lineShiftId, List<Integer> state, String day) throws Exception {
      return orderCrossCityMapper.queryListOrder(driverId, lineShiftId, state, day);
   }
   /**
    * 获取订单编号
    *
    * @return
    * @throws Exception
    */
   public synchronized String getOrderNum(Integer driverId, Integer lineShiftDriverId) throws Exception {
      System.out.println(driverId + "|" + lineShiftDriverId);
      List<OrderCrossCity> orderCrossCities = orderCrossCityMapper.queryOrders(driverId, lineShiftDriverId, Arrays.asList(2, 3, 4, 7));
      if (orderCrossCities.size() > 0) {
         return orderCrossCities.get(0).getOrderNum();
      }
      int size = this.selectCount(null);
      while (true) {
         String orderNum = "CROSS" + String.valueOf(1000000 + size + 1).substring(1);
         List<OrderCrossCity> orderNum1 = this.selectList(new EntityWrapper<OrderCrossCity>().eq("orderNum", orderNum));
         if (orderNum1.size() == 0) {
            return orderNum;
         }
         size++;
      }
   }
   @Override
   @Transactional(propagation = Propagation.REQUIRES_NEW)
   public ResultUtil payThankYouFee(Integer uid, Integer orderId, Double money, Integer payType, Integer type) throws Exception {
      UserInfo userInfo = userInfoService.selectById(uid);
      OrderCrossCity orderCrossCity = this.selectById(orderId);
      ResultUtil resultUtil = ResultUtil.success();
      if (payType == 1) {//微信支付
         String app = type == 1 ? "APP" : "JSAPI";
         resultUtil = payMoneyUtil.weixinpay("感谢费", "", orderId + "_3_" + UUIDUtil.getRandomCode(5), money.toString(), "/base/wxPayThankYouFee", app, userInfo.getAppletsOpenId());
         paymentRecordService.saveData(3, uid, 1, orderId, 3, 1, money, "", 1);//添加预支付数据
      }
      if (payType == 2) {//支付宝支付
         resultUtil = payMoneyUtil.alipay("感谢费", "感谢费", "", orderId + "_3_" + UUIDUtil.getRandomCode(5), money.toString(), "/base/aliPayThankYouFee");
         paymentRecordService.saveData(1, uid, 1, orderId, 3, 2, money, "", 1);//添加预支付数据
      }
      if (payType == 3) {//余额支付
         if (userInfo.getBalance() == null || userInfo.getBalance() < money) {
            return ResultUtil.error("余额不足,无法完成支付");
         }
//            resultUtil= appOrderController.moneyPay(orderId,userInfo.getId(),money);
//            if(resultUtil.getCode()==500){
//                return ResultUtil.error("电子余额不足,无法完成支付");
//            }
            userInfo.setBalance(new BigDecimal(userInfo.getBalance()).subtract(new BigDecimal(money)).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue());
            SysIntegral query1 = sysIntegralMapper.query(orderCrossCity.getCompanyId());
            userInfo.setIntegral(userInfo.getIntegral() + (money.intValue() * query1.getIntegral()));//积分
            //添加交易明细
            transactionDetailsService.saveData(uid, "跨城出行-感谢费", money, 2, 1, 1, 3, orderId);
            userInfoService.updateById(userInfo);
            orderCrossCity.setThankYouFee(money);
            this.updateById(orderCrossCity);
            //添加已收入明细
            incomeService.saveData(2, orderCrossCity.getDriverId(), 6, orderCrossCity.getId(), 3, money);
            Driver driver = driverService.selectById(orderCrossCity.getDriverId());
            driver.setBusinessMoney(new BigDecimal(null != driver.getBusinessMoney() ? driver.getBusinessMoney() : 0).add(new BigDecimal(money)).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue());
            driver.setLaveBusinessMoney(new BigDecimal(null != driver.getLaveBusinessMoney() ? driver.getLaveBusinessMoney() : 0).add(new BigDecimal(money)).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue());
            driver.setBalance(new BigDecimal(null != driver.getBalance() ? driver.getBalance() : 0).add(new BigDecimal(money)).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue());
            driverService.updateById(driver);
            systemNoticeService.addSystemNotice(1, "您已使用余额成功完成感谢费支付,谢谢使用!", uid, 1);
        }
        if(payType==4){
            Double payMoney = orderCrossCity.getThankYouFee();
            Integer integer = paymentRecordService.saveData(3, uid, 1, orderId, 3, 4, money, "", 1);
            resultUtil = appOrderController.placeAnOrder(new BigDecimal(money), 4,orderId,2,integer);
        }
        return resultUtil;
    }
    @Override
    public void payThankYouFeeCallback(Integer orderId, String order_id, Integer payType) throws Exception {
        OrderCrossCity orderCrossCity = this.selectById(orderId);
        UserInfo userInfo = userInfoService.selectById(orderCrossCity.getUserId());
        PaymentRecord query = paymentRecordService.query(3, userInfo.getId(), 1, orderId, 3, payType, 1);
        query.setState(2);
        query.setCode(order_id);
        paymentRecordService.updateById(query);
        SysIntegral query1 = sysIntegralMapper.query(orderCrossCity.getCompanyId());
        userInfo.setIntegral(userInfo.getIntegral() + (query.getAmount().intValue() * query1.getIntegral()));//积分
        //添加交易明细
        transactionDetailsService.saveData(userInfo.getId(), "跨城出行-感谢费", query.getAmount(), 2, 1, 1, 3, orderId);
        userInfoService.updateById(userInfo);
        orderCrossCity.setThankYouFee(query.getAmount());
        this.updateById(orderCrossCity);
        //添加已收入明细
        incomeService.saveData(2, orderCrossCity.getDriverId(), 6, orderCrossCity.getId(), 3, query.getAmount());
        Driver driver = driverService.selectById(orderCrossCity.getDriverId());
        driver.setBusinessMoney(new BigDecimal(null != driver.getBusinessMoney() ? driver.getBusinessMoney() : 0).add(new BigDecimal(query.getAmount())).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue());
        driver.setLaveBusinessMoney(new BigDecimal(null != driver.getLaveBusinessMoney() ? driver.getLaveBusinessMoney() : 0).add(new BigDecimal(query.getAmount())).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue());
        driver.setBalance(new BigDecimal(null != driver.getBalance() ? driver.getBalance() : 0).add(new BigDecimal(query.getAmount())).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue());
        driverService.updateById(driver);
        systemNoticeService.addSystemNotice(1, "您已使用" + (payType == 1 ? "微信" : (payType==2?"支付宝":"云闪付")) + "成功完成感谢费支付,谢谢使用!", userInfo.getId(), 1);
    }
    @Override
    public List<UnPayOrderVO> getUnpayCrossCityOrders(Integer uid) throws Exception {
     EntityWrapper<OrderCrossCity> query = new EntityWrapper<>();
     query.eq("userId", uid).eq("state", 7);
     // 查询未支付订单
     List<OrderCrossCity> orderCrossCities = this.selectList(query);
     List<UnPayOrderVO> unPayOrderVOList = new ArrayList<>();
     for(OrderCrossCity orderCrossCity : orderCrossCities){
         UnPayOrderVO unPayOrderVO = new UnPayOrderVO();
         //添加司机信息
         DriverInfoWarpper driverInfoWarpper = new DriverInfoWarpper();
         Driver driver = driverService.selectById(orderCrossCity.getDriverId());
         BeanUtils.copyProperties(driver, driverInfoWarpper);         unPayOrderVO.setDriverInfoWarpper(driverInfoWarpper);
         //其余信息
         BeanUtils.copyProperties(orderCrossCity, unPayOrderVO);
         unPayOrderVOList.add(unPayOrderVO);
     }
     return unPayOrderVOList;
    }
         userInfo.setBalance(new BigDecimal(userInfo.getBalance()).subtract(new BigDecimal(money)).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue());
         OpenCity openCity = openCityService.openCity1(orderCrossCity.getStartLon().toString(), orderCrossCity.getStartLat().toString());
         SysIntegral query1 = sysIntegralMapper.query(openCity.getId());
         userInfo.setIntegral(userInfo.getIntegral() + (money.intValue() * query1.getIntegral()));//积分
         //添加交易明细
         transactionDetailsService.saveData(uid, "跨城出行-感谢费", money, 2, 1, 1, 3, orderId);
         userInfoService.updateById(userInfo);
         orderCrossCity.setThankYouFee(money);
         this.updateById(orderCrossCity);
         //添加已收入明细
         incomeService.saveData(2, orderCrossCity.getDriverId(), 6, orderCrossCity.getId(), 3, money);
         Driver driver = driverService.selectById(orderCrossCity.getDriverId());
         driver.setBusinessMoney(new BigDecimal(null != driver.getBusinessMoney() ? driver.getBusinessMoney() : 0).add(new BigDecimal(money)).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue());
         driver.setLaveBusinessMoney(new BigDecimal(null != driver.getLaveBusinessMoney() ? driver.getLaveBusinessMoney() : 0).add(new BigDecimal(money)).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue());
         driver.setBalance(new BigDecimal(null != driver.getBalance() ? driver.getBalance() : 0).add(new BigDecimal(money)).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue());
         driverService.updateById(driver);
         systemNoticeService.addSystemNotice(1, "您已使用余额成功完成感谢费支付,谢谢使用!", uid, 1);
      }
      if (payType == 4) {
         Double payMoney = orderCrossCity.getThankYouFee();
         Integer integer = paymentRecordService.saveData(3, uid, 1, orderId, 3, 4, money, "", 1);
         resultUtil = appOrderController.placeAnOrder(new BigDecimal(money), 4, orderId, 2, integer);
      }
      return resultUtil;
   }
   @Override
   public void payThankYouFeeCallback(Integer orderId, String order_id, Integer payType) throws Exception {
      OrderCrossCity orderCrossCity = this.selectById(orderId);
      UserInfo userInfo = userInfoService.selectById(orderCrossCity.getUserId());
      PaymentRecord query = paymentRecordService.query(3, userInfo.getId(), 1, orderId, 3, payType, 1);
      query.setState(2);
      query.setCode(order_id);
      paymentRecordService.updateById(query);
      OpenCity openCity = openCityService.openCity1(orderCrossCity.getStartLon().toString(), orderCrossCity.getStartLat().toString());
      SysIntegral query1 = sysIntegralMapper.query(openCity.getId());
      userInfo.setIntegral(userInfo.getIntegral() + (query.getAmount().intValue() * query1.getIntegral()));//积分
      //添加交易明细
      transactionDetailsService.saveData(userInfo.getId(), "跨城出行-感谢费", query.getAmount(), 2, 1, 1, 3, orderId);
      userInfoService.updateById(userInfo);
      orderCrossCity.setThankYouFee(query.getAmount());
      this.updateById(orderCrossCity);
      //添加已收入明细
      incomeService.saveData(2, orderCrossCity.getDriverId(), 6, orderCrossCity.getId(), 3, query.getAmount());
      Driver driver = driverService.selectById(orderCrossCity.getDriverId());
      driver.setBusinessMoney(new BigDecimal(null != driver.getBusinessMoney() ? driver.getBusinessMoney() : 0).add(new BigDecimal(query.getAmount())).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue());
      driver.setLaveBusinessMoney(new BigDecimal(null != driver.getLaveBusinessMoney() ? driver.getLaveBusinessMoney() : 0).add(new BigDecimal(query.getAmount())).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue());
      driver.setBalance(new BigDecimal(null != driver.getBalance() ? driver.getBalance() : 0).add(new BigDecimal(query.getAmount())).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue());
      driverService.updateById(driver);
      systemNoticeService.addSystemNotice(1, "您已使用" + (payType == 1 ? "微信" : (payType == 2 ? "支付宝" : "云闪付")) + "成功完成感谢费支付,谢谢使用!", userInfo.getId(), 1);
   }
   @Override
   public List<UnPayOrderVO> getUnpayCrossCityOrders(Integer uid) throws Exception {
      EntityWrapper<OrderCrossCity> query = new EntityWrapper<>();
      query.eq("userId", uid).eq("state", 7);
      // 查询未支付订单
      List<OrderCrossCity> orderCrossCities = this.selectList(query);
      List<UnPayOrderVO> unPayOrderVOList = new ArrayList<>();
      for (OrderCrossCity orderCrossCity : orderCrossCities) {
         UnPayOrderVO unPayOrderVO = new UnPayOrderVO();
         //添加司机信息
         DriverInfoWarpper driverInfoWarpper = new DriverInfoWarpper();
         Driver driver = driverService.selectById(orderCrossCity.getDriverId());
         BeanUtils.copyProperties(driver, driverInfoWarpper);
         unPayOrderVO.setDriverInfoWarpper(driverInfoWarpper);
         //其余信息
         BeanUtils.copyProperties(orderCrossCity, unPayOrderVO);
         unPayOrderVOList.add(unPayOrderVO);
      }
      return unPayOrderVOList;
   }
}