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.AcsDeviceStatusListRequest; import com.doumee.core.haikang.model.param.request.TempCarInRecordListRequest; import com.doumee.core.haikang.model.param.respose.AscDeviceStatusInfoResponse; 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.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 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 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 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> 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 carsDataList(BaseRequest param){ List list = new ArrayList<>(); MPJLambdaWrapper 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 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 visitDataList(BaseRequest param){ List list = new ArrayList<>(); MPJLambdaWrapper 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 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 times = new ArrayList<>(); List numList = new ArrayList<>(); List numList2 = new ArrayList<>(); for (int i = 0; i < 25; i++) { times.add((i)+":00"); numList.add(0); numList2.add(0); } //进场 List 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 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 getCarEventListByHour(int key) { MPJLambdaWrapper 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 result =carEventMapper.selectJoinList(CarEvent.class,wrapper); return result; } private List getCarEventListByDays(int days) { MPJLambdaWrapper 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 result =carEventMapper.selectJoinList(CarEvent.class,wrapper); return result; } private List getVisitEventListByDays(int days) { MPJLambdaWrapper 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 result =visitEventMapper.selectJoinList(VisitEvent.class,wrapper); return result; } private List getVisitListByDays(int days) { MPJLambdaWrapper 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 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 times = new ArrayList<>(); List 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 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 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 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 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 times = new ArrayList<>(); List 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 times = new ArrayList<>(); List 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 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; } }