From a76a022cfdf835ee6e486e78143db80ea8464e74 Mon Sep 17 00:00:00 2001 From: guoshengxiong <1923636941@qq.com> Date: Tue, 18 Mar 2025 09:55:24 +0800 Subject: [PATCH] =?UTF-8?q?=E5=BC=B9=E5=BC=93=E4=BA=BA=E8=84=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ArcFace64.dat | 1 - .../service/IProjectUfaceConfigService.java | 9 +- .../impl/ProjectUfaceConfigServiceImpl.java | 31 ++-- .../DangongWorkerFaceStatusController.java | 127 ++++++++++++++ .../controller/UfaceDevApiController.java | 84 ++++++++- .../entity/DangongWorkerFaceStatus.java | 69 ++++++++ .../modules/worker/entity/WorkerInfo.java | 3 + .../mapper/DangongWorkerFaceStatusMapper.java | 51 ++++++ .../xml/DangongWorkerFaceStatusMapper.xml | 22 +++ .../worker/mapper/xml/WorkerInfoMapper.xml | 3 + .../IDangongWorkerFaceStatusService.java | 86 +++++++++ .../DangongWorkerFaceStatusServiceImpl.java | 164 ++++++++++++++++++ .../zhgd/xmgl/security/WebSecurityConfig.java | 1 + .../java/com/zhgd/xmgl/task/WorkerTask.java | 49 ++++-- 14 files changed, 674 insertions(+), 26 deletions(-) delete mode 100644 ArcFace64.dat create mode 100644 src/main/java/com/zhgd/xmgl/modules/worker/controller/DangongWorkerFaceStatusController.java create mode 100644 src/main/java/com/zhgd/xmgl/modules/worker/entity/DangongWorkerFaceStatus.java create mode 100644 src/main/java/com/zhgd/xmgl/modules/worker/mapper/DangongWorkerFaceStatusMapper.java create mode 100644 src/main/java/com/zhgd/xmgl/modules/worker/mapper/xml/DangongWorkerFaceStatusMapper.xml create mode 100644 src/main/java/com/zhgd/xmgl/modules/worker/service/IDangongWorkerFaceStatusService.java create mode 100644 src/main/java/com/zhgd/xmgl/modules/worker/service/impl/DangongWorkerFaceStatusServiceImpl.java diff --git a/ArcFace64.dat b/ArcFace64.dat deleted file mode 100644 index 17a8243c6..000000000 --- a/ArcFace64.dat +++ /dev/null @@ -1 +0,0 @@ -EWEPEPEOGMGTELIZJUGECKIUJDBCJTCNISGPBNHLJTJUBHEWGNAKGEGAIOHJDQAJGNCFDRFZJEDMJTGEDVIQGKEJIKACHIIXDEELIWCCEEELCVCEHFHAJGIPGIIKJRASJFEHAMIKCIGXAPGEHIIZGFBBJMFJJNGFHUGDGDFGFAITGDAXBGAZGKAMBMDABKBAERDUHDAUDOEBIBGBBMCUIZGABKCABIDMFHFRILIIANEBEWBOAIJHBYFAIREBFQFFCHHREKFTFJJQIAGFDSDZHMHUCGBVHIAUENBCJIBBJDIHHDIQFKFNDEBJCKCFGLJKBMHFAZHTHOIRGLJFDUHWEVFGFHDKIBEKFVCGAQJGCYBZAMHDJBJREAIOJPIAJDCJFXHKHPJTHUBTJPDWISESIEIPISDWDRAMFVFFBJCTFVFAARGJHFIMELIQJEAHFRFQDTERDCCGDCIKCAGBJVDLGHEXEBAWAMAFITJDANGBCRDPBPEECBAVAEBNJADGIPJAFWFJCYDZHFBFDHCMDCGNGTJTARACGRGOCDFWBPIRHKJACZAEHDJLGUFUGJDTHNJODDEBEVJLJUDDAAIJGNBPIQJOFNDHGKDQGOIBCWEGDBHDHDDBDPCFGLIBCRIPDSHECTAJBKGHGYAPDFJHFEDMCPAUHBDXAXEQCOEVCFDLGKAUASEZDAESETEUAJGHJFHLCTANBPDDCOGABTJJBBJHGLJPFMCQJOBTHPCNBMGFIPGNCHJSHOJGFQFSHGGUBVACADCHEDFDJHCKFEHBDIFJIUINCVJUDUENFHIUEFJFDBEPFHHGJAGLJGAOEMJNDYANAADPDODKGXFMHUCVHVCXGLCFHLFLETEZIWCTEFBRAOFFADEUIDFCGWDBCSAVDQJOANHKGHCSBFIBEACRITIEJGETGEJIAFDAIRJLHMEIBRCUIKDLBTHWHIEPHOGABGBBCCFFHKIECJJQHUDFHDITIQBQBCANARGIBPDUFTDHFKGOCMEEFHGXCTJVCOIXFUFDEAGZGNILISHSHKJGHQAEEAHLDWAWJADUGGELCKBACPAEINFSJHBQIFBVJHJICEAEGEFKBHCIHZCNJUJLIHGPFLILBRJTIYFUAZJVCPHPFQFYIDGZAUFXANHWBFJGJJHWFFBRCVBOCXJDIMBNBQJGJEFPGTAEDJFLHGITESAKCFBZBD \ No newline at end of file diff --git a/src/main/java/com/zhgd/xmgl/modules/project/service/IProjectUfaceConfigService.java b/src/main/java/com/zhgd/xmgl/modules/project/service/IProjectUfaceConfigService.java index 6c98ae904..c4c0bcaea 100644 --- a/src/main/java/com/zhgd/xmgl/modules/project/service/IProjectUfaceConfigService.java +++ b/src/main/java/com/zhgd/xmgl/modules/project/service/IProjectUfaceConfigService.java @@ -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 void deleteWorkerInfo(WorkerInfo workerInfo); /** - *更新人员权限 + * 更新人员权限 + * * @param newWorkerInfo * @param oldWorkerInfo */ void updateWorkerInfo(WorkerInfo newWorkerInfo, WorkerInfo oldWorkerInfo); + Pair getSendAndDeleteDevSns(WorkerInfo workerInfo); + /** - *批量发送人员权限 + * 批量发送人员权限 + * * @param workerInfo * @param projectUfaceConfig * @param list diff --git a/src/main/java/com/zhgd/xmgl/modules/project/service/impl/ProjectUfaceConfigServiceImpl.java b/src/main/java/com/zhgd/xmgl/modules/project/service/impl/ProjectUfaceConfigServiceImpl.java index 58c20d56c..582a325e4 100644 --- a/src/main/java/com/zhgd/xmgl/modules/project/service/impl/ProjectUfaceConfigServiceImpl.java +++ b/src/main/java/com/zhgd/xmgl/modules/project/service/impl/ProjectUfaceConfigServiceImpl.java @@ -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 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 getSendAndDeleteDevSns(WorkerInfo workerInfo) { //海康门禁isc String devSns = ""; String notDevSns = ""; + List allDevs = ufaceDevMapper.selectList(new LambdaQueryWrapper().eq(UfaceDev::getProjectSn, workerInfo.getProjectSn())); if (NumberUtils.lt(workerInfo.getSafeScore(), PropertiesUtil.getWorkerInfoRedScore())) { //红码不能通行 - List allList = ufaceDevMapper.selectList(new LambdaQueryWrapper().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 notExistList = ufaceDevMapper.selectList(new LambdaQueryWrapper().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 notExistList = ufaceDevMapper.selectList(new LambdaQueryWrapper().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 list = ufaceDevService.getAllDevsByProjectSn(ufaceConfig.getProjectSn()); this.buildAndSendOneWorkerForHk(list, workerInfo, 1, ufaceConfig.getProjectSn(), true); + } else if (Objects.equals(ufaceConfig.getSupplierType(), SLINGSHOT.getCode())) { + //保存弹弓下发状态 + dangongWorkerFaceStatusService.saveStatus(workerInfo); } } diff --git a/src/main/java/com/zhgd/xmgl/modules/worker/controller/DangongWorkerFaceStatusController.java b/src/main/java/com/zhgd/xmgl/modules/worker/controller/DangongWorkerFaceStatusController.java new file mode 100644 index 000000000..795b39945 --- /dev/null +++ b/src/main/java/com/zhgd/xmgl/modules/worker/controller/DangongWorkerFaceStatusController.java @@ -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> queryPageList(@ApiIgnore @RequestParam HashMap param) { + return Result.success(dangongWorkerFaceStatusService.queryPageList(param)); + } + + /** + * 列表查询 + * + * @return + */ + @OperLog(operModul = "弹弓人脸照片质量反馈管理", operType = "列表查询", operDesc = "列表查询弹弓人脸照片质量反馈信息") + @ApiOperation(value = "列表查询弹弓人脸照片质量反馈信息", notes = "列表查询弹弓人脸照片质量反馈信息", httpMethod = "GET") + @GetMapping(value = "/list") + public Result> queryList(@ApiIgnore @RequestParam HashMap param) { + return Result.success(dangongWorkerFaceStatusService.queryList(param)); + } + + /** + * 添加 + * + * @param dangongWorkerFaceStatus + * @return + */ + @OperLog(operModul = "弹弓人脸照片质量反馈管理", operType = "添加", operDesc = "添加弹弓人脸照片质量反馈信息") + @ApiOperation(value = "添加弹弓人脸照片质量反馈信息", notes = "添加弹弓人脸照片质量反馈信息", httpMethod = "POST") + @PostMapping(value = "/add") + public Result 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 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 delete(@ApiIgnore @RequestBody HashMap 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 queryById(@RequestParam(name = "id", required = true) String id) { + return Result.success(dangongWorkerFaceStatusService.queryById(id)); + } + +} diff --git a/src/main/java/com/zhgd/xmgl/modules/worker/controller/UfaceDevApiController.java b/src/main/java/com/zhgd/xmgl/modules/worker/controller/UfaceDevApiController.java index 98a6b25cf..be741d895 100644 --- a/src/main/java/com/zhgd/xmgl/modules/worker/controller/UfaceDevApiController.java +++ b/src/main/java/com/zhgd/xmgl/modules/worker/controller/UfaceDevApiController.java @@ -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 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() + .eq(UfaceDev::getDevSn, deviceId)); + if (count == 0) { + throw new OpenAlertException("设备" + deviceId + "在平台中不存在"); + } + List> workerIdObjs = new ArrayList<>(); + List 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() + .set(DangongWorkerFaceStatus::getMsg, data1.getString("msg")) + .set(DangongWorkerFaceStatus::getDangongStatus, data1.getString("code")) + .eq(DangongWorkerFaceStatus::getDevSn, deviceId) + .eq(DangongWorkerFaceStatus::getWorkerId, workerId) + ); + HashMap 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 paramMap) { diff --git a/src/main/java/com/zhgd/xmgl/modules/worker/entity/DangongWorkerFaceStatus.java b/src/main/java/com/zhgd/xmgl/modules/worker/entity/DangongWorkerFaceStatus.java new file mode 100644 index 000000000..0431e13f6 --- /dev/null +++ b/src/main/java/com/zhgd/xmgl/modules/worker/entity/DangongWorkerFaceStatus.java @@ -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; +} diff --git a/src/main/java/com/zhgd/xmgl/modules/worker/entity/WorkerInfo.java b/src/main/java/com/zhgd/xmgl/modules/worker/entity/WorkerInfo.java index 50308ec2d..482deacd4 100644 --- a/src/main/java/com/zhgd/xmgl/modules/worker/entity/WorkerInfo.java +++ b/src/main/java/com/zhgd/xmgl/modules/worker/entity/WorkerInfo.java @@ -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; diff --git a/src/main/java/com/zhgd/xmgl/modules/worker/mapper/DangongWorkerFaceStatusMapper.java b/src/main/java/com/zhgd/xmgl/modules/worker/mapper/DangongWorkerFaceStatusMapper.java new file mode 100644 index 000000000..c4bef4626 --- /dev/null +++ b/src/main/java/com/zhgd/xmgl/modules/worker/mapper/DangongWorkerFaceStatusMapper.java @@ -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 { + + /** + * 分页列表查询弹弓人脸照片质量反馈信息 + * + * @param page + * @param queryWrapper + * @param param + * @return + */ + IPage queryList(Page page, @Param(Constants.WRAPPER) QueryWrapper queryWrapper, @Param("param") HashMap param); + + /** + * 列表查询弹弓人脸照片质量反馈信息 + * + * @param queryWrapper + * @param param + * @return + */ + List queryList(@Param(Constants.WRAPPER) QueryWrapper queryWrapper, @Param("param") HashMap param); + + + /** + * 通过id查询弹弓人脸照片质量反馈信息 + * + * @param id + * @return + */ + DangongWorkerFaceStatus queryById(String id); +} diff --git a/src/main/java/com/zhgd/xmgl/modules/worker/mapper/xml/DangongWorkerFaceStatusMapper.xml b/src/main/java/com/zhgd/xmgl/modules/worker/mapper/xml/DangongWorkerFaceStatusMapper.xml new file mode 100644 index 000000000..7139591ea --- /dev/null +++ b/src/main/java/com/zhgd/xmgl/modules/worker/mapper/xml/DangongWorkerFaceStatusMapper.xml @@ -0,0 +1,22 @@ + + + + + + diff --git a/src/main/java/com/zhgd/xmgl/modules/worker/mapper/xml/WorkerInfoMapper.xml b/src/main/java/com/zhgd/xmgl/modules/worker/mapper/xml/WorkerInfoMapper.xml index e978901ec..689d95835 100644 --- a/src/main/java/com/zhgd/xmgl/modules/worker/mapper/xml/WorkerInfoMapper.xml +++ b/src/main/java/com/zhgd/xmgl/modules/worker/mapper/xml/WorkerInfoMapper.xml @@ -48,6 +48,9 @@ and create_time>=current_date group by person_sn ) wa on wa.person_sn = a.person_sn WHERE 1 = 1 + + and a.dangong_status = #{param.dangongStatus} + and a.safe_score < #{param.workerInfoRedScore} diff --git a/src/main/java/com/zhgd/xmgl/modules/worker/service/IDangongWorkerFaceStatusService.java b/src/main/java/com/zhgd/xmgl/modules/worker/service/IDangongWorkerFaceStatusService.java new file mode 100644 index 000000000..257e4a98b --- /dev/null +++ b/src/main/java/com/zhgd/xmgl/modules/worker/service/IDangongWorkerFaceStatusService.java @@ -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 { + /** + * 分页列表查询弹弓人脸照片质量反馈信息 + * + * @param param 参数map + * @return + */ + IPage queryPageList(HashMap param); + + /** + * 列表查询弹弓人脸照片质量反馈信息 + * + * @param param 参数map + * @return + */ + List queryList(HashMap 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 workerIds); +} diff --git a/src/main/java/com/zhgd/xmgl/modules/worker/service/impl/DangongWorkerFaceStatusServiceImpl.java b/src/main/java/com/zhgd/xmgl/modules/worker/service/impl/DangongWorkerFaceStatusServiceImpl.java new file mode 100644 index 000000000..4e3225766 --- /dev/null +++ b/src/main/java/com/zhgd/xmgl/modules/worker/service/impl/DangongWorkerFaceStatusServiceImpl.java @@ -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 implements IDangongWorkerFaceStatusService { + @Autowired + private DangongWorkerFaceStatusMapper dangongWorkerFaceStatusMapper; + @Lazy + @Autowired + private IProjectUfaceConfigService projectUfaceConfigService; + @Lazy + @Autowired + private IWorkerInfoService workerInfoService; + + @Override + public IPage queryPageList(HashMap param) { + QueryWrapper queryWrapper = this.getQueryWrapper(param); + Page page = PageUtil.getPage(param); + IPage pageList = baseMapper.queryList(page, queryWrapper, param); + pageList.setRecords(this.dealList(pageList.getRecords())); + return pageList; + } + + @Override + public List queryList(HashMap param) { + QueryWrapper queryWrapper = getQueryWrapper(param); + return dealList(baseMapper.queryList(queryWrapper, param)); + } + + private QueryWrapper getQueryWrapper(HashMap param) { + QueryWrapper queryWrapper = QueryGenerator.initPageQueryWrapper(DangongWorkerFaceStatus.class, param, true); + queryWrapper.orderByDesc(RefUtil.fieldNameUlc(DangongWorkerFaceStatus::getId)); + return queryWrapper; + } + + private List dealList(List 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 pair = projectUfaceConfigService.getSendAndDeleteDevSns(workerInfo); + String devs = pair.getLeft(); + if (StrUtil.isNotEmpty(devs)) { + this.remove(new LambdaQueryWrapper() + .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() + .eq(DangongWorkerFaceStatus::getWorkerId, workerInfo.getId())); + } + + @Override + public void updateStatus(List workerIds) { + Map> workerMap = this.list(new LambdaQueryWrapper() + .in(DangongWorkerFaceStatus::getWorkerId, workerIds) + ).stream().collect(Collectors.groupingBy(DangongWorkerFaceStatus::getWorkerId)); + for (Map.Entry> entry : workerMap.entrySet()) { + List 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() + .set(WorkerInfo::getSendSuccessStatus, sendSuccessStatus) + .eq(WorkerInfo::getId, entry.getKey())); + } + } + } + +} diff --git a/src/main/java/com/zhgd/xmgl/security/WebSecurityConfig.java b/src/main/java/com/zhgd/xmgl/security/WebSecurityConfig.java index bf450b6fc..62b8f3dec 100644 --- a/src/main/java/com/zhgd/xmgl/security/WebSecurityConfig.java +++ b/src/main/java/com/zhgd/xmgl/security/WebSecurityConfig.java @@ -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() diff --git a/src/main/java/com/zhgd/xmgl/task/WorkerTask.java b/src/main/java/com/zhgd/xmgl/task/WorkerTask.java index 57fb5427d..6be065584 100644 --- a/src/main/java/com/zhgd/xmgl/task/WorkerTask.java +++ b/src/main/java/com/zhgd/xmgl/task/WorkerTask.java @@ -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 configs = projectUfaceConfigService.list(new LambdaQueryWrapper() + .eq(ProjectUfaceConfig::getSupplierType, 8)); + if (CollUtil.isNotEmpty(configs)) { + List sns = configs.stream().map(ProjectUfaceConfig::getProjectSn).collect(Collectors.toList()); +// List ufaceDevs = ufaceDevService.list(new LambdaQueryWrapper() +// .in(UfaceDev::getProjectSn, sns)); +// List devSns = ufaceDevs.stream().map(UfaceDev::getDevSn).collect(Collectors.toList()); + List workerInfos = workerInfoService.list(new LambdaQueryWrapper().in(WorkerInfo::getProjectSn, sns) + .or(eq -> eq.isNull(WorkerInfo::getSendSuccessStatus).or().ne(WorkerInfo::getSendSuccessStatus, 1))); + List workerIds = workerInfos.stream().map(WorkerInfo::getId).collect(Collectors.toList()); + if (CollUtil.isEmpty(workerIds)) { + return; + } + dangongWorkerFaceStatusService.updateStatus(workerIds); + } + } + }