|  | @@ -175,6 +175,13 @@ $(function () {
 | 
	
		
			
				|  |  |          siReadCard("jiangsu_face_01101");
 | 
	
		
			
				|  |  |      });
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +    /**
 | 
	
		
			
				|  |  | +     * 社保卡读取
 | 
	
		
			
				|  |  | +     */
 | 
	
		
			
				|  |  | +    $("#siReadSocialCard").on("click", function (t) {
 | 
	
		
			
				|  |  | +        siReadSocialCard();
 | 
	
		
			
				|  |  | +    });
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |      /**
 | 
	
		
			
				|  |  |       * 身份证读卡
 | 
	
	
		
			
				|  | @@ -2363,4 +2370,136 @@ function consume() {
 | 
	
		
			
				|  |  |              $("#consume").attr("disabled", false);
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  |      });
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +/**
 | 
	
		
			
				|  |  | + * 社保卡读取功能
 | 
	
		
			
				|  |  | + * 使用自动重试机制,确保读卡成功率
 | 
	
		
			
				|  |  | + */
 | 
	
		
			
				|  |  | +function siReadSocialCard() {
 | 
	
		
			
				|  |  | +    // 显示loading效果
 | 
	
		
			
				|  |  | +    $("#readLoadingModal").modal('show');
 | 
	
		
			
				|  |  | +    
 | 
	
		
			
				|  |  | +    // 社保卡读卡URL
 | 
	
		
			
				|  |  | +    var url = "http://localhost:8321/readcard/jiangsu/readcard_auto";
 | 
	
		
			
				|  |  | +    
 | 
	
		
			
				|  |  | +    // 使用自动重试机制调用读卡接口
 | 
	
		
			
				|  |  | +    callReadCardWithRetry(url, 5, 500, function (res) {
 | 
	
		
			
				|  |  | +        // 成功回调
 | 
	
		
			
				|  |  | +        $("#readLoadingModal").modal('hide');
 | 
	
		
			
				|  |  | +        
 | 
	
		
			
				|  |  | +        try {
 | 
	
		
			
				|  |  | +            // 解析社保卡数据
 | 
	
		
			
				|  |  | +            var cardDataArray = res.rawCardData.split('|');
 | 
	
		
			
				|  |  | +            
 | 
	
		
			
				|  |  | +            // 提取关键信息
 | 
	
		
			
				|  |  | +            var regionCode = cardDataArray[0];        // 发卡地区行政区划代码
 | 
	
		
			
				|  |  | +            var idNo = cardDataArray[1];              // 社会保障号码(身份证号)
 | 
	
		
			
				|  |  | +            var cardNo = cardDataArray[2];            // 卡号
 | 
	
		
			
				|  |  | +            var cardId = cardDataArray[3];            // 卡识别码
 | 
	
		
			
				|  |  | +            var userName = cardDataArray[4];          // 姓名
 | 
	
		
			
				|  |  | +            var cardResetInfo = cardDataArray[5];     // 卡复位信息
 | 
	
		
			
				|  |  | +            var version = cardDataArray[6];           // 规范版本
 | 
	
		
			
				|  |  | +            var issueDate = cardDataArray[7];         // 发卡日期
 | 
	
		
			
				|  |  | +            var validDate = cardDataArray[8];         // 卡有效期
 | 
	
		
			
				|  |  | +            var terminalNo = cardDataArray[9];        // 终端机编号
 | 
	
		
			
				|  |  | +            var deviceNo = cardDataArray[10];         // 终端设备号
 | 
	
		
			
				|  |  | +            
 | 
	
		
			
				|  |  | +            // 填充表单数据
 | 
	
		
			
				|  |  | +            $("#userName").val(userName);
 | 
	
		
			
				|  |  | +            $("#idCard").val(idNo);
 | 
	
		
			
				|  |  | +            $("#cardNo").val(cardNo);
 | 
	
		
			
				|  |  | +            
 | 
	
		
			
				|  |  | +            // 设置证件类型为身份证
 | 
	
		
			
				|  |  | +            $('#certificateType').selectpicker('val', '01');
 | 
	
		
			
				|  |  | +            $('#certificateType').selectpicker('refresh');
 | 
	
		
			
				|  |  | +            
 | 
	
		
			
				|  |  | +            // 根据身份证号计算年龄和性别
 | 
	
		
			
				|  |  | +            if (idNo && idNo.length === 18) {
 | 
	
		
			
				|  |  | +                var birthYear = parseInt(idNo.substring(6, 10));
 | 
	
		
			
				|  |  | +                var birthMonth = parseInt(idNo.substring(10, 12));
 | 
	
		
			
				|  |  | +                var birthDay = parseInt(idNo.substring(12, 14));
 | 
	
		
			
				|  |  | +                var genderCode = parseInt(idNo.substring(16, 17));
 | 
	
		
			
				|  |  | +                
 | 
	
		
			
				|  |  | +                // 计算年龄
 | 
	
		
			
				|  |  | +                var currentYear = new Date().getFullYear();
 | 
	
		
			
				|  |  | +                var age = currentYear - birthYear;
 | 
	
		
			
				|  |  | +                $("#age").val(age);
 | 
	
		
			
				|  |  | +                
 | 
	
		
			
				|  |  | +                // 设置性别(1-男,2-女)
 | 
	
		
			
				|  |  | +                var gender = genderCode % 2 === 1 ? 1 : 2;
 | 
	
		
			
				|  |  | +                $('#gender').selectpicker('val', gender);
 | 
	
		
			
				|  |  | +                $('#gender').selectpicker('refresh');
 | 
	
		
			
				|  |  | +                
 | 
	
		
			
				|  |  | +                // 设置出生日期
 | 
	
		
			
				|  |  | +                var birthDate = birthYear + '-' + 
 | 
	
		
			
				|  |  | +                               String(birthMonth).padStart(2, '0') + '-' + 
 | 
	
		
			
				|  |  | +                               String(birthDay).padStart(2, '0');
 | 
	
		
			
				|  |  | +                $("#birthDay").val(birthDate);
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +            
 | 
	
		
			
				|  |  | +            // 保存业务卡串信息,用于后续医保业务
 | 
	
		
			
				|  |  | +            var busiData = res.rawBusiData;
 | 
	
		
			
				|  |  | +            // 可以将busiData存储到隐藏字段或localStorage中
 | 
	
		
			
				|  |  | +            // localStorage.setItem('socialCardBusiData', busiData);
 | 
	
		
			
				|  |  | +            
 | 
	
		
			
				|  |  | +            // 查询用户信息
 | 
	
		
			
				|  |  | +            queryUserInfoBySocialNo(1);
 | 
	
		
			
				|  |  | +            
 | 
	
		
			
				|  |  | +            successMesageSimaple("社保卡读取成功!");
 | 
	
		
			
				|  |  | +            
 | 
	
		
			
				|  |  | +        } catch (error) {
 | 
	
		
			
				|  |  | +            console.error("社保卡数据解析失败:", error);
 | 
	
		
			
				|  |  | +            errorMesageSimaple("社保卡数据解析失败,请重试!");
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +        
 | 
	
		
			
				|  |  | +    }, function (err) {
 | 
	
		
			
				|  |  | +        // 失败回调
 | 
	
		
			
				|  |  | +        $("#readLoadingModal").modal('hide');
 | 
	
		
			
				|  |  | +        warningMesageSimaple("社保卡读取失败,请检查卡片是否正确放置!");
 | 
	
		
			
				|  |  | +        console.log("社保卡读取失败:", err);
 | 
	
		
			
				|  |  | +    });
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +/**
 | 
	
		
			
				|  |  | + * 自动重试的通用函数
 | 
	
		
			
				|  |  | + * @param url 请求URL
 | 
	
		
			
				|  |  | + * @param retryCount 重试次数
 | 
	
		
			
				|  |  | + * @param retryDelay 重试间隔(毫秒)
 | 
	
		
			
				|  |  | + * @param successCallback 成功回调
 | 
	
		
			
				|  |  | + * @param errorCallback 失败回调
 | 
	
		
			
				|  |  | + */
 | 
	
		
			
				|  |  | +function callReadCardWithRetry(url, retryCount, retryDelay, successCallback, errorCallback) {
 | 
	
		
			
				|  |  | +    $.ajax({
 | 
	
		
			
				|  |  | +        type: "GET",
 | 
	
		
			
				|  |  | +        url: url,
 | 
	
		
			
				|  |  | +        contentType: "application/json;charset=UTF-8",
 | 
	
		
			
				|  |  | +        dataType: "json",
 | 
	
		
			
				|  |  | +        headers: {
 | 
	
		
			
				|  |  | +            'Accept': 'application/json',
 | 
	
		
			
				|  |  | +            'Authorization': 'Bearer ' + localStorage.getItem("token")
 | 
	
		
			
				|  |  | +        },
 | 
	
		
			
				|  |  | +        success: function (res) {
 | 
	
		
			
				|  |  | +            if (res.code == 200) {
 | 
	
		
			
				|  |  | +                successCallback(res);
 | 
	
		
			
				|  |  | +            } else if (retryCount > 0) {
 | 
	
		
			
				|  |  | +                // 重试时保持loading状态,不隐藏
 | 
	
		
			
				|  |  | +                setTimeout(function () {
 | 
	
		
			
				|  |  | +                    callReadCardWithRetry(url, retryCount - 1, retryDelay, successCallback, errorCallback);
 | 
	
		
			
				|  |  | +                }, retryDelay);
 | 
	
		
			
				|  |  | +            } else {
 | 
	
		
			
				|  |  | +                errorCallback(res);
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +        },
 | 
	
		
			
				|  |  | +        error: function (XMLHttpRequest, textStatus, errorThrown) {
 | 
	
		
			
				|  |  | +            if (retryCount > 0) {
 | 
	
		
			
				|  |  | +                // 重试时保持loading状态,不隐藏
 | 
	
		
			
				|  |  | +                setTimeout(function () {
 | 
	
		
			
				|  |  | +                    callReadCardWithRetry(url, retryCount - 1, retryDelay, successCallback, errorCallback);
 | 
	
		
			
				|  |  | +                }, retryDelay);
 | 
	
		
			
				|  |  | +            } else {
 | 
	
		
			
				|  |  | +                errorCallback({ message: "读卡异常" });
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +    });
 | 
	
		
			
				|  |  |  }
 |