NotaryDomainImpl.java 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315
  1. package me.zhengjie.domain.notary.impl;
  2. import com.alibaba.fastjson.JSONObject;
  3. import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
  4. import lombok.RequiredArgsConstructor;
  5. import lombok.extern.slf4j.Slf4j;
  6. import me.zhengjie.base.ResultCode;
  7. import me.zhengjie.base.config.thread.ThreadPoolExecutorUtil;
  8. import me.zhengjie.base.face.FaceCompareHandle;
  9. import me.zhengjie.base.util.FileUploadUtil;
  10. import me.zhengjie.base.util.JuheServiceUtil;
  11. import me.zhengjie.base.util.tencent.utils.HttpClientUtil;
  12. import me.zhengjie.base.util.tencent.utils.Img2Base64Util;
  13. import me.zhengjie.dao.mybatis.FaceCompareRepository;
  14. import me.zhengjie.dao.mybatis.entity.*;
  15. import me.zhengjie.dao.mybatis.mapper.ContractOrderMapper;
  16. import me.zhengjie.dao.mybatis.mapper.FileInfoMapper;
  17. import me.zhengjie.dao.mybatis.mapper.SysUserMapper;
  18. import me.zhengjie.domain.img.CompareImageDomain;
  19. import me.zhengjie.domain.notary.NotaryDomain;
  20. import me.zhengjie.utils.RedisUtils;
  21. import org.springframework.stereotype.Component;
  22. import org.springframework.util.ObjectUtils;
  23. import java.io.*;
  24. import static com.arcsoft.face.toolkit.ImageFactory.getRGBData;
  25. @Component
  26. @RequiredArgsConstructor
  27. @Slf4j
  28. public class NotaryDomainImpl implements NotaryDomain {
  29. private final SysUserMapper userMapper;
  30. private final ContractOrderMapper contractOrderMapper;
  31. private final RedisUtils redis;
  32. private final FaceCompareRepository thirdPartyInterfaceRepository;
  33. private final FaceCompareHandle faceCompareHandle;
  34. /**
  35. * 获取base64取消文件头
  36. *
  37. * @param base64
  38. * @return
  39. */
  40. public String getBase64(String base64) {
  41. String[] base64s = base64.split("base64");
  42. if (base64s != null && base64s.length > 1) {
  43. base64 = base64s[1];
  44. }
  45. return base64;
  46. }
  47. /**
  48. * app端的人脸核身
  49. *
  50. * @param compareImageDomain
  51. * @return
  52. */
  53. public ResultCode appCompareFace(CompareImageDomain compareImageDomain) {
  54. FaceCompareEntity thirdPartyInterfaceEntity = new FaceCompareEntity();
  55. String base64 = compareImageDomain.getBase64();
  56. if (base64 == null) {
  57. return ResultCode.PARAM_IS_BLANK;
  58. }
  59. base64 = getBase64(base64);
  60. String idCard = compareImageDomain.getIdCard();
  61. String nickName = compareImageDomain.getName();
  62. //根据业务编号获取订单 判断当事人名字
  63. String businessNo = compareImageDomain.getBusinessNo();
  64. QueryWrapper<ContractOrderEntity> contractOrderEntityQueryWrapper = new QueryWrapper<>();
  65. contractOrderEntityQueryWrapper.eq("business_no", businessNo);
  66. ContractOrderEntity contractOrderEntity = contractOrderMapper.selectOne(contractOrderEntityQueryWrapper);
  67. Integer id = null;
  68. //看是哪个当事人
  69. if (nickName.equals(contractOrderEntity.getName())) {
  70. id = contractOrderEntity.getCompareImgId();
  71. } else if (nickName.equals(contractOrderEntity.getJointName())) {
  72. id = contractOrderEntity.getJointCompareImgId();
  73. }
  74. //后面需要的三个参数 base64 身份证号 姓名
  75. String redisCount = "idCard:" + idCard + ":COUNT:";
  76. Integer count = null;
  77. if (redis.hasKey(redisCount)) {
  78. count = (Integer) redis.get(redisCount);
  79. System.err.println("redis存入次数" + count);
  80. }
  81. File base = null;
  82. try {
  83. base = File.createTempFile("compare", ".jpeg");
  84. base.deleteOnExit();
  85. } catch (IOException e) {
  86. throw new RuntimeException(e);
  87. }
  88. if (!Img2Base64Util.generateImage(base64, base.getPath())) {
  89. log.info("base64转图片异常");
  90. return ResultCode.FACEAUTH_FAIL;
  91. }
  92. if (!faceCompareHandle.imageSingle(base)){
  93. return ResultCode.SINGLE_PERSON;
  94. }
  95. thirdPartyInterfaceEntity.setBusinessNo(compareImageDomain.getBusinessNo());
  96. thirdPartyInterfaceEntity.setConsultNo(contractOrderEntity.getConsultNo());
  97. FileInfoEntity fileInfo = faceCompareHandle.uploadFaceFile(base64);
  98. boolean redisFlag = (count != null && count >= 2);
  99. if (ObjectUtils.isEmpty(id) || redisFlag) {
  100. if (! faceCompareHandle.imageCenter(base)){
  101. return ResultCode.IMAGE_NOT_STANDARD;
  102. }
  103. //要做人脸核身
  104. thirdPartyInterfaceEntity = JuheServiceUtil.URLPost(idCard, nickName, base64,thirdPartyInterfaceEntity);
  105. thirdPartyInterfaceEntity.setFileId(fileInfo.getId() + "");
  106. thirdPartyInterfaceRepository.insert(thirdPartyInterfaceEntity);
  107. if (thirdPartyInterfaceEntity.getResult() == 1) {
  108. ContractOrderEntity orderEntity = new ContractOrderEntity();
  109. orderEntity.setId(contractOrderEntity.getId());
  110. //判断是共同责任人还是当事人
  111. if (nickName.equals(contractOrderEntity.getName())) {
  112. orderEntity.setCompareImgId(fileInfo.getId());
  113. }
  114. if (nickName.equals(contractOrderEntity.getJointName())) {
  115. orderEntity.setJointCompareImgId(fileInfo.getId());
  116. }
  117. contractOrderMapper.updateById(orderEntity);
  118. log.info("当事人人脸核身通过");
  119. redis.del(redisCount);
  120. return ResultCode.SUCCESS;
  121. }
  122. return ResultCode.LIVE_VIDEO_INVALID;
  123. }
  124. //要做照片比对
  125. /*if (!compareImage(base, id, redisCount, count)) {
  126. return ResultCode.LIVE_VIDEO_INVALID;
  127. }*/
  128. ResultCode resultCode = faceCompareHandle.compareImage(base, id, redisCount, thirdPartyInterfaceEntity);
  129. if (resultCode.code()==100){
  130. if (count != null) {
  131. redis.del(redisCount);
  132. }
  133. }
  134. return resultCode;
  135. }
  136. /**
  137. * 照片比对
  138. *
  139. * @param compareImageDomain
  140. * @return
  141. */
  142. public ResultCode compareFace(CompareImageDomain compareImageDomain) {
  143. FaceCompareEntity faceCompareEntity = new FaceCompareEntity();
  144. String base64 = compareImageDomain.getBase64();
  145. if (base64 == null) {
  146. return ResultCode.PARAM_IS_BLANK;
  147. }
  148. base64 = getBase64(base64);
  149. //先判断是银行客户经理还是当事人
  150. String roleId = compareImageDomain.getRoleId();
  151. SysUserEntity sysUserEntity = null;
  152. String idCard = compareImageDomain.getIdCard();
  153. String nickName = compareImageDomain.getName();
  154. QueryWrapper<ContractOrderEntity> orderEntityQueryWrapper = new QueryWrapper<>();
  155. orderEntityQueryWrapper.eq("business_no", compareImageDomain.getBusinessNo());
  156. ContractOrderEntity contractOrder = contractOrderMapper.selectOne(orderEntityQueryWrapper);
  157. if (ObjectUtils.isEmpty(contractOrder)) {
  158. return ResultCode.PARAM_IS_INVALID;
  159. }
  160. Integer compareImageId = null;
  161. boolean flag = "-1".equals(roleId);
  162. if (flag) {
  163. //说明是银行客户经理
  164. QueryWrapper<ContractOrderEntity> contractOrderEntityQueryWrapper = new QueryWrapper<>();
  165. //通过business_no 和 客户经理姓名 判断是不是当前客户经理
  166. contractOrderEntityQueryWrapper.eq("business_no", compareImageDomain.getBusinessNo()).eq("customer_name", compareImageDomain.getName());
  167. ContractOrderEntity contractOrderEntity = contractOrderMapper.selectOne(contractOrderEntityQueryWrapper);
  168. if (ObjectUtils.isEmpty(contractOrderEntity)) {
  169. return ResultCode.ACCOUNT_MANAGER_NO_ASSIGNED;
  170. }
  171. QueryWrapper<SysUserEntity> sysUserEntityQueryWrapper = new QueryWrapper<>();
  172. sysUserEntityQueryWrapper.eq("id_card", idCard).eq("nick_name", nickName);
  173. sysUserEntity = userMapper.selectOne(sysUserEntityQueryWrapper);
  174. } else {
  175. //说明是当事人
  176. if (nickName.equals(contractOrder.getName())) {
  177. compareImageId = contractOrder.getCompareImgId();
  178. } else if (nickName.equals(contractOrder.getJointName())) {
  179. compareImageId = contractOrder.getJointCompareImgId();
  180. }
  181. }
  182. faceCompareEntity.setBusinessNo(compareImageDomain.getBusinessNo());
  183. faceCompareEntity.setConsultNo(contractOrder.getConsultNo());
  184. faceCompareEntity.setIdCard(idCard);
  185. faceCompareEntity.setName(nickName);
  186. //后面需要的三个参数 base64 身份证号 姓名
  187. String redisCount = "idCard:" + idCard + ":COUNT:";
  188. Integer count = null;
  189. if (redis.hasKey(redisCount)) {
  190. count = (Integer) redis.get(redisCount);
  191. System.err.println("redis存入次数" + count);
  192. }
  193. if (compareImageDomain.getBase64()==null){
  194. return ResultCode.PARAM_IS_BLANK;
  195. }
  196. File base = null;
  197. try {
  198. base = File.createTempFile("compare", ".jpeg");
  199. base.deleteOnExit();
  200. } catch (IOException e) {
  201. throw new RuntimeException(e);
  202. }
  203. if (!Img2Base64Util.generateImage(base64, base.getPath())) {
  204. log.info("base64转图片异常");
  205. return ResultCode.FACEAUTH_FAIL;
  206. }
  207. if (!faceCompareHandle.imageSingle(base)){
  208. return ResultCode.SINGLE_PERSON;
  209. }
  210. boolean redisFlag = (count != null && count >= 2);
  211. if (flag) {
  212. //说明是客户经理
  213. if (sysUserEntity.getCompareImgId() == null || redisFlag) {
  214. if (! faceCompareHandle.imageCenter(base)){
  215. return ResultCode.IMAGE_NOT_STANDARD;
  216. }
  217. //说明客户经理需要做人脸核身
  218. FileInfoEntity fileInfo = faceCompareHandle.uploadFaceFile(base64);
  219. faceCompareEntity = JuheServiceUtil.URLPost(idCard, nickName, base64,faceCompareEntity);
  220. faceCompareEntity.setFileId(fileInfo.getId() + "");
  221. if (faceCompareEntity.getResult() == 1) {
  222. //上传图片到minio FileInfo
  223. SysUserEntity bank = new SysUserEntity();
  224. bank.setUserId(sysUserEntity.getUserId());
  225. bank.setCompareImgId(fileInfo.getId());
  226. userMapper.updateById(bank);
  227. log.info("银行客户经理人脸核身通过");
  228. redis.del(redisCount);
  229. thirdPartyInterfaceRepository.insert(faceCompareEntity);
  230. return ResultCode.SUCCESS;
  231. }
  232. log.info("客户经理人脸核身失败");
  233. thirdPartyInterfaceRepository.insert(faceCompareEntity);
  234. return ResultCode.LIVE_VIDEO_INVALID;
  235. }
  236. } else if (ObjectUtils.isEmpty(compareImageId) || redisFlag) {
  237. if (! faceCompareHandle.imageCenter(base)){
  238. return ResultCode.IMAGE_NOT_STANDARD;
  239. }
  240. //说明当事人需要做人脸核身
  241. FileInfoEntity fileInfo = faceCompareHandle.uploadFaceFile(base64);
  242. faceCompareEntity = JuheServiceUtil.URLPost(idCard, nickName, base64,faceCompareEntity);
  243. faceCompareEntity.setFileId(fileInfo.getId() + "");
  244. thirdPartyInterfaceRepository.insert(faceCompareEntity);
  245. if (faceCompareEntity.getResult() == 1) {
  246. //上传图片到minio FileInfo;
  247. ContractOrderEntity orderEntity = new ContractOrderEntity();
  248. orderEntity.setId(contractOrder.getId());
  249. //判断是共同责任人还是当事人
  250. if (nickName.equals(contractOrder.getName())) {
  251. orderEntity.setCompareImgId(fileInfo.getId());
  252. }
  253. if (nickName.equals(contractOrder.getJointName())) {
  254. orderEntity.setJointCompareImgId(fileInfo.getId());
  255. }
  256. redis.del(redisCount);
  257. contractOrderMapper.updateById(orderEntity);
  258. log.info("当事人人脸核身通过");
  259. return ResultCode.SUCCESS;
  260. }
  261. log.info("当事人人脸核身失败");
  262. return ResultCode.LIVE_VIDEO_INVALID;
  263. }
  264. //如果不用做人脸核身 那么就去做照片比对
  265. //获取比较图片的id
  266. Integer id = null;
  267. if (!ObjectUtils.isEmpty(sysUserEntity)) {
  268. id = sysUserEntity.getCompareImgId();
  269. }
  270. if (!ObjectUtils.isEmpty(compareImageId)) {
  271. id = compareImageId;
  272. }
  273. //要做照片比对
  274. /*if (!compareImage(base, id, redisCount, count)) {
  275. return ResultCode.LIVE_VIDEO_INVALID;
  276. }*/
  277. ResultCode resultCode = faceCompareHandle.compareImage(base, id, redisCount, faceCompareEntity);
  278. if (resultCode.code()==100){
  279. if (count != null) {
  280. redis.del(redisCount);
  281. }
  282. }
  283. return resultCode;
  284. }
  285. }