From db7fa6a91b9534ac90e219b6f554c54c43c83a5a Mon Sep 17 00:00:00 2001 From: liujie <liujie> Date: 星期三, 16 八月 2023 09:28:15 +0800 Subject: [PATCH] update --- driver/guns-admin/src/main/java/com/supersavedriving/driver/modular/system/service/impl/OrderServiceImpl.java | 478 +++++++++++++++++++++++++++++++++++++---------------------- 1 files changed, 299 insertions(+), 179 deletions(-) diff --git a/driver/guns-admin/src/main/java/com/supersavedriving/driver/modular/system/service/impl/OrderServiceImpl.java b/driver/guns-admin/src/main/java/com/supersavedriving/driver/modular/system/service/impl/OrderServiceImpl.java index 9efdd92..0e2ab36 100644 --- a/driver/guns-admin/src/main/java/com/supersavedriving/driver/modular/system/service/impl/OrderServiceImpl.java +++ b/driver/guns-admin/src/main/java/com/supersavedriving/driver/modular/system/service/impl/OrderServiceImpl.java @@ -111,6 +111,12 @@ @Autowired private IAgentService agentService; + @Autowired + private IOrderPositionService orderPositionService; + + @Autowired + private ICompanyFundFlowService companyFundFlowService; + @Value("${callbackPath}") private String callbackPath;//支付回调网关地址 @@ -170,6 +176,19 @@ if(null != appUser){ order.setUserId(appUser.getId()); } + + + String startAddress = addOrderWarpper.getStartAddress(); + startAddress = startAddress.replaceAll("& #40;", "("); + startAddress = startAddress.replaceAll("& #41;", ")"); + addOrderWarpper.setStartAddress(startAddress); + if(ToolUtil.isNotEmpty(addOrderWarpper.getEndAddress())){ + String endAddress = addOrderWarpper.getEndAddress(); + endAddress = endAddress.replaceAll("& #40;", "("); + endAddress = endAddress.replaceAll("& #41;", ")"); + addOrderWarpper.setEndAddress(endAddress); + } + order.setUserName(addOrderWarpper.getUserName()); order.setUserPhone(addOrderWarpper.getPhone()); order.setAgentId(driver.getAgentId()); @@ -231,14 +250,14 @@ * @param city 查询天气的城市 * @return */ - public Order getOrderPrice(Integer type, Double distance, Integer waitTime, Order order, String city){ + public Order getOrderPrice(Integer type, Double distance, Integer waitTime, Order order, String city) { order = getOrderInitialPrice(order); SystemConfig systemConfig = systemConfigService.selectOne(new EntityWrapper<SystemConfig>().eq("type", 5)); - if(null == systemConfig){ - if(type == 1){//预估金额 + if (null == systemConfig) { + if (type == 1) {//预估金额 order.setEstimatedPrice(0D); } - if(type == 2){//订单金额 + if (type == 2) {//订单金额 order.setOrderMoney(0D); } return order; @@ -278,19 +297,19 @@ e.set(Calendar.MINUTE, Integer.valueOf(split1[1])); e.set(Calendar.SECOND, 0); - if(hour1 > hour2){ - if(s.getTimeInMillis() > date.getTime()){ + if (hour1 > hour2) { + if (s.getTimeInMillis() > date.getTime()) { s.set(Calendar.DAY_OF_YEAR, s.get(Calendar.DAY_OF_YEAR) - 1); - }else{ + } else { e.set(Calendar.DAY_OF_YEAR, e.get(Calendar.DAY_OF_YEAR) + 1); } } - if(date.getTime() >= s.getTimeInMillis() && date.getTime() < e.getTimeInMillis()){ - if(num3.compareTo(distance) >= 0){//起步里程内 + if (date.getTime() >= s.getTimeInMillis() && date.getTime() < e.getTimeInMillis()) { + if (num3.compareTo(distance) >= 0) {//起步里程内 order.setStartDistance(distance);//起步里程 order.setStartPrice(num4);//起步价 - }else{ + } else { Double distance1 = distance;//原始里程 order.setStartDistance(num3);//起步里程 order.setStartPrice(num4);//起步价 @@ -302,7 +321,7 @@ order.setOverDrivePrice(multiply.doubleValue());//超出起步里程费 //计算长途费(超出长途起始公里,费用开始按照长途规则计算。) - if(distance.compareTo(num7) > 0){ + if (distance.compareTo(num7) > 0) { order.setStartDistance(0D);//起步里程 order.setStartPrice(0D);//起步价 order.setOverDriveDistance(0D);//超出起步里程 @@ -312,7 +331,7 @@ order.setLongDistancePrice(num9);//长途费 } //计算长途里程超出的部分 - if(distance.compareTo(num8) > 0){ + if (distance.compareTo(num8) > 0) { order.setOverLongDistance(new BigDecimal(distance1 - num8).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue());//超出长途里程 BigDecimal divide1 = new BigDecimal(distance - num8).divide(new BigDecimal(num10), 2, BigDecimal.ROUND_HALF_EVEN); @@ -336,7 +355,7 @@ Double num9 = extraCost.getDouble("num9");//恶劣天气最高收取金额 //等待费用 - if(waitTime.compareTo(num1 * 60) >= 0){ + if (waitTime.compareTo(num1 * 60) >= 0) { order.setWaitTime(num1 * 60);//等待时长 order.setWaitTimePrice(num2);//等待费用 @@ -344,19 +363,22 @@ BigDecimal multiply = new BigDecimal(w).divide(new BigDecimal(60), 0, RoundingMode.UP).multiply(new BigDecimal(num4)); order.setOutWaitTime(w);//等待时长超出分钟 order.setOutWaitTimePrice(multiply.doubleValue());//等待时长超出费用 + }else{ + order.setWaitTime(waitTime);//等待时长 + order.setWaitTimePrice(num2);//等待费用 } //恶劣天气 systemConfig = systemConfigService.selectOne(new EntityWrapper<SystemConfig>().eq("type", 8)); - if(null != systemConfig) { + if (null != systemConfig) { JSONObject jsonObject1 = JSON.parseObject(systemConfig.getContent()); Integer num11 = jsonObject1.getInteger("num1");//开启恶劣天气计价 - if(1 == num11){ + if (1 == num11) { boolean badWeather = WeatherUtil.isBadWeather(city); - if(badWeather){ + if (badWeather) { order.setBadWeatherDistance(num5);//恶劣天气公里 order.setBadWeatherPrice(num6);//恶劣天气费 - if(distance.compareTo(num7) > 0){ + if (distance.compareTo(num7) > 0) { BigDecimal subtract = new BigDecimal(distance).subtract(new BigDecimal(num7)); BigDecimal multiply = subtract.multiply(new BigDecimal(num8)); order.setOverBadWeatherDistance(subtract.doubleValue());//恶劣天气超出公里 @@ -364,37 +386,39 @@ } double add = new BigDecimal(order.getOverBadWeatherPrice()).add(new BigDecimal(order.getBadWeatherPrice())).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue(); - if(num9.compareTo(add) < 0){//超出最高金额(重新调整金额) - if(num9.compareTo(num6) < 0){//如果恶劣天气费大于最高金额 + if (num9.compareTo(add) < 0) {//超出最高金额(重新调整金额) + if (num9.compareTo(num6) < 0) {//如果恶劣天气费大于最高金额 order.setBadWeatherPrice(num9);//恶劣天气费 order.setOverBadWeatherPrice(0D);//恶劣天气超出公里费 - }else{ + } else { BigDecimal subtract = new BigDecimal(num9).subtract(new BigDecimal(add)); order.setOverBadWeatherPrice(subtract.doubleValue());//恶劣天气超出公里费 } } } } - } - //计算折扣 - if(null != order.getUserId()){ + //计算折扣 + if (null != order.getUserId()) { - } + } - //计算总金额 - BigDecimal bigDecimal = new BigDecimal(order.getStartPrice() + order.getOverDrivePrice() + order.getLongDistancePrice() + order.getOverLongDistancePrice() + - order.getWaitTimePrice() + order.getOutWaitTimePrice() + order.getBadWeatherPrice() + order.getOverBadWeatherPrice() - order.getDiscountAmount()).setScale(2, BigDecimal.ROUND_HALF_EVEN); + //计算总金额 + BigDecimal bigDecimal = new BigDecimal(order.getStartPrice() + order.getOverDrivePrice() + order.getLongDistancePrice() + order.getOverLongDistancePrice() + + order.getWaitTimePrice() + order.getOutWaitTimePrice() + order.getBadWeatherPrice() + order.getOverBadWeatherPrice() - order.getDiscountAmount()).setScale(2, BigDecimal.ROUND_HALF_EVEN); - if(type == 1){//预估价 - order.setEstimatedPrice(bigDecimal.doubleValue()); - } - if(type == 2){//订单金额 - order.setOrderMoney(bigDecimal.doubleValue()); + if (type == 1) {//预估价 + order.setEstimatedPrice(bigDecimal.doubleValue()); + } + if (type == 2) {//订单金额 + order.setOrderMoney(bigDecimal.doubleValue()); + } + return order; } return order; } + /** @@ -440,12 +464,12 @@ * 合适司:积分 > 评分 > 距离 * 3.司机没有接单直接将订单置入大厅 */ - boolean lock = redisUtil.lock(5); + boolean lock = redisUtil.lock(orderId.toString(), 5); if(!lock){ int num1 = 1; while (num1 <= 10){ Thread.sleep(3000);//等待3秒 - lock = redisUtil.lock(5); + lock = redisUtil.lock(orderId.toString(),5); if(lock){ break; }else{ @@ -457,11 +481,12 @@ order.setHallOrder(1); this.updateById(order); ExtraPushOrder(order); - redisUtil.unlock(); + redisUtil.unlock(orderId.toString()); + return; } SystemConfig systemConfig = systemConfigService.selectOne(new EntityWrapper<SystemConfig>().eq("type", 1)); if(null == systemConfig){ - redisUtil.unlock(); + redisUtil.unlock(orderId.toString()); return; } JSONObject jsonObject = JSON.parseObject(systemConfig.getContent()); @@ -624,10 +649,10 @@ this.updateById(order); ExtraPushOrder(order); } - redisUtil.unlock(); + redisUtil.unlock(orderId.toString()); }catch (Exception e){ e.printStackTrace(); - redisUtil.unlock(); + redisUtil.unlock(orderId.toString()); } } @@ -780,12 +805,12 @@ if(count > 0){ return ResultUtil.error("还有未完成的订单"); } - boolean lock = redisUtil.lock(5); + boolean lock = redisUtil.lock(orderId.toString(), 5); if(!lock){ int num1 = 1; while (num1 <= 10){ Thread.sleep(3000);//等待3秒 - lock = redisUtil.lock(5); + lock = redisUtil.lock(orderId.toString(),5); if(lock){ break; }else{ @@ -794,17 +819,18 @@ } } if(!lock){ + redisUtil.unlock(orderId.toString()); return ResultUtil.error("请重试"); } Order order = this.selectById(orderId); Integer state = order.getState(); Integer oldDriverId = order.getDriverId(); if(state == 301){ - redisUtil.unlock(); + redisUtil.unlock(orderId.toString()); return ResultUtil.error("订单已被取消"); } if(state != 101 && state != 201){ - redisUtil.unlock(); + redisUtil.unlock(orderId.toString()); return ResultUtil.error("手速慢了哦"); } order.setDriverId(uid); @@ -813,7 +839,7 @@ order.setState(102); order.setOrderTakingTime(new Date()); this.updateById(order); - redisUtil.unlock(); + redisUtil.unlock(orderId.toString()); if(null != order.getUserId()){ AppUser appUser = appUserService.selectById(order.getUserId()); @@ -853,9 +879,10 @@ orderTransfer.setSuccessTime(new Date()); orderTransferService.insert(orderTransfer); } - - pushUtil.pushTransferSuccessful(order.getUserId(), 1, order.getId()); pushUtil.pushTransferSuccessful(oldDriverId, 2, order.getId()); + if(null != order.getUserId()){ + pushUtil.pushTransferSuccessful(order.getUserId(), 1, order.getId()); + } } //推动订单数据 @@ -868,7 +895,7 @@ pushUtil.pushOrderStatus(order.getUserId(), 1, order.getId(), order.getState()); } }catch (Exception e){ - redisUtil.unlock(); + redisUtil.unlock(orderId.toString()); e.printStackTrace(); throw e; } @@ -917,6 +944,7 @@ Map<String, String> distance1 = MapUtil.getDistance(orderInfoWarpper.getStartLng() + "," + orderInfoWarpper.getStartLat(), value, 0); orderInfoWarpper.setPickUpTime(Integer.valueOf(distance1.get("duration")) / 60); } + orderInfoWarpper.setDriverId(order.getDriverId()); return orderInfoWarpper; } @@ -961,10 +989,17 @@ Integer w = new BigDecimal(Double.valueOf(System.currentTimeMillis() - order.getStartWaitTime().getTime()) / 1000).intValue(); order.setWaitTime(order.getWaitTime() + w); order.setStartWaitTime(null); + orderPositionService.initMap(order.getId()); break; case 106: order.setGetoffTime(new Date()); if(ToolUtil.isEmpty(order.getEndAddress())){ + + String endAddress = processOperationsWarpper.getEndAddress(); + endAddress = endAddress.replaceAll("& #40;", "("); + endAddress = endAddress.replaceAll("& #41;", ")"); + processOperationsWarpper.setEndAddress(endAddress); + order.setEndAddress(processOperationsWarpper.getEndAddress()); order.setEndLng(processOperationsWarpper.getEndLng()); order.setEndLat(processOperationsWarpper.getEndLat()); @@ -977,7 +1012,12 @@ .where("'" + geocode.getCity() + "' like CONCAT('%', city, '%') and '" + geocode.getDistrict() + "' like CONCAT('%', district, '%') ")); city = null != weatherCity ? weatherCity.getId().toString() : ""; } - order = getOrderPrice(2, Double.valueOf(order.getActualMileage()) / 1000, order.getWaitTime(), order, city); + try { + order = getOrderPrice(2, Double.valueOf(order.getActualMileage()) / 1000, order.getWaitTime(), order, city); + }catch (Exception e){ + e.printStackTrace(); + return ResultUtil.error("计算费用异常"); + } Coupon coupon = userToCouponService.queryCoupon(order.getUserId(), order.getOrderMoney()); if(null != coupon){ order.setCouponId(coupon.getId()); @@ -990,10 +1030,6 @@ order.setPayMoney(order.getOrderMoney()); } - //修改司机状态和积分 - Driver driver = driverService.selectById(order.getDriverId()); - driver.setServerStatus(1); - driverService.updateById(driver); saveIntegral(order); redisUtil.delSetValue("orderService", order.getId().toString()); break; @@ -1125,8 +1161,26 @@ * @throws Exception */ @Override - public ResultUtil transferOrder(Integer uid, Long orderId, String cause) throws Exception { + public ResultUtil transferOrder(Integer uid, Long orderId, String cause, String phone) throws Exception { + // 7.13改动 + OrderTransfer orderTransfer = new OrderTransfer(); Order order = this.selectById(orderId); + if(phone!=null && !"".equals(phone)) { + List<Driver> drivers = driverService.selectList(new EntityWrapper<Driver>().eq("phone", phone)); + if (drivers.size() == 0) { + return ResultUtil.error("暂无该司机,无法转单"); + } else { + Driver driver = drivers.get(0); + if (driver.getServerStatus() != 1) { + return ResultUtil.error("司机正在服务中,无法转单。"); + } + if (driver.getStatus() != 1) { + return ResultUtil.error("该司机已被冻结,无法转单。"); + } + order.setDriverId(driver.getId()); + orderTransfer.setNewDriverId(driver.getId()); + } + } if(order.getDriverId().compareTo(uid) != 0){ return ResultUtil.error("无权操作"); } @@ -1137,22 +1191,24 @@ order.setState(201); this.updateById(order); - OrderTransfer orderTransfer = new OrderTransfer(); + orderTransfer.setOrderId(orderId); orderTransfer.setOldDriverId(order.getDriverId()); orderTransfer.setCause(cause); orderTransfer.setStatus(1); orderTransfer.setCreateTime(new Date()); orderTransferService.insert(orderTransfer); + if(phone==null ||"".equals(phone)){ + //开始派单 + Order finalOrder = order; + new Thread(new Runnable() { + @Override + public void run() { + pushOrder(finalOrder.getId()); + } + }).start(); + } - //开始派单 - Order finalOrder = order; - new Thread(new Runnable() { - @Override - public void run() { - pushOrder(finalOrder.getId()); - } - }).start(); return ResultUtil.success(); } @@ -1167,6 +1223,12 @@ @Override public ResultUtil setOrderEndAddress(Integer uid, OrderEndAddressWarpper orderEndAddressWarpper) throws Exception { Order order = this.selectById(orderEndAddressWarpper.getOrderId()); + + String endAddress = orderEndAddressWarpper.getEndAddress(); + endAddress = endAddress.replaceAll("& #40;", "("); + endAddress = endAddress.replaceAll("& #41;", ")"); + orderEndAddressWarpper.setEndAddress(endAddress); + order.setEndLat(orderEndAddressWarpper.getEndLat()); order.setEndLng(orderEndAddressWarpper.getEndLng()); order.setEndAddress(orderEndAddressWarpper.getEndAddress()); @@ -1228,6 +1290,9 @@ @Override public ResultUtil driverCancelOrder(Integer uid, Long orderId, String cause) throws Exception { Order order = this.selectById(orderId); + if(null == order){ + return ResultUtil.error("订单数据异常"); + } if(uid.compareTo(order.getDriverId()) != 0){ return ResultUtil.error("无法取消订单"); } @@ -1281,11 +1346,13 @@ orderPriceWarpper.setOverDriveDistance(order.getOverDriveDistance()); orderPriceWarpper.setMileageFee(order.getOverDrivePrice()); }else{ - String[] split = order.getLongDistance().split("-"); - orderPriceWarpper.setStartPrice(order.getLongDistancePrice()); - orderPriceWarpper.setStartDistance(Double.valueOf(split[1])); - orderPriceWarpper.setOverDriveDistance(order.getOverLongDistance()); - orderPriceWarpper.setMileageFee(order.getOverLongDistancePrice()); + if(order.getLongDistance().indexOf("-") >= 0){ + String[] split = order.getLongDistance().split("-"); + orderPriceWarpper.setStartPrice(order.getLongDistancePrice()); + orderPriceWarpper.setStartDistance(Double.valueOf(split[1])); + orderPriceWarpper.setOverDriveDistance(order.getOverLongDistance()); + orderPriceWarpper.setMileageFee(order.getOverLongDistancePrice()); + } } Integer waitTime = order.getWaitTime() + order.getOutWaitTime(); Integer s = waitTime % 60; @@ -1315,111 +1382,140 @@ */ @Override public ResultUtil setOrderStatus(Integer uid, Long orderId, Integer payType, Integer state) throws Exception { - if(108 == state){ - String value = redisUtil.getValue("repeat_" + orderId); - if(ToolUtil.isEmpty(value)){ - redisUtil.setStrValue("repeat_" + orderId, System.currentTimeMillis() + "", 600);//10分钟 - }else{ - Long s = System.currentTimeMillis() - Long.valueOf(value); - if(s.compareTo(60000L) < 0){//1分钟 - return ResultUtil.error("数据处理中"); - } - redisUtil.setStrValue("repeat_" + orderId, System.currentTimeMillis() + "", 600);//10分钟 - } - } - - List<Integer> s = Arrays.asList(107, 108); - if(!s.contains(state)){ - return ResultUtil.error("操作失败,请刷新订单"); - } - Order order = this.selectById(orderId); - if(order.getState().compareTo(state) == 0){ - return ResultUtil.error("不能重复操作"); - } - order.setState(state); - - if(payType == 2 && state == 107){ - order.setPayType(3); - } - - if(payType == 2 && state == 108){ - order.setPayTime(new Date()); - if(null != order.getCouponId()){ - UserToCoupon userToCoupon = userToCouponService.selectById(order.getCouponId()); - Coupon coupon = couponService.selectById(userToCoupon.getCouponId()); - - Driver driver = driverService.selectById(order.getDriverId()); - AccountChangeDetail accountChangeDetail = new AccountChangeDetail(); - accountChangeDetail.setCode(System.currentTimeMillis() + UUIDUtil.getNumberRandom(5)); - accountChangeDetail.setUserType(2); - accountChangeDetail.setUserId(order.getDriverId()); - accountChangeDetail.setCreateTime(new Date()); - accountChangeDetail.setOldData(new BigDecimal(driver.getCouponBalance()).add(new BigDecimal(driver.getCommission())).setScale(2, RoundingMode.HALF_EVEN).doubleValue()); - accountChangeDetail.setType(1); - accountChangeDetail.setChangeType(7); - accountChangeDetail.setOrderId(order.getId()); - accountChangeDetail.setExplain("优惠券收入"); - driver.setCommission(new BigDecimal(driver.getCommission()).add(new BigDecimal(coupon.getCouponPreferentialAmount())).setScale(2, RoundingMode.HALF_EVEN).doubleValue()); - accountChangeDetail.setNewData(new BigDecimal(driver.getCouponBalance()).add(new BigDecimal(driver.getCommission())).setScale(2, RoundingMode.HALF_EVEN).doubleValue()); - driverService.updateById(driver); - accountChangeDetailService.insert(accountChangeDetail); - - //补贴中分账 - Double discountedPrice = order.getDiscountedPrice(); - List<RechargeRecord> rechargeRecords = rechargeRecordService.selectList(new EntityWrapper<RechargeRecord>().eq("type", 4).eq("payStatus", 2).gt("surplusDividedAmount", 0).orderBy("createTime")); - for (RechargeRecord rechargeRecord : rechargeRecords) { - Double surplusDividedAmount = rechargeRecord.getSurplusDividedAmount(); - if(surplusDividedAmount.compareTo(discountedPrice) >= 0){ - ResultUtil<Double> zhaunzhang = zhaunzhang(rechargeRecord.getId(), rechargeRecord.getOrderNumber(), driver.getMerchantNumber(), discountedPrice, callbackPath + "/base/order/zhaunzhangCallback"); - if(10000 == zhaunzhang.getCode()){ - Double remainAmount = zhaunzhang.getData(); - rechargeRecord.setSurplusDividedAmount(remainAmount); - rechargeRecordService.updateById(rechargeRecord); - } + try { + boolean lock = redisUtil.lock(orderId + "",5); + if(!lock){ + int num1 = 1; + while (num1 <= 10){ + Thread.sleep(3000);//等待3秒 + lock = redisUtil.lock(orderId + "",5); + if(lock){ break; }else{ - ResultUtil<Double> zhaunzhang = zhaunzhang(rechargeRecord.getId(), rechargeRecord.getOrderNumber(), driver.getMerchantNumber(), surplusDividedAmount, callbackPath + "/base/order/zhaunzhangCallback"); - if(10000 == zhaunzhang.getCode()){ - Double remainAmount = zhaunzhang.getData(); - rechargeRecord.setSurplusDividedAmount(remainAmount); - rechargeRecordService.updateById(rechargeRecord); - discountedPrice = new BigDecimal(discountedPrice).subtract(new BigDecimal(surplusDividedAmount)).setScale(2, RoundingMode.HALF_EVEN).doubleValue(); - }else{ - break; - } + num1++; } } } + if(!lock){ + redisUtil.unlock(orderId + ""); + return ResultUtil.error("请稍后重试"); + } - } - this.updateById(order); + Order order = this.selectById(orderId); + if(state == 107 && order.getState() != 106){ + redisUtil.unlock(orderId + ""); + return ResultUtil.error("操作失败,请刷新数据"); + } + if(state == 108 && order.getState() != 107){ + redisUtil.unlock(orderId + ""); + return ResultUtil.error("操作失败,请刷新数据"); + } - if(payType == 2 && state == 108){//计算抽成 - saveRevenue(order); - } + order.setState(state); - PushOrderInfoWarpper pushOrderInfoWarpper = new PushOrderInfoWarpper(); - pushOrderInfoWarpper.setId(order.getId()); - pushOrderInfoWarpper.setState(order.getState()); - pushUtil.pushOrderInfo(order.getDriverId(), 2, pushOrderInfoWarpper); - if(null != order.getUserId()){ - pushUtil.pushOrderStatus(order.getUserId(), 1, order.getId(), order.getState()); - } + if(payType == 2 && state == 107){ + order.setPayType(3); + } - if(payType == 2 && state == 107){ - new Timer().schedule(new TimerTask() { - @Override - public void run() { - Order order1 = OrderServiceImpl.this.selectById(orderId); - if(order1.getState() == 107){ - completeCollection_(order1); + if(payType == 2 && state == 108){ + order.setPayTime(new Date()); + if(null != order.getCouponId()){ + UserToCoupon userToCoupon = userToCouponService.selectById(order.getCouponId()); + Coupon coupon = couponService.selectById(userToCoupon.getCouponId()); + + Driver driver = driverService.selectById(order.getDriverId()); + AccountChangeDetail accountChangeDetail = new AccountChangeDetail(); + accountChangeDetail.setCode(System.currentTimeMillis() + UUIDUtil.getNumberRandom(5)); + accountChangeDetail.setUserType(2); + accountChangeDetail.setUserId(order.getDriverId()); + accountChangeDetail.setCreateTime(new Date()); + accountChangeDetail.setOldData(new BigDecimal(driver.getCouponBalance()).add(new BigDecimal(driver.getCommission())).setScale(2, RoundingMode.HALF_EVEN).doubleValue()); + accountChangeDetail.setType(1); + accountChangeDetail.setChangeType(7); + accountChangeDetail.setOrderId(order.getId()); + accountChangeDetail.setExplain("优惠券收入"); + driver.setCommission(new BigDecimal(driver.getCommission()).add(new BigDecimal(coupon.getCouponPreferentialAmount())).setScale(2, RoundingMode.HALF_EVEN).doubleValue()); + accountChangeDetail.setNewData(new BigDecimal(driver.getCouponBalance()).add(new BigDecimal(driver.getCommission())).setScale(2, RoundingMode.HALF_EVEN).doubleValue()); + driverService.updateById(driver); + accountChangeDetailService.insert(accountChangeDetail); + + //补贴中分账 + Double balance = revenueService.queryCompanyBalance();//平台账户余额 + + Double discountedPrice = order.getDiscountedPrice(); + List<RechargeRecord> rechargeRecords = rechargeRecordService.selectList(new EntityWrapper<RechargeRecord>().eq("type", 4).eq("payStatus", 2).gt("surplusDividedAmount", 0).orderBy("createTime")); + for (RechargeRecord rechargeRecord : rechargeRecords) { + Double surplusDividedAmount = rechargeRecord.getSurplusDividedAmount(); + if(surplusDividedAmount.compareTo(discountedPrice) >= 0){ + ResultUtil<Double> zhaunzhang = zhaunzhang(rechargeRecord.getId(), rechargeRecord.getOrderNumber(), driver.getMerchantNumber(), discountedPrice, callbackPath + "/base/order/zhaunzhangCallback"); + if(10000 == zhaunzhang.getCode()){ + Double remainAmount = zhaunzhang.getData(); + rechargeRecord.setSurplusDividedAmount(remainAmount); + rechargeRecordService.updateById(rechargeRecord); + } + break; + }else{ + ResultUtil<Double> zhaunzhang = zhaunzhang(rechargeRecord.getId(), rechargeRecord.getOrderNumber(), driver.getMerchantNumber(), surplusDividedAmount, callbackPath + "/base/order/zhaunzhangCallback"); + if(10000 == zhaunzhang.getCode()){ + Double remainAmount = zhaunzhang.getData(); + rechargeRecord.setSurplusDividedAmount(remainAmount); + rechargeRecordService.updateById(rechargeRecord); + discountedPrice = new BigDecimal(discountedPrice).subtract(new BigDecimal(surplusDividedAmount)).setScale(2, RoundingMode.HALF_EVEN).doubleValue(); + }else{ + break; + } + } } + + CompanyFundFlow companyFundFlow = new CompanyFundFlow(); + companyFundFlow.setType(5); + companyFundFlow.setObjectType(1); + companyFundFlow.setBalance(new BigDecimal(balance)); + companyFundFlow.setMoney(new BigDecimal(order.getDiscountedPrice())); + companyFundFlow.setCreateTime(new Date()); + companyFundFlowService.insert(companyFundFlow); } - }, 60000); + } + this.updateById(order); + + if((payType == 1 && state == 107) || (payType == 2 && state == 108)){ + //修改司机状态和积分 + Driver driver = driverService.selectById(order.getDriverId()); + driver.setServerStatus(1); + driverService.updateById(driver); + } + + if(payType == 2 && state == 108){//计算抽成 + saveRevenue(order); + } + + PushOrderInfoWarpper pushOrderInfoWarpper = new PushOrderInfoWarpper(); + pushOrderInfoWarpper.setId(order.getId()); + pushOrderInfoWarpper.setState(order.getState()); + pushUtil.pushOrderInfo(order.getDriverId(), 2, pushOrderInfoWarpper); + if(null != order.getUserId()){ + pushUtil.pushOrderStatus(order.getUserId(), 1, order.getId(), order.getState()); + } + + if(payType == 2 && state == 107){ + new Timer().schedule(new TimerTask() { + @Override + public void run() { + try { + OrderServiceImpl.this.setOrderStatus(uid, orderId, payType, 108); + }catch (Exception e){ + e.printStackTrace(); + } + } + }, 60000); + } + redisUtil.unlock(orderId + ""); + return ResultUtil.success(); + }catch (Exception e){ + redisUtil.unlock(orderId + ""); + e.printStackTrace(); + return ResultUtil.error("系统异常"); } - - - return ResultUtil.success(); } @@ -1903,6 +1999,7 @@ } //处理代理商抽佣 if(num3 > 0){ + Double balance = revenueService.queryAgentBalance(driver.getAgentId()); Revenue revenue = new Revenue(); revenue.setType(1); revenue.setUserType(3); @@ -1934,6 +2031,15 @@ } } } + + CompanyFundFlow companyFundFlow = new CompanyFundFlow(); + companyFundFlow.setType(3); + companyFundFlow.setObjectType(2); + companyFundFlow.setObjectId(driver.getAgentId()); + companyFundFlow.setBalance(new BigDecimal(balance)); + companyFundFlow.setMoney(new BigDecimal(num3)); + companyFundFlow.setCreateTime(new Date()); + companyFundFlowService.insert(companyFundFlow); } } } @@ -2092,6 +2198,14 @@ } if(type == 3){//收入 performanceRankingWarppers = revenueService.queryDriverRank(1, time, dayType); + + // 通过司机id 去差订单的优惠金额 + for (PerformanceRankingWarpper performanceRankingWarpper : performanceRankingWarppers) { + List<Order> orders = this.baseMapper.selectList(new EntityWrapper<Order>().eq("driverId", performanceRankingWarpper.getDriverId()).isNotNull("payMoney")); + double sum = orders.stream().mapToDouble(Order::getDiscountedPrice).sum(); + double sum1 = orders.stream().mapToDouble(Order::getDiscountAmount).sum(); + performanceRankingWarpper.setAmountOfData(new BigDecimal(performanceRankingWarpper.getAmountOfData()+sum+sum1).setScale(2,RoundingMode.HALF_UP).doubleValue()); + } } for (int i = 0; i < performanceRankingWarppers.size(); i++) { PerformanceRankingWarpper performanceRankingWarpper = performanceRankingWarppers.get(i); @@ -2131,10 +2245,6 @@ if(performanceRankingWarpper.getDriverId().compareTo(driverId) == 0){ break; } - if(i == performanceRankingWarppers.size() - 1){ - position = 0; - d = 0D; - } } MyAchievementWarpper myAchievementWarpper = new MyAchievementWarpper(); myAchievementWarpper.setType("订单"); @@ -2156,10 +2266,6 @@ } if(performanceRankingWarpper.getDriverId().compareTo(driverId) == 0){ break; - } - if(i == performanceRankingWarppers.size() - 1){ - position = 0; - d = 0D; } } myAchievementWarpper = new MyAchievementWarpper(); @@ -2183,10 +2289,6 @@ if(performanceRankingWarpper.getDriverId().compareTo(driverId) == 0){ break; } - if(i == performanceRankingWarppers.size() - 1){ - position = 0; - d = 0D; - } } myAchievementWarpper = new MyAchievementWarpper(); myAchievementWarpper.setType("佣金"); @@ -2206,7 +2308,30 @@ List<Order> orders = this.selectList(new EntityWrapper<Order>().eq("state", 107).eq("status", 1) .eq("payType", 3).last(" and UNIX_TIMESTAMP(getoffTime) + 600 <= UNIX_TIMESTAMP(now())")); for (Order order : orders) { - completeCollection_(order); + Long orderId = order.getId(); + try { + boolean lock = redisUtil.lock(orderId + "",5); + if(!lock){ + int num1 = 1; + while (num1 <= 10){ + Thread.sleep(3000);//等待3秒 + lock = redisUtil.lock(orderId + "",5); + if(lock){ + break; + }else{ + num1++; + } + } + } + if(!lock){ + redisUtil.unlock(orderId + ""); + continue; + } + completeCollection_(order); + }catch (Exception e){ + redisUtil.unlock(orderId + ""); + e.printStackTrace(); + } } } @@ -2214,7 +2339,7 @@ - public void completeCollection_(Order order) { + public void completeCollection_(Order order) throws Exception{ order.setState(108); order.setPayTime(new Date()); if(null != order.getCouponId()){ @@ -2265,11 +2390,6 @@ } this.updateById(order); - - try { - saveRevenue(order); - } catch (Exception e) { - e.printStackTrace(); - } + saveRevenue(order); } } -- Gitblit v1.7.1