From c558804a8c27a077cba42b7eb0152dfb44f5fe67 Mon Sep 17 00:00:00 2001
From: haozq <1611483981@qq.com>
Date: Mon, 19 Jan 2026 12:44:28 +0800
Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E5=88=86=E5=B8=83=E5=BC=8F?=
=?UTF-8?q?=E9=94=81=EF=BC=8C=E6=B7=BB=E5=8A=A0=E6=9B=B4=E6=8D=A2=E8=80=83?=
=?UTF-8?q?=E5=8B=A4=E6=9C=BA=E5=8E=86=E5=8F=B2=E8=80=83=E5=8B=A4=E6=89=93?=
=?UTF-8?q?=E5=8D=A1=E8=AE=B0=E5=BD=95=E4=B8=8A=E4=BC=A0?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../interceptor/ParamSecureHandler.java | 2 +-
.../com/bonus/urk/handle/UserFaceHandle.java | 37 ++++++---
.../urk/mapper/UserFaceHandleMapper.java | 12 ++-
.../urk/service/UserFaceHandleService.java | 75 ++++++++++++++++---
.../main/java/com/bonus/urk/vo/ResultVo.java | 13 ++++
.../mapper/urk/UserFaceHandleMapper.xml | 23 +++++-
6 files changed, 136 insertions(+), 26 deletions(-)
create mode 100644 bonus-modules/bonus-urk/src/main/java/com/bonus/urk/vo/ResultVo.java
diff --git a/bonus-common/bonus-common-security/src/main/java/com/bonus/common/security/interceptor/ParamSecureHandler.java b/bonus-common/bonus-common-security/src/main/java/com/bonus/common/security/interceptor/ParamSecureHandler.java
index 23319f8..3b9078f 100644
--- a/bonus-common/bonus-common-security/src/main/java/com/bonus/common/security/interceptor/ParamSecureHandler.java
+++ b/bonus-common/bonus-common-security/src/main/java/com/bonus/common/security/interceptor/ParamSecureHandler.java
@@ -71,7 +71,7 @@ public class ParamSecureHandler implements AsyncHandlerInterceptor {
returnJson(response, "输入值非法!", 500);
return false;
}
- System.err.println(JSON.toJSONString(request.getParameterMap()));
+ // System.err.println(JSON.toJSONString(request.getParameterMap()));
/**
* 获取所有跳转路径参数,保留传入下个界面
*/
diff --git a/bonus-modules/bonus-urk/src/main/java/com/bonus/urk/handle/UserFaceHandle.java b/bonus-modules/bonus-urk/src/main/java/com/bonus/urk/handle/UserFaceHandle.java
index 1153425..d129592 100644
--- a/bonus-modules/bonus-urk/src/main/java/com/bonus/urk/handle/UserFaceHandle.java
+++ b/bonus-modules/bonus-urk/src/main/java/com/bonus/urk/handle/UserFaceHandle.java
@@ -10,6 +10,7 @@ import com.bonus.common.core.utils.StringUtils;
import com.bonus.urk.service.UserFaceHandleService;
import com.bonus.urk.vo.BmWorkerEinUserVo;
import com.bonus.urk.vo.DeviceVo;
+import com.bonus.urk.vo.ResultVo;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Async;
@@ -78,16 +79,21 @@ public class UserFaceHandle {
// fileService.uploadBast64(bast64,"bm_att_person","bm_att_person")
}
//考情机是否绑定工程
- String proId=service.getDevPorId(devCode);
+ ResultVo resultVo=service.getDevPorId(devCode,time);
//
- if(StringUtils.isNotEmpty(proId)){
- //验证用户是否入场
- BmWorkerEinUserVo vo=service.getOnUserInfo(userId,proId);
+ if(resultVo!=null){
+ BmWorkerEinUserVo vo;
+ //已经解绑过的考勤机
+ if("1".equals(resultVo.getType())){
+ vo=service.getOnUserInfoRecord(userId,resultVo.getProId());
+ }else{
+ vo=service.getOnUserInfo(userId,resultVo.getProId());
+ }
if(vo==null){
- vo=createAttendanceVo(deviceVo,userId,devCode,time,bast64);
- vo.setAttDay(attDay);
- vo.setAttMonth(month);
- service.addWrcUser(vo);
+ vo=createAttendanceVo(deviceVo,userId,devCode,time,bast64);
+ vo.setAttDay(attDay);
+ vo.setAttMonth(month);
+ service.addWrcUser(vo);
}else {
vo.setAttDay(attDay);
vo.setAttMonth(month);
@@ -98,6 +104,7 @@ public class UserFaceHandle {
service.addAttendInfo(vo);
//数据返回
}
+
}else{
BmWorkerEinUserVo vo=createAttendanceVo(deviceVo,userId,devCode,time,bast64);
service.addWrcUser(vo);
@@ -124,10 +131,18 @@ public class UserFaceHandle {
String attDay= YMD_SDF.format(datetime);
String month=MM_SDF.format(datetime);
//考情机是否绑定工程
- String proId=service.getDevPorId(devCode);
- if(StringUtils.isNotEmpty(proId)){
+ ResultVo resultVo=service.getDevPorId(devCode,time);
+ // String proId=service.getDevPorId(devCode);
+ if(resultVo!=null ){
//验证用户是否入场
- BmWorkerEinUserVo vo=service.getOnUserInfo(userId,proId);
+ BmWorkerEinUserVo vo;
+ //已经解绑过的考勤机
+ if("1".equals(resultVo.getType())){
+ vo=service.getOnUserInfoRecord(userId,resultVo.getProId());
+ }else{
+ vo=service.getOnUserInfo(userId,resultVo.getProId());
+ }
+ // BmWorkerEinUserVo vo=service.getOnUserInfo(userId,proId);
if(vo==null){
// vo=createAttendanceVo(deviceVo,userId,devCode,time,bast64);
// vo.setAttDay(attDay);
diff --git a/bonus-modules/bonus-urk/src/main/java/com/bonus/urk/mapper/UserFaceHandleMapper.java b/bonus-modules/bonus-urk/src/main/java/com/bonus/urk/mapper/UserFaceHandleMapper.java
index b53b2cc..06a470f 100644
--- a/bonus-modules/bonus-urk/src/main/java/com/bonus/urk/mapper/UserFaceHandleMapper.java
+++ b/bonus-modules/bonus-urk/src/main/java/com/bonus/urk/mapper/UserFaceHandleMapper.java
@@ -1,6 +1,7 @@
package com.bonus.urk.mapper;
import com.bonus.urk.vo.BmWorkerEinUserVo;
+import com.bonus.urk.vo.ResultVo;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
@@ -16,6 +17,8 @@ public interface UserFaceHandleMapper {
*/
BmWorkerEinUserVo getOnUserInfo(@Param("userId") String userId,@Param("proId")String proId);
+ BmWorkerEinUserVo getOnUserInfoRecord(@Param("userId") String userId,@Param("proId")String proId);
+
/**
* 新增人员考勤数据
* @param vo
@@ -55,5 +58,12 @@ public interface UserFaceHandleMapper {
* @param devCode
* @return
*/
- String getDevPorId(@Param("devCode") String devCode);
+ ResultVo getDevPorId(@Param("devCode") String devCode);
+
+ /**
+ * 查询历史考勤机绑定信息
+ * @param devCode
+ * @param time
+ */
+ ResultVo getDevPorIdTime(@Param("devCode")String devCode, @Param("time")String time);
}
diff --git a/bonus-modules/bonus-urk/src/main/java/com/bonus/urk/service/UserFaceHandleService.java b/bonus-modules/bonus-urk/src/main/java/com/bonus/urk/service/UserFaceHandleService.java
index 7040a9c..6b7b43c 100644
--- a/bonus-modules/bonus-urk/src/main/java/com/bonus/urk/service/UserFaceHandleService.java
+++ b/bonus-modules/bonus-urk/src/main/java/com/bonus/urk/service/UserFaceHandleService.java
@@ -5,18 +5,24 @@ import com.bonus.common.core.constant.SecurityConstants;
import com.bonus.common.core.domain.R;
import com.bonus.common.core.utils.DateUtils;
import com.bonus.common.core.utils.StringUtils;
+import com.bonus.common.redis.service.RedisService;
import com.bonus.system.api.RemoteUploadUtilsService;
import com.bonus.system.api.domain.FileVo;
import com.bonus.system.api.model.UploadFileVo;
import com.bonus.urk.mapper.UserFaceHandleMapper;
import com.bonus.urk.minio.UrkMinioService;
import com.bonus.urk.vo.BmWorkerEinUserVo;
+import com.bonus.urk.vo.ResultVo;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
+import java.lang.ref.WeakReference;
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.TimeUnit;
/**
* @author 黑子
@@ -33,6 +39,9 @@ public class UserFaceHandleService {
@Resource
private UrkMinioService fileService;
+ @Autowired
+ private RedisService redisService;
+
/**
* 依据用户id 查询施工工程信息
* @param userId
@@ -60,14 +69,23 @@ public class UserFaceHandleService {
String id=StringUtils.randomUUID();
vo.setId(id);
vo.setCreateTime(DateUtils.getTime());
- Integer num=mapper.getTodayIsExit(vo);
- //每日新增一条考勤信息
- if(num==null || num ==0){
- UploadFileVo uploadFileVo=fileService.upload("bm_att_person",vo.getId(),"考勤照片","attr",vo.getAttPhoto(),null);
- if(uploadFileVo!=null){
- vo.setImage(uploadFileVo.getPath());
- mapper.insertAttPerson(vo);
- }
+ //先去读取锁-如果被锁了则
+ Object lock= getLock(vo.getUserId());
+ synchronized (lock) {
+ boolean loock= (boolean) lock;
+ if(loock){
+ Integer num=mapper.getTodayIsExit(vo);
+ //每日新增一条考勤信息
+ if(num==null || num ==0){
+ UploadFileVo uploadFileVo=fileService.upload("bm_att_person",vo.getId(),"考勤照片","attr",vo.getAttPhoto(),null);
+ if(uploadFileVo!=null){
+ vo.setImage(uploadFileVo.getPath());
+ mapper.insertAttPerson(vo);
+ //移除锁
+ removeLock(vo.getUserId());
+ }
+ }
+ }
}
if(StringUtils.isEmpty(vo.getImage())){
vo.setImage("不记录");
@@ -108,15 +126,50 @@ public class UserFaceHandleService {
}
}
-
+ /**
+ * 获取指定用户ID的专属锁对象
+ */
+ public boolean getLock(String userId) {
+ //获取数据
+ Integer value=redisService.getCacheObject("lock_"+userId);
+ if (value == null || value == 0) {
+ //添加一个锁占用一分钟避免失效
+ redisService.setCacheObject("lock_"+userId,1,20L, TimeUnit.SECONDS);
+ return true;
+ }
+ return false;
+ }
+ /**
+ * 手动移除锁对象(非必须,弱引用会自动回收,建议在用户注销等场景手动调用)
+ */
+ public void removeLock(String userId) {
+ if (userId != null) {
+ redisService.deleteObject("lock_"+userId);
+ }
+ }
/**
* 查询考情机绑定的工程
* @param devCode
* @return
*/
- public String getDevPorId(String devCode) {
+ public ResultVo getDevPorId(String devCode, String time) {
try{
- return mapper.getDevPorId(devCode);
+ ResultVo vo= mapper.getDevPorIdTime(devCode,time);
+ if(vo==null){
+ return mapper.getDevPorId(devCode);
+ }
+ }catch (Exception e){
+ log.error(e.toString(),e);
+ }
+ return null;
+ }
+
+ public BmWorkerEinUserVo getOnUserInfoRecord(String userId, String proId) {
+ try{
+ BmWorkerEinUserVo vo=mapper.getOnUserInfoRecord(userId,proId);
+ if(vo!=null && StringUtils.isNotEmpty(vo.getUserId())){
+ return vo;
+ }
}catch (Exception e){
log.error(e.toString(),e);
}
diff --git a/bonus-modules/bonus-urk/src/main/java/com/bonus/urk/vo/ResultVo.java b/bonus-modules/bonus-urk/src/main/java/com/bonus/urk/vo/ResultVo.java
new file mode 100644
index 0000000..498139e
--- /dev/null
+++ b/bonus-modules/bonus-urk/src/main/java/com/bonus/urk/vo/ResultVo.java
@@ -0,0 +1,13 @@
+package com.bonus.urk.vo;
+
+import lombok.Data;
+
+@Data
+public class ResultVo {
+
+ private String devCode;
+
+ private String proId;
+
+ private String type;
+}
diff --git a/bonus-modules/bonus-urk/src/main/resources/mapper/urk/UserFaceHandleMapper.xml b/bonus-modules/bonus-urk/src/main/resources/mapper/urk/UserFaceHandleMapper.xml
index 62d0449..eafc077 100644
--- a/bonus-modules/bonus-urk/src/main/resources/mapper/urk/UserFaceHandleMapper.xml
+++ b/bonus-modules/bonus-urk/src/main/resources/mapper/urk/UserFaceHandleMapper.xml
@@ -32,6 +32,17 @@
LEFT JOIN bm_worker_contract bwc on bwc.worker_id=bwem.worker_id and bwc.is_active=1 and bwem.pro_id = bwc.pro_id
where bwem.worker_id=#{userId} and bwem.pro_id=#{proId}
+
-