修改百度人脸对比
parent
2f8097e3ce
commit
621e3e4b59
|
@ -11,21 +11,22 @@ import org.springframework.context.annotation.Configuration;
|
||||||
@Configuration
|
@Configuration
|
||||||
@ConfigurationProperties(prefix = "baidu.face")
|
@ConfigurationProperties(prefix = "baidu.face")
|
||||||
public class BaiduFaceProperties {
|
public class BaiduFaceProperties {
|
||||||
|
|
||||||
|
private String imgUrl="https://xiangguan.sxyanzhu.com";
|
||||||
/**
|
/**
|
||||||
* 百度人脸识别应用的App ID
|
* 百度人脸识别应用的App ID
|
||||||
*/
|
*/
|
||||||
private String appId = "7034646";
|
private String appId = "119949649";//"117160042";//
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 百度人脸识别应用的API Key
|
* 百度人脸识别应用的API Key
|
||||||
*/
|
*/
|
||||||
private String apiKey = "L3PiEzO9dMFJDExMTjOxuTtq";
|
private String apiKey = "L3PiEzO9dMFJDExMTjOxuTtq";//"rS40xCCuGuVNFRopPI0jlMuj";//
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 百度人脸识别应用的Secret Key
|
* 百度人脸识别应用的Secret Key
|
||||||
*/
|
*/
|
||||||
private String secretKey = "40LMey6WC1MYIqLU4m5Qe8K4foFUM1bc";
|
private String secretKey ="40LMey6WC1MYIqLU4m5Qe8K4foFUM1bc" ;//"3bY7dADqQq3O4UpXpFA1FJAj6LN57QCS";//
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 相似度阈值,大于此值认为是同一个人
|
* 相似度阈值,大于此值认为是同一个人
|
||||||
|
@ -48,7 +49,15 @@ public class BaiduFaceProperties {
|
||||||
private int retryDelay = 2000;
|
private int retryDelay = 2000;
|
||||||
|
|
||||||
// Getter和Setter方法
|
// Getter和Setter方法
|
||||||
|
|
||||||
|
public String getImgUrl() {
|
||||||
|
return imgUrl;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setImgUrl(String imgUrl) {
|
||||||
|
this.imgUrl = imgUrl;
|
||||||
|
}
|
||||||
|
|
||||||
public String getAppId() {
|
public String getAppId() {
|
||||||
return appId;
|
return appId;
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,344 @@
|
||||||
|
package com.yanzhu.common.core.utils;
|
||||||
|
|
||||||
|
import com.baidu.aip.face.AipFace;
|
||||||
|
import com.yanzhu.common.core.config.BaiduFaceProperties;
|
||||||
|
import com.yanzhu.common.core.utils.bean.BaiduFaceUserInfo;
|
||||||
|
import org.json.JSONObject;
|
||||||
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
|
import org.springframework.stereotype.Component;
|
||||||
|
|
||||||
|
import javax.annotation.PostConstruct;
|
||||||
|
import java.util.HashMap;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 基于百度人脸识别API的人脸库管理工具类
|
||||||
|
* 提供人脸注册、更新、删除、查询等管理功能
|
||||||
|
*
|
||||||
|
* @author yanzhu
|
||||||
|
*/
|
||||||
|
@Component
|
||||||
|
public class BaiduFaceManageUtils {
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private BaiduFaceProperties baiduFaceProperties;
|
||||||
|
|
||||||
|
// 初始化AipFace客户端
|
||||||
|
private static AipFace client;
|
||||||
|
|
||||||
|
// QPS限制相关常量
|
||||||
|
private static int QPS_LIMIT_DELAY = 1000; // 1秒延迟,避免QPS限制
|
||||||
|
private static int MAX_RETRY_ATTEMPTS = 3; // 最大重试次数
|
||||||
|
private static int RETRY_DELAY = 2000; // 重试延迟(毫秒)
|
||||||
|
private static String imgBaseUrl="";
|
||||||
|
|
||||||
|
|
||||||
|
@PostConstruct
|
||||||
|
public void init() {
|
||||||
|
// 从配置中获取参数
|
||||||
|
String appId = baiduFaceProperties.getAppId();
|
||||||
|
String apiKey = baiduFaceProperties.getApiKey();
|
||||||
|
String secretKey = baiduFaceProperties.getSecretKey();
|
||||||
|
imgBaseUrl=baiduFaceProperties.getImgUrl();
|
||||||
|
// 初始化AipFace客户端
|
||||||
|
client = new AipFace(appId, apiKey, secretKey);
|
||||||
|
|
||||||
|
// 设置网络连接参数
|
||||||
|
client.setConnectionTimeoutInMillis(2000);
|
||||||
|
client.setSocketTimeoutInMillis(60000);
|
||||||
|
|
||||||
|
// 更新静态变量
|
||||||
|
QPS_LIMIT_DELAY = baiduFaceProperties.getQpsLimitDelay();
|
||||||
|
MAX_RETRY_ATTEMPTS = baiduFaceProperties.getMaxRetryAttempts();
|
||||||
|
RETRY_DELAY = baiduFaceProperties.getRetryDelay();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void staticInit(BaiduFaceProperties baiduFaceProperties) {
|
||||||
|
// 从配置中获取参数
|
||||||
|
String appId = baiduFaceProperties.getAppId();
|
||||||
|
String apiKey = baiduFaceProperties.getApiKey();
|
||||||
|
String secretKey = baiduFaceProperties.getSecretKey();
|
||||||
|
imgBaseUrl=baiduFaceProperties.getImgUrl();
|
||||||
|
// 初始化AipFace客户端
|
||||||
|
client = new AipFace(appId, apiKey, secretKey);
|
||||||
|
|
||||||
|
// 设置网络连接参数
|
||||||
|
client.setConnectionTimeoutInMillis(2000);
|
||||||
|
client.setSocketTimeoutInMillis(60000);
|
||||||
|
|
||||||
|
// 更新静态变量
|
||||||
|
QPS_LIMIT_DELAY = baiduFaceProperties.getQpsLimitDelay();
|
||||||
|
MAX_RETRY_ATTEMPTS = baiduFaceProperties.getMaxRetryAttempts();
|
||||||
|
RETRY_DELAY = baiduFaceProperties.getRetryDelay();
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* 人脸注册
|
||||||
|
* 用于向人脸库中添加用户人脸信息
|
||||||
|
*
|
||||||
|
* @param imageBase64 图片信息,Base64编码
|
||||||
|
* @param groupId 用户组ID(用于区分不同的人脸库)
|
||||||
|
* @param userId 用户ID(用于标识用户)
|
||||||
|
* @param userInfo 用户信息(可选,长度限制256B)
|
||||||
|
* @return 注册结果,包含人脸ID等信息
|
||||||
|
*/
|
||||||
|
public static JSONObject faceRegister(String imageBase64, String groupId, String userId, String userInfo) {
|
||||||
|
try {
|
||||||
|
// 检查client是否已初始化
|
||||||
|
if (client == null) {
|
||||||
|
System.err.println("错误: Baidu AipFace client未初始化,请确保在Spring容器中正确初始化BaiduFaceManageUtils");
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 添加延迟以避免QPS限制
|
||||||
|
Thread.sleep(QPS_LIMIT_DELAY);
|
||||||
|
|
||||||
|
// 传入可选参数调用接口
|
||||||
|
HashMap<String, String> options = new HashMap<String, String>();
|
||||||
|
if (userInfo != null && !userInfo.isEmpty()) {
|
||||||
|
options.put("user_info", userInfo);
|
||||||
|
}
|
||||||
|
options.put("quality_control", "NORMAL");
|
||||||
|
options.put("liveness_control", "LOW");
|
||||||
|
options.put("action_type", "REPLACE"); // 若在此用户组下不存在此用户ID,则添加,否则更新
|
||||||
|
|
||||||
|
// 调用百度人脸识别API的人脸注册接口
|
||||||
|
JSONObject response = client.addUser(imageBase64, "BASE64", groupId, userId, options);
|
||||||
|
return response;
|
||||||
|
} catch (Exception e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 人脸更新
|
||||||
|
* 用于更新人脸库中的用户人脸信息
|
||||||
|
*
|
||||||
|
* @param imageBase64 图片信息,Base64编码
|
||||||
|
* @param groupId 用户组ID
|
||||||
|
* @param userId 用户ID
|
||||||
|
* @param userInfo 用户信息(可选)
|
||||||
|
* @return 更新结果
|
||||||
|
*/
|
||||||
|
public static JSONObject faceUpdate(String imageBase64, String groupId, String userId, String userInfo) {
|
||||||
|
try {
|
||||||
|
// 检查client是否已初始化
|
||||||
|
if (client == null) {
|
||||||
|
System.err.println("错误: Baidu AipFace client未初始化,请确保在Spring容器中正确初始化BaiduFaceManageUtils");
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 添加延迟以避免QPS限制
|
||||||
|
Thread.sleep(QPS_LIMIT_DELAY);
|
||||||
|
|
||||||
|
// 传入可选参数调用接口
|
||||||
|
HashMap<String, String> options = new HashMap<String, String>();
|
||||||
|
if (userInfo != null && !userInfo.isEmpty()) {
|
||||||
|
options.put("user_info", userInfo);
|
||||||
|
}
|
||||||
|
options.put("quality_control", "NORMAL");
|
||||||
|
options.put("liveness_control", "LOW");
|
||||||
|
|
||||||
|
// 调用百度人脸识别API的人脸更新接口
|
||||||
|
JSONObject response = client.updateUser(imageBase64, "BASE64", groupId, userId, options);
|
||||||
|
return response;
|
||||||
|
} catch (Exception e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 人脸删除
|
||||||
|
* 用于从人脸库中删除用户人脸信息
|
||||||
|
*
|
||||||
|
* @param userId 用户ID
|
||||||
|
* @param groupId 用户组ID
|
||||||
|
* @return 删除结果
|
||||||
|
*/
|
||||||
|
public static JSONObject faceDelete(String userId, String groupId) {
|
||||||
|
try {
|
||||||
|
// 检查client是否已初始化
|
||||||
|
if (client == null) {
|
||||||
|
System.err.println("错误: Baidu AipFace client未初始化,请确保在Spring容器中正确初始化BaiduFaceManageUtils");
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 添加延迟以避免QPS限制
|
||||||
|
Thread.sleep(QPS_LIMIT_DELAY);
|
||||||
|
|
||||||
|
// 传入可选参数调用接口
|
||||||
|
HashMap<String, String> options = new HashMap<String, String>();
|
||||||
|
|
||||||
|
// 调用百度人脸识别API的人脸删除接口
|
||||||
|
JSONObject response = client.faceDelete(userId, groupId, "", options);
|
||||||
|
return response;
|
||||||
|
} catch (Exception e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 用户信息查询
|
||||||
|
* 用于查询人脸库中的用户信息
|
||||||
|
*
|
||||||
|
* @param userId 用户ID
|
||||||
|
* @param groupId 用户组ID
|
||||||
|
* @return 用户信息
|
||||||
|
*/
|
||||||
|
public static JSONObject getUserInfo(String userId, String groupId) {
|
||||||
|
try {
|
||||||
|
// 检查client是否已初始化
|
||||||
|
if (client == null) {
|
||||||
|
System.err.println("错误: Baidu AipFace client未初始化,请确保在Spring容器中正确初始化BaiduFaceManageUtils");
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 添加延迟以避免QPS限制
|
||||||
|
Thread.sleep(QPS_LIMIT_DELAY);
|
||||||
|
|
||||||
|
// 传入可选参数调用接口
|
||||||
|
HashMap<String, String> options = new HashMap<String, String>();
|
||||||
|
|
||||||
|
// 调用百度人脸识别API的用户信息查询接口
|
||||||
|
JSONObject response = client.getUser(userId, groupId, options);
|
||||||
|
return response;
|
||||||
|
} catch (Exception e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取用户人脸列表
|
||||||
|
* 用于查询指定用户在指定用户组下的人脸列表
|
||||||
|
*
|
||||||
|
* @param userId 用户ID
|
||||||
|
* @param groupId 用户组ID
|
||||||
|
* @return 人脸列表
|
||||||
|
*/
|
||||||
|
public static JSONObject getFaceList(String userId, String groupId) {
|
||||||
|
try {
|
||||||
|
// 检查client是否已初始化
|
||||||
|
if (client == null) {
|
||||||
|
System.err.println("错误: Baidu AipFace client未初始化,请确保在Spring容器中正确初始化BaiduFaceManageUtils");
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 添加延迟以避免QPS限制
|
||||||
|
Thread.sleep(QPS_LIMIT_DELAY);
|
||||||
|
|
||||||
|
// 传入可选参数调用接口
|
||||||
|
HashMap<String, String> options = new HashMap<String, String>();
|
||||||
|
|
||||||
|
// 调用百度人脸识别API的获取用户人脸列表接口
|
||||||
|
JSONObject response = client.faceGetlist(userId, groupId, options);
|
||||||
|
return response;
|
||||||
|
} catch (Exception e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取用户组列表
|
||||||
|
* 用于查询当前应用下所有用户组
|
||||||
|
*
|
||||||
|
* @param startIndex 起始索引,默认为0
|
||||||
|
* @param length 返回数量,默认为100,最大为1000
|
||||||
|
* @return 用户组列表
|
||||||
|
*/
|
||||||
|
public static JSONObject getGroupList(int startIndex, int length) {
|
||||||
|
try {
|
||||||
|
// 检查client是否已初始化
|
||||||
|
if (client == null) {
|
||||||
|
System.err.println("错误: Baidu AipFace client未初始化,请确保在Spring容器中正确初始化BaiduFaceManageUtils");
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 添加延迟以避免QPS限制
|
||||||
|
Thread.sleep(QPS_LIMIT_DELAY);
|
||||||
|
|
||||||
|
// 传入可选参数调用接口
|
||||||
|
HashMap<String, String> options = new HashMap<String, String>();
|
||||||
|
options.put("start", String.valueOf(startIndex));
|
||||||
|
options.put("length", String.valueOf(length));
|
||||||
|
|
||||||
|
// 调用百度人脸识别API的获取用户组列表接口
|
||||||
|
JSONObject response = client.getGroupList(options);
|
||||||
|
return response;
|
||||||
|
} catch (Exception e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 人脸搜索
|
||||||
|
* 在指定人脸库中查找最相似的人脸
|
||||||
|
*
|
||||||
|
* @param imageBase64 图片信息,Base64编码
|
||||||
|
* @param groupIds 用户组ID列表(多个用逗号分隔)
|
||||||
|
* @return 搜索结果
|
||||||
|
*/
|
||||||
|
public static JSONObject faceSearch(String imageBase64, String groupIds) {
|
||||||
|
try {
|
||||||
|
// 检查client是否已初始化
|
||||||
|
if (client == null) {
|
||||||
|
System.err.println("错误: Baidu AipFace client未初始化,请确保在Spring容器中正确初始化BaiduFaceManageUtils");
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 添加延迟以避免QPS限制
|
||||||
|
Thread.sleep(QPS_LIMIT_DELAY);
|
||||||
|
|
||||||
|
// 传入可选参数调用接口
|
||||||
|
HashMap<String, Object> options = new HashMap<String, Object>();
|
||||||
|
options.put("quality_control", "NORMAL");
|
||||||
|
options.put("liveness_control", "LOW");
|
||||||
|
options.put("max_user_num", "3"); // 最多返回3个匹配用户
|
||||||
|
|
||||||
|
// 调用百度人脸识别API的人脸搜索接口
|
||||||
|
JSONObject response = client.search(imageBase64, "BASE64", groupIds, options);
|
||||||
|
return response;
|
||||||
|
} catch (Exception e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 人脸复制
|
||||||
|
* 用于将用户从一个用户组复制到另一个用户组
|
||||||
|
*
|
||||||
|
* @param userId 用户ID
|
||||||
|
* @param srcGroupId 源用户组ID
|
||||||
|
* @param dstGroupId 目标用户组ID
|
||||||
|
* @return 复制结果
|
||||||
|
*/
|
||||||
|
public static JSONObject faceCopy(String userId, String srcGroupId, String dstGroupId) {
|
||||||
|
try {
|
||||||
|
// 检查client是否已初始化
|
||||||
|
if (client == null) {
|
||||||
|
System.err.println("错误: Baidu AipFace client未初始化,请确保在Spring容器中正确初始化BaiduFaceManageUtils");
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 添加延迟以避免QPS限制
|
||||||
|
Thread.sleep(QPS_LIMIT_DELAY);
|
||||||
|
|
||||||
|
// 传入可选参数调用接口
|
||||||
|
HashMap<String, String> options = new HashMap<String, String>();
|
||||||
|
options.put("src_group_id", srcGroupId);
|
||||||
|
options.put("dst_group_id", dstGroupId);
|
||||||
|
|
||||||
|
// 调用百度人脸识别API的人脸复制接口
|
||||||
|
JSONObject response = client.userCopy(userId, options);
|
||||||
|
return response;
|
||||||
|
} catch (Exception e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -1,8 +1,11 @@
|
||||||
package com.yanzhu.common.core.utils;
|
package com.yanzhu.common.core.utils;
|
||||||
|
|
||||||
|
import com.alibaba.fastjson2.JSON;
|
||||||
import com.baidu.aip.face.AipFace;
|
import com.baidu.aip.face.AipFace;
|
||||||
import com.baidu.aip.face.MatchRequest;
|
import com.baidu.aip.face.MatchRequest;
|
||||||
import com.yanzhu.common.core.config.BaiduFaceProperties;
|
import com.yanzhu.common.core.config.BaiduFaceProperties;
|
||||||
|
import com.yanzhu.common.core.utils.BaiduFaceManageUtils;
|
||||||
|
import com.yanzhu.common.core.utils.bean.BaiduFaceUserInfo;
|
||||||
import org.json.JSONObject;
|
import org.json.JSONObject;
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
import org.springframework.stereotype.Component;
|
import org.springframework.stereotype.Component;
|
||||||
|
@ -26,7 +29,7 @@ public class BaiduFaceSimilarityUtils {
|
||||||
|
|
||||||
@Autowired
|
@Autowired
|
||||||
private BaiduFaceProperties baiduFaceProperties;
|
private BaiduFaceProperties baiduFaceProperties;
|
||||||
|
|
||||||
// 初始化AipFace客户端
|
// 初始化AipFace客户端
|
||||||
private static AipFace client;
|
private static AipFace client;
|
||||||
|
|
||||||
|
@ -37,14 +40,16 @@ public class BaiduFaceSimilarityUtils {
|
||||||
private static int QPS_LIMIT_DELAY = 1000; // 1秒延迟,避免QPS限制
|
private static int QPS_LIMIT_DELAY = 1000; // 1秒延迟,避免QPS限制
|
||||||
private static int MAX_RETRY_ATTEMPTS = 3; // 最大重试次数
|
private static int MAX_RETRY_ATTEMPTS = 3; // 最大重试次数
|
||||||
private static int RETRY_DELAY = 2000; // 重试延迟(毫秒)
|
private static int RETRY_DELAY = 2000; // 重试延迟(毫秒)
|
||||||
|
private static String imgBaseUrl="https://xiangguan.sxyanzhu.com";
|
||||||
|
|
||||||
@PostConstruct
|
@PostConstruct
|
||||||
public void init() {
|
public void init() {
|
||||||
// 从配置中获取参数
|
// 从配置中获取参数
|
||||||
String appId = baiduFaceProperties.getAppId();
|
String appId = baiduFaceProperties.getAppId();
|
||||||
String apiKey = baiduFaceProperties.getApiKey();
|
String apiKey = baiduFaceProperties.getApiKey();
|
||||||
String secretKey = baiduFaceProperties.getSecretKey();
|
String secretKey = baiduFaceProperties.getSecretKey();
|
||||||
|
imgBaseUrl=baiduFaceProperties.getImgUrl();
|
||||||
|
|
||||||
// 初始化AipFace客户端
|
// 初始化AipFace客户端
|
||||||
client = new AipFace(appId, apiKey, secretKey);
|
client = new AipFace(appId, apiKey, secretKey);
|
||||||
|
|
||||||
|
@ -125,6 +130,130 @@ public class BaiduFaceSimilarityUtils {
|
||||||
return similarity >= SIMILARITY_THRESHOLD;
|
return similarity >= SIMILARITY_THRESHOLD;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 使用人脸库进行人脸对比
|
||||||
|
* 将第一张图片注册到人脸库,然后用第二张图片在该人脸库中搜索匹配
|
||||||
|
*
|
||||||
|
* @param imageBase64_1 第一张图片的Base64编码(用于注册到人脸库)
|
||||||
|
* @param imageBase64_2 第二张图片的Base64编码(用于在人脸库中搜索)
|
||||||
|
* @param groupId 人脸库组ID
|
||||||
|
* @param userId 用户ID
|
||||||
|
* @return 相似度,范围0-1,越大表示越相似
|
||||||
|
*/
|
||||||
|
public static double calculateFaceSimilarityWithFaceLibrary(String imageBase64_1, String imageBase64_2, String groupId, String userId) {
|
||||||
|
try {
|
||||||
|
// 先将第一张图片注册到人脸库
|
||||||
|
JSONObject registerResult = BaiduFaceManageUtils.faceRegister(imageBase64_1, groupId, userId, "临时用户");
|
||||||
|
|
||||||
|
// 检查注册结果
|
||||||
|
if (registerResult != null && registerResult.has("error_code")) {
|
||||||
|
String errorCode = registerResult.getString("error_code");
|
||||||
|
if (!"0".equals(errorCode)) {
|
||||||
|
System.err.println("人脸注册失败: " + registerResult.optString("error_msg", "未知错误"));
|
||||||
|
return 0.0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 使用第二张图片在人脸库中搜索
|
||||||
|
JSONObject searchResult = BaiduFaceManageUtils.faceSearch(imageBase64_2, groupId);
|
||||||
|
|
||||||
|
// 检查搜索结果
|
||||||
|
if (searchResult != null && searchResult.has("error_code")) {
|
||||||
|
String errorCode = searchResult.getString("error_code");
|
||||||
|
if (!"0".equals(errorCode)) {
|
||||||
|
System.err.println("人脸搜索失败: " + searchResult.optString("error_msg", "未知错误"));
|
||||||
|
return 0.0;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 解析搜索结果
|
||||||
|
if (searchResult.has("result") && !searchResult.isNull("result")) {
|
||||||
|
JSONObject result = searchResult.getJSONObject("result");
|
||||||
|
if (result != null && result.has("user_list")) {
|
||||||
|
org.json.JSONArray userList = result.getJSONArray("user_list");
|
||||||
|
if (userList.length() > 0) {
|
||||||
|
JSONObject user = userList.getJSONObject(0);
|
||||||
|
if (user.has("score")) {
|
||||||
|
// 百度API返回的相似度是百分比,需要转换为0-1范围
|
||||||
|
double score = user.getDouble("score");
|
||||||
|
return score / 100.0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0.0;
|
||||||
|
} catch (Exception e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
return 0.0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 根据图片和分组ID,基于相似度查找人员,未找到返回null
|
||||||
|
*
|
||||||
|
* @param imgUrl 图片的Base64编码
|
||||||
|
* @param groupId 用户组ID
|
||||||
|
* @return 匹配的用户ID,未找到返回null
|
||||||
|
*/
|
||||||
|
public static BaiduFaceUserInfo findFaceSimilarityWithFaceLibrary(String imgUrl, String groupId) {
|
||||||
|
try {
|
||||||
|
if(StringUtils.isBlank(imgUrl)){
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
if(!imgUrl.toLowerCase().startsWith("http")){
|
||||||
|
imgUrl=imgBaseUrl+imgUrl;
|
||||||
|
}
|
||||||
|
String imageBase64=downloadAndEncodeImage(imgUrl);
|
||||||
|
if (imageBase64 == null) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
// 使用百度人脸识别API进行人脸搜索
|
||||||
|
JSONObject searchResult = BaiduFaceManageUtils.faceSearch(imageBase64, groupId);
|
||||||
|
|
||||||
|
// 检查搜索结果
|
||||||
|
if (searchResult != null && searchResult.has("error_code")) {
|
||||||
|
Long errorCode = searchResult.getLong("error_code");
|
||||||
|
if (0 == errorCode) { // 请求成功
|
||||||
|
// 解析搜索结果
|
||||||
|
if (searchResult.has("result") && !searchResult.isNull("result")) {
|
||||||
|
JSONObject result = searchResult.getJSONObject("result");
|
||||||
|
if (result != null && result.has("user_list")) {
|
||||||
|
org.json.JSONArray userList = result.getJSONArray("user_list");
|
||||||
|
if (userList.length() > 0) {
|
||||||
|
JSONObject user = userList.getJSONObject(0);
|
||||||
|
if (user.has("score")) {
|
||||||
|
double score = user.getDouble("score");
|
||||||
|
BaiduFaceUserInfo userInfo = new BaiduFaceUserInfo();
|
||||||
|
userInfo.setSimilarity(score);
|
||||||
|
if (score >= SIMILARITY_THRESHOLD) {
|
||||||
|
if (user.has("user_info")) {
|
||||||
|
userInfo.setUserId(user.getString("user_id"));
|
||||||
|
userInfo.setGroupId(user.getString("group_id"));
|
||||||
|
if (user.has("user_info")) {
|
||||||
|
String jUser = user.getString("user_info");
|
||||||
|
userInfo.setUserInfo(JSON.parseObject(jUser, Map.class));
|
||||||
|
return userInfo;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
System.err.println("人脸搜索失败: " + searchResult.optString("error_msg", "未知错误"));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return null; // 未找到匹配的用户
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
} catch (Exception e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 下载图片并转换为Base64编码
|
* 下载图片并转换为Base64编码
|
||||||
*
|
*
|
||||||
|
@ -146,7 +275,14 @@ public class BaiduFaceSimilarityUtils {
|
||||||
|
|
||||||
// 将图片转换为Base64编码
|
// 将图片转换为Base64编码
|
||||||
ByteArrayOutputStream baos = new ByteArrayOutputStream();
|
ByteArrayOutputStream baos = new ByteArrayOutputStream();
|
||||||
ImageIO.write(image, "jpg", baos);
|
|
||||||
|
// 根据图片URL的扩展名确定图片格式,如果没有扩展名或不是png,则默认使用jpg
|
||||||
|
String format = "jpg";
|
||||||
|
if (imageUrl.toLowerCase().endsWith(".png")) {
|
||||||
|
format = "png";
|
||||||
|
}
|
||||||
|
|
||||||
|
ImageIO.write(image, format, baos);
|
||||||
byte[] imageBytes = baos.toByteArray();
|
byte[] imageBytes = baos.toByteArray();
|
||||||
return Base64.getEncoder().encodeToString(imageBytes);
|
return Base64.getEncoder().encodeToString(imageBytes);
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
|
@ -242,8 +378,73 @@ public class BaiduFaceSimilarityUtils {
|
||||||
return 0.0;
|
return 0.0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void main(String[] args) {
|
public static void main(String[] args) throws IOException {
|
||||||
|
String userPicture3 = "/statics/2025/09/03/c4e2c8fb9d9f66e03902f9e3fea17f99_20250903165717A003.jpg";
|
||||||
|
String userPicture1 = "https://xiangguan.sxyanzhu.com/statics/2025/09/16/8f24c9ee7a0c533679043412dc746e27_20250916092139A739.png";
|
||||||
|
//String imageBase64 = downloadAndEncodeImage(userPicture3);
|
||||||
|
String groupId="G191";
|
||||||
|
BaiduFaceManageUtils.staticInit(new BaiduFaceProperties());
|
||||||
|
BaiduFaceUserInfo user=findFaceSimilarityWithFaceLibrary(userPicture3, groupId);
|
||||||
|
if(user==null){https://xiangguan.sxyanzhu.com/statics/2025/09/16/8f24c9ee7a0c533679043412dc746e27_20250916092139A739.png
|
||||||
|
System.out.printf("未找到匹配用户");
|
||||||
|
}else{
|
||||||
|
System.out.println("匹配用户:"+JSON.toJSONString(user));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void main6(String[] args) {
|
||||||
|
String userPicture1 = "https://xiangguan.sxyanzhu.com/statics/2025/09/03/836e5c21f83604894486069394dcd22e_20250903170015A004.jpg";
|
||||||
|
String userPicture2 = "http://62.234.3.186/statics/2025/06/11/a28457e2847333886c8e0f4fd9cd24bc_20250611101313A331.jpg";
|
||||||
|
String userPicture3 = "https://xiangguan.sxyanzhu.com/statics/2025/09/03/c4e2c8fb9d9f66e03902f9e3fea17f99_20250903165717A003.jpg";
|
||||||
|
String userPicture4 = "https://xiangguan.sxyanzhu.com/statics/2025/09/03/8c7dd922ad47494fc02c388e12c00eac_20250903132353A852.png";
|
||||||
|
String userPicture5 = "http://62.234.3.186/statics/2025/06/11/87052f8fa3eaa8840bc2e4fe556a825e_20250611101011A328.jpg";
|
||||||
|
String userPicture6 = "https://xiangguan.sxyanzhu.com/statics/2025/09/05/a851473a6f5f6373b1ea73487d36dfba_20250905095748A594.jpg";
|
||||||
|
// 打印每张图片的人脸信息
|
||||||
|
List<BaiduFaceUserInfo> users = new ArrayList<BaiduFaceUserInfo>();
|
||||||
|
users.add(new BaiduFaceUserInfo("U0001","张三", "G002", userPicture1));
|
||||||
|
users.add(new BaiduFaceUserInfo("U0002","李君", "G002", userPicture2));
|
||||||
|
users.add(new BaiduFaceUserInfo("U0003","王五", "G002", userPicture4));
|
||||||
|
users.add(new BaiduFaceUserInfo("U0004","赵六", "G002", userPicture5));
|
||||||
|
users.add(new BaiduFaceUserInfo("U0005","龙小孟", "G002", userPicture6));
|
||||||
|
|
||||||
|
BaiduFaceManageUtils.staticInit(new BaiduFaceProperties());
|
||||||
|
// 把users注册到百度人脸库
|
||||||
|
System.out.println("开始注册用户到百度人脸库...");
|
||||||
|
for (BaiduFaceUserInfo user : users) {
|
||||||
|
try {
|
||||||
|
// 下载图片并转换为Base64编码
|
||||||
|
String imageBase64 = downloadAndEncodeImage(user.getImage());
|
||||||
|
if (imageBase64 != null) {
|
||||||
|
// 调用百度人脸库管理工具注册用户
|
||||||
|
JSONObject result = BaiduFaceManageUtils.faceUpdate(imageBase64, user.getGroupId(), user.getUserId().toString(), JSON.toJSONString(user));
|
||||||
|
if (result != null && result.has("error_code")) {
|
||||||
|
long errorCode = result.getLong("error_code");
|
||||||
|
if (errorCode==0) {
|
||||||
|
System.out.println("用户 " + user.getUserId() + " 注册成功");
|
||||||
|
} else {
|
||||||
|
String errorMsg = result.getString("error_msg");
|
||||||
|
if(StringUtils.isNotBlank(errorMsg) && errorMsg.contains("not exists")){
|
||||||
|
result=BaiduFaceManageUtils.faceRegister(imageBase64, user.getGroupId(), user.getUserId().toString(), JSON.toJSONString(user));
|
||||||
|
}else{
|
||||||
|
System.err.println("用户 " + user.getUserId() + " 注册失败: " + result.optString("error_msg", "未知错误"));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
System.err.println("用户 " + user.getUserId() + " 图片下载失败");
|
||||||
|
}
|
||||||
|
} catch (Exception e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
System.err.println("用户 " + user.getUserId() + " 注册异常");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
System.out.println("用户注册完成");
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
public static void main1(String[] args) {
|
||||||
System.out.println("开始测试人脸相似度算法...");
|
System.out.println("开始测试人脸相似度算法...");
|
||||||
|
|
||||||
// 测试1:同一个人的不同照片(应该匹配)
|
// 测试1:同一个人的不同照片(应该匹配)
|
||||||
|
@ -279,4 +480,76 @@ public class BaiduFaceSimilarityUtils {
|
||||||
|
|
||||||
System.out.println("\n测试完成。");
|
System.out.println("\n测试完成。");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 人脸注册
|
||||||
|
public static String faceAdd(BaiduFaceUserInfo bfUser) {
|
||||||
|
String imgUrl= bfUser.getImage();
|
||||||
|
if (imgUrl==null||imgUrl.isEmpty()){
|
||||||
|
return "注册失败:无图片";
|
||||||
|
}
|
||||||
|
if(!imgUrl.toLowerCase().startsWith("http")){
|
||||||
|
imgUrl=imgBaseUrl+imgUrl;
|
||||||
|
}
|
||||||
|
try{
|
||||||
|
String imageBase64 = downloadAndEncodeImage(imgUrl);
|
||||||
|
if (StringUtils.isNotEmpty(imageBase64)){
|
||||||
|
JSONObject result = BaiduFaceManageUtils.faceRegister(imageBase64, bfUser.getGroupId(), bfUser.getUserId(), bfUser.getUserInfoStr());
|
||||||
|
long errorCode = result.getLong("error_code");
|
||||||
|
if (errorCode==0) {
|
||||||
|
return "注册成功:" + bfUser.getUserId() + " 注册成功";
|
||||||
|
} else {
|
||||||
|
return "注册失败:" + bfUser.getUserId() + " ," + result.optString("error_msg");
|
||||||
|
}
|
||||||
|
}else{
|
||||||
|
return "注册失败:图片编码失败";
|
||||||
|
}
|
||||||
|
}catch (Exception e){
|
||||||
|
e.printStackTrace();
|
||||||
|
return "注册异常:"+e.getMessage();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 人脸更新
|
||||||
|
public static String faceUpdate(BaiduFaceUserInfo bfUser) {
|
||||||
|
String imgUrl= bfUser.getImage();
|
||||||
|
if (imgUrl==null||imgUrl.isEmpty()){
|
||||||
|
return "更新失败:无图片";
|
||||||
|
}
|
||||||
|
if(!imgUrl.toLowerCase().startsWith("http")){
|
||||||
|
imgUrl=imgBaseUrl+imgUrl;
|
||||||
|
}
|
||||||
|
try{
|
||||||
|
String imageBase64 = downloadAndEncodeImage(imgUrl);
|
||||||
|
if (StringUtils.isNotEmpty(imageBase64)){
|
||||||
|
JSONObject result = BaiduFaceManageUtils.faceUpdate(imageBase64, bfUser.getGroupId(), bfUser.getUserId(), bfUser.getUserInfoStr());
|
||||||
|
long errorCode = result.getLong("error_code");
|
||||||
|
if (errorCode==0) {
|
||||||
|
return "更新成功:" + bfUser.getUserId() + " 更新成功";
|
||||||
|
} else {
|
||||||
|
String errorMsg = result.getString("error_msg");
|
||||||
|
if(StringUtils.isNotBlank(errorMsg) && errorMsg.contains("not exist")){
|
||||||
|
return faceAdd(bfUser);
|
||||||
|
}
|
||||||
|
return "更新失败:" + bfUser.getUserId() + " ," + result.optString("error_msg");
|
||||||
|
}
|
||||||
|
}else{
|
||||||
|
return "更新失败:图片编码失败";
|
||||||
|
}
|
||||||
|
}catch (Exception e){
|
||||||
|
e.printStackTrace();
|
||||||
|
return "更新异常:"+e.getMessage();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 人脸删除
|
||||||
|
public static String faceDelete(String userId,String groupId) {
|
||||||
|
JSONObject result = BaiduFaceManageUtils.faceDelete(userId,groupId);
|
||||||
|
long errorCode = result.getLong("error_code");
|
||||||
|
if (errorCode==0) {
|
||||||
|
return "删除成功:" + userId + " 删除成功";
|
||||||
|
} else {
|
||||||
|
return "删除失败:" + groupId + " ," + result.optString("error_msg");
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
}
|
}
|
|
@ -11,7 +11,7 @@ public class OcrService {
|
||||||
|
|
||||||
public static final String TOKEN_URL="https://aip.baidubce.com/oauth/2.0/token";
|
public static final String TOKEN_URL="https://aip.baidubce.com/oauth/2.0/token";
|
||||||
public static final String OCR_URL="https://aip.baidubce.com/rest/2.0/ocr/v1/idcard";
|
public static final String OCR_URL="https://aip.baidubce.com/rest/2.0/ocr/v1/idcard";
|
||||||
public static final String APP_ID = "6283230";
|
public static final String APP_ID = "117160042";
|
||||||
public static final String APP_KEY="rS40xCCuGuVNFRopPI0jlMuj";
|
public static final String APP_KEY="rS40xCCuGuVNFRopPI0jlMuj";
|
||||||
public static final String APP_SECRET="3bY7dADqQq3O4UpXpFA1FJAj6LN57QCS";
|
public static final String APP_SECRET="3bY7dADqQq3O4UpXpFA1FJAj6LN57QCS";
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,81 @@
|
||||||
|
package com.yanzhu.common.core.utils.bean;
|
||||||
|
|
||||||
|
import com.alibaba.fastjson2.JSON;
|
||||||
|
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
public class BaiduFaceUserInfo {
|
||||||
|
public BaiduFaceUserInfo(String userId, String userName, String groupId, String image) {
|
||||||
|
this.userId = userId;
|
||||||
|
this.groupId = groupId;
|
||||||
|
this.image = image;
|
||||||
|
this.userInfo=new HashMap<>();
|
||||||
|
this.userInfo.put("userId", userId);
|
||||||
|
this.userInfo.put("userName", userName);
|
||||||
|
this.userInfo.put("projectId", groupId);
|
||||||
|
}
|
||||||
|
|
||||||
|
public BaiduFaceUserInfo(String userId, String groupId, String image) {
|
||||||
|
this.userId = userId;
|
||||||
|
this.groupId = groupId;
|
||||||
|
this.image = image;
|
||||||
|
this.userInfo=new HashMap<>();
|
||||||
|
}
|
||||||
|
|
||||||
|
public BaiduFaceUserInfo() {
|
||||||
|
this.userInfo=new HashMap<>();
|
||||||
|
}
|
||||||
|
|
||||||
|
private String userId;
|
||||||
|
private String groupId;
|
||||||
|
private String image;
|
||||||
|
|
||||||
|
private double similarity;
|
||||||
|
|
||||||
|
public double getSimilarity() {
|
||||||
|
return similarity;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setSimilarity(double similarity) {
|
||||||
|
this.similarity = similarity;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getUserId() {
|
||||||
|
return userId;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setUserId(String userId) {
|
||||||
|
this.userId = userId;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getGroupId() {
|
||||||
|
return groupId;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setGroupId(String groupId) {
|
||||||
|
this.groupId = groupId;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getImage() {
|
||||||
|
return image;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setImage(String image) {
|
||||||
|
this.image = image;
|
||||||
|
}
|
||||||
|
|
||||||
|
private Map<String, Object> userInfo;
|
||||||
|
|
||||||
|
public Map<String, Object> getUserInfo() {
|
||||||
|
return userInfo;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setUserInfo(Map<String, Object> userInfo) {
|
||||||
|
this.userInfo = userInfo;
|
||||||
|
}
|
||||||
|
public String getUserInfoStr() {
|
||||||
|
return JSON.toJSONString(userInfo);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,49 @@
|
||||||
|
package com.yanzhu.services;
|
||||||
|
|
||||||
|
import com.yanzhu.manage.domain.ProProjectInfoSubdeptsUsers;
|
||||||
|
import com.yanzhu.system.api.domain.SysUser;
|
||||||
|
|
||||||
|
public interface IBaiduFaceService {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 系统用户百度人脸识别增加
|
||||||
|
* @param user
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
String addSysUser(SysUser user);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 系统用户百度人脸识别更新
|
||||||
|
* @param user
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
String updateSysUser(SysUser user);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 系统用户百度人脸识别删除
|
||||||
|
* @param userIds
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
String deleteSysUser(Long[] userIds);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 项目用户百度人脸识别更新
|
||||||
|
* @param proProjectInfoSubdeptsUsers
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
String updateProUser(ProProjectInfoSubdeptsUsers proProjectInfoSubdeptsUsers);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 项目用户百度人脸识别删除
|
||||||
|
* @param ids
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
String deleteProUser(Long[] ids);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 项目用户百度人脸识别增加
|
||||||
|
* @param proProjectInfoSubdeptsUsers
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
String addProUser(ProProjectInfoSubdeptsUsers proProjectInfoSubdeptsUsers);
|
||||||
|
}
|
|
@ -0,0 +1,158 @@
|
||||||
|
package com.yanzhu.services.impl;
|
||||||
|
|
||||||
|
|
||||||
|
import com.yanzhu.common.core.utils.BaiduFaceSimilarityUtils;
|
||||||
|
import com.yanzhu.common.core.utils.bean.BaiduFaceUserInfo;
|
||||||
|
import com.yanzhu.common.core.utils.StringUtils;
|
||||||
|
import com.yanzhu.manage.domain.ProProjectInfoSubdeptsUsers;
|
||||||
|
import com.yanzhu.manage.mapper.ProProjectInfoSubdeptsUsersMapper;
|
||||||
|
import com.yanzhu.services.IBaiduFaceService;
|
||||||
|
import com.yanzhu.system.api.domain.SysUser;
|
||||||
|
import com.yanzhu.system.mapper.SysUserMapper;
|
||||||
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
|
import org.springframework.stereotype.Service;
|
||||||
|
|
||||||
|
|
||||||
|
@Service
|
||||||
|
public class BaiduFaceService implements IBaiduFaceService {
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private SysUserMapper sysUserMapper;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private ProProjectInfoSubdeptsUsersMapper proProjectInfoSubdeptsUsersMapper;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 系统用户百度人脸识别增加
|
||||||
|
* @param user
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public String addSysUser(SysUser user) {
|
||||||
|
if(StringUtils.isEmpty(user.getAvatar())){
|
||||||
|
return "失败:无照片";
|
||||||
|
}
|
||||||
|
BaiduFaceUserInfo bfUser = new BaiduFaceUserInfo();
|
||||||
|
bfUser.setUserId("S"+user.getUserId());
|
||||||
|
bfUser.setGroupId("G"+user.getDeptId());
|
||||||
|
bfUser.setImage(user.getAvatar());
|
||||||
|
bfUser.getUserInfo().put("userName", user.getUserName());
|
||||||
|
bfUser.getUserInfo().put("userId", user.getUserId());
|
||||||
|
bfUser.getUserInfo().put("projectId", user.getDeptId());
|
||||||
|
bfUser.getUserInfo().put("phone", user.getPhonenumber());
|
||||||
|
bfUser.getUserInfo().put("cardCode", user.getCardCode());
|
||||||
|
return BaiduFaceSimilarityUtils.faceAdd(bfUser);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 系统用户百度人脸识别更新
|
||||||
|
* @param user
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public String updateSysUser(SysUser user) {
|
||||||
|
if(StringUtils.isEmpty(user.getAvatar())){
|
||||||
|
return "失败:无照片";
|
||||||
|
}
|
||||||
|
SysUser oldUser=sysUserMapper.selectUserByUserId(user.getUserId());
|
||||||
|
if(oldUser==null){
|
||||||
|
return "失败:用户不存在";
|
||||||
|
}
|
||||||
|
if(StringUtils.equals(oldUser.getAvatar(),user.getAvatar())){
|
||||||
|
return "失败:照片未改变";
|
||||||
|
}
|
||||||
|
BaiduFaceUserInfo bfUser = new BaiduFaceUserInfo();
|
||||||
|
bfUser.setUserId("S"+user.getUserId());
|
||||||
|
bfUser.setGroupId("G"+user.getDeptId());
|
||||||
|
bfUser.setImage(user.getAvatar());
|
||||||
|
bfUser.getUserInfo().put("userName", user.getUserName());
|
||||||
|
bfUser.getUserInfo().put("userId", user.getUserId());
|
||||||
|
bfUser.getUserInfo().put("projectId", user.getDeptId());
|
||||||
|
bfUser.getUserInfo().put("phone", user.getPhonenumber());
|
||||||
|
bfUser.getUserInfo().put("cardCode", user.getCardCode());
|
||||||
|
return BaiduFaceSimilarityUtils.faceUpdate(bfUser);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 系统用户百度人脸识别删除
|
||||||
|
* @param userIds
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public String deleteSysUser(Long[] userIds) {
|
||||||
|
for(Long userId:userIds){
|
||||||
|
SysUser user=sysUserMapper.selectUserByUserId(userId);
|
||||||
|
if(user!=null){
|
||||||
|
BaiduFaceSimilarityUtils.faceDelete("S"+user.getUserId(),"G"+user.getDeptId());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return "删除成功";
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 项目用户百度人脸识别增加
|
||||||
|
* @param proProjectInfoSubdeptsUsers
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public String updateProUser(ProProjectInfoSubdeptsUsers proProjectInfoSubdeptsUsers) {
|
||||||
|
if(StringUtils.isEmpty(proProjectInfoSubdeptsUsers.getUserPicture())){
|
||||||
|
return "失败:无照片";
|
||||||
|
}
|
||||||
|
ProProjectInfoSubdeptsUsers oldUser=proProjectInfoSubdeptsUsersMapper.selectProProjectInfoSubdeptsUsersById(proProjectInfoSubdeptsUsers.getId());
|
||||||
|
if(oldUser==null){
|
||||||
|
return "失败:用户不存在";
|
||||||
|
}
|
||||||
|
if(StringUtils.equals(oldUser.getUserPicture(),proProjectInfoSubdeptsUsers.getUserPicture())){
|
||||||
|
return "失败:照片未改变";
|
||||||
|
}
|
||||||
|
BaiduFaceUserInfo bfUser = new BaiduFaceUserInfo();
|
||||||
|
bfUser.setUserId("P"+proProjectInfoSubdeptsUsers.getUserId());
|
||||||
|
bfUser.setGroupId("G"+proProjectInfoSubdeptsUsers.getProjectId());
|
||||||
|
bfUser.setImage(proProjectInfoSubdeptsUsers.getUserPicture());
|
||||||
|
bfUser.getUserInfo().put("userName", proProjectInfoSubdeptsUsers.getUserName());
|
||||||
|
bfUser.getUserInfo().put("userId", proProjectInfoSubdeptsUsers.getUserId());
|
||||||
|
bfUser.getUserInfo().put("projectId", proProjectInfoSubdeptsUsers.getProjectId());
|
||||||
|
bfUser.getUserInfo().put("phone", proProjectInfoSubdeptsUsers.getUserPhone());
|
||||||
|
bfUser.getUserInfo().put("cardCode", proProjectInfoSubdeptsUsers.getCardCode());
|
||||||
|
return BaiduFaceSimilarityUtils.faceUpdate(bfUser);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 项目用户百度人脸识别删除
|
||||||
|
* @param userIds
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public String deleteProUser(Long[] userIds) {
|
||||||
|
for(Long userId:userIds){
|
||||||
|
ProProjectInfoSubdeptsUsers user=proProjectInfoSubdeptsUsersMapper.selectProProjectInfoSubdeptsUsersById(userId);
|
||||||
|
if(user!=null){
|
||||||
|
BaiduFaceSimilarityUtils.faceDelete("P"+user.getUserId(),"G"+user.getProjectId());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return "删除成功";
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 项目用户百度人脸识别增加
|
||||||
|
* @param proProjectInfoSubdeptsUsers
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public String addProUser(ProProjectInfoSubdeptsUsers proProjectInfoSubdeptsUsers) {
|
||||||
|
if(StringUtils.isEmpty(proProjectInfoSubdeptsUsers.getUserPicture())){
|
||||||
|
return "失败:无照片";
|
||||||
|
}
|
||||||
|
BaiduFaceUserInfo bfUser = new BaiduFaceUserInfo();
|
||||||
|
bfUser.setUserId("P"+proProjectInfoSubdeptsUsers.getUserId());
|
||||||
|
bfUser.setGroupId("G"+proProjectInfoSubdeptsUsers.getProjectId());
|
||||||
|
bfUser.setImage(proProjectInfoSubdeptsUsers.getUserPicture());
|
||||||
|
bfUser.getUserInfo().put("userName", proProjectInfoSubdeptsUsers.getUserName());
|
||||||
|
bfUser.getUserInfo().put("userId", proProjectInfoSubdeptsUsers.getUserId());
|
||||||
|
bfUser.getUserInfo().put("projectId", proProjectInfoSubdeptsUsers.getProjectId());
|
||||||
|
bfUser.getUserInfo().put("phone", proProjectInfoSubdeptsUsers.getUserPhone());
|
||||||
|
bfUser.getUserInfo().put("cardCode", proProjectInfoSubdeptsUsers.getCardCode());
|
||||||
|
return BaiduFaceSimilarityUtils.faceAdd(bfUser);
|
||||||
|
}
|
||||||
|
}
|
|
@ -165,6 +165,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
|
||||||
<select id="selectProProjectInfoSubdeptsUsersByParamId" resultMap="ProProjectInfoSubdeptsUsersResult">
|
<select id="selectProProjectInfoSubdeptsUsersByParamId" resultMap="ProProjectInfoSubdeptsUsersResult">
|
||||||
<include refid="selectProProjectInfoSubdeptsUsersVo"/>
|
<include refid="selectProProjectInfoSubdeptsUsersVo"/>
|
||||||
where psu.project_id = #{proId} and psu.user_id = #{userId}
|
where psu.project_id = #{proId} and psu.user_id = #{userId}
|
||||||
|
order by ifnull(psu.update_time, date('2099-12-31')) desc,psu.create_time desc
|
||||||
|
limit 1
|
||||||
</select>
|
</select>
|
||||||
|
|
||||||
<insert id="insertProProjectInfoSubdeptsUsers" parameterType="ProProjectInfoSubdeptsUsers" useGeneratedKeys="true" keyProperty="id">
|
<insert id="insertProProjectInfoSubdeptsUsers" parameterType="ProProjectInfoSubdeptsUsers" useGeneratedKeys="true" keyProperty="id">
|
||||||
|
|
|
@ -7,6 +7,7 @@ import net.hasor.spring.boot.EnableHasor;
|
||||||
import net.hasor.spring.boot.EnableHasorWeb;
|
import net.hasor.spring.boot.EnableHasorWeb;
|
||||||
import org.springframework.boot.SpringApplication;
|
import org.springframework.boot.SpringApplication;
|
||||||
import org.springframework.boot.autoconfigure.SpringBootApplication;
|
import org.springframework.boot.autoconfigure.SpringBootApplication;
|
||||||
|
import org.springframework.context.annotation.ComponentScan;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 业务模块
|
* 业务模块
|
||||||
|
@ -17,6 +18,7 @@ import org.springframework.boot.autoconfigure.SpringBootApplication;
|
||||||
@EnableCustomSwagger2
|
@EnableCustomSwagger2
|
||||||
@EnableRyFeignClients
|
@EnableRyFeignClients
|
||||||
@SpringBootApplication
|
@SpringBootApplication
|
||||||
|
@ComponentScan(basePackages = {"com.yanzhu"})
|
||||||
@EnableHasor()
|
@EnableHasor()
|
||||||
@EnableHasorWeb()
|
@EnableHasorWeb()
|
||||||
public class YanZhuManageApplication
|
public class YanZhuManageApplication
|
||||||
|
|
|
@ -4,7 +4,9 @@ import java.util.List;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import javax.servlet.http.HttpServletResponse;
|
import javax.servlet.http.HttpServletResponse;
|
||||||
|
|
||||||
|
import cn.hutool.core.util.NumberUtil;
|
||||||
import com.yanzhu.common.core.utils.BaiduFaceSimilarityUtils;
|
import com.yanzhu.common.core.utils.BaiduFaceSimilarityUtils;
|
||||||
|
import com.yanzhu.common.core.utils.bean.BaiduFaceUserInfo;
|
||||||
import com.yanzhu.common.core.utils.poi.ExcelUtil;
|
import com.yanzhu.common.core.utils.poi.ExcelUtil;
|
||||||
import com.yanzhu.common.core.web.controller.BaseController;
|
import com.yanzhu.common.core.web.controller.BaseController;
|
||||||
import com.yanzhu.common.core.web.domain.AjaxResult;
|
import com.yanzhu.common.core.web.domain.AjaxResult;
|
||||||
|
@ -129,17 +131,13 @@ public class ProMobileAttendanceConfigController extends BaseController
|
||||||
@PostMapping("/attendance")
|
@PostMapping("/attendance")
|
||||||
public AjaxResult attendance(@RequestBody ProMobileAttendanceData attData){
|
public AjaxResult attendance(@RequestBody ProMobileAttendanceData attData){
|
||||||
//根据用户上传的照片与用户信息的照片计算相似度
|
//根据用户上传的照片与用户信息的照片计算相似度
|
||||||
String userPicture =attData.getBasePath()+ attData.getUserPicture();
|
String attImg=attData.getAttImg();
|
||||||
String attImg=attData.getBasePath()+attData.getAttImg();
|
double threshold=BaiduFaceSimilarityUtils.SIMILARITY_THRESHOLD;
|
||||||
|
BaiduFaceUserInfo baiduFaceUserInfo=BaiduFaceSimilarityUtils.findFaceSimilarityWithFaceLibrary(attImg,"G"+attData.getProjectId());
|
||||||
// 使用专门为人脸识别考勤优化的相似度计算
|
double similarity =baiduFaceUserInfo!=null? baiduFaceUserInfo.getSimilarity():0;
|
||||||
double similarity = BaiduFaceSimilarityUtils.calculateFaceSimilarity(userPicture, attImg);
|
if (baiduFaceUserInfo!=null) {
|
||||||
System.out.println("相似度:"+similarity);
|
|
||||||
|
|
||||||
double threshold = BaiduFaceSimilarityUtils.SIMILARITY_THRESHOLD;
|
|
||||||
|
|
||||||
if (similarity >= threshold) {
|
|
||||||
// 相似度达标,允许考勤
|
// 相似度达标,允许考勤
|
||||||
|
attData.setUserId(NumberUtil.parseLong(baiduFaceUserInfo.getUserInfo().get("userId").toString()));
|
||||||
int cnt=attendanceUbiDataService.addMobiileAttendanceData(attData);
|
int cnt=attendanceUbiDataService.addMobiileAttendanceData(attData);
|
||||||
attData.setAttDevice("mobile");
|
attData.setAttDevice("mobile");
|
||||||
cnt+=proMobileAttendanceDataService.insertProMobileAttendanceData(attData);
|
cnt+=proMobileAttendanceDataService.insertProMobileAttendanceData(attData);
|
||||||
|
|
|
@ -8,7 +8,6 @@ import com.yanzhu.manage.domain.ProCostOutput;
|
||||||
import com.yanzhu.manage.mapper.ProCostOutputMapper;
|
import com.yanzhu.manage.mapper.ProCostOutputMapper;
|
||||||
import com.yanzhu.manage.service.IProCostOutputService;
|
import com.yanzhu.manage.service.IProCostOutputService;
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
import org.springframework.boot.actuate.web.mappings.MappingsEndpoint;
|
|
||||||
import org.springframework.stereotype.Service;
|
import org.springframework.stereotype.Service;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -22,8 +21,7 @@ public class ProCostOutputServiceImpl implements IProCostOutputService
|
||||||
{
|
{
|
||||||
@Autowired
|
@Autowired
|
||||||
private ProCostOutputMapper proCostOutputMapper;
|
private ProCostOutputMapper proCostOutputMapper;
|
||||||
@Autowired
|
|
||||||
private MappingsEndpoint mappingsEndpoint;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 查询项目成本产值
|
* 查询项目成本产值
|
||||||
|
|
|
@ -23,6 +23,7 @@ import com.yanzhu.manage.utils.pdf.FileUtil;
|
||||||
import com.yanzhu.manage.utils.pdf.PdfImageSignetUtil;
|
import com.yanzhu.manage.utils.pdf.PdfImageSignetUtil;
|
||||||
import com.yanzhu.manage.utils.pdf.PoiUtil;
|
import com.yanzhu.manage.utils.pdf.PoiUtil;
|
||||||
import com.yanzhu.security.utils.DictUtils;
|
import com.yanzhu.security.utils.DictUtils;
|
||||||
|
import com.yanzhu.services.IBaiduFaceService;
|
||||||
import com.yanzhu.system.api.RemoteFlowService;
|
import com.yanzhu.system.api.RemoteFlowService;
|
||||||
import com.yanzhu.system.api.RemoteUserService;
|
import com.yanzhu.system.api.RemoteUserService;
|
||||||
import com.yanzhu.system.api.domain.SysUser;
|
import com.yanzhu.system.api.domain.SysUser;
|
||||||
|
@ -90,6 +91,8 @@ public class ProProjectInfoSubdeptsUsersServiceImpl implements IProProjectInfoSu
|
||||||
@Autowired
|
@Autowired
|
||||||
private IProUserInoutRecordService iProUserInoutRecordService;
|
private IProUserInoutRecordService iProUserInoutRecordService;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private IBaiduFaceService baiduFaceService;
|
||||||
|
|
||||||
|
|
||||||
private static final Logger log = LoggerFactory.getLogger(ProProjectInfoSubdeptsUsersServiceImpl.class);
|
private static final Logger log = LoggerFactory.getLogger(ProProjectInfoSubdeptsUsersServiceImpl.class);
|
||||||
|
@ -156,6 +159,7 @@ public class ProProjectInfoSubdeptsUsersServiceImpl implements IProProjectInfoSu
|
||||||
proProjectInfoSubdeptsUsers.setSubDeptName(proProjectInfo.getProjectName());
|
proProjectInfoSubdeptsUsers.setSubDeptName(proProjectInfo.getProjectName());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
baiduFaceService.addProUser(proProjectInfoSubdeptsUsers);
|
||||||
return proProjectInfoSubdeptsUsersMapper.insertProProjectInfoSubdeptsUsers(proProjectInfoSubdeptsUsers);
|
return proProjectInfoSubdeptsUsersMapper.insertProProjectInfoSubdeptsUsers(proProjectInfoSubdeptsUsers);
|
||||||
}
|
}
|
||||||
/**
|
/**
|
||||||
|
@ -279,7 +283,7 @@ public class ProProjectInfoSubdeptsUsersServiceImpl implements IProProjectInfoSu
|
||||||
FileUtil.copyFile(file,new File(savePath));
|
FileUtil.copyFile(file,new File(savePath));
|
||||||
}
|
}
|
||||||
proProjectInfoSubdeptsUsers.setQrCode(profilePath);
|
proProjectInfoSubdeptsUsers.setQrCode(profilePath);
|
||||||
proProjectInfoSubdeptsUsersMapper.updateProProjectInfoSubdeptsUsers(proProjectInfoSubdeptsUsers);
|
updateProjectInfoSubdeptsUsers(proProjectInfoSubdeptsUsers);
|
||||||
}catch (Exception e){
|
}catch (Exception e){
|
||||||
log.error(e.getMessage());
|
log.error(e.getMessage());
|
||||||
}
|
}
|
||||||
|
@ -348,7 +352,7 @@ public class ProProjectInfoSubdeptsUsersServiceImpl implements IProProjectInfoSu
|
||||||
deptUser.setUserPicture(proProjectInfoSubdeptsUsers.getUserPicture());
|
deptUser.setUserPicture(proProjectInfoSubdeptsUsers.getUserPicture());
|
||||||
deptUser.setUpdateBy(SecurityUtils.getUsername());
|
deptUser.setUpdateBy(SecurityUtils.getUsername());
|
||||||
deptUser.setUpdateTime(DateUtils.getNowDate());
|
deptUser.setUpdateTime(DateUtils.getNowDate());
|
||||||
proProjectInfoSubdeptsUsersMapper.updateProProjectInfoSubdeptsUsers(deptUser);
|
updateProjectInfoSubdeptsUsers(deptUser);
|
||||||
/**
|
/**
|
||||||
* 考勤需要信息改变时推送信息...
|
* 考勤需要信息改变时推送信息...
|
||||||
*/
|
*/
|
||||||
|
@ -383,7 +387,7 @@ public class ProProjectInfoSubdeptsUsersServiceImpl implements IProProjectInfoSu
|
||||||
if(oldUserData.getApproveStatus()==ApproveStatus.refuse.getCode()){
|
if(oldUserData.getApproveStatus()==ApproveStatus.refuse.getCode()){
|
||||||
// 删除用户冗余数据...
|
// 删除用户冗余数据...
|
||||||
oldUserData.setIsDel(IsDelEnums.DEL.getCode());
|
oldUserData.setIsDel(IsDelEnums.DEL.getCode());
|
||||||
proProjectInfoSubdeptsUsersMapper.updateProProjectInfoSubdeptsUsers(oldUserData);
|
updateProjectInfoSubdeptsUsers(oldUserData);
|
||||||
}else{
|
}else{
|
||||||
throw new ServiceException("手机号码已存在");
|
throw new ServiceException("手机号码已存在");
|
||||||
}
|
}
|
||||||
|
@ -707,14 +711,14 @@ public class ProProjectInfoSubdeptsUsersServiceImpl implements IProProjectInfoSu
|
||||||
FileUtil.copyFile(file,new File(savePath));
|
FileUtil.copyFile(file,new File(savePath));
|
||||||
}
|
}
|
||||||
proProjectInfoSubdeptsUsers.setQrCode(profilePath);
|
proProjectInfoSubdeptsUsers.setQrCode(profilePath);
|
||||||
return proProjectInfoSubdeptsUsersMapper.updateProProjectInfoSubdeptsUsers(proProjectInfoSubdeptsUsers);
|
return updateProjectInfoSubdeptsUsers(proProjectInfoSubdeptsUsers);
|
||||||
}catch (Exception e){
|
}catch (Exception e){
|
||||||
log.error(e.getMessage());
|
log.error(e.getMessage());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return proProjectInfoSubdeptsUsersMapper.updateProProjectInfoSubdeptsUsers(proProjectInfoSubdeptsUsers);
|
return updateProjectInfoSubdeptsUsers(proProjectInfoSubdeptsUsers);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -750,7 +754,7 @@ public class ProProjectInfoSubdeptsUsersServiceImpl implements IProProjectInfoSu
|
||||||
}
|
}
|
||||||
user.setUseStatus(status);
|
user.setUseStatus(status);
|
||||||
iProUserInoutRecordService.addRecord(user);
|
iProUserInoutRecordService.addRecord(user);
|
||||||
return proProjectInfoSubdeptsUsersMapper.updateProProjectInfoSubdeptsUsers(user);
|
return updateProjectInfoSubdeptsUsers(user);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -994,10 +998,14 @@ public class ProProjectInfoSubdeptsUsersServiceImpl implements IProProjectInfoSu
|
||||||
sysUser.setActiveProjectId(proProjectInfoSubdeptsUsers.getProjectId());
|
sysUser.setActiveProjectId(proProjectInfoSubdeptsUsers.getProjectId());
|
||||||
remoteUserService.registerUserInfo(sysUser, SecurityConstants.INNER);
|
remoteUserService.registerUserInfo(sysUser, SecurityConstants.INNER);
|
||||||
|
|
||||||
proProjectInfoSubdeptsUsersMapper.updateProProjectInfoSubdeptsUsers(proProjectInfoSubdeptsUsers);
|
updateProjectInfoSubdeptsUsers(proProjectInfoSubdeptsUsers);
|
||||||
return proProjectInfoSubdeptsUsers;
|
return proProjectInfoSubdeptsUsers;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public int updateProjectInfoSubdeptsUsers(ProProjectInfoSubdeptsUsers proProjectInfoSubdeptsUsers){
|
||||||
|
baiduFaceService.updateProUser(proProjectInfoSubdeptsUsers);
|
||||||
|
return proProjectInfoSubdeptsUsersMapper.updateProProjectInfoSubdeptsUsers(proProjectInfoSubdeptsUsers);
|
||||||
|
}
|
||||||
/**
|
/**
|
||||||
* 批量删除分包单位工人
|
* 批量删除分包单位工人
|
||||||
*
|
*
|
||||||
|
@ -1010,6 +1018,7 @@ public class ProProjectInfoSubdeptsUsersServiceImpl implements IProProjectInfoSu
|
||||||
for(Long id:ids){
|
for(Long id:ids){
|
||||||
uniService.syncUserRevoke(id);
|
uniService.syncUserRevoke(id);
|
||||||
}
|
}
|
||||||
|
baiduFaceService.deleteProUser(ids);
|
||||||
return proProjectInfoSubdeptsUsersMapper.deleteProProjectInfoSubdeptsUsersByIds(ids);
|
return proProjectInfoSubdeptsUsersMapper.deleteProProjectInfoSubdeptsUsersByIds(ids);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1023,6 +1032,7 @@ public class ProProjectInfoSubdeptsUsersServiceImpl implements IProProjectInfoSu
|
||||||
public int deleteProProjectInfoSubdeptsUsersById(Long id)
|
public int deleteProProjectInfoSubdeptsUsersById(Long id)
|
||||||
{
|
{
|
||||||
uniService.syncUserRevoke(id);
|
uniService.syncUserRevoke(id);
|
||||||
|
baiduFaceService.deleteProUser(new Long[]{id});
|
||||||
return proProjectInfoSubdeptsUsersMapper.deleteProProjectInfoSubdeptsUsersById(id);
|
return proProjectInfoSubdeptsUsersMapper.deleteProProjectInfoSubdeptsUsersById(id);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1130,7 +1140,7 @@ public class ProProjectInfoSubdeptsUsersServiceImpl implements IProProjectInfoSu
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
int res = proProjectInfoSubdeptsUsersMapper.updateProProjectInfoSubdeptsUsers(proSubdeptsUser);
|
int res = updateProjectInfoSubdeptsUsers(proSubdeptsUser);
|
||||||
|
|
||||||
// 保存业务签名
|
// 保存业务签名
|
||||||
basSignetMapper.deleteBasSignetByParams(proSubdeptsUser.getProjectId(),proSubdeptsUser.getUserId());
|
basSignetMapper.deleteBasSignetByParams(proSubdeptsUser.getProjectId(),proSubdeptsUser.getUserId());
|
||||||
|
@ -1286,7 +1296,7 @@ public class ProProjectInfoSubdeptsUsersServiceImpl implements IProProjectInfoSu
|
||||||
proProjectInfoSubdeptsUsers.setUseStatus(UseStateEnums.IN.getCode());
|
proProjectInfoSubdeptsUsers.setUseStatus(UseStateEnums.IN.getCode());
|
||||||
proProjectInfoSubdeptsUsers.setUseDate(DateUtils.getNowDate());
|
proProjectInfoSubdeptsUsers.setUseDate(DateUtils.getNowDate());
|
||||||
proProjectInfoSubdeptsUsers.setApproveStatus(ApproveStatus.exempt.getCode());
|
proProjectInfoSubdeptsUsers.setApproveStatus(ApproveStatus.exempt.getCode());
|
||||||
proProjectInfoSubdeptsUsersMapper.updateProProjectInfoSubdeptsUsers(proProjectInfoSubdeptsUsers);
|
updateProjectInfoSubdeptsUsers(proProjectInfoSubdeptsUsers);
|
||||||
// 人员入场信息
|
// 人员入场信息
|
||||||
uniService.syncUniUser(proProjectInfoSubdeptsUsers,true);
|
uniService.syncUniUser(proProjectInfoSubdeptsUsers,true);
|
||||||
}
|
}
|
||||||
|
@ -1324,7 +1334,7 @@ public class ProProjectInfoSubdeptsUsersServiceImpl implements IProProjectInfoSu
|
||||||
}
|
}
|
||||||
if(flag){
|
if(flag){
|
||||||
proProjectInfoSubdeptsUsers.setEduFilePath(newFilePath.replace(ProfileConfig.profilePath,ProfileConfig.profile));
|
proProjectInfoSubdeptsUsers.setEduFilePath(newFilePath.replace(ProfileConfig.profilePath,ProfileConfig.profile));
|
||||||
proProjectInfoSubdeptsUsersMapper.updateProProjectInfoSubdeptsUsers(proProjectInfoSubdeptsUsers);
|
updateProjectInfoSubdeptsUsers(proProjectInfoSubdeptsUsers);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1360,7 +1370,7 @@ public class ProProjectInfoSubdeptsUsersServiceImpl implements IProProjectInfoSu
|
||||||
}
|
}
|
||||||
if(flag){
|
if(flag){
|
||||||
proProjectInfoSubdeptsUsers.setEduFilePath(newFilePath.replace(ProfileConfig.profilePath,ProfileConfig.profile));
|
proProjectInfoSubdeptsUsers.setEduFilePath(newFilePath.replace(ProfileConfig.profilePath,ProfileConfig.profile));
|
||||||
proProjectInfoSubdeptsUsersMapper.updateProProjectInfoSubdeptsUsers(proProjectInfoSubdeptsUsers);
|
updateProjectInfoSubdeptsUsers(proProjectInfoSubdeptsUsers);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1396,7 +1406,7 @@ public class ProProjectInfoSubdeptsUsersServiceImpl implements IProProjectInfoSu
|
||||||
}
|
}
|
||||||
if(flag){
|
if(flag){
|
||||||
proProjectInfoSubdeptsUsers.setEduFilePath(newFilePath.replace(ProfileConfig.profilePath,ProfileConfig.profile));
|
proProjectInfoSubdeptsUsers.setEduFilePath(newFilePath.replace(ProfileConfig.profilePath,ProfileConfig.profile));
|
||||||
proProjectInfoSubdeptsUsersMapper.updateProProjectInfoSubdeptsUsers(proProjectInfoSubdeptsUsers);
|
updateProjectInfoSubdeptsUsers(proProjectInfoSubdeptsUsers);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1483,7 +1493,7 @@ public class ProProjectInfoSubdeptsUsersServiceImpl implements IProProjectInfoSu
|
||||||
try {
|
try {
|
||||||
ProProjectInfoSubdeptsUsers proProjectInfoSubdeptsUsers = proProjectInfoSubdeptsUsersMapper.selectProProjectInfoSubdeptsUsersById(proUserId);
|
ProProjectInfoSubdeptsUsers proProjectInfoSubdeptsUsers = proProjectInfoSubdeptsUsersMapper.selectProProjectInfoSubdeptsUsersById(proUserId);
|
||||||
proProjectInfoSubdeptsUsers.setApproveStatus(ApproveStatus.refuse.getCode());
|
proProjectInfoSubdeptsUsers.setApproveStatus(ApproveStatus.refuse.getCode());
|
||||||
proProjectInfoSubdeptsUsersMapper.updateProProjectInfoSubdeptsUsers(proProjectInfoSubdeptsUsers);
|
updateProjectInfoSubdeptsUsers(proProjectInfoSubdeptsUsers);
|
||||||
}catch (Exception e){
|
}catch (Exception e){
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
}
|
}
|
||||||
|
@ -1578,7 +1588,7 @@ public class ProProjectInfoSubdeptsUsersServiceImpl implements IProProjectInfoSu
|
||||||
if(res>0){
|
if(res>0){
|
||||||
ProProjectInfoSubdeptsUsers proProjectInfoSubdeptsUsers = proProjectInfoSubdeptsUsersMapper.selectProProjectInfoSubdeptsUsersByParamId(id,userId);
|
ProProjectInfoSubdeptsUsers proProjectInfoSubdeptsUsers = proProjectInfoSubdeptsUsersMapper.selectProProjectInfoSubdeptsUsersByParamId(id,userId);
|
||||||
proProjectInfoSubdeptsUsers.setSortBy(0L);
|
proProjectInfoSubdeptsUsers.setSortBy(0L);
|
||||||
res = proProjectInfoSubdeptsUsersMapper.updateProProjectInfoSubdeptsUsers(proProjectInfoSubdeptsUsers);
|
res = updateProjectInfoSubdeptsUsers(proProjectInfoSubdeptsUsers);
|
||||||
}
|
}
|
||||||
boolean isAdmin= (SecurityUtils.isAdmin(userId) || SecurityUtils.isGSAdmin());
|
boolean isAdmin= (SecurityUtils.isAdmin(userId) || SecurityUtils.isGSAdmin());
|
||||||
|
|
||||||
|
@ -1709,7 +1719,7 @@ public class ProProjectInfoSubdeptsUsersServiceImpl implements IProProjectInfoSu
|
||||||
}
|
}
|
||||||
if(flag){
|
if(flag){
|
||||||
proProjectInfoSubdeptsUsers.setEduFilePath(newFilePath.replace(ProfileConfig.profilePath,ProfileConfig.profile));
|
proProjectInfoSubdeptsUsers.setEduFilePath(newFilePath.replace(ProfileConfig.profilePath,ProfileConfig.profile));
|
||||||
proProjectInfoSubdeptsUsersMapper.updateProProjectInfoSubdeptsUsers(proProjectInfoSubdeptsUsers);
|
updateProjectInfoSubdeptsUsers(proProjectInfoSubdeptsUsers);
|
||||||
}
|
}
|
||||||
}else{
|
}else{
|
||||||
throw new ServiceException("未查询三级安全教育主管签名信息...");
|
throw new ServiceException("未查询三级安全教育主管签名信息...");
|
||||||
|
|
|
@ -5,6 +5,7 @@ import org.springframework.boot.autoconfigure.SpringBootApplication;
|
||||||
import com.yanzhu.common.security.annotation.EnableCustomConfig;
|
import com.yanzhu.common.security.annotation.EnableCustomConfig;
|
||||||
import com.yanzhu.common.security.annotation.EnableRyFeignClients;
|
import com.yanzhu.common.security.annotation.EnableRyFeignClients;
|
||||||
import com.yanzhu.common.swagger.annotation.EnableCustomSwagger2;
|
import com.yanzhu.common.swagger.annotation.EnableCustomSwagger2;
|
||||||
|
import org.springframework.context.annotation.ComponentScan;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 系统模块
|
* 系统模块
|
||||||
|
@ -14,6 +15,7 @@ import com.yanzhu.common.swagger.annotation.EnableCustomSwagger2;
|
||||||
@EnableCustomConfig
|
@EnableCustomConfig
|
||||||
@EnableCustomSwagger2
|
@EnableCustomSwagger2
|
||||||
@EnableRyFeignClients
|
@EnableRyFeignClients
|
||||||
|
@ComponentScan(basePackages = {"com.yanzhu"})
|
||||||
@SpringBootApplication
|
@SpringBootApplication
|
||||||
public class YanZhuSystemApplication
|
public class YanZhuSystemApplication
|
||||||
{
|
{
|
||||||
|
|
|
@ -19,6 +19,7 @@ import com.yanzhu.common.security.service.TokenService;
|
||||||
import com.yanzhu.common.security.utils.SecurityUtils;
|
import com.yanzhu.common.security.utils.SecurityUtils;
|
||||||
import com.yanzhu.manage.domain.AttendanceCfg;
|
import com.yanzhu.manage.domain.AttendanceCfg;
|
||||||
import com.yanzhu.manage.mapper.AttendanceCfgMapper;
|
import com.yanzhu.manage.mapper.AttendanceCfgMapper;
|
||||||
|
import com.yanzhu.services.IBaiduFaceService;
|
||||||
import com.yanzhu.system.api.domain.SysDept;
|
import com.yanzhu.system.api.domain.SysDept;
|
||||||
import com.yanzhu.system.api.domain.SysRole;
|
import com.yanzhu.system.api.domain.SysRole;
|
||||||
import com.yanzhu.system.api.domain.SysUser;
|
import com.yanzhu.system.api.domain.SysUser;
|
||||||
|
@ -77,6 +78,8 @@ public class SysUserController extends BaseController {
|
||||||
@Autowired
|
@Autowired
|
||||||
private AttendanceCfgMapper attendanceCfgMapper;
|
private AttendanceCfgMapper attendanceCfgMapper;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private IBaiduFaceService baiduFaceService;
|
||||||
/**
|
/**
|
||||||
* 获取用户列表
|
* 获取用户列表
|
||||||
*/
|
*/
|
||||||
|
@ -377,7 +380,9 @@ public class SysUserController extends BaseController {
|
||||||
}*/
|
}*/
|
||||||
user.setCreateBy(SecurityUtils.getUsername());
|
user.setCreateBy(SecurityUtils.getUsername());
|
||||||
user.setPassword(SecurityUtils.encryptPassword(user.getPassword()));
|
user.setPassword(SecurityUtils.encryptPassword(user.getPassword()));
|
||||||
return toAjax(userService.insertUser(user));
|
AjaxResult result= toAjax(userService.insertUser(user));
|
||||||
|
baiduFaceService.addSysUser(user);
|
||||||
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -386,7 +391,9 @@ public class SysUserController extends BaseController {
|
||||||
@Log(title = "用户管理", businessType = BusinessType.INSERT)
|
@Log(title = "用户管理", businessType = BusinessType.INSERT)
|
||||||
@PostMapping("/addUser")
|
@PostMapping("/addUser")
|
||||||
public AjaxResult addUser(@Validated @RequestBody SysUser user) {
|
public AjaxResult addUser(@Validated @RequestBody SysUser user) {
|
||||||
return toAjax(userService.insertUserWx(user));
|
AjaxResult result= toAjax(userService.insertUserWx(user));
|
||||||
|
baiduFaceService.addSysUser(user);
|
||||||
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
@GetMapping("/getUserByName/{userName}")
|
@GetMapping("/getUserByName/{userName}")
|
||||||
|
@ -409,6 +416,7 @@ public class SysUserController extends BaseController {
|
||||||
return error("修改用户'" + user.getUserName() + "'失败,邮箱账号已存在");
|
return error("修改用户'" + user.getUserName() + "'失败,邮箱账号已存在");
|
||||||
}
|
}
|
||||||
user.setUpdateBy(SecurityUtils.getUsername());
|
user.setUpdateBy(SecurityUtils.getUsername());
|
||||||
|
baiduFaceService.updateSysUser(user);
|
||||||
return toAjax(userService.updateUser(user));
|
return toAjax(userService.updateUser(user));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -422,6 +430,7 @@ public class SysUserController extends BaseController {
|
||||||
if (ArrayUtils.contains(userIds, SecurityUtils.getUserId())) {
|
if (ArrayUtils.contains(userIds, SecurityUtils.getUserId())) {
|
||||||
return error("当前用户不能删除");
|
return error("当前用户不能删除");
|
||||||
}
|
}
|
||||||
|
baiduFaceService.deleteSysUser(userIds);
|
||||||
return toAjax(userService.deleteUserByIds(userIds));
|
return toAjax(userService.deleteUserByIds(userIds));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -30,7 +30,7 @@ Page({
|
||||||
uuid: "",
|
uuid: "",
|
||||||
codeUrl: "",
|
codeUrl: "",
|
||||||
checked: true,
|
checked: true,
|
||||||
logo: config.baseImgUrl + "/cdn/app_logo.png",
|
logo: config.baseImgUrl + "/cdn/app_logo.png?v=20250922",
|
||||||
},
|
},
|
||||||
|
|
||||||
//获取填写的账号信息
|
//获取填写的账号信息
|
||||||
|
|
Loading…
Reference in New Issue