Browse Source

增加身份证中名字和号码一致性校验

Guos 6 days ago
parent
commit
f203412517

+ 5 - 0
README.md

@@ -23,6 +23,11 @@
 1.  注意调整Memory的大小,以及堆内存大小
 2.  对于maven仓库缺少的jar包引用,需要拷贝现有的文件(拷贝后依然出现错误,直接删除错误包下的_remote.repositories文件)。
 
+#### 身份证返回接口代码
+https://cloud.tencent.com/document/product/1007/33188?from=console_top_search
+
+
+
 
 
 #### sql更新

+ 22 - 0
fs-common/src/main/java/com/fs/common/utils/txocr/IdCardVerificationResponse.java

@@ -0,0 +1,22 @@
+package com.fs.common.utils.txocr;
+
+import lombok.Data;
+import lombok.ToString;
+
+/**
+ * @description:
+ * @author: Guos
+ * @time: 2025/12/1 下午4:17
+ */
+@Data
+@ToString
+public class IdCardVerificationResponse {
+
+
+  private String description;
+
+  private Integer result;
+
+
+
+}

+ 32 - 1
fs-common/src/main/java/com/fs/common/utils/txocr/TxOcrClient.java

@@ -1,7 +1,10 @@
 package com.fs.common.utils.txocr;
 
+import cn.hutool.json.JSONObject;
 import com.fasterxml.jackson.databind.JsonNode;
 import com.fasterxml.jackson.databind.ObjectMapper;
+import com.google.gson.Gson;
+import com.google.gson.JsonObject;
 import com.tencentcloudapi.common.AbstractModel;
 import com.tencentcloudapi.common.CommonClient;
 import com.tencentcloudapi.common.Credential;
@@ -14,6 +17,8 @@ import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.lang3.StringUtils;
 
 import java.util.Arrays;
+import java.util.HashMap;
+import java.util.Map;
 import java.util.Optional;
 import java.util.concurrent.atomic.AtomicReference;
 
@@ -27,6 +32,28 @@ public class TxOcrClient  {
 
     private static final String YPLS = "药品零售";
 
+    public static IdCardVerificationResponse IdCardVerification(String name, String idNumber) {
+        IdCardVerificationResponse map = new IdCardVerificationResponse();
+        try {
+            Credential cred = new Credential("AKIDviPyMZbRp24udCcpqjQxHOK4cx88ze6N", "97tVwEJE81sY0StDPPGukQ2ZvkU3QceY");
+            HttpProfile httpProfile = new HttpProfile();
+            httpProfile.setEndpoint("faceid.tencentcloudapi.com");
+            ClientProfile clientProfile = new ClientProfile();
+            clientProfile.setHttpProfile(httpProfile);
+            CommonClient client = new CommonClient("faceid", "2018-03-01", cred, "", clientProfile);
+            String params = "{\"IdCard\":\""+idNumber+"\",\"Name\":\""+name+"\"}";
+            String resp = client.call("IdCardVerification", params);
+            JSONObject jsonObject = new JSONObject(resp);
+            JSONObject response = (JSONObject)jsonObject.get("Response");
+            map.setDescription(response.get("Description").toString());
+            map.setResult(Integer.parseInt(response.get("Result").toString()));
+        } catch (TencentCloudSDKException e) {
+            log.error("身份证识别请求异常:{}",e.getMessage());
+            map.setDescription("识别失败");
+            map.setResult(-8);
+        }
+        return map;
+    }
     /**
      * 医疗器械url识别
      * @return
@@ -258,9 +285,13 @@ public class TxOcrClient  {
     }
 
     public static void main(String[] args) {
-        ExtractDocBasic("https://bjyjb-1362704775.cos.ap-chongqing.myqcloud.com/fs/20251118/d175ed9771324c56a126779ef89bb1e3.jpg");
+//        ExtractDocBasic("https://bjyjb-1362704775.cos.ap-chongqing.myqcloud.com/fs/20251118/d175ed9771324c56a126779ef89bb1e3.jpg");
+        IdCardVerification("郭顺", "111");
     }
 
+
+
+
     /**
      * ClassifyDetectOCR
      * 支持身份证、护照、名片、银行卡、行驶证、驾驶证、港澳台通行证、户口本、港澳台来往内地通行证、港澳台居住证、不动产证、营业执照的智能分类。

+ 2 - 0
fs-service/src/main/java/com/fs/his/mapper/FsDoctorMapper.java

@@ -226,4 +226,6 @@ public interface FsDoctorMapper
      *
      * **/
     List<FsDoctorVO> getDoctorInfoByStoreId(@Param("param") FsDoctorParam param);
+
+    Boolean idCardExists(String idCard, Long userId);
 }

+ 9 - 0
fs-service/src/main/java/com/fs/his/service/IFsDoctorService.java

@@ -127,4 +127,13 @@ public interface IFsDoctorService
      * 根据门店id查询药师信息
      * **/
     List<FsDoctorVO> getDoctorInfoByStoreId(FsDoctorParam param);
+
+    /**
+     * 验证该身份证是否已经注册
+     * @param idCard
+     * @param userId
+     * @return
+     */
+    Boolean idCardExistsByUserId(String idCard, Long userId);
+
 }

+ 6 - 0
fs-service/src/main/java/com/fs/his/service/impl/FsDoctorServiceImpl.java

@@ -561,4 +561,10 @@ public class FsDoctorServiceImpl implements IFsDoctorService
         return fsDoctorMapper.getDoctorInfoByStoreId(param);
     }
 
+
+    @Override
+    public Boolean idCardExistsByUserId(String idCard, Long userId) {
+        return fsDoctorMapper.idCardExists(idCard, userId);
+    }
+
 }

+ 1 - 3
fs-service/src/main/java/com/fs/hisStore/service/impl/FsStoreScrmServiceImpl.java

@@ -122,7 +122,7 @@ public class FsStoreScrmServiceImpl implements IFsStoreScrmService {
                 if (existingMerchantId != null) {
                     // 同一商家下检查店铺名称是否重复
                     if (fsStoreMapper.existsStoreNameInMerchant(existingMerchantId, fsStore.getStoreName())) {
-                        throw new BaseException("该商家下已存在同名店铺");
+                        throw new CustomException("该商家下已存在同名店铺");
                     }
                 }
             }
@@ -347,8 +347,6 @@ public class FsStoreScrmServiceImpl implements IFsStoreScrmService {
 
     @Override
     public int updateFsStoreLogo(FsStoreScrm fsStore) {
-
-
         return fsStoreMapper.updateFsStore(fsStore);
     }
 

+ 2 - 2
fs-service/src/main/java/com/fs/hisStore/service/listener/FsStoreScrmListener.java

@@ -63,14 +63,14 @@ public class FsStoreScrmListener {
         if(!oldBusinessLicenseFlag){
             fsStoreScrmOcr.setBusinessLicense(fsStore.getBusinessLicense());
             String result = TxOcrClient.bizLicenseOCR(fsStoreScrmOcr.getBusinessLicense());
-            if(!result.isEmpty()){
+            if(!ObjectUtils.isEmpty(result)){
                 fsStoreScrmOcr.setBusinessLicenseTxt(result);
             }
         }
         if(!oldDrugLicenseFlag){
             fsStoreScrmOcr.setDrugLicense(fsStore.getDrugLicense());
             String result = TxOcrClient.ExtractDocBasic(fsStore.getDrugLicense());
-            if(!result.isEmpty()){
+            if(!ObjectUtils.isEmpty(result)){
                 fsStoreScrmOcr.setDrugLicenseTxt(result);
             }
         }

+ 4 - 0
fs-service/src/main/resources/mapper/his/FsDoctorMapper.xml

@@ -391,4 +391,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
                  sign_url
                  from  fs_doctor where  store_id=#{param.storeId} and doctor_type=#{param.doctorType} and status=1
     </select>
+
+    <select id="idCardExists" resultType="java.lang.Boolean">
+        select 1 from fs_doctor where id_card = #{idCard}
+    </select>
 </mapper>

+ 8 - 0
fs-user-app/src/main/java/com/fs/app/controller/UserController.java

@@ -12,6 +12,8 @@ import com.fs.common.core.page.TableDataInfo;
 import com.fs.common.exception.CustomException;
 import com.fs.common.utils.StringUtils;
 import com.fs.common.utils.sign.Md5Utils;
+import com.fs.common.utils.txocr.IdCardVerificationResponse;
+import com.fs.common.utils.txocr.TxOcrClient;
 import com.fs.company.domain.CompanyUser;
 import com.fs.course.service.IFsUserCourseVideoService;
 import com.fs.his.domain.FsDoctor;
@@ -238,6 +240,12 @@ public class UserController extends  AppBaseController {
     @ApiOperation("注册医生")
     @PostMapping("/registerDoctor")
     public R registerDoctor(@Validated  @RequestBody FsDoctorRegisterParam param, HttpServletRequest request){
+        String idCard = param.getIdCard();
+        String doctorName = param.getDoctorName();
+        IdCardVerificationResponse idCardVerificationResponse = TxOcrClient.IdCardVerification(doctorName, idCard);
+        if(0 != idCardVerificationResponse.getResult()){
+            throw new CustomException(idCardVerificationResponse.getDescription());
+        }
         FsDoctor doctor= doctorService.selectFsDoctorByUserId(Long.parseLong(getUserId()));
         if(doctor!=null){
             if(doctor.getIsAudit().equals(0)){

+ 1 - 1
fs-user-app/src/main/java/com/fs/app/controller/store/StoreInfoCheckController.java

@@ -12,7 +12,7 @@ import org.springframework.web.bind.annotation.RestController;
  * @time: 2025/12/1 上午10:46
  */
 @RestController
-@RequestMapping(value="/store/app/storeAfterSales")
+@RequestMapping(value="/store/app/storeInfoCheck")
 public class StoreInfoCheckController {
 
     /**

+ 1 - 4
fs-user-app/src/main/java/com/fs/app/exception/FSExceptionHandler.java

@@ -1,9 +1,5 @@
 package com.fs.app.exception;
 
-
-
-
-import com.fs.common.core.domain.AjaxResult;
 import com.fs.common.core.domain.R;
 import com.fs.common.exception.CustomException;
 import com.fs.common.exception.ServiceException;
@@ -82,6 +78,7 @@ public class FSExceptionHandler {
 	public R handleException(CustomException e){
 		return R.error(e.getMessage());
 	}
+
 	@ExceptionHandler(Exception.class)
 	public R handleException(Exception e){
 		logger.error(e.getMessage(), e);