Selaa lähdekoodia

feat: 问问添加手签功能

shc 3 vuotta sitten
vanhempi
commit
83b480415e

+ 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 = "用户签约方法";
 }

+ 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);
 

+ 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
@@ -1507,7 +1581,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());
@@ -1515,8 +1590,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());
@@ -1672,7 +1747,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);