package com.basic.analy.service.impl; import com.alibaba.fastjson.JSONObject; import com.basic.analy.config.Result; import com.basic.analy.controller.FileController; import com.basic.analy.dao.MergeFromDao; import com.basic.analy.entity.FaceResults; import com.basic.analy.model.BbFace; import com.basic.analy.dao.BbFaceDao; import com.basic.analy.dao.BbPersonBaseDao; import com.basic.analy.model.BbPerson; import com.basic.analy.model.MergeFrom; import com.basic.analy.service.BbPersonBaseService; import com.basic.analy.service.FaceSdkTool; import org.apache.log4j.Logger; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpStatus; import org.springframework.http.MediaType; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.util.*; @Service public class BbPersonBaseServiceImpl implements BbPersonBaseService { @Autowired private BbPersonBaseDao bbPersonBaseDao; @Autowired private BbFaceDao bbFaceDao; @Autowired private MergeFromDao mergeFromDao; @Autowired private BbPersonTemporaryServiceImpl temporaryServiceImpl; private Logger log = Logger.getLogger(FileController.class); @Override @Transactional public void insert(BbPerson bbPersonTemporary, BbFace bbFace) { try { String faceIds= UUID.randomUUID().toString(); bbPersonTemporary.setFaceIds(faceIds); bbPersonTemporary.setCreateTime(new Date()); bbPersonBaseDao.insertFromTemp(bbPersonTemporary); bbFace.setResourceId(faceIds); bbFace.setCreateTime(new Date()); bbFaceDao.insertSelective(bbFace); }catch (Exception e){ e.printStackTrace(); } } @Override @Transactional public void insert1(BbPerson bbPersonBase) { try { bbPersonBaseDao.insertSelective(bbPersonBase); }catch (Exception e){ e.printStackTrace(); } } @Override @Transactional public void save(BbPerson bbPersonTemporary) { try { bbPersonTemporary.setUpdateTime(new Date()); bbPersonBaseDao.updateByPrimaryKeySelective(bbPersonTemporary); }catch (Exception e){ e.printStackTrace(); } } @Override public BbPerson selectById(String id) { BbPerson bbPersonBase = bbPersonBaseDao.selectByPrimaryKey(id); return bbPersonBase; } @Override public List select(Map param) { List list = bbPersonBaseDao.findData(param); return list; } @Override public List selectAllAndFeature(String exPersonId) { return bbPersonBaseDao.selectAllAndFeature( exPersonId ); } @Override public void delete(String id) { bbPersonBaseDao.updateByPrimaryKey(id); } @Override public int count(Map param) { int num = bbPersonBaseDao.count(param); return num; } @Override public String findFaceIdsByPhoto(String photos) { return bbPersonBaseDao.findFaceIdsByPhoto(photos); } @Transactional @Override public void merge(String id,String mergeId,String userName) { String[] mergeFrom = mergeId.split(","); for (String s : mergeFrom) { bbPersonBaseDao.updateByPrimaryKey(s); } /** * 在新增之前先判断表中是否已存在该数据 */ System.out.println("打印的idid为"+id); MergeFrom merge = mergeFromDao.findById(id); // System.out.println("打印的合并id为"+merge.getId()); if(merge!=null && merge.getId()!=null){ /** * 能查出的话,说明库中有此人员 */ mergeFromDao.deleteMergePerson(merge.getId()); MergeFrom mergeFrom1 = new MergeFrom(); mergeFrom1.setPersonId(id); mergeFrom1.setMergeFrom(mergeId); mergeFrom1.setCreateTime(new Date()); mergeFrom1.setCreateBy(userName); mergeFromDao.insertSelective(mergeFrom1); }else { MergeFrom mergeFrom1 = new MergeFrom(); mergeFrom1.setPersonId(id); mergeFrom1.setMergeFrom(mergeId); mergeFrom1.setCreateTime(new Date()); mergeFrom1.setCreateBy(userName); mergeFromDao.insertSelective(mergeFrom1); } } @Transactional @Override public Result editToSave(Map jsonMap, String userName) { Object obj =jsonMap.get("bean"); String s = JSONObject.toJSONString(obj); BbPerson bbPersonTemporary=JSONObject.parseObject(s,BbPerson.class); String isMerge = (String)jsonMap.get("isMerge"); String mergeId = (String)jsonMap.get("mergeFrom"); String[] mergeFrom = null; if(mergeId!=null&&!mergeId.equals("")){ mergeFrom = mergeId.split(","); } if(isMerge.equals("0")){ //未合并,确定要新增 log.info("临时库,未合并,直接新增"); bbPersonTemporary.setCreateBy(userName); bbPersonTemporary.setCreateTime(new Date()); insert1(bbPersonTemporary); //在临时库中删除此人 temporaryServiceImpl.delete(bbPersonTemporary.getId()); }else { //要保存的是合并后的人 //如果是临时库里来的,则有路径有特征值和总库一样,但某id所对应的图片变了则其对应的特征值也要变,需要由图片路径查到faceids,更新保存人员的faceids boolean containId = temporaryServiceImpl.isContainId(bbPersonTemporary.getId()); if(containId){ //如果containId为true则临时库有此人,说明用的是临时库的id,此操作为新增 log.info("containId为true则临时库有此人,说明用的是临时库的id,此操作为新增"); bbPersonTemporary.setCreateBy(userName); bbPersonTemporary.setCreateTime(new Date()); insert1(bbPersonTemporary); //将被合并的人从总库删除并在mergeFrom表中插入一条数据 for (String s1 : mergeFrom) { log.info("删除了这个id的人"+s1); delete(s1); } merge(bbPersonTemporary.getId(),mergeId,userName); //在临时库中删除此人 temporaryServiceImpl.delete(bbPersonTemporary.getId()); }else{ //如果containId为false则临时库无此人,说明用的是总库的id,此操作为更新、 this.save(bbPersonTemporary); //将被合并的人从总库和临时库中删除并在mergeFrom表中插入一条数据 for (String s1 : mergeFrom) { log.info("删除了这个id的人"+s1); //不判断某个id具体是哪个库里的人,对于每个id各删一遍 this.delete(s1); temporaryServiceImpl.delete(s1); } merge(bbPersonTemporary.getId(),mergeId,userName); } } return Result.custom("保存成功", HttpStatus.OK.value(),true,""); } public List selectLikerPerson(int liker, byte[] imageData) throws Exception { //从底库拿到所有人的特征值(需要一个关联查询faceIDs resourceId) List featureList = selectAllAndFeature(null); log.info("底库中需要对比的人脸有:"+featureList.size()+"份数据"); // byte[] imgdata = FastDFSUtil2.downloadFDFS(path.substring(0,6),path.substring(7)); // ArrayList faceResults = FaceSdkTool.extractFace(imageData); List baseList = new ArrayList<>(); if(featureList.size()>0){ for(Map featureMap : featureList){ Float likeVal =0.0f; if((byte[])featureMap.get("feature")!=null && !"".equals((byte[])featureMap.get("feature"))){ likeVal = FaceSdkTool.compareFeature((byte[])featureMap.get("feature"), imageData); // log.info("相似值liker是:"+likeVal); } if(likeVal*100>liker){ featureMap.put("liker",Math.round(likeVal*100)); featureMap.remove("feature"); baseList.add(featureMap); } } } return baseList; } }