弹弓人脸

This commit is contained in:
guoshengxiong 2025-03-18 09:55:24 +08:00
parent 1e0c93c0c7
commit a76a022cfd
14 changed files with 674 additions and 26 deletions

View File

@ -1 +0,0 @@
EWEPEPEOGMGTELIZJUGECKIUJDBCJTCNISGPBNHLJTJUBHEWGNAKGEGAIOHJDQAJGNCFDRFZJEDMJTGEDVIQGKEJIKACHIIXDEELIWCCEEELCVCEHFHAJGIPGIIKJRASJFEHAMIKCIGXAPGEHIIZGFBBJMFJJNGFHUGDGDFGFAITGDAXBGAZGKAMBMDABKBAERDUHDAUDOEBIBGBBMCUIZGABKCABIDMFHFRILIIANEBEWBOAIJHBYFAIREBFQFFCHHREKFTFJJQIAGFDSDZHMHUCGBVHIAUENBCJIBBJDIHHDIQFKFNDEBJCKCFGLJKBMHFAZHTHOIRGLJFDUHWEVFGFHDKIBEKFVCGAQJGCYBZAMHDJBJREAIOJPIAJDCJFXHKHPJTHUBTJPDWISESIEIPISDWDRAMFVFFBJCTFVFAARGJHFIMELIQJEAHFRFQDTERDCCGDCIKCAGBJVDLGHEXEBAWAMAFITJDANGBCRDPBPEECBAVAEBNJADGIPJAFWFJCYDZHFBFDHCMDCGNGTJTARACGRGOCDFWBPIRHKJACZAEHDJLGUFUGJDTHNJODDEBEVJLJUDDAAIJGNBPIQJOFNDHGKDQGOIBCWEGDBHDHDDBDPCFGLIBCRIPDSHECTAJBKGHGYAPDFJHFEDMCPAUHBDXAXEQCOEVCFDLGKAUASEZDAESETEUAJGHJFHLCTANBPDDCOGABTJJBBJHGLJPFMCQJOBTHPCNBMGFIPGNCHJSHOJGFQFSHGGUBVACADCHEDFDJHCKFEHBDIFJIUINCVJUDUENFHIUEFJFDBEPFHHGJAGLJGAOEMJNDYANAADPDODKGXFMHUCVHVCXGLCFHLFLETEZIWCTEFBRAOFFADEUIDFCGWDBCSAVDQJOANHKGHCSBFIBEACRITIEJGETGEJIAFDAIRJLHMEIBRCUIKDLBTHWHIEPHOGABGBBCCFFHKIECJJQHUDFHDITIQBQBCANARGIBPDUFTDHFKGOCMEEFHGXCTJVCOIXFUFDEAGZGNILISHSHKJGHQAEEAHLDWAWJADUGGELCKBACPAEINFSJHBQIFBVJHJICEAEGEFKBHCIHZCNJUJLIHGPFLILBRJTIYFUAZJVCPHPFQFYIDGZAUFXANHWBFJGJJHWFFBRCVBOCXJDIMBNBQJGJEFPGTAEDJFLHGITESAKCFBZBD

View File

@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.extension.service.IService;
import com.zhgd.xmgl.modules.project.entity.ProjectUfaceConfig;
import com.zhgd.xmgl.modules.worker.entity.UfaceDev;
import com.zhgd.xmgl.modules.worker.entity.WorkerInfo;
import org.apache.commons.lang3.tuple.Pair;
import java.util.List;
@ -45,14 +46,18 @@ public interface IProjectUfaceConfigService extends IService<ProjectUfaceConfig>
void deleteWorkerInfo(WorkerInfo workerInfo);
/**
*更新人员权限
* 更新人员权限
*
* @param newWorkerInfo
* @param oldWorkerInfo
*/
void updateWorkerInfo(WorkerInfo newWorkerInfo, WorkerInfo oldWorkerInfo);
Pair<String, String> getSendAndDeleteDevSns(WorkerInfo workerInfo);
/**
*批量发送人员权限
* 批量发送人员权限
*
* @param workerInfo
* @param projectUfaceConfig
* @param list

View File

@ -12,7 +12,6 @@ import com.zhgd.xmgl.call.HikvisionCall;
import com.zhgd.xmgl.constant.Cts;
import com.zhgd.xmgl.modules.basicdata.service.INoticeService;
import com.zhgd.xmgl.modules.project.entity.ProjectUfaceConfig;
import com.zhgd.xmgl.modules.project.enums.IscSendAuthModel;
import com.zhgd.xmgl.modules.project.enums.ProjectUfaceConfigSupplierTypeEnum;
import com.zhgd.xmgl.modules.project.enums.WorkerInfoDevTypeEnum;
import com.zhgd.xmgl.modules.project.mapper.ProjectUfaceConfigMapper;
@ -25,6 +24,7 @@ import com.zhgd.xmgl.modules.worker.mapper.UfaceDevToGroupMapper;
import com.zhgd.xmgl.modules.worker.mapper.UserDevAuthorityMapper;
import com.zhgd.xmgl.modules.worker.service.IUfaceDevService;
import com.zhgd.xmgl.modules.worker.service.impl.WorkerInfoServiceImpl;
import com.zhgd.xmgl.modules.worker.service.IDangongWorkerFaceStatusService;
import com.zhgd.xmgl.modules.xz.entity.XzHikvisionSync;
import com.zhgd.xmgl.modules.xz.enums.XzHikvisionSyncOperateEnum;
import com.zhgd.xmgl.modules.xz.mapper.XzHikvisionSyncMapper;
@ -93,6 +93,9 @@ public class ProjectUfaceConfigServiceImpl extends ServiceImpl<ProjectUfaceConfi
@Lazy
@Autowired
private INoticeService noticeService;
@Lazy
@Autowired
private IDangongWorkerFaceStatusService dangongWorkerFaceStatusService;
@Override
public void editProjectUfaceConfig(ProjectUfaceConfig projectUfaceConfig) {
@ -223,6 +226,9 @@ public class ProjectUfaceConfigServiceImpl extends ServiceImpl<ProjectUfaceConfi
List<UfaceDev> ufaceDevs = ufaceDevService.getAllDevsByProjectSn(ufaceConfig.getProjectSn());
this.deleteHkSyncRecordAndResetStatusForDev(workerInfo, ufaceDevs);
this.buildAndSendOneWorkerForHk(ufaceDevs, workerInfo, 3, ufaceConfig.getProjectSn(), true);
} else if (Objects.equals(ufaceConfig.getSupplierType(), SLINGSHOT.getCode())) {
//保存弹弓下发状态
dangongWorkerFaceStatusService.deleteStatus(workerInfo);
}
}
}
@ -302,6 +308,9 @@ public class ProjectUfaceConfigServiceImpl extends ServiceImpl<ProjectUfaceConfi
if (hasDev) {
HikvisionUfaceSDKUtil.addOrUpdatePerson(workerInfo, ufaceConfig, devBuilder.toString());
}
} else if (Objects.equals(ufaceConfig.getSupplierType(), SLINGSHOT.getCode())) {
//保存弹弓下发状态
dangongWorkerFaceStatusService.saveStatus(workerInfo);
}
}
}
@ -314,15 +323,16 @@ public class ProjectUfaceConfigServiceImpl extends ServiceImpl<ProjectUfaceConfi
* @param workerInfo
* @return
*/
@Override
public Pair<String, String> getSendAndDeleteDevSns(WorkerInfo workerInfo) {
//海康门禁isc
String devSns = "";
String notDevSns = "";
List<UfaceDev> allDevs = ufaceDevMapper.selectList(new LambdaQueryWrapper<UfaceDev>().eq(UfaceDev::getProjectSn, workerInfo.getProjectSn()));
if (NumberUtils.lt(workerInfo.getSafeScore(), PropertiesUtil.getWorkerInfoRedScore())) {
//红码不能通行
List<UfaceDev> allList = ufaceDevMapper.selectList(new LambdaQueryWrapper<UfaceDev>().eq(UfaceDev::getProjectSn, workerInfo.getProjectSn()));
if (CollUtil.isNotEmpty(allList)) {
notDevSns = StrUtil.join(Cts.COMMA, allList.stream().map(UfaceDev::getDevSn).collect(Collectors.toList()));
if (CollUtil.isNotEmpty(allDevs)) {
notDevSns = StrUtil.join(Cts.COMMA, allDevs.stream().map(UfaceDev::getDevSn).collect(Collectors.toList()));
}
} else if (Objects.equals(workerInfo.getDevType(), WorkerInfoDevTypeEnum.GROUP.getCode())) {
//设备分组情况
@ -338,9 +348,8 @@ public class ProjectUfaceConfigServiceImpl extends ServiceImpl<ProjectUfaceConfi
}
} else {
//只删除
List<UfaceDev> notExistList = ufaceDevMapper.selectList(new LambdaQueryWrapper<UfaceDev>().eq(UfaceDev::getProjectSn, workerInfo.getProjectSn()));
if (CollUtil.isNotEmpty(notExistList)) {
notDevSns = StrUtil.join(Cts.COMMA, notExistList.stream().map(UfaceDev::getDevSn).collect(Collectors.toList()));
if (CollUtil.isNotEmpty(allDevs)) {
notDevSns = StrUtil.join(Cts.COMMA, allDevs.stream().map(UfaceDev::getDevSn).collect(Collectors.toList()));
}
}
} else {
@ -357,9 +366,8 @@ public class ProjectUfaceConfigServiceImpl extends ServiceImpl<ProjectUfaceConfi
}
} else {
//只删除
List<UfaceDev> notExistList = ufaceDevMapper.selectList(new LambdaQueryWrapper<UfaceDev>().eq(UfaceDev::getProjectSn, workerInfo.getProjectSn()));
if (CollUtil.isNotEmpty(notExistList)) {
notDevSns = StrUtil.join(Cts.COMMA, notExistList.stream().map(UfaceDev::getDevSn).collect(Collectors.toList()));
if (CollUtil.isNotEmpty(allDevs)) {
notDevSns = StrUtil.join(Cts.COMMA, allDevs.stream().map(UfaceDev::getDevSn).collect(Collectors.toList()));
}
}
}
@ -489,6 +497,9 @@ public class ProjectUfaceConfigServiceImpl extends ServiceImpl<ProjectUfaceConfi
//海康门禁isc
List<UfaceDev> list = ufaceDevService.getAllDevsByProjectSn(ufaceConfig.getProjectSn());
this.buildAndSendOneWorkerForHk(list, workerInfo, 1, ufaceConfig.getProjectSn(), true);
} else if (Objects.equals(ufaceConfig.getSupplierType(), SLINGSHOT.getCode())) {
//保存弹弓下发状态
dangongWorkerFaceStatusService.saveStatus(workerInfo);
}
}

View File

@ -0,0 +1,127 @@
package com.zhgd.xmgl.modules.worker.controller;
import com.zhgd.annotation.OperLog;
import com.zhgd.xmgl.modules.worker.entity.DangongWorkerFaceStatus;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiImplicitParams;
import java.util.HashMap;
import springfox.documentation.annotations.ApiIgnore;
import java.util.List;
import com.zhgd.jeecg.common.api.vo.Result;
import org.apache.commons.collections.MapUtils;
import com.zhgd.xmgl.modules.worker.service.IDangongWorkerFaceStatusService;
import org.simpleframework.xml.core.Validate;
import com.baomidou.mybatisplus.core.metadata.IPage;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
/**
* @Title: Controller
* @Description: 弹弓人脸照片质量反馈
* @author pds
* @date 2025-03-10
* @version V1.0
*/
@RestController
@RequestMapping("/xmgl/dangongWorkerFaceStatus")
@Slf4j
@Api(tags = "弹弓人脸照片质量反馈相关Api")
public class DangongWorkerFaceStatusController {
@Autowired
private IDangongWorkerFaceStatusService dangongWorkerFaceStatusService;
/**
* 分页列表查询
*
* @return
*/
@OperLog(operModul = "弹弓人脸照片质量反馈管理", operType = "分页查询", operDesc = "分页列表查询弹弓人脸照片质量反馈信息")
@ApiOperation(value = "分页列表查询弹弓人脸照片质量反馈信息", notes = "分页列表查询弹弓人脸照片质量反馈信息", httpMethod = "GET")
@ApiImplicitParams({
@ApiImplicitParam(name = "pageNo", value = "第几页", paramType = "query", required = true, dataType = "Integer"),
@ApiImplicitParam(name = "pageSize", value = "每页显示条数", paramType = "query", required = true, dataType = "Integer"),
})
@GetMapping(value = "/page")
public Result<IPage<DangongWorkerFaceStatus>> queryPageList(@ApiIgnore @RequestParam HashMap<String, Object> param) {
return Result.success(dangongWorkerFaceStatusService.queryPageList(param));
}
/**
* 列表查询
*
* @return
*/
@OperLog(operModul = "弹弓人脸照片质量反馈管理", operType = "列表查询", operDesc = "列表查询弹弓人脸照片质量反馈信息")
@ApiOperation(value = "列表查询弹弓人脸照片质量反馈信息", notes = "列表查询弹弓人脸照片质量反馈信息", httpMethod = "GET")
@GetMapping(value = "/list")
public Result<List<DangongWorkerFaceStatus>> queryList(@ApiIgnore @RequestParam HashMap<String, Object> param) {
return Result.success(dangongWorkerFaceStatusService.queryList(param));
}
/**
* 添加
*
* @param dangongWorkerFaceStatus
* @return
*/
@OperLog(operModul = "弹弓人脸照片质量反馈管理", operType = "添加", operDesc = "添加弹弓人脸照片质量反馈信息")
@ApiOperation(value = "添加弹弓人脸照片质量反馈信息", notes = "添加弹弓人脸照片质量反馈信息", httpMethod = "POST")
@PostMapping(value = "/add")
public Result<DangongWorkerFaceStatus> add(@RequestBody @Validate DangongWorkerFaceStatus dangongWorkerFaceStatus) {
dangongWorkerFaceStatusService.add(dangongWorkerFaceStatus);
return Result.ok();
}
/**
* 编辑
*
* @param dangongWorkerFaceStatus
* @return
*/
@OperLog(operModul = "弹弓人脸照片质量反馈管理", operType = "编辑", operDesc = "编辑弹弓人脸照片质量反馈信息")
@ApiOperation(value = "编辑弹弓人脸照片质量反馈信息", notes = "编辑弹弓人脸照片质量反馈信息", httpMethod = "POST")
@PostMapping(value = "/edit")
public Result<DangongWorkerFaceStatus> edit(@RequestBody DangongWorkerFaceStatus dangongWorkerFaceStatus) {
dangongWorkerFaceStatusService.edit(dangongWorkerFaceStatus);
return Result.ok();
}
/**
* 通过id删除
*
* @return
*/
@OperLog(operModul = "弹弓人脸照片质量反馈管理", operType = "删除", operDesc = "删除弹弓人脸照片质量反馈信息")
@ApiOperation(value = "删除弹弓人脸照片质量反馈信息", notes = "删除弹弓人脸照片质量反馈信息", httpMethod = "POST")
@ApiImplicitParam(name = "id", value = "弹弓人脸照片质量反馈ID", paramType = "body", required = true, dataType = "String", example = "{\"id\":\"1\"}")
@PostMapping(value = "/delete")
public Result<DangongWorkerFaceStatus> delete(@ApiIgnore @RequestBody HashMap<String, Object> map) {
dangongWorkerFaceStatusService.delete(MapUtils.getString(map, "id"));
return Result.ok();
}
/**
* 通过id查询
*
* @param id
* @return
*/
@OperLog(operModul = "弹弓人脸照片质量反馈管理", operType = "通过id查询", operDesc = "通过id查询弹弓人脸照片质量反馈信息")
@ApiOperation(value = "通过id查询弹弓人脸照片质量反馈信息", notes = "通过id查询弹弓人脸照片质量反馈信息", httpMethod = "GET")
@ApiImplicitParam(name = "id", value = "弹弓人脸照片质量反馈ID", paramType = "query", required = true, dataType = "Integer")
@GetMapping(value = "/queryById")
public Result<DangongWorkerFaceStatus> queryById(@RequestParam(name = "id", required = true) String id) {
return Result.success(dangongWorkerFaceStatusService.queryById(id));
}
}

View File

@ -1,30 +1,51 @@
package com.zhgd.xmgl.modules.worker.controller;
import com.gexin.fastjson.JSON;
import cn.hutool.core.date.DateTime;
import cn.hutool.core.date.DateUtil;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.zhgd.jeecg.common.execption.OpenAlertException;
import com.zhgd.xmgl.modules.worker.entity.DangongWorkerFaceStatus;
import com.zhgd.xmgl.modules.worker.entity.UfaceDev;
import com.zhgd.xmgl.modules.worker.entity.dto.GetWorkerInfoByDevDto;
import com.zhgd.xmgl.modules.worker.entity.vo.GetWorkerInfoByDevVo;
import com.zhgd.xmgl.modules.worker.entity.vo.UploadAttendanceByDevDto;
import com.zhgd.xmgl.modules.worker.service.IDangongWorkerFaceStatusService;
import com.zhgd.xmgl.modules.worker.service.IUfaceDevService;
import com.zhgd.xmgl.modules.worker.service.IWorkerAttendanceService;
import com.zhgd.xmgl.modules.worker.service.IWorkerInfoService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections.MapUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Lazy;
import org.springframework.web.bind.annotation.*;
import springfox.documentation.annotations.ApiIgnore;
import javax.ws.rs.GET;
import java.util.HashMap;
import javax.annotation.Resource;
import java.util.*;
@RestController
@RequestMapping
@Slf4j
@Api(tags = "人脸设备对外api")
public class UfaceDevApiController {
@Lazy
@Autowired
IWorkerInfoService workerInfoService;
@Lazy
@Autowired
IWorkerAttendanceService workerAttendanceService;
@Lazy
@Resource
private IUfaceDevService ufaceDevService;
@Lazy
@Autowired
private IDangongWorkerFaceStatusService dangongWorkerFaceStatusService;
@ApiOperation(value = "下载白名单(拉取允许通行人员信息)", notes = "下载白名单(拉取允许通行人员信息)", httpMethod = "GET")
@GetMapping(value = "/workers")
@ -40,6 +61,63 @@ public class UfaceDevApiController {
return workerAttendanceService.uploadAttendanceByDev(dto);
}
@ApiOperation(value = "照片质量反馈", notes = "照片质量反馈", httpMethod = "POST")
@PostMapping(value = "/quality")
public String quality(@RequestBody HashMap<String, Object> param) {
//只会返回有问题的图片
log.info("照片质量反馈:{}", JSON.toJSONString(param));
//productId string 产品id
//deviceId string 设备编号
//data object 数组
//data.workerId string 系统中的人员编号
//data.name string 人员
//data.plat string 平台
//data.msg string 信息
//data.code string 错误号
JSONArray data = JSON.parseArray(JSON.toJSONString(param.get("data")));
String deviceId = MapUtils.getString(param, "deviceId");
int count = ufaceDevService.count(new LambdaQueryWrapper<UfaceDev>()
.eq(UfaceDev::getDevSn, deviceId));
if (count == 0) {
throw new OpenAlertException("设备" + deviceId + "在平台中不存在");
}
List<Map<String, Object>> workerIdObjs = new ArrayList<>();
List<Long> workerIds = new ArrayList<>();
for (int i = 0; i < data.size(); i++) {
JSONObject data1 = data.getJSONObject(i);
String workerId = data1.getString("workerId");
dangongWorkerFaceStatusService.update(null, new LambdaUpdateWrapper<DangongWorkerFaceStatus>()
.set(DangongWorkerFaceStatus::getMsg, data1.getString("msg"))
.set(DangongWorkerFaceStatus::getDangongStatus, data1.getString("code"))
.eq(DangongWorkerFaceStatus::getDevSn, deviceId)
.eq(DangongWorkerFaceStatus::getWorkerId, workerId)
);
HashMap<String, Object> map = new HashMap<>();
map.put("workerId", workerId);
workerIds.add(Long.valueOf(workerId));
workerIdObjs.add(map);
}
dangongWorkerFaceStatusService.updateStatus(workerIds);
GetWorkerInfoByDevVo vo = new GetWorkerInfoByDevVo();
vo.setSuccess(true);
vo.setCode(0);
vo.setMessage("success");
vo.setTime(System.currentTimeMillis() / 1000);
vo.setData(workerIdObjs);
vo.setEvent("quality");
//{
// "success": true,
// "code": 0,
// "message": "success",
// "time": 1583137489, //单位s
// "data": [{
// "workerId": "121212"
// }],
// "event": "quality"
//}
return JSON.toJSONString(vo);
}
@ApiOperation(value = "时间同步", notes = "时间同步", httpMethod = "POST")
@GetMapping(value = "/init")
public String init(@ApiIgnore @RequestParam HashMap<String, Object> paramMap) {

View File

@ -0,0 +1,69 @@
package com.zhgd.xmgl.modules.worker.entity;
import java.io.Serializable;
import java.util.Date;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import com.fasterxml.jackson.annotation.JsonFormat;
import org.springframework.format.annotation.DateTimeFormat;
import org.jeecgframework.poi.excel.annotation.Excel;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
/**
* @Description: 弹弓人脸照片质量反馈
* @author pds
* @date 2025-03-10
* @version V1.0
*/
@Data
@TableName("dangong_worker_face_status")
@ApiModel(value = "DangongWorkerFaceStatus实体类", description = "DangongWorkerFaceStatus")
public class DangongWorkerFaceStatus implements Serializable {
private static final long serialVersionUID = 1L;
/**
* id
*/
@TableId(type = IdType.ASSIGN_ID)
@ApiModelProperty(value = "id")
private java.lang.Long id;
/**
* 所属项目SN
*/
@ApiModelProperty(value = "所属项目SN")
private java.lang.String projectSn;
/**
* 设备唯一标识
*/
@ApiModelProperty(value = "设备唯一标识")
private java.lang.String devSn;
/**
* 人员id
*/
@ApiModelProperty(value = "人员id")
private java.lang.Long workerId;
/**
* 弹弓下发人员状态0:成功,1:没有照片,2:入库失败,3: XXX 相似度高,4:下载失败,5:照片太大,6:其他
*/
@ApiModelProperty(value = "弹弓下发人员状态0:成功,1:没有照片,2:入库失败,3:与 XXX 相似度高,4:下载失败,5:照片太大,6:其他")
private java.lang.String dangongStatus;
@ApiModelProperty(value = "消息")
private java.lang.String msg;
/**
* 创建时间
*/
@ApiModelProperty(value = "创建时间")
private java.util.Date createDate;
/**
* 更新时间
*/
@ApiModelProperty(value = "更新时间")
private java.util.Date updateDate;
@TableField(exist = false)
private String devName;
}

View File

@ -345,6 +345,9 @@ public class WorkerInfo implements Serializable {
private Double exitSafeScore;
@ApiModelProperty(value = "人员性质")
private Integer workerNature;
@ApiModelProperty(value = "弹弓下发人员状态0:成功,1:没有照片,2:入库失败,3:与 XXX 相似度高,4:下载失败,5:照片太大,6:其他")
private String dangongStatus;
@TableField(exist = false)
@ApiModelProperty(value = "人员性质")
private String workerNatureName;

View File

@ -0,0 +1,51 @@
package com.zhgd.xmgl.modules.worker.mapper;
import java.util.List;
import java.util.HashMap;
import com.zhgd.xmgl.modules.worker.entity.DangongWorkerFaceStatus;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.Constants;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
/**
* @Description: 弹弓人脸照片质量反馈
* @author pds
* @date 2025-03-10
* @version V1.0
*/
@Mapper
public interface DangongWorkerFaceStatusMapper extends BaseMapper<DangongWorkerFaceStatus> {
/**
* 分页列表查询弹弓人脸照片质量反馈信息
*
* @param page
* @param queryWrapper
* @param param
* @return
*/
IPage<DangongWorkerFaceStatus> queryList(Page<DangongWorkerFaceStatus> page, @Param(Constants.WRAPPER) QueryWrapper<DangongWorkerFaceStatus> queryWrapper, @Param("param") HashMap<String, Object> param);
/**
* 列表查询弹弓人脸照片质量反馈信息
*
* @param queryWrapper
* @param param
* @return
*/
List<DangongWorkerFaceStatus> queryList(@Param(Constants.WRAPPER) QueryWrapper<DangongWorkerFaceStatus> queryWrapper, @Param("param") HashMap<String, Object> param);
/**
* 通过id查询弹弓人脸照片质量反馈信息
*
* @param id
* @return
*/
DangongWorkerFaceStatus queryById(String id);
}

View File

@ -0,0 +1,22 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.zhgd.xmgl.modules.worker.mapper.DangongWorkerFaceStatusMapper">
<select id="queryList" resultType="com.zhgd.xmgl.modules.worker.entity.DangongWorkerFaceStatus">
select * from (
select t.*
,ud.dev_name
from dangong_worker_face_status t
left join uface_dev ud on ud.dev_sn=t.dev_sn
)t
${ew.customSqlSegment}
</select>
<select id="queryById" resultType="com.zhgd.xmgl.modules.worker.entity.DangongWorkerFaceStatus">
select * from (
select t.*
,ud.dev_name
from dangong_worker_face_status t
left join uface_dev ud on ud.dev_sn=t.dev_sn
)t
where t.id = #{id}
</select>
</mapper>

View File

@ -48,6 +48,9 @@
and create_time>=current_date group by person_sn ) wa on wa.person_sn = a.person_sn
</if>
WHERE 1 = 1
<if test="param.dangongStatus != null and param.dangongStatus != '' or param.dangongStatus == '0'.toString()">
and a.dangong_status = #{param.dangongStatus}
</if>
<if test="param.safeScoreLevel == '1'.toString()">
and a.safe_score &lt; #{param.workerInfoRedScore}
</if>

View File

@ -0,0 +1,86 @@
package com.zhgd.xmgl.modules.worker.service;
import com.zhgd.xmgl.modules.worker.entity.DangongWorkerFaceStatus;
import com.zhgd.xmgl.modules.worker.entity.WorkerInfo;
import com.baomidou.mybatisplus.extension.service.IService;
import com.baomidou.mybatisplus.core.metadata.IPage;
import java.util.HashMap;
import java.util.List;
/**
* @Description: 弹弓人脸照片质量反馈
* @author pds
* @date 2025-03-10
* @version V1.0
*/
public interface IDangongWorkerFaceStatusService extends IService<DangongWorkerFaceStatus> {
/**
* 分页列表查询弹弓人脸照片质量反馈信息
*
* @param param 参数map
* @return
*/
IPage<DangongWorkerFaceStatus> queryPageList(HashMap<String, Object> param);
/**
* 列表查询弹弓人脸照片质量反馈信息
*
* @param param 参数map
* @return
*/
List<DangongWorkerFaceStatus> queryList(HashMap<String, Object> param);
/**
* 添加弹弓人脸照片质量反馈信息
*
* @param dangongWorkerFaceStatus 弹弓人脸照片质量反馈
* @return
*/
void add(DangongWorkerFaceStatus dangongWorkerFaceStatus);
/**
* 编辑弹弓人脸照片质量反馈信息
*
* @param dangongWorkerFaceStatus 弹弓人脸照片质量反馈
* @return
*/
void edit(DangongWorkerFaceStatus dangongWorkerFaceStatus);
/**
* 根据id删除弹弓人脸照片质量反馈信息
*
* @param id 弹弓人脸照片质量反馈的id
* @return
*/
void delete(String id);
/**
* 根据id查询弹弓人脸照片质量反馈信息
*
* @param id 弹弓人脸照片质量反馈的id
* @return
*/
DangongWorkerFaceStatus queryById(String id);
/**
* 保存人脸下发状态
*
* @param workerInfo
*/
void saveStatus(WorkerInfo workerInfo);
/**
* 删除人脸下发状态
*
* @param workerInfo
*/
void deleteStatus(WorkerInfo workerInfo);
/**
* 更新弹弓下发状态
*
* @param workerIds
*/
void updateStatus(List<Long> workerIds);
}

View File

@ -0,0 +1,164 @@
package com.zhgd.xmgl.modules.worker.service.impl;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.zhgd.jeecg.common.execption.OpenAlertException;
import com.zhgd.jeecg.common.system.query.QueryGenerator;
import com.zhgd.xmgl.modules.project.service.IProjectUfaceConfigService;
import com.zhgd.xmgl.modules.worker.entity.DangongWorkerFaceStatus;
import com.zhgd.xmgl.modules.worker.entity.WorkerInfo;
import com.zhgd.xmgl.modules.worker.mapper.DangongWorkerFaceStatusMapper;
import com.zhgd.xmgl.modules.worker.service.IDangongWorkerFaceStatusService;
import com.zhgd.xmgl.modules.worker.service.IWorkerInfoService;
import com.zhgd.xmgl.util.PageUtil;
import com.zhgd.xmgl.util.RefUtil;
import org.apache.commons.lang3.tuple.Pair;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Lazy;
import org.springframework.stereotype.Service;
import java.util.*;
import java.util.stream.Collectors;
/**
* @Description: 弹弓人脸照片质量反馈
* @author pds
* @date 2025-03-10
* @version V1.0
*/
@Service
public class DangongWorkerFaceStatusServiceImpl extends ServiceImpl<DangongWorkerFaceStatusMapper, DangongWorkerFaceStatus> implements IDangongWorkerFaceStatusService {
@Autowired
private DangongWorkerFaceStatusMapper dangongWorkerFaceStatusMapper;
@Lazy
@Autowired
private IProjectUfaceConfigService projectUfaceConfigService;
@Lazy
@Autowired
private IWorkerInfoService workerInfoService;
@Override
public IPage<DangongWorkerFaceStatus> queryPageList(HashMap<String, Object> param) {
QueryWrapper<DangongWorkerFaceStatus> queryWrapper = this.getQueryWrapper(param);
Page<DangongWorkerFaceStatus> page = PageUtil.getPage(param);
IPage<DangongWorkerFaceStatus> pageList = baseMapper.queryList(page, queryWrapper, param);
pageList.setRecords(this.dealList(pageList.getRecords()));
return pageList;
}
@Override
public List<DangongWorkerFaceStatus> queryList(HashMap<String, Object> param) {
QueryWrapper<DangongWorkerFaceStatus> queryWrapper = getQueryWrapper(param);
return dealList(baseMapper.queryList(queryWrapper, param));
}
private QueryWrapper<DangongWorkerFaceStatus> getQueryWrapper(HashMap<String, Object> param) {
QueryWrapper<DangongWorkerFaceStatus> queryWrapper = QueryGenerator.initPageQueryWrapper(DangongWorkerFaceStatus.class, param, true);
queryWrapper.orderByDesc(RefUtil.fieldNameUlc(DangongWorkerFaceStatus::getId));
return queryWrapper;
}
private List<DangongWorkerFaceStatus> dealList(List<DangongWorkerFaceStatus> list) {
return list;
}
@Override
public void add(DangongWorkerFaceStatus dangongWorkerFaceStatus) {
dangongWorkerFaceStatus.setId(null);
baseMapper.insert(dangongWorkerFaceStatus);
}
@Override
public void edit(DangongWorkerFaceStatus dangongWorkerFaceStatus) {
DangongWorkerFaceStatus oldDangongWorkerFaceStatus = baseMapper.selectById(dangongWorkerFaceStatus.getId());
if (oldDangongWorkerFaceStatus == null) {
throw new OpenAlertException("未找到对应实体");
}
baseMapper.updateById(dangongWorkerFaceStatus);
}
@Override
public void delete(String id) {
DangongWorkerFaceStatus dangongWorkerFaceStatus = baseMapper.selectById(id);
if (dangongWorkerFaceStatus == null) {
throw new OpenAlertException("未找到对应实体");
}
baseMapper.deleteById(id);
}
@Override
public DangongWorkerFaceStatus queryById(String id) {
DangongWorkerFaceStatus entity = baseMapper.queryById(id);
if (entity == null) {
throw new OpenAlertException("未找到对应实体");
}
return entity;
}
@Override
public void saveStatus(WorkerInfo workerInfo) {
//保存弹弓下发状态
Pair<String, String> pair = projectUfaceConfigService.getSendAndDeleteDevSns(workerInfo);
String devs = pair.getLeft();
if (StrUtil.isNotEmpty(devs)) {
this.remove(new LambdaQueryWrapper<DangongWorkerFaceStatus>()
.eq(DangongWorkerFaceStatus::getWorkerId, workerInfo.getId()));
for (String sn : StrUtil.split(devs, ",")) {
DangongWorkerFaceStatus st = new DangongWorkerFaceStatus();
st.setProjectSn(workerInfo.getProjectSn());
st.setDevSn(sn);
st.setWorkerId(workerInfo.getId());
st.setDangongStatus(null);
this.save(st);
}
}
}
@Override
public void deleteStatus(WorkerInfo workerInfo) {
this.remove(new LambdaQueryWrapper<DangongWorkerFaceStatus>()
.eq(DangongWorkerFaceStatus::getWorkerId, workerInfo.getId()));
}
@Override
public void updateStatus(List<Long> workerIds) {
Map<Long, List<DangongWorkerFaceStatus>> workerMap = this.list(new LambdaQueryWrapper<DangongWorkerFaceStatus>()
.in(DangongWorkerFaceStatus::getWorkerId, workerIds)
).stream().collect(Collectors.groupingBy(DangongWorkerFaceStatus::getWorkerId));
for (Map.Entry<Long, List<DangongWorkerFaceStatus>> entry : workerMap.entrySet()) {
List<DangongWorkerFaceStatus> statusList = entry.getValue();
if (CollUtil.isEmpty(statusList)) {
continue;
}
Integer sendSuccessStatus;
for (DangongWorkerFaceStatus status : statusList) {
//时间小于10分钟
if (DateUtil.compare(status.getUpdateDate(), DateUtil.offsetMinute(new Date(), -10)) < 0) {
status.setDangongStatus("0");
status.setMsg("成功");
this.updateById(status);
}
if (statusList.stream().allMatch(o -> Objects.equals(o.getDangongStatus(), "0"))) {
sendSuccessStatus = 1;
} else if (statusList.stream().allMatch(o -> o.getDangongStatus() == null)) {
sendSuccessStatus = 4;
} else if (statusList.stream().anyMatch(o -> Objects.equals(o.getDangongStatus(), "0"))) {
sendSuccessStatus = 3;
} else {
sendSuccessStatus = 2;
}
workerInfoService.update(null, new LambdaUpdateWrapper<WorkerInfo>()
.set(WorkerInfo::getSendSuccessStatus, sendSuccessStatus)
.eq(WorkerInfo::getId, entry.getKey()));
}
}
}
}

View File

@ -306,6 +306,7 @@ public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
.antMatchers("/xmgl/smartBeamFieldMaintainData/**").permitAll()
.antMatchers("/xmgl/smartBeamFieldMakeBeamPedestal/list").permitAll()
.antMatchers("/xmgl/smartBeamFieldBeam/countSmartBeamFieldBeam").permitAll()
.antMatchers("/quality").permitAll()
.antMatchers("/workers").permitAll()
.antMatchers("/photo").permitAll()
.antMatchers("/init").permitAll()

View File

@ -24,21 +24,17 @@ import com.zhgd.xmgl.modules.dangerous.entity.HiddenDangerInspectRecord;
import com.zhgd.xmgl.modules.dangerous.service.IHiddenDangerInspectRecordService;
import com.zhgd.xmgl.modules.project.entity.Project;
import com.zhgd.xmgl.modules.project.entity.ProjectExternalSystemService;
import com.zhgd.xmgl.modules.project.entity.ProjectUfaceConfig;
import com.zhgd.xmgl.modules.project.mapper.ProjectExternalSystemServiceMapper;
import com.zhgd.xmgl.modules.project.mapper.ProjectMapper;
import com.zhgd.xmgl.modules.project.service.IProjectUfaceConfigService;
import com.zhgd.xmgl.modules.worker.entity.WorkerAttendance;
import com.zhgd.xmgl.modules.worker.entity.WorkerBlacklist;
import com.zhgd.xmgl.modules.worker.entity.WorkerInfo;
import com.zhgd.xmgl.modules.worker.entity.WorkerMonthAttendanceStatistics;
import com.zhgd.xmgl.modules.worker.entity.*;
import com.zhgd.xmgl.modules.worker.mapper.WorkerBlacklistMapper;
import com.zhgd.xmgl.modules.worker.mapper.WorkerCertificateMapper;
import com.zhgd.xmgl.modules.worker.mapper.WorkerInfoMapper;
import com.zhgd.xmgl.modules.worker.service.IWorkerAttendancePresenceService;
import com.zhgd.xmgl.modules.worker.service.IWorkerAttendanceService;
import com.zhgd.xmgl.modules.worker.service.IWorkerCertificateService;
import com.zhgd.xmgl.modules.worker.service.IWorkerMonthAttendanceStatisticsService;
import com.zhgd.xmgl.modules.worker.service.*;
import com.zhgd.xmgl.modules.worker.service.impl.WorkerInfoServiceImpl;
import com.zhgd.xmgl.modules.worker.service.IDangongWorkerFaceStatusService;
import com.zhgd.xmgl.modules.xz.entity.XzCertificateExpireAlarmRecord;
import com.zhgd.xmgl.modules.xz.entity.XzWorkerSafeWatchAlarm;
import com.zhgd.xmgl.modules.xz.entity.XzWorkerSafeWatchConfig;
@ -64,6 +60,7 @@ import net.javacrumbs.shedlock.core.SchedulerLock;
import org.apache.commons.lang3.StringUtils;
import org.jetbrains.annotations.Nullable;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Lazy;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import org.springframework.web.bind.annotation.RequestMapping;
@ -136,6 +133,13 @@ public class WorkerTask {
private IXzSecurityQualityInspectionRecordService qualityInspectionRecordService;
@Resource
private UploadFileService uploadFileService;
@Lazy
@Resource
private IUfaceDevService ufaceDevService;
@Lazy
@Autowired
private IDangongWorkerFaceStatusService dangongWorkerFaceStatusService;
/**
* 定时修改用户码状态
*/
@ -496,7 +500,7 @@ public class WorkerTask {
noticeList.add(notice);
}
if (CollUtil.isNotEmpty(userIds)) {
String frameUserNames = systemUserService.getFrameUserNames(StrUtil.join(",", userIds))+ msg;
String frameUserNames = systemUserService.getFrameUserNames(StrUtil.join(",", userIds)) + msg;
for (SystemUser user : projectLevelUsers) {
Notice notice = new Notice();
notice.setType("35");
@ -564,7 +568,7 @@ public class WorkerTask {
notice.setSendTime(now);
noticeList.add(notice);
}
String frameUserNames = systemUserService.getFrameUserNames(StrUtil.join(",", noticeUserIds))+ msg;
String frameUserNames = systemUserService.getFrameUserNames(StrUtil.join(",", noticeUserIds)) + msg;
for (SystemUser user : projectLevelUsers) {
Notice notice = new Notice();
notice.setType("35");
@ -833,4 +837,29 @@ public class WorkerTask {
map.put("faceUrl", url);
workerAttendanceService.saveExternalPassRecord(map);
}
/**
* 弹弓下发状态把超过一个小时没有接受到异常状态的人员的图片标志成正常状态
*/
@Scheduled(cron = "0 0/10 * * * ?")
@SchedulerLock(name = "updateDangongWorkerStatus", lockAtMostFor = 1000 * 55, lockAtLeastFor = 1000 * 55)
@RequestMapping("updateDangongWorkerStatus")
public void updateDangongWorkerStatus() {
List<ProjectUfaceConfig> configs = projectUfaceConfigService.list(new LambdaQueryWrapper<ProjectUfaceConfig>()
.eq(ProjectUfaceConfig::getSupplierType, 8));
if (CollUtil.isNotEmpty(configs)) {
List<String> sns = configs.stream().map(ProjectUfaceConfig::getProjectSn).collect(Collectors.toList());
// List<UfaceDev> ufaceDevs = ufaceDevService.list(new LambdaQueryWrapper<UfaceDev>()
// .in(UfaceDev::getProjectSn, sns));
// List<String> devSns = ufaceDevs.stream().map(UfaceDev::getDevSn).collect(Collectors.toList());
List<WorkerInfo> workerInfos = workerInfoService.list(new LambdaQueryWrapper<WorkerInfo>().in(WorkerInfo::getProjectSn, sns)
.or(eq -> eq.isNull(WorkerInfo::getSendSuccessStatus).or().ne(WorkerInfo::getSendSuccessStatus, 1)));
List<Long> workerIds = workerInfos.stream().map(WorkerInfo::getId).collect(Collectors.toList());
if (CollUtil.isEmpty(workerIds)) {
return;
}
dangongWorkerFaceStatusService.updateStatus(workerIds);
}
}
}