Эх сурвалжийг харах

Merge branch 'feat-signcert-20220301' into feat-20220507-init

# Conflicts:
#	hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/controller/ApiController.java
shc 3 жил өмнө
parent
commit
15a0f5ab79
51 өөрчлөгдсөн 3319 нэмэгдсэн , 42 устгасан
  1. 26 0
      db/v2.0/220301.sql
  2. 5 0
      hnqz-common/hnqz-common-mq/pom.xml
  3. 62 0
      hnqz-common/hnqz-common-mq/src/main/java/com/qunzhixinxi/hnqz/common/rabbitmq/core/BaseRabbiMqHandler.java
  4. 3 2
      hnqz-common/hnqz-common-mq/src/main/java/com/qunzhixinxi/hnqz/common/rabbitmq/listenter/MqListener.java
  5. 17 1
      hnqz-common/hnqz-common-taxhelper/src/main/java/com/qunzhixinxi/hnqz/common/taxhelper/enums/TaxHelperCertStatus.java
  6. 20 0
      hnqz-upms/hnqz-upms-api/src/main/java/com/qunzhixinxi/hnqz/admin/api/constant/CacheConstants.java
  7. 7 0
      hnqz-upms/hnqz-upms-api/src/main/java/com/qunzhixinxi/hnqz/admin/api/constant/MqConstants.java
  8. 132 0
      hnqz-upms/hnqz-upms-api/src/main/java/com/qunzhixinxi/hnqz/admin/api/dto/OladingCommonRequest.java
  9. 5 0
      hnqz-upms/hnqz-upms-api/src/main/java/com/qunzhixinxi/hnqz/admin/api/vo/UserVO.java
  10. 8 0
      hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/controller/ApiController.java
  11. 125 0
      hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/controller/GigThirdApiController.java
  12. 35 0
      hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/controller/SysDeptSubController.java
  13. 17 0
      hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/controller/SysDictController.java
  14. 64 0
      hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/controller/SysUserController.java
  15. 216 0
      hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/controller/SysUserSignCertController.java
  16. 56 0
      hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/entity/OladingInputRecord.java
  17. 131 0
      hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/entity/SysUserSub.java
  18. 69 0
      hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/entity/dto/SettleConfigDTO.java
  19. 74 0
      hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/entity/dto/UserSignCertDTO.java
  20. 49 0
      hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/entity/model/GigBaseInfoModel.java
  21. 27 0
      hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/entity/model/GigInfoModel.java
  22. 115 0
      hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/entity/model/GigUserInfoModel.java
  23. 119 0
      hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/entity/vo/SysUserSubVO.java
  24. 28 0
      hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/enums/GigCallBackStatus.java
  25. 41 0
      hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/enums/GigChannelEnum.java
  26. 28 0
      hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/enums/GigTypeEnum.java
  27. 25 0
      hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/enums/IndustryType.java
  28. 16 0
      hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/enums/MemberIDCardType.java
  29. 39 0
      hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/enums/MemberType.java
  30. 46 0
      hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/enums/OladingCertStatus.java
  31. 15 0
      hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/enums/PayChannel.java
  32. 41 0
      hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/enums/RenlijiaCertStatus.java
  33. 42 0
      hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/enums/YeeCertStatus.java
  34. 15 0
      hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/mapper/OladingInputRecordMapper.java
  35. 15 0
      hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/mapper/SysUserSubMapper.java
  36. 247 0
      hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/mq/GigSignCertReceiver.java
  37. 7 0
      hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/service/SysDeptSubService.java
  38. 13 0
      hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/service/SysUserSubService.java
  39. 47 0
      hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/service/gig/GigThirdApiService.java
  40. 13 0
      hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/service/gig/OladingInputRecordService.java
  41. 86 0
      hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/service/gig/SysUserSignCertService.java
  42. 218 0
      hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/service/gig/impl/GigThirdApiServiceImpl.java
  43. 20 0
      hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/service/gig/impl/OladingInputRecordServiceImpl.java
  44. 651 0
      hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/service/gig/impl/SysUserSignCertServiceImpl.java
  45. 85 0
      hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/service/impl/SysDeptSubServiceImpl.java
  46. 17 0
      hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/service/impl/SysUserSubServiceImpl.java
  47. 31 19
      hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/service/impl/WmDaAgentServiceImpl.java
  48. 27 20
      hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/service/impl/WmDaDrugEntServiceImpl.java
  49. 39 0
      hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/service/impl/WmSettlementServiceImpl.java
  50. 41 0
      hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/util/Base64Util.java
  51. 44 0
      hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/util/HMACSignProvider.java

+ 26 - 0
db/v2.0/220301.sql

@@ -0,0 +1,26 @@
+create table if not exists hnqzx.sys_user_sub
+(
+    id                int auto_increment comment '主键ID'
+        primary key,
+    user_id           int              not null comment '用户ID',
+    dept_id           int              null comment '部门id',
+    gig_type          int(2)           not null comment '零工平台类型(订单支付方式类型:0-人力家 1-税邦云 2-自由职家 3-易联数科)',
+    gig_channel       int    default 0 null comment '渠道',
+    callback_status   int(1) default 0 null comment '回调状态',
+    cert_status       int    default 0 not null comment '认证状态',
+    cert_remark       longtext         null comment '认证结果描述',
+    user_type         varchar(2)       null comment '人员类型',
+    bank_card_number  varchar(19)      null comment '银行卡号',
+    bank_phone        varchar(11)      null comment '银行预留手机号',
+    id_card_front_url varchar(255)     null comment '身份证照片-正面',
+    id_card_back_url  varchar(255)     null comment '身份证照片-反面',
+    cert_video1_url   varchar(255)     null comment '认证视频1',
+    cert_video2_url   varchar(255)     null comment '认证视频1',
+    agreement_url     varchar(255)     null comment '协议',
+    create_time       datetime         null comment '创建时间',
+    create_user       int              null comment '创建人',
+    update_time       datetime         null comment '更新时间',
+    update_user       int              null comment '更新人'
+)
+    comment '用户签约认证主体信息表' charset = utf8mb4;
+

+ 5 - 0
hnqz-common/hnqz-common-mq/pom.xml

@@ -19,6 +19,11 @@
 			<groupId>com.qunzhixinxi</groupId>
 			<artifactId>hnqz-common-core</artifactId>
 		</dependency>
+		<!-- 核心模块 -->
+		<dependency>
+			<groupId>com.qunzhixinxi</groupId>
+			<artifactId>hnqz-common-data</artifactId>
+		</dependency>
 		<!-- 消息总线 rabbitmq -->
 		<dependency>
 			<groupId>org.springframework.cloud</groupId>

+ 62 - 0
hnqz-common/hnqz-common-mq/src/main/java/com/qunzhixinxi/hnqz/common/rabbitmq/core/BaseRabbiMqHandler.java

@@ -3,12 +3,46 @@ package com.qunzhixinxi.hnqz.common.rabbitmq.core;
 import com.qunzhixinxi.hnqz.common.rabbitmq.listenter.MqListener;
 import com.rabbitmq.client.Channel;
 import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.redis.core.StringRedisTemplate;
 
 import java.io.IOException;
+import java.util.Map;
+import java.util.concurrent.TimeUnit;
 
 @Slf4j
 public class BaseRabbiMqHandler<T> {
 
+	@Autowired
+	private StringRedisTemplate redisTemplate;
+
+	private static final long DEF_REPORT_TTL = 7L * 24 * 60 * 60 * 1000;
+
+	public void onMessageAck(T t, Long deliveryTag, Channel channel, MqListener mqListener) {
+		log.warn("==================== delivery-tag:[{}], ack 开始 ==========================", deliveryTag);
+		Map<String, String> res = null;
+		try {
+			log.warn("开始执行操作");
+			res = mqListener.handler(t, channel);
+		} catch (Exception e) {
+			log.info("接收消息失败,但不放回队列");
+			e.printStackTrace();
+		} finally {
+			// 插入redis
+			setIntoRedis(res.get("key"), res.get("res"));
+
+			log.warn("开始ack操作");
+			try {
+				channel.basicAck(deliveryTag, false);
+			} catch (IOException e) {
+				e.printStackTrace();
+			}
+
+			log.warn("==================== delivery-tag:[{}], ack 结束 ==========================", deliveryTag);
+		}
+
+	}
+
     public void onMessage(T t, Long deliveryTag, Channel channel, MqListener mqListener) {
         try {
             mqListener.handler(t, channel);
@@ -28,4 +62,32 @@ public class BaseRabbiMqHandler<T> {
         }
 
     }
+
+	private void setIntoRedis(final String key, final String res) {
+
+		log.warn("-----------------------------循环插入redis开始--------------------------------------");
+
+		for (int i = 0; ; i++) {
+			log.info("-----------redis写入中,第 [{}] 次-----------", i);
+			redisTemplate.opsForValue().set(key, res, DEF_REPORT_TTL, TimeUnit.MILLISECONDS);
+			try {
+				Thread.sleep(50);
+			} catch (Exception e) {
+				continue;
+			}
+
+			String s = redisTemplate.opsForValue().get(key);
+
+			if (res.equals(s)) {
+				log.info("r-key:{}", key);
+				log.info("r-res:{}", res);
+				log.info("r-content :{}", s);
+				log.info("-----------redis成功-----------");
+				break;
+			}
+		}
+
+		log.warn("-----------------------------循环插入redis开始--------------------------------------");
+
+	}
 }

+ 3 - 2
hnqz-common/hnqz-common-mq/src/main/java/com/qunzhixinxi/hnqz/common/rabbitmq/listenter/MqListener.java

@@ -2,9 +2,10 @@ package com.qunzhixinxi.hnqz.common.rabbitmq.listenter;
 
 import com.rabbitmq.client.Channel;
 
+import java.util.Map;
+
 public interface MqListener<T> {
 
-    default void handler(T map, Channel channel) {
-    }
+	Map<String,String> handler(T map, Channel channel) throws Exception;
 
 }

+ 17 - 1
hnqz-common/hnqz-common-taxhelper/src/main/java/com/qunzhixinxi/hnqz/common/taxhelper/enums/TaxHelperCertStatus.java

@@ -17,7 +17,7 @@ public enum TaxHelperCertStatus {
 
 	UN_CERT(10, "未认证"),                    // 未增员
 	ADD_MEMBER(11, "已增员"),                 // 未认证未绑卡
-	CHECKED_UNBIND(12, "已认证未绑卡"),      // 已认证未绑卡
+	CHECKED_UNBIND(12, "已认证未绑卡"),      // 已认证未绑卡
 	CHECKING_BIND(13, "认证中已绑卡"),         // 认证中已绑卡
 	CHECKING_UNBIND(14, "认证中未绑卡"),       // 认证中未绑卡
 	CERT(15, "已认证"),                    	 // 已认证已绑卡
@@ -26,4 +26,20 @@ public enum TaxHelperCertStatus {
 	private int code;
 
 	private String desc;
+
+	/**
+	 * 根据枚举编码获取枚举对象
+	 *
+	 * @param code 枚举编码
+	 * @return 如果存在返回枚举,否则返回 {@code null}
+	 */
+	public static TaxHelperCertStatus resolve(final int code) {
+		for (TaxHelperCertStatus certStatus : TaxHelperCertStatus.values()) {
+			if (certStatus.getCode() == code) {
+				return certStatus;
+			}
+		}
+		return UN_CERT;
+
+	}
 }

+ 20 - 0
hnqz-upms/hnqz-upms-api/src/main/java/com/qunzhixinxi/hnqz/admin/api/constant/CacheConstants.java

@@ -95,4 +95,24 @@ public interface CacheConstants {
 	 */
 	String TASK_CONTENT_DRAFT = " typeid%s:userid%s";
 
+	/**
+	 * 用户签约认证响应队列key
+	 */
+	String USER_SIGN_CERT_RESPONSE_MQ_KEY = "USER:SIGN:CERT:RESPONSE:KEY:";
+
+	/**
+	 * 用户签约认证响应结果key
+	 */
+	String USER_SIGN_CERT_RESPONSE_KEY = "USER:SIGN:CERT:RESPONSE:KEY:";
+
+	/**
+	 * 绑卡换绑的新银行卡号
+	 */
+	String BIND_CARD_CONFIRM_NEW_BANK_CARD = "BIND:CARD:CONFIRM:NEW:BANK:CARD:";
+
+	/**
+	 * 自由职家签约结果回调key
+	 */
+	String OLADING_SIGN_UP_NOTIFY_KEY = "OLADING:SIGN_UP:NOTIFY:KEY:";
+
 }

+ 7 - 0
hnqz-upms/hnqz-upms-api/src/main/java/com/qunzhixinxi/hnqz/admin/api/constant/MqConstants.java

@@ -18,4 +18,11 @@ public interface MqConstants {
 	String DIRECT_MODE_REPORT_EXPORT_NBA_QUEUE = "direct_mode_report_export_nba_queue";
 	String DIRECT_MODE_REPORT_EXPORT_NBA_HISTORY_QUEUE = "direct_mode_report_export_nba_history_queue";
 	String DIRECT_MODE_REPORT_EXPORT_NB_QUEUE = "direct_mode_report_export_nb_queue";
+
+	/**
+	 * gig服务队列
+	 */
+	String DIRECT_MODE_GIG_SIGN_CERT_QUEUE = "direct_mode_gig_sign_cert_queue";
+	String DIRECT_MODE_GIG_SIGN_CERT_RES_QUEUE = "direct_mode_gig_sign_cert_res_queue";
+	String DIRECT_MODE_GIG_BANK_CARD_QUEUE = "direct_mode_gig_bank_card_queue";
 }

+ 132 - 0
hnqz-upms/hnqz-upms-api/src/main/java/com/qunzhixinxi/hnqz/admin/api/dto/OladingCommonRequest.java

@@ -0,0 +1,132 @@
+package com.qunzhixinxi.hnqz.admin.api.dto;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.Getter;
+
+import java.io.Serializable;
+import java.util.Map;
+
+/**
+ * 自由职家的统一请求参数
+ *
+ * @author lixuesong
+ * @date 2022年04月18日 12:00
+ */
+@Data
+public class OladingCommonRequest implements Serializable {
+
+	private static final long serialVersionUID = -467629451978460444L;
+
+	/**
+	 * 数据报文
+	 */
+//	@NotNull(message = "req必填")
+	private String req;
+
+	/**
+	 * base64编码的签名数据
+	 */
+//	@NotEmpty(message = "sign必填")
+	private String sign;
+
+
+	/**
+	 * 数据报文
+	 */
+	@Data
+	public static class Req implements Serializable {
+
+		private static final long serialVersionUID = 2615670481019232417L;
+
+		/**
+		 * 接口名称
+		 */
+		private String name;
+
+		/**
+		 * 错误码
+		 */
+		private String code;
+
+		/**
+		 * 描述信息
+		 */
+		private String message;
+
+		/**
+		 * 接口业务数据
+		 */
+		private Map<String, Object> data;
+	}
+
+	/**
+	 * 接口名称枚举
+	 */
+	@Getter
+	@AllArgsConstructor
+	public enum InterfaceName {
+
+		// 接口名称
+		SIGN_UP("签约回调"),
+		UPLOAD_ID_CARD_IMAGE("证照上传回调"),
+		UPLOAD_TAXPAYER_AGREEMENT("上传企业纳税人协议回调");
+
+		/**
+		 * 描述
+		 */
+		private String desc;
+	}
+
+	/**
+	 * 签约状态;包括已签约、未签约
+	 */
+	@Getter
+	@AllArgsConstructor
+	public enum SignUpStatus {
+
+		// 签约状态
+		UN_SIGN(0, "未签约"),
+		SIGN(1, "已签约");
+
+		private final Integer code;
+
+		private final String message;
+	}
+
+	/**
+	 * 证件照处理状态;已受理、认证通过、认证失败、纳税人信息不存在、证照未上传
+	 */
+	@Getter
+	@AllArgsConstructor
+	public enum UploadIdCardImageStatus {
+
+		// 证件照处理状态
+		ACCEPT(0, "已受理"),
+		IDENTIFY_SUCCESS(1, "认证通过"),
+		IDENTIFY_FAIL(2, "认证失败"),
+		NULL(3, "纳税人信息不存在"),
+		UN_IDENTIFY(4, "证照未上传");
+
+		private final Integer code;
+
+		private final String message;
+	}
+
+	/**
+	 * 协议上传状态;已受理、上传成功、上传失败
+	 */
+	@Getter
+	@AllArgsConstructor
+	public enum UploadTaxpayerAgreementStatus {
+
+		// 协议上传状态
+		ACCEPT(0, "已受理"),
+		SUCCESS(1, "上传成功"),
+		FAIL(2, "上传失败");
+
+		private final Integer code;
+
+		private final String message;
+	}
+}

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

@@ -250,4 +250,9 @@ public class UserVO implements Serializable {
 	@ApiModelProperty(value="结算主体类型")
 	private Map<String, Integer> subjectTypeAndChannel;
 
+	/**
+	 * 不同渠道的认证状态
+	 */
+	private String[] certStatusArr;
+
 }

+ 8 - 0
hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/controller/ApiController.java

@@ -31,6 +31,7 @@ import com.qunzhixinxi.hnqz.admin.api.vo.UserVO;
 import com.qunzhixinxi.hnqz.admin.config.UpmsConfig;
 import com.qunzhixinxi.hnqz.admin.entity.SysCertResultRecord;
 import com.qunzhixinxi.hnqz.admin.entity.SysDeptSub;
+import com.qunzhixinxi.hnqz.admin.entity.SysUserSub;
 import com.qunzhixinxi.hnqz.admin.entity.WmDaAgent;
 import com.qunzhixinxi.hnqz.admin.entity.WmDaDistribution;
 import com.qunzhixinxi.hnqz.admin.entity.WmDaDrugEnt;
@@ -55,6 +56,7 @@ import com.qunzhixinxi.hnqz.admin.entity.input.NoticeApiInput;
 import com.qunzhixinxi.hnqz.admin.entity.input.WmScorePackageApiInput;
 import com.qunzhixinxi.hnqz.admin.entity.input.WmScorePackageApiOutput;
 import com.qunzhixinxi.hnqz.admin.entity.input.WmWkAlbumApiInput;
+import com.qunzhixinxi.hnqz.admin.entity.vo.SysUserSubVO;
 import com.qunzhixinxi.hnqz.admin.enums.DelEnum;
 import com.qunzhixinxi.hnqz.admin.enums.PackageTypeEnum;
 import com.qunzhixinxi.hnqz.admin.enums.SubjectTypeEnum;
@@ -89,6 +91,7 @@ import com.qunzhixinxi.hnqz.admin.service.WmUserSignService;
 import com.qunzhixinxi.hnqz.admin.service.WmWkAlbumService;
 import com.qunzhixinxi.hnqz.admin.service.WmWkArticleService;
 import com.qunzhixinxi.hnqz.admin.service.WmWkArticleShareService;
+import com.qunzhixinxi.hnqz.admin.service.gig.SysUserSignCertService;
 import com.qunzhixinxi.hnqz.admin.util.GetOpenIDUtil;
 import com.qunzhixinxi.hnqz.admin.util.Html2ImageByJsWrapper;
 import com.qunzhixinxi.hnqz.admin.util.QRCodeGenerator;
@@ -204,6 +207,7 @@ public class ApiController {
 	private final WmDeptTaskTypeTemplateService wmDeptTaskTypeTemplateService;
 	private final WmUserSignDetailService wmUserSignDetailService;
 	private final WmAdRecordService adRecordService;
+	private final SysUserSignCertService sysUserSignCertService;
 
 	@SysLog("通过任务类型获取表单配置")
 	@ApiOperation(value = "任务类型表单配置-通过任务类型获取表单配置", notes = "根据任务类型获取表单配置")
@@ -749,6 +753,10 @@ public class ApiController {
 						.collect(Collectors.toMap(SysDeptSub::getSubjectType, SysDeptSub::getSubjectChannel));
 				mapOne.put("subjectTypeAndChannel", collect);
 
+				// 认证服务信息回显
+				List<SysUserSubVO> userSignCertList = sysUserSignCertService.listUserSignCertForApi(sysU.getUserId());
+				mapOne.put("certList", userSignCertList);
+
 				list.add(mapOne);
 
 				roleList.addAll(roleIdList);

+ 125 - 0
hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/controller/GigThirdApiController.java

@@ -0,0 +1,125 @@
+package com.qunzhixinxi.hnqz.admin.controller;
+
+import cn.hutool.core.util.StrUtil;
+import cn.hutool.json.JSONUtil;
+import com.qunzhixinxi.hnqz.admin.api.constant.CacheConstants;
+import com.qunzhixinxi.hnqz.admin.api.dto.OladingCommonRequest;
+import com.qunzhixinxi.hnqz.admin.entity.OladingInputRecord;
+import com.qunzhixinxi.hnqz.admin.service.gig.GigThirdApiService;
+import com.qunzhixinxi.hnqz.admin.service.gig.OladingInputRecordService;
+import com.qunzhixinxi.hnqz.admin.util.HMACSignProvider;
+import com.qunzhixinxi.hnqz.common.log.annotation.SysLog;
+import com.qunzhixinxi.hnqz.common.security.annotation.Inner;
+import lombok.AllArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.data.redis.core.RedisTemplate;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.servlet.http.HttpServletResponse;
+import java.util.Map;
+import java.util.concurrent.TimeUnit;
+
+/**
+ * 第三方零工接口
+ *
+ * @author lixuesong
+ * @date 2022年04月17日 11:31
+ */
+@Slf4j
+@RestController
+@AllArgsConstructor
+@RequestMapping("/gig-third-api")
+public class GigThirdApiController {
+
+	private final GigThirdApiService gigThirdApiService;
+
+	private final OladingInputRecordService oladingInputRecordService;
+
+	private final RedisTemplate redisTemplate;
+
+	private static final HMACSignProvider hMACSignProvide = new HMACSignProvider();
+
+	/**
+	 * 公钥 TODO 暂时没有
+	 */
+	private static final String PUBLIC_KEY = "123123123";
+
+	/**
+	 * 算法类型
+	 */
+	private static final String ALGORITHM_TYPE = "HmacSHA256";
+
+	/**
+	 * 自由职家统一请求地址
+	 *
+	 * @return
+	 */
+	@Inner(value = false)
+	@SysLog("自由职家统一请求地址")
+	@PostMapping("/olading")
+	public void oladingRequest(@RequestParam(value = "req", required = false) String reqStr,
+							   @RequestParam(required = false) String sign, HttpServletResponse response) {
+
+		log.info("自由职家请求方法参数:req={}, sign={}", reqStr, sign);
+
+		// 请求数据
+		OladingCommonRequest.Req req = JSONUtil.toBean(reqStr, OladingCommonRequest.Req.class);
+		// 请求接口名称
+		String interfaceName = req.getName();
+		// 请求data
+		Map<String, Object> data = req.getData();
+		// 请求requestId
+		String requestId = (String) data.get("requestId");
+		if (StrUtil.isBlank(requestId)) {
+			requestId = (String) data.get("request_id");
+		}
+		String redisKey = String.format("%s_%s_%s", CacheConstants.OLADING_SIGN_UP_NOTIFY_KEY, interfaceName, requestId);
+		Boolean absent = redisTemplate.opsForValue().setIfAbsent(redisKey, reqStr, 30, TimeUnit.MINUTES);
+		if (!absent) {
+			log.error("存在在途操作requestId={}", requestId);
+			try {
+				response.getWriter().write("SUCCESS");
+				response.getWriter().flush();
+			} catch (Exception e) {
+				log.error("response返回异常", e);
+			}
+			return;
+		}
+
+		// 1.请求记录
+		OladingInputRecord record = new OladingInputRecord();
+		record.setRequestId(requestId);
+		record.setInterfaceName(interfaceName);
+		record.setReqBody(String.format("%s,%s", reqStr, sign));
+		record.setPrivateKey("");
+		record.setPublicKey("");
+		oladingInputRecordService.save(record);
+
+		try {
+			// 2. 验签 TODO 暂不验签
+//			boolean verfyResult =
+//					hMACSignProvide.verfy(ALGORITHM_TYPE, PUBLIC_KEY, JSONUtil.toJsonStr(req.getData()), sign);
+//			log.info("验签结果: {}", verfyResult);
+
+			// 3.实际操作
+
+			if (StrUtil.isNotBlank(requestId)) {
+				gigThirdApiService.oladingNotify(interfaceName, requestId, data);
+			}
+		} catch (Exception e) {
+			log.error("自由职家统一请求异常", e);
+		} finally {
+			try {
+				response.getWriter().write("SUCCESS");
+				response.getWriter().flush();
+			} catch (Exception e) {
+				log.error("response返回异常", e);
+			}
+		}
+
+	}
+
+}

+ 35 - 0
hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/controller/SysDeptSubController.java

@@ -1,7 +1,12 @@
 package com.qunzhixinxi.hnqz.admin.controller;
 
+import cn.hutool.core.bean.BeanUtil;
+import cn.hutool.core.collection.CollUtil;
+import cn.hutool.core.util.ArrayUtil;
+import cn.hutool.core.util.StrUtil;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.qunzhixinxi.hnqz.admin.entity.dto.SettleConfigDTO;
 import com.qunzhixinxi.hnqz.admin.entity.input.DeptSubLimitAmountInput;
 import com.qunzhixinxi.hnqz.admin.enums.SubjectTypeEnum;
 import com.qunzhixinxi.hnqz.common.core.util.R;
@@ -16,6 +21,8 @@ import io.swagger.annotations.ApiOperation;
 import lombok.AllArgsConstructor;
 import org.springframework.web.bind.annotation.*;
 
+import javax.validation.Valid;
+import java.util.ArrayList;
 import java.util.List;
 
 
@@ -73,6 +80,34 @@ public class SysDeptSubController {
 		return sysDeptSubService.updateSubLimitAmount(input);
 	}
 
+	/**
+	 * 结算管理配置
+	 *
+	 * @param settleConfigDTO
+	 * @return
+	 */
+	@PostMapping("/save-settle-config")
+	public R<?> saveSettleConfig(@Valid @RequestBody SettleConfigDTO settleConfigDTO) {
+		for (SettleConfigDTO.DeptSub deptSub : settleConfigDTO.getSubList()) {
+			if (StrUtil.isBlank(deptSub.getSubjectType()) || deptSub.getLimitAmount() == null
+					|| ArrayUtil.isEmpty(deptSub.getSubjectInvoiceCategory())) {
+				return R.failed("必填参数为空");
+			}
+		}
+		DeptSubLimitAmountInput input = new DeptSubLimitAmountInput();
+		input.setDeptId(settleConfigDTO.getDeptId());
+		List<SysDeptSub> subList = new ArrayList<>();
+		settleConfigDTO.getSubList().forEach(deptSub -> {
+			SysDeptSub sysDeptSub =
+					BeanUtil.copyProperties(deptSub, SysDeptSub.class, "subjectInvoiceCategory");
+			sysDeptSub.setSubjectInvoiceCategory(String.join(StrUtil.COMMA, deptSub.getSubjectInvoiceCategory()));
+			subList.add(sysDeptSub);
+		});
+		input.setSubList(subList);
+		sysDeptSubService.saveSettleConfig(input);
+
+		return R.ok();
+	}
 
     /**
      * 分页查询

+ 17 - 0
hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/controller/SysDictController.java

@@ -19,6 +19,7 @@
 
 package com.qunzhixinxi.hnqz.admin.controller;
 
+import cn.hutool.core.util.StrUtil;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
@@ -96,6 +97,22 @@ public class SysDictController {
 		return R.ok(sysDictItemService.list(Wrappers.<SysDictItem>query().lambda().eq(SysDictItem::getType, type)));
 	}
 
+	/**
+	 * 通过字典类型模糊查找字典
+	 *
+	 * @param type 类型
+	 * @return 同类型字典
+	 */
+	@GetMapping("/like_type/{type}")
+	public R getDictByLikeType(@PathVariable String type, @RequestParam(required = false) String label) {
+		LambdaQueryWrapper<SysDictItem> wrapper = Wrappers.<SysDictItem>lambdaQuery().eq(SysDictItem::getType, type);
+		if (StrUtil.isNotEmpty(label)) {
+			wrapper.like(SysDictItem::getLabel, label);
+		}
+
+		return R.ok(sysDictItemService.list(wrapper));
+	}
+
 	/**
 	 * 添加字典
 	 * @param sysDict 字典信息

+ 64 - 0
hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/controller/SysUserController.java

@@ -20,6 +20,8 @@
 package com.qunzhixinxi.hnqz.admin.controller;
 
 import cn.hutool.core.collection.CollUtil;
+import cn.hutool.core.map.MapUtil;
+import cn.hutool.core.util.ArrayUtil;
 import cn.hutool.core.util.IdcardUtil;
 import cn.hutool.core.util.StrUtil;
 import cn.hutool.core.bean.BeanUtil;
@@ -41,14 +43,19 @@ import com.qunzhixinxi.hnqz.admin.api.entity.SysUserRole;
 import com.qunzhixinxi.hnqz.admin.api.vo.UserVO;
 import com.qunzhixinxi.hnqz.admin.config.UpmsConfig;
 import com.qunzhixinxi.hnqz.admin.entity.SysDeptSub;
+import com.qunzhixinxi.hnqz.admin.entity.SysUserSub;
 import com.qunzhixinxi.hnqz.admin.entity.dto.CommonUserDTO;
 import com.qunzhixinxi.hnqz.admin.entity.input.UserCertificationInput;
 import com.qunzhixinxi.hnqz.admin.entity.model.excel.CommonUserExcelModel;
+import com.qunzhixinxi.hnqz.admin.enums.GigTypeEnum;
+import com.qunzhixinxi.hnqz.admin.enums.RenlijiaCertStatus;
 import com.qunzhixinxi.hnqz.admin.enums.SubjectTypeEnum;
+import com.qunzhixinxi.hnqz.admin.enums.YeeCertStatus;
 import com.qunzhixinxi.hnqz.admin.mapper.*;
 import com.qunzhixinxi.hnqz.admin.service.SysDeptService;
 import com.qunzhixinxi.hnqz.admin.service.SysDeptSubService;
 import com.qunzhixinxi.hnqz.admin.service.SysUserService;
+import com.qunzhixinxi.hnqz.admin.service.SysUserSubService;
 import com.qunzhixinxi.hnqz.admin.service.WmDaAgentService;
 import com.qunzhixinxi.hnqz.admin.service.WmDaDrugEntService;
 import com.qunzhixinxi.hnqz.common.core.constant.CommonConstants;
@@ -97,6 +104,7 @@ public class SysUserController {
 	private final RedisTemplate redisTemplate;
 	private final SysUserRoleMapper sysUserRoleMapper;
 	private final QccService qccService;
+	private final SysUserSubService sysUserSubService;
 
 
 	private boolean isZbOrDbUsers(Integer[] roles) {
@@ -1455,6 +1463,62 @@ public class SysUserController {
 			});
 		}
 
+		userVosPage.getRecords().forEach(userVO -> {
+			// 查询所属企业渠道
+			SysDeptSub sysDeptSub = new SysDeptSub();
+			sysDeptSub.setDeptId(userVO.getDeptId());
+			sysDeptSub.setEnableFlag(SubjectTypeEnum.ENABLE_FLAG_TRUE.getCode());
+			List<SysDeptSub> subList = sysDeptSubService.list(Wrappers.query(sysDeptSub));
+			// 查询当前用户认证渠道
+			List<SysUserSub> userSubList = sysUserSubService.list(Wrappers.<SysUserSub>lambdaQuery()
+					.eq(SysUserSub::getUserId, userVO.getUserId()));
+
+			if (CollUtil.isNotEmpty(userSubList) && CollUtil.isNotEmpty(subList)) {
+				Map<GigTypeEnum, String> certStatusMap = userSubList.stream()
+						.collect(Collectors.toMap(SysUserSub::getGigType,
+								sysUserSub -> {
+									String certStatuName = "";
+									switch (sysUserSub.getGigType()) {
+										case TAX_HELPOR:
+											certStatuName = TaxHelperCertStatus.resolve(sysUserSub.getCertStatus()).getDesc();
+											break;
+										case YEE:
+											certStatuName = YeeCertStatus.resolve(String.valueOf(sysUserSub.getCertStatus())).getMessage();
+											break;
+										case REN_LI_JIA:
+											certStatuName = RenlijiaCertStatus.resolve(sysUserSub.getCertStatus()).getMessage();
+											break;
+										case OLADING:
+											certStatuName = YeeCertStatus.resolve(String.valueOf(sysUserSub.getCertStatus())).getMessage();
+											break;
+										default:
+											certStatuName = "";
+									}
+									return certStatuName;
+								}));
+				List<String> subTypeList = subList.stream().map(SysDeptSub::getSubjectType).collect(Collectors.toList());
+				List<String> certStatusNameList = new ArrayList<>();
+				if (subTypeList.contains(String.valueOf(GigTypeEnum.REN_LI_JIA.getCode()))) {
+					certStatusNameList.add(StrUtil.isBlank(certStatusMap.get(GigTypeEnum.REN_LI_JIA)) ?
+							RenlijiaCertStatus.CER_STATUS_4.getMessage() : certStatusMap.get(GigTypeEnum.REN_LI_JIA));
+				}
+				if (subTypeList.contains(String.valueOf(GigTypeEnum.TAX_HELPOR.getCode()))) {
+					certStatusNameList.add(StrUtil.isBlank(certStatusMap.get(GigTypeEnum.TAX_HELPOR)) ?
+							TaxHelperCertStatus.UN_CERT.getDesc() : certStatusMap.get(GigTypeEnum.TAX_HELPOR));
+				}
+				if (subTypeList.contains(String.valueOf(GigTypeEnum.YEE.getCode()))) {
+					certStatusNameList.add(StrUtil.isBlank(certStatusMap.get(GigTypeEnum.YEE)) ?
+							YeeCertStatus.UN_SIGNED.getMessage() : certStatusMap.get(GigTypeEnum.YEE));
+				}
+				if (subTypeList.contains(String.valueOf(GigTypeEnum.OLADING.getCode()))) {
+					certStatusNameList.add(StrUtil.isBlank(certStatusMap.get(GigTypeEnum.OLADING)) ?
+							YeeCertStatus.UN_SIGNED.getMessage() : certStatusMap.get(GigTypeEnum.OLADING));
+				}
+				userVO.setCertStatusArr(certStatusNameList.toArray(new String[0]));
+			}
+
+		});
+
 		return R.ok(userVosPage);
 	}
 

+ 216 - 0
hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/controller/SysUserSignCertController.java

@@ -0,0 +1,216 @@
+package com.qunzhixinxi.hnqz.admin.controller;
+
+import cn.hutool.core.collection.CollUtil;
+import cn.hutool.core.lang.Validator;
+import cn.hutool.core.util.StrUtil;
+import cn.hutool.json.JSONObject;
+import cn.hutool.json.JSONUtil;
+import com.qunzhixinxi.hnqz.admin.api.constant.CacheConstants;
+import com.qunzhixinxi.hnqz.admin.entity.SysUserSub;
+import com.qunzhixinxi.hnqz.admin.entity.dto.UserSignCertDTO;
+import com.qunzhixinxi.hnqz.admin.enums.GigTypeEnum;
+import com.qunzhixinxi.hnqz.admin.service.gig.SysUserSignCertService;
+import com.qunzhixinxi.hnqz.common.core.util.R;
+import com.qunzhixinxi.hnqz.common.log.annotation.SysLog;
+import lombok.AllArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.data.redis.core.RedisTemplate;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.List;
+
+/**
+ * 用户签约认证
+ *
+ * @author lixuesong
+ * @date 2022年03月03日 14:34
+ */
+@Slf4j
+@RestController
+@AllArgsConstructor
+@RequestMapping("/user-sign-cert")
+public class SysUserSignCertController {
+
+	private final SysUserSignCertService sysUserSignCertService;
+
+	private final RedisTemplate redisTemplate;
+
+	/**
+	 * 保存用户基础信息
+	 *
+	 * @param userSignCertDTO
+	 * @return
+	 */
+	@SysLog("保存用户基础信息")
+	@PostMapping("/save-base-info")
+	public R<?> saveBaseInfo(@RequestBody UserSignCertDTO userSignCertDTO) {
+		if (userSignCertDTO.getUserId() == null) {
+			return R.failed("userId不能为空");
+		}
+		if (CollUtil.isEmpty(userSignCertDTO.getGigTypeList())) {
+			return R.failed("认证渠道不能为空");
+		}
+		if (StrUtil.isBlank(userSignCertDTO.getBankPhone()) || !Validator.isMobile(userSignCertDTO.getBankPhone())) {
+			return R.failed("银行预留手机号不正确");
+		}
+		if (StrUtil.length(userSignCertDTO.getBankCardNumber()) < 16) {
+			return R.failed("银行卡号不正确");
+		}
+		if (StrUtil.isNotBlank(userSignCertDTO.getIdCardNumber()) && !Validator.isCitizenId(userSignCertDTO.getIdCardNumber())) {
+			return R.failed("身份证号不正确");
+		}
+		sysUserSignCertService.saveBaseInfo(userSignCertDTO);
+		return R.ok();
+	}
+
+	/**
+	 * 签协议
+	 *
+	 * @param userSignCertDTO
+	 * @return
+	 */
+	@SysLog("签协议")
+	@PostMapping("/sign-agreement")
+	public R<?> signAgreement(@RequestBody UserSignCertDTO userSignCertDTO) {
+		if (userSignCertDTO.getUserId() == null) {
+			return R.failed("userId不能为空");
+		}
+		if (CollUtil.isEmpty(userSignCertDTO.getGigTypeList())) {
+			return R.failed("认证渠道不能为空");
+		}
+		if (!userSignCertDTO.getGigTypeList().contains(GigTypeEnum.REN_LI_JIA) && StrUtil.isBlank(userSignCertDTO.getAgreementUrl())) {
+			// 除人力家外,其他都做校验
+			return R.failed("协议不能为空");
+		}
+		List<SysUserSub> userSubList = sysUserSignCertService.listUserSignCert(userSignCertDTO.getUserId(), userSignCertDTO.getGigTypeList());
+		if (CollUtil.isEmpty(userSubList)) {
+			return R.failed("数据异常");
+		}
+		sysUserSignCertService.signAgreement(userSignCertDTO);
+
+		return R.ok();
+	}
+
+	/**
+	 * 人身验证
+	 *
+	 * @param userSignCertDTO
+	 * @return
+	 */
+	@SysLog("人身验证")
+	@PostMapping("/personal-identity-verification")
+	public R<?> personalIdentityVerification(@RequestBody UserSignCertDTO userSignCertDTO) {
+		if (userSignCertDTO.getUserId() == null) {
+			return R.failed("userId不能为空");
+		}
+		if (!StrUtil.isAllNotBlank(userSignCertDTO.getIdCardFrontUrl(), userSignCertDTO.getIdCardBackUrl(),
+				userSignCertDTO.getCertVideo1Url(), userSignCertDTO.getCertVideo2Url())) {
+			return R.failed("身份证或视频信息不能为空");
+		}
+		if (CollUtil.isEmpty(userSignCertDTO.getGigTypeList())) {
+			return R.failed("认证渠道不能为空");
+		}
+		List<SysUserSub> userSubList = sysUserSignCertService.listUserSignCert(userSignCertDTO.getUserId(), userSignCertDTO.getGigTypeList());
+		if (CollUtil.isEmpty(userSubList)) {
+			return R.failed("数据异常");
+		}
+		sysUserSignCertService.personalIdentityVerification(userSignCertDTO);
+
+		return R.ok();
+	}
+
+	/**
+	 * 批量发起用户签约认证
+	 *
+	 * @param userSignCertDTO
+	 * @return R
+	 */
+	@SysLog("用户签约认证")
+	@PostMapping("/batch-channel-cert")
+	public R<?> batchChannelCert(@RequestBody UserSignCertDTO userSignCertDTO) {
+		if (userSignCertDTO.getUserId() == null) {
+			return R.failed("userId不能为空");
+		}
+		if (CollUtil.isEmpty(userSignCertDTO.getGigTypeList())) {
+			return R.failed("认证渠道不能为空");
+		}
+		List<SysUserSub> userSubList = sysUserSignCertService.listUserSignCert(userSignCertDTO.getUserId(), userSignCertDTO.getGigTypeList());
+		if (CollUtil.isEmpty(userSubList)) {
+			return R.failed("数据异常");
+		}
+		for (SysUserSub userSub : userSubList) {
+			if (!userSignCertDTO.getGigTypeList().contains(GigTypeEnum.REN_LI_JIA) && StrUtil.isBlank(userSub.getAgreementUrl())) {
+				return R.failed("协议不能为空");
+			}
+			if (!StrUtil.isAllNotBlank(userSub.getIdCardBackUrl(), userSub.getIdCardFrontUrl(),
+					userSub.getCertVideo1Url(), userSub.getCertVideo2Url())) {
+				return R.failed("身份证或视频信息不能为空");
+			}
+		}
+		sysUserSignCertService.batchChannelCert(userSignCertDTO);
+
+		return R.ok();
+	}
+
+	/**
+	 * 税邦云发送绑卡验证码
+	 *
+	 * @param userSignCertDTO
+	 * @return
+	 */
+	@SysLog("税邦云发送绑卡验证码")
+	@PostMapping("/bind-card-verification")
+	public R<?> bindCardVerification(@RequestBody UserSignCertDTO userSignCertDTO) {
+		if (userSignCertDTO.getUserId() == null) {
+			return R.failed("userId不能为空");
+		}
+		if (StrUtil.isBlank(userSignCertDTO.getBankPhone())) {
+			return R.failed("银行预留手机号不能为空");
+		}
+		sysUserSignCertService.bindCardVerification(userSignCertDTO);
+
+		return R.ok();
+	}
+
+	/**
+	 * 税邦云绑卡确认
+	 *
+	 * @param userSignCertDTO
+	 * @return
+	 */
+	@SysLog("税邦云绑卡确认")
+	@PostMapping("/bind-card-confirm")
+	public R<?> bindCardConfirm(@RequestBody UserSignCertDTO userSignCertDTO) {
+		if (userSignCertDTO.getUserId() == null) {
+			return R.failed("userId不能为空");
+		}
+		if (CollUtil.isEmpty(userSignCertDTO.getGigTypeList())) {
+			return R.failed("认证渠道不能为空");
+		}
+		sysUserSignCertService.bindCardConfirm(userSignCertDTO);
+
+		return R.ok();
+	}
+
+	/**
+	 * 查询签约认证结果
+	 *
+	 * @param userId
+	 * @return
+	 */
+	@GetMapping("/sign-cert-result/{userId}")
+	public R<?> getSignCertResult(@PathVariable("userId") Integer userId) {
+		String key = CacheConstants.USER_SIGN_CERT_RESPONSE_KEY + userId;
+		String response = (String) redisTemplate.opsForValue().get(key);
+		if (response == null) {
+			return R.failed("没有结果");
+		}
+		JSONObject jsonResult = JSONUtil.parseObj(response, true);
+		return R.ok(jsonResult);
+	}
+}

+ 56 - 0
hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/entity/OladingInputRecord.java

@@ -0,0 +1,56 @@
+package com.qunzhixinxi.hnqz.admin.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.extension.activerecord.Model;
+import lombok.Data;
+
+import java.time.LocalDateTime;
+
+/**
+ * 自由职家请求记录实体
+ *
+ * @author lixuesong
+ * @date 2022年04月18日 15:33
+ */
+@Data
+public class OladingInputRecord extends Model<OladingInputRecord> {
+
+	private static final long serialVersionUID = 8128442024567142412L;
+
+	/**
+	 * 主键id
+	 */
+	@TableId(type = IdType.AUTO)
+	private Integer id;
+
+	/**
+	 * 请求流水号
+	 */
+	private String requestId;
+
+	/**
+	 * 请求接口名称
+	 */
+	private String interfaceName;
+
+	/**
+	 * 请求body内容
+	 */
+	private String reqBody;
+
+	/**
+	 * 请求公钥
+	 */
+	private String publicKey;
+
+	/**
+	 * 请求时私钥
+	 */
+	private String privateKey;
+
+	/**
+	 * 创建时间
+	 */
+	private LocalDateTime createTime;
+}

+ 131 - 0
hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/entity/SysUserSub.java

@@ -0,0 +1,131 @@
+package com.qunzhixinxi.hnqz.admin.entity;
+
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.baomidou.mybatisplus.extension.activerecord.Model;
+import com.qunzhixinxi.hnqz.admin.enums.GigCallBackStatus;
+import com.qunzhixinxi.hnqz.admin.enums.GigChannelEnum;
+import com.qunzhixinxi.hnqz.admin.enums.GigTypeEnum;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.time.LocalDateTime;
+
+/**
+ * 用户签约认证主体信息实体
+ *
+ * @author lixuesong
+ * @date 2022年03月01日 18:17
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@TableName("sys_user_sub")
+public class SysUserSub extends Model<SysUserSub> {
+
+	/**
+	 * 主键id
+	 */
+	@TableId
+	private Integer id;
+
+	/**
+	 * 用户id
+	 */
+	private Integer userId;
+
+	/**
+	 * 部门id
+	 */
+	private Integer deptId;
+
+	/**
+	 * 零工平台类型(订单支付方式类型)
+	 */
+	private GigTypeEnum gigType;
+
+	/**
+	 * 渠道
+	 */
+	private GigChannelEnum gigChannel;
+
+	/**
+	 * 回调状态
+	 */
+	private GigCallBackStatus callbackStatus;
+
+	/**
+	 * 认证状态
+	 */
+	private Integer certStatus;
+
+	/**
+	 * 认证结果描述
+	 */
+	private String certRemark;
+
+	/**
+	 * 人员类型
+	 */
+	private String userType;
+
+	/**
+	 * 银行预留手机号
+	 */
+	private String bankPhone;
+
+	/**
+	 * 银行卡号
+	 */
+	private String bankCardNumber;
+
+	/**
+	 * 身份证照片-正面
+	 */
+	private String idCardFrontUrl;
+
+	/**
+	 * 身份证照片-反面
+	 */
+	private String idCardBackUrl;
+
+	/**
+	 * 认证视频1
+	 */
+	private String certVideo1Url;
+
+	/**
+	 * 认证视频2
+	 */
+	private String certVideo2Url;
+
+	/**
+	 * 协议
+	 */
+	private String agreementUrl;
+
+	/**
+	 * 请求流水号
+	 */
+	private String requestId;
+
+	/**
+	 * 创建时间
+	 */
+	private LocalDateTime createTime;
+
+	/**
+	 * 更新时间
+	 */
+	private LocalDateTime updateTime;
+
+	/**
+	 * 创建人
+	 */
+	private Integer createUser;
+
+	/**
+	 * 更新人
+	 */
+	private Integer updateUser;
+
+}

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

@@ -0,0 +1,69 @@
+package com.qunzhixinxi.hnqz.admin.entity.dto;
+
+import lombok.Data;
+
+import javax.validation.constraints.NotEmpty;
+import javax.validation.constraints.NotNull;
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.util.List;
+
+/**
+ * 结算管理配置参数
+ *
+ * @author lixuesong
+ */
+@Data
+public class SettleConfigDTO implements Serializable {
+
+	private static final long serialVersionUID = 6592319640299289406L;
+
+	/**
+	 * 部门id
+	 */
+	@NotNull(message = "deptId必填")
+	private Integer deptId;
+
+	/**
+	 * 各渠道配置
+	 */
+	@NotEmpty(message = "subList必填")
+	private List<DeptSub> subList;
+
+	/**
+	 * 渠道配置
+	 */
+	@Data
+	public static class DeptSub {
+
+		/**
+		 * 认证方式
+		 */
+		private String subjectType;
+
+		/**
+		 * 结算通道
+		 */
+		private Integer subjectChannel;
+
+		/**
+		 * 限额
+		 */
+		private BigDecimal limitAmount;
+
+		/**
+		 * 是否有效:0-无效 1-生效
+		 */
+		private String enableFlag;
+
+		/**
+		 * 税邦云用户类型id
+		 */
+		private String subjectUserType;
+
+		/**
+		 * 税邦云用户类型对应的发票类目
+		 */
+		private String[] subjectInvoiceCategory;
+	}
+}

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

@@ -0,0 +1,74 @@
+package com.qunzhixinxi.hnqz.admin.entity.dto;
+
+import com.qunzhixinxi.hnqz.admin.enums.GigTypeEnum;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ * 用户签约认证DTO
+ *
+ * @author lixuesong
+ * @date 2022年03月03日 15:28
+ */
+@Data
+public class UserSignCertDTO implements Serializable {
+
+	private static final long serialVersionUID = 5494145502730380527L;
+
+	/**
+	 * 用户id
+	 */
+	private Integer userId;
+
+	/**
+	 * 身份证号
+	 */
+	private String idCardNumber;
+
+	/**
+	 * 银行卡号
+	 */
+	private String bankCardNumber;
+
+	/**
+	 * 银行预留手机号
+	 */
+	private String bankPhone;
+
+	/**
+	 * 身份证照片-正面
+	 */
+	private String idCardFrontUrl;
+
+	/**
+	 * 身份证照片-反面
+	 */
+	private String idCardBackUrl;
+
+	/**
+	 * 认证视频1
+	 */
+	private String certVideo1Url;
+
+	/**
+	 * 认证视频2
+	 */
+	private String certVideo2Url;
+
+	/**
+	 * 协议
+	 */
+	private String agreementUrl;
+
+	/**
+	 * 零工认证渠道
+	 */
+	private List<GigTypeEnum> gigTypeList;
+
+	/**
+	 * 验证码
+	 */
+	private String verifyCode;
+}

+ 49 - 0
hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/entity/model/GigBaseInfoModel.java

@@ -0,0 +1,49 @@
+package com.qunzhixinxi.hnqz.admin.entity.model;
+
+import com.qunzhixinxi.hnqz.admin.enums.GigChannelEnum;
+import com.qunzhixinxi.hnqz.admin.enums.GigTypeEnum;
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * gig基本信息
+ *
+ * @author lixuesong
+ * @date 2022年03月03日 14:26
+ */
+@Data
+public class GigBaseInfoModel implements Serializable {
+
+	private static final long serialVersionUID = 1350706535215124015L;
+
+	/**
+	 * 零工平台类型
+	 */
+	private GigTypeEnum gigType;
+
+	/**
+	 * 渠道
+	 */
+	private GigChannelEnum gigChannel;
+
+	/**
+	 * 绑卡操作类型(captcha-获取验证码)
+	 */
+	private String bankCardOpt;
+
+	/**
+	 * 验证码
+	 */
+	private String captcha;
+
+	/**
+	 * 通知url
+	 */
+	private String notifyUrl;
+
+	/**
+	 * 请求流水号
+	 */
+	private String requestId;
+}

+ 27 - 0
hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/entity/model/GigInfoModel.java

@@ -0,0 +1,27 @@
+package com.qunzhixinxi.hnqz.admin.entity.model;
+
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * gig信息
+ *
+ * @author lixuesong
+ * @date 2022年03月03日 14:25
+ */
+@Data
+public class GigInfoModel implements Serializable {
+
+	private static final long serialVersionUID = -4552388586774856952L;
+
+	/**
+	 * gig基本信息
+	 */
+	GigBaseInfoModel baseInfo;
+
+	/**
+	 * 用户信息
+	 */
+	GigUserInfoModel userInfo;
+}

+ 115 - 0
hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/entity/model/GigUserInfoModel.java

@@ -0,0 +1,115 @@
+package com.qunzhixinxi.hnqz.admin.entity.model;
+
+import com.qunzhixinxi.hnqz.admin.enums.MemberIDCardType;
+import com.qunzhixinxi.hnqz.admin.enums.MemberType;
+import com.qunzhixinxi.hnqz.admin.enums.PayChannel;
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * 用户信息
+ *
+ * @author lixuesong
+ * @date 2022年03月03日 14:27
+ */
+@Data
+public class GigUserInfoModel implements Serializable {
+
+	private static final long serialVersionUID = 1418999433019620755L;
+
+	/**
+	 * 用户id
+	 */
+	private Integer userId;
+
+	/**
+	 * 姓名
+	 */
+	private String name;
+
+	/**
+	 * 税号
+	 */
+	private String entCode;
+
+	/**
+	 * 手机号
+	 */
+	private String username;
+
+	/**
+	 * 身份证号
+	 */
+	private String idCard;
+
+	/**
+	 * 部门id
+	 */
+	private Integer deptId;
+
+	/**
+	 * 证件类型
+	 */
+	private MemberIDCardType idCardType;
+
+	/**
+	 * 人员类型与行业
+	 */
+	private MemberType memberType;
+
+	/**
+	 * 支付渠道
+	 */
+	private PayChannel payChannel;
+
+	/**
+	 * 银行预留手机号
+	 */
+	private String bankPhone;
+
+	/**
+	 * 银行卡号
+	 */
+	private String bankCard;
+
+	/**
+	 * 银行卡号
+	 */
+	private String newBankCard;
+
+	/**
+	 * 身份证照片-正面
+	 */
+	private String idCardFront;
+
+	/**
+	 * 身份证照片-反面
+	 */
+	private String idCardBack;
+
+	/**
+	 * 认证视频1
+	 */
+	private String certVideo1;
+
+	/**
+	 * 认证视频2
+	 */
+	private String certVideo2;
+
+	/**
+	 * 协议签名
+	 */
+	private String signImageUrl;
+
+	/**
+	 * 邮箱
+	 */
+	private String email;
+
+	/**
+	 * 地址
+	 */
+	private String address;
+}

+ 119 - 0
hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/entity/vo/SysUserSubVO.java

@@ -0,0 +1,119 @@
+package com.qunzhixinxi.hnqz.admin.entity.vo;
+
+import com.qunzhixinxi.hnqz.admin.enums.GigCallBackStatus;
+import com.qunzhixinxi.hnqz.admin.enums.GigChannelEnum;
+import com.qunzhixinxi.hnqz.admin.enums.GigTypeEnum;
+import lombok.Data;
+
+import java.time.LocalDateTime;
+
+/**
+ * 用户签约认证主体信息实体
+ *
+ * @author lixuesong
+ * @date 2022年03月01日 18:17
+ */
+@Data
+public class SysUserSubVO {
+
+	/**
+	 * 主键id
+	 */
+	private Integer id;
+
+	/**
+	 * 用户id
+	 */
+	private Integer userId;
+
+	/**
+	 * 部门id
+	 */
+	private Integer deptId;
+
+	/**
+	 * 零工平台类型(订单支付方式类型)
+	 */
+	private GigTypeEnum gigType;
+
+	/**
+	 * 渠道
+	 */
+	private GigChannelEnum gigChannel;
+
+	/**
+	 * 回调状态
+	 */
+	private GigCallBackStatus callbackStatus;
+
+	/**
+	 * 认证状态
+	 */
+	private String certStatus;
+
+	/**
+	 * 认证结果描述
+	 */
+	private String certRemark;
+
+	/**
+	 * 人员类型
+	 */
+	private String userType;
+
+	/**
+	 * 银行预留手机号
+	 */
+	private String bankPhone;
+
+	/**
+	 * 银行卡号
+	 */
+	private String bankCardNumber;
+
+	/**
+	 * 身份证照片-正面
+	 */
+	private String idCardFrontUrl;
+
+	/**
+	 * 身份证照片-反面
+	 */
+	private String idCardBackUrl;
+
+	/**
+	 * 认证视频1
+	 */
+	private String certVideo1Url;
+
+	/**
+	 * 认证视频2
+	 */
+	private String certVideo2Url;
+
+	/**
+	 * 协议
+	 */
+	private String agreementUrl;
+
+	/**
+	 * 创建时间
+	 */
+	private LocalDateTime createTime;
+
+	/**
+	 * 更新时间
+	 */
+	private LocalDateTime updateTime;
+
+	/**
+	 * 创建人
+	 */
+	private Integer createUser;
+
+	/**
+	 * 更新人
+	 */
+	private Integer updateUser;
+
+}

+ 28 - 0
hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/enums/GigCallBackStatus.java

@@ -0,0 +1,28 @@
+package com.qunzhixinxi.hnqz.admin.enums;
+
+import com.baomidou.mybatisplus.annotation.EnumValue;
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+/**
+ * 回调状态enum
+ *
+ * @author lixuesong
+ * @date 2022年03月18日 17:44
+ */
+@Getter
+@AllArgsConstructor
+public enum GigCallBackStatus {
+
+	// 回调状态
+	RETURNED(0, "已返回"),
+	IN_PROGRESS(1, "进行中"),
+	NOT_SUBMIT(2, "未发起");
+
+	@EnumValue
+	private int code;
+
+	private String desc;
+
+
+}

+ 41 - 0
hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/enums/GigChannelEnum.java

@@ -0,0 +1,41 @@
+package com.qunzhixinxi.hnqz.admin.enums;
+
+import com.baomidou.mybatisplus.annotation.EnumValue;
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+/**
+ * 零工渠道(如税邦云的中金、平安银行)
+ *
+ * @author lixuesong
+ * @date 2022年03月03日 14:06
+ */
+@Getter
+@AllArgsConstructor
+public enum GigChannelEnum {
+
+	// 渠道
+	DEFAULT(0, "默认渠道"),
+	CICC(1, "中金"),
+	PINGAN(2, "平安银行");
+
+	@EnumValue
+	private int code;
+
+	private String desc;
+
+	/**
+	 * 根据枚举编码获取枚举对象
+	 *
+	 * @param code
+	 * @return
+	 */
+	public static GigChannelEnum resolve(int code){
+		for (GigChannelEnum channelEnum: GigChannelEnum.values()){
+			if (channelEnum.code == code){
+				return channelEnum;
+			}
+		}
+		return DEFAULT;
+	}
+}

+ 28 - 0
hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/enums/GigTypeEnum.java

@@ -0,0 +1,28 @@
+package com.qunzhixinxi.hnqz.admin.enums;
+
+import com.baomidou.mybatisplus.annotation.EnumValue;
+import com.fasterxml.jackson.annotation.JsonValue;
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+/**
+ * 零工平台类型(订单支付方式类型)
+ *
+ * @author lixuesong
+ * @date 2022年03月02日 11:10
+ */
+@Getter
+@AllArgsConstructor
+public enum GigTypeEnum {
+
+	// 零工平台类型
+	REN_LI_JIA(0, "人力家"),
+	TAX_HELPOR(1, "税邦云"),
+	OLADING(2, "自由职家"),
+	YEE(3, "易联数科");
+
+	@EnumValue
+	private int code;
+
+	private String desc;
+}

+ 25 - 0
hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/enums/IndustryType.java

@@ -0,0 +1,25 @@
+package com.qunzhixinxi.hnqz.admin.enums;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+@Getter
+@AllArgsConstructor
+public enum IndustryType {
+
+    NOT_STATEMENT_PROFESSIONAL_DESIGN_SERVICE("7499","其他未列明专业技术服务业"),
+    APPLICATION_SOFTWARE_DEVELOPMENT("6513","应用软件开发"),
+    PROFESSIONAL_DESIGN_SERVICE("7492","专业设计服务"),
+    ARTISTIC_CREATION_AND_PERFORMANCE("8810","文艺创作与表演"),
+    CULTURAL_EXHIBITION_SERVICE("7284","文化会展服务"),
+    SOCIO_ECONOMIC_CONSULTATION("7243","社会经济咨询"),
+    TRAVEL_AGENCY_AND_RELATED_SERVICE("7291","旅行社及相关服务"),
+    HOME_SERVICE("8010","家庭服务"),
+    BUSINESS_AGENT_SERVICE("7297","商务代理代办服务"),
+    HEALTH_ADVICE("7244","健康咨询"),
+    NOT_STATEMENT_EDUCATION("8399","其他未列明教育");
+
+    private final String code;
+
+    private final String message;
+}

+ 16 - 0
hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/enums/MemberIDCardType.java

@@ -0,0 +1,16 @@
+package com.qunzhixinxi.hnqz.admin.enums;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+@Getter
+@AllArgsConstructor
+public enum MemberIDCardType {
+
+    ID_CARD(1, "身份证");
+
+    private final int code;
+
+    private final String message;
+
+}

+ 39 - 0
hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/enums/MemberType.java

@@ -0,0 +1,39 @@
+package com.qunzhixinxi.hnqz.admin.enums;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+/**
+ * {@code MemberType}
+ * <p>
+ * 人员类型与行业
+ *
+ * @author Hengchen.Sun
+ * @version 1.0.0
+ * @date 2022/02/19 22:01
+ */
+@Getter
+@AllArgsConstructor
+public enum MemberType {
+
+    PROFESSIONAL_AND_TECHNICAL_PERSONNEL("2", "专业技术人员", IndustryType.NOT_STATEMENT_PROFESSIONAL_DESIGN_SERVICE),
+    IT_RESEARCH_AND_DEVELOPMENT_PERSONNEL("3", "IT研发人员", IndustryType.APPLICATION_SOFTWARE_DEVELOPMENT),
+    PROFESSIONAL_DESIGNER("4", "专业设计人员", IndustryType.PROFESSIONAL_DESIGN_SERVICE),
+    NEW_MEDIA_PRODUCER("5", "新媒体制作人", IndustryType.ARTISTIC_CREATION_AND_PERFORMANCE),
+    EXHIBITION_SERVICE_STAFF("6", "会展服务人员", IndustryType.CULTURAL_EXHIBITION_SERVICE),
+    ONLINE_ANCHOR("7", "网络主播", IndustryType.ARTISTIC_CREATION_AND_PERFORMANCE),
+    CONTENT_CREATOR("8", "内容创作者", IndustryType.ARTISTIC_CREATION_AND_PERFORMANCE),
+    ONLINE_LECTURER("9", "网课讲师", IndustryType.SOCIO_ECONOMIC_CONSULTATION),
+    TRAVEL_SERVICE_PERSONNEL("10", "旅游地接人员", IndustryType.TRAVEL_AGENCY_AND_RELATED_SERVICE),
+    HOME_SERVICE_WORKER("11", "家庭服务人员", IndustryType.HOME_SERVICE),
+    HEALTH_CONSULTANT("12", "健康咨询师", IndustryType.HEALTH_ADVICE),
+    MARKETING_AND_PROMOTION_PERSONNEL("16", "营销推广人员", IndustryType.BUSINESS_AGENT_SERVICE),
+    EXTERNAL_ONLINE_LECTURER("17", "网课讲师(对外)", IndustryType.NOT_STATEMENT_EDUCATION),
+    YAOYI_EXCLUSIVE_PERSONNEL("20", "要易专属人员", null);
+
+    private final String code;
+
+    private final String message;
+
+    private final IndustryType industryType;
+}

+ 46 - 0
hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/enums/OladingCertStatus.java

@@ -0,0 +1,46 @@
+package com.qunzhixinxi.hnqz.admin.enums;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+/**
+ * {@code CertStatus}
+ * <p>
+ * 易联数科签约状态枚举
+ *
+ * @author Hengchen.Sun
+ * @author lixuesong
+ * @version 1.0.0
+ * @date 2022/03/09 22:21
+ */
+@Getter
+@AllArgsConstructor
+public enum OladingCertStatus {
+
+	// 签约状态
+    UN_SIGNED("0", "未签约"),
+	CERT("1", "已认证"),
+    SIGNED("2", "已签约"),
+	SIGNING("3", "签约中"),
+	UN_CERT("4", "未认证");
+
+    private final String code;
+
+    private final String message;
+
+    /**
+     * 根据枚举编码获取枚举对象
+     *
+     * @param code 枚举编码
+     * @return 如果存在返回枚举,否则返回 {@code null}
+     */
+    public static OladingCertStatus resolve(final String code) {
+        for (OladingCertStatus oladingCertStatus : OladingCertStatus.values()) {
+            if (oladingCertStatus.getCode().equals(code)) {
+                return oladingCertStatus;
+            }
+        }
+        return UN_SIGNED;
+
+    }
+}

+ 15 - 0
hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/enums/PayChannel.java

@@ -0,0 +1,15 @@
+package com.qunzhixinxi.hnqz.admin.enums;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+@Getter
+@AllArgsConstructor
+public enum PayChannel {
+
+    BANK_CARD(1, "银行卡");
+
+    private final int code;
+
+    private final String message;
+}

+ 41 - 0
hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/enums/RenlijiaCertStatus.java

@@ -0,0 +1,41 @@
+package com.qunzhixinxi.hnqz.admin.enums;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+/**
+ * 人力家认证状态
+ *
+ * @author lixuesong
+ * @date 2022年03月11日 10:52
+ */
+@Getter
+@AllArgsConstructor
+public enum RenlijiaCertStatus {
+
+	// 认证状态
+	CER_STATUS_1(1, "认证成功"),
+	CER_STATUS_2(2, "认证失败"),
+	CER_STATUS_3(3, "认证中"),
+	CER_STATUS_4(4, "未认证");
+
+	private final int code;
+
+	private final String message;
+
+	/**
+	 * 根据枚举编码获取枚举对象
+	 *
+	 * @param code 枚举编码
+	 * @return 如果存在返回枚举,否则返回 {@code null}
+	 */
+	public static RenlijiaCertStatus resolve(final int code) {
+		for (RenlijiaCertStatus certStatus : RenlijiaCertStatus.values()) {
+			if (certStatus.getCode() == code) {
+				return certStatus;
+			}
+		}
+		return CER_STATUS_4;
+
+	}
+}

+ 42 - 0
hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/enums/YeeCertStatus.java

@@ -0,0 +1,42 @@
+package com.qunzhixinxi.hnqz.admin.enums;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+/**
+ * {@code CertStatus}
+ * <p>
+ * 易联数科签约状态枚举
+ *
+ * @author Hengchen.Sun
+ * @version 1.0.0
+ * @date 2022/03/09 22:21
+ */
+@Getter
+@AllArgsConstructor
+public enum YeeCertStatus {
+
+    UN_SIGNED("0", "未签约"),
+    SIGNED("1", "已签约"),
+    TERMINATED("2", "已解约");
+
+    private final String code;
+
+    private final String message;
+
+    /**
+     * 根据枚举编码获取枚举对象
+     *
+     * @param code 枚举编码
+     * @return 如果存在返回枚举,否则返回 {@code null}
+     */
+    public static YeeCertStatus resolve(final String code) {
+        for (YeeCertStatus yeeCertStatus : YeeCertStatus.values()) {
+            if (yeeCertStatus.getCode().equals(code)) {
+                return yeeCertStatus;
+            }
+        }
+        return UN_SIGNED;
+
+    }
+}

+ 15 - 0
hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/mapper/OladingInputRecordMapper.java

@@ -0,0 +1,15 @@
+package com.qunzhixinxi.hnqz.admin.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.qunzhixinxi.hnqz.admin.entity.OladingInputRecord;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * 自由职家请求记录Mapper
+ *
+ * @author lixuesong
+ * @date 2022年04月18日 15:40
+ */
+@Mapper
+public interface OladingInputRecordMapper extends BaseMapper<OladingInputRecord> {
+}

+ 15 - 0
hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/mapper/SysUserSubMapper.java

@@ -0,0 +1,15 @@
+package com.qunzhixinxi.hnqz.admin.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.qunzhixinxi.hnqz.admin.entity.SysUserSub;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * 用户签约认证主体信息Mapper
+ *
+ * @author lixuesong
+ * @date 2022年03月01日 18:46
+ */
+@Mapper
+public interface SysUserSubMapper extends BaseMapper<SysUserSub> {
+}

+ 247 - 0
hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/mq/GigSignCertReceiver.java

@@ -0,0 +1,247 @@
+package com.qunzhixinxi.hnqz.admin.mq;
+
+import cn.hutool.core.collection.CollUtil;
+import cn.hutool.core.map.MapUtil;
+import cn.hutool.core.util.StrUtil;
+import cn.hutool.json.JSONObject;
+import cn.hutool.json.JSONUtil;
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.qunzhixinxi.hnqz.admin.api.constant.CacheConstants;
+import com.qunzhixinxi.hnqz.admin.api.constant.MqConstants;
+import com.qunzhixinxi.hnqz.admin.api.entity.SysDept;
+import com.qunzhixinxi.hnqz.admin.api.entity.SysUser;
+import com.qunzhixinxi.hnqz.admin.entity.SysUserSub;
+import com.qunzhixinxi.hnqz.admin.entity.dto.UserSignCertDTO;
+import com.qunzhixinxi.hnqz.admin.enums.DelEnum;
+import com.qunzhixinxi.hnqz.admin.enums.GigCallBackStatus;
+import com.qunzhixinxi.hnqz.admin.enums.GigTypeEnum;
+import com.qunzhixinxi.hnqz.admin.enums.LockEnum;
+import com.qunzhixinxi.hnqz.admin.enums.YeeCertStatus;
+import com.qunzhixinxi.hnqz.admin.service.SysDeptService;
+import com.qunzhixinxi.hnqz.admin.service.SysUserService;
+import com.qunzhixinxi.hnqz.admin.service.SysUserSubService;
+import com.qunzhixinxi.hnqz.common.rabbitmq.annotation.RabbitMqComponent;
+import com.qunzhixinxi.hnqz.common.rabbitmq.core.BaseRabbiMqHandler;
+import com.qunzhixinxi.hnqz.common.rabbitmq.listenter.MqListener;
+import com.qunzhixinxi.hnqz.common.taxhelper.enums.TaxHelperCertStatus;
+import com.rabbitmq.client.Channel;
+import lombok.AllArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.amqp.rabbit.annotation.RabbitHandler;
+import org.springframework.amqp.rabbit.annotation.RabbitListener;
+import org.springframework.amqp.support.AmqpHeaders;
+import org.springframework.data.redis.core.RedisTemplate;
+import org.springframework.messaging.handler.annotation.Header;
+
+import java.time.LocalDateTime;
+import java.util.List;
+import java.util.Map;
+import java.util.concurrent.TimeUnit;
+
+/**
+ * 接收用户签约认证的结果对列监听器
+ */
+@Slf4j
+@AllArgsConstructor
+@RabbitListener(queues = MqConstants.DIRECT_MODE_GIG_SIGN_CERT_RES_QUEUE)
+@RabbitMqComponent(value = "gigSignCertReceiver")
+public class GigSignCertReceiver extends BaseRabbiMqHandler<String> {
+
+	private final SysDeptService sysDeptService;
+
+	private final SysUserService sysUserService;
+
+	private final SysUserSubService sysUserSubService;
+
+	private final RedisTemplate redisTemplate;
+
+	/**
+	 * 税邦云成功code
+	 */
+	private static final String TAXHELPER_SUCCESS_CODE = "2000";
+
+	/**
+	 * 易联成功code
+	 */
+	private static final String YEE_SUCCESS_CODE = "200";
+
+    @RabbitHandler
+    public void onMessage(String jsonStr, Channel channel, @Header(AmqpHeaders.DELIVERY_TAG) long deliveryTag) {
+        super.onMessageAck(jsonStr, deliveryTag, channel, (MqListener<String>) (String result, Channel channel1) -> {
+
+			log.info("直接队列:接收用户签约认证的结果,手动ACK,接收消息TAG:{},消息内容:{}", deliveryTag, result);
+
+			Map<String, String> resMap = MapUtil.newHashMap(2);
+
+			JSONObject jsonResult = JSONUtil.parseObj(result);
+			String username = jsonResult.getStr("username");
+			String entpriseCode = jsonResult.getStr("enterpriseCode");
+			JSONObject subjectTypes = jsonResult.getJSONObject("subjectTypes");
+
+			if (StrUtil.isBlank(username) || StrUtil.isBlank(entpriseCode) || subjectTypes.isEmpty()) {
+				log.error("必传参数空!");
+				resMap.put("key", String.format("%s_%s_%s", CacheConstants.USER_SIGN_CERT_RESPONSE_MQ_KEY, username, entpriseCode));
+				resMap.put("res", JSONUtil.toJsonStr(subjectTypes));
+				return resMap;
+			}
+				// 加redis锁 TODO
+//				redisTemplate.opsForValue().setIfAbsent()
+
+			List<SysDept> deptList = sysDeptService.list(Wrappers.<SysDept>lambdaQuery()
+					.eq(SysDept::getTaxCode, entpriseCode)
+					.eq(SysDept::getDelFlag, DelEnum.NOT_DEL.val())
+					.orderByDesc(SysDept::getCreateTime));
+			if (CollUtil.isNotEmpty(deptList)) {
+				SysDept dept = deptList.get(0);
+				SysUser user = sysUserService.getOne(Wrappers.<SysUser>lambdaQuery()
+						.eq(SysUser::getDeptId, dept.getDeptId())
+						.eq(SysUser::getUsername, username)
+						.eq(SysUser::getDelFlag, DelEnum.NOT_DEL.val())
+						.eq(SysUser::getLockFlag, LockEnum.UN_LOCK.val()));
+				if (user == null) {
+					log.error("用户不存在!");
+					return null;
+				}
+				// 根据不同渠道,更新对应的签约认证状态
+				subjectTypes.forEach((s, o) -> {
+					GigTypeEnum gigTypeEnum = Enum.valueOf(GigTypeEnum.class, s);
+					JSONObject subjectResult = (JSONObject) o;
+
+					switch (gigTypeEnum) {
+						case TAX_HELPOR:
+							taxHelperHandler(user, dept, subjectResult);
+							// 本次结果存入redis
+							redisTemplate.opsForValue().set(CacheConstants.USER_SIGN_CERT_RESPONSE_KEY + user.getUserId(),
+									JSONUtil.toJsonStr(subjectTypes), 1, TimeUnit.MINUTES);
+							break;
+						case REN_LI_JIA:
+							// TODO
+							// 本次结果存入redis
+							redisTemplate.opsForValue().set(CacheConstants.USER_SIGN_CERT_RESPONSE_KEY + user.getUserId(),
+									JSONUtil.toJsonStr(subjectTypes), 1, TimeUnit.MINUTES);
+							break;
+						case OLADING:
+							oladingHandler(user, dept, subjectResult);
+							break;
+						case YEE:
+							yeeHandler(user, dept, subjectResult);
+							// 本次结果存入redis
+							redisTemplate.opsForValue().set(CacheConstants.USER_SIGN_CERT_RESPONSE_KEY + user.getUserId(),
+									JSONUtil.toJsonStr(subjectTypes), 1, TimeUnit.MINUTES);
+							break;
+						default:
+					}
+				});
+
+			}
+
+			resMap.put("key", String.format("%s_%s_%s", CacheConstants.USER_SIGN_CERT_RESPONSE_MQ_KEY, username, entpriseCode));
+			resMap.put("res", JSONUtil.toJsonStr(subjectTypes));
+
+			return resMap;
+        });
+    }
+
+	/**
+	 * 税邦云数据处理
+	 *
+	 * @param user
+	 * @param dept
+	 * @param subjectResult
+	 */
+    private void taxHelperHandler(SysUser user, SysDept dept, JSONObject subjectResult) {
+		String code = subjectResult.getStr("code");
+		String certStatus = subjectResult.getStr("certStatus");
+		LocalDateTime now = LocalDateTime.now();
+		TaxHelperCertStatus taxHelperCertStatus = Enum.valueOf(TaxHelperCertStatus.class, certStatus);
+		// 拼接更新条件
+		LambdaUpdateWrapper<SysUserSub> updateWrapper = Wrappers.<SysUserSub>lambdaUpdate()
+				.eq(SysUserSub::getUserId, user.getUserId())
+				.eq(SysUserSub::getDeptId, dept.getDeptId())
+				.set(SysUserSub::getCallbackStatus, GigCallBackStatus.RETURNED)
+				.set(SysUserSub::getUpdateTime, now)
+				.set(SysUserSub::getUpdateUser, 0)
+				.set(SysUserSub::getCertRemark, JSONUtil.toJsonStr(subjectResult));
+		updateWrapper.eq(SysUserSub::getGigType, GigTypeEnum.TAX_HELPOR);
+		updateWrapper.set(SysUserSub::getCertStatus, taxHelperCertStatus.getCode());
+		if (TAXHELPER_SUCCESS_CODE.equals(code)) {
+			// 成功并且是换绑卡的情况,则更新银行卡号
+			String cacheKeyPrefix = String.format("%s_%s_%s", CacheConstants.BIND_CARD_CONFIRM_NEW_BANK_CARD,
+					user.getUserId(), GigTypeEnum.TAX_HELPOR.name());
+			UserSignCertDTO userSignCertDTO = (UserSignCertDTO) redisTemplate.opsForValue().get(cacheKeyPrefix);
+			if (userSignCertDTO != null) {
+				if (StrUtil.isNotBlank(userSignCertDTO.getBankCardNumber())) {
+					updateWrapper.set(SysUserSub::getBankCardNumber, userSignCertDTO.getBankCardNumber());
+				}
+				// redis删除银行卡号
+				redisTemplate.delete(cacheKeyPrefix);
+			}
+		}
+		sysUserSubService.update(updateWrapper);
+	}
+
+	/**
+	 * 易联数据处理
+	 *
+	 * @param user
+	 * @param dept
+	 * @param subjectResult
+	 */
+	private void yeeHandler(SysUser user, SysDept dept, JSONObject subjectResult) {
+		String code = subjectResult.getStr("code");
+		String certStatus = subjectResult.getStr("certStatus");
+		LocalDateTime now = LocalDateTime.now();
+		YeeCertStatus yeeCertStatus = Enum.valueOf(YeeCertStatus.class, certStatus);
+
+		// 拼接更新条件
+		LambdaUpdateWrapper<SysUserSub> updateWrapper = Wrappers.<SysUserSub>lambdaUpdate()
+				.eq(SysUserSub::getUserId, user.getUserId())
+				.eq(SysUserSub::getDeptId, dept.getDeptId())
+				.set(SysUserSub::getCallbackStatus, GigCallBackStatus.RETURNED)
+				.set(SysUserSub::getUpdateTime, now)
+				.set(SysUserSub::getUpdateUser, 0)
+				.set(SysUserSub::getCertRemark, JSONUtil.toJsonStr(subjectResult));
+		updateWrapper.eq(SysUserSub::getGigType, GigTypeEnum.YEE);
+		updateWrapper.set(SysUserSub::getCertStatus, yeeCertStatus.getCode());
+		if (YEE_SUCCESS_CODE.equals(code)) {
+			// 成功并且是换绑卡的情况,则更新银行卡号
+			String cacheKeyPrefix = String.format("%s_%s_%s", CacheConstants.BIND_CARD_CONFIRM_NEW_BANK_CARD,
+					user.getUserId(), GigTypeEnum.YEE.name());
+			UserSignCertDTO userSignCertDTO = (UserSignCertDTO) redisTemplate.opsForValue().get(cacheKeyPrefix);
+			if (userSignCertDTO != null) {
+				if (StrUtil.isNotBlank(userSignCertDTO.getBankCardNumber())) {
+					updateWrapper.set(SysUserSub::getBankCardNumber, userSignCertDTO.getBankCardNumber());
+				}
+				// redis删除银行卡号
+				redisTemplate.delete(cacheKeyPrefix);
+			}
+		}
+		sysUserSubService.update(updateWrapper);
+	}
+
+	private void renlijiaHandler(SysUser user, SysDept dept, JSONObject subjectResult) {
+		// TODO
+	}
+
+	/**
+	 * 自由职家数据处理(这里只保存mq回调结果,实际业务处理放到阿拉丁直接回调接口里了)
+	 *
+	 * @param user
+	 * @param dept
+	 * @param subjectResult
+	 */
+	private void oladingHandler(SysUser user, SysDept dept, JSONObject subjectResult) {
+		LocalDateTime now = LocalDateTime.now();
+		// 拼接更新条件
+		LambdaUpdateWrapper<SysUserSub> updateWrapper = Wrappers.<SysUserSub>lambdaUpdate()
+				.eq(SysUserSub::getUserId, user.getUserId())
+				.eq(SysUserSub::getDeptId, dept.getDeptId())
+				.eq(SysUserSub::getGigType, GigTypeEnum.OLADING)
+				.set(SysUserSub::getUpdateTime, now)
+				.set(SysUserSub::getUpdateUser, 0)
+				.set(SysUserSub::getCertRemark, JSONUtil.toJsonStr(subjectResult));
+		sysUserSubService.update(updateWrapper);
+	}
+
+}

+ 7 - 0
hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/service/SysDeptSubService.java

@@ -39,4 +39,11 @@ public interface SysDeptSubService extends IService<SysDeptSub> {
 	List<SettleAmountMonitorOutput> getSettleAmountMonitor(SettleAmountMonitorInput input);
 
 	List<SettleAmountMonitorOutput> getDeptAmountMonitor(SettleAmountMonitorInput input);
+
+	/**
+	 * 结算管理配置
+	 *
+	 * @param input
+	 */
+	void saveSettleConfig(DeptSubLimitAmountInput input);
 }

+ 13 - 0
hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/service/SysUserSubService.java

@@ -0,0 +1,13 @@
+package com.qunzhixinxi.hnqz.admin.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.qunzhixinxi.hnqz.admin.entity.SysUserSub;
+
+/**
+ * 用户签约认证主体信息服务
+ *
+ * @author lixuesong
+ * @date 2022年03月01日 18:48
+ */
+public interface SysUserSubService extends IService<SysUserSub> {
+}

+ 47 - 0
hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/service/gig/GigThirdApiService.java

@@ -0,0 +1,47 @@
+package com.qunzhixinxi.hnqz.admin.service.gig;
+
+import com.qunzhixinxi.hnqz.admin.api.dto.OladingCommonRequest;
+
+import java.util.Map;
+
+/**
+ * 第三方零工接口处理
+ *
+ * @author lixuesong
+ * @date 2022年04月17日 11:54
+ */
+public interface GigThirdApiService {
+
+	/**
+	 * 自由职家回调业务处理
+	 *  @param interfaceName
+	 * @param requestId
+	 * @param data
+	 */
+	void oladingNotify(String interfaceName, String requestId, Map<String, Object> data);
+
+	/**
+	 * 自由职家签约结果回调
+	 *
+	 * @param requestId
+	 * @param signUpCertStatus
+	 */
+	void oladingSignUp(String requestId, OladingCommonRequest.SignUpStatus signUpCertStatus);
+
+	/**
+	 * 自由职家证照上传结果回调
+	 *
+	 * @param requestId
+	 * @param uploadIdCertStatus
+	 */
+	void oladingUploadIdCardImage(String requestId, OladingCommonRequest.UploadIdCardImageStatus uploadIdCertStatus);
+
+	/**
+	 * 自由职家上传企业纳税人协议回调
+	 *
+	 * @param requestId
+	 * @param agreementStatus
+	 */
+	void oladingUploadTaxpayerAgreement(String requestId, OladingCommonRequest.UploadTaxpayerAgreementStatus agreementStatus);
+
+}

+ 13 - 0
hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/service/gig/OladingInputRecordService.java

@@ -0,0 +1,13 @@
+package com.qunzhixinxi.hnqz.admin.service.gig;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.qunzhixinxi.hnqz.admin.entity.OladingInputRecord;
+
+/**
+ * 自由职家请求记录服务
+ *
+ * @author lixuesong
+ * @date 2022年04月18日 15:41
+ */
+public interface OladingInputRecordService extends IService<OladingInputRecord> {
+}

+ 86 - 0
hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/service/gig/SysUserSignCertService.java

@@ -0,0 +1,86 @@
+package com.qunzhixinxi.hnqz.admin.service.gig;
+
+import com.qunzhixinxi.hnqz.admin.entity.SysUserSub;
+import com.qunzhixinxi.hnqz.admin.entity.dto.UserSignCertDTO;
+import com.qunzhixinxi.hnqz.admin.entity.vo.SysUserSubVO;
+import com.qunzhixinxi.hnqz.admin.enums.GigTypeEnum;
+
+import java.util.List;
+
+/**
+ * 用户签约认证服务
+ *
+ * @author lixuesong
+ * @date 2022年03月03日 14:38
+ */
+public interface SysUserSignCertService {
+
+	/**
+	 * 查询用户签约认证信息
+	 *
+	 * @param userId
+	 * @return
+	 */
+	List<SysUserSub> listUserSignCert(Integer userId);
+
+	/**
+	 * 查询用户签约认证信息
+	 *
+	 * @param userId
+	 * @param gigTypeList
+	 * @return
+	 */
+	List<SysUserSub> listUserSignCert(Integer userId, List<GigTypeEnum> gigTypeList);
+
+	/**
+	 * 查询用户签约认证信息
+	 *
+	 * @param userId
+	 * @return
+	 */
+	List<SysUserSubVO> listUserSignCertForApi(Integer userId);
+
+	/**
+	 * 保存用户基础信息
+	 *
+	 * @param userSignCertDTO
+	 */
+	void saveBaseInfo(UserSignCertDTO userSignCertDTO);
+
+	/**
+	 * 签协议
+	 *
+	 * @param userSignCertDTO
+	 */
+	void signAgreement(UserSignCertDTO userSignCertDTO);
+
+	/**
+	 * 人身验证
+	 *
+	 * @param userSignCertDTO
+	 */
+	void personalIdentityVerification(UserSignCertDTO userSignCertDTO);
+
+	/**
+	 * 批量发起用户签约认证
+	 *
+	 * @param userSignCertDTO
+	 * @return
+	 */
+	boolean batchChannelCert(UserSignCertDTO userSignCertDTO);
+
+
+	/**
+	 * 税邦云发送绑卡验证码
+	 *
+	 * @param userSignCertDTO
+	 */
+    void bindCardVerification(UserSignCertDTO userSignCertDTO);
+
+	/**
+	 * 绑卡确认
+	 *
+	 * @param userSignCertDTO
+	 */
+	void bindCardConfirm(UserSignCertDTO userSignCertDTO);
+}

+ 218 - 0
hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/service/gig/impl/GigThirdApiServiceImpl.java

@@ -0,0 +1,218 @@
+package com.qunzhixinxi.hnqz.admin.service.gig.impl;
+
+import cn.hutool.core.map.MapUtil;
+import cn.hutool.core.util.StrUtil;
+import cn.hutool.json.JSONUtil;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.qunzhixinxi.hnqz.admin.api.constant.CacheConstants;
+import com.qunzhixinxi.hnqz.admin.api.dto.OladingCommonRequest;
+import com.qunzhixinxi.hnqz.admin.entity.SysUserSub;
+import com.qunzhixinxi.hnqz.admin.entity.dto.UserSignCertDTO;
+import com.qunzhixinxi.hnqz.admin.enums.GigCallBackStatus;
+import com.qunzhixinxi.hnqz.admin.enums.GigTypeEnum;
+import com.qunzhixinxi.hnqz.admin.enums.OladingCertStatus;
+import com.qunzhixinxi.hnqz.admin.service.SysUserSubService;
+import com.qunzhixinxi.hnqz.admin.service.gig.GigThirdApiService;
+import com.qunzhixinxi.hnqz.admin.service.gig.SysUserSignCertService;
+import com.qunzhixinxi.hnqz.common.core.exception.ValidateCodeException;
+import lombok.AllArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.data.redis.core.RedisTemplate;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.time.LocalDateTime;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.concurrent.TimeUnit;
+
+/**
+ * @author lixuesong
+ * @date 2022年04月17日 11:55
+ */
+@Slf4j
+@Service
+@AllArgsConstructor
+public class GigThirdApiServiceImpl implements GigThirdApiService {
+
+	private final SysUserSubService sysUserSubService;
+
+	private final SysUserSignCertService sysUserSignCertService;
+
+	private final RedisTemplate redisTemplate;
+
+	/**
+	 * 自由职家回调业务处理
+	 *  @param interfaceName
+	 * @param requestId
+	 * @param data
+	 */
+	@Override
+	public void oladingNotify(String interfaceName, String requestId, Map<String, Object> data) {
+		// 接口名称
+		OladingCommonRequest.InterfaceName interfaceNameEnum = Enum.valueOf(OladingCommonRequest.InterfaceName.class, interfaceName);
+		// 状态
+		String status = (String) data.get("status");
+		// 截取前缀部分,从而获取到系统内部的requestId
+		String requestIdPrefix = StrUtil.split(requestId, StrUtil.UNDERLINE).get(0);
+
+		if (StrUtil.isBlank(status)) {
+			throw new ValidateCodeException("status为空");
+		}
+
+		switch (interfaceNameEnum) {
+			case SIGN_UP:
+				// 签约
+				OladingCommonRequest.SignUpStatus signUpCertStatus = Enum.valueOf(OladingCommonRequest.SignUpStatus.class, status);
+				if (OladingCommonRequest.SignUpStatus.SIGN.equals(signUpCertStatus)) {
+					this.oladingSignUp(requestIdPrefix, signUpCertStatus);
+				}
+				break;
+			case UPLOAD_ID_CARD_IMAGE:
+				// 证照上传
+				OladingCommonRequest.UploadIdCardImageStatus uploadIdCertStatus =
+						Enum.valueOf(OladingCommonRequest.UploadIdCardImageStatus.class, status);
+				this.oladingUploadIdCardImage(requestIdPrefix, uploadIdCertStatus);
+				break;
+			case UPLOAD_TAXPAYER_AGREEMENT:
+				// 上传企业纳税人协议
+				OladingCommonRequest.UploadTaxpayerAgreementStatus agreementStatus =
+						Enum.valueOf(OladingCommonRequest.UploadTaxpayerAgreementStatus.class, status);
+				this.oladingUploadTaxpayerAgreement(requestIdPrefix, agreementStatus);
+				break;
+			default:
+
+		}
+	}
+
+	/**
+	 * 自由职家签约结果回调
+	 *
+	 * @param requestId
+	 * @param signUpCertStatus
+	 */
+	@Override
+	@Transactional(rollbackFor = Exception.class)
+	public void oladingSignUp(String requestId, OladingCommonRequest.SignUpStatus signUpCertStatus) {
+		// 先查询requestId是否存在
+		SysUserSub userSub = sysUserSubService.getOne(Wrappers.<SysUserSub>lambdaQuery()
+				.eq(SysUserSub::getGigType, GigTypeEnum.OLADING)
+				.eq(SysUserSub::getRequestId, requestId));
+		if (userSub == null) {
+			throw new ValidateCodeException("requestId不存在");
+		}
+
+		Map<String, String> subMap = new HashMap<>();
+		SysUserSub updateUserSub = new SysUserSub();
+		if (OladingCommonRequest.SignUpStatus.SIGN.equals(signUpCertStatus)) {
+			// 如果成功,则发送证照上传MQ
+			log.info("=============================发送证照上传MQ==================================");
+			UserSignCertDTO userSignCertDTO = new UserSignCertDTO();
+			userSignCertDTO.setUserId(userSub.getUserId());
+			userSignCertDTO.setGigTypeList(Collections.singletonList(GigTypeEnum.OLADING));
+			sysUserSignCertService.batchChannelCert(userSignCertDTO);
+			subMap.put("certStatus", OladingCertStatus.SIGNED.name());
+			updateUserSub.setCertStatus(Integer.valueOf(OladingCertStatus.SIGNED.getCode()));
+		} else {
+			subMap.put("certStatus", OladingCertStatus.UN_SIGNED.name());
+			updateUserSub.setCertStatus(Integer.valueOf(OladingCertStatus.UN_SIGNED.getCode()));
+			updateUserSub.setCallbackStatus(GigCallBackStatus.RETURNED);
+		}
+		updateUserSub.setId(userSub.getId());
+		updateUserSub.setUpdateTime(LocalDateTime.now());
+		updateUserSub.setUpdateUser(0);
+		// 更新状态
+		sysUserSubService.updateById(updateUserSub);
+
+		// 结果放到redis
+		String key = CacheConstants.USER_SIGN_CERT_RESPONSE_KEY + userSub.getUserId();
+		Map<String, Object> result = MapUtil.newHashMap(1);
+		result.put("OLADING", subMap);
+		redisTemplate.opsForValue().set(key, JSONUtil.toJsonStr(result), 1, TimeUnit.MINUTES);
+	}
+
+	/**
+	 * 自由职家证照上传结果回调
+	 *
+	 * @param requestId
+	 * @param uploadIdCertStatus
+	 */
+	@Override
+	public void oladingUploadIdCardImage(String requestId, OladingCommonRequest.UploadIdCardImageStatus uploadIdCertStatus) {
+		// 先查询requestId是否存在
+		SysUserSub userSub = sysUserSubService.getOne(Wrappers.<SysUserSub>lambdaQuery()
+				.eq(SysUserSub::getGigType, GigTypeEnum.OLADING)
+				.eq(SysUserSub::getRequestId, requestId));
+		if (userSub == null) {
+			throw new ValidateCodeException("requestId不存在");
+		}
+
+		Map<String, String> subMap = new HashMap<>();
+		SysUserSub updateUserSub = new SysUserSub();
+		if (OladingCommonRequest.UploadIdCardImageStatus.IDENTIFY_SUCCESS.equals(uploadIdCertStatus)) {
+			// 如果成功,则发送协议上传MQ
+			log.info("=============================发送协议上传MQ==================================");
+			UserSignCertDTO userSignCertDTO = new UserSignCertDTO();
+			userSignCertDTO.setUserId(userSub.getUserId());
+			userSignCertDTO.setGigTypeList(Collections.singletonList(GigTypeEnum.OLADING));
+			sysUserSignCertService.batchChannelCert(userSignCertDTO);
+			subMap.put("certStatus", OladingCertStatus.SIGNED.name());
+			updateUserSub.setCertStatus(Integer.valueOf(OladingCertStatus.SIGNED.getCode()));
+		} else {
+			subMap.put("certStatus", OladingCertStatus.SIGNED.name());
+			updateUserSub.setCertStatus(Integer.valueOf(OladingCertStatus.SIGNED.getCode()));
+			updateUserSub.setCallbackStatus(GigCallBackStatus.RETURNED);
+		}
+		updateUserSub.setId(userSub.getId());
+		updateUserSub.setUpdateTime(LocalDateTime.now());
+		updateUserSub.setUpdateUser(0);
+		// 更新状态
+		sysUserSubService.updateById(updateUserSub);
+
+		// 结果放到redis
+		String key = CacheConstants.USER_SIGN_CERT_RESPONSE_KEY + userSub.getUserId();
+		Map<String, Object> result = MapUtil.newHashMap(1);
+		result.put("OLADING", subMap);
+		redisTemplate.opsForValue().set(key, JSONUtil.toJsonStr(result), 1, TimeUnit.MINUTES);
+	}
+
+	/**
+	 * 自由职家上传企业纳税人协议回调
+	 *
+	 * @param requestId
+	 * @param agreementStatus
+	 */
+	@Override
+	public void oladingUploadTaxpayerAgreement(String requestId, OladingCommonRequest.UploadTaxpayerAgreementStatus agreementStatus) {
+		// 先查询requestId是否存在
+		SysUserSub userSub = sysUserSubService.getOne(Wrappers.<SysUserSub>lambdaQuery()
+				.eq(SysUserSub::getGigType, GigTypeEnum.OLADING)
+				.eq(SysUserSub::getRequestId, requestId));
+		if (userSub == null) {
+			throw new ValidateCodeException("requestId不存在");
+		}
+
+		Map<String, String> subMap = new HashMap<>();
+		SysUserSub updateUserSub = new SysUserSub();
+		if (OladingCommonRequest.UploadTaxpayerAgreementStatus.SUCCESS.equals(agreementStatus)) {
+			subMap.put("certStatus", OladingCertStatus.CERT.name());
+			updateUserSub.setCertStatus(Integer.valueOf(OladingCertStatus.CERT.getCode()));
+		} else {
+			subMap.put("certStatus", OladingCertStatus.SIGNED.name()); // TODO 更新状态
+			updateUserSub.setCertStatus(Integer.valueOf(OladingCertStatus.SIGNED.getCode()));
+		}
+		updateUserSub.setId(userSub.getId());
+		updateUserSub.setCallbackStatus(GigCallBackStatus.RETURNED);
+		updateUserSub.setUpdateTime(LocalDateTime.now());
+		updateUserSub.setUpdateUser(0);
+		// 更新状态
+		sysUserSubService.updateById(updateUserSub);
+
+		// 结果放到redis
+		String key = CacheConstants.USER_SIGN_CERT_RESPONSE_KEY + userSub.getUserId();
+		Map<String, Object> result = MapUtil.newHashMap(1);
+		result.put("OLADING", subMap);
+		redisTemplate.opsForValue().set(key, JSONUtil.toJsonStr(result), 1, TimeUnit.MINUTES);
+	}
+}

+ 20 - 0
hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/service/gig/impl/OladingInputRecordServiceImpl.java

@@ -0,0 +1,20 @@
+package com.qunzhixinxi.hnqz.admin.service.gig.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.qunzhixinxi.hnqz.admin.entity.OladingInputRecord;
+import com.qunzhixinxi.hnqz.admin.mapper.OladingInputRecordMapper;
+import com.qunzhixinxi.hnqz.admin.service.gig.OladingInputRecordService;
+import lombok.AllArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+
+/**
+ * @author lixuesong
+ * @date 2022年04月18日 15:42
+ */
+@Slf4j
+@Service
+@AllArgsConstructor
+public class OladingInputRecordServiceImpl extends ServiceImpl<OladingInputRecordMapper, OladingInputRecord>
+		implements OladingInputRecordService {
+}

+ 651 - 0
hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/service/gig/impl/SysUserSignCertServiceImpl.java

@@ -0,0 +1,651 @@
+package com.qunzhixinxi.hnqz.admin.service.gig.impl;
+
+import cn.hutool.core.bean.BeanUtil;
+import cn.hutool.core.collection.CollUtil;
+import cn.hutool.core.map.MapUtil;
+import cn.hutool.core.util.StrUtil;
+import cn.hutool.json.JSONUtil;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.qunzhixinxi.hnqz.admin.api.constant.CacheConstants;
+import com.qunzhixinxi.hnqz.admin.api.constant.MqConstants;
+import com.qunzhixinxi.hnqz.admin.api.entity.SysDept;
+import com.qunzhixinxi.hnqz.admin.api.entity.SysUser;
+import com.qunzhixinxi.hnqz.admin.config.TaxNotifyConfig;
+import com.qunzhixinxi.hnqz.admin.config.UpmsConfig;
+import com.qunzhixinxi.hnqz.admin.entity.SysDeptSub;
+import com.qunzhixinxi.hnqz.admin.entity.SysUserSub;
+import com.qunzhixinxi.hnqz.admin.entity.dto.UserSignCertDTO;
+import com.qunzhixinxi.hnqz.admin.entity.input.UserCertificationInput;
+import com.qunzhixinxi.hnqz.admin.entity.model.GigBaseInfoModel;
+import com.qunzhixinxi.hnqz.admin.entity.model.GigInfoModel;
+import com.qunzhixinxi.hnqz.admin.entity.model.GigUserInfoModel;
+import com.qunzhixinxi.hnqz.admin.entity.vo.SysUserSubVO;
+import com.qunzhixinxi.hnqz.admin.enums.GigCallBackStatus;
+import com.qunzhixinxi.hnqz.admin.enums.GigChannelEnum;
+import com.qunzhixinxi.hnqz.admin.enums.GigTypeEnum;
+import com.qunzhixinxi.hnqz.admin.enums.LockEnum;
+import com.qunzhixinxi.hnqz.admin.enums.MemberIDCardType;
+import com.qunzhixinxi.hnqz.admin.enums.MemberType;
+import com.qunzhixinxi.hnqz.admin.enums.OladingCertStatus;
+import com.qunzhixinxi.hnqz.admin.enums.PayChannel;
+import com.qunzhixinxi.hnqz.admin.enums.RenlijiaCertStatus;
+import com.qunzhixinxi.hnqz.admin.enums.SubjectTypeEnum;
+import com.qunzhixinxi.hnqz.admin.enums.YeeCertStatus;
+import com.qunzhixinxi.hnqz.admin.service.SysDeptService;
+import com.qunzhixinxi.hnqz.admin.service.SysDeptSubService;
+import com.qunzhixinxi.hnqz.admin.service.SysUserService;
+import com.qunzhixinxi.hnqz.admin.service.SysUserSubService;
+import com.qunzhixinxi.hnqz.admin.service.gig.SysUserSignCertService;
+import com.qunzhixinxi.hnqz.common.core.entity.BaseMap;
+import com.qunzhixinxi.hnqz.common.core.util.R;
+import com.qunzhixinxi.hnqz.common.rabbitmq.client.RabbitMqClient;
+import com.qunzhixinxi.hnqz.common.security.service.HnqzUser;
+import com.qunzhixinxi.hnqz.common.security.util.SecurityUtils;
+import com.qunzhixinxi.hnqz.common.taxhelper.enums.TaxHelperCertStatus;
+import lombok.AllArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.RandomStringUtils;
+import org.springframework.data.redis.core.RedisTemplate;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.time.LocalDateTime;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.concurrent.TimeUnit;
+import java.util.stream.Collectors;
+
+/**
+ * 用户签约认证服务
+ *
+ * @author lixuesong
+ * @date 2022年03月03日 14:38
+ */
+@Slf4j
+@Service
+@AllArgsConstructor
+public class SysUserSignCertServiceImpl implements SysUserSignCertService {
+
+	private final SysUserService sysUserService;
+
+	private final SysUserSubService sysUserSubService;
+
+	private final SysDeptSubService sysDeptSubService;
+
+	private final SysDeptService sysDeptService;
+
+	private final RabbitMqClient rabbitMqClient;
+
+	private final UpmsConfig upmsConfig;
+
+	private final TaxNotifyConfig taxNotifyConfig;
+
+	private final RedisTemplate redisTemplate;
+
+	/**
+	 * 查询用户签约认证信息
+	 *
+	 * @param userId
+	 * @return
+	 */
+	@Override
+	public List<SysUserSub> listUserSignCert(Integer userId) {
+		List<SysUserSub> userSubList = sysUserSubService.list(Wrappers.<SysUserSub>lambdaQuery()
+				.eq(SysUserSub::getUserId, userId));
+		return userSubList;
+	}
+
+	/**
+	 * 查询用户签约认证信息
+	 *
+	 * @param userId
+	 * @param gigTypeList
+	 * @return
+	 */
+	@Override
+	public List<SysUserSub> listUserSignCert(Integer userId, List<GigTypeEnum> gigTypeList) {
+		List<SysUserSub> userSubList = sysUserSubService.list(Wrappers.<SysUserSub>lambdaQuery()
+				.eq(SysUserSub::getUserId, userId)
+				.in(SysUserSub::getGigType, gigTypeList));
+		return userSubList;
+	}
+
+	/**
+	 * 查询用户签约认证信息
+	 *
+	 * @param userId
+	 * @return
+	 */
+	@Override
+	public List<SysUserSubVO> listUserSignCertForApi(Integer userId) {
+		List<SysUserSub> userSubList = sysUserSubService.list(Wrappers.<SysUserSub>lambdaQuery()
+				.eq(SysUserSub::getUserId, userId));
+		if (CollUtil.isNotEmpty(userSubList)) {
+			List<SysUserSubVO> resultList = new ArrayList<>();
+			userSubList.forEach(sysUserSub -> {
+				SysUserSubVO userSubVO = BeanUtil.copyProperties(sysUserSub, SysUserSubVO.class, "certStatus");
+				switch (sysUserSub.getGigType()) {
+					case REN_LI_JIA:
+						userSubVO.setCertStatus(RenlijiaCertStatus.resolve(sysUserSub.getCertStatus()).name());
+						break;
+					case TAX_HELPOR:
+						userSubVO.setCertStatus(TaxHelperCertStatus.resolve(sysUserSub.getCertStatus()).name());
+						break;
+					case YEE:
+						userSubVO.setCertStatus(YeeCertStatus.resolve(String.valueOf(sysUserSub.getCertStatus())).name());
+						break;
+					case OLADING:
+						userSubVO.setCertStatus(OladingCertStatus.resolve(String.valueOf(sysUserSub.getCertStatus())).name());
+						break;
+					default:
+				}
+
+				resultList.add(userSubVO);
+			});
+			return resultList;
+		}
+		return new ArrayList<>();
+	}
+
+	/**
+	 * 保存用户基础信息
+	 *
+	 * @param userSignCertDTO
+	 */
+	@Override
+	@Transactional(rollbackFor = Exception.class)
+	public void saveBaseInfo(UserSignCertDTO userSignCertDTO) {
+		HnqzUser user = SecurityUtils.getUser();
+		Integer operateUserId = user.getId();
+		// 查询user
+		SysUser queryUser = sysUserService.getById(userSignCertDTO.getUserId());
+
+		if (StrUtil.isNotBlank(userSignCertDTO.getIdCardNumber())) {
+			// 更新用户信息
+			SysUser updateUser = new SysUser();
+			updateUser.setUserId(userSignCertDTO.getUserId());
+			updateUser.setIdCardNumber(userSignCertDTO.getIdCardNumber());
+			sysUserService.updateById(updateUser);
+		}
+		// 更新用户签约认证主体信息
+		userSignCertDTO.getGigTypeList().forEach(gigType -> {
+			// 税邦云单独设置渠道类型
+			GigChannelEnum gigChannel;
+			if (GigTypeEnum.TAX_HELPOR.equals(gigType)) {
+				// 读取用户所认证的企业的结算渠道
+				SysDeptSub deptSub = sysDeptSubService.getOne(Wrappers.<SysDeptSub>lambdaQuery()
+						.eq(SysDeptSub::getDeptId, queryUser.getDeptId())
+						.eq(SysDeptSub::getSubjectType, GigTypeEnum.TAX_HELPOR.getCode())
+						.eq(SysDeptSub::getEnableFlag, SubjectTypeEnum.ENABLE_FLAG_TRUE.getCode()));
+				if (deptSub != null) {
+					gigChannel = GigChannelEnum.resolve(Integer.parseInt(deptSub.getSubjectType()));
+				} else {
+					gigChannel = GigChannelEnum.DEFAULT;
+				}
+			} else {
+				gigChannel = GigChannelEnum.DEFAULT;
+			}
+			SysUserSub queryUserSub = sysUserSubService.getOne(Wrappers.<SysUserSub>lambdaQuery()
+					.eq(SysUserSub::getUserId, userSignCertDTO.getUserId())
+					.eq(SysUserSub::getGigType, gigType));
+			if (queryUserSub != null) {
+				SysUserSub updateUserSub = new SysUserSub();
+				updateUserSub.setId(queryUserSub.getId());
+				updateUserSub.setCallbackStatus(GigCallBackStatus.NOT_SUBMIT);
+				updateUserSub.setGigChannel(gigChannel);
+				updateUserSub.setBankCardNumber(userSignCertDTO.getBankCardNumber());
+				updateUserSub.setUpdateTime(LocalDateTime.now());
+				updateUserSub.setUpdateUser(operateUserId);
+				sysUserSubService.updateById(updateUserSub);
+			} else {
+				SysUserSub userSub = new SysUserSub();
+				userSub.setUserId(userSignCertDTO.getUserId());
+				userSub.setDeptId(queryUser.getDeptId());
+				userSub.setGigType(gigType);
+				userSub.setGigChannel(gigChannel);
+				userSub.setCallbackStatus(GigCallBackStatus.NOT_SUBMIT);
+				userSub.setBankCardNumber(userSignCertDTO.getBankCardNumber());
+				userSub.setBankPhone(userSignCertDTO.getBankPhone());
+				userSub.setCreateUser(operateUserId);
+				userSub.setCreateTime(LocalDateTime.now());
+				sysUserSubService.save(userSub);
+			}
+		});
+	}
+
+	/**
+	 * 签协议
+	 *
+	 * @param userSignCertDTO
+	 */
+	@Override
+	@Transactional(rollbackFor = Exception.class)
+	public void signAgreement(UserSignCertDTO userSignCertDTO) {
+		LambdaUpdateWrapper<SysUserSub> updateWrapper = Wrappers.lambdaUpdate();
+		updateWrapper.eq(SysUserSub::getUserId, userSignCertDTO.getUserId());
+		if (CollUtil.isNotEmpty(userSignCertDTO.getGigTypeList())) {
+			updateWrapper.in(SysUserSub::getGigType, userSignCertDTO.getGigTypeList());
+		}
+		updateWrapper.set(SysUserSub::getAgreementUrl, userSignCertDTO.getAgreementUrl());
+		updateWrapper.set(SysUserSub::getUpdateUser, SecurityUtils.getUser().getId());
+		updateWrapper.set(SysUserSub::getUpdateTime, LocalDateTime.now());
+
+		sysUserSubService.update(updateWrapper);
+	}
+
+	/**
+	 * 人身验证
+	 *
+	 * @param userSignCertDTO
+	 */
+	@Override
+	@Transactional(rollbackFor = Exception.class)
+	public void personalIdentityVerification(UserSignCertDTO userSignCertDTO) {
+		LambdaUpdateWrapper<SysUserSub> updateWrapper = Wrappers.lambdaUpdate();
+		updateWrapper.eq(SysUserSub::getUserId, userSignCertDTO.getUserId());
+		if (CollUtil.isNotEmpty(userSignCertDTO.getGigTypeList())) {
+			updateWrapper.in(SysUserSub::getGigType, userSignCertDTO.getGigTypeList());
+		}
+		if (StrUtil.isNotBlank(userSignCertDTO.getAgreementUrl())) {
+			updateWrapper.set(SysUserSub::getAgreementUrl, userSignCertDTO.getAgreementUrl());
+		}
+		updateWrapper.set(SysUserSub::getIdCardFrontUrl, userSignCertDTO.getIdCardFrontUrl());
+		updateWrapper.set(SysUserSub::getIdCardBackUrl, userSignCertDTO.getIdCardBackUrl());
+		updateWrapper.set(SysUserSub::getCertVideo1Url, userSignCertDTO.getCertVideo1Url());
+		updateWrapper.set(SysUserSub::getCertVideo2Url, userSignCertDTO.getCertVideo2Url());
+		updateWrapper.set(SysUserSub::getUpdateUser, SecurityUtils.getUser().getId());
+		updateWrapper.set(SysUserSub::getUpdateTime, LocalDateTime.now());
+
+		sysUserSubService.update(updateWrapper);
+	}
+
+	/**
+	 * 批量发起用户签约认证
+	 *
+	 * @param userSignCertDTO
+	 * @return
+	 */
+	@Override
+	@Transactional(rollbackFor = Exception.class)
+	public boolean batchChannelCert(UserSignCertDTO userSignCertDTO) {
+		Integer userId = userSignCertDTO.getUserId();
+		// 根据用户id查询用户信息、认证信息
+		SysUser sysUser = sysUserService.getById(userId);
+		if (sysUser == null) {
+			return false;
+		}
+		// 查询dept
+		SysDept dept = sysDeptService.getById(sysUser.getDeptId());
+		// 查询当前用户关联的userSub
+		LambdaQueryWrapper<SysUserSub> userSubWrapper = Wrappers.lambdaQuery();
+		userSubWrapper.eq(SysUserSub::getUserId, userId);
+		if (CollUtil.isNotEmpty(userSignCertDTO.getGigTypeList())) {
+			userSubWrapper.in(SysUserSub::getGigType, userSignCertDTO.getGigTypeList());
+		}
+		List<SysUserSub> userSubList = sysUserSubService.list(userSubWrapper);
+
+		if (CollUtil.isNotEmpty(userSubList)) {
+			// 封装请求数据
+			userSubList.stream().filter(sysUserSub -> {
+				// 过滤掉认证成功的数据
+				if (GigTypeEnum.TAX_HELPOR.equals(sysUserSub.getGigType())
+						&& TaxHelperCertStatus.CHECKED_UNBIND.getCode() != sysUserSub.getCertStatus()
+						&& TaxHelperCertStatus.CERT.getCode() != sysUserSub.getCertStatus()) {
+					return true;
+				} else if (GigTypeEnum.YEE.equals(sysUserSub.getGigType())
+						&& !YeeCertStatus.SIGNED.getCode().equals(String.valueOf(sysUserSub.getCertStatus()))) {
+					return true;
+				} else if (GigTypeEnum.OLADING.equals(sysUserSub.getGigType())
+						&& !OladingCertStatus.CERT.getCode().equals(String.valueOf(sysUserSub.getCertStatus()))) {
+					return true;
+				} else if (GigTypeEnum.REN_LI_JIA.equals(sysUserSub.getGigType())
+						&& RenlijiaCertStatus.CER_STATUS_1.getCode() != sysUserSub.getCertStatus()) {
+					return true;
+				}
+				return false;
+			}).forEach(userSub -> {
+				// 发起前置判断
+				boolean preSignCert = preSignCert(sysUser, userSub);
+				if (!preSignCert) {
+					return;
+				}
+				// 请求流水号
+				String requestId = RandomStringUtils.randomAlphabetic(16);
+				// 封装请求参数
+				GigInfoModel infoModel = buildChannelCertModel(sysUser, userSub, dept.getTaxCode(), requestId);
+				// 更新为进行中状态
+				SysUserSub updateUserSub = new SysUserSub();
+				updateUserSub.setId(userSub.getId());
+				updateUserSub.setRequestId(requestId);
+				updateUserSub.setCallbackStatus(GigCallBackStatus.IN_PROGRESS);
+				sysUserSubService.updateById(updateUserSub);
+				// 发送mq
+				BaseMap gigInfo = new BaseMap();
+				gigInfo.put(userSub.getGigType().name(), infoModel);
+				rabbitMqClient.sendMessage(MqConstants.DIRECT_MODE_GIG_SIGN_CERT_QUEUE, JSONUtil.toJsonStr(gigInfo));
+
+			});
+			return true;
+		}
+		return false;
+	}
+
+	/**
+	 * 签约认证前的前置判断
+	 *
+	 * @param sysUser
+	 * @param userSub
+	 */
+	private boolean preSignCert(SysUser sysUser, SysUserSub userSub) {
+		boolean flag = true;
+		switch (userSub.getGigType()) {
+			case OLADING:
+				// 如果存在相同身份证信息的用户,并且是签约或认证过,则不发起,直接返回签约认证状态
+				List<SysUser> existUserList = sysUserService.list(Wrappers.<SysUser>lambdaQuery()
+						.eq(SysUser::getRealname, sysUser.getRealname())
+						.eq(SysUser::getIdCardNumber, sysUser.getIdCardNumber())
+						.eq(SysUser::getLockFlag, LockEnum.UN_LOCK.val())
+						.ne(SysUser::getUserId, sysUser.getUserId()));
+				if (CollUtil.isNotEmpty(existUserList)) {
+					List<Integer> existUserIdList = existUserList.stream()
+							.map(SysUser::getUserId)
+							.collect(Collectors.toList());
+					List<SysUserSub> existUserSubList = sysUserSubService.list(Wrappers.<SysUserSub>lambdaQuery()
+							.in(SysUserSub::getUserId, existUserIdList)
+							.in(SysUserSub::getCertStatus, Integer.valueOf(OladingCertStatus.CERT.getCode()))
+							.eq(SysUserSub::getCallbackStatus, GigCallBackStatus.RETURNED)
+							.eq(SysUserSub::getGigType, GigTypeEnum.OLADING));
+					if (CollUtil.isNotEmpty(existUserSubList)) {
+						flag = false;
+						SysUserSub existUserSub = existUserSubList.get(0);
+						// 更新状态
+						SysUserSub updateUserSub = new SysUserSub();
+						updateUserSub.setId(userSub.getId());
+						updateUserSub.setCertStatus(existUserSub.getCertStatus());
+						updateUserSub.setCallbackStatus(GigCallBackStatus.RETURNED);
+						updateUserSub.setUpdateTime(LocalDateTime.now());
+						updateUserSub.setUpdateUser(0);
+						sysUserSubService.updateById(updateUserSub);
+						// 结果放到redis
+						String key = CacheConstants.USER_SIGN_CERT_RESPONSE_KEY + userSub.getUserId();
+						Map<String, String> subMap = new HashMap<>();
+						subMap.put("certStatus", OladingCertStatus.resolve(String.valueOf(existUserSub.getCertStatus())).name());
+						Map<String, Object> result = MapUtil.newHashMap(1);
+						result.put("OLADING", subMap);
+						redisTemplate.opsForValue().set(key, JSONUtil.toJsonStr(result), 1, TimeUnit.MINUTES);
+					}
+				}
+				break;
+			case REN_LI_JIA:
+				// 人力家直接调用原有发短信接口
+				UserCertificationInput input = new UserCertificationInput();
+				input.setUserId(sysUser.getUserId());
+				input.setIdCardNumber(sysUser.getIdCardNumber());
+				input.setBankCardNumber(userSub.getBankCardNumber());
+				input.setSubList(new String[]{String.valueOf(GigTypeEnum.REN_LI_JIA.getCode())});
+				R r = sysUserService.batchChannelCert(input);
+				// 更新状态
+				SysUserSub updateUserSub = new SysUserSub();
+				updateUserSub.setId(userSub.getId());
+				RenlijiaCertStatus certStatus =
+						r.getCode() == 0 ? RenlijiaCertStatus.CER_STATUS_3 : RenlijiaCertStatus.CER_STATUS_2;
+				updateUserSub.setCertStatus(certStatus.getCode());
+				updateUserSub.setCertRemark(r.getMsg());
+				updateUserSub.setCallbackStatus(GigCallBackStatus.IN_PROGRESS);
+				updateUserSub.setUpdateTime(LocalDateTime.now());
+				updateUserSub.setUpdateUser(0);
+				sysUserSubService.updateById(updateUserSub);
+				// 默认返回false,不触发发送mq
+				flag = false;
+			default:
+		}
+
+		return flag;
+	}
+
+	/**
+	 * 封装签约认证的请求参数
+	 *
+	 * @param sysUser
+	 * @param userSub
+	 * @param entCode
+	 * @param requestId
+	 * @return
+	 */
+	private GigInfoModel buildChannelCertModel(SysUser sysUser, SysUserSub userSub, String entCode, String requestId) {
+		// 基础信息
+		GigBaseInfoModel baseInfoModel = new GigBaseInfoModel();
+		baseInfoModel.setRequestId(requestId);
+		baseInfoModel.setGigType(userSub.getGigType());
+		baseInfoModel.setGigChannel(userSub.getGigChannel());
+		// 用户信息
+		GigUserInfoModel userInfoModel = new GigUserInfoModel();
+		userInfoModel.setUserId(sysUser.getUserId());
+		userInfoModel.setName(sysUser.getRealname());
+		userInfoModel.setUsername(sysUser.getUsername());
+		userInfoModel.setEntCode(entCode);
+		userInfoModel.setDeptId(sysUser.getDeptId());
+		userInfoModel.setIdCard(sysUser.getIdCardNumber());
+		userInfoModel.setIdCardType(MemberIDCardType.ID_CARD);
+		userInfoModel.setMemberType(MemberType.YAOYI_EXCLUSIVE_PERSONNEL);
+		userInfoModel.setEmail("gig_service@yaoyi.net"); // TODO
+		userInfoModel.setAddress("北京市-房山区-长阳镇");
+		userInfoModel.setPayChannel(PayChannel.BANK_CARD);
+		userInfoModel.setBankPhone(userSub.getBankPhone());
+		userInfoModel.setBankCard(userSub.getBankCardNumber());
+		userInfoModel.setIdCardFront(StrUtil.isBlank(userSub.getIdCardFrontUrl())
+				? null : userSub.getIdCardFrontUrl().startsWith("https")
+				? userSub.getIdCardFrontUrl() : upmsConfig.getClientUrl() + userSub.getIdCardFrontUrl());
+		userInfoModel.setIdCardBack(StrUtil.isBlank(userSub.getIdCardBackUrl())
+				? null : userSub.getIdCardBackUrl().startsWith("https")
+				? userSub.getIdCardBackUrl() : upmsConfig.getClientUrl() + userSub.getIdCardBackUrl());
+		userInfoModel.setCertVideo1(StrUtil.isBlank(userSub.getCertVideo1Url())
+				? null : userSub.getCertVideo1Url().startsWith("https")
+				? userSub.getCertVideo1Url() : upmsConfig.getClientUrl() + userSub.getCertVideo1Url());
+		userInfoModel.setCertVideo2(StrUtil.isBlank(userSub.getCertVideo2Url())
+				? null : userSub.getCertVideo2Url().startsWith("https")
+				? userSub.getCertVideo2Url() : upmsConfig.getClientUrl() + userSub.getCertVideo2Url());
+		userInfoModel.setSignImageUrl(StrUtil.isBlank(userSub.getAgreementUrl())
+				? null : userSub.getAgreementUrl().startsWith("https")
+				? userSub.getAgreementUrl() : upmsConfig.getClientUrl() + userSub.getAgreementUrl());
+
+		GigInfoModel infoModel = new GigInfoModel();
+		infoModel.setBaseInfo(baseInfoModel);
+		infoModel.setUserInfo(userInfoModel);
+
+		return infoModel;
+	}
+
+	/**
+	 * 税邦云发送绑卡验证码
+	 *
+	 * @param userSignCertDTO
+	 */
+	@Override
+	@Transactional(rollbackFor = Exception.class)
+	public void bindCardVerification(UserSignCertDTO userSignCertDTO) {
+		SysUserSub userSub = sysUserSubService.getOne(Wrappers.<SysUserSub>lambdaQuery()
+				.eq(SysUserSub::getUserId, userSignCertDTO.getUserId())
+				.eq(SysUserSub::getGigType, GigTypeEnum.TAX_HELPOR));
+		if (userSub == null) {
+			throw new RuntimeException("数据异常");
+		}
+		// 查询user
+		SysUser sysUser = sysUserService.getById(userSignCertDTO.getUserId());
+		// 查询dept
+		SysDept dept = sysDeptService.getById(sysUser.getDeptId());
+		// 基础信息
+		GigBaseInfoModel baseInfoModel = new GigBaseInfoModel();
+		baseInfoModel.setGigType(userSub.getGigType());
+		baseInfoModel.setBankCardOpt("captcha");
+		baseInfoModel.setNotifyUrl(taxNotifyConfig.getNotifyUrl());
+		// 用户信息
+		GigUserInfoModel userInfoModel = new GigUserInfoModel();
+		userInfoModel.setName(sysUser.getRealname());
+		userInfoModel.setUsername(sysUser.getUsername());
+		userInfoModel.setEntCode(dept.getTaxCode());
+		userInfoModel.setIdCard(sysUser.getIdCardNumber());
+		userInfoModel.setBankPhone(userSub.getBankPhone());
+		userInfoModel.setBankCard(userSub.getBankCardNumber());
+
+		GigInfoModel infoModel = new GigInfoModel();
+		infoModel.setBaseInfo(baseInfoModel);
+		infoModel.setUserInfo(userInfoModel);
+		BaseMap gigInfo = new BaseMap();
+		gigInfo.put(userSub.getGigType().name(), infoModel);
+		// 发送mq
+		rabbitMqClient.sendMessage(MqConstants.DIRECT_MODE_GIG_BANK_CARD_QUEUE, JSONUtil.toJsonStr(gigInfo));
+
+	}
+
+	/**
+	 * 绑卡确认
+	 *
+	 * @param userSignCertDTO
+	 */
+	@Override
+	@Transactional(rollbackFor = Exception.class)
+	public void bindCardConfirm(UserSignCertDTO userSignCertDTO) {
+		List<SysUserSub> userSubList = sysUserSubService.list(Wrappers.<SysUserSub>lambdaQuery()
+				.eq(SysUserSub::getUserId, userSignCertDTO.getUserId())
+				.in(SysUserSub::getGigType, userSignCertDTO.getGigTypeList()));
+		if (CollUtil.isEmpty(userSubList)) {
+			throw new RuntimeException("数据异常");
+		}
+		BaseMap gigInfo = new BaseMap();
+		userSubList.forEach(userSub -> {
+			// 新银行卡号缓存到redis
+			String cacheKey = String.format("%s_%s_%s", CacheConstants.BIND_CARD_CONFIRM_NEW_BANK_CARD, userSub.getUserId(), userSub.getGigType().name());
+			redisTemplate.opsForValue().set(cacheKey, userSignCertDTO);
+
+			// 查询user
+			SysUser sysUser = sysUserService.getById(userSignCertDTO.getUserId());
+			// 查询dept
+			SysDept dept = sysDeptService.getById(sysUser.getDeptId());
+			// 封装请求数据
+			if (GigTypeEnum.TAX_HELPOR.equals(userSub.getGigType())) {
+				gigInfo.put(userSub.getGigType().name(),
+						this.buildTaxHelperBindCardConfirmModel(sysUser, userSub, dept.getTaxCode(), userSignCertDTO.getBankCardNumber(), userSignCertDTO.getVerifyCode()));
+			} else if (GigTypeEnum.YEE.equals(userSub.getGigType())) {
+				gigInfo.put(userSub.getGigType().name(),
+						this.buildYeeBindCardConfirmModel(sysUser, userSub, dept.getTaxCode(), userSignCertDTO.getBankCardNumber()));
+			} else if (GigTypeEnum.OLADING.equals(userSub.getGigType())) {
+				gigInfo.put(userSub.getGigType().name(),
+						this.buildOladingBindCardConfirmModel(sysUser, userSub, dept.getTaxCode(), userSignCertDTO.getBankCardNumber()));
+			}
+			// 更新为进行中状态
+			SysUserSub updateUserSub = new SysUserSub();
+			updateUserSub.setId(userSub.getId());
+			updateUserSub.setCallbackStatus(GigCallBackStatus.IN_PROGRESS);
+			sysUserSubService.updateById(updateUserSub);
+		});
+
+		if (CollUtil.isNotEmpty(gigInfo)) {
+			// 发送mq
+			rabbitMqClient.sendMessage(MqConstants.DIRECT_MODE_GIG_BANK_CARD_QUEUE, JSONUtil.toJsonStr(gigInfo));
+		}
+	}
+
+	/**
+	 * 封装税邦云绑卡model
+	 *
+	 * @param sysUser
+	 * @param userSub
+	 * @param taxCode
+	 * @param newBankCard
+	 * @param verifyCode
+	 * @return
+	 */
+	private GigInfoModel buildTaxHelperBindCardConfirmModel(SysUser sysUser, SysUserSub userSub, String taxCode, String newBankCard, String verifyCode) {
+		// 基础信息
+		GigBaseInfoModel baseInfoModel = new GigBaseInfoModel();
+		baseInfoModel.setGigType(userSub.getGigType());
+		baseInfoModel.setGigChannel(userSub.getGigChannel());
+		baseInfoModel.setCaptcha(verifyCode);
+		baseInfoModel.setNotifyUrl(taxNotifyConfig.getNotifyUrl());
+		// 用户信息
+		GigUserInfoModel userInfoModel = new GigUserInfoModel();
+		userInfoModel.setName(sysUser.getRealname());
+		userInfoModel.setUsername(sysUser.getUsername());
+		userInfoModel.setEntCode(taxCode);
+		userInfoModel.setIdCard(sysUser.getIdCardNumber());
+		userInfoModel.setBankPhone(userSub.getBankPhone());
+		userInfoModel.setBankCard(userSub.getBankCardNumber());
+		userInfoModel.setNewBankCard(newBankCard);
+		userInfoModel.setAddress("北京市-房山区-长阳镇");
+
+		GigInfoModel infoModel = new GigInfoModel();
+		infoModel.setBaseInfo(baseInfoModel);
+		infoModel.setUserInfo(userInfoModel);
+
+		return infoModel;
+	}
+
+	/**
+	 * 封装易联换绑model
+	 *
+	 * @param sysUser
+	 * @param userSub
+	 * @param taxCode
+	 * @param newBankCard
+	 * @return
+	 */
+	private GigInfoModel buildYeeBindCardConfirmModel(SysUser sysUser, SysUserSub userSub, String taxCode, String newBankCard) {
+		// 基础信息
+		GigBaseInfoModel baseInfoModel = new GigBaseInfoModel();
+		baseInfoModel.setGigChannel(userSub.getGigChannel());
+		baseInfoModel.setGigType(userSub.getGigType());
+		// 用户信息
+		GigUserInfoModel userInfoModel = new GigUserInfoModel();
+		userInfoModel.setName(sysUser.getRealname());
+		userInfoModel.setUsername(sysUser.getUsername());
+		userInfoModel.setEntCode(taxCode);
+		userInfoModel.setIdCard(sysUser.getIdCardNumber());
+		userInfoModel.setBankPhone(userSub.getBankPhone());
+		userInfoModel.setBankCard(userSub.getBankCardNumber());
+		userInfoModel.setNewBankCard(newBankCard);
+		userInfoModel.setAddress("北京市-房山区-长阳镇");
+
+		GigInfoModel infoModel = new GigInfoModel();
+		infoModel.setBaseInfo(baseInfoModel);
+		infoModel.setUserInfo(userInfoModel);
+
+		return infoModel;
+	}
+
+	/**
+	 * 封装自由职家换绑model
+	 *
+	 * @param sysUser
+	 * @param userSub
+	 * @param taxCode
+	 * @param newBankCard
+	 * @return
+	 */
+	private GigInfoModel buildOladingBindCardConfirmModel(SysUser sysUser, SysUserSub userSub, String taxCode, String newBankCard) {
+		// 基础信息
+		GigBaseInfoModel baseInfoModel = new GigBaseInfoModel();
+		baseInfoModel.setGigChannel(userSub.getGigChannel());
+		baseInfoModel.setGigType(userSub.getGigType());
+		// 用户信息
+		GigUserInfoModel userInfoModel = new GigUserInfoModel();
+		userInfoModel.setName(sysUser.getRealname());
+		userInfoModel.setUsername(sysUser.getUsername());
+		userInfoModel.setEntCode(taxCode);
+		userInfoModel.setIdCard(sysUser.getIdCardNumber());
+		userInfoModel.setBankPhone(userSub.getBankPhone());
+		userInfoModel.setBankCard(userSub.getBankCardNumber());
+		userInfoModel.setNewBankCard(newBankCard);
+		userInfoModel.setAddress("北京市-房山区-长阳镇"); // TODO
+
+		GigInfoModel infoModel = new GigInfoModel();
+		infoModel.setBaseInfo(baseInfoModel);
+		infoModel.setUserInfo(userInfoModel);
+
+		return infoModel;
+	}
+}

+ 85 - 0
hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/service/impl/SysDeptSubServiceImpl.java

@@ -16,18 +16,29 @@
  */
 package com.qunzhixinxi.hnqz.admin.service.impl;
 
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.qunzhixinxi.hnqz.admin.api.entity.SysDept;
 import com.qunzhixinxi.hnqz.admin.entity.SysDeptSub;
+import com.qunzhixinxi.hnqz.admin.entity.WmDaAgent;
+import com.qunzhixinxi.hnqz.admin.entity.WmDaDrugEnt;
 import com.qunzhixinxi.hnqz.admin.entity.input.DeptSubLimitAmountInput;
 import com.qunzhixinxi.hnqz.admin.entity.input.SettleAmountMonitorInput;
 import com.qunzhixinxi.hnqz.admin.entity.output.SettleAmountMonitorOutput;
+import com.qunzhixinxi.hnqz.admin.enums.DelEnum;
+import com.qunzhixinxi.hnqz.admin.enums.EnableEnum;
+import com.qunzhixinxi.hnqz.admin.enums.SubjectTypeEnum;
+import com.qunzhixinxi.hnqz.admin.mapper.SysDeptMapper;
 import com.qunzhixinxi.hnqz.admin.mapper.SysDeptSubMapper;
+import com.qunzhixinxi.hnqz.admin.mapper.WmDaAgentMapper;
+import com.qunzhixinxi.hnqz.admin.mapper.WmDaDrugEntMapper;
 import com.qunzhixinxi.hnqz.admin.service.SysDeptSubService;
 import com.qunzhixinxi.hnqz.common.core.util.R;
 import lombok.AllArgsConstructor;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
+import java.time.LocalDateTime;
 import java.util.List;
 
 /**
@@ -43,6 +54,12 @@ public class SysDeptSubServiceImpl extends ServiceImpl<SysDeptSubMapper, SysDept
 
 	private final SysDeptSubMapper sysDeptSubMapper;
 
+	private final SysDeptMapper sysDeptMapper;
+
+	private final WmDaAgentMapper wmDaAgentMapper;
+
+	private final WmDaDrugEntMapper wmDaDrugEntMapper;
+
 	@Override
 	@Transactional
 	public R updateSubLimitAmount(DeptSubLimitAmountInput input) {
@@ -64,4 +81,72 @@ public class SysDeptSubServiceImpl extends ServiceImpl<SysDeptSubMapper, SysDept
 	public List<SettleAmountMonitorOutput> getDeptAmountMonitor(SettleAmountMonitorInput input) {
 		return sysDeptSubMapper.getDeptAmountMonitor(input);
 	}
+
+	/**
+	 * 结算管理配置
+	 *
+	 * @param input
+	 */
+	@Override
+	@Transactional(rollbackFor = Exception.class)
+	public void saveSettleConfig(DeptSubLimitAmountInput input) {
+		// 更新结算主体
+		String[] subTypeArr = input.getSubList().stream()
+				.map(SysDeptSub::getSubjectType)
+				.toArray(String[]::new);
+		SysDept dept = sysDeptMapper.selectById(input.getDeptId());
+		if (dept.getLevel() == 2) {
+			// 药企
+			wmDaDrugEntMapper.update(null, Wrappers.<WmDaDrugEnt>lambdaUpdate()
+					.eq(WmDaDrugEnt::getDeptId, String.valueOf(input.getDeptId()))
+					.eq(WmDaDrugEnt::getEnableFlag, EnableEnum.ENABLE.val())
+					.eq(WmDaDrugEnt::getDelFlag, DelEnum.NOT_DEL.val())
+					.set(WmDaDrugEnt::getSubjectType, subTypeArr));
+		} else if (dept.getLevel() == 3) {
+			// 更新agent
+			wmDaAgentMapper.update(null, Wrappers.<WmDaAgent>lambdaUpdate()
+					.eq(WmDaAgent::getDeptId, String.valueOf(input.getDeptId()))
+					.eq(WmDaAgent::getEnableFlag, EnableEnum.ENABLE.val())
+					.eq(WmDaAgent::getDelFlag, DelEnum.NOT_DEL.val())
+					.set(WmDaAgent::getSubjectType, subTypeArr));
+		}
+		// 更新dept
+		sysDeptMapper.update(null, Wrappers.<SysDept>lambdaUpdate()
+				.eq(SysDept::getDeptId, input.getDeptId())
+				.set(SysDept::getSubjectType, subTypeArr));
+		// 更新/保存deptSub
+		// 先设置所有deptSub为无效
+		SysDeptSub deptSubWhere = new SysDeptSub();
+		deptSubWhere.setDeptId(input.getDeptId());
+		sysDeptSubMapper.update(deptSubWhere, Wrappers.<SysDeptSub>lambdaUpdate()
+				.eq(SysDeptSub::getDeptId, input.getDeptId())
+				.set(SysDeptSub::getEnableFlag, SubjectTypeEnum.ENABLE_FLAG_FALSE.getCode()));
+
+		input.getSubList().forEach(sysDeptSub -> {
+			SysDeptSub queryDeptSub = sysDeptSubMapper.selectOne(Wrappers.<SysDeptSub>lambdaQuery()
+					.eq(SysDeptSub::getDeptId, input.getDeptId())
+					.eq(SysDeptSub::getSubjectType, sysDeptSub.getSubjectType()));
+			if (queryDeptSub != null) {
+				// 更新
+				SysDeptSub updateDeptSub = new SysDeptSub();
+				updateDeptSub.setSubId(queryDeptSub.getSubId());
+				updateDeptSub.setSubjectChannel(sysDeptSub.getSubjectChannel() == null ? 0 : sysDeptSub.getSubjectChannel());
+				updateDeptSub.setSubjectInvoiceCategory(sysDeptSub.getSubjectInvoiceCategory());
+				updateDeptSub.setLimitAmount(sysDeptSub.getLimitAmount());
+				updateDeptSub.setEnableFlag(SubjectTypeEnum.ENABLE_FLAG_TRUE.getCode());
+				updateDeptSub.setUpdateTime(LocalDateTime.now());
+				sysDeptSubMapper.updateById(updateDeptSub);
+			} else {
+				// 新增
+				SysDeptSub insertDeptSub = new SysDeptSub();
+				insertDeptSub.setDeptId(input.getDeptId());
+				insertDeptSub.setSubjectType(sysDeptSub.getSubjectType());
+				insertDeptSub.setSubjectChannel(sysDeptSub.getSubjectChannel() == null ? 0 : sysDeptSub.getSubjectChannel());
+				insertDeptSub.setSubjectInvoiceCategory(sysDeptSub.getSubjectInvoiceCategory());
+				insertDeptSub.setLimitAmount(sysDeptSub.getLimitAmount());
+				insertDeptSub.setEnableFlag(SubjectTypeEnum.ENABLE_FLAG_TRUE.getCode());
+				sysDeptSubMapper.insert(insertDeptSub);
+			}
+		});
+	}
 }

+ 17 - 0
hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/service/impl/SysUserSubServiceImpl.java

@@ -0,0 +1,17 @@
+package com.qunzhixinxi.hnqz.admin.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.qunzhixinxi.hnqz.admin.entity.SysUserSub;
+import com.qunzhixinxi.hnqz.admin.mapper.SysUserSubMapper;
+import com.qunzhixinxi.hnqz.admin.service.SysUserSubService;
+import org.springframework.stereotype.Service;
+
+/**
+ * 用户签约认证主体信息服务
+ *
+ * @author lixuesong
+ * @date 2022年03月01日 18:49
+ */
+@Service
+public class SysUserSubServiceImpl extends ServiceImpl<SysUserSubMapper, SysUserSub> implements SysUserSubService {
+}

+ 31 - 19
hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/service/impl/WmDaAgentServiceImpl.java

@@ -16,6 +16,7 @@
  */
 package com.qunzhixinxi.hnqz.admin.service.impl;
 
+import cn.hutool.core.collection.CollUtil;
 import cn.hutool.core.collection.CollectionUtil;
 import com.baomidou.mybatisplus.core.conditions.Wrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
@@ -256,7 +257,16 @@ public class WmDaAgentServiceImpl extends ServiceImpl<WmDaAgentMapper, WmDaAgent
 		//
 		// });
 
-
+		wmDaAgentIPage.getRecords().forEach(agent -> {
+			SysDeptSub sysDeptSub = new SysDeptSub();
+			sysDeptSub.setDeptId(Integer.valueOf(agent.getDeptId()));
+			sysDeptSub.setEnableFlag(SubjectTypeEnum.ENABLE_FLAG_TRUE.getCode());
+			List<SysDeptSub> subList = sysDeptSubMapper.selectList(Wrappers.query(sysDeptSub));
+			if (CollUtil.isNotEmpty(subList)) {
+				String[] subTypeArr = subList.stream().map(SysDeptSub::getSubjectType).toArray(String[]::new);
+				agent.setSubjectType(subTypeArr);
+			}
+		});
 
 		return wmDaAgentIPage;
 	}
@@ -544,24 +554,26 @@ public class WmDaAgentServiceImpl extends ServiceImpl<WmDaAgentMapper, WmDaAgent
 					.eq(SysDeptSub::getDeptId,sysDept.getDeptId())
 					.set(SysDeptSub::getEnableFlag, SubjectTypeEnum.ENABLE_FLAG_FALSE.getCode()));
 
-			for (Map.Entry<String, Integer> entry : wmDaAgent.getSubjectTypeAndChannel().entrySet()){
-				SysDeptSub condition = new SysDeptSub();
-				condition.setDeptId(sysDept.getDeptId());
-				condition.setSubjectType(entry.getKey());
-				condition.setSubjectChannel(entry.getValue());
-				SysDeptSub existSub = sysDeptSubMapper.selectOne(Wrappers.query(condition));
-				if(null != existSub){
-					existSub.setEnableFlag(SubjectTypeEnum.ENABLE_FLAG_TRUE.getCode());
-					existSub.setUpdateTime(LocalDateTime.now());
-					sysDeptSubMapper.updateById(existSub);
-				}else {
-					existSub = new SysDeptSub();
-					existSub.setEnableFlag(SubjectTypeEnum.ENABLE_FLAG_TRUE.getCode());
-					existSub.setDeptId(sysDept.getDeptId());
-					existSub.setSubjectType(entry.getKey());
-					existSub.setSubjectChannel(entry.getValue());
-					existSub.setUpdateTime(LocalDateTime.now());
-					sysDeptSubMapper.insert(existSub);
+			if (CollUtil.isNotEmpty(wmDaAgent.getSubjectTypeAndChannel())) {
+				for (Map.Entry<String, Integer> entry : wmDaAgent.getSubjectTypeAndChannel().entrySet()) {
+					SysDeptSub condition = new SysDeptSub();
+					condition.setDeptId(sysDept.getDeptId());
+					condition.setSubjectType(entry.getKey());
+					condition.setSubjectChannel(entry.getValue());
+					SysDeptSub existSub = sysDeptSubMapper.selectOne(Wrappers.query(condition));
+					if (null != existSub) {
+						existSub.setEnableFlag(SubjectTypeEnum.ENABLE_FLAG_TRUE.getCode());
+						existSub.setUpdateTime(LocalDateTime.now());
+						sysDeptSubMapper.updateById(existSub);
+					} else {
+						existSub = new SysDeptSub();
+						existSub.setEnableFlag(SubjectTypeEnum.ENABLE_FLAG_TRUE.getCode());
+						existSub.setDeptId(sysDept.getDeptId());
+						existSub.setSubjectType(entry.getKey());
+						existSub.setSubjectChannel(entry.getValue());
+						existSub.setUpdateTime(LocalDateTime.now());
+						sysDeptSubMapper.insert(existSub);
+					}
 				}
 			}
 

+ 27 - 20
hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/service/impl/WmDaDrugEntServiceImpl.java

@@ -16,6 +16,8 @@
  */
 package com.qunzhixinxi.hnqz.admin.service.impl;
 
+import cn.hutool.core.collection.CollUtil;
+import cn.hutool.core.util.ArrayUtil;
 import com.baomidou.mybatisplus.core.conditions.Wrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
@@ -82,18 +84,18 @@ public class WmDaDrugEntServiceImpl extends ServiceImpl<WmDaDrugEntMapper, WmDaD
 			if(sysDeptService.saveDept(sysDept) > 0){
 
 				Map<String, Integer> subjectTypeAndChannel = entity.getSubjectTypeAndChannel();
-
-				for (Map.Entry<String, Integer> entry : subjectTypeAndChannel.entrySet()){
-					SysDeptSub deptSub = new SysDeptSub();
-					deptSub.setDeptId(sysDept.getDeptId());
-					deptSub.setSubjectChannel(entry.getValue());
-					deptSub.setSubjectType(entry.getKey());
-					deptSub.setEnableFlag(SubjectTypeEnum.ENABLE_FLAG_TRUE.getCode());
-					deptSub.setUpdateTime(sysDept.getCreateTime());
-					sysDeptSubMapper.insert(deptSub);
-
+				if (CollUtil.isNotEmpty(subjectTypeAndChannel)) {
+					for (Map.Entry<String, Integer> entry : subjectTypeAndChannel.entrySet()) {
+						SysDeptSub deptSub = new SysDeptSub();
+						deptSub.setDeptId(sysDept.getDeptId());
+						deptSub.setSubjectChannel(entry.getValue());
+						deptSub.setSubjectType(entry.getKey());
+						deptSub.setEnableFlag(SubjectTypeEnum.ENABLE_FLAG_TRUE.getCode());
+						deptSub.setUpdateTime(sysDept.getCreateTime());
+						sysDeptSubMapper.insert(deptSub);
+
+					}
 				}
-
 				return true;
 			}
 			return  false;
@@ -156,14 +158,16 @@ public class WmDaDrugEntServiceImpl extends ServiceImpl<WmDaDrugEntMapper, WmDaD
 			sysDeptRelationService.saveBatch(newList);
 
 			// 创建结算渠道和通道
-			for (Map.Entry<String, Integer> entry : entity.getSubjectTypeAndChannel().entrySet()){
-				SysDeptSub deptSub = new SysDeptSub();
-				deptSub.setDeptId(sysDept.getDeptId());
-				deptSub.setSubjectType(entry.getKey());
-				deptSub.setSubjectChannel(entry.getValue());
-				deptSub.setUpdateTime(LocalDateTime.now());
-				deptSub.setEnableFlag(SubjectTypeEnum.ENABLE_FLAG_TRUE.getCode());
-				sysDeptSubMapper.insert(deptSub);
+			if (CollUtil.isNotEmpty(entity.getSubjectTypeAndChannel())) {
+				for (Map.Entry<String, Integer> entry : entity.getSubjectTypeAndChannel().entrySet()) {
+					SysDeptSub deptSub = new SysDeptSub();
+					deptSub.setDeptId(sysDept.getDeptId());
+					deptSub.setSubjectType(entry.getKey());
+					deptSub.setSubjectChannel(entry.getValue());
+					deptSub.setUpdateTime(LocalDateTime.now());
+					deptSub.setEnableFlag(SubjectTypeEnum.ENABLE_FLAG_TRUE.getCode());
+					sysDeptSubMapper.insert(deptSub);
+				}
 			}
 
 			return true;
@@ -203,9 +207,12 @@ public class WmDaDrugEntServiceImpl extends ServiceImpl<WmDaDrugEntMapper, WmDaD
 		IPage<WmDaDrugEnt> listIPage = wmDaDrugEntMapper.selectPage(page, wmDaDrugEnt);
 
 		listIPage.getRecords().forEach(ent -> {
-				Map<String, Integer> collect = sysDeptSubMapper.selectList(Wrappers.<SysDeptSub>lambdaQuery().eq(SysDeptSub::getDeptId, ent.getDeptId()))
+				Map<String, Integer> collect = sysDeptSubMapper.selectList(Wrappers.<SysDeptSub>lambdaQuery()
+						.eq(SysDeptSub::getDeptId, ent.getDeptId())
+						.eq(SysDeptSub::getEnableFlag, SubjectTypeEnum.ENABLE_FLAG_TRUE.getCode()))
 						.stream()
 						.collect(Collectors.toMap(SysDeptSub::getSubjectType, SysDeptSub::getSubjectChannel));
+				ent.setSubjectType(collect.keySet().toArray(new String[0]));
 				ent.setSubjectTypeAndChannel(collect);
 		});
 

+ 39 - 0
hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/service/impl/WmSettlementServiceImpl.java

@@ -1,5 +1,7 @@
 package com.qunzhixinxi.hnqz.admin.service.impl;
 
+import cn.hutool.core.map.MapUtil;
+import cn.hutool.json.JSONUtil;
 import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
@@ -7,6 +9,8 @@ import com.qunzhixinxi.hnqz.admin.api.constant.CacheConstants;
 import com.qunzhixinxi.hnqz.admin.api.entity.SysUser;
 import com.qunzhixinxi.hnqz.admin.entity.*;
 import com.qunzhixinxi.hnqz.admin.entity.input.SettleNoteStatusOutput;
+import com.qunzhixinxi.hnqz.admin.enums.GigTypeEnum;
+import com.qunzhixinxi.hnqz.admin.enums.RenlijiaCertStatus;
 import com.qunzhixinxi.hnqz.admin.mapper.WmSettleAccountReceiveMapper;
 import com.qunzhixinxi.hnqz.admin.service.*;
 import com.qunzhixinxi.hnqz.common.ding.entity.*;
@@ -19,7 +23,10 @@ import org.springframework.data.redis.core.RedisTemplate;
 import org.springframework.stereotype.Service;
 
 import java.time.LocalDateTime;
+import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
+import java.util.concurrent.TimeUnit;
 
 
 @Service
@@ -28,6 +35,8 @@ import java.util.List;
 public class WmSettlementServiceImpl implements WmSettlementService {
 
 	private final SysUserService sysUserService;
+	
+	private final SysUserSubService sysUserSubService;
 
 	private final WmImportUserService importUserService;
 
@@ -84,6 +93,8 @@ public class WmSettlementServiceImpl implements WmSettlementService {
 					updateUser.setCertRemark(item.getRemark());
 					updateUser.setRljCertStatus(item.getStatus());
 					sysUserService.updateById(updateUser);
+					// 更新usersub
+					updateUserSub(item, updateUser);
 				}
 
 
@@ -177,4 +188,32 @@ public class WmSettlementServiceImpl implements WmSettlementService {
 
 		return NotifyResponse.success();
 	}
+
+	/**
+	 * 更新usersub对应的人力家认证状态
+	 *
+	 * @param item
+	 * @param updateUser
+	 */
+	private void updateUserSub(EmployCheckNotifyDataItem item, SysUser updateUser) {
+		SysUserSub userSub = sysUserSubService.getOne(Wrappers.<SysUserSub>lambdaQuery()
+				.eq(SysUserSub::getUserId, updateUser.getUserId())
+				.eq(SysUserSub::getGigType, GigTypeEnum.REN_LI_JIA));
+		if (userSub != null) {
+			SysUserSub updateUserSub = new SysUserSub();
+			updateUserSub.setId(userSub.getId());
+			updateUserSub.setCertRemark(item.getRemark());
+			updateUserSub.setUpdateTime(LocalDateTime.now());
+			updateUserSub.setUpdateUser(0);
+			sysUserSubService.updateById(updateUserSub);
+			// 结果放到redis
+			String key = CacheConstants.USER_SIGN_CERT_RESPONSE_KEY + userSub.getUserId();
+			Map<String, String> subMap = new HashMap<>();
+			subMap.put("certStatus", RenlijiaCertStatus.resolve(item.getStatus()).name());
+			subMap.put("message", item.getRemark());
+			Map<String, Object> result = MapUtil.newHashMap(1);
+			result.put("REN_LI_JIA", subMap);
+			redisTemplate.opsForValue().set(key, JSONUtil.toJsonStr(result), 1, TimeUnit.MINUTES);
+		}
+	}
 }

+ 41 - 0
hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/util/Base64Util.java

@@ -1,5 +1,7 @@
 package com.qunzhixinxi.hnqz.admin.util;
 
+import cn.hutool.http.HttpUtil;
+
 import javax.imageio.ImageIO;
 import java.awt.image.BufferedImage;
 import java.io.ByteArrayOutputStream;
@@ -17,4 +19,43 @@ public class Base64Util {
 		return Base64.getEncoder().encodeToString(outputStream.toByteArray());
 	}
 
+	/**
+	 * 将指定url的图片转换为base64字符串
+	 *
+	 * @param url
+	 * @return
+	 */
+	public static String picToBase64(String url){
+		ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
+		// false:是否关闭输出流
+		HttpUtil.download(url,outputStream,true);
+
+		byte[] bytes = outputStream.toByteArray();
+
+		StringBuffer base64 = new StringBuffer();
+		// 用于说明文件格式
+		base64.append("data:").append("image/").append(url.substring(url.lastIndexOf(".") + 1)).append(";base64,");
+		base64.append(Base64.getEncoder().encodeToString(bytes));
+		return base64.toString();
+	}
+
+	/**
+	 * 将指定url的视频转换为base64字符串
+	 *
+	 * @param url
+	 * @return
+	 */
+	public static String videoToBase64(String url){
+		ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
+		// false:是否关闭输出流
+		HttpUtil.download(url,outputStream,true);
+
+		byte[] bytes = outputStream.toByteArray();
+
+		StringBuffer base64 = new StringBuffer();
+		// 用于说明文件格式
+		base64.append("data:").append("video/").append(url.substring(url.lastIndexOf(".") + 1)).append(";base64,");
+		base64.append(Base64.getEncoder().encodeToString(bytes));
+		return base64.toString();
+	}
 }

+ 44 - 0
hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/util/HMACSignProvider.java

@@ -0,0 +1,44 @@
+package com.qunzhixinxi.hnqz.admin.util;
+
+import org.apache.commons.codec.binary.Base64;
+
+import javax.crypto.Mac;
+import javax.crypto.SecretKey;
+import javax.crypto.spec.SecretKeySpec;
+import java.nio.charset.StandardCharsets;
+import java.util.LinkedList;
+import java.util.List;
+
+public class HMACSignProvider {
+
+    public List<String> getMechanismNames() {
+        List<String> list = new LinkedList<>();
+        list.add("HmacSHA256");
+        return list;
+    }
+
+    public String sign(String type, String privateKey, String data) throws Exception {
+        try {
+            SecretKey secretKey = new SecretKeySpec(privateKey.getBytes(StandardCharsets.UTF_8),
+                    type);
+            Mac mac = Mac.getInstance(secretKey.getAlgorithm());
+            mac.init(secretKey);
+            return Base64.encodeBase64String(mac.doFinal(data.getBytes(StandardCharsets.UTF_8)));
+        } catch (Exception e) {
+            throw e;
+        }
+
+    }
+
+    public boolean verfy(String type, String publicKey, String data, String sign) throws Exception {
+        try {
+            SecretKey secretKey = new SecretKeySpec(publicKey.getBytes(StandardCharsets.UTF_8),
+                    type);
+            Mac mac = Mac.getInstance(secretKey.getAlgorithm());
+            mac.init(secretKey);
+            return Base64.encodeBase64String(mac.doFinal(data.getBytes(StandardCharsets.UTF_8))).equals(sign);
+        } catch (Exception e) {
+            throw e;
+        }
+    }
+}