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.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; @Override public PageInfo pageList(SysVisitorRecordPageRequest request) { refreshVisitorStatus(); SysVisitorRecordPageRequest query = normalizeQuery(request); PageInfo pageInfo = new PageInfo(query.getPageNum(), query.getPageSize()); List list = visitorRecordMapper.pageList(query, pageInfo); pageInfo.setRecords(list); return pageInfo; } @Override public List 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 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) { 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(splitNames(detail.getVisitAreaNames())); detail.setValidTimeText(validTimeText(detail.getValidStartTime(), detail.getValidEndTime())); detail.setRegisterCollectTime(detail.getRegisterTime()); detail.setSignCollectTime(detail.getSignTime()); } 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 splitNames(String names) { List 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; } }