From a661e711cebd9f0b684dc73ab732b239812f076f Mon Sep 17 00:00:00 2001
From: zhibing.pu <393733352@qq.com>
Date: 星期日, 28 四月 2024 09:23:08 +0800
Subject: [PATCH] 新增加功能

---
 DriverIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/DriverOnlineServiceImpl.java |  212 +++++++++++++++++++++++++++++++++++++---------------
 1 files changed, 151 insertions(+), 61 deletions(-)

diff --git a/DriverIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/DriverOnlineServiceImpl.java b/DriverIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/DriverOnlineServiceImpl.java
index c2af891..9c60452 100644
--- a/DriverIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/DriverOnlineServiceImpl.java
+++ b/DriverIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/DriverOnlineServiceImpl.java
@@ -3,22 +3,29 @@
 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.smallLogistics.model.OrderLogistics;
+import com.stylefeng.guns.modular.smallLogistics.server.IOrderLogisticsService;
+import com.stylefeng.guns.modular.specialTrain.model.OrderPrivateCar;
+import com.stylefeng.guns.modular.specialTrain.server.IOrderPrivateCarService;
+import com.stylefeng.guns.modular.system.dao.DriverActivityHistoryMapper;
+import com.stylefeng.guns.modular.system.dao.DriverActivityOnlineMapper;
 import com.stylefeng.guns.modular.system.dao.DriverOnlineMapper;
-import com.stylefeng.guns.modular.system.model.Driver;
-import com.stylefeng.guns.modular.system.model.DriverAssessment;
-import com.stylefeng.guns.modular.system.model.DriverOnline;
-import com.stylefeng.guns.modular.system.model.DriverWork;
+import com.stylefeng.guns.modular.system.model.*;
 import com.stylefeng.guns.modular.system.service.IDriverAssessmentService;
 import com.stylefeng.guns.modular.system.service.IDriverOnlineService;
 import com.stylefeng.guns.modular.system.service.IDriverService;
 import com.stylefeng.guns.modular.system.service.IDriverWorkService;
+import com.stylefeng.guns.modular.system.util.PushUtil;
 import com.stylefeng.guns.modular.system.util.RedisUtil;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
 import javax.annotation.Resource;
 import java.text.SimpleDateFormat;
+import java.util.Arrays;
 import java.util.Date;
+import java.util.List;
+import java.util.stream.Collectors;
 
 @Service
 public class DriverOnlineServiceImpl extends ServiceImpl<DriverOnlineMapper, DriverOnline> implements IDriverOnlineService {
@@ -37,6 +44,24 @@
 
     @Autowired
     private IDriverService driverService;
+    
+    @Resource
+    private DriverActivityOnlineMapper driverActivityOnlineMapper;
+    
+    @Resource
+    private DriverActivityHistoryMapper driverActivityHistoryMapper;
+    
+    @Autowired
+    private IOrderPrivateCarService orderPrivateCarService;
+    
+    @Autowired
+    private IOrderLogisticsService orderLogisticsService;
+    
+    @Autowired
+    private PushUtil pushUtil;
+    
+    
+    
 
 
     /**
@@ -48,68 +73,74 @@
     public void addDriverOnline(Integer driverId) throws Exception {
         DriverWork driverWork = driverWorkService.selectOne(new EntityWrapper<DriverWork>().eq("driverId", driverId).eq("state", 1));
         if(null == driverWork){//非上班状态不记录
-            redisUtil.remove("ONLINE_" + driverId);
+            for (int i = 1; i < 5; i++) {
+                redisUtil.remove("ONLINE_" + i + "_" + driverId);
+            }
             return;
         }
-
-        //查询数据及条件判断
-        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
-        DriverOnline query = driverOnlineMapper.query(driverId, sdf.format(new Date()), 0);//正常记录数据
-        DriverOnline query1 = null;//考勤范围内的数据
-        DriverAssessment driverAssessment = driverAssessmentService.selectOne(new EntityWrapper<DriverAssessment>()
-                .eq("companyId", driverService.selectById(driverId).getCompanyId()));
-        Date s = null;
-        Date e = null;
-        long now = System.currentTimeMillis();
-        if(null != driverAssessment){//在考勤范围内记录数据
-            SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
-            String[] split = driverAssessment.getAssessment().split(" - ");
-            s = sdf1.parse(sdf.format(new Date()) + " " + split[0]);
-            e = sdf1.parse(sdf.format(new Date()) + " " + split[1]);
-            if(now > s.getTime() && now <= e.getTime()){
-                query1 = driverOnlineMapper.query(driverId, sdf.format(new Date()), 1);
-            }
-        }
-
-        //开始修改数据
-        if(query != null){
-            String value = redisUtil.getValue("ONLINE_" + driverId);
-            if(ToolUtil.isEmpty(value)){
-                redisUtil.setStrValue("ONLINE_" + driverId, String.valueOf(now / 1000));//存入秒
-                return;
-            }
-            Long ss = (now / 1000) - Long.valueOf(value);
-            if(ss.longValue() >= 600){//间隔时间大于10分钟则为离线
-                redisUtil.remove("ONLINE_" + driverId);
-                return;
-            }
-
-            query.setDuration(query.getDuration() + ss);
-            driverOnlineMapper.updateById(query);
-
-            //记录考勤范围内的数据
-            if(null != s && null != e && now > s.getTime() && now <= e.getTime()){
-                if(null != query1){
-                    query1.setDuration(query1.getDuration() + ss);
-                    driverOnlineMapper.updateById(query1);
-                }else{
-                    query1 = new DriverOnline();
-                    query1.setDriverId(driverId);
-                    query1.setDate(new Date());
-                    query1.setAssessment(1);
-                    query1.setDuration(ss);
-                    driverOnlineMapper.insert(query1);
+        String[] split1 = driverWork.getType().split(",");
+        for (String ty : split1) {
+            //查询数据及条件判断
+            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
+            DriverOnline query = driverOnlineMapper.query(driverId, sdf.format(new Date()), Integer.valueOf(ty), 0);//正常记录数据
+            DriverOnline query1 = null;//考勤范围内的数据
+            DriverAssessment driverAssessment = driverAssessmentService.selectOne(new EntityWrapper<DriverAssessment>()
+                    .eq("companyId", driverService.selectById(driverId).getCompanyId()));
+            Date s = null;
+            Date e = null;
+            long now = System.currentTimeMillis();
+            if(null != driverAssessment){//在考勤范围内记录数据
+                SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+                String[] split = driverAssessment.getAssessment().split(" - ");
+                s = sdf1.parse(sdf.format(new Date()) + " " + split[0]);
+                e = sdf1.parse(sdf.format(new Date()) + " " + split[1]);
+                if(now > s.getTime() && now <= e.getTime()){
+                    query1 = driverOnlineMapper.query(driverId, sdf.format(new Date()), Integer.valueOf(ty), 1);
                 }
             }
-        }else{
-            DriverOnline driverOnline = new DriverOnline();
-            driverOnline.setDriverId(driverId);
-            driverOnline.setDate(new Date());
-            driverOnline.setAssessment(0);
-            driverOnline.setDuration(0L);
-            driverOnlineMapper.insert(driverOnline);
+    
+            //开始修改数据
+            if(query != null){
+                String value = redisUtil.getValue("ONLINE_" + ty + "_" + driverId);
+                if(ToolUtil.isEmpty(value)){
+                    redisUtil.setStrValue("ONLINE_" + ty + "_" + driverId, String.valueOf(now / 1000));//存入秒
+                    return;
+                }
+                Long ss = (now / 1000) - Long.valueOf(value);
+                if(ss.longValue() >= 600){//间隔时间大于10分钟则为离线
+                    redisUtil.remove("ONLINE_" + ty + "_" + driverId);
+                    return;
+                }
+        
+                query.setDuration(query.getDuration() + ss);
+                driverOnlineMapper.updateById(query);
+        
+                //记录考勤范围内的数据
+                if(null != s && null != e && now > s.getTime() && now <= e.getTime()){
+                    if(null != query1){
+                        query1.setDuration(query1.getDuration() + ss);
+                        driverOnlineMapper.updateById(query1);
+                    }else{
+                        query1 = new DriverOnline();
+                        query1.setDriverId(driverId);
+                        query1.setType(Integer.valueOf(ty));
+                        query1.setDate(new Date());
+                        query1.setAssessment(1);
+                        query1.setDuration(ss);
+                        driverOnlineMapper.insert(query1);
+                    }
+                }
+            }else{
+                DriverOnline driverOnline = new DriverOnline();
+                driverOnline.setDriverId(driverId);
+                driverOnline.setType(Integer.valueOf(ty));
+                driverOnline.setDate(new Date());
+                driverOnline.setAssessment(0);
+                driverOnline.setDuration(0L);
+                driverOnlineMapper.insert(driverOnline);
+            }
+            redisUtil.setStrValue("ONLINE_" + ty + "_" + driverId, String.valueOf(now / 1000));//存入秒
         }
-        redisUtil.setStrValue("ONLINE_" + driverId, String.valueOf(now / 1000));//存入秒
     }
 
 
@@ -125,4 +156,63 @@
     public Integer querySumTime(Integer driverId, Integer assessment, Date start, Date end) {
         return driverOnlineMapper.querySumTime(driverId, assessment, start, end);
     }
+    
+    
+    /**
+     * 定时检测司机是否连续接单
+     */
+    @Override
+    public void deductionDuration() {
+        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
+        String format = sdf.format(new Date());
+        List<DriverActivityHistory> driverActivityHistories = driverActivityHistoryMapper.selectList(new EntityWrapper<DriverActivityHistory>().eq("DATE_FORMAT(date, '%Y-%m-%d')", format).eq("type", 3).eq("carryOut", 1));
+        List<Integer> collect = driverActivityHistories.stream().map(DriverActivityHistory::getDriverId).collect(Collectors.toList());
+        if(collect.size() == 0){
+            return;
+        }
+        for (DriverActivityHistory driverActivityHistory : driverActivityHistories) {
+            DriverWork driverWork = driverWorkService.selectOne(new EntityWrapper<DriverWork>().eq("driverId", driverActivityHistory.getDriverId()).eq("state", 1));
+            if(null == driverWork){
+                continue;
+            }
+            DriverActivityOnline driverActivityOnline = driverActivityOnlineMapper.selectById(driverActivityHistory.getActivityId());
+            DriverOnline driverOnline = this.selectOne(new EntityWrapper<DriverOnline>().eq("DATE_FORMAT(date, '%Y-%m-%d')", format)
+                    .eq("driverId", driverActivityHistory.getDriverId()).eq("type", driverActivityOnline.getType()));
+            if(null == driverOnline){
+                continue;
+            }
+            Integer driverId = driverOnline.getDriverId();
+            long m = Double.valueOf(driverActivityOnline.getOfflineTime() * 3600000L).longValue();
+            
+            //找出最后一次接单的时间
+            long mm = 0L;
+            OrderPrivateCar orderPrivateCar = orderPrivateCarService.selectOne(new EntityWrapper<OrderPrivateCar>().eq("driverId", driverId).eq("isDelete", 1).ne("state", 10));
+            Date snatchOrderTime = null;
+            if(null != orderPrivateCar){
+                snatchOrderTime = orderPrivateCar.getSnatchOrderTime();
+                mm = snatchOrderTime.getTime();
+            }
+            OrderLogistics orderLogistics = orderLogisticsService.selectOne(new EntityWrapper<OrderLogistics>().eq("driverId", driverId).eq("isDelete", 1).ne("state", 10));
+            if(null != orderLogistics && snatchOrderTime.before(orderLogistics.getSnatchOrderTime())){
+                mm = orderLogistics.getSnatchOrderTime().getTime();
+            }
+            
+            //超时不接单,直接将之前的在线时长清零
+            //推送司机下班提醒
+            if(mm >= m){
+                this.deleteById(driverOnline.getId());
+                driverWork.setState(2);
+                driverWork.setEndTime(new Date());
+                driverWorkService.updateById(driverWork);
+                Driver driver = driverService.selectById(driverWork.getDriverId());
+                driver.setState(1);
+                driverService.updateById(driver);
+                // TODO 待翻译
+                pushUtil.pushOffline(driverOnline.getDriverId(), 2, "您已连续" + driverActivityOnline.getOfflineTime() + "小时未接单,系统将强制更改您的状态为:下班");
+            }
+            
+        }
+        
+        
+    }
 }

--
Gitblit v1.7.1