BankNotarizeController.java 10.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268
  1. package me.zhengjie.application.bank.controller;
  2. import cn.hutool.core.collection.CollectionUtil;
  3. import com.alibaba.fastjson.JSONArray;
  4. import com.alibaba.fastjson.JSONObject;
  5. import com.arcsoft.face.*;
  6. import com.arcsoft.face.enums.ErrorInfo;
  7. import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
  8. import io.swagger.annotations.Api;
  9. import io.swagger.annotations.ApiOperation;
  10. import lombok.RequiredArgsConstructor;
  11. import lombok.extern.slf4j.Slf4j;
  12. import me.zhengjie.annotation.rest.AnonymousPostMapping;
  13. import me.zhengjie.application.admin.service.SmsTemplateService;
  14. import me.zhengjie.application.bank.BaseController;
  15. import me.zhengjie.application.bank.controller.vo.CompareImageVo;
  16. import me.zhengjie.application.bank.service.BankNotarizeService;
  17. import me.zhengjie.application.bank.service.UserAXQInfoService;
  18. import me.zhengjie.application.bank.service.dao.CompareImageDto;
  19. import me.zhengjie.base.ResponseDTO;
  20. import me.zhengjie.base.ResultCode;
  21. import me.zhengjie.base.config.TencentHumanFaceVerify;
  22. import me.zhengjie.base.mq.RedisCacheConfig;
  23. import me.zhengjie.base.util.BeanCopyUtils;
  24. import me.zhengjie.base.util.FileUploadUtil;
  25. import me.zhengjie.base.util.UUIDGenerator;
  26. import me.zhengjie.base.util.tencent.h5face.SdkTest;
  27. import me.zhengjie.dao.mybatis.OrderFileRepository;
  28. import me.zhengjie.dao.mybatis.FaceCompareRepository;
  29. import me.zhengjie.dao.mybatis.entity.OrderFileEntity;
  30. import me.zhengjie.dao.mybatis.entity.FaceCompareEntity;
  31. import org.apache.commons.lang3.StringUtils;
  32. import org.springframework.data.redis.core.RedisTemplate;
  33. import org.springframework.validation.annotation.Validated;
  34. import org.springframework.web.bind.annotation.RequestBody;
  35. import org.springframework.web.bind.annotation.RequestMapping;
  36. import org.springframework.web.bind.annotation.RestController;
  37. import java.util.List;
  38. @Validated
  39. @RestController
  40. @RequestMapping("${fqgz.bank.app.url-prefix}")
  41. @Slf4j
  42. @RequiredArgsConstructor
  43. @Api(tags = "客户经理APP: 公证流程")
  44. public class BankNotarizeController extends BaseController {
  45. private final OrderFileRepository orderFileRepository;
  46. private final UserAXQInfoService userAXQInfoService;
  47. private final BankNotarizeService bankNotarizeService;
  48. private final TencentHumanFaceVerify faceVerify;
  49. private final SmsTemplateService smsTemplateService;
  50. private final FaceCompareRepository thirdPartyInterfaceRepository;
  51. private final RedisTemplate<String, String> redisTemplate;
  52. /**
  53. * 获取签名公证书URL
  54. *
  55. * @param json
  56. * @return
  57. * @throws Exception
  58. */
  59. @RequestMapping("/getNotarization")
  60. public ResponseDTO<?> getNotarization(@RequestBody String json) throws Exception {
  61. JSONObject jsonObj = JSONObject.parseObject(json);
  62. String businessNo = jsonObj.getString("businessNo");
  63. if (StringUtils.isEmpty(businessNo)) {
  64. return ResponseDTO.error(ResultCode.PARAM_IS_BLANK);
  65. }
  66. OrderFileEntity orderFile = orderFileRepository.getOrderNotarization(businessNo);
  67. // 下载到指定的目录
  68. String filePath = "tmp/" + UUIDGenerator.uuid() + ".pdf";
  69. return ResponseDTO.success(FileUploadUtil.getCustomUrl(orderFile.getSignedPdfUrl(), filePath));
  70. }
  71. @RequestMapping("/axqRegister")
  72. public ResponseDTO<?> axqRegister(@RequestBody String json) {
  73. JSONObject jsonObj = JSONObject.parseObject(json);
  74. String idCard = jsonObj.getString("idCard");
  75. String phone = jsonObj.getString("phone");
  76. String name = jsonObj.getString("name");
  77. if (StringUtils.isEmpty(idCard) || StringUtils.isEmpty(phone) || StringUtils.isEmpty(name)) {
  78. return ResponseDTO.error(ResultCode.PARAM_IS_BLANK);
  79. }
  80. return userAXQInfoService.registAXQUser(idCard, phone, name);
  81. }
  82. // 人脸核身,当事人
  83. @RequestMapping("/order/getFaceId")
  84. public ResponseDTO<?> getFaceId(@RequestBody String json) throws Exception {
  85. // 这里需要先判断公证员是否在线
  86. JSONObject jsonObj = JSONObject.parseObject(json);
  87. String userName = jsonObj.getString("userName");
  88. String idCard = jsonObj.getString("idCard");
  89. String businessNo = jsonObj.getString("businessNo");
  90. if (StringUtils.isEmpty(userName) || StringUtils.isEmpty(idCard)) {
  91. return ResponseDTO.error(ResultCode.PARAM_IS_BLANK);
  92. }
  93. ResponseDTO<?> result = bankNotarizeService.onlineNotary(businessNo);
  94. if (!result.isSuccess()) {
  95. return result;
  96. }
  97. JSONObject str = SdkTest.getFaceId(faceVerify.getBankWebankAppId(), faceVerify.getBankSecret(),
  98. faceVerify.getBankKeyLicence(), userName, idCard, businessNo);
  99. return ResponseDTO.success(str);
  100. }
  101. /**
  102. * 视频通话
  103. *
  104. * @param json
  105. * @return ResponseDTO<?>
  106. */
  107. @AnonymousPostMapping("/video/call")
  108. public ResponseDTO<?> videoCall(@RequestBody String json) {
  109. JSONObject jsonObject = JSONObject.parseObject(json);
  110. String businessNo = jsonObject.getString("businessNo");
  111. ResponseDTO<?> result = bankNotarizeService.onlineNotary(businessNo);
  112. if (!result.isSuccess()) {
  113. return result;
  114. }
  115. // 这里保存推送的数据
  116. redisTemplate.convertAndSend(RedisCacheConfig.CHANNEL_WEB_SOCKET, json);
  117. return bankNotarizeService.videoCall(json);
  118. }
  119. @RequestMapping("/order/pdf")
  120. public ResponseDTO<?> getOrderPDF(@RequestBody String json) {
  121. JSONObject jsonObj = JSONObject.parseObject(json);
  122. String businessNo = jsonObj.getString("businessNo");
  123. if (StringUtils.isEmpty(businessNo)) {
  124. return ResponseDTO.error(ResultCode.PARAM_IS_BLANK);
  125. }
  126. ResponseDTO<?> order = bankNotarizeService.getOrderPDF(businessNo);
  127. return order;
  128. }
  129. @RequestMapping("/order/note")
  130. public ResponseDTO<?> note(@RequestBody String json) {
  131. JSONObject jsonObj = JSONObject.parseObject(json);
  132. String businessNo = jsonObj.getString("businessNo");
  133. if (StringUtils.isEmpty(businessNo)) {
  134. return ResponseDTO.error(ResultCode.PARAM_IS_BLANK);
  135. }
  136. //
  137. OrderFileEntity orderFile = orderFileRepository.getOrderNote(businessNo);
  138. // 判断如果面谈笔录没有,给提示
  139. if (orderFile == null) {
  140. return ResponseDTO.error(ResultCode.INTERVIEW_NOTE_UNSUBMIT);
  141. }
  142. // pdf的地址预览
  143. String noteUrl = FileUploadUtil.getPreviewUrl(orderFile.getHtmlUrl());
  144. return ResponseDTO.success(noteUrl);
  145. }
  146. @RequestMapping("/sendAuthMessage")
  147. public ResponseDTO<?> sendAuthMessage(@RequestBody String json) {
  148. JSONObject jsonObj = JSONObject.parseObject(json);
  149. String idCard = jsonObj.getString("idCard");
  150. if (StringUtils.isEmpty(idCard)) {
  151. return ResponseDTO.error(ResultCode.PARAM_IS_BLANK);
  152. }
  153. return userAXQInfoService.sendAuthMessage(idCard);
  154. }
  155. @RequestMapping("/verifyAuthMessage")
  156. public ResponseDTO<?> verifyAuthMessage(@RequestBody String json) {
  157. JSONObject jsonObj = JSONObject.parseObject(json);
  158. String idCard = jsonObj.getString("idCard");
  159. String checkCode = jsonObj.getString("checkCode");
  160. if (StringUtils.isEmpty(idCard) || StringUtils.isEmpty(checkCode)) {
  161. return ResponseDTO.error(ResultCode.PARAM_IS_BLANK);
  162. }
  163. return userAXQInfoService.verifyAuthMessage(idCard, checkCode);
  164. }
  165. @RequestMapping("/getAuthStatus")
  166. public ResponseDTO<?> getAuthStatus(@RequestBody String json) {
  167. JSONObject jsonObj = JSONObject.parseObject(json);
  168. String idCard = jsonObj.getString("idCard");
  169. if (StringUtils.isEmpty(idCard)) {
  170. return ResponseDTO.error(ResultCode.PARAM_IS_BLANK);
  171. }
  172. return userAXQInfoService.getAuthStatus(idCard);
  173. }
  174. /**
  175. * 当事人签名
  176. *
  177. * @param json
  178. * @return
  179. */
  180. @RequestMapping("/uploadSeal")
  181. @ApiOperation("当事人签名")
  182. public ResponseDTO<?> uploadSeal(@RequestBody String json) {
  183. JSONObject jsonObj = JSONObject.parseObject(json);
  184. String businessNo = jsonObj.getString("businessNo");
  185. JSONArray jsonArray = jsonObj.getJSONArray("signInfo");
  186. if (StringUtils.isEmpty(businessNo) || jsonArray == null) {
  187. return ResponseDTO.error(ResultCode.PARAM_IS_BLANK);
  188. }
  189. return userAXQInfoService.uploadSeal(businessNo, jsonArray);
  190. }
  191. @RequestMapping("/active-arcsoft")
  192. public ResponseDTO<?> activeArcsoft() {
  193. // 从官网获取
  194. String appId = "6F5JVsCCeSEbBSLSXWVwPki71yK5Y4Jf7oUjA4Y3mLtu";
  195. String sdkKey = "5qKM4a9oNSXNhXdwd7Ycrvnxdw2JXjcyeccYmb4zND7S";
  196. FaceEngine faceEngine = new FaceEngine("/home/tom/nt/lib/so");
  197. // 激活引擎
  198. int errorCode = faceEngine.activeOnline(appId, sdkKey);
  199. if (errorCode != ErrorInfo.MOK.getValue() && errorCode != ErrorInfo.MERR_ASF_ALREADY_ACTIVATED.getValue()) {
  200. System.out.println("引擎激活失败");
  201. } else {
  202. System.out.println("引擎激活成功");
  203. }
  204. // 引擎卸载
  205. errorCode = faceEngine.unInit();
  206. return ResponseDTO.success();
  207. }
  208. @RequestMapping("/isFaceCompare")
  209. public ResponseDTO<?> isFaceCompare(@RequestBody String json){
  210. // 这里需要先判断公证员是否在线
  211. JSONObject jsonObj = JSONObject.parseObject(json);
  212. String userName = jsonObj.getString("userName");
  213. String idCard = jsonObj.getString("idCard");
  214. String businessNo = jsonObj.getString("businessNo");
  215. if (StringUtils.isEmpty(userName) || StringUtils.isEmpty(idCard)) {
  216. return ResponseDTO.error(ResultCode.PARAM_IS_BLANK);
  217. }
  218. ResponseDTO<?> result = bankNotarizeService.onlineNotary(businessNo);
  219. if (!result.isSuccess()) {
  220. return result;
  221. }
  222. //判断传入的当事人 是否做过人脸核身
  223. QueryWrapper<FaceCompareEntity> thirdPartyInterfaceEntityQueryWrapper = new QueryWrapper<>();
  224. thirdPartyInterfaceEntityQueryWrapper.eq("name",userName).eq("id_card",idCard);
  225. List<FaceCompareEntity> list = thirdPartyInterfaceRepository.getList(thirdPartyInterfaceEntityQueryWrapper);
  226. if (CollectionUtil.isEmpty(list)){
  227. return ResponseDTO.error(ResultCode.RESULT_DATA_NONE);
  228. }
  229. return ResponseDTO.success();
  230. }
  231. /**
  232. * 银行客户经理的人脸照片比对
  233. * @param compareImageVo
  234. * @return
  235. */
  236. //@RequestMapping("/face-compare")
  237. @AnonymousPostMapping("/face-compare")
  238. public ResponseDTO<?> faceCompare(@RequestBody CompareImageVo compareImageVo){
  239. ResponseDTO<?> result = bankNotarizeService.appFaceCompare(BeanCopyUtils.convertObj(compareImageVo, CompareImageDto.class));
  240. if(result.isSuccess()) {
  241. // 4---开始公证(待公证) -- 2个公证员,发送短信
  242. smsTemplateService.startNotarize(compareImageVo.getBusinessNo());
  243. }
  244. return result;
  245. }
  246. }