package com.stylefeng.guns.modular.crossCity.server.impl; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONArray; 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.account.controller.AppOrderController; 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.LineSite; import com.stylefeng.guns.modular.crossCity.model.OrderCrossCity; import com.stylefeng.guns.modular.crossCity.server.ILineService; import com.stylefeng.guns.modular.crossCity.server.ILineSiteService; import com.stylefeng.guns.modular.crossCity.server.IOrderCrossCityService; import com.stylefeng.guns.modular.crossCity.warpper.OrderCrossCityScanWarpper; import com.stylefeng.guns.modular.crossCity.warpper.OrderCrossCityWarpper; import com.stylefeng.guns.modular.crossCity.warpper.ScanOrderDetailWarpper; 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.model.vo.UnPayOrderVO; import com.stylefeng.guns.modular.system.service.*; import com.stylefeng.guns.modular.system.util.*; import com.stylefeng.guns.modular.system.util.qianyuntong.OrderUtil; import com.stylefeng.guns.modular.system.util.qianyuntong.model.*; import com.stylefeng.guns.modular.system.warpper.*; 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.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.data.redis.core.RedisTemplate; 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.text.SimpleDateFormat; import java.time.LocalDate; import java.time.format.DateTimeFormatter; import java.util.*; import java.util.concurrent.LinkedBlockingQueue; import java.util.concurrent.ThreadPoolExecutor; import java.util.concurrent.TimeUnit; import java.util.stream.Collectors; @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 SensitiveWordsMapper sensitiveWordsMapper; @Autowired private GDMapElectricFenceUtil gdMapElectricFenceUtil; @Autowired private IUserInfoService userInfoService; @Autowired private IUserCouponRecordService userCouponRecordService; @Autowired private IUserRedPacketRecordService userRedPacketRecordService; @Autowired private IPaymentRecordService paymentRecordService; @Autowired private ITransactionDetailsService transactionDetailsService; @Autowired private IOrderPrivateCarService orderPrivateCarService; @Autowired private 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; @Resource private RedisTemplate redisTemplate; @Autowired private ICancleOrderService cancleOrderService; @Autowired private IOrderCancelService orderCancelService; @Autowired private RestTemplate internalRestTemplate; @Autowired private IUserActivityRedenvelopeService userActivityRedenvelopeService; @Autowired private IOrderPositionService orderPositionService; @Autowired private IOrderTaxiService orderTaxiService; @Autowired private ICompanyCityService companyCityService; @Autowired private IPushOrderService pushOrderService; @Autowired private IOpenCityService openCityService; @Autowired private PayMoneyUtil payMoneyUtil; @Autowired private ICompanyService companyService; @Autowired private ITaxiCardService taxiCardService; @Autowired private IUserUserService userUserService; @Autowired private IUserTaxiCardService userTaxiCardService; @Autowired private IRegionService regionService; @Autowired private TAbnormalPayOrderMapper abnormalPayOrderMapper; @Resource private CarMapper carMapper; @Resource private CarModelMapper carModelMapper; @Autowired private TDriverPromotionActivityService driverPromotionActivityService; @Autowired private CarServiceMapper carServiceMapper; @Autowired private ILineSiteService lineSiteService; @Autowired private ILineService lineService; @Value("${callbackPath}") private String callbackPath; public Map threadMap = new HashMap<>(); //存储摆渡车无接单后推送标识,实现多个类型的摆渡车订单无人接单后只给前端推送一次 public static Map pushEndMap = new HashMap<>(); @Autowired private ICompanyService iCompanyService; @Autowired private WeChatUtil weChatUtil; /** * 计算支付金额 * * @param startLonLat * @param endLonLat * @param peopleNumber * @param travelMode * @param lineId * @param serverCarModelId * @return * @throws Exception */ @Override public ResultUtil queryOrderMoney(String startLonLat, String endLonLat, Integer peopleNumber, Integer travelMode, Integer lineId, Integer serverCarModelId, Integer totalSeat, String seatNumber) throws Exception { // TODO: 2023/11/4 无法修改 Map 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; } @Override public PreferentialDataVo queryBalance1(Integer orderId, Integer uid) throws Exception { UserInfo userInfo = userInfoService.selectById(uid); PreferentialDataVo preferentialDataVo = new PreferentialDataVo(); preferentialDataVo.setBalance(userInfo.getBalance()); OrderCrossCity orderCrossCity = this.selectById(orderId); Integer ids = userInfoService.getDiscount(); if (ids != null) { List userActivityId = userActivityDiscount1Mapper.selectList(new EntityWrapper().eq("userActivityId", ids)); if (userActivityId.size() > 0) { preferentialDataVo.setDiscount(userActivityId.get(0).getLogistics()); } } // 查出当前用户的红包 并将订单的修改 List userRedPacketRecords = userRedPacketRecordService.selectList(new EntityWrapper().eq("userId", uid).eq("state", 1).le("money", orderCrossCity.getOrderMoney()).gt("expirationTime", new Date()).gt("endTime", new Date())); if (userRedPacketRecords.size() > 0) { preferentialDataVo.setRedPacket(userRedPacketRecords.get(0).getMoney()); orderCrossCity.setRedPacketId(userRedPacketRecords.get(0).getId()); orderCrossCity.setRedPacketMoney(userRedPacketRecords.get(0).getMoney()); this.updateById(orderCrossCity); } //获取优惠券中最优数据 List list = userCouponRecordService.selectList(new EntityWrapper().eq("companyId", orderCrossCity.getCompanyId()).eq("state", 1).le("money", orderCrossCity.getOrderMoney()).in("couponUseType", Arrays.asList(0, 3)).eq("userId", uid).where("now() < expirationTime")); Integer id = null; Double price = 0d; Integer type = 0; for (UserCouponRecord userCouponRecord : list) { if (userCouponRecord.getCouponType() == 1) {//抵扣券 if (price.compareTo(userCouponRecord.getMoney()) < 0) { price = userCouponRecord.getMoney(); id = userCouponRecord.getId(); type = 1; } } else {//满减券 if (orderCrossCity.getOrderMoney().compareTo(userCouponRecord.getFullMoney()) >= 0 && price.compareTo(userCouponRecord.getMoney()) < 0) { price = userCouponRecord.getMoney(); id = userCouponRecord.getId(); type = 1; } } } //获取打车卡中最优数 Map geocode = gdMapGeocodingUtil.geocode(orderCrossCity.getStartLon().toString(), orderCrossCity.getStartLat().toString()); CompanyCity companyCity = companyCityService.selectOne(new EntityWrapper().eq("companyId", orderCrossCity.getCompanyId()).eq("areaCode", geocode.get("districtCode")).eq("state", 1)); if (null == companyCity) { companyCity = companyCityService.selectOne(new EntityWrapper().eq("companyId", orderCrossCity.getCompanyId()).eq("cityCode", geocode.get("cityCode")).eq("state", 1)); } if (null == companyCity) { companyCity = companyCityService.selectOne(new EntityWrapper().eq("companyId", orderCrossCity.getCompanyId()).eq("provinceCode", geocode.get("provinceCode")).eq("state", 1)); } List userTaxiCards = new ArrayList<>(); if (companyCity != null) { userTaxiCards = userTaxiCardService.selectList(new EntityWrapper().like("companyCityId", "%" + companyCity.getId() + "%") .in("type", Arrays.asList(1, 2, 3, 4)).eq("userId", uid).where("now() between startTime and endTime")); } //全国卡 List taxiCards = taxiCardService.selectList(new EntityWrapper().eq("taxiCardType", 2).in("type", Arrays.asList(1, 2, 3, 4)).eq("state", 1)); if (taxiCards.size() > 0) { List userTaxiCards2 = userTaxiCardService.selectList(new EntityWrapper().eq("userId", uid) .in("type", Arrays.asList(1, 2, 3, 4)).in("taxiCardId", taxiCards.stream().map(TaxiCard::getId).collect(Collectors.toList())).where("now() between startTime and endTime")); userTaxiCards.addAll(userTaxiCards2); } Map map = getOptimalTaxiCards(orderCrossCity, price, id, type, userTaxiCards); price = Double.valueOf(map.get("price").toString()); id = null != map.get("id") ? Integer.valueOf(map.get("id").toString()) : null; type = Integer.valueOf(map.get("type").toString()); //亲密账户 List userTaxiCards_ = new ArrayList<>(); List bindUserId = userUserService.selectList(new EntityWrapper().eq("bindUserId", uid)); CompanyCity finalCompanyCity = companyCity; bindUserId.forEach(userUser -> { if (finalCompanyCity != null) { List userTaxiCards1 = userTaxiCardService.selectList(new EntityWrapper().in("type", Arrays.asList(1, 2, 3, 4)) .like("companyCityId", "%" + finalCompanyCity.getId() + "%").eq("userId", userUser.getUserId()).where("now() between startTime and endTime")); userTaxiCards_.addAll(userTaxiCards1); } //全国卡 if (taxiCards.size() > 0) { List userTaxiCards2 = userTaxiCardService.selectList(new EntityWrapper().eq("userId", userUser.getUserId()) .in("type", Arrays.asList(1, 2, 3, 4)).in("taxiCardId", taxiCards.stream().map(TaxiCard::getId).collect(Collectors.toList())).where("now() between startTime and endTime")); userTaxiCards_.addAll(userTaxiCards2); } }); map = getOptimalTaxiCards(orderCrossCity, price, id, type, userTaxiCards_); price = Double.valueOf(map.get("price").toString()); id = null != map.get("id") ? Integer.valueOf(map.get("id").toString()) : null; type = Integer.valueOf(map.get("type").toString()); if (price <= orderCrossCity.getOrderMoney() || type == 2) { preferentialDataVo.setObjectId(id); preferentialDataVo.setDiscountAmount(price); preferentialDataVo.setType(type); } return preferentialDataVo; } public Map getOptimalTaxiCards(OrderCrossCity orderCrossCity, Double price, Integer id, Integer type, List userTaxiCards) throws Exception { Map map = new HashMap<>(); for (UserTaxiCard t : userTaxiCards) { JSONObject jsonObject = JSON.parseObject(t.getContent()); List integers = jsonObject.getJSONArray("businessTypes").toJavaList(Integer.class); if (!integers.contains(3)) { continue; } if (t.getType() == 1) {//打折次数卡{"businessTypes":[1,2,3],"time":5,"timeQuantum":["08:00:00 - 09:00:00","17:00:00 - 18:00:00"],"discount":5} Integer time = jsonObject.getInteger("time"); if (time == 0) { continue; } JSONArray timeQuantum = jsonObject.getJSONArray("timeQuantum"); Double discount = jsonObject.getDouble("discount"); SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); Date date = new Date(); for (int i = 0; i < timeQuantum.size(); i++) { String[] split = timeQuantum.getString(i).split(" - "); Date s = sdf1.parse(sdf.format(date) + " " + split[0]); Date e = sdf1.parse(sdf.format(date) + " " + split[1]); if (s.getTime() <= System.currentTimeMillis() && System.currentTimeMillis() < e.getTime()) { double v = new BigDecimal(orderCrossCity.getOrderMoney()).multiply(new BigDecimal((10 - discount) / 10)).setScale(2, RoundingMode.HALF_EVEN).doubleValue(); if (price.compareTo(v) < 0) { price = v; id = t.getId(); type = 2; } } } } if (t.getType() == 2) {//优惠卡{"businessTypes":[1,2,3],"fullReduction":[[50,3],[100,5],[150,10]]} JSONArray timeQuantum = jsonObject.getJSONArray("timeQuantum"); JSONArray fullReduction = jsonObject.getJSONArray("fullReduction"); SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); Date date = new Date(); for (int i = 0; i < timeQuantum.size(); i++) { String[] split = timeQuantum.getString(i).split(" - "); Date s = sdf1.parse(sdf.format(date) + " " + split[0]); Date e = sdf1.parse(sdf.format(date) + " " + split[1]); if (s.getTime() <= System.currentTimeMillis() && System.currentTimeMillis() < e.getTime()) { for (int j = fullReduction.size() - 1; j >= 0; j--) { JSONArray jsonArray = fullReduction.getJSONArray(j); Double p = jsonArray.getDouble(0);//满金额 Double y = jsonArray.getDouble(1);//优惠金额 if (orderCrossCity.getOrderMoney().compareTo(p) >= 0 && price.compareTo(y) < 0) { price = y; id = t.getId(); type = 2; } } } } } if (t.getType() == 3) {//次数卡{"businessTypes":[1,2,3],"time":1,"discountAmount":10} Integer time = jsonObject.getInteger("time"); if (time == 0) { continue; } JSONArray timeQuantum = jsonObject.getJSONArray("timeQuantum"); Double discountAmount = jsonObject.getDouble("discountAmount"); SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); Date date = new Date(); for (int i = 0; i < timeQuantum.size(); i++) { String[] split = timeQuantum.getString(i).split(" - "); Date s = sdf1.parse(sdf.format(date) + " " + split[0]); Date e = sdf1.parse(sdf.format(date) + " " + split[1]); if (s.getTime() <= System.currentTimeMillis() && System.currentTimeMillis() < e.getTime()) { if (price.compareTo(discountAmount) < 0) { price = discountAmount; id = t.getId(); type = 2; } } } } if (t.getType() == 4) {//打折天数卡{"businessTypes":[1,2,3],"discount":5,"timeQuantum":["08:00:00 - 09:00:00","17:00:00 - 18:00:00"]} Double discount = jsonObject.getDouble("discount");//折扣 JSONArray timeQuantum = jsonObject.getJSONArray("timeQuantum");//使用时间段 SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); Date date = new Date(); for (int i = 0; i < timeQuantum.size(); i++) { String[] split = timeQuantum.getString(i).split(" - "); Date s = sdf1.parse(sdf.format(date) + " " + split[0]); Date e = sdf1.parse(sdf.format(date) + " " + split[1]); if (s.getTime() <= System.currentTimeMillis() && System.currentTimeMillis() < e.getTime()) { double v = new BigDecimal(orderCrossCity.getOrderMoney()).multiply(new BigDecimal((10 - discount) / 10)).setScale(2, RoundingMode.HALF_EVEN).doubleValue(); if (price.compareTo(v) < 0) { price = v; id = t.getId(); type = 2; } } } } } map.put("price", price); map.put("id", id); map.put("type", type); return map; } /** * 获取支付页面的优惠券列表 * * @param orderId * @param uid * @param pageNum * @param size * @return * @throws Exception */ @Override public List> 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; } @Override public List queryCouponList(Integer orderId, Integer uid, Integer pageNum, Integer size) throws Exception { pageNum = (pageNum - 1) * size; OrderCrossCity orderCrossCity = this.selectById(orderId); List rows = new ArrayList<>(); List list = userCouponRecordService.selectList(new EntityWrapper().eq("companyId", orderCrossCity.getCompanyId()) .eq("state", 1).in("couponUseType", Arrays.asList(0, 3)).eq("userId", uid).where("expirationTime >= now()")); SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); for (UserCouponRecord userCouponRecord : list) { if (userCouponRecord.getCouponType() == 2) {//满减券 if (orderCrossCity.getOrderMoney().compareTo(userCouponRecord.getFullMoney()) < 0) { continue; } } CouponsListVo couponsListVo = new CouponsListVo(); couponsListVo.setId(userCouponRecord.getId()); couponsListVo.setDataType(1); couponsListVo.setMoney(userCouponRecord.getMoney()); couponsListVo.setUserType(userCouponRecord.getCouponUseType()); couponsListVo.setTime(sdf.format(userCouponRecord.getExpirationTime())); couponsListVo.setType(userCouponRecord.getCouponType()); couponsListVo.setFullMoney(userCouponRecord.getFullMoney()); couponsListVo.setState(userCouponRecord.getState()); Company company = companyService.selectById(userCouponRecord.getCompanyId()); couponsListVo.setCompany(company.getName()); rows.add(couponsListVo); } Map geocode = gdMapGeocodingUtil.geocode(orderCrossCity.getStartLon().toString(), orderCrossCity.getStartLat().toString()); CompanyCity companyCity = companyCityService.selectOne(new EntityWrapper().eq("companyId", orderCrossCity.getCompanyId()).eq("areaCode", geocode.get("districtCode")).eq("state", 1)); if (null == companyCity) { companyCity = companyCityService.selectOne(new EntityWrapper().eq("companyId", orderCrossCity.getCompanyId()).eq("cityCode", geocode.get("cityCode")).eq("state", 1)); } if (null == companyCity) { companyCity = companyCityService.selectOne(new EntityWrapper().eq("companyId", orderCrossCity.getCompanyId()).eq("provinceCode", geocode.get("provinceCode")).eq("state", 1)); } List userTaxiCards = userTaxiCardService.selectList(new EntityWrapper().eq("userId", uid) .in("type", Arrays.asList(1, 2, 3, 4)).like("companyCityId", "%" + companyCity.getId() + "%").where("now() between startTime and endTime")); //全国卡 List taxiCards = taxiCardService.selectList(new EntityWrapper().eq("taxiCardType", 2).in("type", Arrays.asList(1, 2, 3, 4)).eq("state", 1)); if (taxiCards.size() > 0) { List userTaxiCards1 = userTaxiCardService.selectList(new EntityWrapper().eq("userId", uid) .in("type", Arrays.asList(1, 2, 3, 4)).in("taxiCardId", taxiCards.stream().map(TaxiCard::getId).collect(Collectors.toList())).where("now() between startTime and endTime")); userTaxiCards.addAll(userTaxiCards1); } //亲密账户 List bindUserId = userUserService.selectList(new EntityWrapper().eq("bindUserId", uid)); CompanyCity finalCompanyCity = companyCity; bindUserId.forEach(userUser -> { List taxiCardPayments1 = userTaxiCardService.selectList(new EntityWrapper().in("type", Arrays.asList(1, 2, 3, 4)) .like("companyCityId", "%" + finalCompanyCity.getId() + "%").eq("userId", userUser.getUserId()).where("now() between startTime and endTime")); userTaxiCards.addAll(taxiCardPayments1); //全国卡 if (taxiCards.size() > 0) { List userTaxiCards1 = userTaxiCardService.selectList(new EntityWrapper().eq("userId", userUser.getUserId()) .in("type", Arrays.asList(1, 2, 3, 4)).in("taxiCardId", taxiCards.stream().map(TaxiCard::getId).collect(Collectors.toList())).where("now() between startTime and endTime")); userTaxiCards.addAll(userTaxiCards1); } }); for (UserTaxiCard t : userTaxiCards) { try { CouponsListVo couponsListVo = new CouponsListVo(); couponsListVo.setId(t.getId()); couponsListVo.setDataType(2); couponsListVo.setUserType(1); couponsListVo.setTaxiCardType(t.getType()); couponsListVo.setTime(sdf.format(t.getEndTime())); couponsListVo.setState(1); Company company = companyService.selectById(t.getCompanyId()); couponsListVo.setCompany(company.getName()); couponsListVo.setName(taxiCardService.selectById(t.getTaxiCardId()).getName()); JSONObject jsonObject = JSON.parseObject(t.getContent()); JSONArray businessTypes = jsonObject.getJSONArray("businessTypes"); if (!businessTypes.toJavaList(Integer.class).contains(3)) { continue; } if (t.getType() == 1) {//{"businessTypes":[1,2,3],"time":5,"timeQuantum":["08:00:00 - 09:00:00","17:00:00 - 18:00:00"],"discount":5} Integer time = jsonObject.getInteger("time"); if (time == 0) { continue; } JSONArray timeQuantum = jsonObject.getJSONArray("timeQuantum"); SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd"); boolean b = true; for (int i = 0; i < timeQuantum.size(); i++) { String[] split = timeQuantum.getString(i).split(" - "); Date s = sdf.parse(sdf1.format(new Date()) + " " + split[0]); Date e = sdf.parse(sdf1.format(new Date()) + " " + split[1]); if (s.getTime() <= System.currentTimeMillis() && System.currentTimeMillis() < e.getTime()) { b = false; break; } } if (b) { continue; } couponsListVo.setMoney(jsonObject.getDouble("discount")); couponsListVo.setType(1); } if (t.getType() == 2) {//{"businessTypes":[1,2,3],"fullReduction":[[50,3],[100,5],[150,10]]} JSONArray timeQuantum = jsonObject.getJSONArray("timeQuantum"); SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd"); boolean b = true; for (int i = 0; i < timeQuantum.size(); i++) { String[] split = timeQuantum.getString(i).split(" - "); Date s = sdf.parse(sdf1.format(new Date()) + " " + split[0]); Date e = sdf.parse(sdf1.format(new Date()) + " " + split[1]); if (s.getTime() <= System.currentTimeMillis() && System.currentTimeMillis() < e.getTime()) { b = false; break; } } if (b) { continue; } JSONArray fullReduction = jsonObject.getJSONArray("fullReduction"); b = true; for (int i = fullReduction.size() - 1; i >= 0; i--) { Double m = fullReduction.getJSONArray(i).getDouble(0); Double y = fullReduction.getJSONArray(i).getDouble(1); if (m.compareTo(orderCrossCity.getOrderMoney()) <= 0) { couponsListVo.setMoney(y); couponsListVo.setFullMoney(m); b = false; break; } } if (b) { continue; } couponsListVo.setType(2); } if (t.getType() == 3) {//{"businessTypes":[1,2,3],"time":1,"discountAmount":10} Integer time = jsonObject.getInteger("time"); if (time == 0) { continue; } JSONArray timeQuantum = jsonObject.getJSONArray("timeQuantum"); SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd"); boolean b = true; for (int i = 0; i < timeQuantum.size(); i++) { String[] split = timeQuantum.getString(i).split(" - "); Date s = sdf.parse(sdf1.format(new Date()) + " " + split[0]); Date e = sdf.parse(sdf1.format(new Date()) + " " + split[1]); if (s.getTime() <= System.currentTimeMillis() && System.currentTimeMillis() < e.getTime()) { b = false; break; } } if (b) { continue; } couponsListVo.setMoney(jsonObject.getDouble("discountAmount")); couponsListVo.setType(2); } if (t.getType() == 4) {//{"businessTypes":[1,2,3],"discount":5,"timeQuantum":["08:00:00 - 09:00:00","17:00:00 - 18:00:00"]} JSONArray timeQuantum = jsonObject.getJSONArray("timeQuantum"); SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd"); boolean b = true; for (int i = 0; i < timeQuantum.size(); i++) { String[] split = timeQuantum.getString(i).split(" - "); Date s = sdf.parse(sdf1.format(new Date()) + " " + split[0]); Date e = sdf.parse(sdf1.format(new Date()) + " " + split[1]); if (s.getTime() <= System.currentTimeMillis() && System.currentTimeMillis() < e.getTime()) { b = false; break; } } if (b) { continue; } couponsListVo.setMoney(jsonObject.getDouble("discount")); couponsListVo.setType(1); } String str = ""; TaxiCard taxiCard = taxiCardService.selectById(t.getTaxiCardId()); if (taxiCard.getTaxiCardType() == 1) { String[] split = taxiCard.getCompanyCityId().split(";"); for (String c : split) { CompanyCity companyCity1 = companyCityService.selectById(c); if (ToolUtil.isNotEmpty(companyCity1.getAreaCode())) { Region region = regionService.selectOne(new EntityWrapper().eq("code", companyCity1.getAreaCode())); str += region.getName() + ";"; continue; } if (ToolUtil.isNotEmpty(companyCity1.getCityCode())) { Region region = regionService.selectOne(new EntityWrapper().eq("code", companyCity1.getCityCode())); str += region.getName() + ";"; continue; } if (ToolUtil.isNotEmpty(companyCity1.getProvinceCode())) { Region region = regionService.selectOne(new EntityWrapper().eq("code", companyCity1.getProvinceCode())); str += region.getName() + ";"; continue; } } } else { str = "全国;"; } couponsListVo.setCity(str.substring(0, str.length() - 1)); rows.add(couponsListVo); } catch (Exception e) { e.printStackTrace(); } } Collections.sort(rows, new Comparator() { public int compare(CouponsListVo s1, CouponsListVo s2) { return Integer.compare(s1.getId(), s2.getId()); } }); if (rows.size() >= (pageNum + 1) * size) { rows = rows.subList(pageNum, pageNum + size); } else if (pageNum < rows.size() && rows.size() < (pageNum + 1) * size) { rows = rows.subList(pageNum, rows.size()); } else { rows = new ArrayList<>(); } rows = rows.stream().filter(e -> e.getMoney() <= orderCrossCity.getOrderMoney() || e.getDataType() == 2).collect(Collectors.toList()); return rows; } /** * 订单支付 * * @param payType * @param orderId * @param couponId * @param type * @return * @throws Exception */ @Override public ResultUtil payCrossCityOrder(Integer payType, Integer orderId, Integer couponId, Integer type) throws Exception { OrderCrossCity orderCrossCity = this.selectById(orderId); if (orderCrossCity.getState() != 7) { return ResultUtil.error("订单已完成支付,不允许重复支付", ""); } Integer uid = orderCrossCity.getUserId(); Double orderMoney = orderCrossCity.getOrderMoney(); UserInfo userInfo = userInfoService.selectById(uid); ResultUtil resultUtil = ResultUtil.success(new Object()); orderCrossCity.setCouponMoney(0D);//初始化历史数据 orderCrossCity.setCouponId(null); //计算优惠券 UserCouponRecord userCouponRecord = null; if (null != couponId) { userCouponRecord = userCouponRecordService.selectById(couponId); if (null != userCouponRecord) { if (userCouponRecord.getCompanyId() != orderCrossCity.getCompanyId()) { return ResultUtil.error("优惠券不能用于此订单", ""); } if (userCouponRecord.getState() == 2) { return ResultUtil.error("优惠券已使用", ""); } if (userCouponRecord.getState() == 3) { return ResultUtil.error("优惠券已过期", ""); } if (userCouponRecord.getCouponUseType() != 0 && userCouponRecord.getCouponUseType() != 3) { return ResultUtil.error("优惠券不能用于此类型订单", ""); } if (userCouponRecord.getCouponType() == 2 && orderMoney.compareTo(userCouponRecord.getFullMoney()) < 0) { return ResultUtil.error("优惠券不能用于此订单", ""); } orderMoney = orderMoney - userCouponRecord.getMoney(); orderCrossCity.setCouponMoney(userCouponRecord.getMoney()); orderCrossCity.setCouponId(couponId); } } //计算红包 UserRedPacketRecord query = userRedPacketRecordService.query(uid, orderCrossCity.getCompanyId(), 1, 3, orderMoney); if (null != query && orderMoney.compareTo(query.getMoney()) > 0) { orderMoney = orderMoney - query.getMoney(); orderCrossCity.setRedPacketMoney(query.getMoney()); orderCrossCity.setRedPacketId(query.getId()); } //计算折扣 UserActivityDiscount1 query2 = userActivityDiscount1Mapper.query(orderCrossCity.getCompanyId()); if (null != query2) { Double special = query2.getSpecial(); orderCrossCity.setDiscount(special); double v = new BigDecimal(orderMoney).multiply(new BigDecimal(special / 10)).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue(); if (orderMoney.compareTo(v) > 0) { orderCrossCity.setDiscountMoney(orderMoney - v); orderCrossCity.setActivityId(query2.getId()); orderMoney = v; } } if (payType == 1) {//微信支付 String app = type == 1 ? "APP" : "JSAPI"; resultUtil = payMoneyUtil.weixinpay("完成订单", "", orderId + "_3_" + UUIDUtil.getRandomCode(5), orderMoney.toString(), "/base/wxPayOrderTaxi", app, userInfo.getAppletsOpenId()); paymentRecordService.saveData(1, orderCrossCity.getUserId(), 1, orderId, 3, 1, orderMoney, "", 1);//添加预支付数据 } if (payType == 2) {//支付宝支付 resultUtil = payMoneyUtil.alipay("完成订单", "完成订单", "", orderId + "_3_" + UUIDUtil.getRandomCode(5), orderMoney.toString(), "/base/aliPayOrderTaxi"); paymentRecordService.saveData(1, orderCrossCity.getUserId(), 1, orderId, 3, 2, orderMoney, "", 1);//添加预支付数据 } if (payType == 3) {//余额支付 if (userInfo.getBalance() == null || userInfo.getBalance() < orderMoney) { return ResultUtil.error("余额不足,无法完成支付", ""); } userInfo.setBalance(new BigDecimal(userInfo.getBalance()).subtract(new BigDecimal(orderMoney)).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue()); OpenCity openCity = openCityService.openCity1(orderCrossCity.getStartLon().toString(), orderCrossCity.getStartLat().toString()); SysIntegral query1 = sysIntegralMapper.query(openCity.getId()); if(null != query1){ 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); orderCrossCity.setPayTime(new Date()); //处理优惠券和红包 if (null != userCouponRecord) { userCouponRecord.setState(2); userCouponRecord.setEndTime(new Date()); userCouponRecordService.updateById(userCouponRecord); } if (null != query) { query.setState(2); query.setEndTime(new Date()); userRedPacketRecordService.updateById(query); } // TODO: 2020/5/24 这里需要给司机和用户推送订单状态 new Thread(new Runnable() { @Override public void run() { pushUtil.pushOrderState(1, orderCrossCity.getUserId(), orderCrossCity.getId(), 3, orderCrossCity.getState(), 0); pushUtil.pushOrderState(2, orderCrossCity.getDriverId(), orderCrossCity.getId(), 3, orderCrossCity.getState(), 0); pushUtil.pushDriverPosition(orderCrossCity.getId(), 3); } }).start(); systemNoticeService.addSystemNotice(1, "您已使用余额成功完成出行订单支付,谢谢使用!", uid, 1); } this.updateAllColumnById(orderCrossCity); return resultUtil; } @Override @Transactional(propagation = Propagation.REQUIRES_NEW) public ResultUtil payCrossCityOrder1(Integer payType, Integer orderId, Integer objectId, Integer objectType, Integer type, String path, String ip, Integer role, String jscode) throws Exception { OrderCrossCity orderCrossCity = this.selectById(orderId); Integer uid = orderCrossCity.getUserId(); UserInfo userInfo = userInfoService.selectById(uid); String appletsOpenId = userInfo.getAppletsOpenId(); //司机端发起的支付 if(null != role && 2 == role){ Driver driver = driverService.selectById(orderCrossCity.getDriverId()); appletsOpenId = driver.getAppletsOpenId(); if(ToolUtil.isNotEmpty(appletsOpenId)){ Map stringMap = weChatUtil.code2Session(jscode); appletsOpenId = stringMap.get("openid"); driver.setAppletsOpenId(appletsOpenId); driverService.updateById(driver); } } if (orderCrossCity.getState() != 7) { return ResultUtil.error("订单已完成支付,不允许重复支付", ""); } Double orderMoney = orderCrossCity.getOrderMoney(); ResultUtil resultUtil = ResultUtil.success(new Object()); orderCrossCity.setCouponMoney(0D);//初始化历史数据 orderCrossCity.setCouponId(null); //计算优惠券 UserCouponRecord userCouponRecord = null; if (null != objectId && 1 == objectType) { userCouponRecord = userCouponRecordService.selectById(objectId); if (userCouponRecord.getCompanyId() != orderCrossCity.getCompanyId()) { return ResultUtil.error("优惠券不能用于此订单", ""); } if (userCouponRecord.getState() == 2) { return ResultUtil.error("优惠券已使用", ""); } if (userCouponRecord.getState() == 3) { return ResultUtil.error("优惠券已过期", ""); } if (userCouponRecord.getCouponUseType() != 0 && userCouponRecord.getCouponUseType() != 3) { return ResultUtil.error("优惠券不能用于此类型订单", ""); } if (userCouponRecord.getCouponType() == 2 && orderMoney.compareTo(userCouponRecord.getFullMoney()) < 0) { return ResultUtil.error("优惠券不能用于此订单", ""); } orderMoney = orderMoney - userCouponRecord.getMoney(); orderCrossCity.setCouponMoney(userCouponRecord.getMoney()); orderCrossCity.setCouponId(objectId); } //打车卡 UserTaxiCard userTaxiCard = null; if (null != objectId && objectType == 2) { userTaxiCard = userTaxiCardService.selectById(objectId); TaxiCard taxiCard = taxiCardService.selectById(userTaxiCard.getTaxiCardId()); if (taxiCard.getTaxiCardType() == 1 && userTaxiCard.getCompanyId() != orderCrossCity.getCompanyId()) { return ResultUtil.error("打车卡不能用于此订单", ""); } if (System.currentTimeMillis() > userTaxiCard.getEndTime().getTime()) { return ResultUtil.error("打车卡已过期", ""); } if (userTaxiCard.getType() == 1 || userTaxiCard.getType() == 3) { Integer time = JSON.parseObject(userTaxiCard.getContent()).getInteger("time"); if (0 == time) { return ResultUtil.error("打车卡已使用完", ""); } } List integers = JSON.parseObject(userTaxiCard.getContent()).getJSONArray("businessTypes").toJavaList(Integer.class); if (!integers.contains(3)) { return ResultUtil.error("打车卡不能用于此类型订单", ""); } Double yh = 0D; JSONObject jsonObject = JSON.parseObject(userTaxiCard.getContent()); if (userTaxiCard.getType() == 1) {//打折次数卡{"businessTypes":[1,2,3],"time":5,"timeQuantum":["08:00:00 - 09:00:00","17:00:00 - 18:00:00"],"discount":5} JSONArray timeQuantum = jsonObject.getJSONArray("timeQuantum"); Double discount = jsonObject.getDouble("discount"); SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); Date date = new Date(); for (int i = 0; i < timeQuantum.size(); i++) { String[] split = timeQuantum.getString(i).split(" - "); Date s = sdf1.parse(sdf.format(date) + " " + split[0]); Date e = sdf1.parse(sdf.format(date) + " " + split[1]); if (s.getTime() <= System.currentTimeMillis() && System.currentTimeMillis() < e.getTime()) { yh = new BigDecimal(orderCrossCity.getOrderMoney()).multiply(new BigDecimal((10 - discount) / 10)).setScale(2, RoundingMode.HALF_EVEN).doubleValue(); jsonObject.put("time", jsonObject.getInteger("time") - 1); userTaxiCard.setContent(jsonObject.toJSONString()); break; } } } if (userTaxiCard.getType() == 2) {//优惠卡{"businessTypes":[1,2,3],"fullReduction":[[50,3],[100,5],[150,10]]} JSONArray timeQuantum = jsonObject.getJSONArray("timeQuantum"); JSONArray fullReduction = jsonObject.getJSONArray("fullReduction"); SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); Date date = new Date(); for (int i = 0; i < timeQuantum.size(); i++) { String[] split = timeQuantum.getString(i).split(" - "); Date s = sdf1.parse(sdf.format(date) + " " + split[0]); Date e = sdf1.parse(sdf.format(date) + " " + split[1]); if (s.getTime() <= System.currentTimeMillis() && System.currentTimeMillis() < e.getTime()) { for (int j = fullReduction.size() - 1; j >= 0; j--) { JSONArray jsonArray = fullReduction.getJSONArray(j); Double p = jsonArray.getDouble(0);//满金额 if (orderCrossCity.getOrderMoney().compareTo(p) >= 0) { yh = jsonArray.getDouble(1);//优惠金额 break; } } } } } if (userTaxiCard.getType() == 3) {//次数卡{"businessTypes":[1,2,3],"time":1,"discountAmount":10} JSONArray timeQuantum = jsonObject.getJSONArray("timeQuantum"); SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); Date date = new Date(); for (int i = 0; i < timeQuantum.size(); i++) { String[] split = timeQuantum.getString(i).split(" - "); Date s = sdf1.parse(sdf.format(date) + " " + split[0]); Date e = sdf1.parse(sdf.format(date) + " " + split[1]); if (s.getTime() <= System.currentTimeMillis() && System.currentTimeMillis() < e.getTime()) { yh = jsonObject.getDouble("discountAmount"); jsonObject.put("time", jsonObject.getInteger("time") - 1); userTaxiCard.setContent(jsonObject.toJSONString()); } } } if (userTaxiCard.getType() == 4) {//打折天数卡{"businessTypes":[1,2,3],"discount":5,"timeQuantum":["08:00:00 - 09:00:00","17:00:00 - 18:00:00"]} Double discount = jsonObject.getDouble("discount");//折扣 JSONArray timeQuantum = jsonObject.getJSONArray("timeQuantum");//使用时间段 SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); Date date = new Date(); for (int i = 0; i < timeQuantum.size(); i++) { String[] split = timeQuantum.getString(i).split(" - "); Date s = sdf1.parse(sdf.format(date) + " " + split[0]); Date e = sdf1.parse(sdf.format(date) + " " + split[1]); if (s.getTime() <= System.currentTimeMillis() && System.currentTimeMillis() < e.getTime()) { yh = new BigDecimal(orderCrossCity.getOrderMoney()).multiply(new BigDecimal((10 - discount) / 10)).setScale(2, RoundingMode.HALF_EVEN).doubleValue(); break; } } } orderMoney = orderMoney - yh; orderCrossCity.setTaxiCardId(userTaxiCard.getTaxiCardId()); orderCrossCity.setUserTaxiCardId(objectId); orderCrossCity.setDiscountAmount(yh); } //计算红包 UserRedPacketRecord query = userRedPacketRecordService.query(uid, orderCrossCity.getCompanyId(), 1, 3, orderMoney); if (null != query && orderMoney.compareTo(query.getMoney()) > 0) { orderMoney = orderMoney - query.getMoney(); orderCrossCity.setRedPacketMoney(query.getMoney()); orderCrossCity.setRedPacketId(query.getId()); } //计算折扣 UserActivityDiscount1 query2 = userActivityDiscount1Mapper.query(orderCrossCity.getCompanyId()); if (null != query2) { Double special = query2.getSpecial(); orderCrossCity.setDiscount(special); double v = new BigDecimal(orderMoney).multiply(new BigDecimal(special / 10)).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue(); if (orderMoney.compareTo(v) > 0) { orderCrossCity.setDiscountMoney(orderMoney - v); orderCrossCity.setActivityId(query2.getId()); orderMoney = v; } } orderMoney = new BigDecimal(orderMoney).setScale(2, RoundingMode.HALF_UP).doubleValue(); orderMoney = orderMoney < 0 ? 0 : orderMoney; System.out.println("!!!!!!" + orderMoney + "!!!!!!!"); if (payType == 1) {//微信支付 if (orderMoney == 0) { return ResultUtil.error("请使用余额支付"); } // String app = type == 1 ? "APP" : "JSAPI"; // resultUtil = payMoneyUtil.weixinpay("完成订单", "", orderId + "_3_" + UUIDUtil.getRandomCode(5), orderMoney.toString(), "/base/wxPayOrderTaxi", app, userInfo.getAppletsOpenId()); if(ToolUtil.isEmpty(appletsOpenId)){ return ResultUtil.error("获取微信身份信息失败,无法发起支付"); } //创建订单并拉起支付(这里不需要创建行程单,由三方处理) Driver driver = driverService.selectById(orderCrossCity.getDriverId()); if(null == orderCrossCity.getIsCreated() || 0 == orderCrossCity.getIsCreated()){ //调用中台创建订单及拉起支付接口 TradeOrderCreateData tradeOrderCreateData = new TradeOrderCreateData(); tradeOrderCreateData.setTreatShopId(driver.getEmpId().toString()); //追缴单不要分账 if(0 == orderCrossCity.getRecoveryOrder()){ tradeOrderCreateData.setField1("{\"profitSharing\":\"1\",\"isCompensate\":\"0\",\"isPromote\":\"" + (orderCrossCity.getPromotion() == 2 ? 1 : 0) + "\"}"); }else{ tradeOrderCreateData.setField1("{\"profitSharing\":\"0\",\"isCompensate\":\"1\",\"isPromote\":\"0\"}"); } tradeOrderCreateData.setCharge(new BigDecimal(orderMoney).setScale(2, RoundingMode.HALF_EVEN)); tradeOrderCreateData.setOrderNo("CC" + orderCrossCity.getId()); tradeOrderCreateData.setCustomerId(userInfo.getOnconUUID()); tradeOrderCreateData.setPartnerPayId(orderCrossCity.getTravelId()); tradeOrderCreateData.setTotalFee(Double.valueOf(orderMoney * 100).intValue() + ""); tradeOrderCreateData.setOrderDesc("完成订单"); tradeOrderCreateData.setRetUrl(path); tradeOrderCreateData.setClientIp(ip); tradeOrderCreateData.setServiceType(3); if(null != orderCrossCity.getPromotionDriverId()){ Driver driver1 = driverService.selectById(orderCrossCity.getPromotionDriverId()); Company company = companyService.selectById(driver1.getCompanyId()); tradeOrderCreateData.setPromoterId(driver1.getEmpId().toString()); tradeOrderCreateData.setSupplierShopId(company.getEnterCode()); } List goodsInfo = new ArrayList<>(); GoodsInfoRequest goodsInfoRequest = new GoodsInfoRequest(); goodsInfoRequest.setSubOpenId(appletsOpenId); if(0 == orderCrossCity.getRecoveryOrder()){ goodsInfoRequest.setProfitSharing("1"); }else{ goodsInfoRequest.setProfitSharing("0"); goodsInfoRequest.setSettleDate(LocalDate.now().format(DateTimeFormatter.ofPattern("yyyyMMdd"))); } goodsInfo.add(goodsInfoRequest); tradeOrderCreateData.setGoodsInfo(goodsInfo); TradeOrderCreate tradeOrderCreate = OrderUtil.tradeOrderCreate1(tradeOrderCreateData, orderCrossCity.getRecoveryOrder()); PayInfo payInfo = tradeOrderCreate.getPayInfo(); if(!"000000".equals(payInfo.getRetCode())){ return ResultUtil.error(payInfo.getRetMsg()); } orderCrossCity.setIsCreated(1); orderCrossCity.setTravelId(tradeOrderCreate.getOrderInfo().getOrderId()); resultUtil = ResultUtil.success(payInfo.getData().getRedirectUrl()); }else{ //拉起支付 TradePayOff1Data tradePayOff1Data = new TradePayOff1Data(); tradePayOff1Data.setPartnerPayId(orderCrossCity.getTravelId()); tradePayOff1Data.setTotalFee(Double.valueOf(orderMoney * 100).intValue() + ""); tradePayOff1Data.setRetUrl(path); tradePayOff1Data.setClientIp(ip); tradePayOff1Data.setOrderDesc("完成订单"); List goodsInfo = new ArrayList<>(); GoodsInfoRequest goodsInfoRequest = new GoodsInfoRequest(); goodsInfoRequest.setSubOpenId(appletsOpenId); if(0 == orderCrossCity.getRecoveryOrder()){ goodsInfoRequest.setProfitSharing("1"); }else{ goodsInfoRequest.setProfitSharing("0"); goodsInfoRequest.setSettleDate(LocalDate.now().format(DateTimeFormatter.ofPattern("yyyyMMdd"))); } goodsInfo.add(goodsInfoRequest); tradePayOff1Data.setGoodsInfo(goodsInfo); PayInfo payInfo = OrderUtil.tradePayOff1(tradePayOff1Data, orderCrossCity.getRecoveryOrder()); if(!"000000".equals(payInfo.getRetCode())){ return ResultUtil.error(payInfo.getRetMsg()); } resultUtil = ResultUtil.success(payInfo.getData().getRedirectUrl()); } this.updateById(orderCrossCity); paymentRecordService.saveData(1, orderCrossCity.getUserId(), 1, orderId, 3, 1, orderMoney, "", 1);//添加预支付数据 //创建定时任务查询订单支付状态 ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(1, 1, 0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue()); threadPoolExecutor.execute(()->{ try { int num = 1; int wait = 0; while (num <= 13) { int min = 5000; wait += (min * num); OrderCrossCity orderCrossCity1 = this.selectById(orderCrossCity.getId()); if (orderCrossCity1.getState() != 7) { break; } GetTravelItineraryListRequest request = new GetTravelItineraryListRequest(); request.setCustomerId(userInfo.getOnconUUID()); request.setOrderNo("CC" + orderCrossCity1.getId()); request.setDriverId(driver.getEmpId().toString()); ListPage> travelItineraryList = OrderUtil.getTravelItineraryList(request); TravelItinerary travelItinerary = travelItineraryList.getList().get(0); if(travelItinerary.getStatus() != 7 || Arrays.asList(3, 11).contains(travelItinerary.getOrderStatus())){ GetPaymentInfoDataRequest getPaymentInfoDataRequest1 = new GetPaymentInfoDataRequest(); getPaymentInfoDataRequest1.setPartnerPayId(orderCrossCity.getTravelId()); GetPaymentInfo getPaymentInfo1 = OrderUtil.paymentInfo(getPaymentInfoDataRequest1); payOrderCrossCityCallback(orderCrossCity1.getId(), getPaymentInfo1.getPayId(), 1, null); break; } Thread.sleep(wait); num++; } } catch (Exception e) { e.printStackTrace(); }finally { threadPoolExecutor.shutdown(); } }); } if (payType == 2) {//支付宝支付 if (orderMoney == 0) { return ResultUtil.error("请使用余额支付"); } resultUtil = payMoneyUtil.alipay("完成订单", "完成订单", "", orderId + "_3_" + UUIDUtil.getRandomCode(5), orderMoney.toString(), "/base/aliPayOrderTaxi"); paymentRecordService.saveData(1, orderCrossCity.getUserId(), 1, orderId, 3, 2, orderMoney, "", 1);//添加预支付数据 } if (payType == 3) {//余额支付 if (userInfo.getBalance() == null || userInfo.getBalance() < orderMoney) { return ResultUtil.error("余额不足,无法完成支付"); } userInfo.setBalance(new BigDecimal(userInfo.getBalance()).subtract(new BigDecimal(orderMoney)).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue()); OpenCity openCity = openCityService.openCity1(orderCrossCity.getStartLon().toString(), orderCrossCity.getStartLat().toString()); SysIntegral query1 = sysIntegralMapper.query(openCity.getId()); if(null != query1){ userInfo.setIntegral(userInfo.getIntegral() + (orderMoney.intValue() * query1.getIntegral()));//积分 userInfoService.updateById(userInfo); } //添加交易明细 transactionDetailsService.saveData(uid, "跨城出行订单", orderMoney, 2, 1, 1, 3, orderId); orderCrossCity.setState(2);//跨城支付完成后才开始服务 orderCrossCity.setPayType(3); orderCrossCity.setPayMoney(orderMoney); orderCrossCity.setPayTime(new Date()); //处理优惠券和红包 if (null != userCouponRecord) { userCouponRecord.setState(2); userCouponRecord.setEndTime(new Date()); userCouponRecordService.updateById(userCouponRecord); } //处理打车卡 if (null != userTaxiCard) { userTaxiCardService.updateById(userTaxiCard); } if (null != query) { query.setState(2); query.setEndTime(new Date()); userRedPacketRecordService.updateById(query); } // TODO: 2020/5/24 这里需要给司机和用户推送订单状态 new Thread(new Runnable() { @Override public void run() { pushUtil.pushOrderState(1, orderCrossCity.getUserId(), orderCrossCity.getId(), 3, orderCrossCity.getState(), 0); pushUtil.pushOrderState(2, orderCrossCity.getDriverId(), orderCrossCity.getId(), 3, orderCrossCity.getState(), 0); pushUtil.pushDriverPosition(orderCrossCity.getId(), 3); } }).start(); systemNoticeService.addSystemNotice(1, "您已使用余额成功完成出行订单支付,谢谢使用!", uid, 1); } else if (payType == 4) { if (orderMoney == 0) { return ResultUtil.error("请使用余额支付"); } Double payMoney = orderCrossCity.getOrderMoney(); Integer integer = paymentRecordService.saveData(1, orderCrossCity.getUserId(), 1, orderId, 3, 4, orderMoney, "", 1); resultUtil = appOrderController.placeAnOrder(new BigDecimal(orderMoney), 4, orderId, 3, integer); } this.updateAllColumnById(orderCrossCity); return resultUtil; } @Autowired private AppOrderController appOrderController; /** * 支付成功后的回调操作 * * @param id 订单=id * @param order_id 工行支付单号 * @param type 1=微信,2=支付宝 * @throws Exception */ @Override public void payOrderCrossCityCallback(Integer id, String order_id, Integer type, String no) throws Exception { OrderCrossCity orderCrossCity = this.selectById(id); PaymentRecord query = paymentRecordService.query(1, orderCrossCity.getUserId(), 1, Integer.valueOf(id), 3, type, 1); if (null != query && query.getState() == 1) { //添加交易明细 transactionDetailsService.saveData(orderCrossCity.getUserId(), "跨城出行订单", query.getAmount(), 2, 1, 1, 3, query.getOrderId()); orderCrossCity.setState(2);//先支付再服务 orderCrossCity.setPayType(type); orderCrossCity.setPayMoney(query.getAmount()); orderCrossCity.setBillNo(no); orderCrossCity.setPayTime(new Date()); this.updateById(orderCrossCity); UserInfo userInfo = userInfoService.selectById(orderCrossCity.getUserId()); OpenCity openCity = openCityService.openCity1(orderCrossCity.getStartLon().toString(), orderCrossCity.getStartLat().toString()); if(null != openCity){ SysIntegral query1 = sysIntegralMapper.query(openCity.getId()); if(null != query1){ userInfo.setIntegral(userInfo.getIntegral() + (query.getAmount().intValue() * query1.getIntegral()));//积分 userInfoService.updateById(userInfo); } } //处理优惠券和红包 if (null != orderCrossCity.getCouponId()) { UserCouponRecord userCouponRecord = userCouponRecordService.selectById(orderCrossCity.getCouponId()); userCouponRecord.setState(2); userCouponRecord.setEndTime(new Date()); userCouponRecordService.updateById(userCouponRecord); } if (null != orderCrossCity.getUserTaxiCardId()) { UserTaxiCard userTaxiCard = userTaxiCardService.selectById(orderCrossCity.getUserTaxiCardId()); if (userTaxiCard.getType() == 1 || userTaxiCard.getType() == 3) { JSONObject jsonObject = JSON.parseObject(userTaxiCard.getContent()); jsonObject.put("time", jsonObject.getInteger("time") - 1); userTaxiCard.setContent(jsonObject.toJSONString()); userTaxiCardService.updateById(userTaxiCard); } } if (null != orderCrossCity.getRedPacketId()) { UserRedPacketRecord userRedPacketRecord = userRedPacketRecordService.selectById(orderCrossCity.getRedPacketId()); userRedPacketRecord.setState(2); userRedPacketRecord.setEndTime(new Date()); userRedPacketRecordService.updateById(userRedPacketRecord); } query.setState(2); query.setCode(order_id); paymentRecordService.updateById(query); // TODO: 2020/5/24 这里需要给司机和用户推送订单状态 new Thread(new Runnable() { @Override public void run() { pushUtil.pushOrderState(1, orderCrossCity.getUserId(), orderCrossCity.getId(), 3, orderCrossCity.getState(), 0); pushUtil.pushOrderState(2, orderCrossCity.getDriverId(), orderCrossCity.getId(), 3, orderCrossCity.getState(), 0); pushUtil.pushDriverPosition(orderCrossCity.getId(), 3); } }).start(); systemNoticeService.addSystemNotice(1, "您已使用" + (type == 1 ? "微信" : (type == 2 ? "支付宝" : "云闪付")) + "成功完成出行订单支付,谢谢使用!", orderCrossCity.getUserId(), 1); } else { System.err.println("预支付数据异常(orderId = " + id + ")"); } } /** * 跨城下单操作 * * @param orderCrossCityWarpper * @param uid * @return * @throws Exception */ @Override public synchronized ResultUtil orderCrossCity(OrderCrossCityWarpper orderCrossCityWarpper, Integer uid) throws Exception { System.out.println("aaaaaaaaaaaaaaa" + orderCrossCityWarpper.getDriverId() + ":" + orderCrossCityWarpper.getLineShiftDriverId()); /** * 1.出租车、专车、跨城有待支付的订单不能叫车 * 2.小件物流有未完成的订单可以下跨城、专车、出租车 * 3.出租车、专车、跨城有预约单可以下即时单 */ List orderPrivateCars = orderPrivateCarMapper.queryByState(uid, 1, 1, 1, 2, 3, 4, 5, 6, 7, 11, 12); if (orderPrivateCars.size() > 0) { return ResultUtil.error("有未完成的订单"); } List list = orderTaxiMapper.queryByState_(uid, 1, 1, 1, 2, 3, 4, 5, 6, 7, 11, 12); if (list.size() > 0) { return ResultUtil.error("有未完成的订单"); } List orderCrossCities1 = orderCrossCityMapper.queryByState(uid, 1, 2, 3, 4, 5, 6, 7, 11, 12); 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()); 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); if(1 == orderCrossCity.getTravelMode()){ orderCrossCity.setSeatNumber(orderCrossCityWarpper.getSeatNumber()); }else{ orderCrossCity.setSeatNumber(lineShiftDriver.getLaveSeatNumber()); } // //调用高德创建轨迹 // 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 map = chinaMobileUtil.midAxbBindSend(orderCrossCity.getPassengersPhone(), driver.getPhone(), (System.currentTimeMillis() + 86400000)); // if(String.valueOf(map.get("code")).equals("200")){ // orderCrossCity.setTelX(map.get("telX")); // orderCrossCity.setBindId(map.get("bindId")); // } // 是否推广订单 Integer promotion = isPromotion(uid); if(promotion!=null){ orderCrossCity.setPromotion(2); Driver driver1 = driverService.selectById(promotion); orderCrossCity.setPromotionUser(driver1.getName()); orderCrossCity.setPromotionPhone(driver1.getPhone()); orderCrossCity.setPromotionDriverId(promotion); }else{ orderCrossCity.setPromotion(1); } this.insert(orderCrossCity); if (driver.getState() == 2) { driver.setState(3); driverService.updateById(driver); } //修改预约班次的数据 if (orderCrossCity.getTravelMode() == 2) {//包车 lineShiftDriver.setLaveSeat(0); lineShiftDriver.setLaveSeatNumber(""); } else {//拼车 lineShiftDriver.setLaveSeat((lineShiftDriver.getLaveSeat() - orderCrossCity.getPeopleNumber()) < 0 ? 0 : lineShiftDriver.getLaveSeat() - orderCrossCity.getPeopleNumber()); String[] split = orderCrossCity.getSeatNumber().split(","); String[] split1 = lineShiftDriver.getLaveSeatNumber().split(","); String seatNumber = ""; //先判断选中座位号和剩余座位号是否匹配 for (String spl : split) { boolean b = true; for (String sp : split1) { if (ToolUtil.isNotEmpty(spl) && ToolUtil.isNotEmpty(sp) && sp.equals(spl)) { b = false; break; } } if (b) { throw new SystemException("您选中的" + spl + "号座位已被占用,请选择其他座位!"); } } for (String sp : split1) { boolean b = true; for (String spl : split) { if (ToolUtil.isNotEmpty(spl) && ToolUtil.isNotEmpty(sp) && sp.equals(spl)) { b = false; break; } } if (b && ToolUtil.isNotEmpty(sp)) { seatNumber += (sp + ","); } } lineShiftDriver.setLaveSeatNumber((ToolUtil.isNotEmpty(seatNumber) && seatNumber.length() > 0) ? seatNumber.substring(0, seatNumber.length() - 1) : ""); } lineShiftDriverMapper.updateById(lineShiftDriver); //添加消息 systemNoticeService.addSystemNotice(1, "您的跨城订单已下单成功!", orderCrossCity.getUserId(), 1); BaseWarpper baseWarpper = new BaseWarpper(); baseWarpper.setId(orderCrossCity.getId()); //创建定时任务,取消订单30分钟 TimerTask timerTask = new TimerTask() { @Override public void run() { OrderCrossCity orderCrossCity1 = orderCrossCityMapper.selectById(orderCrossCity.getId()); if (orderCrossCity1.getState() == 7 && orderCrossCity1.getPayMoney() == null) { orderCrossCity1.setState(10); orderCrossCityMapper.updateById(orderCrossCity1); //中台修改订单状态 if(ToolUtil.isNotEmpty(orderCrossCity1.getTravelId())){ ModifyTravelItineraryRequest request1 = new ModifyTravelItineraryRequest(); request1.setOrderId(orderCrossCity1.getTravelId()); request1.setStatus(orderCrossCity1.getState()); if (null != orderCrossCity1.getDriverId()) { Driver driver2 = driverService.selectById(orderCrossCity1.getDriverId()); Company company = iCompanyService.selectById(driver2.getCompanyId()); request1.setDriverId(driver2.getEmpId().toString()); request1.setSupplierShopId(company.getEnterCode()); } if (2 == orderCrossCity1.getPromotion() && null != orderCrossCity1.getPromotionDriverId()) { Driver driver2 = driverService.selectById(orderCrossCity1.getPromotionDriverId()); request1.setPromoterId(driver2.getEmpId().toString()); } OrderUtil.modifyTravelItinerary(request1); } //未支付的情况取消订单 if(null == orderCrossCity1.getPayType() && ToolUtil.isNotEmpty(orderCrossCity1.getTravelId())){ OrderUtil.tradeOrderCancel(orderCrossCity1.getTravelId()); } OrderCancel orderCancel = new OrderCancel(); orderCancel.setOrderId(orderCrossCity1.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(orderCrossCity1.getLineShiftDriverId()); lineShiftDriver.setLaveSeat(lineShiftDriver.getLaveSeat() + orderCrossCity1.getPeopleNumber()); lineShiftDriver.setLaveSeatNumber(lineShiftDriver.getLaveSeatNumber() + (orderCrossCity1.getTravelMode() == 1 ? "," : "") + orderCrossCity1.getSeatNumber()); lineShiftDriverMapper.updateById(lineShiftDriver); //修改司机为空闲 List orderCrossCities = orderCrossCityMapper.queryByDriverId(orderCrossCity1.getDriverId(), 2, 3, 4, 5, 11); if (orderCrossCities.size() == 0) { Driver driver = driverService.selectById(orderCrossCity1.getDriverId()); driver.setState(2); driverService.updateById(driver); } } } }; Timer timer = new Timer(); timer.schedule(timerTask, 30 * 60 * 1000); return ResultUtil.success(baseWarpper); } private Integer isPromotion(Integer userId){ UserInfo userInfo = userInfoService.selectById(userId); if(userInfo.getBindDriverId()!=null && userInfo.getBindExpireDate().getTime()<=System.currentTimeMillis()){ String registAreaCode = userInfo.getRegistAreaCode(); TDriverPromotionActivity tDriverPromotionActivity = driverPromotionActivityService.selectOne(new EntityWrapper().eq("state",1).eq("districtCode", registAreaCode).le("startTime", new Date()).ge("endTime", new Date()).last("AND FIND_IN_SET(" + 3 + ", bizType) limit 1")); if(tDriverPromotionActivity!=null){ return userInfo.getBindDriverId(); } } return null; } /** * 获取订单 * * @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")); } if(Integer.valueOf(String.valueOf(map.get("state"))) ==7 && (map.get("responsibilityType")==null || Integer.valueOf(String.valueOf(map.get("responsibilityType")))<4)){ map.put("appealButton", 1); } //跨城不需要申诉 map.put("appealStatus", 0); if(map.get("travelMode")!=null &&map.get("travelMode").toString().equals("2") ){ map.put("zwNum", 1); }else { map.put("zwNum", 2); } 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 = (String) redisTemplate.opsForValue().get("DEVICE_" + map.get("driverId")); map.put("device", ToolUtil.isNotEmpty(driverId) ? 2 : 1); map.put("orderType", 3); return map; } /** * 获取取消订单的支付费用 * * @param id * @return * @throws Exception */ @Override public ResultUtil queryCancleAmount(Integer id) throws Exception { OrderCrossCity orderCrossCity = this.selectById(id); BaseWarpper baseWarpper = new BaseWarpper(); if (null == orderCrossCity) { return ResultUtil.error("获取数据失败,订单信息有误"); } if (orderCrossCity.getState() == 5) { return ResultUtil.error("订单已开始服务,不能取消订单"); } if (orderCrossCity.getState() == 6 || orderCrossCity.getState() == 8 || orderCrossCity.getState() == 9) { return ResultUtil.error("订单已完成,不能取消订单"); } if (orderCrossCity.getState() == 10) { return ResultUtil.error("订单已被取消,不能重复操作"); } OpenCity openCity = openCityService.openCity1(orderCrossCity.getStartLon().toString(), orderCrossCity.getStartLat().toString()); double amount = 0; CancleOrder query = cancleOrderService.query(1, 3, openCity.getId()); if (null != orderCrossCity.getDriverId() && (orderCrossCity.getSnatchOrderTime().getTime() + query.getMinuteNum() * 60 * 1000) < new Date().getTime()) {//收费的情况 if (null != query) { amount += query.getMoney(); } } baseWarpper.setAmount(amount); return ResultUtil.success(baseWarpper); } /** * 取消订单操作 * * @param id * @param payType * @param cancleId * @param type * @return * @throws Exception */ @Override @Transactional(propagation = Propagation.REQUIRES_NEW) public ResultUtil cancleOrderCrossCity(Integer id, Integer payType, Integer cancleId, Integer type) throws Exception { OrderCrossCity orderCrossCity = this.selectById(id); Integer uid = orderCrossCity.getUserId(); UserInfo userInfo = userInfoService.selectById(uid); ResultUtil resultUtil = ResultUtil.success(new Object()); if (null == orderCrossCity) { return ResultUtil.error("取消订单失败,订单信息有误", ""); } if (orderCrossCity.getState() != 12) { return ResultUtil.error("订单已取消,请刷新页面", ""); } OrderCancel orderCancel = null; if (null == cancleId) { orderCancel = orderCancelService.query(id, 3, null, null, 1); } else { orderCancel = orderCancelService.selectById(cancleId); } OpenCity openCity = openCityService.openCity1(orderCrossCity.getStartLon().toString(), orderCrossCity.getStartLat().toString()); CancleOrder query = cancleOrderService.query(1, 3, openCity.getId()); if (null != query) { if (payType == 1) {//微信支付 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("余额不足,无法完成支付"); } // resultUtil= appOrderController.moneyPay(id,userInfo.getId(),query.getMoney()); // if(resultUtil.getCode()==500){ // return ResultUtil.error("电子余额不足,无法完成支付"); // } userInfo.setBalance(new BigDecimal(userInfo.getBalance()).subtract(new BigDecimal(query.getMoney())).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue()); //添加交易明细 transactionDetailsService.saveData(uid, "跨城出行取消订单", query.getMoney(), 2, 1, 1, 3, id); userInfoService.updateById(userInfo); //解除小号绑定 if (orderCrossCity.getBindId() != null) { chinaMobileUtil.midAxbUnBindSend(orderCrossCity.getBindId(), orderCrossCity.getTelX(), (System.currentTimeMillis() + 600000)); } orderCrossCity.setState(10); orderCrossCity.setTelX(""); orderCrossCity.setBindId(""); this.updateById(orderCrossCity); orderCancel.setState(2); orderCancel.setPayType(3); orderCancelService.updateById(orderCancel); //添加已收入明细 incomeService.saveData(1, orderCrossCity.getCompanyId(), 3, orderCrossCity.getId(), 3, query.getMoney()); this.deleteTask(id);//删除定时任务 // 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); } else if (payType == 4) { Double payMoney = orderCrossCity.getOrderMoney(); Integer integer = paymentRecordService.saveData(1, orderCrossCity.getUserId(), 1, id, 3, 4, query.getMoney(), "", 1); resultUtil = appOrderController.placeAnOrder(new BigDecimal(query.getMoney()), 4, id, 4, integer); } } return resultUtil; } /** * 计算价格 * * @param distance * @param peopleNumber * @param travelMode * @param lineId * @param serverCarModelId * @param totalSeat * @param seatNumber * @return */ public ResultUtil> 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();//五座系数 double num8 = Double.valueOf(jsonObject.getString("num8")).doubleValue();//七座系数 /** * 1、实际里程>=参考里程 * 参考价+((实际里程-参考里程)*(参考价/参考里程)*超出参考里程优惠系数) * * 2、实际里程<参考里程 * 参考价-(参考里程-实际路程)*(参考价/参考里程)*低于参考里程优惠系数 */ double unitPrice = 0d; if (distance1 > num2) {//1 unitPrice = num1 + ((distance1 - num2) * (num1 / num2) * num4); } if (distance1 < num2) {//2 unitPrice = num1 - ((num2 - distance1) * (num1 / num2) * num5); } if (distance1 == num2) { unitPrice = num1; } if (travelMode == 1) {//拼车 String[] split = seatNumber.split(","); boolean b = false; for (String s : split) { if ((totalSeat == 4 && s.equals("3")) || (totalSeat == 6 && s.equals("5"))) { b = true; break; } } double price1 = 0D; if (b) { price1 = unitPrice * (totalSeat == 4 ? num7 : num8); peopleNumber -= 1; } double price = (unitPrice * peopleNumber) + price1; map.put("price", new BigDecimal(num3 > price ? num3 : price).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue()); } else { double price = unitPrice * totalSeat * num6; map.put("price", new BigDecimal(num3 > price ? num3 : price).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue()); } } return ResultUtil.success(map); } /** * 删除定时任务 * * @param orderId */ @Override public void deleteTask(Integer orderId) { //发送验证码短信 HttpHeaders headers = new HttpHeaders(); // 以表单的方式提交 headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED); //将请求头部和参数合成一个请求 MultiValueMap 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); } appOrderController.moneyPay(orderCrossCity.getId(), orderCrossCity.getUserId(), money); return ResultUtil.success(baseWarpper); } /** * 分享成功后添加红包 * * @param orderId * @return * @throws Exception */ @Override public synchronized ResultUtil shareRedEnvelope(Integer orderId) throws Exception { OrderCrossCity orderCrossCity = this.selectById(orderId); UserRedPacketRecord query = userRedPacketRecordService.query_(orderCrossCity.getUserId(), orderCrossCity.getCompanyId(), 0, 3, null); if (null != query) { Double money = query.getMoney(); Map map = userActivityRedenvelopeService.query(orderCrossCity.getCompanyId(), orderCrossCity.getTravelTime()); Double laveMoney = Double.valueOf(String.valueOf(map.get("laveMoney"))); if (money.compareTo(laveMoney) > 0) { return ResultUtil.error("手速太慢了,红包已派发完啦!"); } //判断当前红包是否大于剩余可领取总金额 if (money.compareTo(Double.valueOf(map.get("lavePrice").toString())) > 0) { return ResultUtil.error("手速太慢了,红包已派发完啦!"); } double v = new BigDecimal(laveMoney).subtract(new BigDecimal(money)).doubleValue(); UserActivityRedenvelope id = userActivityRedenvelopeService.selectById(String.valueOf(map.get("id"))); id.setLaveMoney(v); id.setLavePrice(new BigDecimal(id.getLavePrice() - money).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue()); userActivityRedenvelopeService.updateById(id); query.setState(1); query.setRedPacketActivityId(id.getId()); userRedPacketRecordService.updateById(query); } return ResultUtil.success(); } /** * 取消订单支付后的处理 * * @param id 订单=id * @param order_id 工行支付单号 * @param type 1=微信,2=支付宝 * @throws Exception */ @Override public void payCancelOrderCrossCity(Integer id, String order_id, Integer type) throws Exception { OrderCrossCity orderCrossCity = this.selectById(id); PaymentRecord query = paymentRecordService.query(1, orderCrossCity.getUserId(), 1, Integer.valueOf(id), 3, type, 1); if (null != query) { //添加交易明细 transactionDetailsService.saveData(orderCrossCity.getUserId(), "跨城出行取消订单", query.getAmount(), 2, 1, 1, 3, query.getOrderId()); orderCrossCity.setState(10); //解除小号绑定 if (orderCrossCity.getBindId() != null) { chinaMobileUtil.midAxbUnBindSend(orderCrossCity.getBindId(), orderCrossCity.getTelX(), (System.currentTimeMillis() + 600000)); } orderCrossCity.setBindId(""); orderCrossCity.setTelX(""); this.updateById(orderCrossCity); query.setState(2); query.setCode(order_id); paymentRecordService.updateById(query); OrderCancel query1 = orderCancelService.query(query.getOrderId(), query.getOrderType(), query.getAmount(), query.getPayType(), 1); if (null != query1) { query1.setState(2); orderCancelService.updateById(query1); } //添加已收入明细 incomeService.saveData(1, orderCrossCity.getCompanyId(), 3, orderCrossCity.getId(), 3, query.getAmount()); this.deleteTask(orderCrossCity.getId());//删除定时任务 // TODO: 2020/5/24 这里需要给司机和用户推送订单状态 // new Thread(new Runnable() { // @Override // public void run() { // pushUtil.pushOrderState(2, orderCrossCity.getDriverId(), orderCrossCity.getId(), 3, orderCrossCity.getState(), 0); // } // }).start(); //添加消息 systemNoticeService.addSystemNotice(1, "您已使用" + (type == 1 ? "微信" : (type == 2 ? "支付宝" : "云闪付")) + "成功支付取消订单费用,谢谢使用!", orderCrossCity.getUserId(), 1); } else { System.err.println("预支付数据异常(orderId = " + id + ")"); } } /** * 获取个人中心订单列表 * * @param uid * @param pageNum * @param size * @return * @throws Exception */ @Override public List> 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("订单已取消,请刷新页面"); } //待支付状态需要查询易信判断订单支付状态 if(7 == orderCrossCity.getState() && ToolUtil.isNotEmpty(orderCrossCity.getTravelId())){ GetPaymentInfoDataRequest getPaymentInfoDataRequest1 = new GetPaymentInfoDataRequest(); getPaymentInfoDataRequest1.setPartnerPayId(orderCrossCity.getTravelId()); GetPaymentInfo getPaymentInfo1 = OrderUtil.paymentInfo(getPaymentInfoDataRequest1); if("2".equals(getPaymentInfo1.getStatus())){ PaymentRecord query = paymentRecordService.query(1, null, null, id, 3, null, null); payOrderCrossCityCallback(orderCrossCity.getId(), getPaymentInfo1.getPayId(), query.getPayType(), null); } } UserInfo userInfo = userInfoService.selectById(orderCrossCity.getUserId()); //还原座位 OpenCity openCity = openCityService.openCity1(orderCrossCity.getStartLon().toString(), orderCrossCity.getStartLat().toString()); CancleOrder query1 = cancleOrderService.query(1, 3, openCity.getId()); if (null != query1) { if ((orderCrossCity.getSnatchOrderTime().getTime() + query1.getMinuteNum() * 60 * 1000) < new Date().getTime() && query1.getMoney().compareTo(0D) > 0) {//需要付费的情况 integer = orderCancelService.saveData(id, 3, reason, remark, null, query1.getMoney(), 1, 1, uid); orderCrossCity.setState(12); } else { integer = orderCancelService.saveData(id, 3, reason, remark, null, null, 2, 1, uid); orderCrossCity.setState(10); } this.updateById(orderCrossCity); if (orderCrossCity.getState() != 7) {//已经支付的情况推送给司机提醒 new Thread(new Runnable() { @Override public void run() { pushUtil.pushOrderState(2, orderCrossCity.getDriverId(), orderCrossCity.getId(), 3, orderCrossCity.getState(), 0); System.err.println("推送取消操作---------------------"); } }).start(); } Driver driver = driverService.selectById(orderCrossCity.getDriverId()); //修改司机座位 if(1 == orderCrossCity.getTravelMode()){ LineShiftDriver lineShiftDriver = lineShiftDriverMapper.selectById(orderCrossCity.getLineShiftDriverId()); lineShiftDriver.setLaveSeat(lineShiftDriver.getLaveSeat() + orderCrossCity.getPeopleNumber()); lineShiftDriver.setLaveSeatNumber(lineShiftDriver.getLaveSeatNumber() + (orderCrossCity.getTravelMode() == 1 ? "," : "") + orderCrossCity.getSeatNumber()); lineShiftDriverMapper.updateById(lineShiftDriver); }else{ Car car = carMapper.selectById(driver.getCarId()); CarModel carModel = carModelMapper.selectById(car.getCarModelId()); LineShiftDriver lineShiftDriver = lineShiftDriverMapper.selectById(orderCrossCity.getLineShiftDriverId()); lineShiftDriver.setLaveSeat(carModel.getSeat() - 1); String seatNumber = ""; for(int i = 1; i < carModel.getSeat(); i++){ seatNumber += i + ","; } lineShiftDriver.setLaveSeatNumber(seatNumber.substring(0, seatNumber.length() - 1)); lineShiftDriverMapper.updateById(lineShiftDriver); } //修改司机为空闲 List orderCrossCities = orderCrossCityMapper.queryByDriverId(orderCrossCity.getDriverId(), 2, 3, 4, 5, 11); if (orderCrossCities.size() == 0) { driver.setState(2); driverService.updateById(driver); } } else { return ResultUtil.error("请完善后台取消规则设置"); } //未支付的情况取消订单 if(null == orderCrossCity.getPayType() && ToolUtil.isNotEmpty(orderCrossCity.getTravelId())){ OrderUtil.tradeOrderCancel(orderCrossCity.getTravelId()); } //已支付的情况下进行退款操作 if (null != orderCrossCity.getPayType() && null != orderCrossCity.getPayMoney()) { // 退款 if (orderCrossCity.getPayType() == 5) { Driver driver = driverService.selectById(orderCrossCity.getDriverId()); if (orderCrossCity.getPayMoney() != null && orderCrossCity.getPayMoney() > 0) { appOrderController.createAllocationReqDriver(1, driver.getId(), 1, orderCrossCity.getPayMoney()); } } if (orderCrossCity.getPayType() == 3) {//余额支付 userInfo.setBalance(userInfo.getBalance() + orderCrossCity.getPayMoney()); userInfoService.updateById(userInfo); //添加交易明细 transactionDetailsService.saveData(orderCrossCity.getUserId(), "跨城出行取消退款", orderCrossCity.getPayMoney(), 1, 1, 1, 3, id); appOrderController.createAllocationReqUser(1, orderCrossCity.getUserId(), 1, orderCrossCity.getPayMoney()); } else { PaymentRecord query = null; if (orderCrossCity.getOrderSource() == 4) { query = paymentRecordService.query(1, orderCrossCity.getDriverId(), 2, id, 3, orderCrossCity.getPayType(), 2); if (ToolUtil.isEmpty(query)) { query = paymentRecordService.query(1, orderCrossCity.getUserId(), 1, id, 3, orderCrossCity.getPayType(), 2); } } else { query = paymentRecordService.query(1, orderCrossCity.getUserId(), 1, id, 3, orderCrossCity.getPayType(), 2); } if (null == query) { return ResultUtil.error("订单还未进行支付"); } if (query.getPayType() == 1) {//微信 //中台订单退款操作 if(ToolUtil.isNotEmpty(orderCrossCity.getTravelId())){ TradeOrderRefundRequest request = new TradeOrderRefundRequest(); request.setPartnerPayId(orderCrossCity.getTravelId()); request.setPayId(query.getCode()); request.setRefundTotalFee(Double.valueOf(orderCrossCity.getPayMoney() * 100).intValue() + ""); request.setRemark("跨城订单取消退款"); request.setRefundType("RF"); RefundInfoRequest refundInfo = new RefundInfoRequest(); refundInfo.setPayItemId(orderCrossCity.getTravelId()); refundInfo.setPayId(query.getCode()); refundInfo.setTradeFee(Double.valueOf(orderCrossCity.getPayMoney() * 100).intValue() + ""); request.setRefundInfos(new ArrayList(){{ add(refundInfo); }}); TradeOrderRefund tradeOrderRefund = OrderUtil.tradeOrderRefund(request); //退款通知 OrderRefundNoticeRequest request2 = new OrderRefundNoticeRequest(); request2.setOrderId(orderCrossCity.getTravelId()); request2.setRefundPayNum(tradeOrderRefund.getRefundId()); request2.setRefundType("5"); request2.setApplyRefundCharge(BigDecimal.valueOf(orderCrossCity.getPayMoney())); request2.setActualRefundCharge(BigDecimal.valueOf(orderCrossCity.getPayMoney())); request2.setRefundAccount(userInfo.getOnconUUID()); request2.setRemark("跨城订单取消退款"); OrderUtil.orderRefundNotice(request2); //添加交易明细 transactionDetailsService.saveData(orderCrossCity.getUserId(), "跨城出行取消退款", query.getAmount(), 1, 1, 1, 3, id); } } else if (query.getPayType() == 4) { // 云闪付 // TODO 退款 userInfo.setBalance(userInfo.getBalance() + orderCrossCity.getPayMoney()); userInfoService.updateById(userInfo); //添加交易明细 transactionDetailsService.saveData(orderCrossCity.getUserId(), "跨城出行取消退款", orderCrossCity.getPayMoney(), 1, 1, 1, 3, id); if (orderCrossCity.getOrderSource() == 4) { // 退给司机 appOrderController.createAllocationReqDriver(1, orderCrossCity.getDriverId(), 1, orderCrossCity.getPayMoney()); } else { appOrderController.createAllocationReqUser(1, orderCrossCity.getUserId(), 1, orderCrossCity.getPayMoney()); } } else {//支付宝 Map 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); } } } //添加消息 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); if(null != orderCrossCity){ //计算预计距离和剩余时间 String value = (String) redisTemplate.opsForValue().get("dache: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"); } } OrderServerWarpper orderServerWarpper = new OrderServerWarpper(); orderServerWarpper.setOrderId(orderCrossCity.getId()); orderServerWarpper.setOrderType(3); orderServerWarpper.setState(orderCrossCity.getState()); orderServerWarpper.setLon(null != value ? value.split(",")[0] : "0.0"); orderServerWarpper.setLat(null != value ? value.split(",")[1] : "0.0"); orderServerWarpper.setReassignNotice(orderCrossCity.getReassignNotice()); if (orderCrossCity.getState() == 2 || orderCrossCity.getState() == 3) {//前往预约地 // TODO: 2023/11/4 无法修改 Map distance = gdMapElectricFenceUtil.getDistance(value, orderCrossCity.getStartLon() + "," + orderCrossCity.getStartLat(), 1); String d = "0"; String t = "0"; if (null == distance) { System.err.println("查询距离出错了"); } else { d = new BigDecimal(distance.get("distance")).divide(new BigDecimal(1000), new MathContext(2, RoundingMode.HALF_EVEN)).toString(); t = new BigDecimal(distance.get("duration")).divide(new BigDecimal(60), new MathContext(2, RoundingMode.HALF_EVEN)).intValue() + ""; } orderServerWarpper.setReservationMileage(d); orderServerWarpper.setReservationTime(t); orderServerWarpper.setServedMileage("0"); orderServerWarpper.setServedTime("0"); orderServerWarpper.setLaveMileage("0"); orderServerWarpper.setLaveTime("0"); } if (orderCrossCity.getState() == 5 || orderCrossCity.getState() == 6) {//服务中 // TODO: 2023/11/4 无法修改 Map distance = gdMapElectricFenceUtil.getDistance(value, orderCrossCity.getEndLon() + "," + orderCrossCity.getEndLat(), 1); String d = "0"; String t = "0"; if (null == distance) { System.err.println("查询距离出错了"); } else { d = new BigDecimal(distance.get("distance")).divide(new BigDecimal(1000), new MathContext(2, RoundingMode.HALF_EVEN)).toString(); t = new BigDecimal(distance.get("duration")).divide(new BigDecimal(60), new MathContext(2, RoundingMode.HALF_EVEN)).intValue() + ""; } orderServerWarpper.setReservationMileage("0"); orderServerWarpper.setReservationTime("0"); orderServerWarpper.setServedMileage(String.valueOf(orderCrossCity.getMileage() / 1000)); orderServerWarpper.setServedTime(Long.valueOf((new Date().getTime() - orderCrossCity.getStartServiceTime().getTime()) / 60000).intValue() + ""); orderServerWarpper.setLaveMileage(d); orderServerWarpper.setLaveTime(t); } return orderServerWarpper; } return new 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 = (String) redisTemplate.opsForValue().get("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());//添加记录,防止调用接口重复提醒无人接单 OpenCity openCity = openCityService.openCity1(orderPrivateCar.getStartLon().toString(), orderPrivateCar.getStartLat().toString()); List querys = pushOrderService.querys(null, 1, openCity.getId());//获取需要推送的次数 for (int i = 1; i <= querys.size() + 15; i++) { //订单被抢后的处理 Integer state = orderPrivateCarMapper.selectById(orderId).getState(); if (state != 1) { //关闭其他推送线程 Set keySet = threadMap.keySet(); datas.forEach(e->{ threadMap.get(orderId + "_1"); }); 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.equals(orderPrivateCar.getId())) { orderPrivateCarMapper.deleteById(orderId); } if (orderType == 2) { orderTaxiMapper.deleteById(orderId); } } break; } //开始进行推送的处理 int finalI = i; PushOrder pushOrder = querys.stream().filter(s -> s.getType() == (finalI <= 3 ? finalI : 3)).findFirst().orElse(null); //获取空闲司机 List 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() + 15 && state == 1 && (null != b && !b.booleanValue())) { pushUtil.pushEndPush(1, orderPrivateCar.getUserId(), orderPrivateCar.getId(), 1, 1); OrderPrivateCarServiceImpl.orderIds.remove(orderPrivateCar.getId()); pushEndMap.put(orderPrivateCar.getCrossCityOrderId(), Boolean.TRUE);//推送后添加标识 break; } Thread.sleep(pushOrder.getPushTime() * 1000);//设置等待时间 } } if (orderType == 2) {//出租车 OrderTaxi orderTaxi = orderTaxiMapper.selectById(orderId); OrderTaxiServiceImpl.orderIds.add(orderTaxi.getId());//添加记录,防止调用接口重复提醒无人接单 OpenCity openCity = openCityService.openCity1(orderTaxi.getStartLon().toString(), orderTaxi.getStartLat().toString()); List querys = pushOrderService.querys(null, 2, openCity.getId());//获取需要推送的次数 for (int i = 1; i <= querys.size() + 15; 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.equals(orderTaxi.getId())) { orderTaxiMapper.deleteById(orderId); } } break; } //开始进行推送 int finalI = i; PushOrder pushOrder = querys.stream().filter(s -> s.getType() == (finalI <= 3 ? finalI : 3)).findFirst().orElse(null); //获取空闲司机 List 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() + 15 && state == 1 && (null != b && !b.booleanValue())) { pushUtil.pushEndPush(1, orderTaxi.getUserId(), orderTaxi.getId(), 2, 1); 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 { System.out.println(driverId + "|" + lineShiftDriverId); 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++; } } @Override @Transactional(propagation = Propagation.REQUIRES_NEW) public ResultUtil payThankYouFee(Integer uid, Integer orderId, Double money, Integer payType, Integer type) throws Exception { UserInfo userInfo = userInfoService.selectById(uid); OrderCrossCity orderCrossCity = this.selectById(orderId); ResultUtil resultUtil = ResultUtil.success(); if (payType == 1) {//微信支付 String app = type == 1 ? "APP" : "JSAPI"; resultUtil = payMoneyUtil.weixinpay("感谢费", "", orderId + "_3_" + UUIDUtil.getRandomCode(5), money.toString(), "/base/wxPayThankYouFee", app, userInfo.getAppletsOpenId()); paymentRecordService.saveData(3, uid, 1, orderId, 3, 1, money, "", 1);//添加预支付数据 } if (payType == 2) {//支付宝支付 resultUtil = payMoneyUtil.alipay("感谢费", "感谢费", "", orderId + "_3_" + UUIDUtil.getRandomCode(5), money.toString(), "/base/aliPayThankYouFee"); paymentRecordService.saveData(1, uid, 1, orderId, 3, 2, money, "", 1);//添加预支付数据 } if (payType == 3) {//余额支付 if (userInfo.getBalance() == null || userInfo.getBalance() < money) { return ResultUtil.error("余额不足,无法完成支付"); } // resultUtil= appOrderController.moneyPay(orderId,userInfo.getId(),money); // if(resultUtil.getCode()==500){ // return ResultUtil.error("电子余额不足,无法完成支付"); // } userInfo.setBalance(new BigDecimal(userInfo.getBalance()).subtract(new BigDecimal(money)).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue()); OpenCity openCity = openCityService.openCity1(orderCrossCity.getStartLon().toString(), orderCrossCity.getStartLat().toString()); SysIntegral query1 = sysIntegralMapper.query(openCity.getId()); userInfo.setIntegral(userInfo.getIntegral() + (money.intValue() * query1.getIntegral()));//积分 //添加交易明细 transactionDetailsService.saveData(uid, "跨城出行-感谢费", money, 2, 1, 1, 3, orderId); userInfoService.updateById(userInfo); orderCrossCity.setThankYouFee(money); this.updateById(orderCrossCity); //添加已收入明细 incomeService.saveData(2, orderCrossCity.getDriverId(), 6, orderCrossCity.getId(), 3, money); Driver driver = driverService.selectById(orderCrossCity.getDriverId()); driver.setBusinessMoney(new BigDecimal(null != driver.getBusinessMoney() ? driver.getBusinessMoney() : 0).add(new BigDecimal(money)).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue()); driver.setLaveBusinessMoney(new BigDecimal(null != driver.getLaveBusinessMoney() ? driver.getLaveBusinessMoney() : 0).add(new BigDecimal(money)).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue()); driver.setBalance(new BigDecimal(null != driver.getBalance() ? driver.getBalance() : 0).add(new BigDecimal(money)).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue()); driverService.updateById(driver); systemNoticeService.addSystemNotice(1, "您已使用余额成功完成感谢费支付,谢谢使用!", uid, 1); } if (payType == 4) { Double payMoney = orderCrossCity.getThankYouFee(); Integer integer = paymentRecordService.saveData(3, uid, 1, orderId, 3, 4, money, "", 1); resultUtil = appOrderController.placeAnOrder(new BigDecimal(money), 4, orderId, 2, integer); } return resultUtil; } @Override public void payThankYouFeeCallback(Integer orderId, String order_id, Integer payType) throws Exception { OrderCrossCity orderCrossCity = this.selectById(orderId); UserInfo userInfo = userInfoService.selectById(orderCrossCity.getUserId()); PaymentRecord query = paymentRecordService.query(3, userInfo.getId(), 1, orderId, 3, payType, 1); query.setState(2); query.setCode(order_id); paymentRecordService.updateById(query); OpenCity openCity = openCityService.openCity1(orderCrossCity.getStartLon().toString(), orderCrossCity.getStartLat().toString()); SysIntegral query1 = sysIntegralMapper.query(openCity.getId()); userInfo.setIntegral(userInfo.getIntegral() + (query.getAmount().intValue() * query1.getIntegral()));//积分 //添加交易明细 transactionDetailsService.saveData(userInfo.getId(), "跨城出行-感谢费", query.getAmount(), 2, 1, 1, 3, orderId); userInfoService.updateById(userInfo); orderCrossCity.setThankYouFee(query.getAmount()); this.updateById(orderCrossCity); //添加已收入明细 incomeService.saveData(2, orderCrossCity.getDriverId(), 6, orderCrossCity.getId(), 3, query.getAmount()); Driver driver = driverService.selectById(orderCrossCity.getDriverId()); driver.setBusinessMoney(new BigDecimal(null != driver.getBusinessMoney() ? driver.getBusinessMoney() : 0).add(new BigDecimal(query.getAmount())).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue()); driver.setLaveBusinessMoney(new BigDecimal(null != driver.getLaveBusinessMoney() ? driver.getLaveBusinessMoney() : 0).add(new BigDecimal(query.getAmount())).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue()); driver.setBalance(new BigDecimal(null != driver.getBalance() ? driver.getBalance() : 0).add(new BigDecimal(query.getAmount())).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue()); driverService.updateById(driver); systemNoticeService.addSystemNotice(1, "您已使用" + (payType == 1 ? "微信" : (payType == 2 ? "支付宝" : "云闪付")) + "成功完成感谢费支付,谢谢使用!", userInfo.getId(), 1); } @Override public List getUnpayCrossCityOrders(Integer uid) throws Exception { EntityWrapper query = new EntityWrapper<>(); query.eq("userId", uid).eq("state", 7); // 查询未支付订单 List orderCrossCities = this.selectList(query); List unPayOrderVOList = new ArrayList<>(); for (OrderCrossCity orderCrossCity : orderCrossCities) { UnPayOrderVO unPayOrderVO = new UnPayOrderVO(); //添加司机信息 DriverInfoWarpper driverInfoWarpper = new DriverInfoWarpper(); Driver driver = driverService.selectById(orderCrossCity.getDriverId()); BeanUtils.copyProperties(driver, driverInfoWarpper); unPayOrderVO.setDriverInfoWarpper(driverInfoWarpper); //其余信息 BeanUtils.copyProperties(orderCrossCity, unPayOrderVO); unPayOrderVOList.add(unPayOrderVO); } return unPayOrderVOList; } @Override public void addAppeal(Integer uid, Integer orderId, String abnormalIntro, String abnormalImg) { OrderCrossCity orderCrossCity = this.selectById(orderId); if(orderCrossCity.getState()!=7 || orderCrossCity.getAbnormalIntro()!=null){ throw new RuntimeException("此订单无法申诉"); } orderCrossCity.setAbnormalIntro(abnormalIntro); orderCrossCity.setAbnormalImg(abnormalImg); orderCrossCity.setAbnormal(2); this.baseMapper.updateById(orderCrossCity); } @Override public void promotion(Integer orderId) { OrderCrossCity orderCrossCity = this.baseMapper.selectById(orderId); UserInfo userInfo = userInfoService.selectById(orderCrossCity.getUserId()); if(userInfo.getBindDriverId()!=null && userInfo.getBindExpireDate().getTime()<=System.currentTimeMillis()){ String registAreaCode = userInfo.getRegistAreaCode(); TDriverPromotionActivity tDriverPromotionActivity = driverPromotionActivityService.selectOne(new EntityWrapper().eq("districtCode", registAreaCode).ge("startTime", new Date()).lt("endTime", new Date()).last("AND FIND_IN_SET(" + 3 + ", bizType) limit 1")); if(tDriverPromotionActivity!=null){ Double payMoney = orderCrossCity.getPayMoney(); BigDecimal bigDecimal = tDriverPromotionActivity.getCommissionRatio().divide(new BigDecimal(100), 2, RoundingMode.HALF_UP).multiply(new BigDecimal(payMoney)).setScale(2, RoundingMode.HALF_UP); orderCrossCity.setPromotionDriverId(userInfo.getBindDriverId()); orderCrossCity.setPromotionMoney(bigDecimal); orderCrossCity.setPromotionActivityId(tDriverPromotionActivity.getId()); this.baseMapper.updateById(orderCrossCity); } } // 是否异常订单 if (orderCrossCity.getResponsibilityType() !=null && orderCrossCity.getResponsibilityType() >2) { TAbnormalPayOrder tAbnormalPayOrder = abnormalPayOrderMapper.selectList(new EntityWrapper().eq("type", 3).eq("orderNum", orderCrossCity.getOrderNum())).stream().findFirst().orElse(null); if (tAbnormalPayOrder != null) { tAbnormalPayOrder.setPayStatus(2); tAbnormalPayOrder.setPayTime(new Date()); abnormalPayOrderMapper.updateById(tAbnormalPayOrder); } } } @Override public List> queryMyTripList(Integer uid, Integer pageNum, Integer size) throws Exception { pageNum = (pageNum - 1) * size; List> maps = orderCrossCityMapper.queryMyTripList(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> queryMyTripListAll(Integer uid) throws Exception { List> maps = orderCrossCityMapper.queryMyTripListAll(uid); for (Map map : maps) { if (Integer.valueOf(String.valueOf(map.get("state"))) == 11) { map.put("state", map.get("oldState")); } } return maps; } /** * 【202601】获取扫码下单详情 * * @param lineShiftDriverId 司机排班记录ID * @return 扫码下单详情 * @throws Exception */ @Override public ResultUtil queryScanOrderDetail(Integer lineShiftDriverId) throws Exception { // 1. 查询基础数据 Map data = lineShiftDriverMapper.queryScanOrderDetail(lineShiftDriverId); if (data == null || data.isEmpty()) { return ResultUtil.error("班次信息不存在"); } // 2. 构建返回对象 ScanOrderDetailWarpper result = new ScanOrderDetailWarpper(); // 司机信息 result.setHeadImgUrl(data.get("headImgUrl") != null ? data.get("headImgUrl").toString() : null); result.setDriverName(data.get("driverName") != null ? data.get("driverName").toString() : null); result.setCarLicensePlate(data.get("carLicensePlate") != null ? data.get("carLicensePlate").toString() : null); result.setCarBrand(data.get("carBrand") != null ? data.get("carBrand").toString() : null); result.setCarColor(data.get("carColor") != null ? data.get("carColor").toString() : null); result.setScore(data.get("score") != null ? Double.parseDouble(data.get("score").toString()) : 0.0); result.setOrderCount(data.get("orderCount") != null ? Integer.parseInt(data.get("orderCount").toString()) : 0); // 线路信息 result.setLineId(data.get("lineId") != null ? Integer.parseInt(data.get("lineId").toString()) : null); result.setLineName(data.get("lineName") != null ? data.get("lineName").toString() : null); result.setDay(data.get("day") != null ? data.get("day").toString() : null); result.setStartTime(data.get("startTime") != null ? data.get("startTime").toString() : null); result.setEndTime(data.get("endTime") != null ? data.get("endTime").toString() : null); result.setTotalSeat(data.get("totalSeat") != null ? Integer.parseInt(data.get("totalSeat").toString()) : null); result.setLaveSeat(data.get("laveSeat") != null ? Integer.parseInt(data.get("laveSeat").toString()) : null); result.setLaveSeatNumber(data.get("laveSeatNumber") != null ? data.get("laveSeatNumber").toString() : null); // 3. 解析价格JSON获取单人价格 String priceContent = data.get("priceContent") != null ? data.get("priceContent").toString() : null; if (priceContent != null && !priceContent.isEmpty()) { JSONObject json = JSON.parseObject(priceContent); String num1 = json.getString("num1"); if (num1 != null && !num1.isEmpty()) { result.setUnitPrice(Double.parseDouble(num1)); } } // 站点信息 result.setStartSiteId(data.get("startSiteId") != null ? Integer.parseInt(data.get("startSiteId").toString()) : null); result.setStartSiteName(data.get("startSiteName") != null ? data.get("startSiteName").toString() : null); result.setEndSiteId(data.get("endSiteId") != null ? Integer.parseInt(data.get("endSiteId").toString()) : null); result.setEndSiteName(data.get("endSiteName") != null ? data.get("endSiteName").toString() : null); // 城市信息 result.setStartCityName(data.get("startCityName") != null ? data.get("startCityName").toString() : null); result.setEndCityName(data.get("endCityName") != null ? data.get("endCityName").toString() : null); // 默认点信息(起点和终点) // 起点默认点信息 result.setStartDefaultPointAddress(data.get("startDefaultPointAddress") != null ? data.get("startDefaultPointAddress").toString() : null); result.setStartDefaultPointLon(data.get("startDefaultPointLon") != null ? Double.parseDouble(data.get("startDefaultPointLon").toString()) : null); result.setStartDefaultPointLat(data.get("startDefaultPointLat") != null ? Double.parseDouble(data.get("startDefaultPointLat").toString()) : null); // 终点默认点信息 result.setEndDefaultPointAddress(data.get("endDefaultPointAddress") != null ? data.get("endDefaultPointAddress").toString() : null); result.setEndDefaultPointLon(data.get("endDefaultPointLon") != null ? Double.parseDouble(data.get("endDefaultPointLon").toString()) : null); result.setEndDefaultPointLat(data.get("endDefaultPointLat") != null ? Double.parseDouble(data.get("endDefaultPointLat").toString()) : null); // 其他信息 result.setServerCarModelId(data.get("serverCarModelId") != null ? Integer.parseInt(data.get("serverCarModelId").toString()) : null); result.setDriverId(data.get("driverId") != null ? Integer.parseInt(data.get("driverId").toString()) : null); result.setLineShiftDriverId(lineShiftDriverId); return ResultUtil.success(result); } @Override public synchronized ResultUtil orderCrossCityScan(OrderCrossCityScanWarpper warpper, Integer uid) throws Exception{ // 1. 参数校验 if (warpper.getLineShiftDriverId() == null) { return ResultUtil.error("班次ID不能为空"); } if (warpper.getPeopleNumber() == null || warpper.getPeopleNumber() < 1 || warpper.getPeopleNumber() > 7) { return ResultUtil.error("乘车人数必须在1-7之间"); } if (ToolUtil.isEmpty(warpper.getPassengersPhone())) { return ResultUtil.error("乘客手机号不能为空"); } if (warpper.getPlacementLat() == null || warpper.getPlacementLon() == null || ToolUtil.isEmpty(warpper.getPlacementAddress())) { return ResultUtil.error("下单地点信息不完整"); } if (warpper.getStartLon() == null || warpper.getStartLat() == null || ToolUtil.isEmpty(warpper.getStartAddress())) { return ResultUtil.error("上车点信息不完整"); } if (warpper.getEndLon() == null || warpper.getEndLat() == null || ToolUtil.isEmpty(warpper.getEndAddress())) { return ResultUtil.error("下车点信息不完整"); } if (warpper.getOtherFee() != null && warpper.getOtherFee().compareTo(BigDecimal.ZERO) < 0) { return ResultUtil.error("其他费用不能为负数"); } /** * 先判断司机座位数是否符合出行人数 */ LineShiftDriver lineShiftDriver = lineShiftDriverMapper.selectById(warpper.getLineShiftDriverId()); if (lineShiftDriver.getLaveSeat() < warpper.getPeopleNumber()) { return ResultUtil.error("司机剩余座位数小于出行人数"); } Driver driver = driverService.selectById(lineShiftDriver.getDriverId()); if (driver == null) { return ResultUtil.error("司机信息不存在"); } if (driver.getState() == 1) { return ResultUtil.error("司机处于离线状态"); } // 4. 自动分配座位号 String laveSeatNumber = lineShiftDriver.getLaveSeatNumber(); if (ToolUtil.isEmpty(laveSeatNumber)) { return ResultUtil.error("无可用座位"); } String[] availableSeats = laveSeatNumber.split(","); if (availableSeats.length < warpper.getPeopleNumber()) { return ResultUtil.error("座位不足,无法下单"); } // 取前 peopleNumber 个座位 StringBuilder seatNumberBuilder = new StringBuilder(); for (int i = 0; i < warpper.getPeopleNumber(); i++) { if (i > 0) { seatNumberBuilder.append(","); } seatNumberBuilder.append(availableSeats[i]); } String seatNumber = seatNumberBuilder.toString(); // 6. 获取线路班次信息 LineSite lineSite = lineSiteService.selectById(lineShiftDriver.getLineShiftId()); if (lineSite == null) { return ResultUtil.error("线路班次信息不存在"); } Line line = lineService.selectById(lineSite.getLineId()); if (line == null) { return ResultUtil.error("线路信息不存在"); } /** * 1.出租车、专车、跨城有待支付的订单不能叫车 * 2.小件物流有未完成的订单可以下跨城、专车、出租车 * 3.出租车、专车、跨城有预约单可以下即时单 */ List orderPrivateCars = orderPrivateCarMapper.queryByState(uid, 1, 1, 1, 2, 3, 4, 5, 6, 7, 11, 12); if (orderPrivateCars.size() > 0) { return ResultUtil.error("有未完成的订单"); } List list = orderTaxiMapper.queryByState_(uid, 1, 1, 1, 2, 3, 4, 5, 6, 7, 11, 12); if (list.size() > 0) { return ResultUtil.error("有未完成的订单"); } List orderCrossCities1 = orderCrossCityMapper.queryByState(uid, 1, 2, 3, 4, 5, 6, 7, 11, 12); if (orderCrossCities1.size() > 0) { return ResultUtil.error("有未完成的订单"); } List orderCrossCities2 = orderCrossCityMapper.queryOrders(driver.getId(), warpper.getLineShiftDriverId(), Arrays.asList(5)); if (orderCrossCities2.size() > 0) { return ResultUtil.error("司机正在服务中"); } // 10. 计算价格 Map distanceMap = gdMapElectricFenceUtil.getDistance( warpper.getStartLon() + "," + warpper.getStartLat(), warpper.getEndLon() + "," + warpper.getEndLat(), 1); if (distanceMap == null) { return ResultUtil.error("计算行程距离出错"); } Double distance = Double.valueOf(distanceMap.get("distance")); // 获取车辆信息 Car car = carMapper.selectById(driver.getCarId()); if (car == null) { return ResultUtil.error("车辆信息不存在"); } CarModel carModel = carModelMapper.selectById(car.getCarModelId()); if (carModel == null) { return ResultUtil.error("车型信息不存在"); } CarService carService = carServiceMapper.query(3, driver.getCarId()); if(null == carService){ return ResultUtil.error("车辆未开通该服务"); } ResultUtil> priceResult = this.getPrice(distance, warpper.getPeopleNumber(), 1, lineSite.getLineId(), carService.getServerCarModelId(), lineShiftDriver.getTotalSeat(), seatNumber); if (priceResult.getCode() != 200) { return ResultUtil.error("计算价格失败"); } Double ticketPrice = Double.valueOf(priceResult.getData().get("price").toString()); // 计算合计费用 Double otherFee = warpper.getOtherFee() != null ? warpper.getOtherFee().setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue() : 0D; Double totalMoney = new BigDecimal(ticketPrice).add(new BigDecimal(otherFee)).setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue(); UserInfo userInfo = userInfoService.selectById(uid); // 11. 创建订单 OrderCrossCity orderCrossCity = new OrderCrossCity(); orderCrossCity.setUserId(userInfo.getId()); orderCrossCity.setPassengers(userInfo.getName()); orderCrossCity.setPassengersPhone(warpper.getPassengersPhone()); orderCrossCity.setServerCarModelId(carService.getServerCarModelId()); orderCrossCity.setDriverId(driver.getId()); orderCrossCity.setLineId(lineSite.getLineId()); orderCrossCity.setCarId(driver.getCarId()); orderCrossCity.setOrderNum(this.getOrderNum(driver.getId(), warpper.getLineShiftDriverId())); // 下单地点 orderCrossCity.setPlacementLat(warpper.getPlacementLat()); orderCrossCity.setPlacementLon(warpper.getPlacementLon()); String placementAddress = warpper.getPlacementAddress(); placementAddress = placementAddress.replaceAll("& #40;", "("); placementAddress = placementAddress.replaceAll("& #41;", ")"); orderCrossCity.setPlacementAddress(placementAddress); // 上车点 orderCrossCity.setStartLon(warpper.getStartLon()); orderCrossCity.setStartLat(warpper.getStartLat()); String startAddress = warpper.getStartAddress(); startAddress = startAddress.replaceAll("& #40;", "("); startAddress = startAddress.replaceAll("& #41;", ")"); orderCrossCity.setStartAddress(startAddress); // 下车点 orderCrossCity.setEndLon(warpper.getEndLon()); orderCrossCity.setEndLat(warpper.getEndLat()); String endAddress = warpper.getEndAddress(); endAddress = endAddress.replaceAll("& #40;", "("); endAddress = endAddress.replaceAll("& #41;", ")"); orderCrossCity.setEndAddress(endAddress); orderCrossCity.setMileage(0D); orderCrossCity.setOrderMoney(totalMoney); orderCrossCity.setCompanyId(driver.getCompanyId()); orderCrossCity.setPeopleNumber(warpper.getPeopleNumber()); orderCrossCity.setSeatNumber(seatNumber); 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()); // 设置出行时间为班次日期+开始时间 Calendar calendar = Calendar.getInstance(); calendar.setTime(lineShiftDriver.getDay()); String[] startTimeParts = lineSite.getStartTime().split(":"); calendar.set(Calendar.HOUR_OF_DAY, Integer.parseInt(startTimeParts[0])); calendar.set(Calendar.MINUTE, Integer.parseInt(startTimeParts[1])); calendar.set(Calendar.SECOND, 0); orderCrossCity.setTravelTime(calendar.getTime()); orderCrossCity.setSnatchOrderTime(new Date()); orderCrossCity.setTravelMode(1); // 固定拼车 orderCrossCity.setIsDelete(1); orderCrossCity.setIsReassign(1); orderCrossCity.setLineShiftDriverId(warpper.getLineShiftDriverId()); orderCrossCity.setOrderSource(2); // 扫码下单 orderCrossCity.setOtherFee(warpper.getOtherFee()); // 推广订单处理 Integer promotion = isPromotion(uid); if(promotion != null){ orderCrossCity.setPromotion(2); Driver promotionDriver = driverService.selectById(promotion); orderCrossCity.setPromotionUser(promotionDriver.getName()); orderCrossCity.setPromotionPhone(promotionDriver.getPhone()); orderCrossCity.setPromotionDriverId(promotion); }else{ orderCrossCity.setPromotion(1); } this.insert(orderCrossCity); // 13. 更新司机状态 if (driver.getState() == 2) { driver.setState(3); driverService.updateById(driver); } // 14. 更新班次座位信息 lineShiftDriver.setLaveSeat(lineShiftDriver.getLaveSeat() - warpper.getPeopleNumber()); // 更新剩余座位号 StringBuilder newLaveSeatNumber = new StringBuilder(); for (int i = warpper.getPeopleNumber(); i < availableSeats.length; i++) { if (newLaveSeatNumber.length() > 0) { newLaveSeatNumber.append(","); } newLaveSeatNumber.append(availableSeats[i]); } lineShiftDriver.setLaveSeatNumber(newLaveSeatNumber.toString()); lineShiftDriverMapper.updateById(lineShiftDriver); // 15. 添加系统消息 systemNoticeService.addSystemNotice(1, "您的跨城订单已下单成功,请尽快完成支付!", orderCrossCity.getUserId(), 1); // 16. 创建定时任务,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); //中台修改订单状态 if(ToolUtil.isNotEmpty(orderCrossCity1.getTravelId())){ ModifyTravelItineraryRequest request1 = new ModifyTravelItineraryRequest(); request1.setOrderId(orderCrossCity1.getTravelId()); request1.setStatus(orderCrossCity1.getState()); if (null != orderCrossCity1.getDriverId()) { Driver driver2 = driverService.selectById(orderCrossCity1.getDriverId()); Company company = iCompanyService.selectById(driver2.getCompanyId()); request1.setDriverId(driver2.getEmpId().toString()); request1.setSupplierShopId(company.getEnterCode()); } if (2 == orderCrossCity1.getPromotion() && null != orderCrossCity1.getPromotionDriverId()) { Driver driver2 = driverService.selectById(orderCrossCity1.getPromotionDriverId()); request1.setPromoterId(driver2.getEmpId().toString()); } OrderUtil.modifyTravelItinerary(request1); } //未支付的情况取消订单 if(null == orderCrossCity1.getPayType() && ToolUtil.isNotEmpty(orderCrossCity1.getTravelId())){ OrderUtil.tradeOrderCancel(orderCrossCity1.getTravelId()); } OrderCancel orderCancel = new OrderCancel(); orderCancel.setOrderId(orderCrossCity1.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(orderCrossCity1.getLineShiftDriverId()); lineShiftDriver.setLaveSeat(lineShiftDriver.getLaveSeat() + orderCrossCity1.getPeopleNumber()); lineShiftDriver.setLaveSeatNumber(lineShiftDriver.getLaveSeatNumber() + (orderCrossCity1.getTravelMode() == 1 ? "," : "") + orderCrossCity1.getSeatNumber()); lineShiftDriverMapper.updateById(lineShiftDriver); //修改司机为空闲 List orderCrossCities = orderCrossCityMapper.queryByDriverId(orderCrossCity1.getDriverId(), 2, 3, 4, 5, 11); if (orderCrossCities.size() == 0) { Driver driver = driverService.selectById(orderCrossCity1.getDriverId()); driver.setState(2); driverService.updateById(driver); } } } }; Timer timer = new Timer(); timer.schedule(timerTask, 30 * 60 * 1000); // 17. 返回结果 BaseWarpper baseWarpper = new BaseWarpper(); baseWarpper.setId(orderCrossCity.getId()); return ResultUtil.success(baseWarpper); } }