Kaynağa Gözat

fix new version face server

aobei
yk 1 yıl önce
ebeveyn
işleme
e113ee06c9
12 değiştirilmiş dosya ile 464 ekleme ve 350 silme
  1. +1
    -0
      on-visitor-web/.gitignore
  2. +12
    -1
      on-visitor-web/pom.xml
  3. +19
    -4
      on-visitor-web/src/main/java/com/lecooai/visitor/web/config/BatchConfig.java
  4. +18
    -21
      on-visitor-web/src/main/java/com/lecooai/visitor/web/sys/service/support/EmpServiceSupport.java
  5. +46
    -291
      on-visitor-web/src/main/java/com/lecooai/visitor/web/sys/service/support/FaceServiceSupport.java
  6. +23
    -13
      on-visitor-web/src/main/java/com/lecooai/visitor/web/sys/web/Account2Controller.java
  7. +10
    -8
      on-visitor-web/src/main/java/com/lecooai/visitor/web/sys/web/api/CommonApiController.java
  8. +4
    -6
      on-visitor-web/src/main/java/com/lecooai/visitor/web/sys/web/api/FaceApiController.java
  9. +325
    -0
      on-visitor-web/src/main/java/com/lecooai/visitor/web/utils/OkHttpUtil.java
  10. +2
    -2
      on-visitor-web/src/main/resources/config/application-dev.yml
  11. +4
    -3
      on-visitor-web/src/main/resources/config/application.yml
  12. +0
    -1
      on-visitor-web/src/main/webapp/.gitignore

+ 1
- 0
on-visitor-web/.gitignore Dosyayı Görüntüle

@@ -0,0 +1 @@
src/main/webapp/

+ 12
- 1
on-visitor-web/pom.xml Dosyayı Görüntüle

@@ -283,7 +283,7 @@
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.3</version>
<version>1.2.44</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
@@ -300,6 +300,13 @@
<artifactId>spring-session-data-redis</artifactId>
<version>2.0.1.RELEASE</version>
</dependency>


<dependency>
<groupId>com.squareup.okhttp3</groupId>
<artifactId>okhttp</artifactId>
<version>3.14.9</version>
</dependency>
</dependencies>

<build>
@@ -349,6 +356,7 @@
<enabled>true</enabled>
</releases>
<snapshots>
<updatePolicy>never</updatePolicy>
<enabled>false</enabled>
</snapshots>
</repository>
@@ -360,6 +368,7 @@
<enabled>true</enabled>
</releases>
<snapshots>
<updatePolicy>never</updatePolicy>
<enabled>false</enabled>
</snapshots>
</repository>
@@ -371,6 +380,7 @@
<enabled>true</enabled>
</releases>
<snapshots>
<updatePolicy>never</updatePolicy>
<enabled>false</enabled>
</snapshots>
</repository>
@@ -382,6 +392,7 @@
<enabled>false</enabled>
</releases>
<snapshots>
<updatePolicy>never</updatePolicy>
<enabled>true</enabled>
</snapshots>
</repository>


+ 19
- 4
on-visitor-web/src/main/java/com/lecooai/visitor/web/config/BatchConfig.java Dosyayı Görüntüle

@@ -59,21 +59,36 @@ public class BatchConfig {
@Autowired
private DataSource dataSource;

/*@Bean

/**
* @Author yangkai
* @Description 重新计算人脸特征值,替换人脸
* @Date 2024/5/8
* @Param
* @return
**/
@Bean
public Job singleStepJob() {
return jobBuilderFactory.get("singleStepJob")
.listener(listener())
.start(itemReaderFromDBJobStep())
.build();
}*/
}

@Bean
/**
* @Author yangkai
* @Description 导入到新的saas系统中,注释不可删除
* @Date 2024/5/8
* @Param
* @return
**/
/*@Bean
public Job empStepJob() {
return jobBuilderFactory.get("empStepJob")
.listener(listener())
.start(empReaderFromDBJobStep())
.build();
}
}*/

@Bean
public Step uppercaseStep() {


+ 18
- 21
on-visitor-web/src/main/java/com/lecooai/visitor/web/sys/service/support/EmpServiceSupport.java Dosyayı Görüntüle

@@ -395,7 +395,7 @@ public class EmpServiceSupport
//移除掉第一次添加的管理员
String userCode = UserUtils.getUser().getUserCode();
if (!BusinessUtils.isSecAdmin(userCode)) {
userDataScopeService.deleteByOfficeCode(office.getOfficeCode());
// userDataScopeService.deleteByOfficeCode(office.getOfficeCode());
}
//调用新增
executeAddInfo(office, empIds, adminIds, flag);
@@ -590,21 +590,18 @@ public class EmpServiceSupport
return new ResponseInfo(ResponseCode.FACE_FETCH_FAIL, hasObj.getString("errMsg"));
}
JSONObject obj = faceServiceSupport.hasface(token, id, base64Image);
JSONObject faceRectangle = obj.getJSONObject("data");
int status = obj.getInteger("status");
JSONObject obj = faceServiceSupport.getFaceExtraction(token, id, base64Image);
if (status != 0) {
return new ResponseInfo(ResponseCode.FACE_FETCH_FAIL, obj.getString("errMsg"));
}
if (!ObjectUtils.anyNotNull(faceRectangle) || faceRectangle.getJSONObject("faceRectangle").isEmpty()) {
return new ResponseInfo(ResponseCode.CW_FACE_IMG_NO_FACE, "no face");
if (!obj.containsKey("feature")) {
return new ResponseInfo(ResponseCode.FACE_FETCH_FAIL, obj.getString("errorMessage"));
}
Date date = new Date();
emp.setUpdateTime(date);
emp.setFaceImageName(newFileName);
JSONArray array = faceRectangle.getJSONArray("feature");
JSONArray array = obj.getJSONArray("feature");
EmpFaceFeature empFaceFeature = new EmpFaceFeature();
empFaceFeature.setEmpId(id);
@@ -632,8 +629,6 @@ public class EmpServiceSupport
}
this.updAuthMapping(emp);
// }
return new ResponseInfo(auditStatus);
} catch (UnsupportedFormatException e){
@@ -641,6 +636,8 @@ public class EmpServiceSupport
} catch (IOException e) {
e.printStackTrace();
return new ResponseInfo(ResponseCode.FILE_UPLOAD_FAIL);
} catch (Exception e) {
throw new RuntimeException(e);
}
}
@@ -1004,17 +1001,17 @@ public class EmpServiceSupport
faceImage = faceImage.replaceAll("data:image/jpeg;base64,", "");
JSONObject faceRectangle = faceServiceSupport.hasface("", emp.getId(), faceImage);
int status = faceRectangle.getInteger("status");
faceRectangle = faceRectangle.getJSONObject("data");
JSONObject faceRectangle = null;
try {
faceRectangle = faceServiceSupport.getFaceExtraction("", emp.getId(), faceImage);
} catch (Exception e) {
return e.getMessage();
}
String userName = emp.getRealName();
if (status != 0) {
return "抱歉,您的账号 " + userName + " 注册失败,"+faceRectangle.getString("errMsg");
if (!faceRectangle.containsKey("feature")) {
return "抱歉,您的账号 " + userName + " 注册失败,"+faceRectangle.getString("errorMessage");
}
if (!ObjectUtils.anyNotNull(faceRectangle) || faceRectangle.getJSONObject("faceRectangle").isEmpty()) {
return "抱歉,您的账号 " + userName + " 注册失败,上传的头像未找到人脸!";
}
JSONObject json = imageUtil.base64ToStorage(faceImage, true);
@@ -1077,7 +1074,7 @@ public class EmpServiceSupport
int status = getJson.getInteger("status");
String featureStr = "";
if (0 == status) {
featureStr = getJson.getString("feature");
featureStr = getJson.getJSONArray("feature").toJSONString();
} else {
return getJson;
}


+ 46
- 291
on-visitor-web/src/main/java/com/lecooai/visitor/web/sys/service/support/FaceServiceSupport.java Dosyayı Görüntüle

@@ -4,27 +4,22 @@ package com.lecooai.visitor.web.sys.service.support;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.jeesite.common.config.Global;
import com.lecooai.visitor.web.sys.entity.EmpFaceFeature;
import com.jeesite.common.lang.StringUtils;
import com.lecooai.visitor.web.sys.utils.ImageUtil;
import com.lecooai.visitor.web.utils.OkHttpUtil;
import kong.unirest.HttpResponse;
import kong.unirest.Unirest;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.ObjectUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.http.HttpEntity;
import org.springframework.http.HttpHeaders;
import org.springframework.http.MediaType;
import org.springframework.stereotype.Component;
import org.springframework.util.LinkedMultiValueMap;
import org.springframework.util.MultiValueMap;
import org.springframework.web.client.RestTemplate;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Map;
import java.util.UUID;
@Slf4j
@Component
@@ -36,9 +31,6 @@ public class FaceServiceSupport {
@Value("${face.server}")
private String faceServer;
@Value("${face.updServer}")
private String updFaceServer;//升级版本时测试用
@Value("${face.authorizePath}")
private String authorizePath;
@@ -83,23 +75,6 @@ public class FaceServiceSupport {
}
public String getToken(){
/********restTemplate 请求方式*************/
/*HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON); //OK
MultiValueMap<String, String> map = new LinkedMultiValueMap<>();
map.add("name", uname);
map.add("password", password);
HttpEntity<Map<String, String>> entity = new HttpEntity<>(map.toSingleValueMap(), headers);
String result = restTemplate.postForObject(faceServer + authorizePath, entity, String.class);
log.info("Face Engine-authToken return >> " + result);
JSONObject resultJson = JSON.parseObject(result);
return resultJson.getJSONObject("result").getString("token");*/
/*****Unirest 请求方式*****/
JSONObject paramJson = new JSONObject();
paramJson.put("name", user);
@@ -112,207 +87,56 @@ public class FaceServiceSupport {
String result = response.getBody();
JSONObject resultJson = JSON.parseObject(result);
return resultJson.getJSONObject("result").getString("token");
/********CURL 请求方式********/
/*JSONObject paramJson = new JSONObject();
paramJson.put("name", uname);
paramJson.put("password", password);
String content = paramJson.toJSONString();
String[] cmds = {"curl", "--location", "--request", "POST", faceServer + authorizePath,"--data", content};
log.info("------------");
log.info(faceServer);
log.info("------------");
String res = execCurl(cmds);
JSONObject json = JSONObject.parseObject(res);
JSONObject data = json.getJSONObject("result");
String token = "";
if(!data.isEmpty()){
token = data.getString("token");
}
return token;*/
}
public JSONObject getFaceExtraction(String token, String imageId, String imgBase64) {
/********CURL 请求方式********/
/*JSONObject paramJson = new JSONObject();
paramJson.put("imageId", imageId);
paramJson.put("base64Data", imgBase64);
paramJson.put("detect", 1);
String content = paramJson.toJSONString();
String[] cmds = {"curl", "--location", "--request", "POST", faceServer + extractionPath, "--header", "Authorization: Bearer "+token, "--header", "Content-Type: application/json", "--data", content};
String res = execCurl(cmds);
log.info("----------------");
log.info(faceServer);
log.info("----------------");
log.info("Face Engine-detectFace return >> " + res);
JSONObject json = JSONObject.parseObject(res);
JSONObject data = json.getJSONArray("result").getJSONObject(0);
return data;*/
/********restTemplate 请求方式*************/
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON);
headers.set("Authorization", "Bearer "+token);
MultiValueMap<String, Object> map = new LinkedMultiValueMap<String, Object>();
map.add("imageId", imageId);
map.add("base64Data", imgBase64);
map.add("detect", true);
map.add("quality", true);
HttpEntity<Map<String, Object>> entity = new HttpEntity<>(map.toSingleValueMap(), headers);
// System.err.println(faceServer + extractionPath);
String emps = Global.getConfig("face.modeUpdEmps");
String path = faceServer;
System.err.println("emps==========1111");
System.err.println(emps);
System.err.println(imageId);
if (emps.contains(imageId)) {
System.err.println("---------------uuuuuuuuu");
path = updFaceServer;
}
System.err.println(faceServer);
System.err.println(updFaceServer);
System.err.println(path);
System.err.println("emps==========2222");
String result = restTemplate.postForObject(path + extractionPath, entity, String.class, "face-detection");
public JSONObject getFaceExtraction(String token, String imageId, String imgBase64) throws Exception {
imgBase64 = imgBase64.replace("data:image/jpeg;base64,", "");
JSONObject j1 = new JSONObject().fluentPut("faceName","faceName").fluentPut("base64Data", imgBase64).fluentPut("detect", true).fluentPut("quality", true);
JSONArray jsonArray = new JSONArray().fluentAdd(j1);
System.out.println("获取特征值地址:"+faceServer + extractionPath);
System.out.println("获取特征值地址参数:"+jsonArray.toJSONString());
String result = OkHttpUtil.postCvJson(faceServer+extractionPath, new JSONObject().fluentPut("images", jsonArray));
System.err.println("获取特征值结果:"+result);
// log.info("Face Engine-detectFace return >> " + result);
JSONObject resultJson = JSON.parseObject(result);
if (!resultJson.containsKey("errorCode") && 0==resultJson.getInteger("status")) {
return resultJson.getJSONArray("result").getJSONObject(0).getJSONArray("faces").getJSONObject(0);
} else {
return resultJson;
}
// System.err.println(resultJson.toJSONString());
return resultJson.getJSONArray("result").getJSONObject(0);
/*****Unirest 请求方式*****/
/*JSONObject paramJson = new JSONObject();
paramJson.put("imageId", imageId);
paramJson.put("base64Data", imgBase64);
paramJson.put("detect", 1);
String content = paramJson.toJSONString();
HttpResponse<String> response = Unirest.post(faceServer + extractionPath)
.header("Authorization", "Bearer "+token)
.header("Content-Type", "application/json")
.body(content)
.asString();
String result = response.getBody();
log.info("Face Engine-detectFace return >> " + result);
JSONObject resultJson = JSON.parseObject(result);
return resultJson.getJSONArray("result").getJSONObject(0);*/
}
public JSONObject getFaceCheck(String token, String imageId, String imgBase64) throws Exception{
/********CURL 请求方式********/
/*JSONObject paramJson = new JSONObject();
paramJson.put("imageId", imageId);
paramJson.put("base64Data", imgBase64);
paramJson.put("detect", 1);
String content = paramJson.toJSONString();
String[] cmds = {"curl", "--location", "--request", "POST", faceServer + extractionPath, "--header", "Authorization: Bearer "+token, "--header", "Content-Type: application/json", "--data", content};
String res = execCurl(cmds);
log.info("----------------");
log.info(faceServer);
log.info("----------------");
log.info("Face Engine-detectFace return >> " + res);
JSONObject json = JSONObject.parseObject(res);
JSONObject data = json.getJSONArray("result").getJSONObject(0);
return data;*/
/********restTemplate 请求方式*************/
try {
imgBase64 = imgBase64.replaceAll("data:image/jpeg;base64,", "");
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON);
headers.set("Authorization", "Bearer "+token);
MultiValueMap<String, Object> map = new LinkedMultiValueMap<String, Object>();
// map.add("imageId", imageId);
// map.add("base64Data", imgBase64);
JSONArray jsonArray = new JSONArray();
JSONObject jsonObject = new JSONObject();
jsonObject.put("imageId",imageId);
jsonObject.put("base64Data",imgBase64);
jsonArray.add(jsonObject);
map.add("detect", true);
map.add("images", jsonArray);
HttpEntity<Map<String, Object>> entity = new HttpEntity<>(map.toSingleValueMap(), headers);
// System.err.println(faceServer + extractionPath);
String result = restTemplate.postForObject(faceServer + qualityPath, entity, String.class, "face-detection");
// log.info("Face Engine-detectFace return >> " + result);
JSONObject resultJson = JSON.parseObject(result);
return resultJson.getJSONArray("result").getJSONObject(0);
} catch (Exception e) {
throw e;
}
/*****Unirest 请求方式*****/
/*JSONObject paramJson = new JSONObject();
paramJson.put("imageId", imageId);
paramJson.put("base64Data", imgBase64);
paramJson.put("detect", 1);
String content = paramJson.toJSONString();
HttpResponse<String> response = Unirest.post(faceServer + extractionPath)
.header("Authorization", "Bearer "+token)
.header("Content-Type", "application/json")
.body(content)
.asString();
String result = response.getBody();
log.info("Face Engine-detectFace return >> " + result);
imgBase64 = imgBase64.replace("data:image/jpeg;base64,", "");
JSONObject jsonObject = new JSONObject();
jsonObject.put("imageId", StringUtils.isEmpty(imageId)? UUID.randomUUID().toString():imageId);
jsonObject.put("base64Data",imgBase64);
jsonObject.put("detect", true);
JSONArray jsonArray = new JSONArray().fluentAdd(jsonObject);
System.out.println("获取特征值地址:"+faceServer + qualityPath);
String result = OkHttpUtil.postCvJson(faceServer+qualityPath, new JSONObject().fluentPut("images", jsonArray));
System.err.println("人脸检测结果:"+result);
JSONObject resultJson = JSON.parseObject(result);
return resultJson.getJSONArray("result").getJSONObject(0);*/
return resultJson.getJSONArray("result").getJSONObject(0);
}
public JSONObject hasface(String token, String imageId, String imgBase64) {
/********CURL 请求方式********/
/*JSONObject paramJson = new JSONObject();
paramJson.put("imageId", imageId);
paramJson.put("base64Data", imgBase64);
paramJson.put("detect", 1);
String content = paramJson.toJSONString();
String[] cmds = {"curl", "--location", "--request", "POST", faceServer + extractionPath, "--header", "Authorization: Bearer "+token, "--header", "Content-Type: application/json", "--data", content};
String res = execCurl(cmds);
log.info("----------------");
log.info(faceServer);
log.info("----------------");
log.info("Face Engine-detectFace return >> " + res);
JSONObject json = JSONObject.parseObject(res);
JSONObject data = json.getJSONArray("result").getJSONObject(0);
return data;*/
JSONObject json = new JSONObject();
try {
imgBase64 = imgBase64.replaceAll("data:image/jpeg;base64,", "");
JSONObject res = this.getFaceExtraction(token, imageId, imgBase64);
JSONObject obj = res.getJSONArray("faces").getJSONObject(0);
imgBase64 = imgBase64.replace("data:image/jpeg;base64,", "");
JSONObject res = this.getFaceCheck(token, imageId, imgBase64);
if (!obj.isEmpty()) {
if (res != null && res.getBoolean("passed")){
json.put("status", 0);
json.put("data", obj);
json.put("data", res);
return json;
} else {
json.put("status", 500);
@@ -330,62 +154,17 @@ public class FaceServiceSupport {
}
/*****Unirest 请求方式*****/
/*JSONObject paramJson = new JSONObject();
paramJson.put("imageId", imageId);
paramJson.put("base64Data", imgBase64);
paramJson.put("detect", 1);
String content = paramJson.toJSONString();
HttpResponse<String> response = Unirest.post(faceServer + extractionPath)
.header("Authorization", "Bearer "+token)
.header("Content-Type", "application/json")
.body(content)
.asString();
String result = response.getBody();
log.info("Face Engine-detectFace return >> " + result);
JSONObject resultJson = JSON.parseObject(result);
return resultJson.getJSONArray("result").getJSONObject(0);*/
}
public JSONObject regCheckFace(String token, String imageId, String imgBase64) {
/********CURL 请求方式********/
/*JSONObject paramJson = new JSONObject();
paramJson.put("imageId", imageId);
paramJson.put("base64Data", imgBase64);
paramJson.put("detect", 1);
String content = paramJson.toJSONString();
String[] cmds = {"curl", "--location", "--request", "POST", faceServer + extractionPath, "--header", "Authorization: Bearer "+token, "--header", "Content-Type: application/json", "--data", content};
String res = execCurl(cmds);
log.info("----------------");
log.info(faceServer);
log.info("----------------");
log.info("Face Engine-detectFace return >> " + res);
JSONObject json = JSONObject.parseObject(res);
JSONObject data = json.getJSONArray("result").getJSONObject(0);
return data;*/
JSONObject json = new JSONObject();
try {
imgBase64 = imgBase64.replaceAll("data:image/jpeg;base64,", "");
imgBase64 = imgBase64.replace("data:image/jpeg;base64,", "");
JSONObject res = this.getFaceCheck(token, imageId, imgBase64);
Boolean passed = res.getBoolean("passed");
if (!ObjectUtils.anyNotNull(passed)) {
json.put("status", 500);
json.put("data", null);
json.put("errMsg", "所拍摄的照片重人脸不存在");
return json;
}
if (!passed) {
json.put("status", 500);
json.put("data", res);
if (res == null || !res.getBoolean("passed")){
json.fluentPut("status", 500).fluentPut("data", res);
double blur = res.getDouble("blur");
double pose = res.getDouble("pose");
double occ = res.getDouble("occ");
@@ -402,17 +181,12 @@ public class FaceServiceSupport {
errMsg = "人脸检测失败,光线太暗,请到明亮点的地方重新拍摄";
}
json.put("errMsg", errMsg);
json.put("data", res);
json.fluentPut("errMsg", errMsg).fluentPut("data", res);
} else {
json.put("status", 0);
json.put("data", res);
json.put("errMsg", "");
json.fluentPut("status", 0).fluentPut("data", res).fluentPut("errMsg", "");
}
return json;
} catch (Exception e) {
e.printStackTrace();
json.put("status", 500);
@@ -420,26 +194,6 @@ public class FaceServiceSupport {
json.put("errMsg", e.getMessage());
return json;
}
/*****Unirest 请求方式*****/
/*JSONObject paramJson = new JSONObject();
paramJson.put("imageId", imageId);
paramJson.put("base64Data", imgBase64);
paramJson.put("detect", 1);
String content = paramJson.toJSONString();
HttpResponse<String> response = Unirest.post(faceServer + extractionPath)
.header("Authorization", "Bearer "+token)
.header("Content-Type", "application/json")
.body(content)
.asString();
String result = response.getBody();
log.info("Face Engine-detectFace return >> " + result);
JSONObject resultJson = JSON.parseObject(result);
return resultJson.getJSONArray("result").getJSONObject(0);*/
}
@@ -454,17 +208,18 @@ public class FaceServiceSupport {
json.put("errMsg", "imagePath不能为空");
return json;
}
JSONObject faceRectangle = this.hasface("", empId, base64Image);
int status = faceRectangle.getInteger("status");
faceRectangle = faceRectangle.getJSONObject("data");
if (status != 0) {
json.put("status",status);
json.put("errMsg"," 特征值提取失败,"+faceRectangle.getString("errMsg"));
JSONObject faceRectangle = null;
try {
faceRectangle = this.getFaceExtraction("", empId, base64Image);
} catch (Exception e) {
json.put("status",504);
json.put("errMsg",e.getMessage());
return json;
}
if (!ObjectUtils.anyNotNull(faceRectangle) || faceRectangle.getJSONObject("faceRectangle").isEmpty()) {
json.put("status",504);
json.put("errMsg"," 特征值提取失败,上传的头像未找到人脸!");
if (!faceRectangle.containsKey("feature")) {
json.put("status",500);
json.put("errMsg"," 特征值提取失败,"+faceRectangle.getString("errorMessage"));
return json;
}


+ 23
- 13
on-visitor-web/src/main/java/com/lecooai/visitor/web/sys/web/Account2Controller.java Dosyayı Görüntüle

@@ -22,7 +22,6 @@ import com.jeesite.modules.sys.dao.UserDataScopeDao;
import com.jeesite.modules.sys.dao.UserRoleDao;
import com.jeesite.modules.sys.entity.Office;
import com.jeesite.modules.sys.entity.User;
import com.jeesite.modules.sys.entity.UserRole;
import com.jeesite.modules.sys.service.OfficeService;
import com.jeesite.modules.sys.service.UserService;
import com.jeesite.modules.sys.utils.LogUtils;
@@ -30,15 +29,22 @@ import com.jeesite.modules.sys.utils.PwdUtils;
import com.jeesite.modules.sys.utils.UserUtils;
import com.lecooai.visitor.web.controller.WxBaseController;
import com.lecooai.visitor.web.sys.constant.ResponseCode;
import com.lecooai.visitor.web.sys.dao.*;
import com.lecooai.visitor.web.sys.dao.AuditRecordsDao;
import com.lecooai.visitor.web.sys.dao.AuthMappingDao;
import com.lecooai.visitor.web.sys.dao.EmpDao;
import com.lecooai.visitor.web.sys.dao.EmpFaceFeatureDao;
import com.lecooai.visitor.web.sys.dao.EmpUserRoleDao;
import com.lecooai.visitor.web.sys.dao.UserExtraDao;
import com.lecooai.visitor.web.sys.entity.AuditRecords;
import com.lecooai.visitor.web.sys.entity.Emp;
import com.lecooai.visitor.web.sys.service.AdminService;
import com.lecooai.visitor.web.sys.service.UserDataScopeService;
import com.lecooai.visitor.web.sys.service.support.EmpServiceSupport;
import com.lecooai.visitor.web.sys.service.support.FaceServiceSupport;
import com.lecooai.visitor.web.sys.utils.*;
import com.sun.org.apache.regexp.internal.RE;
import com.lecooai.visitor.web.sys.utils.ImageUtil;
import com.lecooai.visitor.web.sys.utils.OfficeEmpUtils;
import com.lecooai.visitor.web.sys.utils.RedisUtils;
import com.lecooai.visitor.web.sys.utils.SendUtil;
import lombok.AllArgsConstructor;
import me.chanjar.weixin.common.error.WxErrorException;
import org.apache.shiro.SecurityUtils;
@@ -51,7 +57,12 @@ import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.stereotype.Controller;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
@@ -627,18 +638,18 @@ public class Account2Controller extends WxBaseController {
} else {
return output(ResponseCode.CW_FACE_IMG_NO_FACE);
}
if (!ObjectUtils.anyNotNull(faceObject.getJSONObject("faceRectangle")) || faceObject.getJSONObject("faceRectangle").isEmpty()) {
return output(ResponseCode.CW_FACE_IMG_NO_FACE);
}
JSONObject json = imageUtil.base64ToStorage(faceImage, true);
String errMsg = "";
if (json.getBoolean("ok")) {
String imgUrl = json.getString("imgUrl");
JSONArray array = faceObject.getJSONArray("feature");
empService.faceUpdate(emp, imgUrl, array.toJSONString());
// empService.updAuthMapping(emp);//修改人脸无需修改mapping表
JSONObject faceRectangle = null;
try {
JSONObject faceJson = faceServiceSupport.getFaceExtraction("", emp.getId(), faceImage);
JSONArray array = faceJson.getJSONArray("feature");
empService.faceUpdate(emp, imgUrl, array.toJSONString());
// empService.updAuthMapping(emp);//修改人脸无需修改mapping表
RedisUtils.setUserVariables(user.getWxOpenid(), user.getUserType().equals("estate")?"1":"0");
sendUtil.sendRegToUser(getOfficeMgrUser(emp),"贵司员工"+emp.getRealName()+"人脸照片已修改,需您审核", emp, SendUtil.TYPE_COMPANY_MGR);
} catch (WxErrorException e) {
@@ -649,8 +660,7 @@ public class Account2Controller extends WxBaseController {
LogUtils.saveLog(user, null, user.getUserName()+"修改人脸照片", "update");
}
JSONObject jsonObject = new JSONObject();
JSONObject jsonObject = new JSONObject();
jsonObject.put("faceImage", faceImage);
jsonObject.put("userCode", userCode);
jsonObject.put("message", errMsg);


+ 10
- 8
on-visitor-web/src/main/java/com/lecooai/visitor/web/sys/web/api/CommonApiController.java Dosyayı Görüntüle

@@ -272,14 +272,13 @@ public class CommonApiController extends BaseController {
String nowTs = map.getString("now_ts");
int maxCnt = map.getInteger("max_cnt");
String sign = map.getString("sign");
MyResponse myResponse = commonCheck(deviceId, timestamp, sign);
NumberFormat nf = NumberFormat.getInstance();
nf.setGroupingUsed(false);
MyResponse myResponse = commonCheck(deviceId, nf.format(Double.parseDouble(timestamp)), sign);
if (myResponse.getStatus() != 0) {
return myResponse;
}
NumberFormat nf = NumberFormat.getInstance();
nf.setGroupingUsed(false);
String ts = nf.format(Double.parseDouble(nowTs));
List<AuthMapping> list = authMappingDao.getByDevAndTime(deviceId, ts, maxCnt);
JSONObject ja = new JSONObject();
@@ -338,8 +337,10 @@ public class CommonApiController extends BaseController {
String faceScore = map.containsKey("faceScore") ? map.getString("faceScore") : "0";
String imgbase64 = map.getString("imgbase64");
String sign = map.getString("sign");
NumberFormat nf = NumberFormat.getInstance();
nf.setGroupingUsed(false);
MyResponse myResponse = commonCheck(deviceId, timestamp, sign);
MyResponse myResponse = commonCheck(deviceId, nf.format(Double.parseDouble(timestamp)), sign);
if (myResponse.getStatus() != 0) {
return myResponse;
}
@@ -401,8 +402,10 @@ public class CommonApiController extends BaseController {
if (myResponse.getStatus() != 0) {
return myResponse;
}
NumberFormat nf = NumberFormat.getInstance();
nf.setGroupingUsed(false);
myResponse = commonCheck(devId, timestamp, sign);
myResponse = commonCheck(devId, nf.format(Double.parseDouble(timestamp)), sign);
if (myResponse.getStatus() != 0) {
return myResponse;
}
@@ -543,8 +546,7 @@ public class CommonApiController extends BaseController {
JSONObject faceObject = faceServiceSupport.hasface("", "", faceImage);
if (ObjectUtils.anyNotNull(faceObject.get("data"))) {
faceObject = faceObject.getJSONObject("data");
}
if (!ObjectUtils.anyNotNull(faceObject) || !ObjectUtils.anyNotNull(faceObject.getJSONObject("faceRectangle")) || faceObject.getJSONObject("faceRectangle").isEmpty()) {
} else {
return output(ResponseCode.CW_FACE_IMG_NO_FACE);
}


+ 4
- 6
on-visitor-web/src/main/java/com/lecooai/visitor/web/sys/web/api/FaceApiController.java Dosyayı Görüntüle

@@ -99,15 +99,13 @@ public class FaceApiController extends BaseController {
token = faceServiceSupport.getToken();
logger.info(Global.getConfig("faceServerI.hasAuthorize"));
}
json = faceServiceSupport.getFaceExtraction(token, empId, base64Image);
obj = json.getJSONArray("faces").getJSONObject(0).getJSONArray("feature");
faceRectangle = json.getJSONArray("faces").getJSONObject(0).getJSONObject("faceRectangle");
if (!faceRectangle.isEmpty()) {
if (json.containsKey("feature")) {
obj = json.getJSONArray("feature");
faceFlag = true;
} else {
return "人脸特征值提取失败!";
}
} catch (Exception e) {
e.printStackTrace();


+ 325
- 0
on-visitor-web/src/main/java/com/lecooai/visitor/web/utils/OkHttpUtil.java Dosyayı Görüntüle

@@ -0,0 +1,325 @@
package com.lecooai.visitor.web.utils;

/**
* @author yk
* @description
* @date 2024-05-07 18:08
*/
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import lombok.SneakyThrows;
import okhttp3.*;

import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLSocketFactory;
import javax.net.ssl.TrustManager;
import javax.net.ssl.X509TrustManager;
import java.io.IOException;
import java.net.URLEncoder;
import java.security.SecureRandom;
import java.security.cert.X509Certificate;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.concurrent.Semaphore;
import java.util.concurrent.TimeUnit;

public class OkHttpUtil {
private static volatile OkHttpClient okHttpClient = null;
private static volatile Semaphore semaphore = null;
private Map<String, String> headerMap;
private Map<String, String> paramMap;
private String url;
private Request.Builder request;

/**
* 初始化okHttpClient,并且允许https访问
*/
private OkHttpUtil() {
if (okHttpClient == null) {
synchronized (OkHttpUtil.class) {
if (okHttpClient == null) {
TrustManager[] trustManagers = buildTrustManagers();
okHttpClient = new OkHttpClient.Builder()
.connectTimeout(15, TimeUnit.SECONDS)
.writeTimeout(20, TimeUnit.SECONDS)
.readTimeout(20, TimeUnit.SECONDS)
.sslSocketFactory(createSSLSocketFactory(trustManagers), (X509TrustManager) trustManagers[0])
.hostnameVerifier((hostName, session) -> true)
.retryOnConnectionFailure(true)
.build();
addHeader("User-Agent", "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36");
}
}
}
}

/**
* 用于异步请求时,控制访问线程数,返回结果
*
* @return
*/
private static Semaphore getSemaphoreInstance() {
//只能1个线程同时访问
synchronized (OkHttpUtil.class) {
if (semaphore == null) {
semaphore = new Semaphore(0);
}
}
return semaphore;
}

/**
* 创建OkHttpUtil
*
* @return
*/
public static OkHttpUtil builder() {
return new OkHttpUtil();
}

/**
* 添加url
*
* @param url
* @return
*/
public OkHttpUtil url(String url) {
this.url = url;
return this;
}

/**
* 添加参数
*
* @param key 参数名
* @param value 参数值
* @return
*/
public OkHttpUtil addParam(String key, String value) {
if (paramMap == null) {
paramMap = new LinkedHashMap<>(16);
}
paramMap.put(key, value);
return this;
}

/**
* 添加请求头
*
* @param key 参数名
* @param value 参数值
* @return
*/
public OkHttpUtil addHeader(String key, String value) {
if (headerMap == null) {
headerMap = new LinkedHashMap<>(16);
}
headerMap.put(key, value);
return this;
}

/**
* 初始化get方法
*
* @return
*/
public OkHttpUtil get() {
request = new Request.Builder().get();
StringBuilder urlBuilder = new StringBuilder(url);
if (paramMap != null) {
urlBuilder.append("?");
try {
for (Map.Entry<String, String> entry : paramMap.entrySet()) {
urlBuilder.append(URLEncoder.encode(entry.getKey(), "utf-8")).
append("=").
append(URLEncoder.encode(entry.getValue(), "utf-8")).
append("&");
}
} catch (Exception e) {
e.printStackTrace();
}
urlBuilder.deleteCharAt(urlBuilder.length() - 1);
}
request.url(urlBuilder.toString());
return this;
}

/**
* 初始化post方法
*
* @param isJsonPost true等于json的方式提交数据,类似postman里post方法的raw
* false等于普通的表单提交
* @return
*/
public OkHttpUtil post(boolean isJsonPost) {
RequestBody requestBody;
if (isJsonPost) {
String json = "";
if (paramMap != null) {
json = JSON.toJSONString(paramMap);
}
requestBody = RequestBody.create(MediaType.parse("application/json; charset=utf-8"), json);
} else {
FormBody.Builder formBody = new FormBody.Builder();
if (paramMap != null) {
paramMap.forEach(formBody::add);
}
requestBody = formBody.build();
}
request = new Request.Builder().post(requestBody).url(url);
return this;
}

/**
* 同步请求
*
* @return
*/
public String sync() {
setHeader(request);
try {
Response response = okHttpClient.newCall(request.build()).execute();
assert response.body() != null;
return response.body().string();
} catch (IOException e) {
e.printStackTrace();
return "请求失败:" + e.getMessage();
}
}

/**
* 异步请求,有返回值
*/
public String async() {
StringBuilder buffer = new StringBuilder("");
setHeader(request);
okHttpClient.newCall(request.build()).enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
buffer.append("请求出错:").append(e.getMessage());
}

@Override
public void onResponse(Call call, Response response) throws IOException {
assert response.body() != null;
buffer.append(response.body().string());
getSemaphoreInstance().release();
}
});
try {
getSemaphoreInstance().acquire();
} catch (InterruptedException e) {
e.printStackTrace();
}
return buffer.toString();
}

/**
* 异步请求,带有接口回调
*
* @param callBack
*/
public void async(ICallBack callBack) {
setHeader(request);
okHttpClient.newCall(request.build()).enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
callBack.onFailure(call, e.getMessage());
}

@Override
public void onResponse(Call call, Response response) throws IOException {
assert response.body() != null;
callBack.onSuccessful(call, response.body().string());
}
});
}

/**
* 为request添加请求头
*
* @param request
*/
private void setHeader(Request.Builder request) {
if (headerMap != null) {
try {
for (Map.Entry<String, String> entry : headerMap.entrySet()) {
request.addHeader(entry.getKey(), entry.getValue());
}
} catch (Exception e) {
e.printStackTrace();
}
}
}


/**
* 生成安全套接字工厂,用于https请求的证书跳过
*
* @return
*/
private static SSLSocketFactory createSSLSocketFactory(TrustManager[] trustAllCerts) {
SSLSocketFactory ssfFactory = null;
try {
SSLContext sc = SSLContext.getInstance("SSL");
sc.init(null, trustAllCerts, new SecureRandom());
ssfFactory = sc.getSocketFactory();
} catch (Exception e) {
e.printStackTrace();
}
return ssfFactory;
}

private static TrustManager[] buildTrustManagers() {
return new TrustManager[]{
new X509TrustManager() {
@Override
public void checkClientTrusted(X509Certificate[] chain, String authType) {
}

@Override
public void checkServerTrusted(X509Certificate[] chain, String authType) {
}

@Override
public X509Certificate[] getAcceptedIssuers() {
return new X509Certificate[]{};
}
}
};
}

/**
* 自定义一个接口回调
*/
public interface ICallBack {

void onSuccessful(Call call, String data);

void onFailure(Call call, String errorMsg);

}

/**
* @Author yangkai
* @Description 联想研究院新算法,请求模版
* @Date 2024/5/8
* @Param [url, json]
* @return java.lang.String
**/
public static String postCvJson(String url, JSONObject json) throws Exception{
OkHttpClient client = new OkHttpClient().newBuilder()
.build();
MediaType mediaType = MediaType.parse("application/json");
RequestBody body = RequestBody.create(mediaType, json.toJSONString());

Request request = new Request.Builder()
.url(url)
.method("POST", body)
.addHeader("Content-Type", "application/json")
.addHeader("Authorization", "Basic ZmFjZS1tYW5hZ2VtZW50OmZhY2UtbWFuYWdlbWVudA==")
.build();
Response response = client.newCall(request).execute();
return response.body().string();
}
}

+ 2
- 2
on-visitor-web/src/main/resources/config/application-dev.yml Dosyayı Görüntüle

@@ -188,8 +188,8 @@ mqttClient:
serverPort: 1883
clientId: mqtt_clientid_dev_2002
faceServerI:
ip: 8.131.78.156
port: 5000
ip: 123.56.73.158
port: 30306
user: lecooai_hw01
password: lecooai@2021
hasAuthorize: false


+ 4
- 3
on-visitor-web/src/main/resources/config/application.yml Dosyayı Görüntüle

@@ -531,10 +531,11 @@ mqtt:
face:
server: http://${faceServerI.ip}:${faceServerI.port}
updServer: http://${faceServerII.ip}:${faceServerII.port}
authorizePath: /authorize
# authorizePath: /authorize
# extractionPath: /apps/v1/function/cv/face-extraction
extractionPath: /cv/feature-extraction-service/1.7
qualityPath: /cv/quality/1.7
authorizePath: /authorize
extractionPath: /apps/v1/solution/cv/face-extraction
qualityPath: /apps/v1/solution/cv/face-quality
modeUpdate: true
modeUpdEmps: "'beeefac44ef94daca475ff85a5c720cd','65f061754e204484a955aba8154eec14','a0a0f615ec374d9bb1e1ace496e586d7','e83e30d959144a65b83beb3b841c10b5','0601b9fc00204224a671bcd47040be30','7cabfde922354b41ae66841e3d0cc4d3'"



+ 0
- 1
on-visitor-web/src/main/webapp/.gitignore Dosyayı Görüntüle

@@ -1 +0,0 @@
/WEB-INF/

Yükleniyor…
İptal
Kaydet