Pārlūkot izejas kodu

Merge branch 'feat-20220531-thsignv2'

shc 3 gadi atpakaļ
vecāks
revīzija
6cc9975a21
16 mainītis faili ar 602 papildinājumiem un 105 dzēšanām
  1. 7 0
      hnqz-common/hnqz-common-bom/pom.xml
  2. 8 0
      hnqz-common/hnqz-common-core/pom.xml
  3. 213 0
      hnqz-common/hnqz-common-core/src/main/java/com/qunzhixinxi/hnqz/common/core/util/Base64Utils.java
  4. 1 1
      hnqz-common/hnqz-common-taxhelper/src/main/java/com/logosdata/security/util/SignUtils.java
  5. 1 0
      hnqz-common/hnqz-common-taxhelper/src/main/java/com/qunzhixinxi/hnqz/common/taxhelper/common/CommonConstants.java
  6. 8 3
      hnqz-common/hnqz-common-taxhelper/src/main/java/com/qunzhixinxi/hnqz/common/taxhelper/entity/model/TaxHelperUserAgreementAuthorizationModel.java
  7. 3 2
      hnqz-common/hnqz-common-taxhelper/src/main/java/com/qunzhixinxi/hnqz/common/taxhelper/entity/request/TaxHelperUserAgreementAuthorizationRequest.java
  8. 27 0
      hnqz-common/hnqz-common-taxhelper/src/main/java/com/qunzhixinxi/hnqz/common/taxhelper/entity/request/TaxHelperUserAgreementAuthorizationRequestV2.java
  9. 94 59
      hnqz-common/hnqz-common-taxhelper/src/main/java/com/qunzhixinxi/hnqz/common/taxhelper/service/TaxHelperService.java
  10. 1 1
      hnqz-upms/hnqz-upms-api/src/main/java/com/qunzhixinxi/hnqz/admin/api/vo/UserVO.java
  11. 88 23
      hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/controller/PartyAController.java
  12. 24 10
      hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/controller/WmTaxHelperController.java
  13. 5 0
      hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/entity/dto/TaxHelperAgreementSignatureDTO.java
  14. 19 0
      hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/entity/dto/TaxHelperUserAgreementDTO.java
  15. 21 0
      hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/service/PartyAService.java
  16. 82 6
      hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/service/impl/PartyAServiceImpl.java

+ 7 - 0
hnqz-common/hnqz-common-bom/pom.xml

@@ -29,6 +29,7 @@
 		<security.oauth.version>2.3.6.RELEASE</security.oauth.version>
 		<fastjson.version>1.2.69</fastjson.version>
 		<aliyun.version>3.0.52.ALL</aliyun.version>
+		<commons-io.version>2.8.0</commons-io.version>
 	</properties>
 
 	<dependencyManagement>
@@ -174,6 +175,12 @@
 				<artifactId>swagger-annotations</artifactId>
 				<version>${swagger.core.version}</version>
 			</dependency>
+			<!-- io -->
+			<dependency>
+				<groupId>commons-io</groupId>
+				<artifactId>commons-io</artifactId>
+				<version>${commons-io.version}</version>
+			</dependency>
 			<!--微信依赖-->
 			<dependency>
 				<groupId>com.github.binarywang</groupId>

+ 8 - 0
hnqz-common/hnqz-common-core/pom.xml

@@ -76,5 +76,13 @@
 			<groupId>com.google.guava</groupId>
 			<artifactId>guava</artifactId>
 		</dependency>
+		<dependency>
+			<groupId>commons-io</groupId>
+			<artifactId>commons-io</artifactId>
+		</dependency>
+		<dependency>
+			<groupId>commons-codec</groupId>
+			<artifactId>commons-codec</artifactId>
+		</dependency>
 	</dependencies>
 </project>

+ 213 - 0
hnqz-common/hnqz-common-core/src/main/java/com/qunzhixinxi/hnqz/common/core/util/Base64Utils.java

@@ -0,0 +1,213 @@
+package com.qunzhixinxi.hnqz.common.core.util;
+
+import lombok.experimental.UtilityClass;
+import org.apache.commons.codec.binary.Base64;
+import org.apache.commons.io.FileUtils;
+import org.apache.commons.io.FilenameUtils;
+import org.apache.commons.io.IOUtils;
+
+import java.io.File;
+import java.io.IOException;
+import java.net.URI;
+
+/**
+ * {@code Base64Utils}
+ * <p>
+ * base64工具类
+ *
+ * @author Hengchen.Sun
+ * @version 1.0.0
+ * @date 2022/03/08 14:42
+ */
+@UtilityClass
+public class Base64Utils {
+
+    /**
+     * 把图片转换为 Base64 编码的字符串
+     * 图片的格式为 data:image/png;base64,iVBORw0KGgoAAAA...
+     *
+     * @param imagePath 图片的路径
+     * @return 返回图片的 Base64 编码的字符串
+     * @throws IOException 异常
+     */
+    public static String encodeImage(String imagePath) throws IOException {
+
+        String suffix = FilenameUtils.getExtension(imagePath).toLowerCase();
+        byte[] content = FileUtils.readFileToByteArray(new File(imagePath));
+        return String.format("data:image/%s;base64,%s", suffix, Base64.encodeBase64String(content));
+    }
+
+    /**
+     * 把图片转换为 Base64 编码的字符串
+     * 图片的格式为 data:image/png;base64,iVBORw0KGgoAAAA...
+     *
+     * @param uri 图片的路径
+     * @return 返回图片的 Base64 编码的字符串
+     * @throws IOException 异常
+     */
+    public static String encodeImageWithPrefix(URI uri) throws IOException {
+
+        String suffix = FilenameUtils.getExtension(uri.toString()).toLowerCase();
+        byte[] content = IOUtils.toByteArray(uri);
+        return String.format("data:image/%s;base64,%s", suffix, encodeImage(uri));
+    }
+
+    /**
+     * 把图片转换为 Base64 编码的字符串
+     * 图片的格式为 iVBORw0KGgoAAAA...
+     *
+     * @param uri 图片的路径
+     * @return 返回图片的 Base64 编码的字符串
+     * @throws IOException 异常
+     */
+    public static String encodeImage(URI uri) throws IOException {
+
+        byte[] content = IOUtils.toByteArray(uri);
+        return  Base64.encodeBase64String(content);
+    }
+
+
+    /**
+     * 把视频转换为 Base64 编码的字符串
+     * 图片的格式为 data:video/mp4;base64,iVBORw0KGgoAAAA...
+     *
+     * @param videoPath 视频的路径
+     * @return 返回图片的 Base64 编码的字符串
+     * @throws IOException 异常
+     */
+    public static String encodeVideo(String videoPath) throws IOException {
+
+        String suffix = FilenameUtils.getExtension(videoPath).toLowerCase();
+        byte[] content = FileUtils.readFileToByteArray(new File(videoPath));
+        return String.format("data:video/%s;base64,%s", suffix, Base64.encodeBase64String(content));
+    }
+
+    /**
+     * 把视频转换为 Base64 编码的字符串
+     * 图片的格式为 data:video/mp4;base64,iVBORw0KGgoAAAA...
+     *
+     * @param file 视频
+     * @return 返回图片的 Base64 编码的字符串
+     * @throws IOException 异常
+     */
+    public static String encodeVideo(File file) throws IOException {
+
+        String suffix = FilenameUtils.getExtension(file.getAbsolutePath()).toLowerCase();
+        byte[] content = FileUtils.readFileToByteArray(file);
+        return String.format("data:video/%s;base64,%s", suffix, Base64.encodeBase64String(content));
+    }
+
+    /**
+     * 把视频转换为 Base64 编码的字符串
+     * 图片的格式含前缀为 data:video/mp4;base64,iVBORw0KGgoAAAA...
+     * 图片的格式不含前缀为 iVBORw0KGgoAAAA...
+     *
+     * @param file          视频
+     * @param containPrefix 是否包含前缀
+     * @return 返回图片的 Base64 编码的字符串
+     * @throws IOException 异常
+     */
+    public static String encodeVideo(File file, Boolean containPrefix) throws IOException {
+        byte[] content = FileUtils.readFileToByteArray(file);
+
+        if (containPrefix) {
+            String suffix = FilenameUtils.getExtension(file.getAbsolutePath()).toLowerCase();
+            return String.format("data:video/%s;base64,%s", suffix, Base64.encodeBase64String(content));
+
+        }
+
+        return Base64.encodeBase64String(content);
+    }
+
+    /**
+     * 把视频转换为 Base64 编码的字符串
+     * 图片的格式为 data:video/mp4;base64,iVBORw0KGgoAAAA...
+     *
+     * @param uri 视频的路径
+     * @return 返回图片的 Base64 编码的字符串
+     * @throws IOException 异常
+     */
+    public static String encodeVideo(URI uri) throws IOException {
+
+        String suffix = FilenameUtils.getExtension(uri.toString()).toLowerCase();
+        byte[] content = IOUtils.toByteArray(uri);
+        return String.format("data:video/%s;base64,%s", suffix, Base64.encodeBase64String(content));
+    }
+
+    /**
+     * 把视频转换为 Base64 编码的字符串
+     * 图片的格式包含前缀为 data:video/mp4;base64,iVBORw0KGgoAAAA...
+     * 图片的格式不含前缀为 iVBORw0KGgoAAAA...
+     *
+     * @param uri 视频的路径
+     * @return 返回图片的 Base64 编码的字符串
+     * @throws IOException 异常
+     */
+    public static String encodeVideo(URI uri, Boolean containPrefix) throws IOException {
+
+        byte[] content = IOUtils.toByteArray(uri);
+
+        if (containPrefix) {
+            String suffix = FilenameUtils.getExtension(uri.toString()).toLowerCase();
+            return String.format("data:video/%s;base64,%s", suffix, Base64.encodeBase64String(content));
+        }
+
+        return Base64.encodeBase64String(content);
+    }
+
+    /**
+     * 把pdf转换为 Base64 编码的字符串
+     * 格式为 data:application/pdf;base64,iVBORw0KGgoAAAA...
+     *
+     * @param pdfPath pdf的路径
+     * @return 返回图片的 Base64 编码的字符串
+     * @throws IOException 异常
+     */
+    public static String encodePDFWithPrefix(String pdfPath) throws IOException {
+
+        return String.format("data:application/pdf;base64,%s", encodePDF(pdfPath));
+    }
+
+    /**
+     * 把pdf转换为 Base64 编码的字符串
+     * 格式为 iVBORw0KGgoAAAA...
+     *
+     * @param pdfPath pdf的路径
+     * @return 返回图片的 Base64 编码的字符串
+     * @throws IOException 异常
+     */
+    public static String encodePDF(String pdfPath) throws IOException {
+
+        byte[] content = FileUtils.readFileToByteArray(new File(pdfPath));
+        return Base64.encodeBase64String(content);
+    }
+
+    /**
+     * 把pdf转换为 Base64 编码的字符串
+     * 格式为 data:application/pdf;base64,iVBORw0KGgoAAAA...
+     *
+     * @param uri pdf路径
+     * @return 返回图片的 Base64 编码的字符串
+     * @throws IOException 异常
+     */
+    public static String encodePDFWhithPrefix(URI uri) throws IOException {
+
+        return String.format("data:application/pdf;base64,%s", encodePDF(uri));
+    }
+
+    /**
+     * 把pdf转换为 Base64 编码的字符串
+     * 格式为 iVBORw0KGgoAAAA...
+     *
+     * @param uri pdf路径
+     * @return 返回图片的 Base64 编码的字符串
+     * @throws IOException 异常
+     */
+    public static String encodePDF(URI uri) throws IOException {
+
+        byte[] content = IOUtils.toByteArray(uri);
+        return Base64.encodeBase64String(content);
+    }
+
+
+}

+ 1 - 1
hnqz-common/hnqz-common-taxhelper/src/main/java/com/logosdata/security/util/SignUtils.java

@@ -146,7 +146,7 @@ public final class SignUtils {
 			map.put("privateKey", "/excel/privatekey.pem");
 		}
 		if (osName.indexOf("mac") != -1){
-			map.put("publicKey", "/Users/jimmy/Develops/publickey.pem");
+			map.put("publicKey", "/Users/jimmy/Developer/repos/cert/taxhelpor/publickey.pem");
 			map.put("privateKey", "/Users/xuqiqi/IdeaProjects/logos/dzdk-api-gateway/privatekey.pem");
 		}
 		if (osName.indexOf("windows") != -1) {

+ 1 - 0
hnqz-common/hnqz-common-taxhelper/src/main/java/com/qunzhixinxi/hnqz/common/taxhelper/common/CommonConstants.java

@@ -57,5 +57,6 @@ public interface CommonConstants {
 	String H5_TOKEN_METHOD = "税邦云H5TOKEN方法";
 	String BINDING_CARD_CODE_METHOD = "税邦云绑卡验证码";
 	String ACK_BINDING_CARD_METHOD = "税邦云绑卡确认";
+	String USER_AGREEMENT_TEXT_METHOD = "用户协议文本方法";
 	String USER_AGREEMENT_SIGNATURE_METHOD = "用户签约方法";
 }

+ 8 - 3
hnqz-common/hnqz-common-taxhelper/src/main/java/com/qunzhixinxi/hnqz/common/taxhelper/entity/model/TaxHelperUserAgreementAuthorizationModel.java

@@ -10,12 +10,12 @@ import lombok.EqualsAndHashCode;
  * 回传用户协议授权信息
  *
  * @author Hengchen.Sun
- * @version 1.0.0
+ * @version 1.0.1 增加手签
  * @date 2021/08/09 17:30:49
  */
 @Data
 @EqualsAndHashCode(callSuper = true)
-public class TaxHelperUserAgreementAuthorizationModel extends TaxHelperModel{
+public class TaxHelperUserAgreementAuthorizationModel extends TaxHelperModel {
 
 
 	private static final long serialVersionUID = 3089361332652564285L;
@@ -35,8 +35,13 @@ public class TaxHelperUserAgreementAuthorizationModel extends TaxHelperModel{
 	 */
 	private String authorizationTime;
 
+	/**
+	 * 手签
+	 */
+	private String signatureHandwriting;
+
 
-	public TaxHelperUserAgreementAuthorizationModel(TaxHelperConfig config){
+	public TaxHelperUserAgreementAuthorizationModel(TaxHelperConfig config) {
 		this.appId = config.getAppId();
 		this.appSecrete = config.getAppSecrete();
 		this.queryUrl = config.getQueryUrl();

+ 3 - 2
hnqz-common/hnqz-common-taxhelper/src/main/java/com/qunzhixinxi/hnqz/common/taxhelper/entity/request/TaxHelperUserAgreementAuthorizationRequest.java

@@ -8,15 +8,16 @@ import lombok.EqualsAndHashCode;
 /**
  * {@code TaxHelperUserAgreementAuthorizationRequest}
  * <p>
- * TODO
+ * 税邦云用户签约
  *
  * @author Hengchen.Sun
  * @version 1.0.0
  * @date 2021/08/09 17:43:49
  */
+@Deprecated
 @Data
 @EqualsAndHashCode(callSuper = true)
-public class TaxHelperUserAgreementAuthorizationRequest extends TaxHelperRequest{
+public class TaxHelperUserAgreementAuthorizationRequest extends TaxHelperRequest {
 
 	private final static String PATH = "/lgsby/api/userAgreementAuthorization";
 

+ 27 - 0
hnqz-common/hnqz-common-taxhelper/src/main/java/com/qunzhixinxi/hnqz/common/taxhelper/entity/request/TaxHelperUserAgreementAuthorizationRequestV2.java

@@ -0,0 +1,27 @@
+package com.qunzhixinxi.hnqz.common.taxhelper.entity.request;
+
+import com.qunzhixinxi.hnqz.common.taxhelper.entity.model.TaxHelperUserAgreementAuthorizationModel;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+/**
+ * {@code TaxHelperUserAgreementAuthorizationRequestV2}
+ * <p>
+ * 税邦云用户签约
+ *
+ * @author Hengchen.Sun
+ * @version 1.0.0
+ * @date 2021/08/09 17:43:49
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+public class TaxHelperUserAgreementAuthorizationRequestV2 extends TaxHelperRequest {
+
+	private final static String PATH = "/lgsby/api/v2/userAgreementAuthorization";
+
+
+	public TaxHelperUserAgreementAuthorizationRequestV2(TaxHelperUserAgreementAuthorizationModel bizModel) {
+		this.bizModel = bizModel;
+		this.queryUrl = String.format("%s%s", bizModel.getQueryUrl(), PATH);
+	}
+}

+ 94 - 59
hnqz-common/hnqz-common-taxhelper/src/main/java/com/qunzhixinxi/hnqz/common/taxhelper/service/TaxHelperService.java

@@ -4,6 +4,7 @@ import cn.hutool.core.bean.BeanUtil;
 import cn.hutool.json.JSONUtil;
 import com.alibaba.fastjson.JSONObject;
 import com.logosdata.security.SM2;
+import com.qunzhixinxi.hnqz.common.core.util.Base64Utils;
 import com.qunzhixinxi.hnqz.common.taxhelper.annotation.TaxHelper;
 import com.qunzhixinxi.hnqz.common.taxhelper.common.CommonConstants;
 import com.qunzhixinxi.hnqz.common.taxhelper.config.TaxHelperConfig;
@@ -35,6 +36,7 @@ import com.qunzhixinxi.hnqz.common.taxhelper.entity.model.TaxHelperLoginModel;
 import com.qunzhixinxi.hnqz.common.taxhelper.entity.request.TaxHelperRequest;
 import com.qunzhixinxi.hnqz.common.taxhelper.entity.request.TaxHelperSettlementRequest;
 import com.qunzhixinxi.hnqz.common.taxhelper.entity.request.TaxHelperUserAgreementAuthorizationRequest;
+import com.qunzhixinxi.hnqz.common.taxhelper.entity.request.TaxHelperUserAgreementAuthorizationRequestV2;
 import com.qunzhixinxi.hnqz.common.taxhelper.entity.response.TaxHelperResponse;
 import com.logosdata.security.util.SignUtils;
 import com.qunzhixinxi.hnqz.common.taxhelper.util.HttpUtils;
@@ -289,6 +291,25 @@ public class TaxHelperService {
 		return response;
 	}
 
+	/**
+	 * 回传用户协议授权信息接口(含手签)
+	 *
+	 * @param request 请求
+	 * @return 结果字符串
+	 * @throws Exception
+	 */
+	@TaxHelper(value = "userAgreementAuthorizationV2")
+	public TaxHelperResponse userAgreementAuthorizationV2(TaxHelperUserAgreementAuthorizationRequestV2 request) {
+		TaxHelperResponse response = null;
+		try {
+			response = process(request);
+		} catch (Exception e) {
+			log.error("税邦云用户协议内容获取失败:{}", e.getMessage());
+			response = customResponse(e.getMessage());
+		}
+		return response;
+	}
+
 	/**
 	 * 自定义响应结果
 	 *
@@ -462,17 +483,17 @@ public class TaxHelperService {
 	// 	taxHelperConfig.setQueryUrl("https://test.taxhelpor.com:8883");
 	// 	// taxHelperConfig.setQueryUrl("http://114.248.76.210:8883/");
 	//
-	// 	TaxHelperLoginModel taxHelperLoginModel = new TaxHelperLoginModel(taxHelperConfig);
-	// 	TaxHelperLoginRequest loginRequest = new TaxHelperLoginRequest(taxHelperLoginModel);
+	// 	// TaxHelperLoginModel taxHelperLoginModel = new TaxHelperLoginModel(taxHelperConfig);
+	// 	// TaxHelperLoginRequest loginRequest = new TaxHelperLoginRequest(taxHelperLoginModel);
 	// 	String randomKey = "UVKVZfHcTRYgTZpV";
-	// 	// String randomKey = RandomStringUtils.randomAlphabetic(16);
-	// 	System.out.println(randomKey);
-	// 	loginRequest.setKey(randomKey);
-	//
-	// 	TaxHelperResponse s1 = service.login(loginRequest);
-	// 	System.out.println(s1.success());
-	// 	System.out.println(s1);
-	// 	System.out.println("7d301043970be6b51fd6a89cc245c936d72ea4ac3560585136d5dd8af10e06cb".length());
+	// 	// // String randomKey = RandomStringUtils.randomAlphabetic(16);
+	// 	// System.out.println(randomKey);
+	// 	// loginRequest.setKey(randomKey);
+	// 	//
+	// 	// TaxHelperResponse s1 = service.login(loginRequest);
+	// 	// System.out.println(s1.success());
+	// 	// System.out.println(s1);
+	// 	// System.out.println("7d301043970be6b51fd6a89cc245c936d72ea4ac3560585136d5dd8af10e06cb".length());
 	//
 	//
 	// 	// System.out.println("====================================================");
@@ -485,59 +506,73 @@ public class TaxHelperService {
 	// 	// System.out.println(userAgreement.getData());
 	//
 	//
-	// 	System.out.println("====================================================");
-	// 	TaxHelperUserAgreementAuthorizationModel model1 = new TaxHelperUserAgreementAuthorizationModel(taxHelperConfig);
-	// 	model1.setEnterpriseCode("91430181MA4RJ12345");
-	// 	model1.setIdCard("110227200001010570");
+	// 	// System.out.println("====================================================");
+	// 	// TaxHelperUserAgreementAuthorizationModel model1 = new TaxHelperUserAgreementAuthorizationModel(taxHelperConfig);
+	// 	// model1.setEnterpriseCode("91430181MA4RJ12345");
+	// 	// model1.setIdCard("110227200001010570");
+	// 	//
+	// 	// model1.setAuthorizationTime("2021-08-09 12:56:12");
+	// 	//
+	// 	// TaxHelperUserAgreementAuthorizationRequest rq1 = new TaxHelperUserAgreementAuthorizationRequest(model1);
+	// 	// rq1.setKey(randomKey);
+	// 	// TaxHelperResponse response1 = service.userAgreementAuthorization(rq1);
+	// 	// System.out.println(response1);
 	//
-	// 	model1.setAuthorizationTime("2021-08-09 12:56:12");
 	//
-	// 	TaxHelperUserAgreementAuthorizationRequest rq1 = new TaxHelperUserAgreementAuthorizationRequest(model1);
-	// 	rq1.setKey(randomKey);
-	// 	TaxHelperResponse response1 = service.userAgreementAuthorization(rq1);
-	// 	System.out.println(response1);
+	// 	// System.out.println("====================================================");
+	// 	// TaxHelperUserAgreementAuthorizationModel model1 = new TaxHelperUserAgreementAuthorizationModel(taxHelperConfig);
+	// 	// model1.setEnterpriseCode("91430181MA4RJ12345");
+	// 	// model1.setIdCard("110227200001010570");
+	// 	// model1.setAuthorizationTime("2021-08-09 12:56:12");
+	// 	// String encodeImage = Base64Utils.encodeImage("/Users/jimmy/Downloads/BigBangTheory-Howard.jpg");
+	// 	// model1.setSignatureHandwriting(encodeImage);
+	// 	//
+	// 	// TaxHelperUserAgreementAuthorizationRequestV2 rq1 = new TaxHelperUserAgreementAuthorizationRequestV2(model1);
+	// 	// rq1.setKey(randomKey);
+	// 	// TaxHelperResponse response1 = service.userAgreementAuthorizationV2(rq1);
+	// 	// System.out.println(response1);
 	//
 	// }
 
-	// 	System.out.println("================================================================================================================");
-	// 	TaxHelperAddMemberModel addMemberModel = new TaxHelperAddMemberModel(taxHelperConfig);
-	// 	addMemberModel.setEnterpriseCode("91430181MA4RJ12345");
-	// 	addMemberModel.setName("张大三");
-	// 	addMemberModel.setIdCard("110227200001010570");
-	// 	addMemberModel.setPhone("13388889999");
-	// 	addMemberModel.setNotifyUrl("https://localhost:8080/notify");
-	// 	TaxHelperAddMemberRequest addMemberRequest = new TaxHelperAddMemberRequest(addMemberModel);
-	// 	addMemberRequest.setKey(loginRequest.getKey());
-	// 	TaxHelperResponse s3 = service.addMembers(addMemberRequest);
-	// 	System.out.println(s3.success());
-	// 	System.out.println(s3);
-	// 	System.out.println("================================================================================================================");
-	//
-	// 	log.warn(">>>>>>>>>>>>>>获取eid token");
-	//
-	// 	TaxHelperEidTokenModel eidTokenModel = new TaxHelperEidTokenModel(taxHelperConfig);
-	// 	eidTokenModel.setIdCard("110227200001010570");
-	// 	TaxHelperEidTokenRequest eidTokenRequest = new TaxHelperEidTokenRequest(eidTokenModel);
-	// 	eidTokenRequest.setKey(loginRequest.getKey());
-	// 	TaxHelperResponse eRes = service.getEidToken(eidTokenRequest);
-	// 	System.out.println(eRes.success());
-	// 	System.out.println(JSONUtil.toJsonStr(eRes));
-	// 	System.out.println("================================================================================================================");
-	//
-	// 	log.warn(">>>>>>>>>>>>>>echeck token");
-	//
-	// 	TaxHelperECheckModel eCheckModel = new TaxHelperECheckModel(taxHelperConfig);
-	// 	eCheckModel.setToken(eRes.getMessage());
-	// 	TaxHelperECheckRequest eCheckRequest = new TaxHelperECheckRequest(eCheckModel);
-	// 	eCheckRequest.setKey(loginRequest.getKey());
-	// 	TaxHelperResponse echeck = service.ECheckFace(eCheckRequest);
-	// 	System.out.println(echeck.success());
-	// 	System.out.println(JSONUtil.toJsonStr(echeck));
-	//
-	//
-	// 	System.out.println("================================================================================================================");
-	// }
-	//
+		// System.out.println("================================================================================================================");
+		// TaxHelperAddMemberModel addMemberModel = new TaxHelperAddMemberModel(taxHelperConfig);
+		// addMemberModel.setEnterpriseCode("91430181MA4RJ12345");
+		// addMemberModel.setName("张大三");
+		// addMemberModel.setIdCard("110227200001010570");
+		// addMemberModel.setPhone("13388889999");
+		// addMemberModel.setNotifyUrl("https://localhost:8080/notify");
+		// TaxHelperAddMemberRequest addMemberRequest = new TaxHelperAddMemberRequest(addMemberModel);
+		// addMemberRequest.setKey(loginRequest.getKey());
+		// TaxHelperResponse s3 = service.addMembers(addMemberRequest);
+		// System.out.println(s3.success());
+		// System.out.println(s3);
+		// System.out.println("================================================================================================================");
+		//
+		// log.warn(">>>>>>>>>>>>>>获取eid token");
+		//
+		// TaxHelperEidTokenModel eidTokenModel = new TaxHelperEidTokenModel(taxHelperConfig);
+		// eidTokenModel.setIdCard("110227200001010570");
+		// TaxHelperEidTokenRequest eidTokenRequest = new TaxHelperEidTokenRequest(eidTokenModel);
+		// eidTokenRequest.setKey(loginRequest.getKey());
+		// TaxHelperResponse eRes = service.getEidToken(eidTokenRequest);
+		// System.out.println(eRes.success());
+		// System.out.println(JSONUtil.toJsonStr(eRes));
+		// System.out.println("================================================================================================================");
+		//
+		// log.warn(">>>>>>>>>>>>>>echeck token");
+		//
+		// TaxHelperECheckModel eCheckModel = new TaxHelperECheckModel(taxHelperConfig);
+		// eCheckModel.setToken(eRes.getMessage());
+		// TaxHelperECheckRequest eCheckRequest = new TaxHelperECheckRequest(eCheckModel);
+		// eCheckRequest.setKey(loginRequest.getKey());
+		// TaxHelperResponse echeck = service.ECheckFace(eCheckRequest);
+		// System.out.println(echeck.success());
+		// System.out.println(JSONUtil.toJsonStr(echeck));
+		//
+		//
+		// System.out.println("================================================================================================================");
+	}
+
 	// 	// log.warn(">>>>>>>>>>>>>>>>>>>获取token");
 	//
 	// 	TaxHelperAppletBizTokenModel taxHelperAppletBizTokenModel = new TaxHelperAppletBizTokenModel(taxHelperConfig);
@@ -604,4 +639,4 @@ public class TaxHelperService {
 	// 	TaxHelperResponse s6 = service.settlement(taxHelperSettlementRequest);
 	// 	System.out.println(s6);
 	// }
-}
+// }

+ 1 - 1
hnqz-upms/hnqz-upms-api/src/main/java/com/qunzhixinxi/hnqz/admin/api/vo/UserVO.java

@@ -244,7 +244,7 @@ public class UserVO implements Serializable {
 	private Integer rljCertStatus;
 
 	/**
-	 * 税邦云协议签署,0->未签署,1->已签署
+	 * 税邦云协议签署,0->未签署,1->已签署 2-> 需补签
 	 */
 	@ApiModelProperty(value="税邦云协议签署")
 	private Integer taxHelperAgreementSignature;

+ 88 - 23
hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/controller/PartyAController.java

@@ -1,7 +1,12 @@
 package com.qunzhixinxi.hnqz.admin.controller;
 
+import cn.hutool.core.codec.Base64;
+import cn.hutool.core.collection.CollUtil;
+import cn.hutool.core.util.IdUtil;
+import cn.hutool.core.util.StrUtil;
 import cn.hutool.json.JSONArray;
 import cn.hutool.json.JSONUtil;
+import com.google.common.collect.ImmutableMap;
 import com.qunzhixinxi.hnqz.admin.entity.dto.CancellationScorePackageDTO;
 import com.qunzhixinxi.hnqz.admin.entity.dto.EncryptedInput;
 import com.qunzhixinxi.hnqz.admin.entity.dto.ExecSettlementDTO;
@@ -14,12 +19,16 @@ import com.qunzhixinxi.hnqz.admin.entity.dto.TaxHelperAddMemberDTO;
 import com.qunzhixinxi.hnqz.admin.entity.dto.TaxHelperAgreementSignatureDTO;
 import com.qunzhixinxi.hnqz.admin.entity.dto.TaxHelperBindingCardCodeDTO;
 import com.qunzhixinxi.hnqz.admin.entity.dto.TaxHelperTokenDTO;
+import com.qunzhixinxi.hnqz.admin.entity.dto.TaxHelperUserAgreementDTO;
 import com.qunzhixinxi.hnqz.admin.entity.input.TaskSettleBatch;
 import com.qunzhixinxi.hnqz.admin.service.PartyAService;
+import com.qunzhixinxi.hnqz.admin.util.Base64Util;
+import com.qunzhixinxi.hnqz.common.core.util.Base64Utils;
 import com.qunzhixinxi.hnqz.common.core.util.R;
 import com.qunzhixinxi.hnqz.common.security.annotation.Inner;
 import lombok.AllArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.io.FileUtils;
 import org.openqa.selenium.json.Json;
 import org.springframework.http.MediaType;
 import org.springframework.web.bind.annotation.DeleteMapping;
@@ -29,6 +38,7 @@ import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
 
+import java.io.File;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
@@ -82,27 +92,81 @@ public class PartyAController {
 		}
 	}
 
-	// /**
-	//  * 用户协议签署
-	//  * @param input 加密信息
-	//  * @return 签署结果
-	//  */
-	// @PostMapping(value = "/tax-helper/agreement-signature")
-	// public R<?> taxHelperAgreementSignature(@RequestBody EncryptedInput input){
-	//
-	// 	// 获取解密的文档
-	// 	String decodeStr = input.getEncryptedInfo();
-	//
-	// 	// 实际业务处理
-	// 	TaxHelperAgreementSignatureDTO taxHelperAgreementSignatureDTO = JSONUtil.toBean(decodeStr, TaxHelperAgreementSignatureDTO.class);
-	// 	Map<String, String> result = partyAService.userAgreementAuthorization(taxHelperAgreementSignatureDTO);
-	//
-	// 	if ("2000".equals(result.get("code"))) {
-	// 		return R.ok(result);
-	// 	} else {
-	// 		return R.failed(result);
-	// 	}
-	// }
+	/**
+	 * 用户协议签署
+	 *
+	 * @param input 加密信息
+	 * @return 签署结果
+	 */
+	@PostMapping(value = "/tax-helper/user-agreement")
+	public R<?> taxHelperUserAgreement(@RequestBody EncryptedInput input) {
+
+		// 获取解密的文档
+		String decodeStr = input.getEncryptedInfo();
+
+		// 实际业务处理
+		TaxHelperUserAgreementDTO userAgreementDTO = JSONUtil.toBean(decodeStr, TaxHelperUserAgreementDTO.class);
+		Map<String, String> result = partyAService.userAgreementText(userAgreementDTO);
+
+		if ("2000".equals(result.get("code"))) {
+			return R.ok(result);
+		} else {
+			return R.failed(result);
+		}
+	}
+
+	/**
+	 * 用户协议签署
+	 *
+	 * @param input 加密信息
+	 * @return 签署结果
+	 */
+	@PostMapping(value = "/tax-helper/agreement-signature")
+	public R<?> taxHelperAgreementSignature(@RequestBody EncryptedInput input) {
+
+		Map<String, String> result;
+
+		// 获取解密的文档
+		String decodeStr = input.getEncryptedInfo();
+
+		// 实际业务处理
+		TaxHelperAgreementSignatureDTO taxHelperAgreementSignatureDTO = JSONUtil.toBean(decodeStr, TaxHelperAgreementSignatureDTO.class);
+
+		// 校验base64
+		if (StrUtil.isBlank(taxHelperAgreementSignatureDTO.getSignatureHandwriting())) {
+			result = partyAService.getResultMap("4000", "手签信息必填");
+			return R.failed(result);
+		} else {
+			List<String> split = StrUtil.split(taxHelperAgreementSignatureDTO.getSignatureHandwriting(), ";");
+			if (CollUtil.isEmpty(split) || split.size() > 2) {
+				result = partyAService.getResultMap("4000", "手签信息有误");
+				return R.failed(result);
+			} else {
+				String info = split.get(0);
+				List<String> suffix = StrUtil.split(info, StrUtil.SLASH);
+				if (CollUtil.isEmpty(suffix) || suffix.size() > 2 ||  !StrUtil.equalsAnyIgnoreCase(suffix.get(1), "png", "jpg", "jpeg")){
+					result = partyAService.getResultMap("4000", "手签格式错误");
+					return R.failed(result);
+				}
+				File file = Base64.decodeToFile(taxHelperAgreementSignatureDTO.getSignatureHandwriting(), new File("/tmp/" + IdUtil.fastSimpleUUID() + "." + suffix.get(1)));
+				long sizeOf = FileUtils.sizeOf(file);
+				long sizeOfInKB = sizeOf / 1024;
+
+				if (sizeOfInKB > 300 || sizeOfInKB <= 0){
+					result = partyAService.getResultMap("4000", "手签信息大小不符合要求");
+					return R.failed(result);
+				}
+			}
+		}
+
+		result = partyAService.userAgreementAuthorization(taxHelperAgreementSignatureDTO);
+
+		if ("2000".equals(result.get("code"))) {
+			return R.ok(result);
+		} else {
+			return R.failed(result);
+		}
+	}
 
 	/**
 	 * 获取税邦云h5认证token
@@ -285,18 +349,19 @@ public class PartyAController {
 
 	/**
 	 * 结算
+	 *
 	 * @param input 加密信息输入
 	 * @return 结果
 	 */
 	@PostMapping(value = "/settlement")
-	public R<?> doSettlement(@RequestBody EncryptedInput input){
+	public R<?> doSettlement(@RequestBody EncryptedInput input) {
 		// 获取解密文档
 		String decodeStr = input.getEncryptedInfo();
 
 		// 实际业务处理
 		JSONArray jsonArray = JSONUtil.parseArray(decodeStr);
 		List<ExecSettlementDTO> execSettlementDTOList =
-				jsonArray.stream().map(json -> JSONUtil.toBean(JSONUtil.parseObj(json),ExecSettlementDTO.class))
+				jsonArray.stream().map(json -> JSONUtil.toBean(JSONUtil.parseObj(json), ExecSettlementDTO.class))
 						.collect(Collectors.toList());
 		Map<String, String> result = partyAService.doSettlement(execSettlementDTOList);
 

+ 24 - 10
hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/controller/WmTaxHelperController.java

@@ -6,6 +6,7 @@ import cn.hutool.json.JSONObject;
 import cn.hutool.json.JSONUtil;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.google.gson.JsonObject;
 import com.qunzhixinxi.hnqz.admin.api.constant.CacheConstants;
 import com.qunzhixinxi.hnqz.admin.api.entity.SysDept;
 import com.qunzhixinxi.hnqz.admin.api.entity.SysSocialDetails;
@@ -24,6 +25,7 @@ import com.qunzhixinxi.hnqz.admin.mapper.UserAgreementSignatureRecordMapper;
 import com.qunzhixinxi.hnqz.admin.service.*;
 import com.qunzhixinxi.hnqz.admin.service.retry.PartyARetryService;
 import com.qunzhixinxi.hnqz.common.core.constant.enums.LoginTypeEnum;
+import com.qunzhixinxi.hnqz.common.core.util.Base64Utils;
 import com.qunzhixinxi.hnqz.common.core.util.R;
 import com.qunzhixinxi.hnqz.common.log.annotation.SysLog;
 import com.qunzhixinxi.hnqz.common.security.annotation.Inner;
@@ -47,6 +49,7 @@ import com.qunzhixinxi.hnqz.common.taxhelper.entity.request.TaxHelperECheckReque
 import com.qunzhixinxi.hnqz.common.taxhelper.entity.request.TaxHelperEidTokenRequest;
 import com.qunzhixinxi.hnqz.common.taxhelper.entity.request.TaxHelperGetUserAgreementRequest;
 import com.qunzhixinxi.hnqz.common.taxhelper.entity.request.TaxHelperUserAgreementAuthorizationRequest;
+import com.qunzhixinxi.hnqz.common.taxhelper.entity.request.TaxHelperUserAgreementAuthorizationRequestV2;
 import com.qunzhixinxi.hnqz.common.taxhelper.entity.response.TaxHelperResponse;
 import com.qunzhixinxi.hnqz.common.taxhelper.entity.vo.TaxHelperAddMemberVo;
 import com.qunzhixinxi.hnqz.common.taxhelper.entity.vo.TaxHelperBingCardConfirmVo;
@@ -68,6 +71,8 @@ import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RequestParam;
 import org.springframework.web.bind.annotation.RestController;
 
+import java.net.URI;
+import java.net.URISyntaxException;
 import java.time.LocalDateTime;
 import java.util.Calendar;
 import java.util.Date;
@@ -180,7 +185,7 @@ public class WmTaxHelperController {
 
 				// 已经增员的补偿逻辑
 				String errorMsg = String.format(CommonConstants.ALREADY_ADD_MEMBER_SUCCESSFUL, dept.getTaxCode());
-				if (errorMsg.equals(response.getMessage())){
+				if (errorMsg.equals(response.getMessage())) {
 					log.info("税邦云历史增员成功:{},{},原因是:{}", user.getRealname(), user.getUsername(), response.getMessage());
 					SysUser tmp = new SysUser();
 					tmp.setUserId(user.getUserId());
@@ -207,7 +212,11 @@ public class WmTaxHelperController {
 	 */
 	@SysLog(value = "税邦云回传用户协议授权信息")
 	@PostMapping(value = "/agreement-signature")
-	public R<?> userAgreementAuthorization() {
+	public R<?> userAgreementAuthorization(@RequestBody String params) {
+
+		JSONObject jsonObject = JSONUtil.parseObj(params);
+		String signPic = jsonObject.getStr("pic");
+
 		HnqzUser hnqzUser = SecurityUtils.getUser();
 
 		// 判断当前用户是否已经存在回调操作,避免同时多次回调
@@ -265,16 +274,21 @@ public class WmTaxHelperController {
 				return R.failed(userAgreement);
 			}
 
-
-			//
 			TaxHelperUserAgreementAuthorizationModel model = new TaxHelperUserAgreementAuthorizationModel(config);
 			model.setEnterpriseCode(dept.getTaxCode());
 			LocalDateTime signTime = LocalDateTime.now();
 			model.setAuthorizationTime(LocalDateTimeUtil.format(signTime, CommonConstants.DEFAULT_DATE_TIME_FORMAT_PATTERN));
 			model.setIdCard(user.getIdCardNumber());
+			try {
+				model.setSignatureHandwriting(Base64Utils.encodeImageWithPrefix(new URI(signPic)));
 
-			TaxHelperUserAgreementAuthorizationRequest request = new TaxHelperUserAgreementAuthorizationRequest(model);
-			TaxHelperResponse response = taxHelperService.userAgreementAuthorization(request);
+			} catch (Exception e) {
+				log.error("获取手签图片失败");
+				return R.failed("获取手签图片失败");
+			}
+
+			TaxHelperUserAgreementAuthorizationRequestV2 request = new TaxHelperUserAgreementAuthorizationRequestV2(model);
+			TaxHelperResponse response = taxHelperService.userAgreementAuthorizationV2(request);
 
 			// 记录认证结果
 			record.setCode(response.getCode());
@@ -846,7 +860,7 @@ public class WmTaxHelperController {
 			sysCertResultRecordMapper.insert(record);
 
 			if (response.success()) {
-				if (Objects.equals(user.getCertStatus(),TaxHelperCertStatus.CERT.getCode())){
+				if (Objects.equals(user.getCertStatus(), TaxHelperCertStatus.CERT.getCode())) {
 					return R.ok(response.getMessage());
 				}
 				SysUser sysUser = new SysUser();
@@ -883,7 +897,7 @@ public class WmTaxHelperController {
 	@Inner(value = false)
 	@PostMapping(value = "/{user_id}/settlementNotify")
 	public String taxHelperSettlementNotify(@PathVariable(value = "user_id") String userId,
-													   @RequestBody String body) {
+											@RequestBody String body) {
 		// 判断当前用户是否已经存在回调操作,避免多次回调
 		String cacheKey = CacheConstants.TAX_HELPER_SETTLEMENT_NOTIFY_KEY + userId;
 		boolean absent = redisTemplate.opsForValue().setIfAbsent(cacheKey, userId, 3, TimeUnit.SECONDS);
@@ -923,7 +937,7 @@ public class WmTaxHelperController {
 			e.printStackTrace();
 			throw new RuntimeException(e.getMessage());
 		}
-		return responseJson(2000,"结算通知回调成功");
+		return responseJson(2000, "结算通知回调成功");
 	}
 
 
@@ -989,7 +1003,7 @@ public class WmTaxHelperController {
 			throw new RuntimeException(e.getMessage());
 		}
 
-		return responseJson(2000,"结算通知回调成功");
+		return responseJson(2000, "结算通知回调成功");
 	}
 
 	/**

+ 5 - 0
hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/entity/dto/TaxHelperAgreementSignatureDTO.java

@@ -15,5 +15,10 @@ import lombok.Data;
 public class TaxHelperAgreementSignatureDTO  extends BaseTaxHelperDTO{
 	private static final long serialVersionUID = -3051890641975938436L;
 
+	/**
+	 * 手签图片base64
+	 */
+	private String signatureHandwriting;
+
 
 }

+ 19 - 0
hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/entity/dto/TaxHelperUserAgreementDTO.java

@@ -0,0 +1,19 @@
+package com.qunzhixinxi.hnqz.admin.entity.dto;
+
+import lombok.Data;
+
+/**
+ * {@code TaxHelperUserAgreementDTO}
+ * <p>
+ * 税邦云用户协议dto
+ *
+ * @author Hengchen.Sun
+ * @version 1.0.0
+ * @date 2021/08/30 16:22:06
+ */
+@Data
+public class TaxHelperUserAgreementDTO extends BaseTaxHelperDTO{
+	private static final long serialVersionUID = -3051890641975938436L;
+
+
+}

+ 21 - 0
hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/service/PartyAService.java

@@ -11,6 +11,7 @@ import com.qunzhixinxi.hnqz.admin.entity.dto.TaxHelperAddMemberDTO;
 import com.qunzhixinxi.hnqz.admin.entity.dto.TaxHelperAgreementSignatureDTO;
 import com.qunzhixinxi.hnqz.admin.entity.dto.TaxHelperBindingCardCodeDTO;
 import com.qunzhixinxi.hnqz.admin.entity.dto.TaxHelperTokenDTO;
+import com.qunzhixinxi.hnqz.admin.entity.dto.TaxHelperUserAgreementDTO;
 import com.qunzhixinxi.hnqz.admin.entity.input.TaskSettleBatch;
 
 import java.util.List;
@@ -100,6 +101,7 @@ public interface PartyAService {
 
 	/**
 	 * 结算
+	 *
 	 * @param execSettlementDTOList 结算DTO
 	 * @return 提交结算结果
 	 */
@@ -107,7 +109,26 @@ public interface PartyAService {
 
 	/**
 	 * 签署用户信息
+	 *
 	 * @return 签署结果
 	 */
 	Map<String, String> userAgreementAuthorization(TaxHelperAgreementSignatureDTO taxHelperAgreementSignatureDTO);
+
+	/**
+	 * 获取用户协议
+	 *
+	 * @param userAgreementDTO 用户协议dto
+	 * @return 结果
+	 */
+	Map<String, String> userAgreementText(TaxHelperUserAgreementDTO userAgreementDTO);
+
+
+	/**
+	 * 获取
+	 *
+	 * @param code 状态码
+	 * @param data 结果数据
+	 * @return 结果map
+	 */
+	Map<String, String> getResultMap(String code, String data);
 }

+ 82 - 6
hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/service/impl/PartyAServiceImpl.java

@@ -33,6 +33,7 @@ import com.qunzhixinxi.hnqz.admin.entity.dto.TaxHelperAddMemberDTO;
 import com.qunzhixinxi.hnqz.admin.entity.dto.TaxHelperAgreementSignatureDTO;
 import com.qunzhixinxi.hnqz.admin.entity.dto.TaxHelperBindingCardCodeDTO;
 import com.qunzhixinxi.hnqz.admin.entity.dto.TaxHelperTokenDTO;
+import com.qunzhixinxi.hnqz.admin.entity.dto.TaxHelperUserAgreementDTO;
 import com.qunzhixinxi.hnqz.admin.entity.input.Record;
 import com.qunzhixinxi.hnqz.admin.entity.input.SettleAmountMonitorInput;
 import com.qunzhixinxi.hnqz.admin.entity.input.TaskSettleBatch;
@@ -76,6 +77,7 @@ import com.qunzhixinxi.hnqz.common.taxhelper.entity.request.TaxHelperGetUserAgre
 import com.qunzhixinxi.hnqz.common.taxhelper.entity.request.TaxHelperH5BizTokenRequest;
 import com.qunzhixinxi.hnqz.common.taxhelper.entity.request.TaxHelperSettlementRequest;
 import com.qunzhixinxi.hnqz.common.taxhelper.entity.request.TaxHelperUserAgreementAuthorizationRequest;
+import com.qunzhixinxi.hnqz.common.taxhelper.entity.request.TaxHelperUserAgreementAuthorizationRequestV2;
 import com.qunzhixinxi.hnqz.common.taxhelper.entity.response.TaxHelperResponse;
 import com.qunzhixinxi.hnqz.common.taxhelper.enums.TaxHelperCertStatus;
 import com.qunzhixinxi.hnqz.common.taxhelper.service.TaxHelperService;
@@ -341,9 +343,10 @@ public class PartyAServiceImpl implements PartyAService {
 		LocalDateTime signTime = LocalDateTime.now();
 		model.setAuthorizationTime(LocalDateTimeUtil.format(signTime, CommonConstants.DEFAULT_DATE_TIME_FORMAT_PATTERN));
 		model.setIdCard(member.getIdCardNumber());
+		model.setSignatureHandwriting(taxHelperAgreementSignatureDTO.getSignatureHandwriting());
 
-		TaxHelperUserAgreementAuthorizationRequest request = new TaxHelperUserAgreementAuthorizationRequest(model);
-		TaxHelperResponse response = taxHelperService.userAgreementAuthorization(request);
+		TaxHelperUserAgreementAuthorizationRequestV2 request = new TaxHelperUserAgreementAuthorizationRequestV2(model);
+		TaxHelperResponse response = taxHelperService.userAgreementAuthorizationV2(request);
 
 		// 记录认证结果
 		record.setCode(response.getCode());
@@ -378,6 +381,77 @@ public class PartyAServiceImpl implements PartyAService {
 		return getResultMap("4000", response.getMessage());
 	}
 
+	/**
+	 * 获取用户协议
+	 *
+	 * @param userAgreementDTO 用户协议dto
+	 * @return 结果
+	 */
+	@Override
+	public Map<String, String> userAgreementText(TaxHelperUserAgreementDTO userAgreementDTO) {
+		// 获取用户并校验
+		SysUser member = userService.getOne(Wrappers.<SysUser>query()
+				.eq("username", userAgreementDTO.getUsername())
+				.eq("dept_id", userAgreementDTO.getDeptId()));
+		String info = checkoutMemberInfo(member, CommonConstants.USER_AGREEMENT_TEXT_METHOD);
+		if (StringUtils.isNotEmpty(info)) {
+			return getResultMap("4000", info);
+		}
+
+		// 校验用户是否已经签署了信息
+		if (member.getTaxHelperAgreementSignature() == 1) {
+			return getResultMap("2000", "协议已签署");
+		}
+
+		// 获取部门并校验
+		SysDept dept = deptService.getById(userAgreementDTO.getDeptId());
+		info = checkoutDeptInfo(dept);
+		if (StringUtils.isNotEmpty(info)) {
+			return getResultMap("4000", info);
+		}
+
+		// 校验结算信息
+		SysDeptSub query = new SysDeptSub();
+		query.setDeptId(dept.getDeptId());
+		query.setSubjectType(SubjectTypeEnum.TYPE_SHUIBANGYUN.getCode());
+		query.setEnableFlag(SubjectTypeEnum.ENABLE_FLAG_TRUE.getCode());
+		SysDeptSub deptSub = sysDeptSubService.getOne(Wrappers.query(query));
+		info = checkoutDeptSubInfo(deptSub, ChannelEnum.TAX_HELPER, null);
+		if (StringUtils.isNotEmpty(info)) {
+			return getResultMap("4000", info);
+		}
+
+		// 获取协议开始
+		log.info("【{}({})】,获取协议信息", member.getRealname(), member.getUsername());
+		TaxHelperConfig config = new TaxHelperConfig();
+		config.setAppId(deptSub.getAppId());
+		config.setAppSecrete(deptSub.getAppSecret());
+		config.setQueryUrl(deptSub.getQueryUrl());
+
+		// 获取
+		TaxHelperGetUserAgreementModel getUserAgreementModel = new TaxHelperGetUserAgreementModel(config);
+		getUserAgreementModel.setEnterpriseCode(dept.getTaxCode());
+		TaxHelperGetUserAgreementRequest getUserAgreementRequest = new TaxHelperGetUserAgreementRequest(getUserAgreementModel);
+		TaxHelperResponse userAgreement = taxHelperService.getUserAgreement(getUserAgreementRequest);
+
+		// 记录认证结果
+		SysCertResultRecord record = new SysCertResultRecord();
+		record.setCode(userAgreement.getCode());
+		record.setCreateTime(LocalDateTime.now());
+		record.setDeptId(dept.getDeptId());
+		record.setMessage(StringUtils.isNotEmpty(userAgreement.getMessage()) ? userAgreement.getMessage() : "无");
+		record.setStatus(null);
+		record.setSubjectType(1);
+		record.setMethod("税邦云用户协议");
+		record.setUserId(member.getUserId());
+		sysCertResultRecordMapper.insert(record);
+
+		if (userAgreement.success()) {
+			return getResultMap("2000", userAgreement.getData());
+		}
+		return getResultMap("4000", userAgreement.getMessage());
+	}
+
 
 	/**
 	 * 获取税邦云H5 token
@@ -1541,7 +1615,8 @@ public class PartyAServiceImpl implements PartyAService {
 		List<Integer> taxHelperCertStatusList = new ArrayList<>();
 		if (CommonConstants.ADD_MEMBER_METHOD.equals(methodName)) {
 			taxHelperCertStatusList.add(TaxHelperCertStatus.UN_CERT.getCode());
-		} else if (CommonConstants.USER_AGREEMENT_SIGNATURE_METHOD.equals(methodName)){
+		} else if (CommonConstants.USER_AGREEMENT_SIGNATURE_METHOD.equals(methodName)
+				|| CommonConstants.USER_AGREEMENT_TEXT_METHOD.equals(methodName)) {
 			taxHelperCertStatusList.add(TaxHelperCertStatus.ADD_MEMBER.getCode());
 		} else if (CommonConstants.H5_TOKEN_METHOD.equals(methodName)) {
 			taxHelperCertStatusList.add(TaxHelperCertStatus.ADD_MEMBER.getCode());
@@ -1549,8 +1624,8 @@ public class PartyAServiceImpl implements PartyAService {
 			taxHelperCertStatusList.add(TaxHelperCertStatus.CHECKING_UNBIND.getCode());
 			taxHelperCertStatusList.add(TaxHelperCertStatus.CHECKING_BIND.getCode());
 			taxHelperCertStatusList.add(TaxHelperCertStatus.UNCHECKED_BIND.getCode());
-		} else if (CommonConstants.BINDING_CARD_CODE_METHOD.equals(methodName) || CommonConstants.ACK_BINDING_CARD_METHOD
-				.equals(methodName)) {
+		} else if (CommonConstants.BINDING_CARD_CODE_METHOD.equals(methodName)
+				|| CommonConstants.ACK_BINDING_CARD_METHOD.equals(methodName)) {
 			taxHelperCertStatusList.add(TaxHelperCertStatus.ADD_MEMBER.getCode());
 			taxHelperCertStatusList.add(TaxHelperCertStatus.CHECKED_UNBIND.getCode());
 			taxHelperCertStatusList.add(TaxHelperCertStatus.CHECKING_UNBIND.getCode());
@@ -1706,7 +1781,8 @@ public class PartyAServiceImpl implements PartyAService {
 	 * @param data 结果数据
 	 * @return 结果map
 	 */
-	private Map<String, String> getResultMap(String code, String data) {
+	@Override
+	public Map<String, String> getResultMap(String code, String data) {
 		Map<String, String> resMap = new HashMap<>(4);
 		resMap.put("code", code);
 		resMap.put("data", data);