Просмотр исходного кода

智慧停车-核心指标、车流态势、车位详情、空置车位

ZhangManMan 2 лет назад
Родитель
Сommit
ae9d489741

+ 6 - 0
src/main/java/com/sky/ioc/entity/domain/parking/Park.java

@@ -1,5 +1,6 @@
 package com.sky.ioc.entity.domain.parking;
 
+import com.baomidou.mybatisplus.annotation.TableField;
 import lombok.Data;
 
 /**
@@ -37,6 +38,11 @@ public class Park {
      * 车位编号
      * */
     private String parkingNumbers;
+    /**
+     * 停车时长
+     * */
+    @TableField
+    private  Long hours;
 
 
 }

+ 6 - 0
src/main/java/com/sky/ioc/job/MeetingRecordJob.java

@@ -1,5 +1,6 @@
 package com.sky.ioc.job;
 
+import com.sky.ioc.service.Parking.ParkService;
 import com.sky.ioc.service.meeting.MeetingRecordService;
 import lombok.extern.slf4j.Slf4j;
 import org.quartz.Job;
@@ -15,9 +16,14 @@ public class MeetingRecordJob implements Job {
     @Autowired
     MeetingRecordService recordService;
 
+    @Autowired
+    ParkService parkService;
+
     @Override
     public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
         log.info(String.format("同步会议数据!  时间:" + new Date()));
         recordService.getMeetingRecordList();
+        log.info(String.format("同步停车数据!  时间:" + new Date()));
+        parkService.getParkData();
     }
 }

+ 4 - 31
src/main/java/com/sky/ioc/mapper/ParkMapper.java

@@ -19,8 +19,8 @@ public interface ParkMapper extends BaseMapper<Park> {
             " and company_id=#{iocParam.companyId} " +
             "</if>"+
             "<if test='iocParam!=null and iocParam.timeRange != null '>" +
-            "<![CDATA[ and entrytime > #{iocParam.timeRange.startDate} " +
-            " and  departuretime < #{iocParam.timeRange.endDate} ]]>" +
+            "<![CDATA[ and entry_time > #{iocParam.timeRange.startDate} " +
+            " and  entry_time < #{iocParam.timeRange.endDate} ]]>" +
 
             "</if>"+
             "</script>")
@@ -32,7 +32,7 @@ public interface ParkMapper extends BaseMapper<Park> {
             " and company_id=#{iocParam.companyId} " +
             "</if>"+
             "<if test='iocParam!=null and iocParam.timeRange != null '>" +
-            " <![CDATA[ and entrytime > #{iocParam.timeRange.startDate} and entrytime < #{iocParam.timeRange.endDate} ]]> " +
+            " <![CDATA[ and entry_time > #{iocParam.timeRange.startDate} and entry_time < #{iocParam.timeRange.endDate} ]]> " +
             "</if>"+
             "</script>")
     Integer getTotalParkByCompanyIdAndDeptIdAndEntryTime(@Param("iocParam") IocParam iocParam);
@@ -43,38 +43,11 @@ public interface ParkMapper extends BaseMapper<Park> {
             " and company_id=#{iocParam.companyId} " +
             "</if>"+
             "<if test='iocParam!=null '>" +
-            " <![CDATA[ and departuretime > #{iocParam.timeRange.startDate} and departuretime < #{iocParam.timeRange.endDate} ]]>" +
+            " <![CDATA[ and departure_time > #{iocParam.timeRange.startDate} and departure_time < #{iocParam.timeRange.endDate} ]]>" +
             "</if>"+
             "</script>")
     Integer getTotalParkByCompanyIdAndDeptIdAndDepartureTime(@Param("iocParam") IocParam iocParam);
 
-    @Select("<script>" +
-            "SELECT count(1) FROM park where 1=1 " +
-            "<if test='iocParam!=null and iocParam.companyId != null '>" +
-            " and company_id=#{iocParam.companyId} " +
-            "</if>"+
-            "<if test='iocParam!=null and iocParam.timeRange != null '>" +
-            " <![CDATA[ and entrytime > #{iocParam.timeRange.startDate} and departuretime < #{iocParam.timeRange.endDate} ]]>" +
-            "</if>"+
-            "<if test='type!=null  '>" +
-            " and type=#{type} " +
-            "</if>"+
-            "</script>")
-    Integer getTotalParkByCompanyIdAndDeptIdAndType(@Param("iocParam") IocParam iocParam,@Param("type")Integer type);
 
-    @Select("<script>" +
-            "SELECT company,count(1) as total  FROM park where 1=1 " +
-            "<if test='iocParam!=null and iocParam.companyId != null '>" +
-            " and company_id=#{iocParam.companyId} " +
-            "</if>"+
-            "<if test='iocParam!=null and iocParam.timeRange != null '>" +
-            " <![CDATA[ and entrytime > #{iocParam.timeRange.startDate} and departuretime < #{iocParam.timeRange.endDate} ]]>" +
-            "</if>"+
-            "<if test='type!=null  '>" +
-            " and type=#{type} " +
-            "</if>"+
-            " GROUP BY company_id,company " +
-            "</script>")
-    List<Map<String,String>> getListByCompanyIdAndDeptIdAndType(@Param("iocParam") IocParam iocParam, @Param("type")Integer type);
 
 }

+ 8 - 1
src/main/java/com/sky/ioc/mapper/ParkingMapper.java

@@ -25,6 +25,13 @@ public interface ParkingMapper extends BaseMapper<Parking> {
             "<if test='iocParam!=null and iocParam.companyId != null '>" +
             " and company_id=#{iocParam.companyId} " +
             "</if>"+
-            "</script>")
+            " limit 100 OFFSET 100 </script>")
     List<Parking> getListByCompanyIdAndDeptId(@Param("iocParam") IocParam iocParam);
+
+    @Select("<script>" +
+            "SELECT parking.*, COUNT(park.id) AS tcount " +
+            "FROM parking LEFT JOIN park ON parking.parking_numbers = park.parking_numbers " +
+            "GROUP BY parking.ID HAVING COUNT(park.id)>0 ORDER BY tcount" +
+            "</script>")
+    List<Parking> getVacancyList(@Param("iocParam") IocParam iocParam);
 }

+ 98 - 16
src/main/java/com/sky/ioc/service/Parking/impl/ParkingServiceImpl.java

@@ -1,12 +1,17 @@
 package com.sky.ioc.service.Parking.impl;
 
 import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.sky.ioc.entity.Indeicator;
 import com.sky.ioc.entity.Label;
 import com.sky.ioc.entity.Cake;
 import com.sky.ioc.entity.domain.carbon.CarbonQuota;
+import com.sky.ioc.entity.domain.parking.IllegalParking;
+import com.sky.ioc.entity.domain.parking.Park;
 import com.sky.ioc.entity.domain.parking.Parking;
 import com.sky.ioc.entity.params.IocParam;
+import com.sky.ioc.entity.params.IocTimeRange;
+import com.sky.ioc.mapper.IllegalParkingMapper;
 import com.sky.ioc.mapper.ParkMapper;
 import com.sky.ioc.mapper.ParkingMapper;
 import com.sky.ioc.mapper.job.TokenMapper;
@@ -25,9 +30,13 @@ import org.springframework.http.ResponseEntity;
 import org.springframework.stereotype.Service;
 import org.springframework.web.client.RestTemplate;
 
+import java.math.BigDecimal;
+import java.math.RoundingMode;
 import java.text.DecimalFormat;
+import java.text.ParseException;
 import java.util.*;
 import java.util.concurrent.ThreadLocalRandom;
+import java.util.stream.Collectors;
 
 /**
  * TODO 智慧停车
@@ -49,6 +58,9 @@ public class ParkingServiceImpl implements ParkingService {
     @Autowired
     TokenMapper tokenMapper;
 
+    @Autowired
+    IllegalParkingMapper illegalParkingMapper;
+
     @Value("${sky.dataIp}")
     private String dataIp;
 
@@ -59,26 +71,36 @@ public class ParkingServiceImpl implements ParkingService {
     public ReturnMsg getCoreIndicators(IocParam iocParam) {
         Indeicator indeicator = new Indeicator();
         List<JSONObject> objects = indeicator.getList();
-
-      /*  Integer totalParking = parkingMapper.getTotalParkingByCompanyIdAndDeptId(iocParam);
+        //车位数量
+        Integer totalParking = parkingMapper.getTotalParkingByCompanyIdAndDeptId(iocParam);
+        //停车记录数
         Integer totalPark = parkMapper.getTotalParkByCompanyIdAndDeptId(iocParam);
-        Integer total = parkMapper.getTotalParkByCompanyIdAndDeptIdAndType(iocParam,1);//违停*/
-
-        ThreadLocalRandom random = ThreadLocalRandom.current();
-        int totalParking = 274;
-        int dayParking = random.nextInt(150,170);
-        int breakRuleParking = random.nextInt(0,10);
-        int unParking = totalParking - dayParking;
+        Double avgPark = 0d;
+        //违停数量
+        Long total = illegalParkingMapper.selectCount(new LambdaQueryWrapper<IllegalParking>()
+                .gt(IllegalParking::getIllegalTime,iocParam.getTimeRange().getStartDate())
+                .le(IllegalParking::getIllegalTime,iocParam.getTimeRange().getEndDate()));
+        try {
+            Integer days = DateUtil.daysBetween(iocParam.getTimeRange().getStartDate(),iocParam.getTimeRange().getEndDate());
+            if(totalPark>0&&days>0){
+                BigDecimal bigDecimal = new BigDecimal(totalPark);
+                BigDecimal avgPersonPriceDec = bigDecimal.divide(new BigDecimal(days), 2, RoundingMode.HALF_UP);
+                avgPark = avgPersonPriceDec.doubleValue();
+            }
+        } catch (ParseException e) {
+            throw new RuntimeException(e);
+        }
+        int unParking = (int) (totalParking - avgPark);
         float compare = (float) Math.random();
         DecimalFormat decimalFormat = new DecimalFormat("#.0");
         compare = Float.parseFloat(decimalFormat.format(compare));
         objects.get(0).put("value",totalParking);
         objects.get(0).put("compare",compare);
 
-        objects.get(1).put("value",dayParking);
+        objects.get(1).put("value",avgPark);
         objects.get(1).put("compare",compare);
 
-        objects.get(2).put("value",breakRuleParking);
+        objects.get(2).put("value",total);
         objects.get(2).put("compare",-compare);
 
         objects.get(3).put("value",unParking);
@@ -96,18 +118,78 @@ public class ParkingServiceImpl implements ParkingService {
         List<String> list = DateUtil.getBetweenDays(startStr, endStr);
         String[] labKey = list.toArray(new String[0]);
       //  String[] labKey = {"1月","2月","3月","4月","5月","6月","7月","8月","9月","10月","11月","12月"};
-        List<Label> labels1 = GeneralMethod.getInstance().dataGeneration(param, labKey);
-        return ReturnMsg.ok(labels1);
+     //   List<Label> labels1 = GeneralMethod.getInstance().dataGeneration(param, labKey);
+        List<Label> lists = new ArrayList<>();
+        for (int i = 0; i < labKey.length; i++) {
+            Label label = new Label();
+            JSONObject jsonObject = new JSONObject();
+            IocParam iocParam1 = new IocParam();
+            IocTimeRange timeRange = new IocTimeRange();
+            timeRange.setStartDate(labKey[i]+" 00:00:00");
+            timeRange.setEndDate(labKey[i]+" 23:59:00");
+            iocParam1.setTimeRange(timeRange);
+            Integer entry = parkMapper.getTotalParkByCompanyIdAndDeptIdAndEntryTime(iocParam1);
+            Integer leave = parkMapper.getTotalParkByCompanyIdAndDeptIdAndDepartureTime(iocParam1);
+            jsonObject.put(param[0],entry);
+            jsonObject.put(param[1],leave);
+            label.setJsonObject(jsonObject);
+            label.setLabel(labKey[i]);
+            lists.add(label);
+        }
+        return ReturnMsg.ok(lists);
     }
 
     @Override
     public ReturnMsg getVacantParkingSpace(IocParam iocParam) {
-        return ReturnMsg.ok(FalseData.PARKINGLIST);
+        List<Parking> list = parkingMapper.getVacancyList(iocParam);
+
+        for(int i=0;i< list.size();i++){
+            Parking parking = list.get(i);
+            parking.setCompany("北京电信规划设计院");
+            List<Park> lists = parkMapper.selectList(new LambdaQueryWrapper<Park>().eq(Park::getParkingNumbers,parking.getParkingNumbers()));
+            //int totalHours = 0;
+            for(int j =0;j<lists.size();j++){
+                Park park = lists.get(j);
+                if(lists.get(j).getDepartureTime()!=null&&!lists.get(j).getDepartureTime().equals("null")){
+                    long hours =  DateUtil.hoursBetween(lists.get(j).getEntryTime(),lists.get(j).getDepartureTime());
+                    park.setHours(hours);
+                  //  totalHours+=hours;
+                }else{
+                    park.setHours(0l);
+                }
+            }
+            List<Park> lists1 = lists.stream().sorted(Comparator.comparing(Park::getHours)).collect(Collectors.toList());
+            parking.setPrkingDurationLong(lists1.get(lists1.size()-1).getHours()+"h");
+            parking.setPrkingDurationBreak(lists1.get(0).getHours()+"h");
+
+        }
+        return ReturnMsg.ok(list);
     }
     @Override
     public ReturnMsg getParkingSpaceDetails(IocParam iocParam) {
-        //List<Parking> list = parkingMapper.getListByCompanyIdAndDeptId(iocParam);
-        return ReturnMsg.ok(FalseData.PARKINGLIST);
+        List<Parking> list = parkingMapper.getListByCompanyIdAndDeptId(iocParam);
+        String[] persons = {"李劲","李良","宋明宇","陈涵亮","李超","章峰","梁松","方运诚","徐涵衍","万浩波",
+                "周浩广","许鸿博","荣浩博","许鸿畴","徐瀚文","陈浩初","程涵煦","许鸿与","徐廖文","吴初"};
+        for(int i=0;i< list.size();i++){
+            Parking parking = list.get(i);
+            int flag = i;
+            if(i>=20){
+                flag = i%20;
+            }
+            parking.setPeople(persons[flag]);
+            parking.setCompany("北京电信规划设计院");
+            List<Park> lists = parkMapper.selectList(new LambdaQueryWrapper<Park>().eq(Park::getParkingNumbers,parking.getParkingNumbers()));
+            int totalHours = 0;
+            for(int j =0;j<lists.size();j++){
+                if(lists.get(j).getDepartureTime()!=null&&!lists.get(j).getDepartureTime().equals("null")){
+                    long hours =  DateUtil.hoursBetween(lists.get(j).getEntryTime(),lists.get(j).getDepartureTime());
+                    totalHours+=hours;
+                }
+            }
+            parking.setPrkingDurationLong(totalHours+"h");
+
+        }
+        return ReturnMsg.ok(list);
     }
 
     @Override

+ 27 - 5
src/main/java/com/sky/ioc/tool/DateUtil.java

@@ -163,7 +163,7 @@ public class DateUtil {
 
 
     public static int daysBetween(String smdate, String bdate) throws ParseException {
-        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
+        SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd");
         Calendar cal = Calendar.getInstance();
         cal.setTime(sdf.parse(smdate));
         long time1 = cal.getTimeInMillis();
@@ -445,6 +445,28 @@ public class DateUtil {
         return list;
     }
 
+    /**
+     * 计算两个日期直接相差的小时
+     * */
+    public static long hoursBetween(String startTime, String endTime)  {
+        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+        long nd = 1000 * 24 * 60 * 60;
+        long nh = 1000 * 60 * 60;
+        long  hour = 0;
+        // 获得两个时间的毫秒时间差异
+        Date startDate = null;
+        try {
+            startDate = sdf.parse(startTime);
+            Date endDate = sdf.parse(endTime);
+            long diff = endDate.getTime() - startDate.getTime();
+            // 计算差多少小时
+            hour = diff / nh;
+        } catch (ParseException e) {
+            throw new RuntimeException(e);
+        }
+
+        return hour;
+    }
 
     public static void main(String[] args) throws Exception {
 
@@ -460,10 +482,10 @@ public class DateUtil {
         Map lastMonthTime = getLastMonthTime();
         System.out.println("上个月:" + lastMonthTime.toString());
 */
-        String startStr = "2021-02-26 00:00:00";
-        String endStr = "2021-03-09 00:00:00";
-        List<String> list = getBetweenDays(startStr, endStr);
-        System.out.println(list);
+        String startStr = "2021/03/01 00:00:00";
+        String endStr = "2021/03/09 00:00:00";
+      //  List<String> list = getBetweenDays(startStr, endStr);
+        System.out.println(hoursBetween(startStr,endStr));
     }
 
 }