Browse Source

Merge remote-tracking branch 'origin/master'

wujiefeng 1 year ago
parent
commit
59e3c320fb

+ 3 - 1
FullCardClient/src/main/java/com/zhongshu/card/client/model/projectAbout/orgFace/OrgUserFaceParam.java

@@ -30,6 +30,8 @@ public class OrgUserFaceParam extends ProjectOidParam {
     private String img;
 
     @Schema(description = "是否可使用")
-    private Boolean isCanUsed = Boolean.TRUE;
+    private Boolean isCanUsed = Boolean.FALSE;
+
+    private Boolean isManager = Boolean.FALSE;
 
 }

+ 24 - 0
FullCardClient/src/main/java/com/zhongshu/card/client/model/projectAbout/orgFace/OrgUserFaceSearch.java

@@ -1,10 +1,14 @@
 package com.zhongshu.card.client.model.projectAbout.orgFace;
 
 import com.zhongshu.card.client.model.base.SuperSearch;
+import com.zhongshu.card.client.type.Sex;
 import com.zhongshu.card.client.type.common.AuditState;
 import io.swagger.v3.oas.annotations.media.Schema;
 import lombok.Data;
 
+import java.util.ArrayList;
+import java.util.List;
+
 /**
  * @author TRX
  * @date 2025/2/18
@@ -28,6 +32,24 @@ public class OrgUserFaceSearch extends SuperSearch {
     @Schema(description = "是否可使用")
     private Boolean isCanUsed;
 
+    @Schema(description = "用户所属机构")
+    private String userOrgOid;
+
+    @Schema(description = "所属部门")
+    private String departmentId;
+
+    @Schema(description = "角色")
+    private List<String> roleIds = new ArrayList<>();
+
+    @Schema(description = "职位")
+    private String positionId;
+
+    @Schema(description = "人员编码")
+    private String code;
+
+    @Schema(description = "性别")
+    private Sex sex;
+
     //------------------------审核信息 start ---------------
 
     @Schema(description = "审核用户userId")
@@ -36,4 +58,6 @@ public class OrgUserFaceSearch extends SuperSearch {
     @Schema(description = "审核备注")
     private String auditRemark;
 
+    @Schema(description = "关键搜索")
+    private String keyWord;
 }

+ 2 - 0
FullCardClient/src/main/java/com/zhongshu/card/client/model/projectAbout/projectCommon/ProjectCommonConfigModel.java

@@ -86,5 +86,7 @@ public class ProjectCommonConfigModel extends ProjectCommonSuperParam {
     @Schema(description = "照片大小限制")
     private BigDecimal maxSize = BigDecimal.valueOf(2);
 
+    @Schema(description = "对比出来的")
+    private BigDecimal confidence = BigDecimal.ZERO;
 
 }

+ 1 - 1
FullCardClient/src/main/java/com/zhongshu/card/client/type/common/AuditState.java

@@ -7,7 +7,7 @@ import lombok.Getter;
  */
 public enum AuditState {
     WaitAudit("待审核"),
-    Audited("已审核"),
+    Audited("已通过"),
     Refuse("已拒绝"),
     Cancel("已失效"),
     ;

+ 12 - 2
FullCardServer/src/main/java/com/zhongshu/card/server/core/controller/projectAbout/OrgUserFaceController.java

@@ -43,9 +43,18 @@ public class OrgUserFaceController {
     private OrgUserFaceService orgUserFaceService;
 
     @ResourceAuth(value = "user", type = AuthType.User)
-    @Operation(summary = "保存人脸信息", description = "保存人脸信息")
+    @Operation(summary = "保存人脸信息(当前用户)", description = "保存人脸信息")
     @RequestMapping(value = "saveFace", method = {RequestMethod.POST})
     public ResultContent saveFace(@RequestBody @Valid OrgUserFaceParam param) {
+        param.setIsManager(Boolean.FALSE);
+        return orgUserFaceService.saveFace(param);
+    }
+
+    @ResourceAuth(value = "user", type = AuthType.User)
+    @Operation(summary = "保存人脸信息(管理员)", description = "保存人脸信息")
+    @RequestMapping(value = "managerSaveFace", method = {RequestMethod.POST})
+    public ResultContent managerSaveFace(@RequestBody @Valid OrgUserFaceParam param) {
+        param.setIsManager(Boolean.TRUE);
         return orgUserFaceService.saveFace(param);
     }
 
@@ -66,7 +75,8 @@ public class OrgUserFaceController {
     @ResourceAuth(value = "user", type = AuthType.User)
     @Operation(summary = "所有数据列表-分页查询", description = "数据列表-分页查询")
     @RequestMapping(value = {"page"}, method = {RequestMethod.POST})
-    public ResultContent<Page<OrgUserFaceModel>> page(@Parameter(hidden = true) @PageableDefault(page = 0, size = 10) Pageable pageable, @Parameter(required = false) OrgUserFaceSearch param) {
+    public ResultContent<Page<OrgUserFaceModel>> page(@Parameter(hidden = true) @PageableDefault(page = 0, size = 10) Pageable pageable,
+            @Parameter(required = false) OrgUserFaceSearch param) {
         Assert.hasText(param.getProjectOid(), "projectOid不能为空");
         return orgUserFaceService.page(param, pageable);
     }

+ 39 - 5
FullCardServer/src/main/java/com/zhongshu/card/server/core/dao/projectAbout/impl/OrgUserFaceDaoImpl.java

@@ -4,7 +4,10 @@ import com.github.microservice.components.data.mongo.mongo.helper.DBHelper;
 import com.zhongshu.card.client.model.projectAbout.orgFace.OrgUserFaceSearch;
 import com.zhongshu.card.server.core.dao.BaseImpl;
 import com.zhongshu.card.server.core.dao.projectAbout.extend.OrgUserFaceDaoExtend;
+import com.zhongshu.card.server.core.domain.org.Department;
 import com.zhongshu.card.server.core.domain.projectAbout.OrgUserFace;
+import com.zhongshu.card.server.core.domain.school.DictInfo;
+import org.apache.commons.lang3.ObjectUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.data.domain.Page;
@@ -49,22 +52,46 @@ public class OrgUserFaceDaoImpl extends BaseImpl implements OrgUserFaceDaoExtend
             criteria.and("projectOid").is(param.getProjectOid());
         }
 
+        // 审核状态
         if (param.getAuditState() != null) {
             criteria.and("auditState").is(param.getAuditState());
         }
 
-        if (StringUtils.isNotEmpty(param.getUserId())) {
-            criteria.and("userId").is(param.getUserId());
-        }
-
+        // 是否可用
         if (param.getIsCanUsed() != null) {
             criteria.and("isCanUsed").is(param.getIsCanUsed());
         }
 
+        // 审核用户
         if (StringUtils.isNotEmpty(param.getAuditUserId())) {
             criteria.and("auditUserId").is(param.getAuditUserId());
         }
 
+        // 所属用户
+        if (StringUtils.isNotEmpty(param.getUserId())) {
+            criteria.and("userId").is(param.getUserId());
+        }
+
+        if (StringUtils.isNotEmpty(param.getUserOrgOid())) {
+            criteria.and("userOrgOid").is(param.getUserOrgOid());
+        }
+
+        if (StringUtils.isNotEmpty(param.getDepartmentId())) {
+            criteria.and("department").is(Department.build(param.getDepartmentId()));
+        }
+
+        if (ObjectUtils.isNotEmpty(param.getRoleIds())) {
+            criteria.and("roleIds").in(param.getRoleIds());
+        }
+
+        if (StringUtils.isNotEmpty(param.getPositionId())) {
+            criteria.and("position").is(DictInfo.build(param.getPositionId()));
+        }
+
+        if (param.getSex() != null) {
+            criteria.and("sex").is(param.getSex());
+        }
+
         // 模糊搜索
         List<Criteria> criterias = new ArrayList<>();
         if (StringUtils.isNotEmpty(param.getUserName())) {
@@ -75,14 +102,21 @@ public class OrgUserFaceDaoImpl extends BaseImpl implements OrgUserFaceDaoExtend
             Pattern pattern = Pattern.compile("^.*" + param.getPhone() + ".*$");
             criterias.add(Criteria.where("phone").is(pattern));
         }
-
         if (StringUtils.isNotEmpty(param.getAuditRemark())) {
             Pattern pattern = Pattern.compile("^.*" + param.getAuditRemark() + ".*$");
             criterias.add(Criteria.where("auditRemark").is(pattern));
         }
+        if (StringUtils.isNotEmpty(param.getCode())) {
+            Pattern pattern = Pattern.compile("^.*" + param.getCode() + ".*$");
+            criterias.add(Criteria.where("code").is(pattern));
+        }
         if (!CollectionUtils.isEmpty(criterias)) {
             criteria.andOperator(criterias.toArray(new Criteria[]{}));
         }
+        if (StringUtils.isNotEmpty(param.getKeyWord())) {
+            Pattern pattern = Pattern.compile("^.*" + param.getKeyWord() + ".*$");
+            criteria.orOperator(Criteria.where("userName").regex(pattern), Criteria.where("phone").regex(pattern), Criteria.where("code").regex(pattern));
+        }
         return criteria;
     }
 

+ 1 - 0
FullCardServer/src/main/java/com/zhongshu/card/server/core/domain/org/OrganizationUser.java

@@ -93,6 +93,7 @@ public class OrganizationUser extends SuperMain {
     private String cardNumber;
 
     @Schema(description = "职位")
+    @DBRef(lazy = true)
     private DictInfo position;
 
     @Schema(description = "人脸照片")

+ 32 - 0
FullCardServer/src/main/java/com/zhongshu/card/server/core/domain/projectAbout/OrgUserFace.java

@@ -1,9 +1,12 @@
 package com.zhongshu.card.server.core.domain.projectAbout;
 
+import com.zhongshu.card.client.type.Sex;
 import com.zhongshu.card.client.type.common.AuditState;
 import com.zhongshu.card.server.core.domain.base.SuperMain;
+import com.zhongshu.card.server.core.domain.org.Department;
 import com.zhongshu.card.server.core.domain.org.OrganizationUser;
 import com.zhongshu.card.server.core.domain.org.UserAccount;
+import com.zhongshu.card.server.core.domain.school.DictInfo;
 import io.swagger.v3.oas.annotations.media.Schema;
 import lombok.AllArgsConstructor;
 import lombok.Builder;
@@ -12,6 +15,10 @@ import lombok.NoArgsConstructor;
 import org.springframework.data.mongodb.core.mapping.DBRef;
 import org.springframework.data.mongodb.core.mapping.Document;
 
+import java.math.BigDecimal;
+import java.util.ArrayList;
+import java.util.List;
+
 /**
  * 项目人脸信息
  *
@@ -55,6 +62,30 @@ public class OrgUserFace extends SuperMain {
     @Schema(description = "是否可使用")
     private Boolean isCanUsed = Boolean.FALSE;
 
+    private BigDecimal confidence = BigDecimal.ZERO;
+
+    //------------------------人脸冗余信息 start-------------
+
+    @Schema(description = "用户所属机构")
+    private String userOrgOid;
+
+    @Schema(description = "所属部门")
+    @DBRef(lazy = true)
+    private Department department;
+
+    @Schema(description = "角色")
+    private List<String> roleIds = new ArrayList<>();
+
+    @Schema(description = "职位")
+    @DBRef(lazy = true)
+    private DictInfo position;
+
+    @Schema(description = "人员编码")
+    private String code;
+
+    @Schema(description = "性别")
+    private Sex sex;
+
     //------------------------审核信息 start ---------------
 
     @Schema(description = "审核用户userId")
@@ -69,4 +100,5 @@ public class OrgUserFace extends SuperMain {
     @Schema(description = "权限中心的人脸id")
     private String updateFaceFileId;
 
+
 }

+ 6 - 0
FullCardServer/src/main/java/com/zhongshu/card/server/core/domain/school/DictInfo.java

@@ -28,4 +28,10 @@ public class DictInfo extends SuperMain {
     @Schema(description = "字典类型")
     private DictInfoType dictInfoType;
 
+    public static DictInfo build(String id) {
+        DictInfo entity = new DictInfo();
+        entity.setId(id);
+        return entity;
+    }
+
 }

+ 66 - 11
FullCardServer/src/main/java/com/zhongshu/card/server/core/service/projectAbout/OrgUserFaceService.java

@@ -92,10 +92,16 @@ public class OrgUserFaceService extends SuperService {
         if (StringUtils.isEmpty(projectOid)) {
             return ResultContent.buildFail("oid不能为空");
         }
-        String userId = param.getUserId();
-        if (StringUtils.isEmpty(userId)) {
+        String userId = "";
+        if (param.getIsManager() != null && param.getIsManager()) {
+            userId = param.getUserId();
+        } else {
             userId = getCurrentUserId();
         }
+        if (StringUtils.isEmpty(userId)) {
+            return ResultContent.buildFail("用户信息为空");
+        }
+
         String img = param.getImg();
         // 判断人脸可信度
         ResultContent<ProjectCommonConfigModel> configContent = conformFace(img, projectOid);
@@ -108,15 +114,21 @@ public class OrgUserFaceService extends SuperService {
         if (isAllowUpdateFace == null || !isAllowUpdateFace) {
             return ResultContent.buildFail("系统不允许管理人脸信息");
         }
-
         // 人脸是否需要审核
         Boolean isExamineFace = configModel.getIsExamineFace();
 
+        // 是否需要审核
+        boolean isMustAudit = false;
+        if ((param.getIsManager() == null || !param.getIsManager()) && isExamineFace != null && isExamineFace) {
+            isMustAudit = true;
+        }
+
         int maxFaceNumber = configModel.getMaxFaceNumber();
         int number = orgUserFaceDao.countByUserIdAndProjectOid(userId, projectOid);
         if (number >= maxFaceNumber) {
-            return ResultContent.buildFail("");
+            return ResultContent.buildFail(String.format("用户人脸数量已达上限:%d张", number));
         }
+
         // 所属用户userId
         UserAccount userAccount = userCountDao.findTopByUserId(userId);
         OrganizationUser organizationUser = organizationUserServiceImpl.getUserTopInProjectBindOrgUserInfo(projectOid, userAccount);
@@ -138,16 +150,13 @@ public class OrgUserFaceService extends SuperService {
             initEntityNoCheckOid(orgUserFace);
         }
         BeanUtils.copyProperties(param, orgUserFace, "id");
+
         orgUserFace.setProjectOid(projectOid);
-        orgUserFace.setOrganizationUser(organizationUser);
         orgUserFace.setUpdateFaceFileId(updateFaceFileId);
         orgUserFace.setUserId(userId);
-        if (ObjectUtils.isNotEmpty(userAccount)) {
-            orgUserFace.setUserAccount(userAccount);
-            orgUserFace.setUserName(userAccount.getName());
-            orgUserFace.setPhone(userAccount.getPhone());
-        }
-        if (isExamineFace != null && isExamineFace) {
+        fillEntityUserInfo(orgUserFace, organizationUser);
+
+        if (isMustAudit) {
             // 需要审核
             orgUserFace.setIsCanUsed(Boolean.FALSE);
             orgUserFace.setAuditState(AuditState.WaitAudit);
@@ -165,6 +174,7 @@ public class OrgUserFaceService extends SuperService {
             orgUserFace.setAuditRemark("自动通过");
             orgUserFace.setAuditTime(System.currentTimeMillis());
         }
+        orgUserFace.setConfidence(configModel.getConfidence());
         orgUserFaceDao.save(orgUserFace);
         return ResultContent.buildSuccess();
     }
@@ -213,8 +223,22 @@ public class OrgUserFaceService extends SuperService {
             return ResultContent.buildFail("数据已审核");
         }
         BeanUtils.copyProperties(param, orgUserFace, "id");
+        if (orgUserFace.getAuditState() == AuditState.Audited) {
+            // 通过
+            ResultContent<String> content = syncFace(orgUserFace);
+            if (content.isFailed()) {
+                return ResultContent.buildFail(content.getMsg());
+            }
+            String updateFaceFileId = content.getContent();
+            orgUserFace.setUpdateFaceFileId(updateFaceFileId);
+            orgUserFace.setIsCanUsed(Boolean.TRUE);
+        } else {
+            orgUserFace.setIsCanUsed(Boolean.FALSE);
+        }
+        orgUserFace.setAuditUserId(getCurrentUserId());
         orgUserFace.setAuditTime(System.currentTimeMillis());
         orgUserFaceDao.save(orgUserFace);
+
         return ResultContent.buildSuccess();
     }
 
@@ -331,12 +355,43 @@ public class OrgUserFaceService extends SuperService {
         }
         Double confidence = content.getContent() * 100;
         if (BigDecimal.valueOf(confidence).compareTo(BigDecimal.valueOf(configModel.getSimilarity())) >= 0) {
+            configModel.setConfidence(BigDecimal.valueOf(confidence));
             return ResultContent.buildSuccess(configModel);
         } else {
             return ResultContent.buildFail(String.format("未检测到人脸: %d", confidence.intValue()));
         }
     }
 
+    /**
+     * 填充用户信息
+     *
+     * @param entity
+     * @param organizationUser
+     */
+    public void fillEntityUserInfo(OrgUserFace entity, OrganizationUser organizationUser) {
+        if (ObjectUtils.isNotEmpty(entity)) {
+            entity.setOrganizationUser(organizationUser);
+            if (ObjectUtils.isNotEmpty(organizationUser)) {
+                if (organizationUser.getOrganization() != null) {
+                    entity.setUserOrgOid(organizationUser.getOrganization().getOid());
+                }
+                entity.setDepartment(organizationUser.getDepartment());
+                entity.setRoleIds(organizationUser.getRoleIds());
+                entity.setPosition(organizationUser.getPosition());
+                entity.setCode(organizationUser.getCode());
+            }
+            UserAccount userAccount = organizationUser.getUser();
+            if (ObjectUtils.isNotEmpty(userAccount)) {
+                if (ObjectUtils.isNotEmpty(userAccount)) {
+                    entity.setUserAccount(userAccount);
+                    entity.setUserName(userAccount.getName());
+                    entity.setPhone(userAccount.getPhone());
+                    entity.setSex(userAccount.getSex());
+                }
+            }
+        }
+    }
+
     public OrgUserFaceModel toModel(OrgUserFace entity) {
         OrgUserFaceModel model = null;
         if (ObjectUtils.isNotEmpty(entity)) {