puzhibing
2023-07-20 0655cf0891c66ed11c72e135b86432cbcaf9959c
修改重复收款和优化计算距离及存储有效位置信息的逻辑
3个文件已修改
259 ■■■■■ 已修改文件
driver/guns-admin/src/main/java/com/supersavedriving/driver/modular/system/service/impl/OrderPositionServiceImpl.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
driver/guns-admin/src/main/java/com/supersavedriving/driver/modular/system/service/impl/OrderServiceImpl.java 243 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
driver/guns-admin/src/main/java/com/supersavedriving/driver/modular/system/util/RedisUtil.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
driver/guns-admin/src/main/java/com/supersavedriving/driver/modular/system/service/impl/OrderPositionServiceImpl.java
@@ -70,7 +70,7 @@
            String toLonLat = orderPositionWarpper1.getLon() + "," + orderPositionWarpper1.getLat();
            Map<String, Double> distance = GeodesyUtil.getDistance(fromLonLat, toLonLat);
            Double wgs84 = distance.get("WGS84");
            if(wgs84 >= 50){
            if(wgs84 >= 50 && wgs84 <= 165){//5秒165米
                OrderPositionWarpper orderPositionWarpper = new OrderPositionWarpper();
                BeanUtils.copyProperties(driverPositionWarpper, orderPositionWarpper);
                orderPositionWarpper.setInsertTime(new Date());
@@ -103,7 +103,7 @@
        Order order = orderService.selectById(driverPositionWarpper.getOrderId());
        Double wgs84 = distance.get("WGS84");
        Integer num = map.get(order.getId().toString());
        if(50 < wgs84){
        if(50 < wgs84 && wgs84 <= 165){//5秒165米
            order.setActualMileage(order.getActualMileage() + wgs84.intValue());
            orderService.updateById(order);
            map.put(order.getId().toString(), 0);
driver/guns-admin/src/main/java/com/supersavedriving/driver/modular/system/service/impl/OrderServiceImpl.java
@@ -978,6 +978,12 @@
            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());
@@ -1180,6 +1186,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());
@@ -1328,110 +1340,123 @@
     */
    @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{
                        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 == 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();
            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);
                }, 60000);
            }
            redisUtil.unlock(orderId + "");
            return ResultUtil.success();
        }catch (Exception e){
            redisUtil.unlock(orderId + "");
            e.printStackTrace();
            return ResultUtil.error("系统异常");
        }
        return ResultUtil.success();
    }
@@ -2218,7 +2243,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();
            }
        }
    }
@@ -2226,7 +2274,7 @@
    public void completeCollection_(Order order) {
    public void completeCollection_(Order order) throws Exception{
        order.setState(108);
        order.setPayTime(new Date());
        if(null != order.getCouponId()){
@@ -2277,11 +2325,6 @@
        }
        this.updateById(order);
        try {
            saveRevenue(order);
        } catch (Exception e) {
            e.printStackTrace();
        }
        saveRevenue(order);
    }
}
driver/guns-admin/src/main/java/com/supersavedriving/driver/modular/system/util/RedisUtil.java
@@ -238,6 +238,18 @@
        return lock("redis", uuid, time);
    }
    /**
     * 获取redis锁
     * @param key
     * @param time
     * @return
     */
    public boolean lock(String key, int time){
        String uuid = UUID.randomUUID().toString();
        return lock(key, uuid, time);
    }
    /**
     * redis释放锁