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} + - + select pro_id proId ,0 type from pm_att_device where device_code=#{devCode} + + + insert into bm_att_record_no_ru(