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.DriverSelfTripMapper; import com.stylefeng.guns.modular.crossCity.dao.LinePriceMapper; import com.stylefeng.guns.modular.crossCity.dao.LineMapper; import com.stylefeng.guns.modular.crossCity.dao.LineShiftDriverMapper; import com.stylefeng.guns.modular.crossCity.dao.OrderCrossCityMapper; import com.stylefeng.guns.modular.crossCity.model.DriverSelfTrip; 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.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.util.*; 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 LineMapper lineMapper; @Resource private UserActivityDiscount1Mapper userActivityDiscount1Mapper; @Resource private SysIntegralMapper sysIntegralMapper; @Resource private LineShiftDriverMapper lineShiftDriverMapper; @Resource private OrderPrivateCarMapper orderPrivateCarMapper; @Resource private OrderTaxiMapper orderTaxiMapper; @Resource private DriverSelfTripMapper driverSelfTripMapper; @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 GeodesyUtil geodesyUtil; @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 CbyzxOrderPayHelper cbyzxOrderPayHelper; @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 lineDestinationId, Integer serverCarModelId, Integer totalSeat, String seatNumber) throws Exception { Double endLon = null; Double endLat = null; if (ToolUtil.isNotEmpty(endLonLat) && endLonLat.contains(",")) { String[] endArr = endLonLat.split(","); if (endArr.length == 2) { endLon = Double.valueOf(endArr[0]); endLat = Double.valueOf(endArr[1]); } } ResultUtil> result = this.getPriceV2(lineId, lineDestinationId, totalSeat, peopleNumber, endLon, endLat, null); if (result.getCode() != 200) { return result; } Double price = Double.valueOf(String.valueOf(result.getData().get("price"))); if (price < 0) { return ResultUtil.error("获取距离计算出错"); } return result; } /** * 获取用户余额和可用优惠券数量 * * @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 outTradeNo = orderId + "_3_" + UUIDUtil.getRandomCode(5); JSONObject response = cbyzxOrderPayHelper.createOrder(orderCrossCity.getUserId(), userInfo.getAppletsOpenId(), outTradeNo, orderMoney); if (!cbyzxOrderPayHelper.isCreateSuccess(response)) { return ResultUtil.error(cbyzxOrderPayHelper.extractMessage(response), response); } String paymentCode = ToolUtil.isNotEmpty(cbyzxOrderPayHelper.extractRecordCode(response)) ? cbyzxOrderPayHelper.extractRecordCode(response) : outTradeNo; resultUtil = ResultUtil.success(response); paymentRecordService.saveData(1, orderCrossCity.getUserId(), 1, orderId, 3, 1, orderMoney, paymentCode, 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 outTradeNo = orderId + "_3_" + UUIDUtil.getRandomCode(5); JSONObject response = cbyzxOrderPayHelper.createOrder(orderCrossCity.getUserId(), userInfo.getAppletsOpenId(), outTradeNo, orderMoney); if (!cbyzxOrderPayHelper.isCreateSuccess(response)) { return ResultUtil.error(cbyzxOrderPayHelper.extractMessage(response), response); } String paymentCode = ToolUtil.isNotEmpty(cbyzxOrderPayHelper.extractRecordCode(response)) ? cbyzxOrderPayHelper.extractRecordCode(response) : outTradeNo; resultUtil = ResultUtil.success(response); this.updateById(orderCrossCity); paymentRecordService.saveData(1, orderCrossCity.getUserId(), 1, orderId, 3, 1, orderMoney, paymentCode, 1);//添加预支付数据 } if (payType == 2) {//支付宝支付 if (orderMoney == 0) { return ResultUtil.error("请使用余额支付"); } resultUtil = payMoneyUtil.alipay("完成订单", "完成订单", "", orderId + "_3_" + UUIDUtil.getRandomCode(5), orderMoney.toString(), "/base/aliPayOrderTaxi"); paymentRecordService.saveData(1, orderCrossCity.getUserId(), 1, orderId, 3, 2, orderMoney, "", 1);//添加预支付数据 } if (payType == 3) {//余额支付 if (userInfo.getBalance() == null || userInfo.getBalance() < orderMoney) { return ResultUtil.error("余额不足,无法完成支付"); } 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 = ToolUtil.isNotEmpty(no) ? paymentRecordService.queryByCode(no, 1) : null; if (query == null) { 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()); SysIntegral query1 = sysIntegralMapper.query(openCity.getId()); userInfo.setIntegral(userInfo.getIntegral() + (query.getAmount().intValue() * query1.getIntegral()));//积分 userInfoService.updateById(userInfo); //处理优惠券和红包 if (null != orderCrossCity.getCouponId()) { UserCouponRecord userCouponRecord = userCouponRecordService.selectById(orderCrossCity.getCouponId()); userCouponRecord.setState(2); userCouponRecord.setEndTime(new Date()); userCouponRecordService.updateById(userCouponRecord); } if (null != orderCrossCity.getUserTaxiCardId()) { UserTaxiCard userTaxiCard = userTaxiCardService.selectById(orderCrossCity.getUserTaxiCardId()); if (userTaxiCard.getType() == 1 || userTaxiCard.getType() == 3) { JSONObject jsonObject = JSON.parseObject(userTaxiCard.getContent()); jsonObject.put("time", jsonObject.getInteger("time") - 1); userTaxiCard.setContent(jsonObject.toJSONString()); userTaxiCardService.updateById(userTaxiCard); } } if (null != orderCrossCity.getRedPacketId()) { UserRedPacketRecord userRedPacketRecord = userRedPacketRecordService.selectById(orderCrossCity.getRedPacketId()); userRedPacketRecord.setState(2); userRedPacketRecord.setEndTime(new Date()); userRedPacketRecordService.updateById(userRedPacketRecord); } query.setState(2); query.setCode(order_id); paymentRecordService.updateById(query); // TODO: 2020/5/24 这里需要给司机和用户推送订单状态 new Thread(new Runnable() { @Override public void run() { pushUtil.pushOrderState(1, orderCrossCity.getUserId(), orderCrossCity.getId(), 3, orderCrossCity.getState(), 0); pushUtil.pushOrderState(2, orderCrossCity.getDriverId(), orderCrossCity.getId(), 3, orderCrossCity.getState(), 0); pushUtil.pushDriverPosition(orderCrossCity.getId(), 3); } }).start(); systemNoticeService.addSystemNotice(1, "您已使用" + (type == 1 ? "微信" : (type == 2 ? "支付宝" : "云闪付")) + "成功完成出行订单支付,谢谢使用!", orderCrossCity.getUserId(), 1); } else { System.err.println("预支付数据异常(orderId = " + id + ")"); } } /** * 用户跨城下单操作 * * @param orderCrossCityWarpper * @param uid * @return * @throws Exception */ @Override public synchronized ResultUtil 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.setLineDestinationId(orderCrossCityWarpper.getLineDestinationId()); 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.getPriceV2(orderCrossCityWarpper.getLineId(), orderCrossCityWarpper.getLineDestinationId(), orderCrossCityWarpper.getTotalSeat(), orderCrossCityWarpper.getPeopleNumber(), orderCrossCityWarpper.getEndLon(), orderCrossCityWarpper.getEndLat(), orderCrossCityWarpper.getLineShiftDriverId()); if (price.getCode() != 200) { return ResultUtil.error("计算价格失败"); } Double money = Double.valueOf(price.getData().get("price").toString()); if (money < 0) { return ResultUtil.error("计算价格失败"); } 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()); //创建定时任务,取消订单10分钟 TimerTask timerTask = new TimerTask() { @Override public void run() { OrderCrossCity orderCrossCity1 = orderCrossCityMapper.selectById(orderCrossCity.getId()); if (orderCrossCity1.getState() == 7 && orderCrossCity1.getPayMoney() == null) { orderCrossCity1.setState(10); orderCrossCityMapper.updateById(orderCrossCity1); OrderCancel orderCancel = new OrderCancel(); orderCancel.setOrderId(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); } //接口数据初始化为0 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 outTradeNo = "CANCEL_" + id + "_3_" + UUIDUtil.getRandomCode(5); JSONObject response = cbyzxOrderPayHelper.createOrder(orderCrossCity.getUserId(), userInfo.getAppletsOpenId(), outTradeNo, query.getMoney()); if (!cbyzxOrderPayHelper.isCreateSuccess(response)) { return ResultUtil.error(cbyzxOrderPayHelper.extractMessage(response), response); } String recordCode = cbyzxOrderPayHelper.extractRecordCode(response); String paymentCode = ToolUtil.isNotEmpty(recordCode) ? recordCode : outTradeNo; paymentRecordService.saveData(1, orderCrossCity.getUserId(), 1, id, 3, 1, query.getMoney(), paymentCode, 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) { //调用 driver-server 删除定时任务 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("订单已取消,请刷新页面"); } 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() && 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) {//微信 Map map = payMoneyUtil.wxRefund(query.getCode(), id + "_3", query.getAmount().toString(), query.getAmount().toString(), "/base/cancleOrderWXPay"); if (!"SUCCESS".equals(map.get("return_code"))) { return ResultUtil.error(map.get("return_msg")); } 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 outTradeNo = "THANK_" + orderId + "_3_" + UUIDUtil.getRandomCode(5); JSONObject response = cbyzxOrderPayHelper.createOrder(orderCrossCity.getUserId(), userInfo.getAppletsOpenId(), outTradeNo, money); if (!cbyzxOrderPayHelper.isCreateSuccess(response)) { return ResultUtil.error(cbyzxOrderPayHelper.extractMessage(response), response); } String recordCode = cbyzxOrderPayHelper.extractRecordCode(response); String paymentCode = ToolUtil.isNotEmpty(recordCode) ? recordCode : outTradeNo; paymentRecordService.saveData(3, uid, 1, orderId, 3, 1, money, paymentCode, 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; } /** * 【02601】获取扫码下单详情 * * @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; if (lineShiftDriver.getLineShiftId() != null && lineShiftDriver.getLineShiftId() == -1) { lineSite = new LineSite(); lineSite.setId(-1); lineSite.setLineId(-1); Integer customerId = lineShiftDriverMapper.queryCustomerIdByLineShiftDriverId(lineShiftDriver.getId()); if (customerId != null) { DriverSelfTrip selfTrip = driverSelfTripMapper.selectById(customerId); if (selfTrip != null) { lineSite.setStartTime(selfTrip.getStartTime()); } } } else { lineSite = lineSiteService.selectById(lineShiftDriver.getLineShiftId()); } if (lineSite == null) { return ResultUtil.error("线路班次信息不存在"); } Line line = null; if (lineSite.getLineId() != null && lineSite.getLineId() != -1) { line = lineService.selectById(lineSite.getLineId()); } if (lineSite.getLineId() != null && lineSite.getLineId() != -1 && 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.getPriceV2(lineSite.getLineId(), lineShiftDriver, warpper); if (priceResult.getCode() != 200) { return ResultUtil.error("计算价格失败"); } Double ticketPrice = Double.valueOf(priceResult.getData().get("price").toString()); if (ticketPrice < 0) { return ResultUtil.error("计算价格失败"); } // 计算合计费用 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. 创建定时任务,10分钟未支付自动取消 TimerTask timerTask = new TimerTask() { @Override public void run() { OrderCrossCity orderCrossCity1 = orderCrossCityMapper.selectById(orderCrossCity.getId()); if (orderCrossCity1.getState() == 7 && orderCrossCity1.getPayMoney() == null) { orderCrossCity1.setState(10); orderCrossCityMapper.updateById(orderCrossCity1); //未支付的情况取消订单 OrderCancel orderCancel = new OrderCancel(); orderCancel.setOrderId(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); } public ResultUtil> getPriceV2(Integer lineId, LineShiftDriver lineShiftDriver, OrderCrossCityScanWarpper warpper) { Map map = new HashMap<>(); map.put("distance", 0); if (lineShiftDriver == null || warpper == null || warpper.getEndLon() == null || warpper.getEndLat() == null || warpper.getPeopleNumber() == null || warpper.getPeopleNumber() <= 0) { map.put("price", -1); return ResultUtil.success(map); } if (lineId != null && lineId == -1) { BigDecimal price = querySelfTripNearestPrice(lineShiftDriver, warpper); map.put("price", price == null ? -1 : multiplyPeopleNumber(price, warpper.getPeopleNumber()).doubleValue()); return ResultUtil.success(map); } BigDecimal price = queryLineDestinationPrice(lineId, lineShiftDriver, warpper); map.put("price", price == null ? -1 : multiplyPeopleNumber(price, warpper.getPeopleNumber()).doubleValue()); return ResultUtil.success(map); } public ResultUtil> getPriceV2(Integer lineId, Integer lineDestinationId, Integer totalSeat, Integer peopleNumber, Double endLon, Double endLat, Integer lineShiftDriverId) { Map map = new HashMap<>(); map.put("distance", 0); if (peopleNumber == null || peopleNumber <= 0 || endLon == null || endLat == null) { map.put("price", -1); return ResultUtil.success(map); } if (lineDestinationId != null) { Map destination = lineMapper.queryLineDestinationById(lineDestinationId, lineId); BigDecimal unitPrice = null; if (destination != null) { unitPrice = totalSeat != null && totalSeat == 6 ? getBigDecimal(destination.get("price7")) : getBigDecimal(destination.get("price5")); if (unitPrice == null) { unitPrice = getBigDecimal(destination.get("price5")); } } map.put("price", unitPrice == null ? -1 : multiplyPeopleNumber(unitPrice, peopleNumber).doubleValue()); return ResultUtil.success(map); } if (lineId != null && lineId == -1) { if (lineShiftDriverId == null) { map.put("price", -1); return ResultUtil.success(map); } LineShiftDriver lineShiftDriver = lineShiftDriverMapper.selectById(lineShiftDriverId); if (lineShiftDriver == null) { map.put("price", -1); return ResultUtil.success(map); } OrderCrossCityScanWarpper warpper = new OrderCrossCityScanWarpper(); warpper.setEndLon(endLon); warpper.setEndLat(endLat); warpper.setPeopleNumber(peopleNumber); return getPriceV2(lineId, lineShiftDriver, warpper); } List> destinations = lineMapper.queryLineDestinations(lineId); if (destinations == null || destinations.size() == 0) { map.put("price", -1); return ResultUtil.success(map); } BigDecimal defaultPrice5 = getBigDecimal(destinations.get(0).get("price5")); BigDecimal matchedPrice = null; for (Map destination : destinations) { if (isPointInDestinationFence(destination, endLon, endLat)) { matchedPrice = totalSeat != null && totalSeat == 6 ? getBigDecimal(destination.get("price7")) : getBigDecimal(destination.get("price5")); if (matchedPrice == null) { matchedPrice = getBigDecimal(destination.get("price5")); } break; } } BigDecimal finalPrice = matchedPrice == null ? defaultPrice5 : matchedPrice; map.put("price", finalPrice == null ? -1 : multiplyPeopleNumber(finalPrice, peopleNumber).doubleValue()); return ResultUtil.success(map); } private BigDecimal querySelfTripNearestPrice(LineShiftDriver lineShiftDriver, OrderCrossCityScanWarpper warpper) { Integer customerId = lineShiftDriverMapper.queryCustomerIdByLineShiftDriverId(lineShiftDriver.getId()); if (customerId == null) { return null; } DriverSelfTrip selfTrip = driverSelfTripMapper.selectById(customerId); if (selfTrip == null || ToolUtil.isEmpty(selfTrip.getDestJson())) { return null; } JSONArray destArray = JSON.parseArray(selfTrip.getDestJson()); if (destArray == null || destArray.size() == 0) { return null; } BigDecimal bestPrice = null; Double minDistance = null; String target = warpper.getEndLon() + "," + warpper.getEndLat(); for (int i = 0; i < destArray.size(); i++) { JSONObject dest = destArray.getJSONObject(i); if (dest == null || dest.getDouble("endLon") == null || dest.getDouble("endLat") == null || dest.getBigDecimal("price") == null) { continue; } String source = dest.getDouble("endLon") + "," + dest.getDouble("endLat"); Double distance = geodesyUtil.getDistance(source, target).get("WGS84"); if (distance == null) { continue; } if (minDistance == null || distance < minDistance) { minDistance = distance; bestPrice = dest.getBigDecimal("price"); } } return bestPrice; } private BigDecimal queryLineDestinationPrice(Integer lineId, LineShiftDriver lineShiftDriver, OrderCrossCityScanWarpper warpper) { List> destinations = lineMapper.queryLineDestinations(lineId); if (destinations == null || destinations.size() == 0) { return null; } BigDecimal defaultPrice5 = getBigDecimal(destinations.get(0).get("price5")); for (Map destination : destinations) { if (isPointInDestinationFence(destination, warpper.getEndLon(), warpper.getEndLat())) { if (lineShiftDriver.getTotalSeat() != null && lineShiftDriver.getTotalSeat() == 6) { BigDecimal price7 = getBigDecimal(destination.get("price7")); return price7 == null ? defaultPrice5 : price7; } BigDecimal price5 = getBigDecimal(destination.get("price5")); return price5 == null ? defaultPrice5 : price5; } } return defaultPrice5; } private boolean isPointInDestinationFence(Map destination, Double lon, Double lat) { if (destination == null || lon == null || lat == null) { return false; } Integer fenceType = destination.get("fenceType") == null ? null : Integer.valueOf(String.valueOf(destination.get("fenceType"))); String coordinate = destination.get("coordinate") == null ? null : String.valueOf(destination.get("coordinate")); if (fenceType == null || ToolUtil.isEmpty(coordinate)) { return false; } if (fenceType == 1) { String[] arr = coordinate.split(";"); if (arr.length != 2) { return false; } String[] center = arr[0].split(","); if (center.length != 2) { return false; } String source = center[0] + "," + center[1]; String target = lon + "," + lat; Double distance = geodesyUtil.getDistance(source, target).get("WGS84"); return distance != null && distance <= Double.valueOf(arr[1]); } return isPointInPolygon(coordinate, lon, lat); } private boolean isPointInPolygon(String coordinate, Double lon, Double lat) { String[] points = coordinate.split(";"); if (points.length < 3) { return false; } boolean inside = false; for (int i = 0, j = points.length - 1; i < points.length; j = i++) { String[] current = points[i].split(","); String[] previous = points[j].split(","); if (current.length != 2 || previous.length != 2) { continue; } double xi = Double.parseDouble(current[0]); double yi = Double.parseDouble(current[1]); double xj = Double.parseDouble(previous[0]); double yj = Double.parseDouble(previous[1]); boolean intersect = ((yi > lat) != (yj > lat)) && (lon < (xj - xi) * (lat - yi) / ((yj - yi) == 0 ? 0.0000001D : (yj - yi)) + xi); if (intersect) { inside = !inside; } } return inside; } private BigDecimal getBigDecimal(Object value) { if (value == null || ToolUtil.isEmpty(String.valueOf(value))) { return null; } try { return new BigDecimal(String.valueOf(value)); } catch (Exception e) { return null; } } private BigDecimal multiplyPeopleNumber(BigDecimal price, Integer peopleNumber) { if (price == null || peopleNumber == null || peopleNumber <= 0) { return null; } return price.multiply(new BigDecimal(peopleNumber)).setScale(2, BigDecimal.ROUND_HALF_UP); } }