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 list = parseArray(JSONObject.parseObject(jsonMap.getString("data")).getString("list"), FaceResults.class); List urlList = new ArrayList<>(); List 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 params){ // 根据path作为redis的key寻找所对应的集合,如果没有再往3697转发比对查询,返回的应该是从es中查询出来的封装了比分的数据对象 List esList = new ArrayList<>(); List 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 params) { // 根据path作为redis的key寻找所对应的集合,如果没有再往3697转发比对查询,返回的应该是从es中查询出来的封装了比分的数据对象 List 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 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 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 = "";}*/ } }