package com.ruoyi.system.service.impl;
|
|
import com.ruoyi.common.basic.PageInfo;
|
import com.ruoyi.common.exception.ServiceException;
|
import com.ruoyi.common.utils.DateUtils;
|
import com.ruoyi.common.utils.StringUtils;
|
import com.ruoyi.system.dto.SysVisitorRecordDeleteRequest;
|
import com.ruoyi.system.dto.SysVisitorRecordDetailRequest;
|
import com.ruoyi.system.dto.SysVisitorRecordPageRequest;
|
import com.ruoyi.system.domain.SysVisitArea;
|
import com.ruoyi.system.mapper.SysVisitAreaMapper;
|
import com.ruoyi.system.mapper.SysVisitorRecordMapper;
|
import com.ruoyi.system.service.ISysVisitorRecordService;
|
import com.ruoyi.system.vo.SysVisitorRecordDetailVO;
|
import com.ruoyi.system.vo.SysVisitorRecordVO;
|
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.stereotype.Service;
|
import org.springframework.transaction.annotation.Transactional;
|
import org.springframework.util.CollectionUtils;
|
|
import java.time.LocalDate;
|
import java.time.LocalDateTime;
|
import java.time.LocalTime;
|
import java.util.Date;
|
import java.util.ArrayList;
|
import java.util.List;
|
|
/**
|
* 访客登记记录服务实现
|
*
|
* @author ruoyi
|
*/
|
@Service
|
public class SysVisitorRecordServiceImpl implements ISysVisitorRecordService
|
{
|
@Autowired
|
private SysVisitorRecordMapper visitorRecordMapper;
|
|
@Autowired
|
private SysVisitAreaMapper visitAreaMapper;
|
|
@Override
|
public PageInfo<SysVisitorRecordVO> pageList(SysVisitorRecordPageRequest request)
|
{
|
refreshVisitorStatus();
|
SysVisitorRecordPageRequest query = normalizeQuery(request);
|
PageInfo<SysVisitorRecordVO> pageInfo = new PageInfo<SysVisitorRecordVO>(query.getPageNum(), query.getPageSize());
|
List<SysVisitorRecordVO> list = visitorRecordMapper.pageList(query, pageInfo);
|
pageInfo.setRecords(list);
|
return pageInfo;
|
}
|
|
@Override
|
public List<SysVisitorRecordVO> list(SysVisitorRecordPageRequest request)
|
{
|
refreshVisitorStatus();
|
return visitorRecordMapper.list(normalizeQuery(request));
|
}
|
|
@Override
|
public SysVisitorRecordDetailVO detail(SysVisitorRecordDetailRequest request)
|
{
|
refreshVisitorStatus();
|
Long recordId = getRequiredRecordId(request == null ? null : request.getRecordId());
|
SysVisitorRecordDetailVO detail = visitorRecordMapper.selectDetailById(recordId);
|
if (detail == null)
|
{
|
throw new ServiceException("访客登记记录不存在");
|
}
|
detail.setPassRecords(visitorRecordMapper.selectPassRecordsByRecordId(recordId));
|
fillDetailDisplayFields(detail);
|
return detail;
|
}
|
|
@Override
|
@Transactional(rollbackFor = Exception.class)
|
public int refreshVisitorStatus()
|
{
|
Date now = new Date();
|
int autoSignedOutRows = visitorRecordMapper.updateExpiredToAutoSignedOut(now);
|
int overdueRows = visitorRecordMapper.updateVisitingToOverdue(now);
|
return autoSignedOutRows + overdueRows;
|
}
|
|
@Override
|
public int delete(SysVisitorRecordDeleteRequest request, String username)
|
{
|
List<Long> recordIds = request == null ? null : request.getRecordIds();
|
if (CollectionUtils.isEmpty(recordIds))
|
{
|
throw new ServiceException("访客登记记录主键集合不能为空");
|
}
|
for (Long recordId : recordIds)
|
{
|
getRequiredRecordId(recordId);
|
}
|
return visitorRecordMapper.deleteByIds(recordIds, username);
|
}
|
|
private void fillDetailDisplayFields(SysVisitorRecordDetailVO detail)
|
{
|
List<String> visitAreaNames = resolveVisitAreaNames(detail);
|
detail.setIdCardMask(maskIdCard(detail.getIdCard()));
|
detail.setRegisterTypeName(registerTypeName(detail.getRegisterType()));
|
detail.setStatusName(statusName(detail.getStatus()));
|
detail.setReceiverVerifyMethodName(verifyMethodName(detail.getReceiverVerifyMethod()));
|
detail.setSignVerifyMethodName(verifyMethodName(detail.getSignVerifyMethod()));
|
detail.setVisitAreaNameList(visitAreaNames);
|
detail.setVisitAreaNames(String.join(",", visitAreaNames));
|
detail.setValidTimeText(validTimeText(detail.getValidStartTime(), detail.getValidEndTime()));
|
detail.setRegisterCollectTime(detail.getRegisterTime());
|
detail.setSignCollectTime(detail.getSignTime());
|
}
|
|
private List<String> resolveVisitAreaNames(SysVisitorRecordDetailVO detail)
|
{
|
List<String> names = splitNames(detail.getVisitAreaNames());
|
if (!names.isEmpty() || StringUtils.isBlank(detail.getVisitAreaIds()))
|
{
|
return names;
|
}
|
for (String areaIdText : detail.getVisitAreaIds().split(","))
|
{
|
try
|
{
|
SysVisitArea area = visitAreaMapper.selectById(Long.valueOf(StringUtils.trim(areaIdText)));
|
if (area != null && StringUtils.isNotBlank(area.getAreaName()))
|
{
|
names.add(area.getAreaName());
|
}
|
}
|
catch (NumberFormatException ignored)
|
{
|
continue;
|
}
|
}
|
return names;
|
}
|
|
private String maskIdCard(String idCard)
|
{
|
if (StringUtils.isBlank(idCard) || idCard.length() <= 10)
|
{
|
return idCard;
|
}
|
return idCard.substring(0, 6) + "********" + idCard.substring(idCard.length() - 4);
|
}
|
|
private List<String> splitNames(String names)
|
{
|
List<String> result = new ArrayList<>();
|
if (StringUtils.isBlank(names))
|
{
|
return result;
|
}
|
String[] splitNames = names.split(",");
|
for (String name : splitNames)
|
{
|
String trimName = StringUtils.trim(name);
|
if (StringUtils.isNotBlank(trimName))
|
{
|
result.add(trimName);
|
}
|
}
|
return result;
|
}
|
|
private String registerTypeName(String registerType)
|
{
|
if ("APPOINTMENT".equals(registerType))
|
{
|
return "预约登记";
|
}
|
if ("ONSITE".equals(registerType))
|
{
|
return "现场登记";
|
}
|
return registerType;
|
}
|
|
private String statusName(String status)
|
{
|
if ("VISITING".equals(status))
|
{
|
return "来访中";
|
}
|
if ("SIGNED_OUT".equals(status))
|
{
|
return "已签离";
|
}
|
if ("PENDING_CONFIRM".equals(status))
|
{
|
return "逾期滞留";
|
}
|
if ("OVERDUE_AUTO_SIGNED_OUT".equals(status))
|
{
|
return "超期自动";
|
}
|
if ("CANCELLED".equals(status))
|
{
|
return "已取消";
|
}
|
return status;
|
}
|
|
private String verifyMethodName(String verifyMethod)
|
{
|
if (StringUtils.isBlank(verifyMethod) || StringUtils.containsAny(verifyMethod, "验证", "确认", "自动"))
|
{
|
return verifyMethod;
|
}
|
if ("FACE".equals(verifyMethod) || "FACE_VERIFY".equals(verifyMethod) || "FACE_RECOGNITION".equals(verifyMethod))
|
{
|
return "人脸验证";
|
}
|
if ("CARD".equals(verifyMethod) || "CARD_VERIFY".equals(verifyMethod))
|
{
|
return "刷卡验证";
|
}
|
if ("ID_CARD".equals(verifyMethod))
|
{
|
return "身份证验证";
|
}
|
if ("MANUAL".equals(verifyMethod))
|
{
|
return "人工确认";
|
}
|
if ("AUTO".equals(verifyMethod))
|
{
|
return "系统自动";
|
}
|
return verifyMethod;
|
}
|
|
private String validTimeText(Date validStartTime, Date validEndTime)
|
{
|
if (validStartTime == null || validEndTime == null)
|
{
|
return null;
|
}
|
LocalDateTime start = DateUtils.dateToLocalDateTime(validStartTime);
|
LocalDateTime end = DateUtils.dateToLocalDateTime(validEndTime);
|
LocalDate startDate = start.toLocalDate();
|
LocalDate endDate = end.toLocalDate();
|
if (startDate.equals(endDate))
|
{
|
return DateUtils.localDateToString(startDate) + " " + dayPartName(start.toLocalTime(), end.toLocalTime());
|
}
|
if (isDayStart(start.toLocalTime()) && isDayEnd(end.toLocalTime()))
|
{
|
return DateUtils.localDateToString(startDate) + " 至 " + DateUtils.localDateToString(endDate) + " 全天";
|
}
|
return DateUtils.parseDateToStr("yyyy-MM-dd HH:mm", validStartTime)
|
+ " 至 " + DateUtils.parseDateToStr("yyyy-MM-dd HH:mm", validEndTime);
|
}
|
|
private String dayPartName(LocalTime start, LocalTime end)
|
{
|
if (isDayStart(start) && isDayEnd(end))
|
{
|
return "全天";
|
}
|
if (start.getHour() < 12 && end.getHour() <= 12)
|
{
|
return "上午";
|
}
|
if (start.getHour() >= 12)
|
{
|
return "下午";
|
}
|
return "全天";
|
}
|
|
private boolean isDayStart(LocalTime time)
|
{
|
return time.getHour() == 0 && time.getMinute() == 0;
|
}
|
|
private boolean isDayEnd(LocalTime time)
|
{
|
return time.getHour() == 23 && time.getMinute() == 59;
|
}
|
|
private Long getRequiredRecordId(Long recordId)
|
{
|
if (recordId == null || recordId <= 0)
|
{
|
throw new ServiceException("访客登记记录主键不能为空");
|
}
|
return recordId;
|
}
|
|
private SysVisitorRecordPageRequest normalizeQuery(SysVisitorRecordPageRequest request)
|
{
|
SysVisitorRecordPageRequest query = request == null ? new SysVisitorRecordPageRequest() : request;
|
query.setIntervieweeName(StringUtils.trim(query.getIntervieweeName()));
|
query.setIntervieweeKeyword(StringUtils.trim(query.getIntervieweeKeyword()));
|
query.setIntervieweeDept(StringUtils.trim(query.getIntervieweeDept()));
|
query.setVisitAreaKeyword(StringUtils.trim(query.getVisitAreaKeyword()));
|
query.setStatus(StringUtils.trim(query.getStatus()));
|
query.setVisitorName(StringUtils.trim(query.getVisitorName()));
|
query.setVisitorKeyword(StringUtils.trim(query.getVisitorKeyword()));
|
query.setVisitReason(StringUtils.trim(query.getVisitReason()));
|
query.setRegisterType(StringUtils.trim(query.getRegisterType()));
|
return query;
|
}
|
}
|