package com.stylefeng.guns.modular.crossCity.server.impl; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; 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.system.dao.PhoneMapper; import com.stylefeng.guns.modular.system.dao.RegionMapper; import com.stylefeng.guns.modular.system.dao.SysIntegralMapper; import com.stylefeng.guns.modular.system.dao.UserInfoMapper; 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.taxi.dao.OrderTaxiMapper; import com.stylefeng.guns.modular.taxi.model.OrderTaxi; import com.stylefeng.guns.modular.taxi.service.IOrderTaxiService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Isolation; import org.springframework.transaction.annotation.Propagation; import org.springframework.transaction.annotation.Transactional; import javax.annotation.Resource; import java.io.File; import java.io.FileWriter; import java.io.PrintWriter; import java.math.BigDecimal; import java.math.MathContext; import java.math.RoundingMode; import java.util.*; @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 LineShiftDriverMapper lineShiftDriverMapper; @Autowired private ILineService lineService; @Autowired private ISystemNoticeService systemNoticeService; @Autowired private PushUtil pushUtil; @Autowired private IIncomeService incomeService; @Autowired private IDriverService driverService; @Resource private UserInfoMapper userInfoMapper; @Autowired private DateUtil dateUtil; @Resource private LinePriceMapper linePriceMapper; @Autowired private GDMapGeocodingUtil gdMapGeocodingUtil; @Autowired private GDFalconUtil gdFalconUtil; @Resource private RegionMapper regionMapper; @Autowired private ChinaMobileUtil chinaMobileUtil; /*@Autowired private ICBCPayUtil icbcPayUtil;*/ @Autowired private PayMoneyUtil payMoneyUtil; @Autowired private ITransactionDetailsService transactionDetailsService; @Autowired private GDMapElectricFenceUtil gdMapElectricFenceUtil; @Autowired private IPaymentRecordService paymentRecordService; @Resource private SysIntegralMapper sysIntegralMapper; @Resource private OrderPrivateCarMapper orderPrivateCarMapper; @Resource private OrderTaxiMapper orderTaxiMapper; @Resource private PhoneMapper phoneMapper; @Autowired private IOrderPositionService orderPositionService; @Autowired private IOrderCancelService orderCancelService; @Value("${filePath}") private String filePath; @Value("${callbackPath}") private String callbackPath; /** * 获取司机抢单页面的订单详情 * @param orderId * @return * @throws Exception */ @Override public Map queryPushOrder(Integer orderId) throws Exception { return orderCrossCityMapper.queryPushOrder(orderId); } /** * 获取司机端首页订单列表 * @param state 1=服务中,2=待服务(30分钟定义预约) * @param driverId * @return * @throws Exception */ @Override public List> queryOrderList(Integer language, Integer state, Integer driverId) throws Exception { List> list = orderCrossCityMapper.queryOrderList(state, driverId); for (Map map : list) { if(null != map.get("time")){ String time = map.get("time").toString(); map.put("time", DateUtil.conversionFormat(language, time)); } } return list; } /** * 获取我的订单列表数据 * @param state 1=全部,2=待支付,3=已取消 * @param uid * @return * @throws Exception */ @Override public List> queryMyAllOrder(Integer language, Integer state, Integer uid) throws Exception { List> list = orderCrossCityMapper.queryMyAllOrder(state, uid); for (Map map : list) { if(null != map.get("time")){ String time = map.get("time").toString(); map.put("time", DateUtil.conversionFormat(language, time)); } } return list; } /** * 获取订单详情页(服务中的页面) * @param orderId * @return * @throws Exception */ @Override public Map queryOrderInfo(Integer language, Integer orderId) throws Exception { Map map = new HashMap<>(); OrderCrossCity orderCrossCity = this.selectById(orderId); List> order = orderCrossCityMapper.queryOrderInfo(orderCrossCity.getOrderNum()); int num = 0; Double serverMoney = 0D; Double totalMoney = 0D; for(Map m : order){ if(null != m.get("travelTime_")){ String travelTime_ = m.get("travelTime_").toString(); m.put("travelTime_", DateUtil.conversionFormat1(language, travelTime_)); } if(null != m.get("travelTime")){ String travelTime = m.get("travelTime").toString(); m.put("travelTime", DateUtil.conversionFormat(language, travelTime)); } if(null != m.get("arriveTime")){ String arriveTime = m.get("arriveTime").toString(); m.put("arriveTime", DateUtil.conversionFormat(language, arriveTime)); } num += Integer.valueOf(m.get("peopleNumber").toString()); totalMoney += Double.valueOf(m.get("payMoney").toString()); List incomes = incomeService.queryData(1, null, 2, Integer.valueOf(m.get("orderId").toString()), 3); for (Income income : incomes){ serverMoney += income.getMoney(); } } Line line = lineService.selectById(orderCrossCity.getLineId()); map.put("line", line.getName()); map.put("peopleNumber", num); map.put("orderNumber", orderCrossCity.getOrderNum()); map.put("totalMoney", new BigDecimal(totalMoney).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue()); map.put("serverMoney", new BigDecimal(serverMoney).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue()); Phone phone = phoneMapper.queryInfo(Integer.valueOf(order.get(0).get("companyId").toString()), 1); map.put("emergencyCall", null != phone ? phone.getPhone() : "110"); map.put("orders", JSON.toJSONString(order)); return map; } /** * 走订单流程操作 * @param orderId * @param state * @return * @throws Exception */ @Override public ResultUtil process(Integer orderId, Integer state, Double lon, Double lat, String address) throws Exception { OrderCrossCity orderCrossCity = this.selectById(orderId); switch (state){ case 3://出发前往预约点 orderCrossCity.setState(3); orderCrossCity.setSetOutTime(new Date()); systemNoticeService.addSystemNotice(1, "司机已出发,请耐心等待", orderCrossCity.getUserId()); pushUtil.pushDriverPosition(orderCrossCity.getId(), 3);//主动推送司机定位 break; case 4://到达预约点,等待客户上车 orderCrossCity.setState(4); orderCrossCity.setArriveTime(new Date()); systemNoticeService.addSystemNotice(1, "司机已到达您设置的预约地点,请及时上车", orderCrossCity.getUserId()); break; case 5://开始服务 orderCrossCity.setBoardingLon(lon); orderCrossCity.setBoardingLat(lat); orderCrossCity.setBoardingAddress(address); orderCrossCity.setBoardingTime(new Date()); orderCrossCity.setState(5); orderCrossCity.setStartServiceTime(new Date()); break; case 6://结束服务 orderCrossCity.setGetoffLon(lon); orderCrossCity.setGetoffLat(lat); orderCrossCity.setGetoffAddress(address); orderCrossCity.setGetoffTime(new Date()); orderCrossCity.setState(8);//跨城直接到待评价 orderCrossCity.setEndServiceTime(new Date()); //还原座位数 LineShiftDriver lineShiftDriver = lineShiftDriverMapper.selectById(orderCrossCity.getLineShiftDriverId()); lineShiftDriver.setLaveSeat(lineShiftDriver.getLaveSeat() + orderCrossCity.getPeopleNumber()); lineShiftDriver.setLaveSeatNumber( (ToolUtil.isNotEmpty(lineShiftDriver.getLaveSeatNumber()) ? lineShiftDriver.getLaveSeatNumber() + "," : "") + orderCrossCity.getSeatNumber() ); lineShiftDriverMapper.updateById(lineShiftDriver); //修改司机空闲状态 List orderCrossCities = orderCrossCityMapper.queryWithin30Minutes(orderCrossCity.getDriverId(), 2, 3, 4, 5, 11); if(orderCrossCities.size() == 0){ Driver driver = driverService.selectById(orderCrossCity.getDriverId()); driver.setState(2); driverService.updateById(driver); } pushUtil.removeTask(orderId, 3);//删除定时任务,结束推送数据 systemNoticeService.addSystemNotice(1, "司机已结束本次行程,谢谢使用", orderCrossCity.getUserId()); break; } this.updateById(orderCrossCity); // TODO: 2020/6/5 推送状态 new Thread(new Runnable() { @Override public void run() { pushUtil.pushOrderState(1, orderCrossCity.getUserId(), orderCrossCity.getId(), 2, orderCrossCity.getState(), 0, "", "driver"); pushUtil.pushOrderState(2, orderCrossCity.getDriverId(), orderCrossCity.getId(), 2, orderCrossCity.getState(), 0, "", "driver"); } }).start(); return ResultUtil.success(); } /** * 获取订单明细 * @param orderId * @return * @throws Exception */ @Override public Map queryOrderCrossCityInfo(Integer language, Integer orderId) throws Exception { Map map = orderCrossCityMapper.queryOrderCrossCityInfo(orderId); if(null != map.get("travelTime_")){ String travelTime_ = map.get("travelTime_").toString(); map.put("travelTime_", DateUtil.conversionFormat1(language, travelTime_)); } if(null != map.get("arriveTime")){ String arriveTime = map.get("arriveTime").toString(); map.put("arriveTime", DateUtil.conversionFormat(language, arriveTime)); } return map; } /** * 修改订单顺序 * @param orderId * @throws Exception */ @Override public void setOrderCrossCitySort(Integer orderId) throws Exception { OrderCrossCity orderCrossCity = this.selectById(orderId); List orderCrossCities = orderCrossCityMapper.selectList(new EntityWrapper().eq("orderNum", orderCrossCity.getOrderNum()).ne("state", 10)); for(int i = 0; i < orderCrossCities.size(); i++){ if(orderId == orderCrossCities.get(i).getId()){ if(i == 0){ return; } Integer sort = orderCrossCities.get(i).getSort(); OrderCrossCity orderCrossCity1 = orderCrossCities.get(i - 1); orderCrossCities.get(i).setSort(orderCrossCity1.getSort()); orderCrossCity1.setSort(sort); orderCrossCityMapper.updateById(orderCrossCities.get(i)); orderCrossCityMapper.updateById(orderCrossCity1); } } } /** * 跨城下单操作 * @param orderCrossCityWarpper * @param uid * @return * @throws Exception */ @Override public synchronized ResultUtil orderCrossCity(OrderCrossCityWarpper orderCrossCityWarpper, Integer uid) throws Exception { /** * 先判断司机座位数是否符合出行人数 */ 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(); UserInfo userInfo = userInfoMapper.queryByPhone(orderCrossCityWarpper.getPassengersPhone()); if(userInfo == null){//添加用户信息 userInfo = new UserInfo(); Integer integer = userInfoMapper.selectCount(null) + 1000001; userInfo.setNickName(ToolUtil.isNotEmpty(orderCrossCityWarpper.getPassengers()) ? orderCrossCityWarpper.getPassengers() : "OK" + String.valueOf(integer).substring(1)); userInfo.setLastName(orderCrossCityWarpper.getPassengers()); userInfo.setPhone(orderCrossCityWarpper.getPassengersPhone()); userInfo.setState(1); userInfo.setFlag(1); userInfo.setInsertTime(new Date()); userInfo.setInsertUser(uid); userInfoMapper.insert(userInfo); } orderCrossCity.setUserId(userInfo.getId()); /** * 1.下了即时单就不能下预约单和即时单 * 2.下了预约单和再下一张即时单不能再下预约单 */ List orderPrivateCars = orderPrivateCarMapper.queryByState(orderCrossCity.getUserId(), 1, 1, 1, 2, 3, 4, 5, 6, 7, 11); if(orderPrivateCars.size() > 0){ return ResultUtil.error("有未完成的订单"); } List list = orderTaxiMapper.queryByState_(orderCrossCity.getUserId(), 1, 1, 1, 2, 3, 4, 5, 6, 11); if(list.size() > 0){ return ResultUtil.error("有未完成的订单"); } List orderCrossCities1 = orderCrossCityMapper.queryByState(orderCrossCity.getUserId(), 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("司机正在服务中"); } orderCrossCity.setPassengers(orderCrossCityWarpper.getPassengers()); orderCrossCity.setPassengersPhone(orderCrossCityWarpper.getPassengersPhone()); orderCrossCity.setServerCarModelId(orderCrossCityWarpper.getServerCarModelId()); orderCrossCity.setDriverId(orderCrossCityWarpper.getDriverId()); orderCrossCity.setLineId(orderCrossCityWarpper.getLineId()); 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); 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.setIsReassign(1); orderCrossCity.setLineShiftDriverId(orderCrossCityWarpper.getLineShiftDriverId()); //调用高德创建轨迹 String s = gdFalconUtil.selectTerminal(driver.getPhone()); String track = gdFalconUtil.createTrack(s); orderCrossCity.setTrackId(track); //调用移动的小号接口 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")); } if(orderCrossCityWarpper.getTravelMode() == 2){//包车 orderCrossCity.setSeatNumber(lineShiftDriver.getLaveSeatNumber()); orderCrossCity.setPeopleNumber(lineShiftDriver.getLaveSeat()); } 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()); 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(sp.equals(spl)){ b = false; break; } } if(b){ seatNumber += sp + ","; } } lineShiftDriver.setLaveSeatNumber(ToolUtil.isNotEmpty(seatNumber) ? seatNumber.substring(0, seatNumber.length() - 1) : ""); } lineShiftDriverMapper.updateById(lineShiftDriver); //添加消息 systemNoticeService.addSystemNotice(1, "您的跨城订单已下单成功!", orderCrossCity.getUserId()); 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 orderId 订单id * @param order_id 工行订单号 * @throws Exception */ @Override public void generatePayCallback(Integer orderId, String order_id) throws Exception { OrderCrossCity orderCrossCity = orderCrossCityMapper.selectById(order_id); orderCrossCity.setPayManner(1); orderCrossCity.setPayMoney(orderCrossCity.getOrderMoney()); orderCrossCity.setState(2); orderCrossCityMapper.updateById(orderCrossCity); //添加交易明细 transactionDetailsService.saveData(orderCrossCity.getUserId(), "完成订单", orderCrossCity.getOrderMoney(), 2, 1, 1, 3, orderId); //添加已收入明细 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), new MathContext(2, RoundingMode.HALF_EVEN)));//企业收入 BigDecimal c = new BigDecimal(orderCrossCity.getOrderMoney()).subtract(d).setScale(2, BigDecimal.ROUND_HALF_EVEN);//司机收入 incomeService.saveData(1, orderCrossCity.getCompanyId(), 2, orderCrossCity.getId(), 1, d.doubleValue()); incomeService.saveData(2, orderCrossCity.getDriverId(), 2, orderCrossCity.getId(), 1, 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, "", "driver"); pushUtil.pushOrderState(2, orderCrossCity.getDriverId(), orderCrossCity.getId(), 3, orderCrossCity.getState(), 0, "", "driver"); } }).start(); systemNoticeService.addSystemNotice(1, "您已使用余额成功完成出行订单支付,谢谢使用!", orderCrossCity.getUserId()); } /** * 计算支付金额 * @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 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(); ResultUtil resultUtil = ResultUtil.success(""); orderCrossCity.setCouponMoney(0D);//初始化历史数据 orderCrossCity.setCouponId(null); if(payType == 1){//微信支付 ResultUtil resultUtil1 = payMoneyUtil.weixinpay("完成订单",orderId+"",orderId + ",3",orderMoney+"","/base/wxPayCrossCity","APP"); //Map map = icbcPayUtil.placeAnOrder(orderId + ",3", 9, 5, uid.toString(), "完成订单", orderMoney, callbackPath + "/base/wxPayCrossCity", "", type, null); if(resultUtil1.getCode()==200){ paymentRecordService.saveData(1, null, null, orderId, 3, 1, orderMoney, null, 1);//添加预支付数据 resultUtil = resultUtil1; }else{ resultUtil = ResultUtil.error("获取支付信息失败", ""); } } if(payType == 2){//支付宝支付 ResultUtil resultUtil1 = payMoneyUtil.alipay("完成订单","完成订单",orderId + ",3",orderMoney+"","/base/aliPayCrossCity"); //Map map = icbcPayUtil.placeAnOrder(orderId + ",3", 10, 5, uid.toString(), "完成订单", orderMoney, callbackPath + "/base/aliPayCrossCity", "", type, null); if(resultUtil1.getCode()==200){ paymentRecordService.saveData(1, null, null, orderId, 3, 2, orderMoney, null, 1);//添加预支付数据 resultUtil = resultUtil1; }else{ resultUtil = ResultUtil.error("获取支付信息失败", ""); } } /*if(payType == 3){//扫码支付 //调用支付获取收款二维码数据 ResultUtil> generate = icbcPayUtil.generate(orderCrossCity.getId() + ",3", orderMoney, orderCrossCity.getInsertTime(), orderCrossCity.getOrderNum(), callbackPath + "/base/order/generatePay"); resultUtil = ResultUtil.success(generate.getData().get("qrcode").toString()); }*/ 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); if(orderCrossCity.getState() == 7){ PaymentRecord query = paymentRecordService.query(1, null, null, id, 3, type, 1); if(null == query){ System.err.println("预支付数据异常(orderId = " + id + ")"); } //添加交易明细 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 = userInfoMapper.selectById(orderCrossCity.getUserId()); SysIntegral query1 = sysIntegralMapper.query(orderCrossCity.getCompanyId()); userInfo.setIntegral(userInfo.getIntegral() + (query.getAmount().intValue() * query1.getIntegral()));//积分 userInfoMapper.updateById(userInfo); 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), new MathContext(2, RoundingMode.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, "", "driver"); pushUtil.pushOrderState(2, orderCrossCity.getDriverId(), orderCrossCity.getId(), 3, orderCrossCity.getState(), 0, "", "driver"); } }).start(); systemNoticeService.addSystemNotice(1, "您已使用" + (type == 1 ? "微信" : "支付宝") + "成功完成出行订单支付,谢谢使用!", orderCrossCity.getUserId()); } } @Override public boolean calculateMileage(OrderPosition orderPosition) throws Exception { Integer orderId = orderPosition.getOrderId(); String lon = orderPosition.getLon(); String lat = orderPosition.getLat(); OrderCrossCity order = this.selectById(orderId); if(null == order){ System.err.println("订单数据异常:" + orderId); return false; } //跨城记录所有服务完成之前的订单服务距离 List orderCrossCities = this.selectList(new EntityWrapper().eq("orderNum", order.getOrderNum()).eq("isDelete", 1).in("state", Arrays.asList(2, 3, 4, 5))); for(OrderCrossCity orderCrossCity : orderCrossCities){ boolean b = false; OrderPosition orderPosition1 = orderPositionService.queryNew(orderCrossCity.getId(), 3); if(null != orderPosition1){ String now = lon + "," + lat; String old = orderPosition1.getLon() + "," + orderPosition1.getLat(); Map distance = GeodesyUtil.getDistance(now, old);//直线距离 if(null != distance){ Double distance1 = distance.get("WGS84"); if(distance1 > 50){//大于50米表示在移动 orderCrossCity.setMileage(new BigDecimal(orderCrossCity.getMileage()).add(new BigDecimal(distance1)).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue()); this.updateById(orderCrossCity); b = true; } }else{ System.err.println("调用高德计算距离出错"); } }else{ orderCrossCity.setMileage(0D); this.updateById(orderCrossCity); b = true;//第一条数据不作处理,直接存储 } if(b){ //先计算里程,在存储最新位置 orderPosition.setInsertTime(new Date()); //将数据存储到文件中 List orderPositions = orderPositionService.queryPosition(orderCrossCity.getId(), 3); File file = new File(filePath + orderCrossCity.getId() + "_3" + ".txt"); if(!file.exists()){ file.getParentFile().mkdirs(); file.createNewFile(); } //写入相应的文件 PrintWriter out = new PrintWriter(new FileWriter(file)); orderPositions.add(orderPosition); System.err.println("存储新数据:" + JSON.toJSONString(orderPositions)); out.write(JSON.toJSONString(orderPositions)); out.flush(); out.close(); } } return false;//上层不需要处理 } @Override public List queryListOrder(Integer driverId, Integer lineShiftId, List state, String day) throws Exception { return orderCrossCityMapper.queryListOrder(driverId, lineShiftId, state, day); } /** * 计算价格 * @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); } /** * 获取订单编号 * @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); return "CROSS" + String.valueOf(1000000 + size + 1).substring(1); } }