package com.doumee.service.impl; 
 | 
  
 | 
import com.doumee.core.haikang.model.HKConstants; 
 | 
import com.doumee.core.utils.Constants; 
 | 
import com.doumee.core.utils.DateUtil; 
 | 
import com.doumee.dao.business.VisitEventMapper; 
 | 
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.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());//今日预约车辆进场数 
 | 
        return vModel; 
 | 
    } 
 | 
  
 | 
    @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; 
 | 
    } 
 | 
} 
 |