From 621e3e4b594c1452e0136e2310c3bcec9396ed07 Mon Sep 17 00:00:00 2001 From: "lj7788@126.com" Date: Wed, 24 Sep 2025 17:29:41 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E7=99=BE=E5=BA=A6=E4=BA=BA?= =?UTF-8?q?=E8=84=B8=E5=AF=B9=E6=AF=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../core/config/BaiduFaceProperties.java | 19 +- .../core/utils/BaiduFaceManageUtils.java | 344 ++++++++++++++++++ .../core/utils/BaiduFaceSimilarityUtils.java | 285 ++++++++++++++- .../yanzhu/common/core/utils/OcrService.java | 2 +- .../core/utils/bean/BaiduFaceUserInfo.java | 81 +++++ .../yanzhu/services/IBaiduFaceService.java | 49 +++ .../services/impl/BaiduFaceService.java | 158 ++++++++ .../ProProjectInfoSubdeptsUsersMapper.xml | 2 + .../manage/YanZhuManageApplication.java | 2 + .../ProMobileAttendanceConfigController.java | 18 +- .../impl/ProCostOutputServiceImpl.java | 4 +- ...roProjectInfoSubdeptsUsersServiceImpl.java | 40 +- .../system/YanZhuSystemApplication.java | 2 + .../system/controller/SysUserController.java | 13 +- .../miniprogram/pages/login/login.js | 2 +- 15 files changed, 978 insertions(+), 43 deletions(-) create mode 100644 yanzhu-common/yanzhu-common-core/src/main/java/com/yanzhu/common/core/utils/BaiduFaceManageUtils.java create mode 100644 yanzhu-common/yanzhu-common-core/src/main/java/com/yanzhu/common/core/utils/bean/BaiduFaceUserInfo.java create mode 100644 yanzhu-common/yanzhu-common-mapper/src/main/java/com/yanzhu/services/IBaiduFaceService.java create mode 100644 yanzhu-common/yanzhu-common-mapper/src/main/java/com/yanzhu/services/impl/BaiduFaceService.java diff --git a/yanzhu-common/yanzhu-common-core/src/main/java/com/yanzhu/common/core/config/BaiduFaceProperties.java b/yanzhu-common/yanzhu-common-core/src/main/java/com/yanzhu/common/core/config/BaiduFaceProperties.java index 640491e5..716c1534 100644 --- a/yanzhu-common/yanzhu-common-core/src/main/java/com/yanzhu/common/core/config/BaiduFaceProperties.java +++ b/yanzhu-common/yanzhu-common-core/src/main/java/com/yanzhu/common/core/config/BaiduFaceProperties.java @@ -11,21 +11,22 @@ import org.springframework.context.annotation.Configuration; @Configuration @ConfigurationProperties(prefix = "baidu.face") public class BaiduFaceProperties { - + + private String imgUrl="https://xiangguan.sxyanzhu.com"; /** * 百度人脸识别应用的App ID */ - private String appId = "7034646"; + private String appId = "119949649";//"117160042";// /** * 百度人脸识别应用的API Key */ - private String apiKey = "L3PiEzO9dMFJDExMTjOxuTtq"; + private String apiKey = "L3PiEzO9dMFJDExMTjOxuTtq";//"rS40xCCuGuVNFRopPI0jlMuj";// /** * 百度人脸识别应用的Secret Key */ - private String secretKey = "40LMey6WC1MYIqLU4m5Qe8K4foFUM1bc"; + private String secretKey ="40LMey6WC1MYIqLU4m5Qe8K4foFUM1bc" ;//"3bY7dADqQq3O4UpXpFA1FJAj6LN57QCS";// /** * 相似度阈值,大于此值认为是同一个人 @@ -48,7 +49,15 @@ public class BaiduFaceProperties { private int retryDelay = 2000; // Getter和Setter方法 - + + public String getImgUrl() { + return imgUrl; + } + + public void setImgUrl(String imgUrl) { + this.imgUrl = imgUrl; + } + public String getAppId() { return appId; } diff --git a/yanzhu-common/yanzhu-common-core/src/main/java/com/yanzhu/common/core/utils/BaiduFaceManageUtils.java b/yanzhu-common/yanzhu-common-core/src/main/java/com/yanzhu/common/core/utils/BaiduFaceManageUtils.java new file mode 100644 index 00000000..a760a44f --- /dev/null +++ b/yanzhu-common/yanzhu-common-core/src/main/java/com/yanzhu/common/core/utils/BaiduFaceManageUtils.java @@ -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 options = new HashMap(); + 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 options = new HashMap(); + 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 options = new HashMap(); + + // 调用百度人脸识别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 options = new HashMap(); + + // 调用百度人脸识别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 options = new HashMap(); + + // 调用百度人脸识别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 options = new HashMap(); + 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 options = new HashMap(); + 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 options = new HashMap(); + 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; + } + } + +} \ No newline at end of file diff --git a/yanzhu-common/yanzhu-common-core/src/main/java/com/yanzhu/common/core/utils/BaiduFaceSimilarityUtils.java b/yanzhu-common/yanzhu-common-core/src/main/java/com/yanzhu/common/core/utils/BaiduFaceSimilarityUtils.java index 942a7f1a..700ef500 100644 --- a/yanzhu-common/yanzhu-common-core/src/main/java/com/yanzhu/common/core/utils/BaiduFaceSimilarityUtils.java +++ b/yanzhu-common/yanzhu-common-core/src/main/java/com/yanzhu/common/core/utils/BaiduFaceSimilarityUtils.java @@ -1,8 +1,11 @@ package com.yanzhu.common.core.utils; +import com.alibaba.fastjson2.JSON; import com.baidu.aip.face.AipFace; import com.baidu.aip.face.MatchRequest; 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.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; @@ -26,7 +29,7 @@ public class BaiduFaceSimilarityUtils { @Autowired private BaiduFaceProperties baiduFaceProperties; - + // 初始化AipFace客户端 private static AipFace client; @@ -37,14 +40,16 @@ public class BaiduFaceSimilarityUtils { 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="https://xiangguan.sxyanzhu.com"; + @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); @@ -125,6 +130,130 @@ public class BaiduFaceSimilarityUtils { 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编码 * @@ -146,7 +275,14 @@ public class BaiduFaceSimilarityUtils { // 将图片转换为Base64编码 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(); return Base64.getEncoder().encodeToString(imageBytes); } catch (Exception e) { @@ -242,8 +378,73 @@ public class BaiduFaceSimilarityUtils { 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 users = new ArrayList(); + 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("开始测试人脸相似度算法..."); // 测试1:同一个人的不同照片(应该匹配) @@ -279,4 +480,76 @@ public class BaiduFaceSimilarityUtils { 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"); + } + + } } \ No newline at end of file diff --git a/yanzhu-common/yanzhu-common-core/src/main/java/com/yanzhu/common/core/utils/OcrService.java b/yanzhu-common/yanzhu-common-core/src/main/java/com/yanzhu/common/core/utils/OcrService.java index c89a757a..58ebbdb6 100644 --- a/yanzhu-common/yanzhu-common-core/src/main/java/com/yanzhu/common/core/utils/OcrService.java +++ b/yanzhu-common/yanzhu-common-core/src/main/java/com/yanzhu/common/core/utils/OcrService.java @@ -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 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_SECRET="3bY7dADqQq3O4UpXpFA1FJAj6LN57QCS"; diff --git a/yanzhu-common/yanzhu-common-core/src/main/java/com/yanzhu/common/core/utils/bean/BaiduFaceUserInfo.java b/yanzhu-common/yanzhu-common-core/src/main/java/com/yanzhu/common/core/utils/bean/BaiduFaceUserInfo.java new file mode 100644 index 00000000..cb4831d0 --- /dev/null +++ b/yanzhu-common/yanzhu-common-core/src/main/java/com/yanzhu/common/core/utils/bean/BaiduFaceUserInfo.java @@ -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 userInfo; + + public Map getUserInfo() { + return userInfo; + } + + public void setUserInfo(Map userInfo) { + this.userInfo = userInfo; + } + public String getUserInfoStr() { + return JSON.toJSONString(userInfo); + } + +} diff --git a/yanzhu-common/yanzhu-common-mapper/src/main/java/com/yanzhu/services/IBaiduFaceService.java b/yanzhu-common/yanzhu-common-mapper/src/main/java/com/yanzhu/services/IBaiduFaceService.java new file mode 100644 index 00000000..51d0a69c --- /dev/null +++ b/yanzhu-common/yanzhu-common-mapper/src/main/java/com/yanzhu/services/IBaiduFaceService.java @@ -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); +} diff --git a/yanzhu-common/yanzhu-common-mapper/src/main/java/com/yanzhu/services/impl/BaiduFaceService.java b/yanzhu-common/yanzhu-common-mapper/src/main/java/com/yanzhu/services/impl/BaiduFaceService.java new file mode 100644 index 00000000..f38b5799 --- /dev/null +++ b/yanzhu-common/yanzhu-common-mapper/src/main/java/com/yanzhu/services/impl/BaiduFaceService.java @@ -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); + } +} diff --git a/yanzhu-common/yanzhu-common-mapper/src/main/resources/mapper/manage/ProProjectInfoSubdeptsUsersMapper.xml b/yanzhu-common/yanzhu-common-mapper/src/main/resources/mapper/manage/ProProjectInfoSubdeptsUsersMapper.xml index 057c6c2b..b33646ae 100644 --- a/yanzhu-common/yanzhu-common-mapper/src/main/resources/mapper/manage/ProProjectInfoSubdeptsUsersMapper.xml +++ b/yanzhu-common/yanzhu-common-mapper/src/main/resources/mapper/manage/ProProjectInfoSubdeptsUsersMapper.xml @@ -165,6 +165,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" diff --git a/yanzhu-modules/yanzhu-manage/src/main/java/com/yanzhu/manage/YanZhuManageApplication.java b/yanzhu-modules/yanzhu-manage/src/main/java/com/yanzhu/manage/YanZhuManageApplication.java index d5419ec1..5230d232 100644 --- a/yanzhu-modules/yanzhu-manage/src/main/java/com/yanzhu/manage/YanZhuManageApplication.java +++ b/yanzhu-modules/yanzhu-manage/src/main/java/com/yanzhu/manage/YanZhuManageApplication.java @@ -7,6 +7,7 @@ import net.hasor.spring.boot.EnableHasor; import net.hasor.spring.boot.EnableHasorWeb; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.context.annotation.ComponentScan; /** * 业务模块 @@ -17,6 +18,7 @@ import org.springframework.boot.autoconfigure.SpringBootApplication; @EnableCustomSwagger2 @EnableRyFeignClients @SpringBootApplication +@ComponentScan(basePackages = {"com.yanzhu"}) @EnableHasor() @EnableHasorWeb() public class YanZhuManageApplication diff --git a/yanzhu-modules/yanzhu-manage/src/main/java/com/yanzhu/manage/controller/remoteAttendance/ProMobileAttendanceConfigController.java b/yanzhu-modules/yanzhu-manage/src/main/java/com/yanzhu/manage/controller/remoteAttendance/ProMobileAttendanceConfigController.java index 83179cf9..2aed151b 100644 --- a/yanzhu-modules/yanzhu-manage/src/main/java/com/yanzhu/manage/controller/remoteAttendance/ProMobileAttendanceConfigController.java +++ b/yanzhu-modules/yanzhu-manage/src/main/java/com/yanzhu/manage/controller/remoteAttendance/ProMobileAttendanceConfigController.java @@ -4,7 +4,9 @@ import java.util.List; import java.io.IOException; import javax.servlet.http.HttpServletResponse; +import cn.hutool.core.util.NumberUtil; 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.web.controller.BaseController; import com.yanzhu.common.core.web.domain.AjaxResult; @@ -129,17 +131,13 @@ public class ProMobileAttendanceConfigController extends BaseController @PostMapping("/attendance") public AjaxResult attendance(@RequestBody ProMobileAttendanceData attData){ //根据用户上传的照片与用户信息的照片计算相似度 - String userPicture =attData.getBasePath()+ attData.getUserPicture(); - String attImg=attData.getBasePath()+attData.getAttImg(); - - // 使用专门为人脸识别考勤优化的相似度计算 - double similarity = BaiduFaceSimilarityUtils.calculateFaceSimilarity(userPicture, attImg); - System.out.println("相似度:"+similarity); - - double threshold = BaiduFaceSimilarityUtils.SIMILARITY_THRESHOLD; - - if (similarity >= threshold) { + String attImg=attData.getAttImg(); + double threshold=BaiduFaceSimilarityUtils.SIMILARITY_THRESHOLD; + BaiduFaceUserInfo baiduFaceUserInfo=BaiduFaceSimilarityUtils.findFaceSimilarityWithFaceLibrary(attImg,"G"+attData.getProjectId()); + double similarity =baiduFaceUserInfo!=null? baiduFaceUserInfo.getSimilarity():0; + if (baiduFaceUserInfo!=null) { // 相似度达标,允许考勤 + attData.setUserId(NumberUtil.parseLong(baiduFaceUserInfo.getUserInfo().get("userId").toString())); int cnt=attendanceUbiDataService.addMobiileAttendanceData(attData); attData.setAttDevice("mobile"); cnt+=proMobileAttendanceDataService.insertProMobileAttendanceData(attData); diff --git a/yanzhu-modules/yanzhu-manage/src/main/java/com/yanzhu/manage/service/impl/ProCostOutputServiceImpl.java b/yanzhu-modules/yanzhu-manage/src/main/java/com/yanzhu/manage/service/impl/ProCostOutputServiceImpl.java index 02294c80..a0d61a7f 100644 --- a/yanzhu-modules/yanzhu-manage/src/main/java/com/yanzhu/manage/service/impl/ProCostOutputServiceImpl.java +++ b/yanzhu-modules/yanzhu-manage/src/main/java/com/yanzhu/manage/service/impl/ProCostOutputServiceImpl.java @@ -8,7 +8,6 @@ import com.yanzhu.manage.domain.ProCostOutput; import com.yanzhu.manage.mapper.ProCostOutputMapper; import com.yanzhu.manage.service.IProCostOutputService; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.actuate.web.mappings.MappingsEndpoint; import org.springframework.stereotype.Service; /** @@ -22,8 +21,7 @@ public class ProCostOutputServiceImpl implements IProCostOutputService { @Autowired private ProCostOutputMapper proCostOutputMapper; - @Autowired - private MappingsEndpoint mappingsEndpoint; + /** * 查询项目成本产值 diff --git a/yanzhu-modules/yanzhu-manage/src/main/java/com/yanzhu/manage/service/impl/ProProjectInfoSubdeptsUsersServiceImpl.java b/yanzhu-modules/yanzhu-manage/src/main/java/com/yanzhu/manage/service/impl/ProProjectInfoSubdeptsUsersServiceImpl.java index 3fd23866..b9360107 100644 --- a/yanzhu-modules/yanzhu-manage/src/main/java/com/yanzhu/manage/service/impl/ProProjectInfoSubdeptsUsersServiceImpl.java +++ b/yanzhu-modules/yanzhu-manage/src/main/java/com/yanzhu/manage/service/impl/ProProjectInfoSubdeptsUsersServiceImpl.java @@ -23,6 +23,7 @@ import com.yanzhu.manage.utils.pdf.FileUtil; import com.yanzhu.manage.utils.pdf.PdfImageSignetUtil; import com.yanzhu.manage.utils.pdf.PoiUtil; import com.yanzhu.security.utils.DictUtils; +import com.yanzhu.services.IBaiduFaceService; import com.yanzhu.system.api.RemoteFlowService; import com.yanzhu.system.api.RemoteUserService; import com.yanzhu.system.api.domain.SysUser; @@ -90,6 +91,8 @@ public class ProProjectInfoSubdeptsUsersServiceImpl implements IProProjectInfoSu @Autowired private IProUserInoutRecordService iProUserInoutRecordService; + @Autowired + private IBaiduFaceService baiduFaceService; private static final Logger log = LoggerFactory.getLogger(ProProjectInfoSubdeptsUsersServiceImpl.class); @@ -156,6 +159,7 @@ public class ProProjectInfoSubdeptsUsersServiceImpl implements IProProjectInfoSu proProjectInfoSubdeptsUsers.setSubDeptName(proProjectInfo.getProjectName()); } } + baiduFaceService.addProUser(proProjectInfoSubdeptsUsers); return proProjectInfoSubdeptsUsersMapper.insertProProjectInfoSubdeptsUsers(proProjectInfoSubdeptsUsers); } /** @@ -279,7 +283,7 @@ public class ProProjectInfoSubdeptsUsersServiceImpl implements IProProjectInfoSu FileUtil.copyFile(file,new File(savePath)); } proProjectInfoSubdeptsUsers.setQrCode(profilePath); - proProjectInfoSubdeptsUsersMapper.updateProProjectInfoSubdeptsUsers(proProjectInfoSubdeptsUsers); + updateProjectInfoSubdeptsUsers(proProjectInfoSubdeptsUsers); }catch (Exception e){ log.error(e.getMessage()); } @@ -348,7 +352,7 @@ public class ProProjectInfoSubdeptsUsersServiceImpl implements IProProjectInfoSu deptUser.setUserPicture(proProjectInfoSubdeptsUsers.getUserPicture()); deptUser.setUpdateBy(SecurityUtils.getUsername()); deptUser.setUpdateTime(DateUtils.getNowDate()); - proProjectInfoSubdeptsUsersMapper.updateProProjectInfoSubdeptsUsers(deptUser); + updateProjectInfoSubdeptsUsers(deptUser); /** * 考勤需要信息改变时推送信息... */ @@ -383,7 +387,7 @@ public class ProProjectInfoSubdeptsUsersServiceImpl implements IProProjectInfoSu if(oldUserData.getApproveStatus()==ApproveStatus.refuse.getCode()){ // 删除用户冗余数据... oldUserData.setIsDel(IsDelEnums.DEL.getCode()); - proProjectInfoSubdeptsUsersMapper.updateProProjectInfoSubdeptsUsers(oldUserData); + updateProjectInfoSubdeptsUsers(oldUserData); }else{ throw new ServiceException("手机号码已存在"); } @@ -707,14 +711,14 @@ public class ProProjectInfoSubdeptsUsersServiceImpl implements IProProjectInfoSu FileUtil.copyFile(file,new File(savePath)); } proProjectInfoSubdeptsUsers.setQrCode(profilePath); - return proProjectInfoSubdeptsUsersMapper.updateProProjectInfoSubdeptsUsers(proProjectInfoSubdeptsUsers); + return updateProjectInfoSubdeptsUsers(proProjectInfoSubdeptsUsers); }catch (Exception e){ log.error(e.getMessage()); } } } } - return proProjectInfoSubdeptsUsersMapper.updateProProjectInfoSubdeptsUsers(proProjectInfoSubdeptsUsers); + return updateProjectInfoSubdeptsUsers(proProjectInfoSubdeptsUsers); } /** @@ -750,7 +754,7 @@ public class ProProjectInfoSubdeptsUsersServiceImpl implements IProProjectInfoSu } user.setUseStatus(status); iProUserInoutRecordService.addRecord(user); - return proProjectInfoSubdeptsUsersMapper.updateProProjectInfoSubdeptsUsers(user); + return updateProjectInfoSubdeptsUsers(user); } /** @@ -994,10 +998,14 @@ public class ProProjectInfoSubdeptsUsersServiceImpl implements IProProjectInfoSu sysUser.setActiveProjectId(proProjectInfoSubdeptsUsers.getProjectId()); remoteUserService.registerUserInfo(sysUser, SecurityConstants.INNER); - proProjectInfoSubdeptsUsersMapper.updateProProjectInfoSubdeptsUsers(proProjectInfoSubdeptsUsers); + updateProjectInfoSubdeptsUsers(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){ uniService.syncUserRevoke(id); } + baiduFaceService.deleteProUser(ids); return proProjectInfoSubdeptsUsersMapper.deleteProProjectInfoSubdeptsUsersByIds(ids); } @@ -1023,6 +1032,7 @@ public class ProProjectInfoSubdeptsUsersServiceImpl implements IProProjectInfoSu public int deleteProProjectInfoSubdeptsUsersById(Long id) { uniService.syncUserRevoke(id); + baiduFaceService.deleteProUser(new Long[]{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()); @@ -1286,7 +1296,7 @@ public class ProProjectInfoSubdeptsUsersServiceImpl implements IProProjectInfoSu proProjectInfoSubdeptsUsers.setUseStatus(UseStateEnums.IN.getCode()); proProjectInfoSubdeptsUsers.setUseDate(DateUtils.getNowDate()); proProjectInfoSubdeptsUsers.setApproveStatus(ApproveStatus.exempt.getCode()); - proProjectInfoSubdeptsUsersMapper.updateProProjectInfoSubdeptsUsers(proProjectInfoSubdeptsUsers); + updateProjectInfoSubdeptsUsers(proProjectInfoSubdeptsUsers); // 人员入场信息 uniService.syncUniUser(proProjectInfoSubdeptsUsers,true); } @@ -1324,7 +1334,7 @@ public class ProProjectInfoSubdeptsUsersServiceImpl implements IProProjectInfoSu } if(flag){ proProjectInfoSubdeptsUsers.setEduFilePath(newFilePath.replace(ProfileConfig.profilePath,ProfileConfig.profile)); - proProjectInfoSubdeptsUsersMapper.updateProProjectInfoSubdeptsUsers(proProjectInfoSubdeptsUsers); + updateProjectInfoSubdeptsUsers(proProjectInfoSubdeptsUsers); } } } @@ -1360,7 +1370,7 @@ public class ProProjectInfoSubdeptsUsersServiceImpl implements IProProjectInfoSu } if(flag){ proProjectInfoSubdeptsUsers.setEduFilePath(newFilePath.replace(ProfileConfig.profilePath,ProfileConfig.profile)); - proProjectInfoSubdeptsUsersMapper.updateProProjectInfoSubdeptsUsers(proProjectInfoSubdeptsUsers); + updateProjectInfoSubdeptsUsers(proProjectInfoSubdeptsUsers); } } } @@ -1396,7 +1406,7 @@ public class ProProjectInfoSubdeptsUsersServiceImpl implements IProProjectInfoSu } if(flag){ proProjectInfoSubdeptsUsers.setEduFilePath(newFilePath.replace(ProfileConfig.profilePath,ProfileConfig.profile)); - proProjectInfoSubdeptsUsersMapper.updateProProjectInfoSubdeptsUsers(proProjectInfoSubdeptsUsers); + updateProjectInfoSubdeptsUsers(proProjectInfoSubdeptsUsers); } } } @@ -1483,7 +1493,7 @@ public class ProProjectInfoSubdeptsUsersServiceImpl implements IProProjectInfoSu try { ProProjectInfoSubdeptsUsers proProjectInfoSubdeptsUsers = proProjectInfoSubdeptsUsersMapper.selectProProjectInfoSubdeptsUsersById(proUserId); proProjectInfoSubdeptsUsers.setApproveStatus(ApproveStatus.refuse.getCode()); - proProjectInfoSubdeptsUsersMapper.updateProProjectInfoSubdeptsUsers(proProjectInfoSubdeptsUsers); + updateProjectInfoSubdeptsUsers(proProjectInfoSubdeptsUsers); }catch (Exception e){ e.printStackTrace(); } @@ -1578,7 +1588,7 @@ public class ProProjectInfoSubdeptsUsersServiceImpl implements IProProjectInfoSu if(res>0){ ProProjectInfoSubdeptsUsers proProjectInfoSubdeptsUsers = proProjectInfoSubdeptsUsersMapper.selectProProjectInfoSubdeptsUsersByParamId(id,userId); proProjectInfoSubdeptsUsers.setSortBy(0L); - res = proProjectInfoSubdeptsUsersMapper.updateProProjectInfoSubdeptsUsers(proProjectInfoSubdeptsUsers); + res = updateProjectInfoSubdeptsUsers(proProjectInfoSubdeptsUsers); } boolean isAdmin= (SecurityUtils.isAdmin(userId) || SecurityUtils.isGSAdmin()); @@ -1709,7 +1719,7 @@ public class ProProjectInfoSubdeptsUsersServiceImpl implements IProProjectInfoSu } if(flag){ proProjectInfoSubdeptsUsers.setEduFilePath(newFilePath.replace(ProfileConfig.profilePath,ProfileConfig.profile)); - proProjectInfoSubdeptsUsersMapper.updateProProjectInfoSubdeptsUsers(proProjectInfoSubdeptsUsers); + updateProjectInfoSubdeptsUsers(proProjectInfoSubdeptsUsers); } }else{ throw new ServiceException("未查询三级安全教育主管签名信息..."); diff --git a/yanzhu-modules/yanzhu-system/src/main/java/com/yanzhu/system/YanZhuSystemApplication.java b/yanzhu-modules/yanzhu-system/src/main/java/com/yanzhu/system/YanZhuSystemApplication.java index 6e54bb5e..efa3d984 100644 --- a/yanzhu-modules/yanzhu-system/src/main/java/com/yanzhu/system/YanZhuSystemApplication.java +++ b/yanzhu-modules/yanzhu-system/src/main/java/com/yanzhu/system/YanZhuSystemApplication.java @@ -5,6 +5,7 @@ import org.springframework.boot.autoconfigure.SpringBootApplication; import com.yanzhu.common.security.annotation.EnableCustomConfig; import com.yanzhu.common.security.annotation.EnableRyFeignClients; 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 @EnableCustomSwagger2 @EnableRyFeignClients +@ComponentScan(basePackages = {"com.yanzhu"}) @SpringBootApplication public class YanZhuSystemApplication { diff --git a/yanzhu-modules/yanzhu-system/src/main/java/com/yanzhu/system/controller/SysUserController.java b/yanzhu-modules/yanzhu-system/src/main/java/com/yanzhu/system/controller/SysUserController.java index 491b183e..79743d66 100644 --- a/yanzhu-modules/yanzhu-system/src/main/java/com/yanzhu/system/controller/SysUserController.java +++ b/yanzhu-modules/yanzhu-system/src/main/java/com/yanzhu/system/controller/SysUserController.java @@ -19,6 +19,7 @@ import com.yanzhu.common.security.service.TokenService; import com.yanzhu.common.security.utils.SecurityUtils; import com.yanzhu.manage.domain.AttendanceCfg; import com.yanzhu.manage.mapper.AttendanceCfgMapper; +import com.yanzhu.services.IBaiduFaceService; import com.yanzhu.system.api.domain.SysDept; import com.yanzhu.system.api.domain.SysRole; import com.yanzhu.system.api.domain.SysUser; @@ -77,6 +78,8 @@ public class SysUserController extends BaseController { @Autowired private AttendanceCfgMapper attendanceCfgMapper; + @Autowired + private IBaiduFaceService baiduFaceService; /** * 获取用户列表 */ @@ -377,7 +380,9 @@ public class SysUserController extends BaseController { }*/ user.setCreateBy(SecurityUtils.getUsername()); 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) @PostMapping("/addUser") 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}") @@ -409,6 +416,7 @@ public class SysUserController extends BaseController { return error("修改用户'" + user.getUserName() + "'失败,邮箱账号已存在"); } user.setUpdateBy(SecurityUtils.getUsername()); + baiduFaceService.updateSysUser(user); return toAjax(userService.updateUser(user)); } @@ -422,6 +430,7 @@ public class SysUserController extends BaseController { if (ArrayUtils.contains(userIds, SecurityUtils.getUserId())) { return error("当前用户不能删除"); } + baiduFaceService.deleteSysUser(userIds); return toAjax(userService.deleteUserByIds(userIds)); } diff --git a/yanzhu-ui-app/miniprogram/pages/login/login.js b/yanzhu-ui-app/miniprogram/pages/login/login.js index 76646fec..02f0abc9 100644 --- a/yanzhu-ui-app/miniprogram/pages/login/login.js +++ b/yanzhu-ui-app/miniprogram/pages/login/login.js @@ -30,7 +30,7 @@ Page({ uuid: "", codeUrl: "", checked: true, - logo: config.baseImgUrl + "/cdn/app_logo.png", + logo: config.baseImgUrl + "/cdn/app_logo.png?v=20250922", }, //获取填写的账号信息