package com.stylefeng.guns.modular.crossCity.server.impl; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.annotations.TableField; import com.baomidou.mybatisplus.mapper.EntityWrapper; import com.baomidou.mybatisplus.service.impl.ServiceImpl; import com.stylefeng.guns.core.util.ToolUtil; import com.stylefeng.guns.modular.crossCity.dao.LinePriceMapper; import com.stylefeng.guns.modular.crossCity.dao.LineShiftDriverMapper; import com.stylefeng.guns.modular.crossCity.dao.OrderCrossCityMapper; import com.stylefeng.guns.modular.crossCity.model.Line; import com.stylefeng.guns.modular.crossCity.model.LineShiftDriver; import com.stylefeng.guns.modular.crossCity.model.OrderCrossCity; import com.stylefeng.guns.modular.crossCity.server.ILineService; import com.stylefeng.guns.modular.crossCity.server.IOrderCrossCityService; import com.stylefeng.guns.modular.crossCity.warpper.OrderCrossCityWarpper; import com.stylefeng.guns.modular.specialTrain.dao.OrderPrivateCarMapper; import com.stylefeng.guns.modular.specialTrain.model.OrderPrivateCar; import com.stylefeng.guns.modular.specialTrain.server.IOrderPrivateCarService; import com.stylefeng.guns.modular.specialTrain.server.impl.OrderPrivateCarServiceImpl; import com.stylefeng.guns.modular.system.dao.*; import com.stylefeng.guns.modular.system.model.*; import com.stylefeng.guns.modular.system.service.*; import com.stylefeng.guns.modular.system.util.*; import com.stylefeng.guns.modular.system.warpper.BaseWarpper; import com.stylefeng.guns.modular.system.warpper.OrderServerWarpper; import com.stylefeng.guns.modular.taxi.dao.OrderTaxiMapper; import com.stylefeng.guns.modular.taxi.model.OrderTaxi; import com.stylefeng.guns.modular.taxi.model.PaymentRecord; import com.stylefeng.guns.modular.taxi.model.TransactionDetails; import com.stylefeng.guns.modular.taxi.service.IOrderTaxiService; import com.stylefeng.guns.modular.taxi.service.IPaymentRecordService; import com.stylefeng.guns.modular.taxi.service.ITransactionDetailsService; import com.stylefeng.guns.modular.taxi.service.impl.OrderTaxiServiceImpl; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.http.HttpEntity; import org.springframework.http.HttpHeaders; import org.springframework.http.MediaType; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Isolation; import org.springframework.transaction.annotation.Propagation; import org.springframework.transaction.annotation.Transactional; import org.springframework.util.LinkedMultiValueMap; import org.springframework.util.MultiValueMap; import org.springframework.web.client.RestTemplate; import javax.annotation.Resource; import java.math.BigDecimal; import java.math.MathContext; import java.math.RoundingMode; import java.util.*; import static com.stylefeng.guns.modular.taxi.service.impl.OrderTaxiServiceImpl.orderIds; @Service @Transactional(isolation = Isolation.READ_UNCOMMITTED, propagation = Propagation.REQUIRED, rollbackFor = Exception.class) public class OrderCrossCityServiceImpl extends ServiceImpl 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 ICBCPayUtil icbcPayUtil; @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; @Autowired private RedisUtil redisUtil; @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 IOrderFrequentPassengersService orderFrequentPassengersService; @Value("${callbackPath}") private String callbackPath; public Map threadMap = new HashMap<>(); //存储摆渡车无接单后推送标识,实现多个类型的摆渡车订单无人接单后只给前端推送一次 public static Map 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 { Map 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 queryBalance(Integer orderId, Integer uid) throws Exception { Map 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; } /** * 获取支付页面的优惠券列表 * @param orderId * @param uid * @param pageNum * @param size * @return * @throws Exception */ @Override public List> queryCoupon(Integer orderId, Integer uid, Integer pageNum, Integer size) throws Exception { OrderCrossCity orderCrossCity = this.selectById(orderId); List> list = userCouponRecordService.queryCoupon(uid, orderCrossCity.getCompanyId(), 1, 3, orderCrossCity.getOrderMoney(), pageNum, size); List> list1 = userCouponRecordService.queryCoupon(uid, orderCrossCity.getCompanyId(), 1, 0, orderCrossCity.getOrderMoney(), pageNum, size); list.addAll(list1); return list; } /** * 订单支付 * @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(); orderCrossCity.setCouponMoney(0D);//初始化历史数据 orderCrossCity.setCouponId(null); //计算优惠券 UserCouponRecord userCouponRecord = null; if(null != couponId){ userCouponRecord = userCouponRecordService.selectById(couponId); 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 == 1){//微信支付 // String value = redisUtil.getValue("appletOpenId"); // String appletsOpenId = null; // if(ToolUtil.isNotEmpty(value)){ // JSONObject jsonObject = JSON.parseObject(value); // appletsOpenId = jsonObject.getString(uid.toString()); // }else{ // appletsOpenId = userInfo.getAppletsOpenId(); // } // Map map = icbcPayUtil.placeAnOrder(orderId + ",3", 9, 5, uid.toString(), "完成订单", orderMoney, callbackPath + "/base/wxPayOrderTaxi", "", type, appletsOpenId); // if(map.get("code").equals("200")){ // paymentRecordService.saveData(1, orderCrossCity.getUserId(), 1, orderId, 3, 1, orderMoney, map.get("order_id"), 1);//添加预支付数据 // resultUtil = ResultUtil.success(map.get("data")); // }else{ // resultUtil = ResultUtil.error(map.get("msg"), ""); // } // } // if(payType == 2){//支付宝支付 // Map map = icbcPayUtil.placeAnOrder(orderId + ",3", 10, 5, uid.toString(), "完成订单", orderMoney, callbackPath + "/base/aliPayOrderTaxi", "", type, null); // if(map.get("code").equals("200")){ // paymentRecordService.saveData(1, orderCrossCity.getUserId(), 1, orderId, 3, 2, orderMoney, map.get("order_id"), 1);//添加预支付数据 // resultUtil = ResultUtil.success(map.get("data")); // }else{ // resultUtil = ResultUtil.error(map.get("msg"), ""); // } // } 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); } //添加已收入明细 Line line = lineService.selectById(orderCrossCity.getLineId()); Double speMoney = Double.valueOf(line.getRakeRate()); BigDecimal d = new BigDecimal(orderCrossCity.getOrderMoney()).multiply(new BigDecimal(speMoney).divide(new BigDecimal(100))).setScale(2, BigDecimal.ROUND_HALF_EVEN);//企业收入 BigDecimal c = new BigDecimal(orderCrossCity.getOrderMoney()).subtract(d).setScale(2, BigDecimal.ROUND_HALF_EVEN);//司机收入 incomeService.saveData(1, orderCrossCity.getCompanyId(), 2, orderCrossCity.getId(), 3, d.doubleValue()); incomeService.saveData(2, orderCrossCity.getDriverId(), 2, orderCrossCity.getId(), 3, c.doubleValue()); Driver driver = driverService.selectById(orderCrossCity.getDriverId()); driver.setBusinessMoney(new BigDecimal(null != driver.getBusinessMoney() ? driver.getBusinessMoney() : 0).add(c).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue()); driver.setLaveBusinessMoney(new BigDecimal(null != driver.getLaveBusinessMoney() ? driver.getLaveBusinessMoney() : 0).add(c).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue()); driver.setBalance(new BigDecimal(null != driver.getBalance() ? driver.getBalance() : 0).add(c).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue()); driverService.updateById(driver); // 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; } /** * 支付成功后的回调操作 * @param id 订单=id * @param order_id 工行支付单号 * @param type 1=微信,2=支付宝 * @throws Exception */ @Override public void payOrderCrossCityCallback(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(2);//先支付再服务 orderCrossCity.setPayType(type); orderCrossCity.setPayMoney(query.getAmount()); 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.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); //添加已收入明细 Line line = lineService.selectById(orderCrossCity.getLineId()); Double speMoney = Double.valueOf(line.getRakeRate()); BigDecimal d = new BigDecimal(orderCrossCity.getOrderMoney()).multiply(new BigDecimal(speMoney).divide(new BigDecimal(100))).setScale(2, BigDecimal.ROUND_HALF_EVEN);//企业收入 BigDecimal c = new BigDecimal(orderCrossCity.getOrderMoney()).subtract(d).setScale(2, BigDecimal.ROUND_HALF_EVEN);//司机收入 incomeService.saveData(1, orderCrossCity.getCompanyId(), 2, orderCrossCity.getId(), 3, d.doubleValue()); incomeService.saveData(2, orderCrossCity.getDriverId(), 2, orderCrossCity.getId(), 3, c.doubleValue()); Driver driver = driverService.selectById(orderCrossCity.getDriverId()); driver.setBusinessMoney(new BigDecimal(null != driver.getBusinessMoney() ? driver.getBusinessMoney() : 0).add(c).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue()); driver.setLaveBusinessMoney(new BigDecimal(null != driver.getLaveBusinessMoney() ? driver.getLaveBusinessMoney() : 0).add(c).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue()); driver.setBalance(new BigDecimal(null != driver.getBalance() ? driver.getBalance() : 0).add(c).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue()); driverService.updateById(driver); // 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 ? "微信" : "支付宝") + "成功完成出行订单支付,谢谢使用!", orderCrossCity.getUserId(), 1); }else{ System.err.println("预支付数据异常(orderId = " + id + ")"); } } /** * 跨城下单操作 * @param orderCrossCityWarpper * @param uid * @return * @throws Exception */ @Override public synchronized ResultUtil orderCrossCity(OrderCrossCityWarpper orderCrossCityWarpper, Integer uid) throws Exception { /** * 1.下了即时单就不能下预约单和即时单 * 2.下了预约单和再下一张即时单不能再下预约单 */ List orderPrivateCars = orderPrivateCarMapper.queryByState(uid, 1, 1, 1, 2, 3, 4, 5, 6, 7, 11); if(orderPrivateCars.size() > 0){ return ResultUtil.error("有未完成的订单"); } List list = orderTaxiMapper.queryByState_(uid, 1, 1, 1, 2, 3, 4, 5, 6, 11); if(list.size() > 0){ return ResultUtil.error("有未完成的订单"); } List orderCrossCities1 = orderCrossCityMapper.queryByState(uid, 1, 2, 3, 4, 5, 7, 11); if(orderCrossCities1.size() > 0){ return ResultUtil.error("有未完成的订单"); } List 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> 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 orderCrossCities = this.selectList(new EntityWrapper().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){//包车 orderCrossCity.setSeatNumber(lineShiftDriver.getLaveSeatNumber()); orderCrossCity.setPeopleNumber(lineShiftDriver.getLaveSeat()); } //调用移动的小号接口 Map geocode = gdMapGeocodingUtil.geocode(orderCrossCity.getStartLon().toString(), orderCrossCity.getStartLat().toString()); Region region = regionMapper.query(geocode.get("districtCode")); // Map map = chinaMobileUtil.midAxbBindSend(orderCrossCity.getPassengersPhone(), driver.getPhone(), Integer.valueOf(region.getCitycode().substring(1))); // if(String.valueOf(map.get("code")).equals("200")){ // orderCrossCity.setTelX(map.get("telX")); // orderCrossCity.setBindId(map.get("bindId")); // } this.insert(orderCrossCity); if(ToolUtil.isNotEmpty(orderCrossCityWarpper.getFrequentPassengersId())){ List list1 = JSON.parseArray(orderCrossCityWarpper.getFrequentPassengersId(), Integer.class); for (Integer integer : list1) { OrderFrequentPassengers orderFrequentPassengers = new OrderFrequentPassengers(); orderFrequentPassengers.setOrderId(orderCrossCity.getId()); orderFrequentPassengers.setOrderType(3); orderFrequentPassengers.setFrequentPassengersId(integer); orderFrequentPassengersService.insert(orderFrequentPassengers); } } 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 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 queryOrder(Integer uid, Integer... state) throws Exception { return orderCrossCityMapper.queryByState(uid, state); } /** * 获取订单详情 * @param orderId * @return * @throws Exception */ @Override public Map queryOrderInfo(Integer orderId) throws Exception { Map 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 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 = redisUtil.getValue("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 queryCancleAmount(Integer id) throws Exception { OrderCrossCity orderCrossCity = this.selectById(id); 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 baseWarpper = new BaseWarpper(); baseWarpper.setAmount(amount); return ResultUtil.success(baseWarpper); } /** * 取消订单操作 * @param id * @param payType * @param cancleId * @param type * @return * @throws Exception */ @Override 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(""); 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 = redisUtil.getValue("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 map = icbcPayUtil.placeAnOrder(id + ",3", 9, 5, uid.toString(), "订单取消", query.getMoney(), callbackPath + "/base/wxCancelOrderTaxi", "", type, appletsOpenId); // if(map.get("code").equals("200")){ // paymentRecordService.saveData(1, orderCrossCity.getUserId(), 1, id, 3, 1, query.getMoney(), map.get("order_id"), 1);//添加预支付数据 // resultUtil = ResultUtil.success(map.get("data")); // }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);//添加预支付数据 // Map map = icbcPayUtil.placeAnOrder(id + ",3", 10, 5, uid.toString(), "订单取消", query.getMoney(), callbackPath + "/base/aliCancelOrderTaxi", "", type, null); // if(map.get("code").equals("200")){ // paymentRecordService.saveData(1, orderCrossCity.getUserId(), 1, id, 3, 2, query.getMoney(), map.get("order_id"), 1);//添加预支付数据 // resultUtil = ResultUtil.success(map.get("data")); // }else{ // resultUtil = ResultUtil.error(map.get("msg"), ""); // } } if(payType == 3){//余额支付 if(userInfo.getBalance() != null && userInfo.getBalance() < query.getMoney()){ 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.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 // public void run() { // pushUtil.pushOrderState(2, orderCrossCity.getDriverId(), orderCrossCity.getId(), 3, orderCrossCity.getState(), 0); // } // }).start(); //添加消息 systemNoticeService.addSystemNotice(1, "您已使用余额成功支付取消订单费用,谢谢使用!", orderCrossCity.getUserId(), 1); } } return resultUtil; } /** * 计算价格 * @param distance * @param peopleNumber * @param travelMode * @param lineId * @param serverCarModelId * @param totalSeat * @param seatNumber * @return */ public ResultUtil> getPrice(Double distance, Integer peopleNumber, Integer travelMode, Integer lineId, Integer serverCarModelId, Integer totalSeat, String seatNumber){ if(0 >= peopleNumber && peopleNumber > 6){ return ResultUtil.error("请输入正确的乘车人数"); } Map map = new HashMap<>(); double distance1 = distance.doubleValue() / 1000;//公里 map.put("distance", distance); /** * 1.固定价格的包车是整车价格 * 2.五座车和七座车的优惠系数是中间特殊位置的优惠折扣 * 3.包车的情况不享受中间特殊位置的优惠折扣 * 4.浮动计费拼车如果选中中间特殊位置既享受优惠系数又享受中间特殊位置的优惠折扣 */ Map 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();//七座系数 if(travelMode == 1){//拼车 double unitPrice = (distance1 * num3 * (num1 / (num2 * num3))) + ((distance1 - num2) * num3 * num4); 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 ? num6 : num7); peopleNumber -= 1; } double price = (unitPrice * peopleNumber) + price1; map.put("price", new BigDecimal(price).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue()); }else{ double unitPrice = (distance1 * num3 * (num1 / (num2 * num3))) + ((distance1 - num2) * num3 * num5); double price = unitPrice * totalSeat; map.put("price", new BigDecimal(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 params = new LinkedMultiValueMap<>(); params.add("orderId", orderId + ""); params.add("orderType", "3"); HttpEntity> 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 queryRedMoney(Integer orderId) throws Exception { OrderCrossCity orderCrossCity = this.selectById(orderId); Integer companyId = orderCrossCity.getCompanyId(); Map 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); } 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 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.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 ? "微信" : "支付宝") + "成功支付取消订单费用,谢谢使用!", orderCrossCity.getUserId(), 1); }else{ System.err.println("预支付数据异常(orderId = " + id + ")"); } } /** * 获取个人中心订单列表 * @param uid * @param pageNum * @param size * @return * @throws Exception */ @Override public List> queryMyOrderList(Integer uid, Integer pageNum, Integer size) throws Exception { pageNum = (pageNum - 1) * size; List> maps = orderCrossCityMapper.queryMyOrderList(uid, pageNum, size); for(Map map : maps){ if(Integer.valueOf(String.valueOf(map.get("state"))) == 11){ map.put("state", map.get("oldState")); } } return maps; } @Override public List> queryMyTravelRecord(Integer uid) { return orderCrossCityMapper.queryMyTravelRecord(uid); } @Override public List> 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> 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 = 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) { 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 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() == 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); }else{ PaymentRecord query = paymentRecordService.query(1, orderCrossCity.getUserId(), 1, id, 3, orderCrossCity.getPayType(), 2); if(null == query){ return ResultUtil.error("订单还未进行支付"); } if(query.getPayType() == 1){//微信 Map 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{//支付宝 Map 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); } // PaymentRecord query = paymentRecordService.query(1, orderCrossCity.getUserId(), 1, id, 3, orderCrossCity.getPayType(), 2); // if(null == query){ // return ResultUtil.error("订单还未进行支付"); // } // Map merrefund = icbcPayUtil.merrefund(query.getCode(), "", query.getAmount(), id + "_3", orderCrossCity.getOrderNum()); // if(Integer.valueOf(merrefund.get("code").toString()) == 0){ // Map refundqry = icbcPayUtil.refundqry("", query.getCode(), orderCrossCity.getOrderNum()); // if(Integer.valueOf(refundqry.get("code").toString()) == 0 && Integer.valueOf(refundqry.get("pay_status").toString()) == 0){//成功 // //添加交易明细 // transactionDetailsService.saveData(orderCrossCity.getUserId(), "跨城订单取消退款", query.getAmount(), 1, 1, 1, 3, id); // } // if(Integer.valueOf(refundqry.get("code").toString()) == 0 && Integer.valueOf(refundqry.get("pay_status").toString()) == 1){//失败 // return ResultUtil.error("订单取消失败(退款不成功)"); // } // if(Integer.valueOf(refundqry.get("code").toString()) == 0 && Integer.valueOf(refundqry.get("pay_status").toString()) == 2){//未知 // return ResultUtil.error("退款返回未知异常"); // } // } } //添加负的收入明细 List incomes = incomeService.selectList(new EntityWrapper().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 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 = redisUtil.getValue("DRIVER" + String.valueOf(orderCrossCity.getDriverId())); if(null == value || "".equals(value)){ System.err.println("司机没有上传位置信息"); //调用获取轨迹中的数据 List> list = orderPositionService.queryTrack(orderId, 3); if(list.size() > 0){ Map map = list.get(list.size() - 1); value = map.get("lon") + "," + map.get("lat"); } } Map 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 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){//前往预约地 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){//服务中 distance = gdMapElectricFenceUtil.getDistance(value, orderCrossCity.getEndLon() + "," + orderCrossCity.getEndLat(), 1); 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 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 geocode = gdMapGeocodingUtil.geocode(startLon, startLat); boolean b = openCityService.openCity(geocode.get("districtCode")); if(!b){ return ResultUtil.error("起点暂未开通"); } String[] split = serverCarModelIds.split(","); List> list = new ArrayList<>(); Integer orderId = null; for(String serverModelId : split){ Map map = new HashMap<>(); if(serverModelId.equals("0")){//出租车 ResultUtil 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 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 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 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 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 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> list) throws Exception{ for(Map map : list){ Integer orderType = map.get("orderType"); Integer orderId = map.get("orderId"); Thread thread = new Thread(new Runnable() { @Override public void run() { List> datas = list; String vehicle = redisUtil.getValue("VEHICLE"); List 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 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 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 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 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 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 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 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 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 queryListOrder(Integer driverId, Integer lineShiftId, List 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{ List 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 orderNum1 = this.selectList(new EntityWrapper().eq("orderNum", orderNum)); if(orderNum1.size() == 0){ return orderNum; } size++; } } }