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;
|
}
|
}
|