TRX 1 rok pred
rodič
commit
9b77be33b4
16 zmenil súbory, kde vykonal 534 pridanie a 102 odobranie
  1. 0 33
      FullCardClient/src/main/java/com/zhongshu/card/client/model/projectAbout/OrgUserFaceModel.java
  2. 23 0
      FullCardClient/src/main/java/com/zhongshu/card/client/model/projectAbout/orgFace/OrgUserFaceAuditParam.java
  3. 71 0
      FullCardClient/src/main/java/com/zhongshu/card/client/model/projectAbout/orgFace/OrgUserFaceModel.java
  4. 6 3
      FullCardClient/src/main/java/com/zhongshu/card/client/model/projectAbout/orgFace/OrgUserFaceParam.java
  5. 39 0
      FullCardClient/src/main/java/com/zhongshu/card/client/model/projectAbout/orgFace/OrgUserFaceSearch.java
  6. 21 0
      FullCardClient/src/main/java/com/zhongshu/card/client/type/common/AuditState.java
  7. 45 5
      FullCardServer/src/main/java/com/zhongshu/card/server/core/controller/projectAbout/OrgUserFaceController.java
  8. 1 1
      FullCardServer/src/main/java/com/zhongshu/card/server/core/dao/org/OrganizationUserDao.java
  9. 6 2
      FullCardServer/src/main/java/com/zhongshu/card/server/core/dao/projectAbout/OrgUserFaceDao.java
  10. 17 0
      FullCardServer/src/main/java/com/zhongshu/card/server/core/dao/projectAbout/extend/OrgUserFaceDaoExtend.java
  11. 89 0
      FullCardServer/src/main/java/com/zhongshu/card/server/core/dao/projectAbout/impl/OrgUserFaceDaoImpl.java
  12. 28 1
      FullCardServer/src/main/java/com/zhongshu/card/server/core/domain/projectAbout/OrgUserFace.java
  13. 8 1
      FullCardServer/src/main/java/com/zhongshu/card/server/core/service/org/OrganizationUserServiceImpl.java
  14. 160 46
      FullCardServer/src/main/java/com/zhongshu/card/server/core/service/projectAbout/OrgUserFaceService.java
  15. 11 0
      FullCardServer/src/main/java/com/zhongshu/card/server/core/service/projectAbout/ProjectCommonConfigService.java
  16. 9 10
      FullCardServer/src/main/java/com/zhongshu/card/server/core/service/visitor/VisitorMainService.java

+ 0 - 33
FullCardClient/src/main/java/com/zhongshu/card/client/model/projectAbout/OrgUserFaceModel.java

@@ -1,33 +0,0 @@
-package com.zhongshu.card.client.model.projectAbout;
-
-import com.zhongshu.card.client.model.base.SuperModel;
-import com.zhongshu.card.client.model.org.UserCountModel;
-import io.swagger.v3.oas.annotations.media.Schema;
-import lombok.AllArgsConstructor;
-import lombok.Data;
-import lombok.NoArgsConstructor;
-
-/**
- * @author TRX
- * @date 2024/10/12
- */
-@Data
-@AllArgsConstructor
-@NoArgsConstructor
-public class OrgUserFaceModel extends SuperModel {
-
-    @Schema(description = "用户ID")
-    private String userId;
-
-    @Schema(description = "用户信息")
-    private UserCountModel userAccount;
-
-    @Schema(description = "图片名称")
-    private String name;
-
-    @Schema(description = "人员图片地址")
-    private String img;
-
-    @Schema(description = "是否可使用")
-    private Boolean isCanUsed = Boolean.TRUE;
-}

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

@@ -0,0 +1,23 @@
+package com.zhongshu.card.client.model.projectAbout.orgFace;
+
+import com.zhongshu.card.client.type.common.AuditState;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+/**
+ * @author TRX
+ * @date 2025/2/18
+ */
+@Data
+public class OrgUserFaceAuditParam {
+
+    @Schema(description = "数据id")
+    private String id;
+
+    @Schema(description = "审核备注")
+    private String auditRemark;
+
+    @Schema(description = "审核状态")
+    private AuditState auditState;
+
+}

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

@@ -0,0 +1,71 @@
+package com.zhongshu.card.client.model.projectAbout.orgFace;
+
+import com.zhongshu.card.client.model.base.SuperModel;
+import com.zhongshu.card.client.model.org.OrganizationUserSimpleModel;
+import com.zhongshu.card.client.model.org.UserCountSimpleModel;
+import com.zhongshu.card.client.type.common.AuditState;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+/**
+ * @author TRX
+ * @date 2024/10/12
+ */
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class OrgUserFaceModel extends SuperModel {
+
+    @Schema(description = "审核状态")
+    private AuditState auditState;
+
+    private String auditStateStr;
+
+    public String getAuditStateStr() {
+        if (auditState != null) {
+            return auditState.getRemark();
+        }
+        return "";
+    }
+
+    //-----------------用户信息 start -----------------
+    @Schema(description = "用户ID")
+    private String userId;
+
+    @Schema(description = "用户名称")
+    private String userName;
+
+    @Schema(description = "用户电话")
+    private String phone;
+
+    @Schema(description = "用户信息")
+    private UserCountSimpleModel userAccount;
+
+    @Schema(description = "项目机构用户信息")
+    private OrganizationUserSimpleModel organizationUser;
+
+    @Schema(description = "图片名称")
+    private String name;
+
+    @Schema(description = "人脸图片地址")
+    private String img;
+
+    @Schema(description = "是否可使用")
+    private Boolean isCanUsed;
+
+    //------------------------审核信息 start ---------------
+
+    @Schema(description = "审核用户userId")
+    private String auditUserId;
+
+    @Schema(description = "审核备注")
+    private String auditRemark;
+
+    @Schema(description = "审核时间")
+    private Long auditTime;
+
+    @Schema(description = "权限中心的人脸id")
+    private String updateFaceFileId;
+}

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

@@ -1,6 +1,6 @@
-package com.zhongshu.card.client.model.projectAbout;
+package com.zhongshu.card.client.model.projectAbout.orgFace;
 
-import com.zhongshu.card.client.model.base.SuperParam;
+import com.zhongshu.card.client.model.base.ProjectOidParam;
 import io.swagger.v3.oas.annotations.media.Schema;
 import jakarta.validation.constraints.NotEmpty;
 import lombok.AllArgsConstructor;
@@ -14,7 +14,10 @@ import lombok.NoArgsConstructor;
 @Data
 @AllArgsConstructor
 @NoArgsConstructor
-public class OrgUserFaceParam extends SuperParam {
+public class OrgUserFaceParam extends ProjectOidParam {
+
+    @Schema(description = "数据id")
+    private String id;
 
     @Schema(description = "用户ID")
     private String userId;

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

@@ -0,0 +1,39 @@
+package com.zhongshu.card.client.model.projectAbout.orgFace;
+
+import com.zhongshu.card.client.model.base.SuperSearch;
+import com.zhongshu.card.client.type.common.AuditState;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+/**
+ * @author TRX
+ * @date 2025/2/18
+ */
+@Data
+public class OrgUserFaceSearch extends SuperSearch {
+
+    @Schema(description = "审核状态")
+    private AuditState auditState;
+
+    //-----------------用户信息 start -----------------
+    @Schema(description = "用户ID")
+    private String userId;
+
+    @Schema(description = "用户名称")
+    private String userName;
+
+    @Schema(description = "用户电话")
+    private String phone;
+
+    @Schema(description = "是否可使用")
+    private Boolean isCanUsed;
+
+    //------------------------审核信息 start ---------------
+
+    @Schema(description = "审核用户userId")
+    private String auditUserId;
+
+    @Schema(description = "审核备注")
+    private String auditRemark;
+
+}

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

@@ -0,0 +1,21 @@
+package com.zhongshu.card.client.type.common;
+
+import lombok.Getter;
+
+/**
+ * 通用审核状态
+ */
+public enum AuditState {
+    WaitAudit("待审核"),
+    Audited("已审核"),
+    Refuse("已拒绝"),
+    Cancel("已失效"),
+    ;
+
+    @Getter
+    private String remark;
+
+    AuditState(String remark) {
+        this.remark = remark;
+    }
+}

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

@@ -3,20 +3,30 @@ package com.zhongshu.card.server.core.controller.projectAbout;
 import com.github.microservice.auth.security.annotations.ResourceAuth;
 import com.github.microservice.auth.security.type.AuthType;
 import com.github.microservice.net.ResultContent;
+import com.zhongshu.card.client.model.base.IDParam;
+import com.zhongshu.card.client.model.base.ProjectOidParam;
 import com.zhongshu.card.client.model.base.UrlParam;
 import com.zhongshu.card.client.model.base.UserIdAndOidModel;
-import com.zhongshu.card.client.model.projectAbout.OrgUserFaceModel;
-import com.zhongshu.card.client.model.projectAbout.OrgUserFaceParam;
+import com.zhongshu.card.client.model.projectAbout.orgFace.OrgUserFaceAuditParam;
+import com.zhongshu.card.client.model.projectAbout.orgFace.OrgUserFaceModel;
+import com.zhongshu.card.client.model.projectAbout.orgFace.OrgUserFaceParam;
+import com.zhongshu.card.client.model.projectAbout.orgFace.OrgUserFaceSearch;
 import com.zhongshu.card.server.core.service.projectAbout.OrgUserFaceService;
 import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.Parameter;
 import io.swagger.v3.oas.annotations.tags.Tag;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.domain.Page;
+import org.springframework.data.domain.Pageable;
+import org.springframework.data.web.PageableDefault;
+import org.springframework.util.Assert;
 import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RequestMethod;
 import org.springframework.web.bind.annotation.RestController;
 
 import javax.validation.Valid;
+import java.util.List;
 
 /**
  * 项目人员人脸管理
@@ -40,10 +50,39 @@ public class OrgUserFaceController {
     }
 
     @ResourceAuth(value = "user", type = AuthType.User)
-    @Operation(summary = "得到用户人脸信息", description = "得到用户人脸信息")
+    @Operation(summary = "删除人脸信息", description = "删除人脸信息")
+    @RequestMapping(value = {"deleteFace"}, method = {RequestMethod.POST})
+    public ResultContent deleteFace(@RequestBody IDParam param) {
+        return orgUserFaceService.deleteFace(param.getId());
+    }
+
+    @ResourceAuth(value = "user", type = AuthType.User)
+    @Operation(summary = "审核人脸申请", description = "审核人脸申请")
+    @RequestMapping(value = {"auditFace"}, method = {RequestMethod.POST})
+    public ResultContent auditFace(@RequestBody OrgUserFaceAuditParam param) {
+        return orgUserFaceService.auditFace(param);
+    }
+
+    @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) {
+        Assert.hasText(param.getProjectOid(), "projectOid不能为空");
+        return orgUserFaceService.page(param, pageable);
+    }
+
+    @ResourceAuth(value = "user", type = AuthType.User)
+    @Operation(summary = "得到当前用户人脸信息列表", description = "得到当前用户人脸信息列表")
+    @RequestMapping(value = "getCurrentUserAllFace", method = {RequestMethod.POST})
+    public ResultContent<List<OrgUserFaceModel>> getCurrentUserAllFace(@RequestBody @Valid ProjectOidParam param) {
+        return orgUserFaceService.getCurrentUserAllFace(param.getProjectOid());
+    }
+
+    @ResourceAuth(value = "user", type = AuthType.User)
+    @Operation(summary = "得到指定用户人脸信息列表", description = "得到指定用户人脸信息列表")
     @RequestMapping(value = "getUserFace", method = {RequestMethod.POST})
-    public ResultContent<OrgUserFaceModel> getUserFace(@RequestBody @Valid UserIdAndOidModel param) {
-        return orgUserFaceService.getUserFaceModel(param.getUserId(), param.getProjectOid());
+    public ResultContent<List<OrgUserFaceModel>> getUserFace(@RequestBody @Valid UserIdAndOidModel param) {
+        return orgUserFaceService.getUserAllFace(param.getUserId(), param.getProjectOid());
     }
 
     @Operation(summary = "判断检查人脸可信度", description = "判断检查人脸可信度")
@@ -51,4 +90,5 @@ public class OrgUserFaceController {
     public ResultContent conformFace(@RequestBody @Valid UrlParam param) {
         return orgUserFaceService.conformFace(param.getUrl(), param.getProjectOid());
     }
+
 }

+ 1 - 1
FullCardServer/src/main/java/com/zhongshu/card/server/core/dao/org/OrganizationUserDao.java

@@ -29,7 +29,7 @@ public interface OrganizationUserDao extends MongoDao<OrganizationUser>, Organiz
 
     OrganizationUser findTopByUserAndProjectOidAndIsOrg(UserAccount user, String projectOid, Boolean isOrg);
 
-    OrganizationUser findTopByUserAndProjectOid(UserAccount user, String projectOid);
+    OrganizationUser findTopByUserAndProjectOidOrderByCreateTimeDesc(UserAccount user, String projectOid);
 
     OrganizationUser findTopByOrganizationAndUserAndProjectOid(
             Organization organization, UserAccount user, String projectOid);

+ 6 - 2
FullCardServer/src/main/java/com/zhongshu/card/server/core/dao/projectAbout/OrgUserFaceDao.java

@@ -2,6 +2,7 @@ package com.zhongshu.card.server.core.dao.projectAbout;
 
 import com.github.microservice.components.data.mongo.mongo.dao.MongoDao;
 import com.github.microservice.types.payment.PaymentType;
+import com.zhongshu.card.server.core.dao.projectAbout.extend.OrgUserFaceDaoExtend;
 import com.zhongshu.card.server.core.domain.paySetting.OrgPayAccount;
 import com.zhongshu.card.server.core.domain.projectAbout.OrgUserFace;
 
@@ -10,14 +11,17 @@ import java.util.List;
 /**
  * 机构用户人脸信息 dao
  */
-public interface OrgUserFaceDao extends MongoDao<OrgUserFace> {
+public interface OrgUserFaceDao extends MongoDao<OrgUserFace>, OrgUserFaceDaoExtend {
 
     OrgUserFace findTopById(String id);
 
-    OrgUserFace findTopByUserIdAndProjectOid(String userId, String projectOid);
+    OrgUserFace findTopByUserIdAndProjectOidOrderByCreateTimeDesc(String userId, String projectOid);
+
+    int countByUserIdAndProjectOid(String userId, String projectOid);
 
     List<OrgUserFace> findByUserIdAndProjectOid(String userId, String projectOid);
 
     List<OrgUserFace> findByProjectOidAndUserIdIn(String projectOid, List<String> userIds);
 
+    List<OrgUserFace> findByUserIdAndProjectOidOrderByCreateTimeDesc(String userId, String projectOid);
 }

+ 17 - 0
FullCardServer/src/main/java/com/zhongshu/card/server/core/dao/projectAbout/extend/OrgUserFaceDaoExtend.java

@@ -0,0 +1,17 @@
+package com.zhongshu.card.server.core.dao.projectAbout.extend;
+
+import com.zhongshu.card.client.model.projectAbout.orgFace.OrgUserFaceSearch;
+import com.zhongshu.card.server.core.domain.projectAbout.OrgUserFace;
+import org.springframework.data.domain.Page;
+import org.springframework.data.domain.Pageable;
+
+/**
+ * @Author TRX
+ * @CreateDate: 2023/7/7
+ * @Version: 1.0
+ */
+public interface OrgUserFaceDaoExtend {
+
+    Page<OrgUserFace> page(Pageable pageable, OrgUserFaceSearch param);
+
+}

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

@@ -0,0 +1,89 @@
+package com.zhongshu.card.server.core.dao.projectAbout.impl;
+
+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.projectAbout.OrgUserFace;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.domain.Page;
+import org.springframework.data.domain.Pageable;
+import org.springframework.data.domain.Sort;
+import org.springframework.data.mongodb.core.MongoTemplate;
+import org.springframework.data.mongodb.core.query.Criteria;
+import org.springframework.data.mongodb.core.query.Query;
+import org.springframework.util.CollectionUtils;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.regex.Pattern;
+
+/**
+ * @Author TRX
+ * @CreateDate: 2023/4/12
+ * @Version: 1.0
+ */
+public class OrgUserFaceDaoImpl extends BaseImpl implements OrgUserFaceDaoExtend {
+
+    @Autowired
+    private DBHelper dbHelper;
+
+    @Autowired
+    private MongoTemplate mongoTemplate;
+
+    @Override
+    public Page<OrgUserFace> page(Pageable pageable, OrgUserFaceSearch param) {
+        Criteria criteria = buildFilterCriteria(param);
+
+        Sort sort = buildSort(param);
+        Query query = Query.query(criteria);
+        query.with(sort);
+        return dbHelper.pages(query, pageable, OrgUserFace.class);
+    }
+
+    private Criteria buildFilterCriteria(OrgUserFaceSearch param) {
+        Criteria criteria = buildCriteriaNotOid(param);
+
+        if (StringUtils.isNotEmpty(param.getProjectOid())) {
+            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());
+        }
+
+        // 模糊搜索
+        List<Criteria> criterias = new ArrayList<>();
+        if (StringUtils.isNotEmpty(param.getUserName())) {
+            Pattern pattern = Pattern.compile("^.*" + param.getUserName() + ".*$");
+            criterias.add(Criteria.where("userName").is(pattern));
+        }
+        if (StringUtils.isNotEmpty(param.getPhone())) {
+            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 (!CollectionUtils.isEmpty(criterias)) {
+            criteria.andOperator(criterias.toArray(new Criteria[]{}));
+        }
+        return criteria;
+    }
+
+}

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

@@ -1,6 +1,8 @@
 package com.zhongshu.card.server.core.domain.projectAbout;
 
+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.OrganizationUser;
 import com.zhongshu.card.server.core.domain.org.UserAccount;
 import io.swagger.v3.oas.annotations.media.Schema;
 import lombok.AllArgsConstructor;
@@ -23,13 +25,27 @@ import org.springframework.data.mongodb.core.mapping.Document;
 @NoArgsConstructor
 public class OrgUserFace extends SuperMain {
 
+    @Schema(description = "审核状态")
+    private AuditState auditState = AuditState.WaitAudit;
+
+    //-----------------用户信息 start -----------------
     @Schema(description = "用户ID")
     private String userId;
 
+    @Schema(description = "用户名称")
+    private String userName;
+
+    @Schema(description = "用户电话")
+    private String phone;
+
     @Schema(description = "用户信息")
     @DBRef(lazy = true)
     private UserAccount userAccount;
 
+    @Schema(description = "项目机构用户信息")
+    @DBRef(lazy = true)
+    private OrganizationUser organizationUser;
+
     @Schema(description = "图片名称")
     private String name;
 
@@ -37,7 +53,18 @@ public class OrgUserFace extends SuperMain {
     private String img;
 
     @Schema(description = "是否可使用")
-    private Boolean isCanUsed = Boolean.TRUE;
+    private Boolean isCanUsed = Boolean.FALSE;
+
+    //------------------------审核信息 start ---------------
+
+    @Schema(description = "审核用户userId")
+    private String auditUserId;
+
+    @Schema(description = "审核备注")
+    private String auditRemark;
+
+    @Schema(description = "审核时间")
+    private Long auditTime;
 
     @Schema(description = "权限中心的人脸id")
     private String updateFaceFileId;

+ 8 - 1
FullCardServer/src/main/java/com/zhongshu/card/server/core/service/org/OrganizationUserServiceImpl.java

@@ -302,7 +302,7 @@ public class OrganizationUserServiceImpl extends SuperService {
         if (ObjectUtils.isEmpty(userAccount)) {
             return ResultContent.buildFail("用户不存在");
         }
-        OrganizationUser orgUser = organizationUserDao.findTopByUserAndProjectOid(userAccount, projectOid);
+        OrganizationUser orgUser = organizationUserDao.findTopByUserAndProjectOidOrderByCreateTimeDesc(userAccount, projectOid);
         if (ObjectUtils.isNotEmpty(orgUser) && orgUser.getOrgUserState() != OrgUserState.Refusal) {
             return ResultContent.buildFail("用户已存在");
         }
@@ -1018,6 +1018,13 @@ public class OrganizationUserServiceImpl extends SuperService {
         return null;
     }
 
+    public OrganizationUser getUserTopInProjectBindOrgUserInfo(String projectOid, UserAccount userAccount) {
+        if (StringUtils.isNotEmpty(projectOid) && ObjectUtils.isNotEmpty(userAccount)) {
+            return organizationUserDao.findTopByUserAndProjectOidOrderByCreateTimeDesc(userAccount, projectOid);
+        }
+        return null;
+    }
+
     /**
      * 转换机构用户信息(基本信息 角色  部门)
      *

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

@@ -3,32 +3,40 @@ package com.zhongshu.card.server.core.service.projectAbout;
 import com.github.microservice.auth.client.model.UserFaceConfidenceModel;
 import com.github.microservice.auth.client.model.UserFaceUploadModel;
 import com.github.microservice.auth.client.service.UserFaceService;
+import com.github.microservice.components.data.base.util.PageEntityUtil;
 import com.github.microservice.net.ResultContent;
+import com.github.microservice.net.ResultMessage;
 import com.google.common.collect.Lists;
-import com.zhongshu.card.client.model.projectAbout.OrgUserFaceModel;
-import com.zhongshu.card.client.model.projectAbout.OrgUserFaceParam;
+import com.zhongshu.card.client.model.projectAbout.orgFace.OrgUserFaceAuditParam;
+import com.zhongshu.card.client.model.projectAbout.orgFace.OrgUserFaceModel;
+import com.zhongshu.card.client.model.projectAbout.orgFace.OrgUserFaceParam;
+import com.zhongshu.card.client.model.projectAbout.orgFace.OrgUserFaceSearch;
 import com.zhongshu.card.client.model.projectAbout.projectCommon.ProjectCommonConfigModel;
+import com.zhongshu.card.client.type.common.AuditState;
 import com.zhongshu.card.server.core.dao.org.UserCountDao;
 import com.zhongshu.card.server.core.dao.projectAbout.OrgUserFaceDao;
+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.projectAbout.OrgUserFace;
 import com.zhongshu.card.server.core.service.base.CommonService;
 import com.zhongshu.card.server.core.service.base.SuperService;
 import com.zhongshu.card.server.core.service.devices.permiss.DevicePermissEventService;
+import com.zhongshu.card.server.core.service.org.OrganizationUserServiceImpl;
+import com.zhongshu.card.server.core.service.user.UserAccountServiceImpl;
 import com.zhongshu.card.server.core.util.BeanUtils;
-import com.zhongshu.card.server.core.util.CommonUtil;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.lang3.ObjectUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.context.ApplicationContext;
+import org.springframework.data.domain.Page;
+import org.springframework.data.domain.Pageable;
 import org.springframework.stereotype.Service;
 
 import java.math.BigDecimal;
 import java.util.ArrayList;
-import java.util.HashMap;
 import java.util.List;
-import java.util.Map;
+import java.util.stream.Collectors;
 
 /**
  * 项目人脸管理
@@ -64,6 +72,12 @@ public class OrgUserFaceService extends SuperService {
     @Autowired
     private ProjectCommonConfigService projectCommonConfigService;
 
+    @Autowired
+    private OrganizationUserServiceImpl organizationUserServiceImpl;
+
+    @Autowired
+    private UserAccountServiceImpl userAccountService;
+
     /**
      * 保存用户人脸信息
      *
@@ -82,25 +96,132 @@ public class OrgUserFaceService extends SuperService {
         if (StringUtils.isEmpty(userId)) {
             userId = getCurrentUserId();
         }
+        String img = param.getImg();
+        // 判断人脸可信度
+        ResultContent<ProjectCommonConfigModel> configContent = conformFace(img, projectOid);
+        if (configContent.isFailed()) {
+            return ResultContent.buildFail(configContent.getMsg());
+        }
+        ProjectCommonConfigModel configModel = configContent.getContent();
+        // 是否允许管理人脸信息
+        Boolean isAllowUpdateFace = configModel.getIsAllowUpdateFace();
+        if (isAllowUpdateFace == null || !isAllowUpdateFace) {
+            return ResultContent.buildFail("系统不允许管理人脸信息");
+        }
+
+        // 人脸是否需要审核
+        Boolean isExamineFace = configModel.getIsExamineFace();
+
+        int maxFaceNumber = configModel.getMaxFaceNumber();
+        int number = orgUserFaceDao.countByUserIdAndProjectOid(userId, projectOid);
+        if (number >= maxFaceNumber) {
+            return ResultContent.buildFail("");
+        }
+        // 所属用户userId
+        UserAccount userAccount = userCountDao.findTopByUserId(userId);
+        OrganizationUser organizationUser = organizationUserServiceImpl.getUserTopInProjectBindOrgUserInfo(projectOid, userAccount);
+        if (organizationUser == null) {
+            return ResultContent.buildFail("用户未加入项目");
+        }
+
         String updateFaceFileId = "";
-        OrgUserFace orgUserFace = orgUserFaceDao.findTopByUserIdAndProjectOid(userId, projectOid);
-        if (ObjectUtils.isEmpty(orgUserFace)) {
-            orgUserFace = new OrgUserFace();
-            initEntityNoCheckOid(orgUserFace);
-        } else {
+        OrgUserFace orgUserFace = null;
+        if (StringUtils.isNotEmpty(param.getId())) {
+            orgUserFace = orgUserFaceDao.findTopById(param.getId());
+            if (ObjectUtils.isEmpty(orgUserFace)) {
+                return ResultContent.buildFail(String.format(ResultMessage.DATA_NOT_EXIST, param.getId()));
+            }
             initUpdateEntity(orgUserFace);
             updateFaceFileId = orgUserFace.getUpdateFaceFileId();
+        } else {
+            orgUserFace = new OrgUserFace();
+            initEntityNoCheckOid(orgUserFace);
         }
         BeanUtils.copyProperties(param, orgUserFace, "id");
         orgUserFace.setProjectOid(projectOid);
-
-        // 所属用户userId
-        UserAccount userAccount = userCountDao.findTopByUserId(userId);
+        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) {
+            // 需要审核
+            orgUserFace.setIsCanUsed(Boolean.FALSE);
+            orgUserFace.setAuditState(AuditState.WaitAudit);
+        } else {
+            // 不需要审核
+            ResultContent<String> resultContent = syncFace(orgUserFace);
+            if (resultContent.isFailed()) {
+                return ResultContent.buildFail(resultContent.getMsg());
+            }
+            updateFaceFileId = resultContent.getContent();
+            orgUserFace.setUpdateFaceFileId(updateFaceFileId);
+            orgUserFace.setIsCanUsed(Boolean.TRUE);
+            orgUserFace.setAuditState(AuditState.Audited);
+            orgUserFace.setAuditUserId(getCurrentUserId());
+            orgUserFace.setAuditRemark("自动通过");
+            orgUserFace.setAuditTime(System.currentTimeMillis());
+        }
+        orgUserFaceDao.save(orgUserFace);
+        return ResultContent.buildSuccess();
+    }
+
+    public ResultContent deleteFace(String id) {
+        OrgUserFace orgUserFace = orgUserFaceDao.findTopById(id);
+        if (orgUserFace == null) {
+            return ResultContent.buildFail(String.format(ResultMessage.DATA_NOT_EXIST, id));
+        }
+        ResultContent<ProjectCommonConfigModel> content = projectCommonConfigService.getConfigInfoAndCheck(orgUserFace.getProjectOid());
+        if (content.isFailed()) {
+            return ResultContent.buildFail(content.getMsg());
+        }
+        ProjectCommonConfigModel configModel = content.getContent();
+        Boolean isAllowUpdateFace = configModel.getIsAllowUpdateFace();
+        if (isAllowUpdateFace == null || !isAllowUpdateFace) {
+            return ResultContent.buildFail("系统不允许删除人脸信息");
         }
-        String faceBase64 = commonService.getUrlFileBase64(param.getImg());
+        if (StringUtils.isNotEmpty(orgUserFace.getUpdateFaceFileId())) {
+            com.github.microservice.auth.client.content.ResultContent resultContent = userFaceService.delete(orgUserFace.getUserId(), orgUserFace.getUpdateFaceFileId());
+            if (resultContent.isFailed()) {
+                return ResultContent.buildFail(resultContent.getMsg());
+            }
+        }
+        orgUserFaceDao.delete(orgUserFace);
+        return ResultContent.buildSuccess();
+    }
+
+    public ResultContent<Page<OrgUserFaceModel>> page(OrgUserFaceSearch param, Pageable pageable) {
+        Page<OrgUserFace> page = orgUserFaceDao.page(pageable, param);
+        return ResultContent.buildSuccess(PageEntityUtil.concurrent2PageModel(page, this::toModel));
+    }
+
+    /**
+     * 审核
+     *
+     * @param param
+     * @return
+     */
+    public ResultContent auditFace(OrgUserFaceAuditParam param) {
+        OrgUserFace orgUserFace = orgUserFaceDao.findTopById(param.getId());
+        if (orgUserFace == null) {
+            return ResultContent.buildFail(String.format(ResultMessage.DATA_NOT_EXIST, param.getId()));
+        }
+        if (param.getAuditState() != AuditState.WaitAudit) {
+            return ResultContent.buildFail("数据已审核");
+        }
+        BeanUtils.copyProperties(param, orgUserFace, "id");
+        orgUserFace.setAuditTime(System.currentTimeMillis());
+        orgUserFaceDao.save(orgUserFace);
+        return ResultContent.buildSuccess();
+    }
+
+    private ResultContent<String> syncFace(OrgUserFace orgUserFace) {
+        String updateFaceFileId = orgUserFace.getUpdateFaceFileId();
+        String userId = orgUserFace.getUserId();
+        String faceBase64 = commonService.getUrlFileBase64(orgUserFace.getImg());
         // 维护管理权限中心用户的头像信息
         UserFaceUploadModel userFaceUploadModel = new UserFaceUploadModel();
         userFaceUploadModel.setUserId(userId);
@@ -111,48 +232,39 @@ public class OrgUserFaceService extends SuperService {
             return ResultContent.buildFail(content.getMsg());
         }
         updateFaceFileId = content.getContent();
-
-        orgUserFace.setUpdateFaceFileId(updateFaceFileId);
-        orgUserFaceDao.save(orgUserFace);
-
-        String groupId = CommonUtil.UUID();
-        Map<String, Object> map = new HashMap<>();
-        map.put("groupId", groupId);
-        // 通知人脸信息发送变化
-        devicePermissEventService.sendUserInfoChangeEvent(orgUserFace.getUserId(), orgUserFace.getProjectOid(), map);
-        return ResultContent.buildSuccess();
+//        String groupId = CommonUtil.UUID();
+//        Map<String, Object> map = new HashMap<>();
+//        map.put("groupId", groupId);
+//        // 通知人脸信息发送变化
+//        devicePermissEventService.sendUserInfoChangeEvent(orgUserFace.getUserId(), orgUserFace.getProjectOid(), map);
+        return ResultContent.buildSuccess(updateFaceFileId);
     }
 
-    public List<OrgUserFace> getUserFaces(String userId, String oid) {
-        List<OrgUserFace> list = new ArrayList<>();
+    public OrgUserFace getUserFace(String userId, String oid) {
         if (StringUtils.isNotEmpty(userId) && StringUtils.isNotEmpty(oid)) {
-            list = orgUserFaceDao.findByUserIdAndProjectOid(userId, oid);
+            return orgUserFaceDao.findTopByUserIdAndProjectOidOrderByCreateTimeDesc(userId, oid);
         }
-        return list;
+        return null;
     }
 
-    public ResultContent<OrgUserFaceModel> getUserFaceModel(String userId, String projectOid) {
-        if (StringUtils.isEmpty(userId)) {
-            // 得到当前用户的userId
-            userId = getCurrentUserId();
-        }
+    public ResultContent<List<OrgUserFaceModel>> getCurrentUserAllFace(String projectOid) {
+        String userId = getCurrentUserId();
         if (StringUtils.isEmpty(projectOid)) {
-            // 得到header里面的项目oid
             projectOid = getCurrentProjectOid();
         }
         if (StringUtils.isEmpty(projectOid)) {
-            return ResultContent.buildFail("projectOid为空");
+            return ResultContent.buildFail("项目oid不能为空");
         }
-
-        OrgUserFace entity = getUserFace(userId, projectOid);
-        return ResultContent.buildSuccess(toModel(entity));
+        return getUserAllFace(userId, projectOid);
     }
 
-    public OrgUserFace getUserFace(String userId, String oid) {
-        if (StringUtils.isNotEmpty(userId) && StringUtils.isNotEmpty(oid)) {
-            return orgUserFaceDao.findTopByUserIdAndProjectOid(userId, oid);
+    public ResultContent<List<OrgUserFaceModel>> getUserAllFace(String userId, String projectOid) {
+        List<OrgUserFace> list = orgUserFaceDao.findByUserIdAndProjectOidOrderByCreateTimeDesc(userId, projectOid);
+        List<OrgUserFaceModel> models = new ArrayList<>();
+        if (ObjectUtils.isNotEmpty(list)) {
+            models = list.stream().map(this::toModel).collect(Collectors.toList());
         }
-        return null;
+        return ResultContent.buildSuccess(models);
     }
 
     /**
@@ -183,11 +295,11 @@ public class OrgUserFaceService extends SuperService {
         if (StringUtils.isEmpty(projectOid)) {
             return ResultContent.buildFail("项目oid信息为空");
         }
-        ProjectCommonConfigModel projectCommonConfig = projectCommonConfigService.getInfoByOid(projectOid);
-        if (ObjectUtils.isEmpty(projectCommonConfig)) {
-            return ResultContent.buildFail("项目为配置人脸可信度");
+        ResultContent<ProjectCommonConfigModel> content = projectCommonConfigService.getConfigInfoAndCheck(projectOid);
+        if (content.isFailed()) {
+            return ResultContent.buildFail(content.getMsg());
         }
-        return conformFace(url, projectCommonConfig);
+        return conformFace(url, content.getContent());
     }
 
     /**
@@ -224,6 +336,8 @@ public class OrgUserFaceService extends SuperService {
         if (ObjectUtils.isNotEmpty(entity)) {
             model = new OrgUserFaceModel();
             BeanUtils.copyProperties(entity, model);
+            model.setUserAccount(userAccountService.toSimpleModel(entity.getUserAccount()));
+            model.setOrganizationUser(organizationUserServiceImpl.toModel(entity.getOrganizationUser()));
         }
         return model;
     }

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

@@ -97,6 +97,17 @@ public class ProjectCommonConfigService extends SuperService {
         return ResultContent.buildSuccess(getInfoByOid(projectOid));
     }
 
+    public ResultContent<ProjectCommonConfigModel> getConfigInfoAndCheck(String projectOid) {
+        if (StringUtils.isEmpty(projectOid)) {
+            projectOid = getCurrentProjectOid();
+        }
+        ProjectCommonConfigModel model = getInfoByOid(projectOid);
+        if (ObjectUtils.isEmpty(model)) {
+            return ResultContent.buildFail("项目未配置人脸可信度");
+        }
+        return ResultContent.buildSuccess(model);
+    }
+
     public ProjectCommonConfigModel getInfoByOid(String projectOid) {
         if (StringUtils.isEmpty(projectOid)) {
             return null;

+ 9 - 10
FullCardServer/src/main/java/com/zhongshu/card/server/core/service/visitor/VisitorMainService.java

@@ -1,6 +1,5 @@
 package com.zhongshu.card.server.core.service.visitor;
 
-import com.github.microservice.auth.client.model.UserFaceConfidenceModel;
 import com.github.microservice.auth.client.model.UserFaceUploadModel;
 import com.github.microservice.auth.client.service.UserFaceService;
 import com.github.microservice.components.data.base.util.PageEntityUtil;
@@ -28,6 +27,7 @@ import com.zhongshu.card.server.core.service.devices.DeviceInfoServiceImpl;
 import com.zhongshu.card.server.core.service.org.OrganizationUserServiceImpl;
 import com.zhongshu.card.server.core.service.permissVerify.Device2UseUsableService;
 import com.zhongshu.card.server.core.service.permissVerify.SuperPermissService;
+import com.zhongshu.card.server.core.service.projectAbout.OrgUserFaceService;
 import com.zhongshu.card.server.core.service.user.UserAccountServiceImpl;
 import com.zhongshu.card.server.core.util.CommonUtil;
 import com.zhongshu.card.server.core.util.TempUserUtil;
@@ -83,6 +83,9 @@ public class VisitorMainService extends SuperPermissService {
     @Autowired
     private VisitorSettingDao visitorSettingDao;
 
+    @Autowired
+    private OrgUserFaceService orgUserFaceService;
+
     public ResultContent saveInfo(VisitorMainParam param) {
         if (StringUtils.isEmpty(param.getSceneComponentId())) {
             return ResultContent.buildFail("sceneComponentId 不能为空");
@@ -129,17 +132,13 @@ public class VisitorMainService extends SuperPermissService {
             return ResultContent.buildFail("访客组件参数未配置");
         }
 
-        // 人脸验证
-        UserFaceConfidenceModel faceConfidenceModel = new UserFaceConfidenceModel();
-        faceConfidenceModel.setFile(commonService.getUrlFileBase64(param.getFaceUrl()));
-        // 验证人脸
-        com.github.microservice.auth.client.content.ResultContent<Double> confidence = userFaceService.confidence(faceConfidenceModel);
-        if (confidence.isFailed()) {
-            return ResultContent.buildFail(String.format("人脸识别错误"));
+        // 验证图片是否包含人脸
+        ResultContent conformFaceContent = orgUserFaceService.conformFace(param.getFaceUrl(), projectOid);
+        if (conformFaceContent.isFailed()) {
+            return ResultContent.buildFail(conformFaceContent.getMsg());
         }
-        double d = confidence.getContent();
-
 
+        // 判断
         UserAccount visitorUserAccount = userCountDao.findTopByUserId(param.getVisitorUserId());
         if (ObjectUtils.isEmpty(visitorUserAccount)) {
             return ResultContent.buildFail("被访人不存在");