package com.cloud.retrieve.service.serviceImpl;
|
|
import com.alibaba.fastjson.JSONObject;
|
import com.cloud.common.model.FileInfos;
|
import com.cloud.common.utils.FastDFSUtil;
|
import com.cloud.common.utils.RestTemplateUtil;
|
import com.cloud.retrieve.dao.CulOrDevDao;
|
import com.cloud.retrieve.model.FaceResults;
|
import com.cloud.retrieve.service.SearchPhotoService;
|
import com.cloud.retrieve.service.UserService;
|
import com.cloud.retrieve.service.impl.EsDataServiceImpl;
|
import com.cloud.retrieve.utils.*;
|
import lombok.extern.log4j.Log4j;
|
import lombok.extern.slf4j.Slf4j;
|
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.data.redis.core.RedisTemplate;
|
import org.springframework.http.MediaType;
|
import org.springframework.stereotype.Service;
|
import org.springframework.web.multipart.MultipartFile;
|
import java.util.*;
|
|
import static com.alibaba.fastjson.JSON.parseArray;
|
|
@Slf4j
|
@Service
|
public class SearchPhotoServiceImpl implements SearchPhotoService {
|
|
@Autowired
|
private EnumStr enumStr;
|
@Autowired
|
private RestTemplateUtil restTemplateUtil;
|
@Autowired
|
private ImageUtils imageUtils;
|
@Autowired
|
private RedisTemplate redisTemplate;
|
@Autowired
|
private EsDataServiceImpl esDataServiceImpl;
|
@Autowired
|
private UserService userService;
|
@Autowired
|
private FastDFSUtil fastDFSUtil;
|
@Override
|
public Map extractFace(MultipartFile file,int picQuality){
|
FileInfos fileInfo = fastDFSUtil.upload(file);
|
JSONObject paramMap = new JSONObject();
|
paramMap.put("fileInfo",fileInfo);
|
paramMap.put("picQuality",picQuality);
|
|
String post = restTemplateUtil.postImg(enumStr.getExtractFace(), paramMap, MediaType.APPLICATION_JSON_UTF8,String.class, false );
|
JSONObject jsonMap = JSONObject.parseObject(post);
|
Map map = (Map)jsonMap.get("data");
|
List<FaceResults> list = parseArray(JSONObject.parseObject(jsonMap.getString("data")).getString("list"), FaceResults.class);
|
List<String> urlList = new ArrayList<>();
|
List<String> featureList = new ArrayList<>();
|
if(list!=null){
|
for (FaceResults faceResults:list) {
|
if(faceResults!=null){
|
log.info(faceResults.left+"====="+faceResults.top+"====="+faceResults.width+"====="+ faceResults.height);
|
FileInfos fileInf = imageUtils.cutPhotoFromFast(fileInfo, faceResults.left, faceResults.top, faceResults.width, faceResults.height);
|
urlList.add(fileInf.getPath());//enumStr.getHttpImgUrl()+"/"+
|
featureList.add(Base64Utils.byteToBase64(faceResults.getFeature()));
|
}
|
}
|
}
|
Map result = new HashMap();
|
result.put("bigPhotoPath",fileInfo.getPath());
|
result.put("smallPhotoPath",urlList);
|
result.put("featureBase64",featureList);
|
return result;
|
}
|
|
@Override
|
public Map findLikerPics(Map<String,Object> params){
|
// 根据path作为redis的key寻找所对应的集合,如果没有再往3697转发比对查询,返回的应该是从es中查询出来的封装了比分的数据对象
|
List<Map> esList = new ArrayList<>();
|
List<Map> baseList = new ArrayList<>();
|
Map resultMap = new HashMap();
|
Long start = (Long.valueOf(params.get("page")+"") -1)* Long.valueOf(params.get("length")+"");
|
Long end = (Long.valueOf(params.get("page")+""))* Long.valueOf(params.get("length")+"")-1;
|
log.info("开始:"+start+" 结束:"+end);
|
String eskey = (String)params.get("path")+enumStr.getEsListkey();
|
String basekey = (String)params.get("path")+enumStr.getBaseListkey();
|
Long esDataTotle = null;
|
Long baseDataTotle = null;
|
if(Long.valueOf(params.get("page")+"")!=1){
|
log.info("直接在redis中取数据");
|
if(redisTemplate.hasKey(eskey)){
|
esDataTotle = (Long) redisTemplate.opsForList().size(eskey);
|
esList = redisTemplate.opsForList().range(eskey,start,end);
|
}
|
if(redisTemplate.hasKey(basekey)){
|
baseDataTotle = (Long) redisTemplate.opsForList().size(basekey);
|
baseList = redisTemplate.opsForList().range(basekey,0,-1);
|
}
|
log.info("es数据总数为"+esDataTotle+"--base数据总数为"+baseDataTotle);
|
}else{
|
log.info("去3697中比对后取数据");
|
JSONObject paramMap = new JSONObject();
|
paramMap.put("params",params);
|
String post = restTemplateUtil.postImg(enumStr.getFindLikerPics(), paramMap, MediaType.APPLICATION_JSON_UTF8,String.class, false );
|
log.info("3697返回"+post);
|
JSONObject jsonMap = JSONObject.parseObject(post);
|
if(redisTemplate.hasKey(eskey)){
|
esDataTotle = (Long) redisTemplate.opsForList().size(eskey);
|
esList = redisTemplate.opsForList().range(eskey,start,end);
|
}
|
if(redisTemplate.hasKey(basekey)){
|
baseDataTotle = (Long) redisTemplate.opsForList().size(basekey);
|
baseList = redisTemplate.opsForList().range(basekey,0,-1);
|
}
|
log.info("es数据总数为"+esDataTotle+"--base数据总数为"+baseDataTotle);
|
}
|
// 底库数据处理
|
if(baseList!=null && baseList.size() > 0){
|
baseList.forEach(map -> {
|
String type = (String) map.get("type");
|
if ("100".equals(type)){
|
map.put("no",null);
|
}else if ("200".equals(type)){
|
map.put("phone",null);
|
}
|
});
|
}
|
JSONObject path = esDataServiceImpl.getPersonnLocusByRedis((String)params.get("path"));
|
//给es中含有人员id的数据都拼上人员信息
|
if(esList!=null && esList.size() > 0){
|
esList.forEach(map -> {
|
respSource(map);
|
});
|
}
|
resultMap.put("esDataTotle",esDataTotle);
|
resultMap.put("baseDataTotle",baseDataTotle);
|
resultMap.put("esList",esList);
|
resultMap.put("baseList",baseList);
|
resultMap.put("path",path);
|
return resultMap;
|
}
|
|
/**
|
* 只返回 es 数据
|
* @param params
|
* @return
|
*/
|
@Override
|
public Map findLikerPicsRtnEsData(Map<String,Object> params) {
|
// 根据path作为redis的key寻找所对应的集合,如果没有再往3697转发比对查询,返回的应该是从es中查询出来的封装了比分的数据对象
|
List<Map> esList = new ArrayList<>();
|
Map resultMap = new HashMap();
|
Long start = (Long.valueOf(params.get("page")+"") -1)* Long.valueOf(params.get("length")+"");
|
Long end = (Long.valueOf(params.get("page")+""))* Long.valueOf(params.get("length")+"")-1;
|
log.info("开始:"+start+" 结束:"+end);
|
String eskey = (String)params.get("path")+enumStr.getEsListkey();
|
Long esDataTotle = null;
|
if(Long.valueOf(params.get("page")+"")!=1){
|
if(redisTemplate.hasKey(eskey)) {
|
esDataTotle = (Long) redisTemplate.opsForList().size(eskey);
|
log.info("es数据总数为" + esDataTotle);
|
esList = redisTemplate.opsForList().range(eskey, start, end);
|
}
|
}else{
|
log.info("去3697中比对后取随行人员数据");
|
JSONObject paramMap = new JSONObject();
|
paramMap.put("params",params);
|
String post = restTemplateUtil.postImg(enumStr.getFindLikerPics(), paramMap, MediaType.APPLICATION_JSON_UTF8,String.class, false );
|
log.info("3697返回es 数据"+post);
|
JSONObject jsonMap = JSONObject.parseObject(post);
|
if(redisTemplate.hasKey(eskey)) {
|
esDataTotle = (Long) redisTemplate.opsForList().size(eskey);
|
log.info("es数据总数为" + esDataTotle);
|
esList = redisTemplate.opsForList().range(eskey, start, end);
|
}
|
}
|
//给es中含有人员id的数据都拼上人员信息
|
if(esList!=null && esList.size() > 0){
|
esList.forEach(map -> {
|
respSource(map);
|
});
|
}
|
resultMap.put("esTotle",esDataTotle);
|
resultMap.put("esList",esList);
|
return resultMap;
|
}
|
|
// 返回数据 source 特殊处理
|
private void respSource(Map<String,Object> source){
|
String sdkType = (String) source.get("sdkType");
|
// sdkType 类型 进行处理
|
// personId 'waittodo' 处理
|
String personId = (String) source.get("personId");
|
if (personId!=null && !personId.isEmpty() ){
|
if ( personId.contains("wait todo")){
|
source.put("personId","");
|
}else {
|
// 查询数据库 name, gender, cardId, phone,b.`no` numCard,o.name orgName
|
// Map<String, Object> respMap = culOrDevDao.selectPersonDetailById(personId);
|
Map respMap = userService.queryUserInfoById(personId);
|
if (respMap != null){
|
String name = (String) respMap.get("name");
|
source.put("name",name);
|
source.put("gender",(String) respMap.get("gender")); //
|
source.put("cardId",(String) respMap.get("cardId"));
|
source.put("phone",(String) respMap.get("phone"));
|
source.put("no",(String) respMap.get("no"));
|
source.put("orgName",(String) respMap.get("orgName"));
|
}
|
}
|
}
|
// 底库名称处理
|
String baseName = (String) source.get("BaseName");
|
if(baseName!=null && baseName.startsWith("lt_")){
|
source.put("BaseName", baseName.substring(3));
|
}else if (baseName.contains("wait todo")){
|
source.put("BaseName","");
|
}
|
// Age 处理
|
/* Object age = source.get("Age");
|
if(age!=null){
|
int agei = -1;
|
try {
|
agei = (Integer)age;
|
} catch (ClassCastException e){
|
agei = Integer.valueOf((String)age);
|
log.info(e.getLocalizedMessage());
|
}
|
if(agei>0 && agei < 7){
|
age ="童年";
|
}else if(agei>=7 && agei < 18){
|
age ="少年";
|
}else if(agei>=18 && agei < 40){
|
age ="青年";
|
}else if(agei>=40 && agei < 65){
|
age ="中年";
|
}else if(agei>= 65){
|
age ="老年";
|
}
|
}else {age = "";}*/
|
}
|
}
|