From edccaca25b8b6bdb582c60cbd2983bc05a4e1ff3 Mon Sep 17 00:00:00 2001
From: liujie <1793218484@qq.com>
Date: 星期一, 13 七月 2026 09:42:57 +0800
Subject: [PATCH] update

---
 ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysVisitorRecordServiceImpl.java |  180 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 180 insertions(+), 0 deletions(-)

diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysVisitorRecordServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysVisitorRecordServiceImpl.java
index ccb4e51..98fe869 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysVisitorRecordServiceImpl.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysVisitorRecordServiceImpl.java
@@ -2,6 +2,7 @@
 
 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;
@@ -12,8 +13,14 @@
 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;
 
 /**
@@ -30,11 +37,15 @@
     @Override
     public PageInfo<SysVisitorRecordVO> pageList(SysVisitorRecordPageRequest request)
     {
+        refreshVisitorStatus();
         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()));
         PageInfo<SysVisitorRecordVO> pageInfo = new PageInfo<SysVisitorRecordVO>(query.getPageNum(), query.getPageSize());
@@ -46,6 +57,7 @@
     @Override
     public SysVisitorRecordDetailVO detail(SysVisitorRecordDetailRequest request)
     {
+        refreshVisitorStatus();
         Long recordId = getRequiredRecordId(request == null ? null : request.getRecordId());
         SysVisitorRecordDetailVO detail = visitorRecordMapper.selectDetailById(recordId);
         if (detail == null)
@@ -53,7 +65,18 @@
             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
@@ -71,6 +94,163 @@
         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<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)

--
Gitblit v1.7.1