package me.zhengjie.domain.notary.impl; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import me.zhengjie.base.ResultCode; import me.zhengjie.base.config.thread.ThreadPoolExecutorUtil; import me.zhengjie.base.face.FaceCompareHandle; import me.zhengjie.base.util.FileUploadUtil; import me.zhengjie.base.util.JuheServiceUtil; import me.zhengjie.base.util.tencent.utils.HttpClientUtil; import me.zhengjie.base.util.tencent.utils.Img2Base64Util; import me.zhengjie.dao.mybatis.FaceCompareRepository; import me.zhengjie.dao.mybatis.entity.*; import me.zhengjie.dao.mybatis.mapper.ContractOrderMapper; import me.zhengjie.dao.mybatis.mapper.FileInfoMapper; import me.zhengjie.dao.mybatis.mapper.SysUserMapper; import me.zhengjie.domain.img.CompareImageDomain; import me.zhengjie.domain.notary.NotaryDomain; import me.zhengjie.utils.RedisUtils; import org.springframework.stereotype.Component; import org.springframework.util.ObjectUtils; import java.io.*; import static com.arcsoft.face.toolkit.ImageFactory.getRGBData; @Component @RequiredArgsConstructor @Slf4j public class NotaryDomainImpl implements NotaryDomain { private final SysUserMapper userMapper; private final ContractOrderMapper contractOrderMapper; private final RedisUtils redis; private final FaceCompareRepository thirdPartyInterfaceRepository; private final FaceCompareHandle faceCompareHandle; /** * 获取base64取消文件头 * * @param base64 * @return */ public String getBase64(String base64) { String[] base64s = base64.split("base64"); if (base64s != null && base64s.length > 1) { base64 = base64s[1]; } return base64; } /** * app端的人脸核身 * * @param compareImageDomain * @return */ public ResultCode appCompareFace(CompareImageDomain compareImageDomain) { FaceCompareEntity thirdPartyInterfaceEntity = new FaceCompareEntity(); String base64 = compareImageDomain.getBase64(); if (base64 == null) { return ResultCode.PARAM_IS_BLANK; } base64 = getBase64(base64); String idCard = compareImageDomain.getIdCard(); String nickName = compareImageDomain.getName(); //根据业务编号获取订单 判断当事人名字 String businessNo = compareImageDomain.getBusinessNo(); QueryWrapper contractOrderEntityQueryWrapper = new QueryWrapper<>(); contractOrderEntityQueryWrapper.eq("business_no", businessNo); ContractOrderEntity contractOrderEntity = contractOrderMapper.selectOne(contractOrderEntityQueryWrapper); Integer id = null; //看是哪个当事人 if (nickName.equals(contractOrderEntity.getName())) { id = contractOrderEntity.getCompareImgId(); } else if (nickName.equals(contractOrderEntity.getJointName())) { id = contractOrderEntity.getJointCompareImgId(); } //后面需要的三个参数 base64 身份证号 姓名 String redisCount = "idCard:" + idCard + ":COUNT:"; Integer count = null; if (redis.hasKey(redisCount)) { count = (Integer) redis.get(redisCount); System.err.println("redis存入次数" + count); } File base = null; try { base = File.createTempFile("compare", ".jpeg"); base.deleteOnExit(); } catch (IOException e) { throw new RuntimeException(e); } if (!Img2Base64Util.generateImage(base64, base.getPath())) { log.info("base64转图片异常"); return ResultCode.FACEAUTH_FAIL; } if (!faceCompareHandle.imageSingle(base)){ return ResultCode.SINGLE_PERSON; } thirdPartyInterfaceEntity.setBusinessNo(compareImageDomain.getBusinessNo()); thirdPartyInterfaceEntity.setConsultNo(contractOrderEntity.getConsultNo()); FileInfoEntity fileInfo = faceCompareHandle.uploadFaceFile(base64); boolean redisFlag = (count != null && count >= 2); if (ObjectUtils.isEmpty(id) || redisFlag) { if (! faceCompareHandle.imageCenter(base)){ return ResultCode.IMAGE_NOT_STANDARD; } //要做人脸核身 thirdPartyInterfaceEntity = JuheServiceUtil.URLPost(idCard, nickName, base64,thirdPartyInterfaceEntity); thirdPartyInterfaceEntity.setFileId(fileInfo.getId() + ""); thirdPartyInterfaceRepository.insert(thirdPartyInterfaceEntity); if (thirdPartyInterfaceEntity.getResult() == 1) { ContractOrderEntity orderEntity = new ContractOrderEntity(); orderEntity.setId(contractOrderEntity.getId()); //判断是共同责任人还是当事人 if (nickName.equals(contractOrderEntity.getName())) { orderEntity.setCompareImgId(fileInfo.getId()); } if (nickName.equals(contractOrderEntity.getJointName())) { orderEntity.setJointCompareImgId(fileInfo.getId()); } contractOrderMapper.updateById(orderEntity); log.info("当事人人脸核身通过"); redis.del(redisCount); return ResultCode.SUCCESS; } return ResultCode.LIVE_VIDEO_INVALID; } //要做照片比对 /*if (!compareImage(base, id, redisCount, count)) { return ResultCode.LIVE_VIDEO_INVALID; }*/ ResultCode resultCode = faceCompareHandle.compareImage(base, id, redisCount, thirdPartyInterfaceEntity); if (resultCode.code()==100){ if (count != null) { redis.del(redisCount); } } return resultCode; } /** * 照片比对 * * @param compareImageDomain * @return */ public ResultCode compareFace(CompareImageDomain compareImageDomain) { FaceCompareEntity faceCompareEntity = new FaceCompareEntity(); String base64 = compareImageDomain.getBase64(); if (base64 == null) { return ResultCode.PARAM_IS_BLANK; } base64 = getBase64(base64); //先判断是银行客户经理还是当事人 String roleId = compareImageDomain.getRoleId(); SysUserEntity sysUserEntity = null; String idCard = compareImageDomain.getIdCard(); String nickName = compareImageDomain.getName(); QueryWrapper orderEntityQueryWrapper = new QueryWrapper<>(); orderEntityQueryWrapper.eq("business_no", compareImageDomain.getBusinessNo()); ContractOrderEntity contractOrder = contractOrderMapper.selectOne(orderEntityQueryWrapper); if (ObjectUtils.isEmpty(contractOrder)) { return ResultCode.PARAM_IS_INVALID; } Integer compareImageId = null; boolean flag = "-1".equals(roleId); if (flag) { //说明是银行客户经理 QueryWrapper contractOrderEntityQueryWrapper = new QueryWrapper<>(); //通过business_no 和 客户经理姓名 判断是不是当前客户经理 contractOrderEntityQueryWrapper.eq("business_no", compareImageDomain.getBusinessNo()).eq("customer_name", compareImageDomain.getName()); ContractOrderEntity contractOrderEntity = contractOrderMapper.selectOne(contractOrderEntityQueryWrapper); if (ObjectUtils.isEmpty(contractOrderEntity)) { return ResultCode.ACCOUNT_MANAGER_NO_ASSIGNED; } QueryWrapper sysUserEntityQueryWrapper = new QueryWrapper<>(); sysUserEntityQueryWrapper.eq("id_card", idCard).eq("nick_name", nickName); sysUserEntity = userMapper.selectOne(sysUserEntityQueryWrapper); } else { //说明是当事人 if (nickName.equals(contractOrder.getName())) { compareImageId = contractOrder.getCompareImgId(); } else if (nickName.equals(contractOrder.getJointName())) { compareImageId = contractOrder.getJointCompareImgId(); } } faceCompareEntity.setBusinessNo(compareImageDomain.getBusinessNo()); faceCompareEntity.setConsultNo(contractOrder.getConsultNo()); faceCompareEntity.setIdCard(idCard); faceCompareEntity.setName(nickName); //后面需要的三个参数 base64 身份证号 姓名 String redisCount = "idCard:" + idCard + ":COUNT:"; Integer count = null; if (redis.hasKey(redisCount)) { count = (Integer) redis.get(redisCount); System.err.println("redis存入次数" + count); } if (compareImageDomain.getBase64()==null){ return ResultCode.PARAM_IS_BLANK; } File base = null; try { base = File.createTempFile("compare", ".jpeg"); base.deleteOnExit(); } catch (IOException e) { throw new RuntimeException(e); } if (!Img2Base64Util.generateImage(base64, base.getPath())) { log.info("base64转图片异常"); return ResultCode.FACEAUTH_FAIL; } if (!faceCompareHandle.imageSingle(base)){ return ResultCode.SINGLE_PERSON; } boolean redisFlag = (count != null && count >= 2); if (flag) { //说明是客户经理 if (sysUserEntity.getCompareImgId() == null || redisFlag) { if (! faceCompareHandle.imageCenter(base)){ return ResultCode.IMAGE_NOT_STANDARD; } //说明客户经理需要做人脸核身 FileInfoEntity fileInfo = faceCompareHandle.uploadFaceFile(base64); faceCompareEntity = JuheServiceUtil.URLPost(idCard, nickName, base64,faceCompareEntity); faceCompareEntity.setFileId(fileInfo.getId() + ""); if (faceCompareEntity.getResult() == 1) { //上传图片到minio FileInfo SysUserEntity bank = new SysUserEntity(); bank.setUserId(sysUserEntity.getUserId()); bank.setCompareImgId(fileInfo.getId()); userMapper.updateById(bank); log.info("银行客户经理人脸核身通过"); redis.del(redisCount); thirdPartyInterfaceRepository.insert(faceCompareEntity); return ResultCode.SUCCESS; } log.info("客户经理人脸核身失败"); thirdPartyInterfaceRepository.insert(faceCompareEntity); return ResultCode.LIVE_VIDEO_INVALID; } } else if (ObjectUtils.isEmpty(compareImageId) || redisFlag) { if (! faceCompareHandle.imageCenter(base)){ return ResultCode.IMAGE_NOT_STANDARD; } //说明当事人需要做人脸核身 FileInfoEntity fileInfo = faceCompareHandle.uploadFaceFile(base64); faceCompareEntity = JuheServiceUtil.URLPost(idCard, nickName, base64,faceCompareEntity); faceCompareEntity.setFileId(fileInfo.getId() + ""); thirdPartyInterfaceRepository.insert(faceCompareEntity); if (faceCompareEntity.getResult() == 1) { //上传图片到minio FileInfo; ContractOrderEntity orderEntity = new ContractOrderEntity(); orderEntity.setId(contractOrder.getId()); //判断是共同责任人还是当事人 if (nickName.equals(contractOrder.getName())) { orderEntity.setCompareImgId(fileInfo.getId()); } if (nickName.equals(contractOrder.getJointName())) { orderEntity.setJointCompareImgId(fileInfo.getId()); } redis.del(redisCount); contractOrderMapper.updateById(orderEntity); log.info("当事人人脸核身通过"); return ResultCode.SUCCESS; } log.info("当事人人脸核身失败"); return ResultCode.LIVE_VIDEO_INVALID; } //如果不用做人脸核身 那么就去做照片比对 //获取比较图片的id Integer id = null; if (!ObjectUtils.isEmpty(sysUserEntity)) { id = sysUserEntity.getCompareImgId(); } if (!ObjectUtils.isEmpty(compareImageId)) { id = compareImageId; } //要做照片比对 /*if (!compareImage(base, id, redisCount, count)) { return ResultCode.LIVE_VIDEO_INVALID; }*/ ResultCode resultCode = faceCompareHandle.compareImage(base, id, redisCount, faceCompareEntity); if (resultCode.code()==100){ if (count != null) { redis.del(redisCount); } } return resultCode; } }