From d5b3e5a413bcfccba294793ee093722f31b2448a Mon Sep 17 00:00:00 2001
From: puzhibing <393733352@qq.com>
Date: 星期三, 16 八月 2023 17:02:13 +0800
Subject: [PATCH] 添加推单日志

---
 driver/guns-admin/src/main/java/com/supersavedriving/driver/modular/system/service/impl/OrderServiceImpl.java |  429 +++++++++++++++++++++++++++++++++-------------------
 1 files changed, 271 insertions(+), 158 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 a25c1ad..53c5e88 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,9 @@
     @Autowired
     private IAgentService agentService;
 
+    @Autowired
+    private IOrderPositionService orderPositionService;
+
     @Value("${callbackPath}")
     private String callbackPath;//支付回调网关地址
 
@@ -170,6 +173,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,7 +247,7 @@
      * @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) throws Exception{
         order = getOrderInitialPrice(order);
         SystemConfig systemConfig = systemConfigService.selectOne(new EntityWrapper<SystemConfig>().eq("type", 5));
         if(null == systemConfig){
@@ -270,7 +286,7 @@
             s.setTime(date);
             s.set(Calendar.HOUR_OF_DAY, hour1);
             s.set(Calendar.MINUTE, Integer.valueOf(split[1]));
-            s.set(Calendar.SECOND, 0);
+            s.set(Calendar.SECOND, 59);
 
             Calendar e = Calendar.getInstance();
             e.setTime(date);
@@ -344,6 +360,9 @@
             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);//等待费用
         }
 
         //恶劣天气
@@ -440,12 +459,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 +476,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());
@@ -494,7 +514,8 @@
                         continue;
                     }
                     Driver driver1 = driverService.selectById(youTuiDriver.getDriverId());
-                    if(driver1.getServerStatus() == 2 || driver1.getOpenOrderQRCode() == 1){
+                    int count = this.selectCount(new EntityWrapper<Order>().eq("driverId", youTuiDriver.getDriverId()).eq("status", 1).in("state", Arrays.asList(102, 103, 104, 105, 201, 401)));
+                    if(driver1.getServerStatus() == 2 || driver1.getOpenOrderQRCode() == 1 || count > 0){
                         continue;
                     }
                     DriverWork driverWork = driverWorkService.selectOne(new EntityWrapper<DriverWork>().eq("driverId", driver1.getId()).eq("status", 1));
@@ -550,7 +571,10 @@
                             if(null == driverWork){
                                 continue;
                             }
-
+                            int count = this.selectCount(new EntityWrapper<Order>().eq("driverId", driver1.getId()).eq("status", 1).in("state", Arrays.asList(102, 103, 104, 105, 201, 401)));
+                            if(count > 0){
+                                continue;
+                            }
                             if(integral == null || integral.compareTo(driver1.getIntegral()) < 0){//积分大
                                 integral = driver1.getIntegral();
                                 score = driver1.getScore();
@@ -620,10 +644,10 @@
                 this.updateById(order);
                 ExtraPushOrder(order);
             }
-            redisUtil.unlock();
+            redisUtil.unlock(orderId.toString());
         }catch (Exception e){
             e.printStackTrace();
-            redisUtil.unlock();
+            redisUtil.unlock(orderId.toString());
         }
     }
 
@@ -680,6 +704,7 @@
         pageNum = (pageNum - 1) * pageSize;
         String value = redisUtil.getValue("DRIVER" + uid);
         List<HallOrderList> hallOrderLists = this.baseMapper.queryOrderHall(pageNum, pageSize);
+        List<HallOrderList> lists = new ArrayList<>();
         hallOrderLists.forEach(hallOrderList -> {
             if(ToolUtil.isEmpty(hallOrderList.getAvatar())){
                 hallOrderList.setAvatar("https://csxdj.obs.cn-south-1.myhuaweicloud.com:443/66cc269703a84e4da87fb21e2c21ab1f.png");
@@ -689,11 +714,17 @@
                 Map<String, Double> distance = GeodesyUtil.getDistance(hallOrderList.getStartLng() + "," + hallOrderList.getStartLat(), value);
                 Double wgs84 = distance.get("WGS84");
                 hallOrderList.setCurrentDistance(wgs84);
+
+                if(wgs84 > 5000){
+                    return;
+                }
             }else{
                 hallOrderList.setCurrentDistance(0D);
+                return;
             }
+            lists.add(hallOrderList);
         });
-        return hallOrderLists;
+        return lists;
     }
 
 
@@ -769,12 +800,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{
@@ -783,17 +814,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);
@@ -802,7 +834,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());
@@ -842,9 +874,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());
+                }
             }
 
             //推动订单数据
@@ -857,7 +890,7 @@
                 pushUtil.pushOrderStatus(order.getUserId(), 1, order.getId(), order.getState());
             }
         }catch (Exception e){
-            redisUtil.unlock();
+            redisUtil.unlock(orderId.toString());
             e.printStackTrace();
             throw e;
         }
@@ -906,6 +939,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;
     }
 
@@ -950,10 +984,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());
@@ -966,7 +1007,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());
@@ -979,10 +1025,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;
@@ -1156,6 +1198,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());
@@ -1217,6 +1265,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("无法取消订单");
         }
@@ -1270,11 +1321,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;
@@ -1304,96 +1357,130 @@
      */
     @Override
     public ResultUtil setOrderStatus(Integer uid, Long orderId, Integer payType, Integer state) throws Exception {
-        if(108 == state){
-            String value = redisUtil.getValue("repeat_" + orderId.toString());
-            if(ToolUtil.isEmpty(value)){
-                redisUtil.setStrValue("repeat_" + orderId, System.currentTimeMillis() + "", 10 * 60);
-            }else{
-                Long s = System.currentTimeMillis() - Long.valueOf(value);
-                if(s < 60000){//1分钟
-                    return ResultUtil.error("数据处理中");
-                }
-            }
-        }
-
-        List<Integer> s = Arrays.asList(107, 108);
-        if(!s.contains(state)){
-            return ResultUtil.error("操作失败,请刷新订单");
-        }
-        Order order = this.selectById(orderId);
-        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{
+                        num1++;
+                    }
+                }
+            }
+            if(!lock){
+                redisUtil.unlock(orderId + "");
+                return ResultUtil.error("请稍后重试");
+            }
+
+            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("操作失败,请刷新数据");
+            }
+
+            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);
+                            }
                             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;
+                            }
                         }
                     }
                 }
             }
+            this.updateById(order);
 
-        }
-        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);
-        }
+            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());
+            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("系统异常");
         }
-        if(108 == state){
-            redisUtil.remove("repeat_" + orderId.toString());
-        }
-        return ResultUtil.success();
     }
 
 
@@ -2180,62 +2267,88 @@
         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) {
-            order.setState(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);
-                        }
-                        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{
+            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++;
                         }
                     }
                 }
-            }
-
-            this.updateById(order);
-
-            try {
-                saveRevenue(order);
-            } catch (Exception e) {
+                if(!lock){
+                    redisUtil.unlock(orderId + "");
+                    continue;
+                }
+                completeCollection_(order);
+            }catch (Exception e){
+                redisUtil.unlock(orderId + "");
                 e.printStackTrace();
             }
         }
     }
+
+
+
+
+
+    public void completeCollection_(Order order) throws Exception{
+        order.setState(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);
+                    }
+                    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;
+                    }
+                }
+            }
+        }
+
+        this.updateById(order);
+        saveRevenue(order);
+    }
 }

--
Gitblit v1.7.1