| package com.doumee.service.impl; | 
|   | 
| import com.doumee.core.constants.ResponseStatus; | 
| import com.doumee.core.exception.BusinessException; | 
| import com.doumee.core.haikang.model.HKConstants; | 
| import com.doumee.core.haikang.model.param.BaseListPageResponse; | 
| import com.doumee.core.haikang.model.param.BaseResponse; | 
| import com.doumee.core.haikang.model.param.request.TempCarInRecordListRequest; | 
| import com.doumee.core.haikang.model.param.respose.TempCarInRecordInfoResponse; | 
| import com.doumee.core.haikang.service.HKService; | 
| import com.doumee.core.utils.Constants; | 
| import com.doumee.core.utils.DateUtil; | 
| import com.doumee.dao.business.join.CarEventJoinMapper; | 
| import com.doumee.dao.business.join.VisitEventJoinMapper; | 
| import com.doumee.dao.business.join.VisitsJoinMapper; | 
| import com.doumee.dao.business.model.*; | 
| import com.doumee.dao.business.model.Member; | 
| import com.doumee.model.*; | 
| import com.doumee.service.ScreenService; | 
| import com.github.yulichang.wrapper.MPJLambdaWrapper; | 
| import org.apache.commons.lang3.StringUtils; | 
| import org.springframework.beans.factory.annotation.Autowired; | 
| import org.springframework.stereotype.Service; | 
|   | 
| import java.util.ArrayList; | 
| import java.util.Arrays; | 
| import java.util.Date; | 
| import java.util.List; | 
|   | 
| /** | 
|  * 停车场事件推送记录表Service定义 | 
|  * @author 江蹄蹄 | 
|  * @date 2023/11/30 15:33 | 
|  */ | 
| @Service | 
| public class ScreenServiceImpl implements ScreenService { | 
|   | 
|     @Autowired | 
|     private VisitsJoinMapper visitsMapper; | 
|     @Autowired | 
|     private CarEventJoinMapper carEventMapper; | 
|     @Autowired | 
|     private VisitEventJoinMapper visitEventMapper; | 
|     @Override | 
|     public   CountDataResponse countData(BaseRequest param){ | 
|         MPJLambdaWrapper<Visits> queryWrapper = new MPJLambdaWrapper<>(); | 
|         queryWrapper.select("count(1) as applyTotalNum"); | 
|         queryWrapper.select("(select count(1) from visits where TO_DAYS(starttime)=TO_DAYS(now()) and status not in(5,6,8)) as applyPassNum"); | 
|         queryWrapper.select("(select count(1) from visits where TO_DAYS(starttime)=TO_DAYS(now()) and status in (5)) as visitInNum"); | 
|         queryWrapper.select("(select count(1) from visits where TO_DAYS(starttime)=TO_DAYS(now()) and status in (6,8)) as visitOutNum"); | 
|         queryWrapper.select("(select count(1) from car_event where TO_DAYS(create_date)=TO_DAYS(now()) and inout_type=0 and event_type="+ HKConstants.EventTypes.PARK_PASS_IN.getKey() +") as carInNum"); | 
|         queryWrapper.select("(select count(1) from car_event where TO_DAYS(create_date)=TO_DAYS(now()) and (inout_type !=0 ) and event_type="+ HKConstants.EventTypes.PARK_PASS_OUT.getKey() +") as carOutNum"); | 
|         queryWrapper.eq(Visits::getIsdeleted, Constants.ZERO ); | 
|         queryWrapper.apply("TO_DAYS(starttime)=TO_DAYS(now())" ); | 
|         queryWrapper.last("limit 1"); | 
|         CountDataResponse vModel =visitsMapper.selectJoinOne(CountDataResponse.class,queryWrapper); | 
|         vModel.setVisitorNum(vModel.getVisitInNum()+vModel.getVisitOutNum());//今日访客总数 | 
|   | 
|         MPJLambdaWrapper<CarEvent> wrapper = new MPJLambdaWrapper<>(); | 
|         wrapper.select("count(1) as memberCarNum"); | 
|         wrapper.exists("select b.id from cars b where b.code=t.plate_nos" ); | 
|         wrapper.apply("TO_DAYS(create_date)=TO_DAYS(now())" ); | 
|         wrapper.last("limit 1"); | 
|         CountDataResponse cModel =carEventMapper.selectJoinOne(CountDataResponse.class,wrapper); | 
|         vModel.setMemberCarNum(vModel.getMemberCarNum());//今日员工车辆进场数 | 
|         vModel.setVisitCarNum(vModel.getCarInNum() - vModel.getMemberCarNum());//今日预约车辆进场数 | 
|         vModel.setCarNum(getCarInRecordCount()); | 
|         return vModel; | 
|     } | 
|     public int getCarInRecordCount(){ | 
|         try { | 
|             List<TempCarInRecordInfoResponse> allDoorList = new ArrayList<>(); | 
|             Date date =DateUtil.getDateFromString(DateUtil.getShortTime(new Date()) +" 00:00:00"); | 
|   | 
|             int curPage = 1; | 
|             //分页遍历循环查询所有门禁设备数据 | 
|             TempCarInRecordListRequest param = new TempCarInRecordListRequest(); | 
|             param.setStartTime(DateUtil.getISO8601Timestamp2(date)); | 
|             param.setPageNo(curPage); | 
|             param.setPageSize(1); | 
|             BaseResponse<BaseListPageResponse<TempCarInRecordInfoResponse>> response = HKService.tempCarInRecords(param); | 
|             if(response == null || !StringUtils.equals(response.getCode(), HKConstants.RESPONSE_SUCCEE)){ | 
|                 throw  new BusinessException(ResponseStatus.SERVER_ERROR.getCode(), "对不起,海康同步数据失败~"); | 
|             } | 
|             BaseListPageResponse r = response.getData(); | 
|             return  r.getTotal(); | 
|         }catch (Exception e){ | 
|   | 
|         } | 
|   | 
|         return  0; | 
|     } | 
|     @Override | 
|     public    List<CarsDataListResponse> carsDataList(BaseRequest param){ | 
|         List<CarsDataListResponse> list = new ArrayList<>(); | 
|         MPJLambdaWrapper<CarEvent> wrapper = new MPJLambdaWrapper<>(); | 
|         wrapper.selectAll(CarEvent.class) | 
|                 .selectAs(Member::getType,CarEvent::getMemberType) | 
|                 .selectAs(Member::getName,CarEvent::getMemberName) | 
|                 .selectAs(Member::getVisitCompanyName,CarEvent::getVisitCompanyName) | 
|                 .selectAs(Company::getName,CarEvent::getCompanyName); | 
|         wrapper.leftJoin(Member.class,Member::getId,CarEvent::getMemberId); | 
|         wrapper.leftJoin(Company.class,Company::getId,Member::getCompanyId); | 
|         wrapper.apply("TO_DAYS(t.create_date)=TO_DAYS(now())" ); | 
|         wrapper.in(CarEvent::getEventType, Arrays.asList(new Integer[]{HKConstants.EventTypes.PARK_PASS_IN.getKey(),HKConstants.EventTypes.PARK_PASS_OUT.getKey()})); | 
|         wrapper.last("limit 50"); | 
|         wrapper.orderByDesc(CarEvent::getCreateDate); | 
|         List<CarEvent> result =carEventMapper.selectJoinList(CarEvent.class,wrapper); | 
|         if(result!=null){ | 
|             for(CarEvent event :result){ | 
|                 CarsDataListResponse model = new CarsDataListResponse(); | 
|                 model.setInOrOut(event.getInoutType()); | 
|                 model.setCarNo(event.getPlateNos()); | 
|                 model.setCreateDate(event.getCreateDate()); | 
|                 model.setCompanyName(event.getCompanyName()); | 
|                 model.setMemberName(event.getMemberName()); | 
|                 model.setType(Constants.formatIntegerNum(event.getMemberType()) !=2?1:2); | 
|                 model.setVisitCompanyName(event.getVisitCompanyName()); | 
|                 list.add(model); | 
|             } | 
|         } | 
|         return  list; | 
|     } | 
|   | 
|     @Override | 
|     public   List<VisitDataListResponse> visitDataList(BaseRequest param){ | 
|         List<VisitDataListResponse> list = new ArrayList<>(); | 
|         MPJLambdaWrapper<VisitEvent> wrapper = new MPJLambdaWrapper<>(); | 
|         wrapper.selectAll(VisitEvent.class) ; | 
|         wrapper.apply("TO_DAYS(create_date)=TO_DAYS(now())" ); | 
|         wrapper.last("limit 50"); | 
|         wrapper.orderByDesc(VisitEvent::getStartTime); | 
|         List<VisitEvent> result =visitEventMapper.selectList( wrapper); | 
|         if(result!=null){ | 
|             for(VisitEvent event :result){ | 
|                 VisitDataListResponse model = new VisitDataListResponse(); | 
|                 model.setInOrOut(Constants.formatIntegerNum(event.getEventType()) == HKConstants.EventTypes.VISIT_SIGN_OUT.getKey()?1:0); | 
|                 model.setCreateDate(event.getCreateDate()); | 
|                 model.setCompanyName(event.getVisitorWorkUint()); | 
|                 model.setMemberName(event.getPersonName()); | 
|                 model.setTimeInfo(getTimeInfoByModel(event)); | 
|                 list.add(model); | 
|             } | 
|         } | 
|         return  list; | 
|     } | 
|   | 
|     private String getTimeInfoByModel(VisitEvent event) { | 
|   | 
|         if(Constants.formatIntegerNum(event.getEventType()) == HKConstants.EventTypes.VISIT_SIGN_OUT.getKey() | 
|                     &&StringUtils.isNotBlank(event.getStartTime()) | 
|                     && StringUtils.isNotBlank(event.getEndTime())){ | 
|             //如果有时间差 | 
|             int hour = 0,min=0,sec =0; | 
|             try { | 
|                 long start = DateUtil.getISO8601DateByStr(event.getStartTime()).getTime(); | 
|                 long end = DateUtil.getISO8601DateByStr(event.getEndTime()).getTime(); | 
|                 hour =(int)((end-start)/(60*60*1000)); | 
|                 min =(int)(((end-start)-(60*60*1000))/(60*1000)); | 
|                 sec =(int)(((end-start)%(60*1000))); | 
|             }catch (Exception e){ | 
|                   return "-"; | 
|             } | 
|             if(hour <= 0 && min<=0 && sec <=0){ | 
|                 return "-"; | 
|             } | 
|             String timeinfo = ""; | 
|             if(hour>0){ | 
|                 timeinfo = hour+"小时"; | 
|             } | 
|             if(sec>0){ | 
|                 timeinfo += sec+"分"; | 
|             }else if(sec>0){ | 
|                 timeinfo+= "1分"; | 
|             } | 
|             return timeinfo; | 
|         } | 
|             return  "-"; | 
|     } | 
|   | 
|     @Override | 
|     public CountListResponse todayCarsData(BaseRequest param) { | 
|         CountListResponse data = new CountListResponse(); | 
|         List<String> times =  new ArrayList<>(); | 
|         List<Integer> numList = new ArrayList<>(); | 
|         List<Integer> numList2 = new ArrayList<>(); | 
|         for (int i = 0; i < 25; i++) { | 
|             times.add((i)+":00"); | 
|             numList.add(0); | 
|             numList2.add(0); | 
|         } | 
|         //进场 | 
|         List<CarEvent> inList =getCarEventListByHour(HKConstants.EventTypes.PARK_PASS_IN.getKey()); | 
|         if(inList!=null){ | 
|             for(CarEvent event: inList){ | 
|                 if(Constants.formatIntegerNum(event.getHour()) >=0 && Constants.formatIntegerNum(event.getHour()) <24 ){ | 
|                     numList.set(Constants.formatIntegerNum(event.getHour()+1),event.getNum()); | 
|                 } | 
|             } | 
|         } | 
|         //离场 | 
|         List<CarEvent> outList =getCarEventListByHour(HKConstants.EventTypes.PARK_PASS_OUT.getKey()); | 
|         if(outList!=null){ | 
|             for(CarEvent event: outList){ | 
|                 if(Constants.formatIntegerNum(event.getHour()) >=0 && Constants.formatIntegerNum(event.getHour()) <24 ){ | 
|                     numList2.set(Constants.formatIntegerNum(event.getHour()+1),event.getNum()); | 
|                 } | 
|             } | 
|         } | 
|         data.setDataList(numList); | 
|         data.setSecDataList(numList2); | 
|         data.setTimeList(times); | 
|         return  data; | 
|     } | 
|   | 
|     /** | 
|      * 基于时间点统计出来进出场数据次数 | 
|      * @param key | 
|      * @return | 
|      */ | 
|     private List<CarEvent> getCarEventListByHour(int key) { | 
|         MPJLambdaWrapper<CarEvent> wrapper = new MPJLambdaWrapper<>(); | 
|         wrapper.select("count(id) as num,HOUR(create_date) as hour"); | 
|         wrapper.apply("TO_DAYS(create_date)=TO_DAYS(now())" ); | 
|         wrapper.eq(CarEvent::getEventType,  key); | 
|         wrapper.groupBy("HOUR(create_date)"); | 
|         wrapper.orderByDesc(CarEvent::getCreateDate); | 
|         List<CarEvent> result =carEventMapper.selectJoinList(CarEvent.class,wrapper); | 
|         return  result; | 
|     } | 
|     private List<CarEvent> getCarEventListByDays(int days) { | 
|         MPJLambdaWrapper<CarEvent> wrapper = new MPJLambdaWrapper<>(); | 
|         wrapper.select("count(id) as num, create_date"); | 
|         wrapper.apply("TO_DAYS(create_date)+"+days+" >= TO_DAYS(now()) " ); | 
|         wrapper.in(CarEvent::getEventType,  HKConstants.EventTypes.PARK_PASS_IN.getKey(), HKConstants.EventTypes.PARK_PASS_OUT.getKey()); | 
|         wrapper.groupBy("TO_DAYS(create_date)"); | 
|         wrapper.orderByDesc(CarEvent::getCreateDate); | 
|         List<CarEvent> result =carEventMapper.selectJoinList(CarEvent.class,wrapper); | 
|         return  result; | 
|     } | 
|     private List<VisitEvent> getVisitEventListByDays(int days) { | 
|         MPJLambdaWrapper<VisitEvent> wrapper = new MPJLambdaWrapper<>(); | 
|         wrapper.select("count(id) as num, starttime"); | 
|         wrapper.apply("TO_DAYS(starttime)+"+days+" >= TO_DAYS(now()) " ); | 
|         wrapper.eq(VisitEvent::getEventType,  HKConstants.EventTypes.VISIT_SIGN_IN.getKey()); | 
|         wrapper.groupBy("TO_DAYS(starttime)"); | 
|         wrapper.orderByDesc(CarEvent::getCreateDate); | 
|         List<VisitEvent> result =visitEventMapper.selectJoinList(VisitEvent.class,wrapper); | 
|         return  result; | 
|     } | 
|     private List<Visits> getVisitListByDays(int days) { | 
|         MPJLambdaWrapper<Visits> wrapper = new MPJLambdaWrapper<>(); | 
|         wrapper.select("count(id) as num, starttime"); | 
|         wrapper.apply("TO_DAYS(starttime)+"+days+" >= TO_DAYS(now()) " ); | 
|         wrapper.in(Visits::getStatus,  5,6,7); | 
|         wrapper.groupBy("TO_DAYS(starttime)"); | 
|         wrapper.orderByDesc(CarEvent::getCreateDate); | 
|         List<Visits> result =visitsMapper.selectJoinList(Visits.class,wrapper); | 
|         return  result; | 
|     } | 
|     @Override | 
|     public CountListResponse carsDaysData(BaseRequest param) { | 
|         CountListResponse data = new CountListResponse(); | 
|         int days = 7;//默认7天 | 
|         if(param.getType() == 1){ | 
|             //近30天 | 
|             days =15; | 
|         }else   if(param.getType() == 2){ | 
|             //近15天 | 
|             days =30; | 
|         } | 
|         List<String> times = new ArrayList<>(); | 
|         List<Integer> numList = new ArrayList<>(); | 
|         for (int i = 0; i < days; i++) { | 
|             times.add(DateUtil.formatDate(DateUtil.dateDayAdd(new Date(), -(days-i)+1),"MM.dd")); | 
|             numList.add(0); | 
|         } | 
|         List<CarEvent> result = getCarEventListByDays(days); | 
|         if(result!=null&& result.size()>0){ | 
|             for (int i = 0; i < days; i++) { | 
|                 numList.set(i,getNumByDate(times.get(i),result)); | 
|             } | 
|         } | 
|         data.setTimeList(times); | 
|         data.setDataList(numList); | 
|         return  data; | 
|     } | 
|   | 
|     private Integer getNumByDate(String s, List<CarEvent> result) { | 
|         for(CarEvent event:result){ | 
|             if(StringUtils.equals(s,DateUtil.formatDate(event.getCreateDate(),"MM.dd"))){ | 
|                 return event.getNum(); | 
|             } | 
|         } | 
|         return 0; | 
|     } | 
|     private Integer getVisistEventNumByDate(String s, List<VisitEvent> result) { | 
|         for(VisitEvent event:result){ | 
|             if(StringUtils.equals(s,DateUtil.formatDate(event.getCreateDate(),"MM.dd"))){ | 
|                 return event.getNum(); | 
|             } | 
|         } | 
|         return 0; | 
|     } | 
|     private Integer getVisistNumByDate(String s, List<Visits> result) { | 
|         for(Visits event:result){ | 
|             if(StringUtils.equals(s,DateUtil.formatDate(event.getStarttime(),"MM.dd"))){ | 
|                 return event.getNum(); | 
|             } | 
|         } | 
|         return 0; | 
|     } | 
|   | 
|     public static void main(String[] args) { | 
|         List<String> times = new ArrayList<>(); | 
|         List<String> numList = new ArrayList<>(); | 
|         for (int i = 0; i < 7; i++) { | 
|            System.out.println(DateUtil.formatDate(DateUtil.dateDayAdd(new Date(), -(7-i)+1),"MM.dd")); | 
|         } | 
|     } | 
|     @Override | 
|     public CountListResponse visitDaysData(BaseRequest param) { | 
|         CountListResponse data = new CountListResponse(); | 
|         int days = 7;//默认7天 | 
|         if(param.getType() == 1){ | 
|             //近30天 | 
|             days =15; | 
|         }else   if(param.getType() == 2){ | 
|             //近15天 | 
|             days =30; | 
|         } | 
|         List<String> times = new ArrayList<>(); | 
|         List<Integer> numList = new ArrayList<>(); | 
|         for (int i = 0; i < days; i++) { | 
|             times.add(DateUtil.formatDate(DateUtil.dateDayAdd(new Date(), -(days-i)+1),"MM.dd")); | 
|             numList.add(0); | 
|         } | 
|         List<Visits> result = getVisitListByDays(days); | 
|         if(result!=null&& result.size()>0){ | 
|             for (int i = 0; i < days; i++) { | 
|                 numList.set(i,getVisistNumByDate(times.get(i),result)); | 
|             } | 
|         } | 
|         data.setTimeList(times); | 
|         data.setDataList(numList); | 
|         return  data; | 
|     } | 
| } |