5 Коміти 32e921f9b7 ... 6fa0fc691b

Автор SHA1 Опис Дата
  wangwl 6fa0fc691b Merge branch 'dev-1.2.0-wwlong' into dev-1.2.1 3 місяців тому
  wangwl fe766237ae 人脸核身基本代码 3 місяців тому
  wangwl 18f65e41cf 志愿者申请提现 3 місяців тому
  wangwl 3f52fce72a Merge branch 'dev-1.2.0' into dev-1.2.0-wwlong 3 місяців тому
  wangwl 3ffdc6f23a 人脸核身 3 місяців тому
18 змінених файлів з 318 додано та 162 видалено
  1. 10 1
      leromro-common/pom.xml
  2. 24 0
      leromro-common/src/main/java/com/leromro/common/core/domain/entity/SysUser.java
  3. 54 0
      leromro-common/src/main/java/com/leromro/common/utils/EIDUtil.java
  4. 43 0
      leromro-common/src/main/java/com/leromro/common/utils/file/ImageUtils.java
  5. 149 0
      leromro-core/src/main/java/com/leromro/core/controller/TencentFaceController.java
  6. 0 17
      leromro-core/src/main/java/com/leromro/core/controller/VolunteerInfoController.java
  7. 3 3
      leromro-core/src/main/java/com/leromro/core/controller/VolunteerTakeRecordController.java
  8. 0 4
      leromro-core/src/main/java/com/leromro/core/domain/VolunteerFaceRecord.java
  9. 1 1
      leromro-core/src/main/java/com/leromro/core/facade/VolunteerAccountFacade.java
  10. 1 36
      leromro-core/src/main/java/com/leromro/core/mapper/VolunteerTakeRecordMapper.java
  11. 0 38
      leromro-core/src/main/java/com/leromro/core/service/IVolunteerTakeRecordService.java
  12. 1 3
      leromro-core/src/main/java/com/leromro/core/service/impl/VolunteerFaceRecordServiceImpl.java
  13. 6 1
      leromro-core/src/main/java/com/leromro/core/service/impl/VolunteerPaymentRecordsServiceImpl.java
  14. 1 56
      leromro-core/src/main/java/com/leromro/core/service/impl/VolunteerTakeRecordServiceImpl.java
  15. 1 0
      leromro-core/src/main/resources/mapper/core/VolunteerAccountChangeMapper.xml
  16. 2 2
      leromro-framework/src/main/java/com/leromro/framework/config/AliConfig.java
  17. 7 0
      leromro-system/src/main/resources/mapper/system/SysUserMapper.xml
  18. 15 0
      pom.xml

+ 10 - 1
leromro-common/pom.xml

@@ -204,7 +204,16 @@
             <artifactId>spring-boot-starter-json</artifactId>
         </dependency>
 
-
+        <!--            腾讯人脸核身-->
+        <dependency>
+            <groupId>com.tencentcloudapi</groupId>
+            <artifactId>tencentcloud-sdk-java-faceid</artifactId>
+        </dependency>
+        <!--            人脸核身解密-->
+        <dependency>
+            <groupId>org.bouncycastle</groupId>
+            <artifactId>bcprov-jdk15on</artifactId>
+        </dependency>
 
     </dependencies>
 

+ 24 - 0
leromro-common/src/main/java/com/leromro/common/core/domain/entity/SysUser.java

@@ -169,6 +169,30 @@ public class SysUser extends BaseEntity
     @ApiModelProperty("纬度")
     private String latitude;
 
+    @TableField("name")
+    @ApiModelProperty("真实姓名")
+    private String name;
+
+    @TableField("id_card")
+    @ApiModelProperty("身份证号")
+    private String idCard;
+
+    @TableField("face_picture")
+    @ApiModelProperty("志愿者人脸照片")
+    private String facePicture;
+
+    @TableField("id_card_picture_front")
+    @ApiModelProperty("身份证正面照片")
+    private String idCardPictureFront;
+
+    @TableField("id_card_picture_back")
+    @ApiModelProperty("身份证背面照片")
+    private String idCardPictureBack;
+
+    @TableField("is_face_approve")
+    @ApiModelProperty("是否人脸核身0否1是")
+    private String isFaceApprove;
+
     // 当前积分
     private Long point;
 

+ 54 - 0
leromro-common/src/main/java/com/leromro/common/utils/EIDUtil.java

@@ -0,0 +1,54 @@
+package com.leromro.common.utils;
+
+import org.bouncycastle.asn1.gm.GMNamedCurves;
+import org.bouncycastle.asn1.x9.X9ECParameters;
+import org.bouncycastle.crypto.engines.SM2Engine;
+import org.bouncycastle.crypto.engines.SM2Engine.Mode;
+import org.bouncycastle.crypto.params.ECDomainParameters;
+import org.bouncycastle.crypto.params.ECPrivateKeyParameters;
+import org.bouncycastle.jce.provider.BouncyCastleProvider;
+import org.bouncycastle.util.encoders.Base64;
+import org.bouncycastle.util.encoders.Hex;
+
+import javax.crypto.Cipher;
+import javax.crypto.spec.SecretKeySpec;
+import java.math.BigInteger;
+import java.security.Key;
+import java.security.Security;
+
+/**
+ * EID解密工具类
+ */
+public class EIDUtil {
+    static {
+        Security.addProvider(new BouncyCastleProvider());
+    }
+
+    public static byte[] decodeUserInfo(String privateKeyHex, String desKey, String userInfo) throws Exception {
+        byte[] sm4KeyBytes = EIDUtil.sm2Decrypt(privateKeyHex, Base64.decode(desKey));
+        return EIDUtil.sm4Decrypt(sm4KeyBytes, Base64.decode(userInfo));
+    }
+
+    public static byte[] sm2Decrypt(String privateKeyHex, byte[] sm2Cipher) throws Exception {
+        X9ECParameters sm2ECParameters = GMNamedCurves.getByName("sm2p256v1");
+        ECDomainParameters domainParameters = new ECDomainParameters(
+                sm2ECParameters.getCurve(),
+                sm2ECParameters.getG(),
+                sm2ECParameters.getN(),
+                sm2ECParameters.getH()
+        );
+        BigInteger d = new BigInteger(1, Hex.decode(privateKeyHex));
+        ECPrivateKeyParameters privateKey = new ECPrivateKeyParameters(d, domainParameters);
+        SM2Engine engine = new SM2Engine(Mode.C1C3C2);
+        engine.init(false, privateKey);
+        return engine.processBlock(sm2Cipher, 0, sm2Cipher.length);
+  }
+
+    public static byte[] sm4Decrypt(byte[] key, byte[] cipherText) throws Exception {
+        Cipher cipher = Cipher.getInstance("SM4/ECB/PKCS5Padding", BouncyCastleProvider.PROVIDER_NAME);
+        Key sm4Key = new SecretKeySpec(key, "SM4");
+        cipher.init(Cipher.DECRYPT_MODE, sm4Key);
+        return cipher.doFinal(cipherText);
+    }
+
+}

+ 43 - 0
leromro-common/src/main/java/com/leromro/common/utils/file/ImageUtils.java

@@ -1,11 +1,17 @@
 package com.leromro.common.utils.file;
 
+import java.awt.image.BufferedImage;
 import java.io.ByteArrayInputStream;
+import java.io.File;
 import java.io.FileInputStream;
 import java.io.InputStream;
 import java.net.URL;
 import java.net.URLConnection;
 import java.util.Arrays;
+import java.util.Base64;
+
+import cn.hutool.core.util.StrUtil;
+import lombok.extern.slf4j.Slf4j;
 import org.apache.poi.util.IOUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -13,6 +19,8 @@ import com.leromro.common.config.RuoYiConfig;
 import com.leromro.common.constant.Constants;
 import com.leromro.common.utils.StringUtils;
 
+import javax.imageio.ImageIO;
+
 /**
  * 图片处理工具类
  *
@@ -95,4 +103,39 @@ public class ImageUtils
             IOUtils.closeQuietly(in);
         }
     }
+
+    /**
+     * 将base64转为图片
+     */
+    public static String base64ToImage(String base64String, String outputFilePath){
+        try {
+            if (StrUtil.isBlank(base64String)){
+                throw new IllegalArgumentException("base64String 不能为空");
+            }
+            // 1. 去除可能存在的 data:image/png;base64, 前缀
+            if (base64String.startsWith("data:image")) {
+                base64String = base64String.split(",")[1];
+            }
+
+            // 2. Base64 解码
+            byte[] imageBytes = Base64.getDecoder().decode(base64String);
+
+            // 3. 转换为 BufferedImage
+            ByteArrayInputStream bis = new ByteArrayInputStream(imageBytes);
+            BufferedImage bufferedImage = ImageIO.read(bis);
+            bis.close();
+            if (bufferedImage == null) {
+                throw new IllegalArgumentException("无法识别该 Base64 图片数据");
+            }
+            // 4. 保存为文件
+            File outputFile = new File(outputFilePath);
+            String formatName = "png"; // 默认格式为 png,也可以是 jpg/jpeg 等
+            ImageIO.write(bufferedImage, formatName, outputFile);
+            System.out.println("图片已保存至:" + outputFile.getAbsolutePath());
+            return outputFilePath;
+        }catch (Exception e){
+            System.err.println("图片保存失败:" + e.getMessage());
+            return null;
+        }
+    }
 }

+ 149 - 0
leromro-core/src/main/java/com/leromro/core/controller/TencentFaceController.java

@@ -0,0 +1,149 @@
+package com.leromro.core.controller;
+
+
+import cn.hutool.core.util.IdUtil;
+import cn.hutool.core.util.StrUtil;
+import com.alibaba.fastjson2.JSONObject;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
+import com.leromro.common.config.RuoYiConfig;
+import com.leromro.common.core.controller.BaseController;
+import com.leromro.common.core.domain.R;
+import com.leromro.common.core.domain.entity.SysUser;
+import com.leromro.common.utils.EIDUtil;
+import com.leromro.common.utils.file.ImageUtils;
+import com.leromro.core.service.IVolunteerFaceRecordService;
+import com.leromro.system.service.ISysUserService;
+import com.tencentcloudapi.common.exception.TencentCloudSDKException;
+import com.tencentcloudapi.common.Credential;
+import com.tencentcloudapi.faceid.v20180301.FaceidClient;
+import com.tencentcloudapi.faceid.v20180301.models.*;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.extern.slf4j.Slf4j;
+import org.dromara.x.file.storage.core.FileInfo;
+import org.dromara.x.file.storage.core.FileStorageService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ *  腾讯人脸核身
+ */
+@Slf4j
+@RestController
+@Api(tags = "腾讯人脸核身")
+@RequestMapping({"/face"})
+public class TencentFaceController extends BaseController {
+
+    private static final String SECRET_ID = "AKIDkPr57wb6Peiu02zoW3RhmEUXNzOaaNwI"; // TODO 您账号的腾讯云密钥
+    private static final String SECRET_KEY = "D2d1EE0Zv4zhCTWLyOaYKtELSRDpE2qb"; // TODO 您账号的腾讯云密钥
+    private static final String REGION = "ap-chongqing";
+
+    @Autowired
+    private FileStorageService fileStorageService;
+
+    @Autowired
+    private ISysUserService systemUserService;
+
+    /**
+     * 获取token
+     * @return
+     */
+    @GetMapping("/getEidToken")
+    @ApiOperation(value = "获取token", notes = "获取token")
+    public R<String> getEidToken() {
+        // Step 1. 初始化客户端实例
+        Credential credential = new Credential(SECRET_ID, SECRET_KEY);
+        FaceidClient faceidClient = new FaceidClient(credential, REGION);
+        // Step 2. 使用Tencent Cloud API SDK组装请求体,填充参数
+        GetEidTokenRequest request = new GetEidTokenRequest();
+        request.setMerchantId("00EI2505271335530207"); // 商户ID,请在控制台查看已经申请的商户ID
+        GetEidTokenConfig config = new GetEidTokenConfig();
+        config.setInputType("1"); // 传身份证正反面OCR。
+        request.setConfig(config);
+        try {
+            // Step 3. 调用接口
+            GetEidTokenResponse response = faceidClient.GetEidToken(request);
+            System.out.println("SDK response: " + GetEidTokenResponse.toJsonString(response));
+            return R.ok(response.getEidToken());
+        } catch (TencentCloudSDKException e) {
+            // 调用接口异常在这里处理
+            System.err.println("invoke error, code: " + e.getErrorCode() + "message: " + e.getMessage());
+            e.printStackTrace();
+        }
+        return R.fail("获取token失败");
+    }
+
+    /**
+     * 获取人脸核身结果
+     */
+    @GetMapping("/getEidResult")
+    @ApiOperation(value = "获取人脸核身结果", notes = "获取人脸核身结果")
+    public R<String> getEidResult(String eidToken) {
+        // 初始化修改信息
+        LambdaUpdateWrapper<SysUser> updateWrapper = new LambdaUpdateWrapper<SysUser>().eq(SysUser::getUserId, getUserId());
+        // Step 1. 初始化客户端实例
+        Credential credential = new Credential(SECRET_ID, SECRET_KEY);
+        FaceidClient faceidClient = new FaceidClient(credential, REGION);
+        // Step 2. 使用Tencent Cloud API SDK组装请求体,填充参数
+        GetEidResultRequest request = new GetEidResultRequest();
+        request.setEidToken(eidToken); // 通过GetEidResult接口获取到的EidToken
+        request.setInfoType("0"); // 指定拉取的结果信息
+        try {
+            // Step 3. 调用接口
+            GetEidResultResponse response = faceidClient.GetEidResult(request);
+            System.out.println("SDKResponse: " + GetEidResultResponse.toJsonString(response));
+            /** 解密用户姓名和身份证信息 */
+            // 上述2.3 查看并保留私钥过程中获取到的priv内容,去掉冒号,即为PrivateKey的值
+            String PrivateKeyHex = "4157f6f7151a1d192f9bee771e37c1e5deae53916408ae098968c0d0fa770dce";
+            // GetEidResult接口返回的DesKey字段值
+            String DesKey = response.getEidInfo().getDesKey();
+            // GetEidResult接口返回的UserInfo字段值
+            String UserInfo = response.getEidInfo().getUserInfo();
+            // 调用EIDUtil解密用户信息
+            byte[] b = EIDUtil.decodeUserInfo(PrivateKeyHex, DesKey, UserInfo);
+            JSONObject jsonObject = JSONObject.parseObject(new String(b));
+            String name = jsonObject.getString("name");
+            String idNum = jsonObject.getString("idnum");
+            if (StrUtil.isBlank(idNum) || StrUtil.isBlank(name)){
+                throw new Exception("身份证姓名信息解析错误");
+            }
+            updateWrapper.set(SysUser::getName, name).set(SysUser::getIdCard, idNum);
+            String OcrFront = RuoYiConfig.getUploadPath()+"/face/"+ IdUtil.getSnowflakeNextIdStr() +".jpg";
+            String OcrBack = RuoYiConfig.getUploadPath()+"/face/"+ IdUtil.getSnowflakeNextIdStr() +".jpg";
+            String facePicture = RuoYiConfig.getUploadPath()+"/face/"+ IdUtil.getSnowflakeNextIdStr() +".jpg";
+            //提取身份证人像面
+            ImageUtils.base64ToImage(response.getIdCardData().getOcrFront(), OcrFront);
+            if (StrUtil.isNotBlank(OcrFront)){
+                FileInfo fileInfo = fileStorageService.of(OcrFront).upload();
+                updateWrapper.set(SysUser::getIdCardPictureFront, fileInfo.getUrl());
+            }
+            //提取身份证国徽面
+            ImageUtils.base64ToImage(response.getIdCardData().getOcrBack(), OcrBack);
+            if (StrUtil.isNotBlank(OcrBack)){
+                FileInfo fileInfo = fileStorageService.of(OcrBack).upload();
+                updateWrapper.set(SysUser::getIdCardPictureBack, fileInfo.getUrl());
+            }
+            //提取人脸照片
+            ImageUtils.base64ToImage(response.getBestFrame().getBestFrame(), facePicture);
+            if (StrUtil.isNotBlank(facePicture)){
+                FileInfo fileInfo = fileStorageService.of(facePicture).upload();
+                updateWrapper.set(SysUser::getFacePicture, fileInfo.getUrl());
+            }
+            //保存
+            updateWrapper.set(SysUser::getIsFaceApprove, 1);
+            systemUserService.update(updateWrapper);
+            return R.ok("校验成功");
+        } catch (TencentCloudSDKException e) {
+            // 调用接口异常在这里处理
+            System.err.println("invoke error, code: " + e.getErrorCode() + "message: " + e.getMessage());
+            return R.fail("人脸认证失败:"+e.getMessage());
+        } catch (Exception e){
+            return R.fail("人脸认证失败:"+e.getMessage());
+        }
+    }
+
+
+}

+ 0 - 17
leromro-core/src/main/java/com/leromro/core/controller/VolunteerInfoController.java

@@ -186,23 +186,6 @@ public class VolunteerInfoController extends BaseController {
         }
     }
 
-    /**
-     * 获取志愿者人脸核身状态
-     */
-    @ApiOperation(value = "获取志愿者人脸核身状态", notes = "传入志愿者id,返回核身状态,如果为false,则提示志愿者先去人脸核身")
-    @GetMapping("/getFaceStatus")
-    public R<Boolean> getFaceStatus(Long volunteerInfoId) {
-        return volunteerFaceRecordService.getFaceStatus(volunteerInfoId);
-    }
-
-    /**
-     * 新增志愿者人脸核身记录
-     */
-    @ApiOperation(value = "新增志愿者人脸核身记录")
-    @PostMapping("/addFaceRecord")
-    public R<Boolean> addFaceRecord(@RequestBody VolunteerFaceRecord volunteerFaceRecord) {
-        return volunteerFaceRecordService.addFaceRecord(volunteerFaceRecord);
-    }
 
 
   /*  @ApiOperation("用户已注册志愿者查询")

+ 3 - 3
leromro-core/src/main/java/com/leromro/core/controller/VolunteerTakeRecordController.java

@@ -61,13 +61,13 @@ public class VolunteerTakeRecordController extends BaseController
 
 
     /**
-     * 获取志愿者提现申请记录详细信息
+     * 获取志愿者提现申请详细信息
      */
-    @ApiOperation("获取志愿者提现申请记录详细信息")
+    @ApiOperation("获取志愿者提现申请详细信息")
     @GetMapping(value = "/{volunteerTakeRecordId}")
     public R<VolunteerTakeRecord> getInfo(@PathVariable("volunteerTakeRecordId") Long volunteerTakeRecordId)
     {
-        return R.ok(volunteerTakeRecordService.selectVolunteerTakeRecordByVolunteerTakeRecordId(volunteerTakeRecordId));
+        return R.ok(volunteerTakeRecordService.getById(volunteerTakeRecordId));
     }
 
     /**

+ 0 - 4
leromro-core/src/main/java/com/leromro/core/domain/VolunteerFaceRecord.java

@@ -34,10 +34,6 @@ public class VolunteerFaceRecord extends BaseEntity
     @ApiModelProperty("志愿者id")
     private Long volunteerId;
 
-    @TableField("is_successful")
-    @ApiModelProperty("人脸核身是否成功(0-否;1-是)")
-    private String isSuccessful;
-
     @TableField("name")
     @ApiModelProperty("志愿者姓名")
     private String name;

+ 1 - 1
leromro-core/src/main/java/com/leromro/core/facade/VolunteerAccountFacade.java

@@ -80,7 +80,7 @@ public class VolunteerAccountFacade {
     }
 
 
-    public R getWithdrawStatus() {
+    public R<String> getWithdrawStatus() {
         int count = volunteerTakeRecordService.count(new LambdaQueryWrapper<VolunteerTakeRecord>()
                 .eq(VolunteerTakeRecord::getVolunteerUserId, SecurityUtils.getUserId())
                 .eq(VolunteerTakeRecord::getAppStatus, "1"));

+ 1 - 36
leromro-core/src/main/java/com/leromro/core/mapper/VolunteerTakeRecordMapper.java

@@ -12,13 +12,7 @@ import com.leromro.core.domain.VolunteerTakeRecord;
  */
 public interface VolunteerTakeRecordMapper extends BaseMapper<VolunteerTakeRecord>
 {
-    /**
-     * 查询志愿者提现申请记录
-     * 
-     * @param volunteerTakeRecordId 志愿者提现申请记录主键
-     * @return 志愿者提现申请记录
-     */
-    public VolunteerTakeRecord selectVolunteerTakeRecordByVolunteerTakeRecordId(Long volunteerTakeRecordId);
+
 
     /**
      * 查询志愿者提现申请记录列表
@@ -28,35 +22,6 @@ public interface VolunteerTakeRecordMapper extends BaseMapper<VolunteerTakeRecor
      */
     public List<VolunteerTakeRecord> selectVolunteerTakeRecordList(VolunteerTakeRecord volunteerTakeRecord);
 
-    /**
-     * 新增志愿者提现申请记录
-     * 
-     * @param volunteerTakeRecord 志愿者提现申请记录
-     * @return 结果
-     */
-    public int insertVolunteerTakeRecord(VolunteerTakeRecord volunteerTakeRecord);
 
-    /**
-     * 修改志愿者提现申请记录
-     * 
-     * @param volunteerTakeRecord 志愿者提现申请记录
-     * @return 结果
-     */
-    public int updateVolunteerTakeRecord(VolunteerTakeRecord volunteerTakeRecord);
 
-    /**
-     * 删除志愿者提现申请记录
-     * 
-     * @param volunteerTakeRecordId 志愿者提现申请记录主键
-     * @return 结果
-     */
-    public int deleteVolunteerTakeRecordByVolunteerTakeRecordId(Long volunteerTakeRecordId);
-
-    /**
-     * 批量删除志愿者提现申请记录
-     * 
-     * @param volunteerTakeRecordIds 需要删除的数据主键集合
-     * @return 结果
-     */
-    public int deleteVolunteerTakeRecordByVolunteerTakeRecordIds(Long[] volunteerTakeRecordIds);
 }

+ 0 - 38
leromro-core/src/main/java/com/leromro/core/service/IVolunteerTakeRecordService.java

@@ -12,13 +12,6 @@ import com.leromro.core.domain.VolunteerTakeRecord;
  */
 public interface IVolunteerTakeRecordService extends IService<VolunteerTakeRecord>
 {
-    /**
-     * 查询志愿者提现申请记录
-     * 
-     * @param volunteerTakeRecordId 志愿者提现申请记录主键
-     * @return 志愿者提现申请记录
-     */
-    public VolunteerTakeRecord selectVolunteerTakeRecordByVolunteerTakeRecordId(Long volunteerTakeRecordId);
 
     /**
      * 查询志愿者提现申请记录列表
@@ -28,35 +21,4 @@ public interface IVolunteerTakeRecordService extends IService<VolunteerTakeRecor
      */
     public List<VolunteerTakeRecord> selectVolunteerTakeRecordList(VolunteerTakeRecord volunteerTakeRecord);
 
-    /**
-     * 新增志愿者提现申请记录
-     * 
-     * @param volunteerTakeRecord 志愿者提现申请记录
-     * @return 结果
-     */
-    public Boolean insertVolunteerTakeRecord(VolunteerTakeRecord volunteerTakeRecord);
-
-    /**
-     * 修改志愿者提现申请记录
-     * 
-     * @param volunteerTakeRecord 志愿者提现申请记录
-     * @return 结果
-     */
-    public Boolean updateVolunteerTakeRecord(VolunteerTakeRecord volunteerTakeRecord);
-
-    /**
-     * 批量删除志愿者提现申请记录
-     * 
-     * @param volunteerTakeRecordIds 需要删除的志愿者提现申请记录主键集合
-     * @return 结果
-     */
-    public int deleteVolunteerTakeRecordByVolunteerTakeRecordIds(Long[] volunteerTakeRecordIds);
-
-    /**
-     * 删除志愿者提现申请记录信息
-     * 
-     * @param volunteerTakeRecordId 志愿者提现申请记录主键
-     * @return 结果
-     */
-    public int deleteVolunteerTakeRecordByVolunteerTakeRecordId(Long volunteerTakeRecordId);
 }

+ 1 - 3
leromro-core/src/main/java/com/leromro/core/service/impl/VolunteerFaceRecordServiceImpl.java

@@ -28,14 +28,12 @@ public class VolunteerFaceRecordServiceImpl extends ServiceImpl<VolunteerFaceRec
     public R<Boolean> getFaceStatus(Long volunteerInfoId) {
         //可以通过配置控制是否需要人脸核身
         int count = this.count(new LambdaQueryWrapper<VolunteerFaceRecord>()
-                .eq(VolunteerFaceRecord::getVolunteerId, volunteerInfoId)
-                .eq(VolunteerFaceRecord::getIsSuccessful, "1"));
+                .eq(VolunteerFaceRecord::getVolunteerId, volunteerInfoId));
         return count>0?R.ok(true):R.ok(false);
     }
 
     @Override
     public R<Boolean> addFaceRecord(VolunteerFaceRecord volunteerFaceRecord) {
-        volunteerFaceRecord.setIsSuccessful("1");
         this.save(volunteerFaceRecord);
         return R.ok();
     }

+ 6 - 1
leromro-core/src/main/java/com/leromro/core/service/impl/VolunteerPaymentRecordsServiceImpl.java

@@ -1,6 +1,8 @@
 package com.leromro.core.service.impl;
 
 import cn.hutool.core.date.DateUtil;
+import cn.hutool.core.util.ObjectUtil;
+import cn.hutool.core.util.StrUtil;
 import cn.hutool.json.JSONObject;
 import cn.hutool.json.JSONUtil;
 import com.alipay.api.AlipayApiException;
@@ -156,7 +158,10 @@ public class VolunteerPaymentRecordsServiceImpl extends ServiceImpl<VolunteerPay
                 return R.fail("提现申请单"+record.getTakeSn()+"打款类型不一致");
             }
             if (!"2".equals(record.getAppStatus())){
-                return R.fail("提现申请单"+record.getTakeSn()+"审批状态错误");
+                return R.fail("提现申请单"+record.getTakeSn()+"订单审批状态错误");
+            }
+            if (ObjectUtil.isNotNull(record.getPaymentRecordId())){
+                return R.fail("提现申请单"+record.getTakeSn()+"订单已绑定打款单");
             }
             totalPaymentAmount = totalPaymentAmount.add(record.getTakeAmount());
             actualPaymentAmount = actualPaymentAmount.add(record.getShoudAmount());

+ 1 - 56
leromro-core/src/main/java/com/leromro/core/service/impl/VolunteerTakeRecordServiceImpl.java

@@ -30,17 +30,7 @@ public class VolunteerTakeRecordServiceImpl extends ServiceImpl<VolunteerTakeRec
     @Autowired
     private SysUserServiceImpl sysUserService;
 
-    /**
-     * 查询志愿者提现申请记录
-     * 
-     * @param volunteerTakeRecordId 志愿者提现申请记录主键
-     * @return 志愿者提现申请记录
-     */
-    @Override
-    public VolunteerTakeRecord selectVolunteerTakeRecordByVolunteerTakeRecordId(Long volunteerTakeRecordId)
-    {
-        return volunteerTakeRecordMapper.selectVolunteerTakeRecordByVolunteerTakeRecordId(volunteerTakeRecordId);
-    }
+
 
     /**
      * 查询志愿者提现申请记录列表
@@ -58,51 +48,6 @@ public class VolunteerTakeRecordServiceImpl extends ServiceImpl<VolunteerTakeRec
         return volunteerTakeRecordMapper.selectVolunteerTakeRecordList(volunteerTakeRecord);
     }
 
-    /**
-     * 新增志愿者提现申请记录
-     * 
-     * @param volunteerTakeRecord 志愿者提现申请记录
-     * @return 结果
-     */
-    @Override
-    public Boolean insertVolunteerTakeRecord(VolunteerTakeRecord volunteerTakeRecord)
-    {
-        return this.save(volunteerTakeRecord);
-    }
 
-    /**
-     * 修改志愿者提现申请记录
-     * 
-     * @param volunteerTakeRecord 志愿者提现申请记录
-     * @return 结果
-     */
-    @Override
-    public Boolean updateVolunteerTakeRecord(VolunteerTakeRecord volunteerTakeRecord)
-    {
-        return this.updateById(volunteerTakeRecord);
-    }
 
-    /**
-     * 批量删除志愿者提现申请记录
-     * 
-     * @param volunteerTakeRecordIds 需要删除的志愿者提现申请记录主键
-     * @return 结果
-     */
-    @Override
-    public int deleteVolunteerTakeRecordByVolunteerTakeRecordIds(Long[] volunteerTakeRecordIds)
-    {
-        return volunteerTakeRecordMapper.deleteVolunteerTakeRecordByVolunteerTakeRecordIds(volunteerTakeRecordIds);
-    }
-
-    /**
-     * 删除志愿者提现申请记录信息
-     * 
-     * @param volunteerTakeRecordId 志愿者提现申请记录主键
-     * @return 结果
-     */
-    @Override
-    public int deleteVolunteerTakeRecordByVolunteerTakeRecordId(Long volunteerTakeRecordId)
-    {
-        return volunteerTakeRecordMapper.deleteVolunteerTakeRecordByVolunteerTakeRecordId(volunteerTakeRecordId);
-    }
 }

+ 1 - 0
leromro-core/src/main/resources/mapper/core/VolunteerAccountChangeMapper.xml

@@ -59,6 +59,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
                 AND lvac.create_time &lt; DATE_ADD(#{createTime}, INTERVAL 1 DAY)
             </if>
         </where>
+        order by lvac.create_time desc
     </select>
 
     <insert id="insertVolunteerAccountChange" parameterType="VolunteerAccountChange" useGeneratedKeys="true" keyProperty="volunteerAccountChangeId">

+ 2 - 2
leromro-framework/src/main/java/com/leromro/framework/config/AliConfig.java

@@ -33,9 +33,9 @@ public class AliConfig {
         payConfig.setFormat("json");
         payConfig.setCharset("UTF8");
         try {
-            InputStream certPathStream = getClass().getResourceAsStream("/appCertPublicKey_2021004131699060.crt");
+            InputStream certPathStream = getClass().getResourceAsStream("/appCertPublicKey_2021003169699074.crt");
             if (certPathStream != null) {
-                File certPath = FileUtil.writeBytes(MyImgUtil.readInputStream(certPathStream), "appCertPublicKey_2021004131699060.crt");
+                File certPath = FileUtil.writeBytes(MyImgUtil.readInputStream(certPathStream), "appCertPublicKey_2021003169699074.crt");
                 payConfig.setCertPath(certPath.getPath());
                 InputStream alipayPublicCertStream = getClass().getResourceAsStream("/alipayCertPublicKey_RSA2.crt");
                 File alipayPublicFile = FileUtil.writeBytes(MyImgUtil.readInputStream(alipayPublicCertStream), "alipayCertPublicKey_RSA2.crt");

+ 7 - 0
leromro-system/src/main/resources/mapper/system/SysUserMapper.xml

@@ -41,6 +41,12 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         <result property="serviceCentreId"       column="service_centre_id"       />
         <result property="referrerAreaId"       column="referrer_area_id"       />
         <result property="areaId"       column="area_id"       />
+		<result property="name"    column="name"    />
+		<result property="idCard"    column="id_card"    />
+		<result property="idCardPictureFront"    column="id_card_picture_front"    />
+		<result property="idCardPictureBack"    column="id_card_picture_back"    />
+		<result property="facePicture"    column="face_picture"    />
+		<result property="isFaceApprove"    column="is_face_approve"    />
         <association property="dept"    javaType="SysDept"         resultMap="deptResult" />
         <collection  property="roles"   javaType="java.util.List"  resultMap="RoleResult" />
     </resultMap>
@@ -71,6 +77,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
                u.province_code as province_code, u.province_name as province_name, u.city_code as city_code, u.city_name as city_name, u.district_code as district_code,
                u.referrer_user_id ,u.referrer_service_centre_id,u.service_centre_id,u.referrer_area_id,u.area_id,
                u.district_name as district_name,u.point ,u.freeze_point,
+               u.name,u.id_card,u.is_face_approve,
         d.dept_id, d.parent_id, d.ancestors, d.dept_name, d.order_num, d.leader, d.status as dept_status,d.area_type as area_type,
         r.role_id, r.role_name, r.role_key, r.role_sort, r.data_scope, r.status as role_status,d.area_type
         from sys_user u

+ 15 - 0
pom.xml

@@ -312,7 +312,22 @@
                 <artifactId>alipay-sdk-java</artifactId>
                 <version>4.35.37.ALL</version>
             </dependency>
+
+<!--            腾讯人脸核身-->
+            <dependency>
+                <groupId>com.tencentcloudapi</groupId>
+                <artifactId>tencentcloud-sdk-java-faceid</artifactId>
+                <version>3.1.1008</version>
+            </dependency>
+<!--            人脸核身解密-->
+            <dependency>
+                <groupId>org.bouncycastle</groupId>
+                <artifactId>bcprov-jdk15on</artifactId>
+                <version>1.62</version>
+            </dependency>
         </dependencies>
+
+
     </dependencyManagement>
 
     <modules>