Browse Source

feat: 福建企赋结算

lixuesong 1 năm trước cách đây
mục cha
commit
bfd9f48668

+ 1 - 0
hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/enums/SubjectTypeEnum.java

@@ -19,6 +19,7 @@ public enum SubjectTypeEnum {
 	TYPE_HUI_QI_YUN("6", "汇企云"),
 	TYPE_ZHONG_YI_YUN("7", "众蚁云"),
 	TYPE_ZHONG_ZHI("8", "中智"),
+	TYPE_QI_FU("9", "福建企赋"),
 
 	ENABLE_FLAG_FALSE("0", "无效"),
 	ENABLE_FLAG_TRUE("1", "有效"),

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

@@ -147,6 +147,9 @@ public class GigSignCertReceiver extends BaseRabbiMqHandler<String> {
 							case ZHONG_ZHI:
 								this.zhongZhiHandler(user, dept, subjectResult);
 								break;
+							case QI_FU:
+								this.qifuHandler(user, dept, subjectResult);
+								break;
 							default:
 						}
 					});
@@ -163,6 +166,52 @@ public class GigSignCertReceiver extends BaseRabbiMqHandler<String> {
         });
     }
 
+	/**
+	 * 福建企赋结果处理
+	 *
+	 * @param user          用户
+	 * @param dept          部门
+	 * @param subjectResult 结果
+	 */
+	private void qifuHandler(SysUser user, SysDept dept, JSONObject subjectResult) {
+		String code = subjectResult.getStr("code");
+		String certStatus = subjectResult.getStr("certStatus");
+		LocalDateTime now = LocalDateTime.now();
+		QiFuCertStatus qiFuCertStatus = Enum.valueOf(QiFuCertStatus.class, certStatus);
+
+		// 拼接更新条件
+		LambdaUpdateWrapper<SysUserSub> updateWrapper = Wrappers.<SysUserSub>lambdaUpdate()
+				.eq(SysUserSub::getUserId, user.getUserId())
+				.eq(SysUserSub::getDeptId, dept.getDeptId())
+				.eq(SysUserSub::getSubjectLocation, SubjectLocation.HUI_QI_YUN)
+				.eq(SysUserSub::getGigType, GigTypeEnum.HUI_QI_YUN)
+				.set(SysUserSub::getCallbackStatus, GigCallBackStatus.RETURNED)
+				.set(SysUserSub::getUpdateTime, now)
+				.set(SysUserSub::getCallbackTime, now)
+				.set(SysUserSub::getUpdateUser, 0)
+				.set(SysUserSub::getCertRemark, JSONUtil.toJsonStr(subjectResult));
+
+		if (HUI_QI_YUN_SUCCESS_CODE.equals(code)) {
+			if (QiFuCertStatus.SIGN.equals(qiFuCertStatus)) {
+				// 汇企云已签约 即对应这里的已认证
+				updateWrapper.set(SysUserSub::getCertStatus, HuiQiYunCertStatus.CERT.getCode());
+			} else {
+				updateWrapper.set(SysUserSub::getCertStatus, qiFuCertStatus.getCode());
+			}
+		}
+
+		sysUserSubService.update(updateWrapper);
+
+		// 结果放到redis
+		Map<String, Map<String, String>> resultMap = new HashMap<>(1);
+		Map<String, String> subMap = new HashMap<>(1);
+		subMap.put("certStatus", certStatus);
+		resultMap.put(SubjectLocation.QI_FU.getType(), subMap);
+		String key = CacheConstants.USER_SIGN_CERT_RESPONSE_KEY + user.getUserId();
+		log.info("缓存认证结果到redis:{}", JSONUtil.toJsonStr(resultMap));
+		redisTemplate.opsForValue().set(key, JSONUtil.toJsonStr(resultMap), 1, TimeUnit.MINUTES);
+	}
+
 	/**
 	 * 众蚁云结果处理
 	 *

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

@@ -217,6 +217,7 @@ public class SysUserServiceImpl extends ServiceImpl<SysUserMapper, SysUser> impl
 				case HUI_QI_YUN:
 				case ZHONG_YI_YUN:
 				case ZHONG_ZHI:
+				case QI_FU:
 					if (!Objects.equals(userSub.getCertStatus(), DingEnum.CER_STATUS_1.getType())) {
 						throw new RuntimeException(user.getRealname() + "未认证,不能发起结算");
 					}

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

@@ -629,6 +629,10 @@ public class WmPayOffServiceImpl extends ServiceImpl<WmPayOffMapper, WmPayOff> i
 		else if (SubjectTypeEnum.TYPE_ZHONG_ZHI.getCode().equals(subType)) {
 			return this.settleByZhongZhi(input, wmScorePackage, taxCode, operator);
 		}
+		// 福建企赋
+		else if (SubjectTypeEnum.TYPE_QI_FU.getCode().equals(subType)) {
+			return this.settleByQiFu(input, wmScorePackage, taxCode, operator, sysDeptSub.getPathNo());
+		}
 		// 税邦云
 		else {
 			log.info("税邦云结算开始-获取会员所属企业的统一社会信用代码:{} ", taxCode);
@@ -637,6 +641,212 @@ public class WmPayOffServiceImpl extends ServiceImpl<WmPayOffMapper, WmPayOff> i
 
 	}
 
+	/**
+	 * 福建企赋结算操作
+	 *
+	 * @param input          结算数据
+	 * @param wmScorePackage 积分包
+	 * @param taxCode        税号
+	 * @param operator       操作员
+	 * @return 结果
+	 */
+	private R<?> settleByQiFu(WmScorePackageSettleInput input,
+								  WmScorePackage wmScorePackage,
+								  String taxCode,
+								  HnqzUser operator,
+								  String[] pathNo) {
+
+		List<WmScorePackageSettleNote> notes = input.getNotes();
+		StringBuilder noticeInfo = new StringBuilder();
+
+		// WmScorePackageSettleNote
+		for (WmScorePackageSettleNote note : notes) {
+			note.setInvoiceType(input.getInvoiceCategory());
+			note.setCategoryName(StrUtil.isNotBlank(input.getCategoryName()) ? input.getCategoryName() : note.getCategoryName());
+			note.setSubToGigTime(LocalDateTime.now());
+		}
+		noteService.updateBatchById(notes);
+
+
+		for (WmScorePackageSettleNote note : notes) {
+			SysUser sysUser = sysUserMapper.selectById(note.getUserId());
+
+			Integer deptId;
+			// MAH结算校验原企业认证信息
+			if (input.getMahSettleDeptId() != null) {
+				deptId = sysUser.getDeptId();
+			} else {
+				deptId = operator.getDeptId();
+			}
+
+			SysUserSub userSub = sysUserSubMapper.selectOne(Wrappers.<SysUserSub>lambdaQuery()
+					.eq(SysUserSub::getUserId, sysUser.getUserId())
+					.eq(SysUserSub::getSubjectLocation, input.getSubjectLocation())
+					.eq(SysUserSub::getDeptId, deptId)
+			);
+
+			if (userSub == null) {
+				log.info("结算对象-" + sysUser.getRealname() + ":认证信息不存在,不能结算");
+				return R.failed("结算对象-" + sysUser.getRealname() + ":认证信息不存在,不能结算");
+			}
+
+			if (!Objects.equals(userSub.getCertStatus(), DingEnum.CER_STATUS_1.getType())) {
+				return R.failed(sysUser.getRealname() + "人员未认证或未绑卡,不能结算");
+			}
+
+			if (Boolean.TRUE.equals(redisTemplate.hasKey(CacheConstants.SETTLE_PACKAGE_KEY + note.getId()))) {
+				return R.failed("结算对象-" + sysUser.getRealname() + ":正在结算,请勿重复结算");
+			}
+
+			if (DingEnum.NOTE_STATUS_SUCCESS.getType().equals(note.getSettleNoteStatus())) {
+				log.info("结算对象-" + sysUser.getRealname() + ":已结算,请勿重复结算");
+				return R.failed("结算对象-" + sysUser.getRealname() + ":已结算,请勿重复结算");
+			}
+			if (DingEnum.NOTE_STATUS_SUBMIT.getType().equals(note.getSettleNoteStatus())) {
+				log.info("结算对象-" + sysUser.getRealname() + ":已提交,请等待耐心结算结果");
+				return R.failed("结算对象-" + sysUser.getRealname() + ":已提交,请等待耐心结算结果");
+			}
+		}
+
+		for (WmScorePackageSettleNote note : notes) {
+			// 加锁
+			redisTemplate.opsForValue().set(CacheConstants.SETTLE_PACKAGE_KEY + note.getId(),
+					note.getId(), CacheConstants.SETTLE_TIME, TimeUnit.DAYS);
+
+			SysUser sysUser = sysUserMapper.selectById(note.getUserId());
+
+			try {
+
+				// 获取请求token
+				String url = String.format(GIG_TOKEN_URL, upmsConfig.getGigServiceUrl());
+				log.info("远端请求gig-token:{}", url);
+				ResponseEntity<String> tokenResult = new RestTemplate().getForEntity(url, String.class,
+						String.valueOf(operator.getDeptId()), "settle", String.valueOf(operator.getId()));
+				log.warn("获取结算token:{}", tokenResult.getBody());
+				if (!JSONUtil.isJson(tokenResult.getBody())) {
+					return R.failed("获取结算token失败");
+				}
+
+				JSONObject jsonObject = JSONUtil.parseObj(tokenResult.getBody());
+
+				if (jsonObject.getInt("code") != 0 || StrUtil.isBlank(jsonObject.getStr("data"))) {
+					return R.failed("获取结算token失败");
+				}
+
+				String token = jsonObject.getStr("data");
+
+				// 间隔100毫秒
+				Thread.sleep(100);
+
+				// 封装结算参数
+				Map<String, Object> params = new HashMap<>();
+				params.put("token", token);
+				params.put("tenantId", operator.getDeptId());
+				params.put("operatorId", operator.getId());
+				params.put("requestId", RandomStringUtils.randomAlphabetic(12));
+				params.put("taskName", wmScorePackage.getScorePackageName() + "_" + System.currentTimeMillis());
+				params.put("amount", String.valueOf(note.getSettleAmount().doubleValue()));
+				params.put("taskStartTime", wmScorePackage.getCreateTime().toLocalDate());
+				params.put("taskEndTime", wmScorePackage.getUpdateTime().toLocalDate());
+				params.put("taskLocation", "要易云");
+				params.put("username", sysUser.getUsername());
+				params.put("idCard", sysUser.getIdCardNumber());
+				params.put("idCardType","ID_CARD");
+				params.put("realName", sysUser.getRealname());
+				params.put("bankCard", sysUser.getBankCardNumber());
+				// 市场推广
+				params.put("tagId", upmsConfig.getTagId());
+				params.put("taskInvoiceContent", note.getCategoryName());
+				params.put("endType", "CSO");
+				params.put("enterpriseCode", taxCode);
+				params.put("subjectType", "QI_FU");
+				params.put("channel", "DEFAULT");
+				params.put("subjectLocation", input.getSubjectLocation().getType());
+				params.put("notes", pathNo[0]);
+				params.put("pathNo", pathNo[0]);
+				params.put("notifyUrl", String.format("%s/admin/gig-third-api/qifu", upmsConfig.getClientUrl()));
+
+				if (SubjectLocation.JIN_YUAN.equals(input.getSubjectLocation())) {
+					params.put("taxMode", "GENERAL");
+					params.put("transactionModel", "SUPERVISE");
+				}
+				// 海南飞亿 和 河南薪泰梓
+				else {
+					params.put("taxMode", "SPECIAL");
+					params.put("transactionModel", "CHANNEL");
+				}
+
+				// 发起结算
+				String url1 = String.format(GIG_SETTLE_URL, upmsConfig.getGigServiceUrl());
+				log.info("远端请求gig-settle:{}", url);
+				HttpHeaders headers = new HttpHeaders();
+				headers.setContentType(MediaType.APPLICATION_JSON);
+				log.info("福建企赋结算req: {}", params);
+				HttpEntity<String> result = new RestTemplate().exchange(url1, HttpMethod.POST, new HttpEntity<>(params, headers), String.class);
+				log.info("福建企赋结算resp:{}", result.getBody());
+				if (!JSONUtil.isJson(result.getBody())) {
+					return R.failed("结算失败");
+				}
+
+				JSONObject settleObj = JSONUtil.parseObj(result.getBody());
+
+
+				if (Objects.equals(settleObj.getInt("code"), CommonConstants.SUCCESS)) {
+					JSONObject dataJsonObj = settleObj.getJSONObject("data");
+					log.info("福建企赋结算提交成功: {}", settleObj.getStr("data"));
+					note.setUpdateTime(LocalDateTime.now());
+					//streamId 获取不到
+					if (dataJsonObj != null) {
+						String requestId = dataJsonObj.getStr("requestId");
+						if (StrUtil.isNotBlank(requestId)) {
+							note.setSettleNoteStatus(DingEnum.NOTE_STATUS_SUBMIT.getType());
+							// 新增字段streamId
+							note.setStreamId(requestId);
+							noticeInfo.append(sysUser.getRealname()).append(":提交结算成功;");
+						} else {
+							note.setSettleNoteStatus(DingEnum.NOTE_STATUS_FAIL.getType());
+							noticeInfo.append(sysUser.getRealname()).append(":" + dataJsonObj.getStr("message"));
+							redisTemplate.delete(CacheConstants.SETTLE_PACKAGE_KEY + note.getId());
+						}
+					} else {
+						log.warn("福建企赋结算提交成功 data 获取不到: {}", note.getSettleNo());
+						noticeInfo.append(sysUser.getRealname()).append(":提交结算成功,业务流水号获取不到,请联系管理员;");
+						redisTemplate.delete(CacheConstants.SETTLE_PACKAGE_KEY + note.getId());
+					}
+				} else {
+					log.warn("福建企赋结算失败: {}", note.getSettleNo());
+					note.setUpdateTime(LocalDateTime.now());
+					note.setSettleNoteStatus(DingEnum.NOTE_STATUS_FAIL.getType());
+					noticeInfo.append(sysUser.getRealname()).append(":结算提交失败-").append(settleObj.getStr("msg")).append(";");
+
+					log.info("认证状态异常,结算解锁settleNoteId:{}", note.getId());
+					redisTemplate.delete(CacheConstants.SETTLE_PACKAGE_KEY + note.getId());
+
+				}
+			} catch (Exception e) {
+				log.error("", e);
+				log.warn("福建企赋结算提交失败: {}", note.getSettleNo());
+				note.setUpdateTime(LocalDateTime.now());
+				note.setSettleNoteStatus(DingEnum.NOTE_STATUS_FAIL.getType());
+				noticeInfo.append(sysUser.getRealname()).append(":结算提交失败;");
+
+				log.info("认证状态异常,结算解锁settleNoteId:{}", note.getId());
+				redisTemplate.delete(CacheConstants.SETTLE_PACKAGE_KEY + note.getId());
+			}
+		}
+
+		noteService.updateBatchById(notes);
+
+		// 更新结算结果
+		SettleNoteStatusOutput output = noteService.selectSettleNoteStatus(input.getId());
+		WmScorePackage updateEntity = new WmScorePackage();
+		updateEntity.setId(input.getId());
+		updateEntity.setSettleStatus(output.toSettleStatus());
+		wmScorePackageService.updateById(updateEntity);
+
+		return R.ok(null, noticeInfo.toString());
+	}
+
 	/**
 	 * 中智结算操作
 	 *

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

@@ -649,6 +649,7 @@ public class WmScorePackageSettleNoteServiceImpl extends ServiceImpl<WmScorePack
 			case HUI_QI_YUN:
 			case ZHONG_YI_YUN:
 			case ZHONG_ZHI:
+			case QI_FU:
 				if (!Objects.equals(userSub.getCertStatus(), DingEnum.CER_STATUS_1.getType())) {
 					return R.failed(sysUser.getRealname() + "未认证,不能发起结算");
 				}
@@ -709,6 +710,11 @@ public class WmScorePackageSettleNoteServiceImpl extends ServiceImpl<WmScorePack
 			String taxCode = sysDept.getTaxCode();
 			return this.settleByZhongZhi(note, wmScorePackage, sysUser, taxCode);
 		}
+		// 福建企赋
+		else if (SubjectTypeEnum.TYPE_QI_FU.getCode().equals(subType)) {
+			String taxCode = sysDept.getTaxCode();
+			return this.settleByQiFu(note, wmScorePackage, sysUser, taxCode, sysDeptSub.getPathNo());
+		}
 		// 税邦云
 		else {
 			String taxCode = sysDept.getTaxCode();
@@ -798,6 +804,7 @@ public class WmScorePackageSettleNoteServiceImpl extends ServiceImpl<WmScorePack
 				case HUI_QI_YUN:
 				case ZHONG_YI_YUN:
 				case ZHONG_ZHI:
+				case QI_FU:
 					if (!Objects.equals(userSub.getCertStatus(), DingEnum.CER_STATUS_1.getType())) {
 						return R.failed(sysUser.getRealname() + "未认证,不能发起结算");
 					}
@@ -916,6 +923,17 @@ public class WmScorePackageSettleNoteServiceImpl extends ServiceImpl<WmScorePack
 			return this.batchSettleByZhongzhi(oladingNoteList, taxCode);
 		}
 
+		// 中智
+		if (CollectionUtils.isNotEmpty(oladingNoteList)) {
+			if (StringUtils.isNotEmpty(taxCode)) {
+				log.info("中智结算开始-获取会员所属企业的统一社会信用代码:{} ", taxCode);
+			} else {
+				return R.failed("未配置企业的统一社会信用代码");
+			}
+			SysDeptSub sysDeptSub = subMap.get(SubjectLocation.QI_FU.name());
+			return this.batchSettleByQiFu(oladingNoteList, taxCode, sysDeptSub.getPathNo());
+		}
+
 		return R.ok();
 	}
 
@@ -924,6 +942,217 @@ public class WmScorePackageSettleNoteServiceImpl extends ServiceImpl<WmScorePack
 		return R.failed("因系统维护,暂时不能提起支付,有问题请联系客服");
 	}
 
+	/**
+	 * 福建企赋结算
+	 *
+	 * @param noteList 结算记录
+	 * @param taxCode  企业三合一码
+	 * @param pathNo 批次付款渠道编号
+	 * @return 结果
+	 */
+	private R batchSettleByQiFu(List<WmScorePackageSettleNote> noteList, String taxCode, String[] pathNo) {
+
+		// 加锁
+		List<Integer> noteIdList = noteList.stream().filter(note ->
+						redisTemplate.opsForValue().setIfAbsent(
+								CacheConstants.SETTLE_PACKAGE_KEY + ":note_id_" + note.getId(),
+								noteList, CacheConstants.SETTLE_TIME, TimeUnit.DAYS))
+				.mapToInt(WmScorePackageSettleNote::getId).boxed().collect(Collectors.toList());
+
+		// 加锁记录数不等于提交记录数,说明存在在途交易
+		if (CollectionUtils.isEmpty(noteIdList)) {
+			log.error("当前用户存在其他结算请求");
+			return R.failed("当前用户存在其他结算请求");
+		} else {
+			if (!Objects.equals(noteList.size(), noteIdList.size())) {
+				// 删除锁
+				noteIdList.forEach(id -> redisTemplate.delete(CacheConstants.SETTLE_PACKAGE_KEY + ":note_id_" + id));
+				log.error("当前用户存在其他结算请求");
+				return R.failed("当前用户存在其他结算请求");
+			}
+		}
+
+		HnqzUser operator = SecurityUtils.getUser();
+		String gigTokenUrl = upmsConfig.getGigServiceUrl() + "/gig/operation/token?tenantId={tenantId}&action={action}&userId={userId}";
+		String gigSettleUrl = upmsConfig.getGigServiceUrl() + "/gig/operation/settlement";
+
+		List<Map<String, Object>> settleParamsMapper = new ArrayList<>();
+		Map<String, Map<String, Object>> detailMap = new HashMap<>();
+		noteList.forEach(note -> {
+			WmScorePackage wmScorePackage = wmScorePackageMapper.selectById(note.getPackageId());
+			// 封装结算参数
+			Map<String, Object> params;
+			if (detailMap.containsKey(note.getIdCardNumber())) {
+				params = detailMap.get(note.getIdCardNumber());
+				params.put("amount", String.valueOf(new BigDecimal((String) params.get("amount")).add(note.getSettleAmount()).doubleValue()));
+
+
+				LocalDate startTime = (LocalDate) params.get("taskStartTime");
+				LocalDate endTime = (LocalDate) params.get("taskEndTime");
+				LocalDate noteCreateTime = wmScorePackage.getCreateTime().toLocalDate();
+				LocalDate noteUpdateTime = wmScorePackage.getUpdateTime().toLocalDate();
+
+				if (noteCreateTime.isBefore(startTime)) {
+					params.put("taskStartTime", wmScorePackage.getCreateTime().toLocalDate());
+				}
+				if (noteUpdateTime.isAfter(endTime)) {
+					params.put("taskEndTime", wmScorePackage.getUpdateTime().toLocalDate());
+				}
+
+				Set<Integer> ids = (Set<Integer>) params.get("noteIds");
+				ids.add(note.getId());
+				params.put("noteIds", ids);
+			} else {
+				SysUser sysUser = sysUserService.getById(note.getUserId());
+				params = new HashMap<>(19);
+				params.put("tenantId", operator.getDeptId());
+				params.put("operatorId", operator.getId());
+				params.put("requestId", RandomStringUtils.randomAlphabetic(12));
+				params.put("taskName", String.format("%s(%s)_%s", sysUser.getRealname(), sysUser.getUsername(), System.currentTimeMillis()));
+				params.put("amount", String.valueOf(note.getSettleAmount().doubleValue()));
+				params.put("taskStartTime", wmScorePackage.getCreateTime().toLocalDate());
+				params.put("taskEndTime", wmScorePackage.getUpdateTime().toLocalDate());
+				params.put("taskLocation", "要易云");
+				params.put("username", sysUser.getUsername());
+				params.put("idCard", note.getIdCardNumber());
+				params.put("idCardType","ID_CARD");
+				params.put("realName", sysUser.getRealname());
+				params.put("bankCard", sysUser.getBankCardNumber());
+				params.put("tagId", upmsConfig.getTagId());
+				params.put("taskInvoiceContent", note.getCategoryName());
+				params.put("endType", "CSO");
+				params.put("enterpriseCode", taxCode);
+				params.put("subjectType", "QI_FU");
+				params.put("channel", "DEFAULT");
+				params.put("subjectLocation", note.getSubjectLocation());
+				params.put("notes", pathNo[0]);
+				params.put("pathNo", pathNo[0]);
+				params.put("notifyUrl", String.format("%s/admin/gig-third-api/qifu", upmsConfig.getClientUrl()));
+
+				if (SubjectLocation.JIN_YUAN.equals(note.getSubjectLocation())) {
+					params.put("taxMode", "GENERAL");
+					params.put("transactionModel", "SUPERVISE");
+				}
+				// 海南飞亿 和 河南薪泰梓
+				else {
+					params.put("taxMode", "SPECIAL");
+					params.put("transactionModel", "CHANNEL");
+				}
+
+				Set<Integer> noteIds = new HashSet<>();
+				noteIds.add(note.getId());
+				params.put("noteIds", noteIds);
+				detailMap.put(note.getIdCardNumber(), params);
+			}
+		});
+
+		detailMap.forEach((key, value) -> settleParamsMapper.add(value));
+
+
+		// 开始结算
+		for (Map<String, Object> params : settleParamsMapper) {
+
+			Set<Integer> noteIds = (Set<Integer>) params.get("noteIds");
+			try {
+				// 获取请求token
+				ResponseEntity<String> tokenResult = new RestTemplate().getForEntity(gigTokenUrl, String.class,
+						String.valueOf(operator.getDeptId()), "settle", String.valueOf(operator.getId()));
+				log.warn("获取结算token:{}", tokenResult.getBody());
+				if (!JSONUtil.isJson(tokenResult.getBody())) {
+					return R.failed("获取结算token失败");
+				}
+
+				JSONObject jsonObject = JSONUtil.parseObj(tokenResult.getBody());
+
+				if (jsonObject.getInt("code") != 0 || StrUtil.isBlank(jsonObject.getStr("data"))) {
+					return R.failed("获取结算token失败");
+				}
+
+				String token = jsonObject.getStr("data");
+
+				// 间隔100毫秒
+				Thread.sleep(100);
+
+				params.put("token", token);
+
+				// 发起结算
+				HttpHeaders headers = new HttpHeaders();
+				headers.setContentType(MediaType.APPLICATION_JSON);
+				log.info("福建企赋结算req: {}", params);
+				HttpEntity<String> result = new RestTemplate().exchange(gigSettleUrl, HttpMethod.POST, new HttpEntity<>(params, headers), String.class);
+				log.info("福建企赋结算resp: {}", result.getBody());
+				if (!JSONUtil.isJson(result.getBody())) {
+					return R.failed("结算失败");
+				}
+				JSONObject settelObj = JSONUtil.parseObj(result.getBody());
+
+				if (Objects.equals(settelObj.getInt("code"), CommonConstants.SUCCESS)) {
+					JSONObject dataJsonObj = settelObj.getJSONObject("data");
+
+					noteIds.forEach(id -> {
+						log.info("福建企赋结算结算提交成功");
+						// data获取不到
+						if (dataJsonObj == null) {
+							log.info("福建企赋提交成功 data 获取不到");
+							return;
+						}
+
+						WmScorePackageSettleNote note = new WmScorePackageSettleNote();
+						LocalDateTime now = LocalDateTime.now();
+						note.setId(id);
+						note.setSubToGigTime(now);
+						note.setUpdateTime(now);
+						String requestId = dataJsonObj.getStr("requestId");
+						if (StrUtil.isNotBlank(requestId)) {
+							note.setSettleNoteStatus(DingEnum.NOTE_STATUS_SUBMIT.getType());
+							// 新增字段streamId
+							note.setStreamId(requestId);
+						} else {
+							note.setSettleNoteStatus(DingEnum.NOTE_STATUS_FAIL.getType());
+							log.info("福建企赋提交成功 message:{}", dataJsonObj.getStr("message"));
+							redisTemplate.delete(CacheConstants.SETTLE_PACKAGE_KEY + ":note_id_" + note.getId());
+						}
+						this.baseMapper.updateById(note);
+					});
+
+				} else {
+					noteIds.forEach(id -> {
+						WmScorePackageSettleNote note = new WmScorePackageSettleNote();
+						note.setId(id);
+						log.info("福建企赋结算提交失败: {}", note.getSettleNo());
+						LocalDateTime now = LocalDateTime.now();
+						note.setUpdateTime(now);
+						note.setSubToGigTime(now);
+						note.setSettleNoteStatus(DingEnum.NOTE_STATUS_FAIL.getType());
+						this.baseMapper.updateById(note);
+						log.info("认证状态异常,结算解锁settleNoteId:{}", note.getId());
+						redisTemplate.delete(CacheConstants.SETTLE_PACKAGE_KEY + ":note_id_" + note.getId());
+					});
+
+					return R.ok("结算失败");
+				}
+
+			} catch (Exception e) {
+				log.error("", e);
+				noteIds.forEach(id -> {
+					WmScorePackageSettleNote note = new WmScorePackageSettleNote();
+					note.setId(id);
+					log.info("福建企赋结算提交失败: {}", note.getSettleNo());
+					LocalDateTime now = LocalDateTime.now();
+					note.setUpdateTime(now);
+					note.setSubToGigTime(now);
+					note.setSettleNoteStatus(DingEnum.NOTE_STATUS_FAIL.getType());
+					this.baseMapper.updateById(note);
+					log.info("认证状态异常,结算解锁settleNoteId:{}", note.getId());
+					redisTemplate.delete(CacheConstants.SETTLE_PACKAGE_KEY + ":note_id_" + note.getId());
+				});
+				return R.ok("结算失败");
+			}
+		}
+
+		return R.ok("提交结算成功");
+	}
+
 	/**
 	 * 中智结算
 	 *
@@ -2244,6 +2473,160 @@ public class WmScorePackageSettleNoteServiceImpl extends ServiceImpl<WmScorePack
 		}
 	}
 
+	/**
+	 * 福建企赋结算
+	 *
+	 * @param note
+	 * @param wmScorePackage
+	 * @param sysUser
+	 * @param taxCode
+	 * @return
+	 */
+	private R settleByQiFu(WmScorePackageSettleNote note,
+							   WmScorePackage wmScorePackage,
+							   SysUser sysUser,
+							   String taxCode,
+							   String[] pathNo) {
+
+		/**
+		 * 加锁
+		 */
+		redisTemplate.opsForValue().set(CacheConstants.SETTLE_PACKAGE_KEY + note.getId(),
+				note.getId(), CacheConstants.SETTLE_TIME, TimeUnit.DAYS);
+
+		/**
+		 * 开始结算
+		 */
+
+		HnqzUser operator = SecurityUtils.getUser();
+		String gigTokenUrl = upmsConfig.getGigServiceUrl() + "/gig/operation/token?tenantId={tenantId}&action={action}&userId={userId}";
+		String gigSettleUrl = upmsConfig.getGigServiceUrl() + "/gig/operation/settlement";
+
+		StringBuilder noticeInfo = new StringBuilder();
+		try {
+			// 获取请求token
+			ResponseEntity<String> tokenResult = new RestTemplate().getForEntity(gigTokenUrl, String.class,
+					String.valueOf(operator.getDeptId()), "settle", String.valueOf(operator.getId()));
+			log.warn("获取结算token:{}", tokenResult.getBody());
+			if (!JSONUtil.isJson(tokenResult.getBody())) {
+				return R.failed("获取结算token失败");
+			}
+
+			JSONObject jsonObject = JSONUtil.parseObj(tokenResult.getBody());
+
+			if (jsonObject.getInt("code") != 0 || StrUtil.isBlank(jsonObject.getStr("data"))) {
+				return R.failed("获取结算token失败");
+			}
+
+			String token = jsonObject.getStr("data");
+
+			// 间隔100毫秒
+			Thread.sleep(100);
+
+			// 封装结算参数
+			Map<String, Object> params = new HashMap<>();
+			params.put("token", token);
+			params.put("tenantId", operator.getDeptId());
+			params.put("operatorId", operator.getId());
+			params.put("requestId", RandomStringUtils.randomAlphabetic(12));
+			params.put("taskName", wmScorePackage.getScorePackageName() + "_" + System.currentTimeMillis());
+			params.put("amount", String.valueOf(note.getSettleAmount().doubleValue()));
+			params.put("taskStartTime", wmScorePackage.getCreateTime().toLocalDate());
+			params.put("taskEndTime", wmScorePackage.getUpdateTime().toLocalDate());
+			params.put("taskLocation", "要易云");
+			params.put("username", sysUser.getUsername());
+			params.put("idCard", sysUser.getIdCardNumber());
+			params.put("idCardType","ID_CARD");
+			params.put("realName", sysUser.getRealname());
+			params.put("bankCard", sysUser.getBankCardNumber());
+			// 市场推广
+			params.put("tagId", upmsConfig.getTagId());
+			params.put("taskInvoiceContent", note.getCategoryName());
+			params.put("endType", "CSO");
+			params.put("enterpriseCode", taxCode);
+			params.put("subjectType", "QI_FU");
+			params.put("channel", "DEFAULT");
+			params.put("subjectLocation", note.getSubjectLocation().getType());
+			params.put("notes", pathNo[0]);
+			params.put("pathNo", pathNo[0]);
+			params.put("notifyUrl", String.format("%s/admin/gig-third-api/qifu", upmsConfig.getClientUrl()));
+
+			if (SubjectLocation.JIN_YUAN.equals(note.getSubjectLocation())) {
+				params.put("taxMode", "GENERAL");
+				params.put("transactionModel", "SUPERVISE");
+			}
+			// 海南飞亿 和 河南薪泰梓
+			else {
+				params.put("taxMode", "SPECIAL");
+				params.put("transactionModel", "CHANNEL");
+			}
+
+			// 发起结算
+			HttpHeaders headers = new HttpHeaders();
+			headers.setContentType(MediaType.APPLICATION_JSON);
+			log.info("福建企赋结算req: {}", params);
+			HttpEntity<String> result = new RestTemplate().exchange(gigSettleUrl, HttpMethod.POST, new HttpEntity<>(params, headers), String.class);
+			log.info("福建企赋结算resp: {}", result.getBody());
+			if (!JSONUtil.isJson(result.getBody())) {
+				return R.failed("结算失败");
+			}
+			JSONObject settelObj = JSONUtil.parseObj(result.getBody());
+
+			LocalDateTime now = LocalDateTime.now();
+			if (Objects.equals(settelObj.getInt("code"), CommonConstants.SUCCESS)) {
+				JSONObject dataJsonObj = settelObj.getJSONObject("data");
+
+				log.info("福建企赋结算提交成功: {}", note.getSettleNo());
+				note.setUpdateTime(now);
+				note.setSubToGigTime(now);
+				//data 获取不到
+				if (dataJsonObj != null) {
+					String requestId = dataJsonObj.getStr("requestId");
+					if (StrUtil.isNotBlank(requestId)) {
+						note.setSettleNoteStatus(DingEnum.NOTE_STATUS_SUBMIT.getType());
+						// 新增字段streamId
+						note.setStreamId(requestId);
+						noticeInfo.append(sysUser.getRealname()).append(":提交结算成功;");
+					} else {
+						note.setSettleNoteStatus(DingEnum.NOTE_STATUS_FAIL.getType());
+						noticeInfo.append(sysUser.getRealname()).append(":" + dataJsonObj.getStr("message"));
+						redisTemplate.delete(CacheConstants.SETTLE_PACKAGE_KEY + note.getId());
+					}
+				} else {
+					note.setSettleNoteStatus(DingEnum.NOTE_STATUS_FAIL.getType());
+					noticeInfo.append(sysUser.getRealname()).append(":提交结算成功,业务流水号获取不到,请联系管理员;");
+					log.warn("福建企赋结算提交成功 data 获取不到: {}", note.getSettleNo());
+					redisTemplate.delete(CacheConstants.SETTLE_PACKAGE_KEY + note.getId());
+				}
+			} else {
+				log.warn("福建企赋结算提交失败: {}", note.getSettleNo());
+				note.setUpdateTime(now);
+				note.setSubToGigTime(now);
+				note.setSettleNoteStatus(DingEnum.NOTE_STATUS_FAIL.getType());
+				noticeInfo.append(sysUser.getRealname()).append(":结算提交失败-").append(settelObj.getStr("msg")).append(";");
+
+				log.info("认证状态异常,结算解锁settleNoteId:{}", note.getId());
+				redisTemplate.delete(CacheConstants.SETTLE_PACKAGE_KEY + note.getId());
+
+			}
+		} catch (Exception e) {
+			log.error("", e);
+			log.warn("福建企赋结算提交失败: {}", note.getSettleNo());
+			LocalDateTime now = LocalDateTime.now();
+			note.setUpdateTime(now);
+			note.setSubToGigTime(now);
+			note.setSettleNoteStatus(DingEnum.NOTE_STATUS_FAIL.getType());
+			noticeInfo.append(sysUser.getRealname()).append(":结算提交失败;");
+
+			log.info("认证状态异常,结算解锁settleNoteId:{}", note.getId());
+			redisTemplate.delete(CacheConstants.SETTLE_PACKAGE_KEY + note.getId());
+		}
+
+		this.baseMapper.updateById(note);
+
+		return R.ok(null, noticeInfo.toString());
+	}
+
 	/**
 	 * 众蚁云结算
 	 *