package com.yifu.cloud.plus.v1.yifu.social.service.impl;/*
 *    Copyright (c) 2018-2025, lengleng All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions are met:
 *
 * Redistributions of source code must retain the above copyright notice,
 * this list of conditions and the following disclaimer.
 * Redistributions in binary form must reproduce the above copyright
 * notice, this list of conditions and the following disclaimer in the
 * documentation and/or other materials provided with the distribution.
 * Neither the name of the yifu4cloud.com developer nor the names of its
 * contributors may be used to endorse or promote products derived from
 * this software without specific prior written permission.
 * Author: lengleng (wangiegie@gmail.com)
 */

import cn.hutool.core.collection.CollUtil;
import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.EasyExcelFactory;
import com.alibaba.excel.ExcelWriter;
import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.read.listener.ReadListener;
import com.alibaba.excel.read.metadata.holder.ReadRowHolder;
import com.alibaba.excel.util.ListUtils;
import com.alibaba.excel.write.metadata.WriteSheet;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.yifu.cloud.plus.v1.yifu.admin.api.entity.SysArea;
import com.yifu.cloud.plus.v1.yifu.admin.api.vo.AreaVo;
import com.yifu.cloud.plus.v1.yifu.archives.entity.TSettleDomain;
import com.yifu.cloud.plus.v1.yifu.archives.vo.TSettleDomainListVo;
import com.yifu.cloud.plus.v1.yifu.archives.vo.TSettleDomainSelectVo;
import com.yifu.cloud.plus.v1.yifu.common.core.constant.CacheConstants;
import com.yifu.cloud.plus.v1.yifu.common.core.constant.CommonConstants;
import com.yifu.cloud.plus.v1.yifu.common.core.constant.ExcelAttributeConstants;
import com.yifu.cloud.plus.v1.yifu.common.core.constant.ResultConstants;
import com.yifu.cloud.plus.v1.yifu.common.core.exception.ErrorCodes;
import com.yifu.cloud.plus.v1.yifu.common.core.redis.RedisDistributedLock;
import com.yifu.cloud.plus.v1.yifu.common.core.util.*;
import com.yifu.cloud.plus.v1.yifu.common.core.vo.ErrorDetailVO;
import com.yifu.cloud.plus.v1.yifu.common.core.vo.YifuUser;
import com.yifu.cloud.plus.v1.yifu.common.dapr.util.ArchivesDaprUtil;
import com.yifu.cloud.plus.v1.yifu.common.dapr.util.InsuranceDaprUtil;
import com.yifu.cloud.plus.v1.yifu.common.dapr.util.UpmsDaprUtils;
import com.yifu.cloud.plus.v1.yifu.common.security.util.SecurityUtils;
import com.yifu.cloud.plus.v1.yifu.insurances.vo.EkpSocialViewVo;
import com.yifu.cloud.plus.v1.yifu.salary.vo.ExportErrorVo;
import com.yifu.cloud.plus.v1.yifu.salary.vo.TPaymentBySalaryVo;
import com.yifu.cloud.plus.v1.yifu.salary.vo.TPaymentVo;
import com.yifu.cloud.plus.v1.yifu.salary.vo.UpdateSocialFoundVo;
import com.yifu.cloud.plus.v1.yifu.social.concurrent.threadpool.YFSocialImportThreadPoolExecutor;
import com.yifu.cloud.plus.v1.yifu.social.constants.PaymentConstants;
import com.yifu.cloud.plus.v1.yifu.social.constants.SocialConstants;
import com.yifu.cloud.plus.v1.yifu.social.entity.*;
import com.yifu.cloud.plus.v1.yifu.social.mapper.*;
import com.yifu.cloud.plus.v1.yifu.social.service.TEkpChangeDeptLogService;
import com.yifu.cloud.plus.v1.yifu.social.service.TIncomeService;
import com.yifu.cloud.plus.v1.yifu.social.service.TPaymentInfoService;
import com.yifu.cloud.plus.v1.yifu.social.util.DoJointSocialTask;
import com.yifu.cloud.plus.v1.yifu.social.util.ServiceUtil;
import com.yifu.cloud.plus.v1.yifu.social.vo.*;
import lombok.extern.log4j.Log4j2;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.InputStream;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.net.URLEncoder;
import java.text.NumberFormat;
import java.time.LocalDateTime;
import java.util.*;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.stream.Collectors;
import java.util.stream.Stream;

/**
 * 缴费库
 *
 * @author huyc
 * @date 2022-07-22 17:01:22
 */
@Log4j2
@Service
public class TPaymentInfoServiceImpl extends ServiceImpl<TPaymentInfoMapper, TPaymentInfo> implements TPaymentInfoService {

	@Autowired
	private RedisUtil redisUtil;

	@Autowired
	private YFSocialImportThreadPoolExecutor yfSocialImportThreadPoolExecutor;

	@Autowired
	private UpmsDaprUtils upmsDaprUtils;

	@Autowired
	private TSocialFundInfoMapper socialFundInfoMapper;

	@Autowired
	private TSocialInfoMapper socialInfoMapper;

	@Autowired
	private TProvidentFundMapper providentFundMapper;

	private final int partSize = 30;

	@Autowired
	private SysHouseHoldInfoMapper sysHouseHoldInfoMapper;

	@Autowired
	private TIncomeDetailMapper detailMapper;

	@Autowired
	private TIncomeService incomeService;

	@Autowired
	private ArchivesDaprUtil archivesDaprUtil;

	@Autowired
	private TForecastLibraryMapper tForecastLibraryMapper;

	@Autowired
	private InsuranceDaprUtil insuranceDaprUtil;

	@Autowired
	private TEkpChangeDeptLogService tEkpChangeDeptLogService;

	@Autowired
	private DoJointSocialTask doJointSocialTask;

	@Autowired
	private TPaymentSocialPushMapper pushMapper;
	private AtomicInteger atomicInteger = new AtomicInteger(0);
	//初始化附件上传队列上限值
	private  int maxLimit = 1;

	@Autowired
	private  SysConfigLimitMapper configLimitMapper;
	/**
	 * 缴费库简单分页查询
	 *
	 * @param tPaymentInfo 缴费库
	 * @return
	 */
	@Override
	public IPage<TPaymentInfo> getTPaymentInfoPage(Page<TPaymentInfo> page, TPaymentInfoSearchVo tPaymentInfo) {
		int count = baseMapper.getTPaymentInfoPageCount(tPaymentInfo);
		if (count < 100000){
			return baseMapper.getTPaymentInfoPage(page, tPaymentInfo);
		}else {
			List<String> ids = baseMapper.getTPaymentInfoPageIds((page.getCurrent()==0?0:(page.getCurrent()-1))*page.getSize(),tPaymentInfo,page.getSize());
			List<TPaymentInfo> data = baseMapper.getTPaymentInfoPageDataByIds(ids);
			IPage<TPaymentInfo> pageData = new Page<TPaymentInfo>();
			pageData.setCurrent(page.getCurrent());
			pageData.setTotal(count);
			pageData.setSize(page.getSize());
			pageData.setRecords(data);
			return pageData;
		}
	}

	/**
	 * 缴费库查询详情
	 * @param tPaymentInfo
	 * @return
	 */
	@Override
	public TPaymentInfoNewVo getTPaymentInfoNewPageInfo(TPaymentInfoSearchVo tPaymentInfo) {
		return baseMapper.getTPaymentInfoNewPageInfo(tPaymentInfo);
	}

	/**
	 * 缴费库分页查询
	 *
	 * @param tPaymentInfo 缴费库
	 * @return
	 */
	@Override
	public R<IPage<TPaymentInfoNewVo>> getTPaymentInfoNewPage(Page<TPaymentInfo> page, TPaymentInfoSearchVo tPaymentInfo) {
		//如果是含身份证查询直接查询走索引，无需走特殊处理逻辑，身份证查询量不会大
		if (Common.isNotNull(tPaymentInfo.getEmpIdcard())){
			return R.ok(baseMapper.getTPaymentInfoNewPage(page, tPaymentInfo));
		}
		Page<TPaymentInfoNewVo> pageNew = new Page<>();
		pageNew.setSize(page.getSize());
		pageNew.setCurrent(page.getCurrent());
		long totalCount = baseMapper.selectCountPaymentSearchInfoSocial(tPaymentInfo);
		pageNew.setTotal(totalCount);
		if (totalCount > 0L) {
			pageNew.setPages(totalCount / pageNew.getSize());
		}
		if (pageNew.getCurrent() < 1) {
			pageNew.setCurrent(1L);
		}
		if (pageNew.getSize() < 1) {
			pageNew.setSize(10L);
		}
		if (totalCount > ((page.getCurrent() - 1) * page.getSize())) {
			pageNew.setRecords(getPageData(tPaymentInfo,pageNew,totalCount));
		}
		return R.ok(pageNew);
	}
	/**
	 * @Author fxj
	 * @Description  数据量大的统计查询 走特殊处理  分步查询
	 * @Date 11:58 2024/8/9
	 * @Param
	 * @return
	**/
	private List<TPaymentInfoNewVo> getPageData(TPaymentInfoSearchVo searchVo,Page<TPaymentInfoNewVo> pageNew ,long totalCount){
		List<TPaymentInfoNewVo> pageData;
		// 非大批量数据统计查询时走原逻辑
		if (totalCount < 20000){
			return  baseMapper.getTPaymentInfoNewPageDiy(searchVo, (pageNew.getCurrent() - 1) * pageNew.getSize(), pageNew.getSize());
		}
		// 社保户、生成月、缴纳月、缴纳地、二级指标归属、单位、公积金户 走优化查询  先查询数据在封装合计金额
		if ((Common.isNotNull(searchVo.getSocialHousehold())
				|| Common.isNotNull(searchVo.getSocialCreateMonth())
				|| Common.isNotNull(searchVo.getSocialPayMonth())
				|| Common.isNotNull(searchVo.getSocialProvince())
				|| Common.isNotNull(searchVo.getSecondIndicatorBelong())
				|| Common.isNotNull(searchVo.getUnitName())
				|| Common.isNotNull(searchVo.getProvidentHousehold()))
				&& Common.isEmpty(searchVo.getEmpIdcard())
				&& Common.isEmpty(searchVo.getSettleDomainName())
				&& Common.isEmpty(searchVo.getSettleDomainCode())){
			//批量查询太慢 只能缓存单个查询 走字段索引
			pageData = baseMapper.getTPaymentInfoNewPageSocial(searchVo, (pageNew.getCurrent() - 1) * pageNew.getSize(), pageNew.getSize());
			//封装对应的社保及公积金的合计数据处理
			if (Common.isNotNull(pageData)){
				TPaymentInfoExportVo newVo;
				for (TPaymentInfoNewVo vo:pageData){
					newVo = baseMapper.getSumByKeyGroupSocial(vo.getEmpIdcard(),vo.getSocialPayMonth(),vo.getSocialCreateMonth());
					if (null != newVo){
						vo.setSumAll(BigDecimalUtils.safeAdd(BigDecimalUtils.isNullToZero(newVo.getSumAll()),BigDecimalUtils.isNullToZero(newVo.getSocialSum())));
						vo.setSocialSum(newVo.getSocialSum());
						vo.setSocialPayAddr(newVo.getSocialPayAddr());
						vo.setSocialHousehold(newVo.getSocialHousehold());
					}
					newVo = baseMapper.getSumByKeyGroupFund(vo.getEmpIdcard(),vo.getSocialPayMonth(),vo.getSocialCreateMonth());
					if (null != newVo){
						vo.setSumAll(BigDecimalUtils.safeAdd(BigDecimalUtils.isNullToZero(newVo.getSumAll()),BigDecimalUtils.isNullToZero(newVo.getProvidentSum())));
						vo.setProvidentSum(newVo.getProvidentSum());
						vo.setProvidentHousehold(newVo.getProvidentHousehold());
						vo.setProvidentPayAddr(newVo.getProvidentPayAddr());
					}
					return pageData;
				}
			}
		// 身份证查询 项目查询直接走原查询逻辑，因为此处数据量不会很大
		}else {
			pageData =  baseMapper.getTPaymentInfoNewPageDiy(searchVo, (pageNew.getCurrent() - 1) * pageNew.getSize(), pageNew.getSize());
		}
		return pageData;
	}
	/**
	 * @Author fxj
	 * @Description 导出加队列限制默认五
	 * @Date 10:38 2025/2/24
	 * @Param
	 * @return
	**/
	@Override
	public void exportAsso(HttpServletResponse response, TPaymentInfoSearchVo searchVo, int type) {
		maxLimit = configLimitMapper.getSysConfigLimitByKey("SOCIAL_DOWN_LOAD_MAX_LIMIT");
		if (atomicInteger.incrementAndGet() <= maxLimit){
			try {
				if (CommonConstants.ZERO_INT == type){
					listExport(response, searchVo);
				}else if (CommonConstants.ONE_INT == type){
					listSumExport(response, searchVo);
				}
			}catch (Exception e){
				log.error("导出异常：",e);
			}finally {
				atomicInteger.decrementAndGet();
			}
		}else {
			// 前面做了+1（atomicInteger.incrementAndGet()）这里也要-1
			atomicInteger.decrementAndGet();
			exportError(response, ResultConstants.FILE_DOWN_LOAD_DATA);
		}

	}
	/**
	 * 缴费库批量导出
	 *
	 * @param searchVo 缴费库
	 * @return
	 */
	@Override
	public void listExport(HttpServletResponse response, TPaymentInfoSearchVo searchVo) {
		String fileName = "缴费库批量导出" + DateUtil.getThisTime() + CommonConstants.XLSX;
		//获取要导出的列表
		List<TPaymentInfoBatchVo> list = new ArrayList<>();
		Integer count = baseMapper.selectCountTPaymentInfo(searchVo);
		ServletOutputStream out = null;
		YifuUser user = SecurityUtils.getUser();
		String key = CacheConstants.PAYMENT_SOCIAL_EXPORT + CommonConstants.DOWN_LINE_STRING +user.getId() ;
		try {
			out = response.getOutputStream();
			response.setContentType(CommonConstants.MULTIPART_FORM_DATA);
			response.setCharacterEncoding("utf-8");
			response.setHeader(CommonConstants.CONTENT_DISPOSITION, CommonConstants.ATTACHMENT_FILENAME + URLEncoder.encode(fileName, "UTF-8"));
			if (Common.isNotNull(redisUtil.get(key))) {
				out.write(CommonConstants.SOCIAL_EXPORT_CONTINUE.getBytes("GBK"));
				out.close();
				return;
			} else {
				redisUtil.set(key, user.getId(), 600L);
			}
			if (count > 200000 && !CommonConstants.ONE_STRING.equals(user.getId())) {
				out.write(CommonConstants.SOCIAL_EXPORT_LIMIT.getBytes("GBK"));
				out.close();
				redisUtil.remove(key);
				return;
			}
			// 这里 需要指定写用哪个class去写，然后写到第一个sheet，然后文件流会自动关闭
			ExcelWriter excelWriter = EasyExcel.write(out, TPaymentInfoBatchVo.class).includeColumnFieldNames(searchVo.getExportFields()).build();
			int index = 0;
			if (count > CommonConstants.ZERO_INT) {
				WriteSheet writeSheet = null;
				List<String> ids;
				for (int i = 0; i <= count; i += CommonConstants.EXCEL_EXPORT_LIMIT_1) {
					// 获取实际记录
					searchVo.setLimitStart(i);
					searchVo.setLimitEnd(CommonConstants.EXCEL_EXPORT_LIMIT_1);
					if (i < 200000){
						list = baseMapper.getTPaymentInfoNoPage(searchVo);
					}else{
						ids = baseMapper.noPageDiyLastIds(searchVo);
						if (Common.isNotNull(ids)){
							list = baseMapper.noPageDiyLastByIds(ids);
						}else {
							list = new ArrayList<>();
						}
					}
					if (Common.isNotNull(list)) {
						if (i%CommonConstants.EXCEL_EXPORT_LIMIT==0){
							writeSheet = EasyExcel.writerSheet("缴费库" + index).build();
						}
						excelWriter.write(list, writeSheet);
						index++;
					}
					if (Common.isNotNull(list)) {
						list.clear();
					}
				}
			} else {
				WriteSheet writeSheet = EasyExcel.writerSheet("缴费库" + index).build();
				excelWriter.write(list, writeSheet);
			}
			if (Common.isNotNull(list)) {
				list.clear();
			}
			out.flush();
			if (excelWriter!= null){
				excelWriter.finish();
			}
		} catch (Exception e) {
			redisUtil.remove(key);
			log.error("执行异常", e);
		} finally {
			try {
				if (null != out) {
					out.close();
				}
				redisUtil.remove(key);
			} catch (IOException e) {
				redisUtil.remove(key);
				log.error("执行异常", e);
			}
		}
	}

	/**
	 * 缴费库批量导出
	 *
	 * @param searchVo 缴费库
	 * @return
	 */
	@Override
	public void listSumExport(HttpServletResponse response, TPaymentInfoSearchVo searchVo) {
		String fileName = PaymentConstants.EXPORT + DateUtil.getThisTime() + CommonConstants.XLSX;
		//获取要导出的列表
		List<TPaymentInfoExportVo> list = new ArrayList<>();
		Integer count = baseMapper.selectCountSumPaymentInfo(searchVo);
		ServletOutputStream out = null;
		YifuUser user = SecurityUtils.getUser();
		String key = CacheConstants.PAYMENT_SOCIAL_EXPORT + CommonConstants.DOWN_LINE_STRING +user.getId() ;
		try {
			out = response.getOutputStream();
			response.setContentType(CommonConstants.MULTIPART_FORM_DATA);
			response.setCharacterEncoding("utf-8");
			response.setHeader(CommonConstants.CONTENT_DISPOSITION, CommonConstants.ATTACHMENT_FILENAME + URLEncoder.encode(fileName, "UTF-8"));
			if (Common.isNotNull(redisUtil.get(key))) {
				out.write(CommonConstants.SOCIAL_EXPORT_CONTINUE.getBytes("GBK"));
				out.close();
				return;
			} else {
				redisUtil.set(key, user.getId(), 600L);
			}
			if (count > 200000 && !CommonConstants.ONE_STRING.equals(user.getId())) {
				out.write(CommonConstants.SOCIAL_EXPORT_LIMIT.getBytes("GBK"));
				out.close();
				redisUtil.remove(key);
				return;
			}
			// 这里 需要指定写用哪个class去写，然后写到第一个sheet，然后文件流会自动关闭
			ExcelWriter excelWriter = EasyExcel.write(out, TPaymentInfoExportVo.class).includeColumnFieldNames(searchVo.getExportFields()).build();
			int index = 0;
			if (count > CommonConstants.ZERO_INT) {
				WriteSheet writeSheet = null;
				List<String> ids;
				for (int i = 0; i <= count; i += CommonConstants.EXCEL_EXPORT_LIMIT_1) {
					// 获取实际记录
					searchVo.setLimitStart(i);
					searchVo.setLimitEnd(CommonConstants.EXCEL_EXPORT_LIMIT_1);
					if (i < 200000){
						list = baseMapper.getTPaymentInfoSumNoPage(searchVo);
					}else{
						ids = baseMapper.sumNoPageIds(searchVo);
						if (Common.isNotNull(ids)){
							list = baseMapper.sumNoPageByIds(ids);
						}else {
							list = new ArrayList<>();
						}
					}
					if (Common.isNotNull(list)) {
						if (i%CommonConstants.EXCEL_EXPORT_LIMIT==0){
							writeSheet = EasyExcel.writerSheet(PaymentConstants.EXPORT + index).build();
						}
						excelWriter.write(list, writeSheet);
						index++;
					}
					if (Common.isNotNull(list)) {
						list.clear();
					}
				}
			} else {
				WriteSheet writeSheet = EasyExcel.writerSheet(PaymentConstants.EXPORT + index).build();
				excelWriter.write(list, writeSheet);
			}
			if (Common.isNotNull(list)) {
				list.clear();
			}
			out.flush();
			excelWriter.finish();
		} catch (Exception e) {
			redisUtil.remove(key);
			log.error("执行异常", e);
		} finally {
			try {
				if (null != out) {
					out.close();
				}
				redisUtil.remove(key);
			} catch (IOException e) {
				redisUtil.remove(key);
				log.error("执行异常", e);
			}
		}
	}

	/**
	 * 缴费库查询批量导出
	 *
	 * @param searchVo 缴费库
	 * @return
	 */
	@Override
	public void sumSearchExport(HttpServletResponse response, TPaymentInfoSearchVo searchVo) {
		YifuUser user = SecurityUtils.getUser();
		String fileName = PaymentConstants.PAYMENT_SEARCH_EXPORT + DateUtil.getThisTime() + CommonConstants.XLSX;
		//获取要导出的列表
		List<TPaymentInfoNewExportVo> list = new ArrayList<>();
		Integer count = baseMapper.selectCountPaymentSearchInfo(searchVo);
		ServletOutputStream out = null;
		String key = CacheConstants.PAYMENT_SOCIAL_EXPORT + CommonConstants.DOWN_LINE_STRING +user.getId() ;
		try {
			out = response.getOutputStream();
			response.setContentType(CommonConstants.MULTIPART_FORM_DATA);
			response.setCharacterEncoding("utf-8");
			response.setHeader(CommonConstants.CONTENT_DISPOSITION, CommonConstants.ATTACHMENT_FILENAME + URLEncoder.encode(fileName, "UTF-8"));
			if (Common.isNotNull(redisUtil.get(key))) {
				out.write(CommonConstants.SOCIAL_EXPORT_CONTINUE.getBytes("GBK"));
				out.close();
				return;
			} else {
				redisUtil.set(key, user.getId(), 600L);
			}
			//非管理员导出 大于15W 提示“导出量过大，请选择更多查询条件！如果确定要导出这些数据请联系系统管理员操作”
			if (count > 150000 && !CommonConstants.ONE_STRING.equals(user.getId())) {
				out.write(CommonConstants.SOCIAL_EXPORT_LIMIT.getBytes("GBK"));
				out.close();
				redisUtil.remove(key);
				return;
			}
			// 这里 需要指定写用哪个class去写，然后写到第一个sheet，然后文件流会自动关闭
			ExcelWriter excelWriter = EasyExcel.write(out, TPaymentInfoNewExportVo.class).includeColumnFieldNames(searchVo.getExportFields()).build();
			int index = 0;
			if (count > CommonConstants.ZERO_INT) {
				WriteSheet writeSheet;
				for (int i = 0; i <= count; i += CommonConstants.EXCEL_EXPORT_LIMIT) {
					// 获取实际记录
					searchVo.setLimitStart(i);
					searchVo.setLimitEnd(CommonConstants.EXCEL_EXPORT_LIMIT);
					list = baseMapper.getTPaymentInfoNewExportInfo(searchVo);
					if (Common.isNotNull(list)) {
						writeSheet = EasyExcel.writerSheet(PaymentConstants.SEARCH_EXPORT + index).build();
						excelWriter.write(list, writeSheet);
						index++;
					}
					if (Common.isNotNull(list)) {
						list.clear();
					}
				}
			} else {
				WriteSheet writeSheet = EasyExcel.writerSheet(PaymentConstants.SEARCH_EXPORT + index).build();
				excelWriter.write(list, writeSheet);
			}
			if (Common.isNotNull(list)) {
				list.clear();
			}
			out.flush();
			excelWriter.finish();
		} catch (Exception e) {
			redisUtil.remove(key);
			log.error("执行异常", e);
		} finally {
			try {
				if (null != out) {
					out.close();
				}
				redisUtil.remove(key);
			} catch (IOException e) {
				redisUtil.remove(key);
				log.error("执行异常", e);
			}
		}
	}

	@Override
	public R<Boolean> removeInFoById(String id) {
		YifuUser user = SecurityUtils.getUser();
		String key = CacheConstants.PAYMENT_SOCIAL_PUSH + CommonConstants.DOWN_LINE_STRING +user.getId() ;
		if (Common.isNotNull(redisUtil.get(key))) {
			return R.failed("用户正在推送实缴数据中禁止删除！");
		}
		TPaymentInfo paymentInfo = baseMapper.selectById(id);
		if (!user.getId().equals(paymentInfo.getCreateBy()) && !CommonConstants.ONE_STRING.equals(user.getId())) {
			return R.failed("非本人创建的数据禁止删除！");
		}

		if (CommonConstants.ZERO_STRING.equals(paymentInfo.getPushStatus())) {
			return R.failed("已推送至结算平台禁止删除！");
		}

		if (CommonConstants.ONE_STRING.equals(paymentInfo.getSalaryFundFlag()) ||
				CommonConstants.ONE_STRING.equals(paymentInfo.getSalarySocialFlag())) {
			return R.failed("该数据已与薪资结算，禁止删除");
		}
		baseMapper.deleteById(id);
		return R.ok();
	}

	@Override
	public R<Boolean> removeAllInfoById(String ids) {
		YifuUser user = SecurityUtils.getUser();
		if (Common.isEmpty(ids)) {
			return R.failed(CommonConstants.NO_DATA_TO_HANDLE);
		}

		String key = CacheConstants.PAYMENT_SOCIAL_PUSH + CommonConstants.DOWN_LINE_STRING +user.getId() ;
		if (Common.isNotNull(redisUtil.get(key))) {
			return R.failed("用户正在推送实缴数据中禁止删除！");
		}
		List<String> idList = Common.initStrToList(ids, CommonConstants.COMMA_STRING);
		TPaymentInfo paymentInfo;

		if (idList != null) {
			for (String id : idList) {
				paymentInfo = baseMapper.selectById(id);
				if ((!user.getId().equals(paymentInfo.getCreateBy()) &&
						!CommonConstants.ONE_STRING.equals(user.getId())) ||
						CommonConstants.ZERO_STRING.equals(paymentInfo.getPushStatus())) {
					return R.failed("存在不符合条件的数据(已推送至结算平台或非本人创建),禁止删除！");
				}
				if (CommonConstants.ONE_STRING.equals(paymentInfo.getSalaryFundFlag()) ||
						CommonConstants.ONE_STRING.equals(paymentInfo.getSalarySocialFlag())) {
					return R.failed("存在不符合条件的数据(已与薪资结算)，禁止删除");
				}
				baseMapper.deleteById(id);
			}
		}
		return R.ok();
	}
	/**
	 * 通过ID获取缴费库 及社保、公积金明细
	 *
	 * @param id
	 * @Author huyc
	 * @Date 2022-07-24
	 **/
	@Override
	public R<TPaymentInfoVo> getAllInfoById(String id) {
		TPaymentInfoVo vo = baseMapper.getAllInfoById(id);
		return R.ok(vo, "查询成功！");
	}

	@Override
	public R<Boolean> removeBatchByInfo(String empIdCard, String socialHouseId, String fundHouseId,
										String socialCreateMonth, String socialPayMonth) {
		YifuUser user = SecurityUtils.getUser();

		String key = CacheConstants.PAYMENT_SOCIAL_PUSH + CommonConstants.DOWN_LINE_STRING +user.getId() ;
		if (Common.isNotNull(redisUtil.get(key))) {
			return R.failed("用户正在推送实缴数据中禁止删除！");
		}
		LambdaQueryWrapper<TPaymentInfo> wrapper = buildQueryWrapper(empIdCard, socialHouseId, fundHouseId,
				socialCreateMonth, socialPayMonth);

		List<TPaymentInfo> list;
		boolean delFlag = false;
		if (CommonConstants.ONE_STRING.equals(user.getId())) {
			list = baseMapper.selectList(wrapper.eq(TPaymentInfo::getPushStatus, CommonConstants.ONE_STRING)
					.eq(TPaymentInfo::getSalarySocialFlag, CommonConstants.ZERO_STRING)
					.eq(TPaymentInfo::getSalaryFundFlag, CommonConstants.ZERO_STRING)
			);
		} else {
			list = baseMapper.selectList(wrapper.eq(TPaymentInfo::getPushStatus, CommonConstants.ONE_STRING)
					.eq(TPaymentInfo::getSalarySocialFlag, CommonConstants.ZERO_STRING)
					.eq(TPaymentInfo::getSalaryFundFlag, CommonConstants.ZERO_STRING)
					.eq(TPaymentInfo::getCreateBy, user.getId())
			);
			long count = baseMapper.selectCount(wrapper.and(obj->obj.eq(TPaymentInfo::getPushStatus,CommonConstants.ZERO_STRING)
					.or().eq(TPaymentInfo::getSalarySocialFlag, CommonConstants.ONE_STRING)
					.or().eq(TPaymentInfo::getSalaryFundFlag, CommonConstants.ONE_STRING)
					.or().ne(TPaymentInfo::getCreateBy, user.getId())
					)
			);
			if (count > 0) {
				delFlag = true;
			}
		}
		if (Common.isNotNull(list)) {
			baseMapper.deleteBatchIds(list);
		} else if (!delFlag) {
			return R.failed(CommonConstants.NO_DATA_TO_HANDLE);
		}
		if (delFlag) {
			return R.ok(null, "存在不符合条件的数据(已推送至结算平台或非本人创建),禁止删除！");
		}
		return R.ok(null, "批量删除成功");
	}

	private LambdaQueryWrapper buildQueryWrapper(String empIdCard, String socialHouseId, String fundHouseId,
												 String socialCreateMonth, String socialPayMonth) {
		LambdaQueryWrapper<TPaymentInfo> wrapper = Wrappers.lambdaQuery();
		if (Common.isNotNull(empIdCard)) {
			wrapper.eq(TPaymentInfo::getEmpIdcard, empIdCard);
		}
		if (Common.isNotNull(socialHouseId)) {
			SysHouseHoldInfo info = sysHouseHoldInfoMapper.selectById(socialHouseId);
			if (Common.isNotNull(info)) {
				wrapper.eq(TPaymentInfo::getSocialHousehold, info.getName());
			}
		}
		if (Common.isNotNull(fundHouseId)) {
			SysHouseHoldInfo infoFund = sysHouseHoldInfoMapper.selectById(fundHouseId);
			if (Common.isNotNull(infoFund)) {
				wrapper.eq(TPaymentInfo::getProvidentHousehold, infoFund.getName());
			}
		}
		if (Common.isNotNull(socialCreateMonth)) {
			wrapper.and(wrapper2 -> wrapper2.eq(TPaymentInfo::getSocialCreateMonth, socialCreateMonth)
					.or(wrapper1 -> wrapper1.eq(TPaymentInfo::getProvidentCreateMonth, socialCreateMonth)
					));
		}
		if (Common.isNotNull(socialPayMonth)) {
			wrapper.and(wrapper2 -> wrapper2.eq(TPaymentInfo::getSocialPayMonth, socialPayMonth)
					.or(wrapper1 -> wrapper1.eq(TPaymentInfo::getProvidentPayMonth, socialPayMonth)
					));
		}
		return wrapper;
	}

	@Override
	public R<List<ErrorDetailVO>> importSocialDiy(InputStream inputStream) {
		YifuUser user = SecurityUtils.getUser();
		String sumNumKey = user.getId() + CommonConstants.DOWN_LINE_STRING + "sum_key";
		if (Common.isNotNull(redisUtil.get(sumNumKey))) {
			redisUtil.remove(sumNumKey);
		}
		String importSuccessKey = user.getId() + CommonConstants.DOWN_LINE_STRING + CommonConstants.PAYMENT_SOCIAL_WAIT_EXPORT;
		if (Common.isNotNull(redisUtil.get(importSuccessKey))) {
			redisUtil.remove(importSuccessKey);
		}
		ConcurrentHashMap<String, ErrorDetailVO> errorMessageMap = new ConcurrentHashMap<>();
		//养老
		ConcurrentHashMap<String, BigDecimal> pensionMoneyMap = new ConcurrentHashMap<>();
		//大病救助金
		ConcurrentHashMap<String, BigDecimal> bigMoneyMap = new ConcurrentHashMap<>();
		//失业
		ConcurrentHashMap<String, BigDecimal> unEmpMoneyMap = new ConcurrentHashMap<>();
		//生育
		ConcurrentHashMap<String, BigDecimal> birMoneyMap = new ConcurrentHashMap<>();
		//工伤
		ConcurrentHashMap<String, BigDecimal> injuryMoneyMap = new ConcurrentHashMap<>();
		//医保
		ConcurrentHashMap<String, BigDecimal> medicalMoneyMap = new ConcurrentHashMap<>();
		//补缴利息
		ConcurrentHashMap<String, BigDecimal> accrualMoneyMap = new ConcurrentHashMap<>();
		//获取所有项目信息
		Map<String, TSettleDomainSelectVo> domainMap = this.getSelectVoMap();
		ExcelUtil<TPaymentInfoVo> util1 = new ExcelUtil<>(TPaymentInfoVo.class);
		// 写法2：
		// 匿名内部类 不用额外写一个DemoDataListener
		// 这里 需要指定读用哪个class去读，然后读取第一个sheet 文件流会自动关闭
		try {
			EasyExcel.read(inputStream, TPaymentInfoVo.class, new ReadListener<TPaymentInfoVo>() {
				/**
				 * 单次缓存的数据量
				 */
				public static final int BATCH_COUNT = CommonConstants.BATCH_COUNT;
				//所有行数
				Integer rowNumber;
				/**
				 *临时存储
				 */
				private List<TPaymentInfoVo> cachedDataList = ListUtils.newArrayListWithExpectedSize(BATCH_COUNT);

				@Override
				public void invoke(TPaymentInfoVo data, AnalysisContext context) {
					ReadRowHolder readRowHolder = context.readRowHolder();
					// 获取总行数（含表头）
					rowNumber = context.readSheetHolder().getApproximateTotalRowNumber();
					Integer rowIndex = readRowHolder.getRowIndex();
					data.setRowIndex(rowIndex + 1);
					ErrorMessage errorMessage = util1.checkEntity(data, data.getRowIndex());
					if (Common.isNotNull(errorMessage)) {
						errorMessageMap.put(UUID.randomUUID().toString(),new ErrorDetailVO(errorMessage.getLineNum(), errorMessage.getMessage()));
					} else {
						cachedDataList.add(data);
					}
					if (cachedDataList.size() >= BATCH_COUNT) {
						saveData();
						// 存储完成清理 list
						cachedDataList = ListUtils.newArrayListWithExpectedSize(BATCH_COUNT);
					}
				}

				@Override
				public void doAfterAllAnalysed(AnalysisContext context) {
					saveData();
				}

				/**
				 * 加上存储数据库
				 */
				private void saveData() {
					log.info("{}条数据，开始存储数据库！", cachedDataList.size());
					importTPaymentSocialInfo(cachedDataList, sumNumKey, importSuccessKey, errorMessageMap, user,
							rowNumber, pensionMoneyMap, bigMoneyMap, unEmpMoneyMap, birMoneyMap, injuryMoneyMap,
							medicalMoneyMap, accrualMoneyMap ,domainMap);
					log.info("存储数据库成功！");
				}
			}).sheet().doRead();
		} catch (Exception e) {
			log.error(CommonConstants.IMPORT_DATA_ANALYSIS_ERROR, e);
			return R.failed(CommonConstants.IMPORT_DATA_ANALYSIS_ERROR);
		}
		domainMap.clear();
		pensionMoneyMap.clear();
		bigMoneyMap.clear();
		unEmpMoneyMap.clear();
		birMoneyMap.clear();
		injuryMoneyMap.clear();
		medicalMoneyMap.clear();
		accrualMoneyMap.clear();
		List<ErrorDetailVO> errorMessageList = new ArrayList<>(errorMessageMap.values());
		errorMessageMap.clear();
		return this.judgeAllMessage(errorMessageList);
	}

	/**
	 * @param errorMessageList
	 * @Description: 判断所有返回数据，是否全部为正确的
	 * @Author: hgw
	 * @Date: 2022/11/24 18:03
	 * @return: void
	 **/
	private R<List<ErrorDetailVO>> judgeAllMessage(List<ErrorDetailVO> errorMessageList) {
		if (!errorMessageList.isEmpty()) {
			boolean isAllTrue = true;
			for (ErrorDetailVO d : errorMessageList) {
				try {
					if (Common.isEmpty(d) || (Common.isEmpty(d.getResult()) || 0 == d.getResult())) {
						isAllTrue = false;
						break;
					}
				} catch (Exception e) {
					log.error("缴费库导入异常：" + e);
				}
			}
			if (isAllTrue) {
				errorMessageList.clear();
				return R.ok();
			} else {
				return R.ok(errorMessageList);
			}
		}
		return R.ok();
	}

	/**
	 * @param errorMessageList
	 * @Description: 判断所有返回数据，是否全部为正确的
	 * @Author: hgw
	 * @Date: 2022/11/24 18:03
	 * @return: void
	 **/
	private R<List<ErrorMessage>> judgeAllMessage1(List<ErrorMessage> errorMessageList) {
		if (!errorMessageList.isEmpty()) {
			if(errorMessageList.stream().allMatch(e-> CommonConstants.SAVE_SUCCESS.equals(e.getMessage()))) {
				return R.ok();
			} else {
				return R.failed(errorMessageList);
			}
		}
		return R.ok();
	}

	private void importTPaymentSocialInfo(List<TPaymentInfoVo> list, String sumNumKey, String importSuccessKey,
										  ConcurrentHashMap<String, ErrorDetailVO> errorMessageMap,
										  YifuUser user, Integer rowNumber,
										  ConcurrentHashMap<String, BigDecimal> pensionMoneyMap,
										  ConcurrentHashMap<String, BigDecimal> bigMoneyMap,
										  ConcurrentHashMap<String, BigDecimal> unEmpMoneyMap,
										  ConcurrentHashMap<String, BigDecimal> birMoneyMap,
										  ConcurrentHashMap<String, BigDecimal> injuryMoneyMap,
										  ConcurrentHashMap<String, BigDecimal> medicalMoneyMap,
										  ConcurrentHashMap<String, BigDecimal> accrualMoneyMap,
										  Map<String,TSettleDomainSelectVo> domainMap) {
		HashMap<String, String> areaMap = new HashMap<>();
		HashMap<String, String> areaMap2 = new HashMap<>();
		R<AreaVo> areaListR = upmsDaprUtils.getAreaListR();
		if (Common.isNotNull(areaListR)) {
			AreaVo areaList = areaListR.getData();
			if (null != areaList && !areaList.getSysAreaList().isEmpty()) {
				for (SysArea area : areaList.getSysAreaList()) {
					areaMap.put(Integer.toString(area.getId()), area.getAreaName());
					areaMap2.put(area.getAreaName() + CommonConstants.DOWN_LINE_STRING + (
							null == area.getParentId() ? "null" : (0 == area.getParentId() ? "null" : Integer.toString(
									area.getParentId()))), Integer.toString(area.getId()));
				}
			}
		}

		// 判断是否有相同的用户在导入社保费用 存在提示稍后重试
		String key = user.getId() + CommonConstants.DOWN_LINE_STRING + CommonConstants.PAYMENT_SOCIAL_IMPORT;
		if (redisUtil.exists(key)) {
			errorMessageMap.put(UUID.randomUUID().toString(),new ErrorDetailVO(-1, "当前用户数据导入中，请稍后重试！"));
			redisUtil.remove(key);
		} else {
			redisUtil.set(key, user.getId(), 360L);

			// 导入前做队列空闲判断，防止队列不足出现数据丢失的场景
			if (CollUtil.isNotEmpty(list)) {
				int taskSize = list.size() / partSize + CommonConstants.ONE_INT;
				int residualCapacity = yfSocialImportThreadPoolExecutor.getResidualCapacity();
				if (taskSize > residualCapacity) {
					errorMessageMap.put(UUID.randomUUID().toString(),new ErrorDetailVO(-1, MsgUtils.getMessage(ErrorCodes.SOCIALINFO_LIST_NUM_LARGE)));
				} else {
					// -----------------------------生成paymentInfoMap本段开始--------------------------------
					//已存在的档案数据
					List<String> monthList = Common.listObjectToStrList(list, ExcelAttributeConstants.SOCIAL_PAY_MONTH).stream().distinct().collect(Collectors.toList());
					//已存在社保缴费库数据  非删除状态
					List<TPaymentInfo> paymentInfos = baseMapper.selectListForPaymentImport(monthList, Common.listObjectToStrList(list, ExcelAttributeConstants.EMPIDCARD));
					//养老
					ConcurrentHashMap<String, TPaymentInfo> paymentInfoPensionMap = new ConcurrentHashMap<>();
					//大病救助金
					ConcurrentHashMap<String, TPaymentInfo> paymentInfoBigMap = new ConcurrentHashMap<>();
					//失业
					ConcurrentHashMap<String, TPaymentInfo> paymentInfoUnEmpMap = new ConcurrentHashMap<>();
					//生育
					ConcurrentHashMap<String, TPaymentInfo> paymentInfoBirMap = new ConcurrentHashMap<>();
					//工伤
					ConcurrentHashMap<String, TPaymentInfo> paymentInfoInjuryMap = new ConcurrentHashMap<>();
					//医保
					ConcurrentHashMap<String, TPaymentInfo> paymentInfoMedicalMap = new ConcurrentHashMap<>();
					//补缴利息
					ConcurrentHashMap<String, TPaymentInfo> paymentInfoaccrualMap = new ConcurrentHashMap<>();
					if (Common.isNotNull(paymentInfos)) {
						for (TPaymentInfo info : paymentInfos) {
							if (BigDecimalUtils.safeAdd(BigDecimalUtils.isNullToZero(info.getUnitPensionMoney()),
									BigDecimalUtils.isNullToZero(info.getPersonalPensionMoney())).compareTo(BigDecimal.ZERO) != 0) {
								if (null != paymentInfoPensionMap.get(info.getSocialPayAddr()
										+ CommonConstants.DOWN_LINE_STRING
										+ info.getEmpIdcard()
										+ CommonConstants.DOWN_LINE_STRING
										+ info.getSocialPayMonth()
										+ CommonConstants.DOWN_LINE_STRING
										+ info.getSocialCreateMonth()
										+ CommonConstants.DOWN_LINE_STRING
										+ SocialConstants.YL)) {
									info.setYlSameFlg("1");
								}
								paymentInfoPensionMap.put(info.getSocialPayAddr()
												+ CommonConstants.DOWN_LINE_STRING
												+ info.getEmpIdcard()
												+ CommonConstants.DOWN_LINE_STRING
												+ info.getSocialPayMonth()
												+ CommonConstants.DOWN_LINE_STRING
												+ info.getSocialCreateMonth()
												+ CommonConstants.DOWN_LINE_STRING
												+ SocialConstants.YL
										, info);
							}
							if (BigDecimalUtils.safeAdd(BigDecimalUtils.isNullToZero(info.getCompanyAccrual()),
									BigDecimalUtils.isNullToZero(info.getPersonalAccrual())).compareTo(BigDecimal.ZERO) != 0) {
								if (null != paymentInfoaccrualMap.get(info.getSocialPayAddr()
										+ CommonConstants.DOWN_LINE_STRING
										+ info.getEmpIdcard()
										+ CommonConstants.DOWN_LINE_STRING
										+ info.getSocialPayMonth()
										+ CommonConstants.DOWN_LINE_STRING
										+ info.getSocialCreateMonth()
										+ CommonConstants.DOWN_LINE_STRING
										+ SocialConstants.BJ)) {
									info.setBjSameFlg("1");
								}
								paymentInfoaccrualMap.put(info.getSocialPayAddr()
												+ CommonConstants.DOWN_LINE_STRING
												+ info.getEmpIdcard()
												+ CommonConstants.DOWN_LINE_STRING
												+ info.getSocialPayMonth()
												+ CommonConstants.DOWN_LINE_STRING
												+ info.getSocialCreateMonth()
												+ CommonConstants.DOWN_LINE_STRING
												+ SocialConstants.BJ
										, info);
							}
							if (BigDecimalUtils.safeAdd(BigDecimalUtils.isNullToZero(info.getPersonalBigmailmentMoney()),
									BigDecimalUtils.isNullToZero(info.getUnitBigmailmentMoney())).compareTo(BigDecimal.ZERO) != 0) {
								if (null != paymentInfoBigMap.get(info.getSocialPayAddr()
										+ CommonConstants.DOWN_LINE_STRING
										+ info.getEmpIdcard()
										+ CommonConstants.DOWN_LINE_STRING
										+ info.getSocialPayMonth()
										+ CommonConstants.DOWN_LINE_STRING
										+ info.getSocialCreateMonth()
										+ CommonConstants.DOWN_LINE_STRING
										+ SocialConstants.DB)) {
									info.setDbSameFlg("1");
								}
								paymentInfoBigMap.put(info.getSocialPayAddr()
												+ CommonConstants.DOWN_LINE_STRING
												+ info.getEmpIdcard()
												+ CommonConstants.DOWN_LINE_STRING
												+ info.getSocialPayMonth()
												+ CommonConstants.DOWN_LINE_STRING
												+ info.getSocialCreateMonth()
												+ CommonConstants.DOWN_LINE_STRING
												+ SocialConstants.DB
										, info);
							}
							if (BigDecimalUtils.safeAdd(BigDecimalUtils.isNullToZero(info.getUnitUnemploymentMoney()),
									BigDecimalUtils.isNullToZero(info.getPersonalUnemploymentMoney())).compareTo(BigDecimal.ZERO) != 0) {
								if (null != paymentInfoUnEmpMap.get(info.getSocialPayAddr()
										+ CommonConstants.DOWN_LINE_STRING
										+ info.getEmpIdcard()
										+ CommonConstants.DOWN_LINE_STRING
										+ info.getSocialPayMonth()
										+ CommonConstants.DOWN_LINE_STRING
										+ info.getSocialCreateMonth()
										+ CommonConstants.DOWN_LINE_STRING
										+ SocialConstants.SY)) {
									info.setSySameFlg("1");
								}
								paymentInfoUnEmpMap.put(info.getSocialPayAddr()
												+ CommonConstants.DOWN_LINE_STRING
												+ info.getEmpIdcard()
												+ CommonConstants.DOWN_LINE_STRING
												+ info.getSocialPayMonth()
												+ CommonConstants.DOWN_LINE_STRING
												+ info.getSocialCreateMonth()
												+ CommonConstants.DOWN_LINE_STRING
												+ SocialConstants.SY
										, info);
							}
							if (BigDecimalUtils.isNullToZero(info.getUnitBirthMoney()).compareTo(BigDecimal.ZERO) != 0) {
								if (null != paymentInfoBirMap.get(info.getSocialPayAddr()
										+ CommonConstants.DOWN_LINE_STRING
										+ info.getEmpIdcard()
										+ CommonConstants.DOWN_LINE_STRING
										+ info.getSocialPayMonth()
										+ CommonConstants.DOWN_LINE_STRING
										+ info.getSocialCreateMonth()
										+ CommonConstants.DOWN_LINE_STRING
										+ SocialConstants.BIR)) {
									info.setBrSameFlg("1");
								}
								paymentInfoBirMap.put(info.getSocialPayAddr()
												+ CommonConstants.DOWN_LINE_STRING
												+ info.getEmpIdcard()
												+ CommonConstants.DOWN_LINE_STRING
												+ info.getSocialPayMonth()
												+ CommonConstants.DOWN_LINE_STRING
												+ info.getSocialCreateMonth()
												+ CommonConstants.DOWN_LINE_STRING
												+ SocialConstants.BIR
										, info);
							}
							if (BigDecimalUtils.isNullToZero(info.getUnitInjuryMoney()).compareTo(BigDecimal.ZERO) != 0) {
								if (null != paymentInfoInjuryMap.get(info.getSocialPayAddr()
										+ CommonConstants.DOWN_LINE_STRING
										+ info.getEmpIdcard()
										+ CommonConstants.DOWN_LINE_STRING
										+ info.getSocialPayMonth()
										+ CommonConstants.DOWN_LINE_STRING
										+ info.getSocialCreateMonth()
										+ CommonConstants.DOWN_LINE_STRING
										+ SocialConstants.GS)) {
									info.setGsSameFlg("1");
								}
								paymentInfoInjuryMap.put(info.getSocialPayAddr()
												+ CommonConstants.DOWN_LINE_STRING
												+ info.getEmpIdcard()
												+ CommonConstants.DOWN_LINE_STRING
												+ info.getSocialPayMonth()
												+ CommonConstants.DOWN_LINE_STRING
												+ info.getSocialCreateMonth()
												+ CommonConstants.DOWN_LINE_STRING
												+ SocialConstants.GS
										, info);
							}
							if (BigDecimalUtils.safeAdd(BigDecimalUtils.isNullToZero(info.getUnitMedicalMoney()),
									BigDecimalUtils.isNullToZero(info.getPersonalMedicalMoney())).compareTo(BigDecimal.ZERO) != 0) {
								if (null != paymentInfoMedicalMap.get(info.getSocialPayAddr()
										+ CommonConstants.DOWN_LINE_STRING
										+ info.getEmpIdcard()
										+ CommonConstants.DOWN_LINE_STRING
										+ info.getSocialPayMonth()
										+ CommonConstants.DOWN_LINE_STRING
										+ info.getSocialCreateMonth()
										+ CommonConstants.DOWN_LINE_STRING
										+ SocialConstants.YB)) {
									info.setYbSameFlg("1");
								}
								paymentInfoMedicalMap.put(info.getSocialPayAddr()
												+ CommonConstants.DOWN_LINE_STRING
												+ info.getEmpIdcard()
												+ CommonConstants.DOWN_LINE_STRING
												+ info.getSocialPayMonth()
												+ CommonConstants.DOWN_LINE_STRING
												+ info.getSocialCreateMonth()
												+ CommonConstants.DOWN_LINE_STRING
												+ SocialConstants.YB
										, info);
							}
						}
					}
					// -----------------------------生成paymentInfoMap本段结束--------------------------------

					// -----------------------------线程池处理list，批量保存社保信息开始--------------------------------
					List<CompletableFuture<ConcurrentHashMap<String, ErrorDetailVO>>> completableFutureList = new ArrayList<>();

					// 创建一个数值格式化对象
					NumberFormat numberFormat = NumberFormat.getInstance();
					// 设置精确到小数点后2位
					numberFormat.setMaximumFractionDigits(2);
					String maerialRatio = "";
					Integer bfInt = (Integer) redisUtil.get(sumNumKey);
					if (Common.isNotNull(bfInt)) {
						if (rowNumber > bfInt + 1) {
							maerialRatio = numberFormat.format(((float) bfInt / (float) rowNumber) * 100);
							bfInt = bfInt + 100;
							redisUtil.set(sumNumKey, bfInt, 360L);
						} else {
							maerialRatio = "100";
						}
					} else {
						if (rowNumber >= 100) {
							maerialRatio = numberFormat.format(((float) 100 / (float) rowNumber) * 100);
							bfInt = 100;
							redisUtil.set(sumNumKey, bfInt, 360L);
						} else {
							maerialRatio = "100";
						}
					}
					redisUtil.set(importSuccessKey, maerialRatio, 360L);

					try {
						// 1.list.size()不足100时直接执行
						if (list.size() < 100) {
							CompletableFuture<ConcurrentHashMap<String, ErrorDetailVO>> listCompletableFuture = CompletableFuture.supplyAsync(() ->
									executeImportSocialList(user, list, areaMap, areaMap2,domainMap,
											paymentInfoPensionMap, paymentInfoBigMap, paymentInfoBirMap,
											paymentInfoMedicalMap, paymentInfoUnEmpMap, paymentInfoInjuryMap,
											errorMessageMap, pensionMoneyMap, bigMoneyMap, unEmpMoneyMap, birMoneyMap,
											injuryMoneyMap, medicalMoneyMap, accrualMoneyMap, paymentInfoaccrualMap
									), yfSocialImportThreadPoolExecutor);
							completableFutureList.add(listCompletableFuture);
						} else {
							int j = 25;
							for (int i = 0; i < 100; i = i + 25) {
								// 单个线程每次执行25条
								final List<TPaymentInfoVo> finalList = list.subList(i,i+j);
								CompletableFuture<ConcurrentHashMap<String, ErrorDetailVO>> listCompletableFuture = CompletableFuture.supplyAsync(() ->
										executeImportSocialList(user, finalList, areaMap, areaMap2,domainMap,
												paymentInfoPensionMap, paymentInfoBigMap, paymentInfoBirMap,
												paymentInfoMedicalMap, paymentInfoUnEmpMap, paymentInfoInjuryMap,
												errorMessageMap, pensionMoneyMap, bigMoneyMap, unEmpMoneyMap, birMoneyMap,
												injuryMoneyMap, medicalMoneyMap, accrualMoneyMap, paymentInfoaccrualMap
										), yfSocialImportThreadPoolExecutor);
								completableFutureList.add(listCompletableFuture);
							}
						}
						// 阻塞当前线程，等待所有的线程执行完毕
						boolean computeFlag;
						do {
							computeFlag = false;
							for (CompletableFuture<ConcurrentHashMap<String, ErrorDetailVO>> listCompletableFuture : completableFutureList) {
								if (!listCompletableFuture.isDone()) {
									computeFlag = true;
								}
							}
						} while (computeFlag);

					} catch (Exception e) {
						log.error("社保缴费库数据批量导入异常：" + e);
						redisUtil.remove(key);
					}
				}
			}
			redisUtil.remove(key);
		}
	}

	/**
	 * 转换缴纳地址为省市县ID
	 **/
	private TPaymentInfoVo initAddress(String[] areaArray, HashMap<String, String> areaMap2, TPaymentInfoVo s) {
		if (null == areaArray || null == areaMap2 || null == s) {
			return s;
		}
		String temp;
		if (areaArray.length >= CommonConstants.TWO_INT) {
			temp = areaMap2.get(areaArray[0] + CommonConstants.DOWN_LINE_STRING + "null");
			if (Common.isNotNull(temp)) {
				s.setSocialProvince(temp);
			}
			temp = areaMap2.get(areaArray[1] + CommonConstants.DOWN_LINE_STRING + (null == s.getSocialProvince()
					? "null" : s.getSocialProvince()));
			if (Common.isNotNull(temp)) {
				s.setSocialCity(temp);
			}
			if (areaArray.length >= CommonConstants.THREE_INT) {
				temp = areaMap2.get(areaArray[2] + CommonConstants.DOWN_LINE_STRING + (null == s.getSocialCity()
						? "null" : s.getSocialCity()));
				if (Common.isNotNull(temp)) {
					s.setSocialTown(temp);
				}
			}
		}
		return s;
	}

	/**
	 * @param user
	 * @param list
	 * @param areaMap
	 * @param areaMap2
	 * @param paymentInfoPensionMap
	 * @description:
	 * @author: huyc
	 * @date: 2022/7/25
	 * @return:
	 */
	private ConcurrentHashMap<String, ErrorDetailVO> executeImportSocialList(YifuUser user,
														List<TPaymentInfoVo> list,
														HashMap<String, String> areaMap,
														HashMap<String, String> areaMap2,
														Map<String,TSettleDomainSelectVo> domainMap,
														ConcurrentHashMap<String, TPaymentInfo> paymentInfoPensionMap,
														ConcurrentHashMap<String, TPaymentInfo> paymentInfoBigMap,
														ConcurrentHashMap<String, TPaymentInfo> paymentInfoBirMap,
														ConcurrentHashMap<String, TPaymentInfo> paymentInfoMedicalMap,
														ConcurrentHashMap<String, TPaymentInfo> paymentInfoUnEmpMap,
														ConcurrentHashMap<String, TPaymentInfo> paymentInfoInjuryMap,
														ConcurrentHashMap<String, ErrorDetailVO> errorMessageMap,
														ConcurrentHashMap<String, BigDecimal> pensionMoneyMap,
														ConcurrentHashMap<String, BigDecimal> bigMoneyMap,
														ConcurrentHashMap<String, BigDecimal> unEmpMoneyMap,
														ConcurrentHashMap<String, BigDecimal> birMoneyMap,
														ConcurrentHashMap<String, BigDecimal> injuryMoneyMap,
														ConcurrentHashMap<String, BigDecimal> medicalMoneyMap,
														ConcurrentHashMap<String, BigDecimal> accrualMoneyMap,
														ConcurrentHashMap<String, TPaymentInfo> paymentInfoaccrualMap) {
		if (Common.isNotNull(list)) {
			TPaymentInfo paymentInfo;
			TSocialFundInfo socialInfo;
			TSocialInfo tSocialInfo = null;
			String temp;
			List<TSocialInfo> socialist;
			TSettleDomain domain;


			List<TSocialFundInfo> socialInfoList = socialFundInfoMapper.selectList(Wrappers.<TSocialFundInfo>query().lambda()
					.in(TSocialFundInfo::getEmpIdcard, Common.listObjectToStrList(list, ExcelAttributeConstants.EMPIDCARD))
					.in(TSocialFundInfo::getSocialStatus,CommonConstants.socialStatus));

			//已存在的社保数据
			HashMap<String, TSocialFundInfo> socialMap = new HashMap<>();
			if (Common.isNotNull(socialInfoList)) {
				for (TSocialFundInfo tSocialInfo1 : socialInfoList) {
					socialMap.put(tSocialInfo1.getEmpIdcard()
							+ CommonConstants.DOWN_LINE_STRING + tSocialInfo1.getSocialProvince()
							+ CommonConstants.DOWN_LINE_STRING + tSocialInfo1.getSocialCity()
							+ CommonConstants.DOWN_LINE_STRING + (null == tSocialInfo1.getSocialTown()
							? "null" : tSocialInfo1.getSocialTown()), tSocialInfo1);
				}
			}

			String[] areaArray;
			String exitMoney;
			String errorInfo;
			for (TPaymentInfoVo infoVo : list) {
				if (Common.isNotNull(infoVo.getEmpIdcard())) {
					infoVo.setEmpIdcard(infoVo.getEmpIdcard().replace("x", "X"));
				}
				//导入校验
				if (!Common.isNotNull(infoVo.getSocialPayMonth())) {
					errorMessageMap.put(UUID.randomUUID().toString(),new ErrorDetailVO(infoVo.getRowIndex(), CommonConstants.ZERO_INT, infoVo.getEmpIdcard(), infoVo.getSocialHousehold(), infoVo.getProvidentHousehold(), infoVo.getEmpName(), "社保缴纳月份不可为空！"));
					continue;
				}
				if (!Common.isNotNull(infoVo.getSocialCreateMonth())) {
					errorMessageMap.put(UUID.randomUUID().toString(),new ErrorDetailVO(infoVo.getRowIndex(), CommonConstants.ZERO_INT, infoVo.getEmpIdcard(), infoVo.getSocialHousehold(), infoVo.getProvidentHousehold(), infoVo.getEmpName(), "社保生成月份不可为空！"));
					continue;
				}
				if (!Common.isNotNull(infoVo.getSocialPayAddr())) {
					errorMessageMap.put(UUID.randomUUID().toString(),new ErrorDetailVO(infoVo.getRowIndex(), CommonConstants.ZERO_INT, infoVo.getEmpIdcard(), infoVo.getSocialHousehold(), infoVo.getProvidentHousehold(), infoVo.getEmpName(), "社保缴纳地不可为空！"));
					continue;
				}
				//无对应员工的社保数据
				//采用客服导入的地址
				areaArray = infoVo.getSocialPayAddr().split(CommonConstants.CENTER_SPLIT_LINE_STRING);
				infoVo = initAddress(areaArray, areaMap2, infoVo);
				socialInfo = socialMap.get(infoVo.getEmpIdcard()
						+ CommonConstants.DOWN_LINE_STRING + infoVo.getSocialProvince()
						+ CommonConstants.DOWN_LINE_STRING + infoVo.getSocialCity()
						+ CommonConstants.DOWN_LINE_STRING + (null == infoVo.getSocialTown()
						? "null" : infoVo.getSocialTown()));
				//对身份证与人员姓名的对应关系进行校验
				if (socialInfo != null && !socialInfo.getEmpName().equals(infoVo.getEmpName())) {
					errorMessageMap.put(UUID.randomUUID().toString(),new ErrorDetailVO(infoVo.getRowIndex(), CommonConstants.ZERO_INT, infoVo.getEmpIdcard(), infoVo.getSocialHousehold(), infoVo.getProvidentHousehold(), infoVo.getEmpName(), "姓名与身份证信息不一致，请核实后再次尝试！"));
					continue;
				}
				if (socialInfo != null && socialInfo.getSocialStartDate() == null) {
					errorMessageMap.put(UUID.randomUUID().toString(),new ErrorDetailVO(infoVo.getRowIndex(), CommonConstants.ZERO_INT, infoVo.getEmpIdcard(), infoVo.getSocialHousehold(), infoVo.getProvidentHousehold(), infoVo.getEmpIdcard(), SocialConstants.ERROR_TEMPLATE + "的社保起缴日期为空！"));
					continue;
				}

				if (null == socialInfo) {
					boolean isTrueAdder = false;
					socialist = socialInfoMapper.selectList(Wrappers.<TSocialInfo>query().lambda()
							.eq(TSocialInfo::getEmpIdcard, infoVo.getEmpIdcard())
							.eq(TSocialInfo::getSocialProvince, infoVo.getSocialProvince())
							.eq(TSocialInfo::getSocialCity, infoVo.getSocialCity())
							.eq(TSocialInfo::getDeleteFlag,CommonConstants.ZERO_STRING) //兼容历史数据的调整
							.in(TSocialInfo::getHandleStatus,CommonConstants.socialInfoStatus)
					);
					if (CollectionUtils.isNotEmpty(socialist)) {
						for (TSocialInfo socialInfo1 : socialist) {
							if ((Common.isEmpty(infoVo.getSocialTown()) || (Common.isNotNull(infoVo.getSocialTown()) &&
									infoVo.getSocialTown().equals(socialInfo1.getSocialTown()))) &&
									DateUtil.dateToString(socialInfo1.getSocialStartDate(), "yyyyMM").compareTo(infoVo.getSocialPayMonth()) <= 0 &&
									(Common.isEmpty(socialInfo1.getSocialReduceDate()) || (Common.isNotNull(socialInfo1.getSocialReduceDate()) &&
											DateUtil.dateToString(socialInfo1.getSocialReduceDate(), "yyyyMM").compareTo(infoVo.getSocialPayMonth()) >= 0))) {
								isTrueAdder = true;
								tSocialInfo = socialInfo1;
								break;
							}
						}
					}
					if (!isTrueAdder) {
						errorMessageMap.put(UUID.randomUUID().toString(),new ErrorDetailVO(infoVo.getRowIndex(), CommonConstants.ZERO_INT, infoVo.getEmpIdcard(), infoVo.getSocialHousehold(), infoVo.getProvidentHousehold(), infoVo.getEmpName(),
								"无对应员工（身份证：" + infoVo.getEmpIdcard() + ")" + "的社保数据(请查验社保缴纳地)"));
						continue;
					}
				} else {
					tSocialInfo = null;
				}

				//导入模板判重 养老
				exitMoney = infoVo.getEmpIdcard().concat(infoVo.getSocialPayMonth().concat(infoVo.getSocialCreateMonth()).concat(SocialConstants.YL));
				if (pensionMoneyMap.get(exitMoney) != null && BigDecimalUtils.safeMultiply(BigDecimalUtils.safeAdd(
						BigDecimalUtils.isNullToZero(infoVo.getUnitPensionMoney()), BigDecimalUtils.isNullToZero(
								infoVo.getPersonalPensionMoney())), pensionMoneyMap.get(exitMoney),6).compareTo(BigDecimal.ZERO) > 0) {
					errorMessageMap.put(UUID.randomUUID().toString(),new ErrorDetailVO(infoVo.getRowIndex(), CommonConstants.ZERO_INT, infoVo.getEmpIdcard(), infoVo.getSocialHousehold(), infoVo.getProvidentHousehold(), infoVo.getEmpName(), SocialConstants.ERROR_TEMPLATE + "的养老缴费数据"));
					continue;
				} else {
					pensionMoneyMap.put(exitMoney, BigDecimalUtils.safeAdd(BigDecimalUtils.isNullToZero(infoVo.getUnitPensionMoney()),
							BigDecimalUtils.isNullToZero(infoVo.getPersonalPensionMoney())));
				}
				//补缴
				exitMoney = infoVo.getEmpIdcard().concat(infoVo.getSocialPayMonth().concat(infoVo.getSocialCreateMonth()).concat(SocialConstants.BJ));
				if (accrualMoneyMap.get(exitMoney) != null && BigDecimalUtils.safeMultiply(BigDecimalUtils.safeAdd(
						BigDecimalUtils.isNullToZero(infoVo.getPersonalAccrual()), BigDecimalUtils.isNullToZero(
								infoVo.getCompanyAccrual())), accrualMoneyMap.get(exitMoney),6).compareTo(BigDecimal.ZERO) > 0) {
					errorMessageMap.put(UUID.randomUUID().toString(),new ErrorDetailVO(infoVo.getRowIndex(), CommonConstants.ZERO_INT, infoVo.getEmpIdcard(), infoVo.getSocialHousehold(), infoVo.getProvidentHousehold(), infoVo.getEmpName(), SocialConstants.ERROR_TEMPLATE + "的补缴缴费数据"));
					continue;
				} else {
					accrualMoneyMap.put(exitMoney, BigDecimalUtils.safeAdd(
							BigDecimalUtils.isNullToZero(infoVo.getPersonalAccrual()),
							BigDecimalUtils.isNullToZero(infoVo.getCompanyAccrual())));
				}
				//医疗
				exitMoney = infoVo.getEmpIdcard().concat(infoVo.getSocialPayMonth().concat(infoVo.getSocialCreateMonth()).concat(SocialConstants.YB));
				if (medicalMoneyMap.get(exitMoney) != null && BigDecimalUtils.safeMultiply(BigDecimalUtils.safeAdd(
						BigDecimalUtils.isNullToZero(infoVo.getUnitMedicalMoney()), BigDecimalUtils.isNullToZero(
								infoVo.getPersonalMedicalMoney())), medicalMoneyMap.get(exitMoney),6).compareTo(BigDecimal.ZERO) > 0) {
					errorMessageMap.put(UUID.randomUUID().toString(),new ErrorDetailVO(infoVo.getRowIndex(), CommonConstants.ZERO_INT, infoVo.getEmpIdcard(), infoVo.getSocialHousehold(), infoVo.getProvidentHousehold(), infoVo.getEmpName(), SocialConstants.ERROR_TEMPLATE + "的医保缴费数据"));
					continue;
				} else {
					medicalMoneyMap.put(exitMoney, BigDecimalUtils.safeAdd(
							BigDecimalUtils.isNullToZero(infoVo.getUnitMedicalMoney()),
							BigDecimalUtils.isNullToZero(infoVo.getPersonalMedicalMoney())));
				}
				//失业
				exitMoney = infoVo.getEmpIdcard().concat(infoVo.getSocialPayMonth().concat(infoVo.getSocialCreateMonth()).concat(SocialConstants.SY));
				if (unEmpMoneyMap.get(exitMoney) != null && BigDecimalUtils.safeMultiply(BigDecimalUtils.safeAdd(
						BigDecimalUtils.isNullToZero(infoVo.getUnitUnemploymentMoney()), BigDecimalUtils.isNullToZero(
								infoVo.getPersonalUnemploymentMoney())), unEmpMoneyMap.get(exitMoney),6).compareTo(BigDecimal.ZERO) > 0) {
					errorMessageMap.put(UUID.randomUUID().toString(),new ErrorDetailVO(infoVo.getRowIndex(), CommonConstants.ZERO_INT, infoVo.getEmpIdcard(), infoVo.getSocialHousehold(), infoVo.getProvidentHousehold(), infoVo.getEmpName(), SocialConstants.ERROR_TEMPLATE + "的失业缴费数据"));
					continue;
				} else {
					unEmpMoneyMap.put(exitMoney, BigDecimalUtils.safeAdd(
							BigDecimalUtils.isNullToZero(infoVo.getUnitUnemploymentMoney()),
							BigDecimalUtils.isNullToZero(infoVo.getPersonalUnemploymentMoney())));
				}
				//工伤
				exitMoney = infoVo.getEmpIdcard().concat(infoVo.getSocialPayMonth().concat(infoVo.getSocialCreateMonth()).concat(SocialConstants.GS));
				if (injuryMoneyMap.get(exitMoney) != null && BigDecimalUtils.safeMultiply(BigDecimalUtils.isNullToZero(infoVo.getUnitInjuryMoney()),
						injuryMoneyMap.get(exitMoney)).compareTo(BigDecimal.ZERO) > 0) {
					errorMessageMap.put(UUID.randomUUID().toString(),new ErrorDetailVO(infoVo.getRowIndex(), CommonConstants.ZERO_INT, infoVo.getEmpIdcard(), infoVo.getSocialHousehold(), infoVo.getProvidentHousehold(), infoVo.getEmpName(), SocialConstants.ERROR_TEMPLATE + "的工伤缴费数据"));
					continue;
				} else {
					injuryMoneyMap.put(exitMoney, BigDecimalUtils.isNullToZero(infoVo.getUnitInjuryMoney()));
				}
				//生育
				exitMoney = infoVo.getEmpIdcard().concat(infoVo.getSocialPayMonth().concat(infoVo.getSocialCreateMonth()).concat(SocialConstants.BIR));
				if (birMoneyMap.get(exitMoney) != null && BigDecimalUtils.safeMultiply(BigDecimalUtils.isNullToZero(infoVo.getUnitBirthMoney()),
						birMoneyMap.get(exitMoney),6).compareTo(BigDecimal.ZERO) > 0) {
					errorMessageMap.put(UUID.randomUUID().toString(),new ErrorDetailVO(infoVo.getRowIndex(), CommonConstants.ZERO_INT, infoVo.getEmpIdcard(), infoVo.getSocialHousehold(), infoVo.getProvidentHousehold(), infoVo.getEmpName(), SocialConstants.ERROR_TEMPLATE + "的生育缴费数据"));
					continue;
				} else {
					birMoneyMap.put(exitMoney, BigDecimalUtils.isNullToZero(infoVo.getUnitBirthMoney()));
				}
				//医疗救助金
				exitMoney = infoVo.getEmpIdcard().concat(infoVo.getSocialPayMonth().concat(infoVo.getSocialCreateMonth()).concat(SocialConstants.DB));
				if (bigMoneyMap.get(exitMoney) != null && BigDecimalUtils.safeMultiply(BigDecimalUtils.safeAdd(
								BigDecimalUtils.isNullToZero(infoVo.getUnitBigmailmentMoney()),
								BigDecimalUtils.isNullToZero(infoVo.getPersonalBigmailmentMoney())),
						bigMoneyMap.get(exitMoney),6).compareTo(BigDecimal.ZERO) > 0) {
					errorMessageMap.put(UUID.randomUUID().toString(),new ErrorDetailVO(infoVo.getRowIndex(), CommonConstants.ZERO_INT, infoVo.getEmpIdcard(), infoVo.getSocialHousehold(), infoVo.getProvidentHousehold(), infoVo.getEmpName(), SocialConstants.ERROR_TEMPLATE + "的医疗救助金缴费数据"));
					continue;
				} else {
					bigMoneyMap.put(exitMoney, BigDecimalUtils.safeAdd(
							BigDecimalUtils.isNullToZero(infoVo.getUnitBigmailmentMoney()),
							BigDecimalUtils.isNullToZero(infoVo.getPersonalBigmailmentMoney())));
				}

				//判断是否存在养老缴费数据
				if (BigDecimalUtils.safeAdd(BigDecimalUtils.isNullToZero(infoVo.getUnitPensionMoney()),
						BigDecimalUtils.isNullToZero(infoVo.getPersonalPensionMoney())).compareTo(BigDecimal.ZERO) != 0) {
					paymentInfo = paymentInfoPensionMap.get(infoVo.getSocialPayAddr()
							+ CommonConstants.DOWN_LINE_STRING
							+ infoVo.getEmpIdcard().trim()
							+ CommonConstants.DOWN_LINE_STRING
							+ infoVo.getSocialPayMonth().trim()
							+ CommonConstants.DOWN_LINE_STRING
							+ infoVo.getSocialCreateMonth().trim()
							+ CommonConstants.DOWN_LINE_STRING
							+ SocialConstants.YL);

					//存在社保缴费数据
					if (null != paymentInfo && ((null != paymentInfo.getYlSameFlg() && CommonConstants.ONE_STRING.equals(paymentInfo.getYlSameFlg()))
							|| (BigDecimalUtils.safeMultiply(BigDecimalUtils.safeAdd(BigDecimalUtils.isNullToZero(infoVo.getUnitPensionMoney()),
							BigDecimalUtils.isNullToZero(infoVo.getPersonalPensionMoney())), BigDecimalUtils.safeAdd(
							BigDecimalUtils.isNullToZero(paymentInfo.getUnitPensionMoney()),
							BigDecimalUtils.isNullToZero(paymentInfo.getPersonalPensionMoney())),6).compareTo(BigDecimal.ZERO) > 0))) {
						errorMessageMap.put(UUID.randomUUID().toString(),new ErrorDetailVO(infoVo.getRowIndex(), CommonConstants.ZERO_INT, infoVo.getEmpIdcard(), paymentInfo.getSocialHousehold(), paymentInfo.getProvidentHousehold(), infoVo.getEmpName(), "已存在对应员工身份证" + infoVo.getEmpIdcard()
								+ "的养老缴费数据,请勿重复导入！"));
						continue;
					}
				}

				//判断是否存在补缴缴费数据
				if (BigDecimalUtils.safeAdd(BigDecimalUtils.isNullToZero(infoVo.getPersonalAccrual()),
						BigDecimalUtils.isNullToZero(infoVo.getCompanyAccrual())).compareTo(BigDecimal.ZERO) != 0) {
					paymentInfo = paymentInfoaccrualMap.get(infoVo.getSocialPayAddr()
							+ CommonConstants.DOWN_LINE_STRING
							+ infoVo.getEmpIdcard().trim()
							+ CommonConstants.DOWN_LINE_STRING
							+ infoVo.getSocialPayMonth().trim()
							+ CommonConstants.DOWN_LINE_STRING
							+ infoVo.getSocialCreateMonth().trim()
							+ CommonConstants.DOWN_LINE_STRING
							+ SocialConstants.BJ);

					//存在社保缴费数据
					if (null != paymentInfo && ((null != paymentInfo.getBjSameFlg() && CommonConstants.ONE_STRING.equals(paymentInfo.getBjSameFlg()))
							|| (BigDecimalUtils.safeMultiply(BigDecimalUtils.safeAdd(BigDecimalUtils.isNullToZero(infoVo.getPersonalAccrual()),
							BigDecimalUtils.isNullToZero(infoVo.getCompanyAccrual())), BigDecimalUtils.safeAdd(
							BigDecimalUtils.isNullToZero(paymentInfo.getPersonalAccrual()),
							BigDecimalUtils.isNullToZero(paymentInfo.getCompanyAccrual())),6).compareTo(BigDecimal.ZERO) > 0))) {
						errorMessageMap.put(UUID.randomUUID().toString(),new ErrorDetailVO(infoVo.getRowIndex(), CommonConstants.ZERO_INT, infoVo.getEmpIdcard(), paymentInfo.getSocialHousehold(), paymentInfo.getProvidentHousehold(), infoVo.getEmpName(), "已存在对应员工身份证" + infoVo.getEmpIdcard()
								+ "的补缴缴费数据,请勿重复导入！"));
						continue;
					}
				}

				//判断是否存在失业缴费数据
				if (BigDecimalUtils.safeAdd(BigDecimalUtils.isNullToZero(infoVo.getUnitUnemploymentMoney()),
						BigDecimalUtils.isNullToZero(infoVo.getPersonalUnemploymentMoney())).compareTo(BigDecimal.ZERO) != 0) {
					paymentInfo = paymentInfoUnEmpMap.get(infoVo.getSocialPayAddr()
							+ CommonConstants.DOWN_LINE_STRING
							+ infoVo.getEmpIdcard().trim()
							+ CommonConstants.DOWN_LINE_STRING
							+ infoVo.getSocialPayMonth().trim()
							+ CommonConstants.DOWN_LINE_STRING
							+ infoVo.getSocialCreateMonth().trim()
							+ CommonConstants.DOWN_LINE_STRING
							+ SocialConstants.SY);
					//存在社保缴费数据
					if (null != paymentInfo && ((null != paymentInfo.getSySameFlg() && CommonConstants.ONE_STRING.equals(paymentInfo.getSySameFlg()))
							|| (BigDecimalUtils.safeMultiply(BigDecimalUtils.safeAdd(
							BigDecimalUtils.isNullToZero(infoVo.getUnitUnemploymentMoney()),
							BigDecimalUtils.isNullToZero(infoVo.getPersonalUnemploymentMoney())), BigDecimalUtils.safeAdd(
							BigDecimalUtils.isNullToZero(paymentInfo.getUnitUnemploymentMoney()),
							BigDecimalUtils.isNullToZero(paymentInfo.getPersonalUnemploymentMoney())),6).compareTo(BigDecimal.ZERO) > 0))) {
						errorMessageMap.put(UUID.randomUUID().toString(),new ErrorDetailVO(infoVo.getRowIndex(), CommonConstants.ZERO_INT, infoVo.getEmpIdcard(), paymentInfo.getSocialHousehold(), paymentInfo.getProvidentHousehold(), infoVo.getEmpName(), "已存在对应员工身份证" + infoVo.getEmpIdcard()
								+ "的失业缴费数据,请勿重复导入！"));
						continue;
					}
				}

				//判断是否存在医保缴费数据
				if (BigDecimalUtils.safeAdd(BigDecimalUtils.isNullToZero(infoVo.getUnitMedicalMoney()),
						BigDecimalUtils.isNullToZero(infoVo.getPersonalMedicalMoney())).compareTo(BigDecimal.ZERO) != 0) {
					paymentInfo = paymentInfoMedicalMap.get(infoVo.getSocialPayAddr()
							+ CommonConstants.DOWN_LINE_STRING
							+ infoVo.getEmpIdcard().trim()
							+ CommonConstants.DOWN_LINE_STRING
							+ infoVo.getSocialPayMonth().trim()
							+ CommonConstants.DOWN_LINE_STRING
							+ infoVo.getSocialCreateMonth().trim()
							+ CommonConstants.DOWN_LINE_STRING
							+ SocialConstants.YB);

					//存在社保缴费数据
					if (null != paymentInfo && ((null != paymentInfo.getYbSameFlg() && CommonConstants.ONE_STRING.equals(paymentInfo.getYbSameFlg()))
							|| (BigDecimalUtils.safeMultiply(BigDecimalUtils.safeAdd(
							BigDecimalUtils.isNullToZero(infoVo.getUnitMedicalMoney()),
							BigDecimalUtils.isNullToZero(infoVo.getPersonalMedicalMoney())), BigDecimalUtils.safeAdd(
							BigDecimalUtils.isNullToZero(paymentInfo.getUnitMedicalMoney()),
							BigDecimalUtils.isNullToZero(paymentInfo.getPersonalMedicalMoney())),6).compareTo(BigDecimal.ZERO) > 0))) {
						errorMessageMap.put(UUID.randomUUID().toString(),new ErrorDetailVO(infoVo.getRowIndex(), CommonConstants.ZERO_INT, infoVo.getEmpIdcard(), paymentInfo.getSocialHousehold(), paymentInfo.getProvidentHousehold(), infoVo.getEmpName(), "已存在对应员工身份证" + infoVo.getEmpIdcard()
								+ "的医保缴费数据,请勿重复导入！"));
						continue;
					}
				}

				//判断是否存在医疗救助金缴费数据
				if (BigDecimalUtils.safeAdd(BigDecimalUtils.isNullToZero(infoVo.getPersonalBigmailmentMoney()),
						BigDecimalUtils.isNullToZero(infoVo.getUnitBigmailmentMoney())).compareTo(BigDecimal.ZERO) != 0) {
					paymentInfo = paymentInfoBigMap.get(infoVo.getSocialPayAddr()
							+ CommonConstants.DOWN_LINE_STRING
							+ infoVo.getEmpIdcard().trim()
							+ CommonConstants.DOWN_LINE_STRING
							+ infoVo.getSocialPayMonth().trim()
							+ CommonConstants.DOWN_LINE_STRING
							+ infoVo.getSocialCreateMonth().trim()
							+ CommonConstants.DOWN_LINE_STRING
							+ SocialConstants.DB);
					//存在社保缴费数据
					if (null != paymentInfo && ((null != paymentInfo.getDbSameFlg() && CommonConstants.ONE_STRING.equals(paymentInfo.getDbSameFlg()))
							|| (BigDecimalUtils.safeMultiply(BigDecimalUtils.safeAdd(
							BigDecimalUtils.isNullToZero(infoVo.getUnitBigmailmentMoney()),
							BigDecimalUtils.isNullToZero(infoVo.getPersonalBigmailmentMoney())), BigDecimalUtils.safeAdd(
							BigDecimalUtils.isNullToZero(paymentInfo.getUnitBigmailmentMoney()),
							BigDecimalUtils.isNullToZero(paymentInfo.getPersonalBigmailmentMoney())),6).compareTo(BigDecimal.ZERO) > 0))) {
						errorMessageMap.put(UUID.randomUUID().toString(),new ErrorDetailVO(infoVo.getRowIndex(), CommonConstants.ZERO_INT, infoVo.getEmpIdcard(), paymentInfo.getSocialHousehold(), paymentInfo.getProvidentHousehold(), infoVo.getEmpName(), "已存在对应员工身份证" + infoVo.getEmpIdcard()
								+ "的医疗救助金缴费数据,请勿重复导入！"));
						continue;
					}
				}

				//判断是否存在工伤缴费数据
				if (BigDecimalUtils.isNullToZero(infoVo.getUnitInjuryMoney()).compareTo(BigDecimal.ZERO) != 0) {
					paymentInfo = paymentInfoInjuryMap.get(infoVo.getSocialPayAddr()
							+ CommonConstants.DOWN_LINE_STRING
							+ infoVo.getEmpIdcard().trim()
							+ CommonConstants.DOWN_LINE_STRING
							+ infoVo.getSocialPayMonth().trim()
							+ CommonConstants.DOWN_LINE_STRING
							+ infoVo.getSocialCreateMonth().trim()
							+ CommonConstants.DOWN_LINE_STRING
							+ SocialConstants.GS);
					//存在社保缴费数据
					if (null != paymentInfo && ((null != paymentInfo.getGsSameFlg() && CommonConstants.ONE_STRING.equals(paymentInfo.getGsSameFlg()))
							|| (BigDecimalUtils.safeMultiply(BigDecimalUtils.isNullToZero(infoVo.getUnitInjuryMoney()),
							BigDecimalUtils.isNullToZero(paymentInfo.getUnitInjuryMoney()),6).compareTo(BigDecimal.ZERO) > 0))) {
						errorMessageMap.put(UUID.randomUUID().toString(),new ErrorDetailVO(infoVo.getRowIndex(), CommonConstants.ZERO_INT, infoVo.getEmpIdcard(), paymentInfo.getSocialHousehold(), paymentInfo.getProvidentHousehold(), infoVo.getEmpName(), "已存在对应员工身份证" + infoVo.getEmpIdcard()
								+ "的单位工伤缴费数据,请勿重复导入！"));
						continue;
					}
				}

				//判断是否存在生育缴费数据
				if (BigDecimalUtils.isNullToZero(infoVo.getUnitBirthMoney()).compareTo(BigDecimal.ZERO) != 0) {
					paymentInfo = paymentInfoBirMap.get(infoVo.getSocialPayAddr()
							+ CommonConstants.DOWN_LINE_STRING
							+ infoVo.getEmpIdcard().trim()
							+ CommonConstants.DOWN_LINE_STRING
							+ infoVo.getSocialPayMonth().trim()
							+ CommonConstants.DOWN_LINE_STRING
							+ infoVo.getSocialCreateMonth().trim()
							+ CommonConstants.DOWN_LINE_STRING
							+ SocialConstants.BIR);
					//存在社保缴费数据
					if (null != paymentInfo && ((null != paymentInfo.getBrSameFlg() && CommonConstants.ONE_STRING.equals(paymentInfo.getBrSameFlg()))
							|| (BigDecimalUtils.safeMultiply(BigDecimalUtils.isNullToZero(infoVo.getUnitBirthMoney()),
							BigDecimalUtils.isNullToZero(paymentInfo.getUnitBirthMoney()),6).compareTo(BigDecimal.ZERO) > 0))) {
						errorMessageMap.put(UUID.randomUUID().toString(),new ErrorDetailVO(infoVo.getRowIndex(), CommonConstants.ZERO_INT, infoVo.getEmpIdcard(), paymentInfo.getSocialHousehold(), paymentInfo.getProvidentHousehold(), infoVo.getEmpName(), "已存在对应员工身份证" + infoVo.getEmpIdcard()
								+ "的单位生育缴费数据,请勿重复导入！"));
						continue;
					}
				}
				if (Common.isEmpty(tSocialInfo)) {
					tSocialInfo = socialInfoMapper.selectOne(Wrappers.<TSocialInfo>query().lambda()
							.eq(TSocialInfo::getEmpIdcard, infoVo.getEmpIdcard()).groupBy(TSocialInfo::getCreateTime)
							.in(TSocialInfo::getHandleStatus,CommonConstants.socialInfoStatus)
							.last(CommonConstants.LAST_ONE_SQL));
				}

				paymentInfo = new TPaymentInfo();
				paymentInfo.setLockStatus(CommonConstants.ZERO_STRING);
				if (Common.isNotNull(socialInfo)) {
					paymentInfo.setEmpId(socialInfo.getEmpId());
					paymentInfo.setEmpIdcard(socialInfo.getEmpIdcard());
					paymentInfo.setEmpName(socialInfo.getEmpName());
					//获取项目信息
					if (Common.isNotNull(domainMap)) {
						domain = domainMap.get(socialInfo.getSettleDomainCode());
					} else {
						domain = null;
					}
					if (Common.isEmpty(domain)) {
						errorMessageMap.put(UUID.randomUUID().toString(), new ErrorDetailVO(infoVo.getRowIndex(),
								CommonConstants.ZERO_INT, infoVo.getEmpIdcard(), paymentInfo.getSocialHousehold(),
								paymentInfo.getProvidentHousehold(), infoVo.getEmpName(), SocialConstants.NOT_EXIT_SETTLEiNFO));
						continue;
					}
					paymentInfo.setBpoFlag(domain.getBpoFlag());
					paymentInfo.setSecondIndicatorBelong(domain.getSecondIndicatorBelong());
					paymentInfo.setSettleDomainId(socialInfo.getSettleDomain());
					paymentInfo.setSettleDomainName(socialInfo.getSettleDomainName());
					paymentInfo.setSettleDomainCode(socialInfo.getSettleDomainCode());
					paymentInfo.setUnitId(socialInfo.getUnitId());
					paymentInfo.setUnitName(socialInfo.getUnitName());
					paymentInfo.setSocialProvince(socialInfo.getSocialProvince());
					paymentInfo.setSocialCity(socialInfo.getSocialCity());
					paymentInfo.setSocialTown(socialInfo.getSocialTown());
					paymentInfo.setSocialHousehold(socialInfo.getSocialHouseholdName());
				} else if (Common.isNotNull(tSocialInfo)) {
					paymentInfo.setEmpId(tSocialInfo.getEmpId());
					paymentInfo.setEmpIdcard(tSocialInfo.getEmpIdcard());
					paymentInfo.setEmpName(tSocialInfo.getEmpName());
					//获取项目信息
					if (Common.isNotNull(domainMap)) {
						domain = domainMap.get(tSocialInfo.getSettleDomainCode());
					} else {
						domain = null;
					}
					if (Common.isEmpty(domain)) {
						errorMessageMap.put(UUID.randomUUID().toString(), new ErrorDetailVO(infoVo.getRowIndex(),
								CommonConstants.ZERO_INT, infoVo.getEmpIdcard(), paymentInfo.getSocialHousehold(),
								paymentInfo.getProvidentHousehold(), infoVo.getEmpName(), SocialConstants.NOT_EXIT_SETTLEiNFO));
						continue;
					}
					paymentInfo.setSettleDomainName(domain.getDepartName());
					paymentInfo.setSecondIndicatorBelong(domain.getSecondIndicatorBelong());
					paymentInfo.setUnitId(domain.getCustomerId());
					paymentInfo.setUnitName(domain.getCustomerName());
					paymentInfo.setBpoFlag(domain.getBpoFlag());
					paymentInfo.setSettleDomainId(tSocialInfo.getSettleDomain());
					paymentInfo.setSettleDomainCode(tSocialInfo.getSettleDomainCode());
					paymentInfo.setSocialProvince(tSocialInfo.getSocialProvince());
					paymentInfo.setSocialCity(tSocialInfo.getSocialCity());
					paymentInfo.setSocialTown(tSocialInfo.getSocialTown());
					paymentInfo.setSocialHousehold(tSocialInfo.getSocialHouseholdName());
				}
				// 项目信息校验
				errorInfo = settleInfoCheck(paymentInfo);
				if (!Common.isEmpty(errorInfo)){
					errorMessageMap.put(UUID.randomUUID().toString(), new ErrorDetailVO(infoVo.getRowIndex(),
							CommonConstants.ZERO_INT, infoVo.getEmpIdcard(), paymentInfo.getSocialHousehold(),
							paymentInfo.getProvidentHousehold(), infoVo.getEmpName(), SocialConstants.ERROR_PRI
							+ errorInfo + SocialConstants.ERROR_END));
					continue;
				}
				if (Common.isNotNull(tSocialInfo)) {
					paymentInfo.setInauguralTeam(tSocialInfo.getInauguralTeam());
					paymentInfo.setEmpNo(tSocialInfo.getEmpNo());
				}
				paymentInfo.setSocialPayMonth(infoVo.getSocialPayMonth());

				if (null != paymentInfo.getSocialProvince()) {
					temp = areaMap.get(paymentInfo.getSocialProvince());
					if (Common.isNotNull(temp)) {
						paymentInfo.setSocialPayAddr(temp);
					}
				}
				if (null != paymentInfo.getSocialCity()) {
					temp = areaMap.get(paymentInfo.getSocialCity());
					if (Common.isNotNull(temp)) {
						paymentInfo.setSocialPayAddr(paymentInfo.getSocialPayAddr() + CommonConstants.CENTER_SPLIT_LINE_STRING + temp);
					}
				}
				if (null != paymentInfo.getSocialTown()) {
					temp = areaMap.get(paymentInfo.getSocialTown());
					if (Common.isNotNull(temp)) {
						paymentInfo.setSocialPayAddr(paymentInfo.getSocialPayAddr() + CommonConstants.CENTER_SPLIT_LINE_STRING + temp);
					}
				}
				paymentInfo.setSocialSecurityNo(infoVo.getSocialSecurityNo());
				paymentInfo.setSocialCreateMonth(infoVo.getSocialCreateMonth());
				paymentInfo.setUnitPensionMoney(infoVo.getUnitPensionMoney());
				paymentInfo.setUnitMedicalMoney(infoVo.getUnitMedicalMoney());
				paymentInfo.setUnitBirthMoney(null == infoVo.getUnitBirthMoney() ? BigDecimal.ZERO : infoVo.getUnitBirthMoney());
				paymentInfo.setUnitBigmailmentMoney(infoVo.getUnitBigmailmentMoney());
				paymentInfo.setUnitInjuryMoney(infoVo.getUnitInjuryMoney());
				paymentInfo.setUnitUnemploymentMoney(infoVo.getUnitUnemploymentMoney());
				paymentInfo.setPersonalBigmailmentMoney(infoVo.getPersonalBigmailmentMoney());
				paymentInfo.setPersonalUnemploymentMoney(infoVo.getPersonalUnemploymentMoney());
				paymentInfo.setPersonalPensionMoney(infoVo.getPersonalPensionMoney());
				paymentInfo.setPersonalMedicalMoney(null == infoVo.getPersonalMedicalMoney()
						? BigDecimal.ZERO : infoVo.getPersonalMedicalMoney());
				paymentInfo.setUnitPensionSet(infoVo.getUnitPensionSet());
				paymentInfo.setUnitPensionPer(infoVo.getUnitPensionPer());
				paymentInfo.setUnitMedicalSet(infoVo.getUnitMedicalSet());
				paymentInfo.setUnitMedicalPer(infoVo.getUnitMedicalPer());
				paymentInfo.setUnitBirthSet(null == infoVo.getUnitBirthSet() ? BigDecimal.ZERO : infoVo.getUnitBirthSet());
				paymentInfo.setUnitBirthPer(infoVo.getUnitBirthPer());
				paymentInfo.setUnitInjurySet(infoVo.getUnitInjurySet());
				paymentInfo.setUnitInjuryPer(infoVo.getUnitInjuryPer());
				paymentInfo.setUnitUnemploymentSet(infoVo.getUnitUnemploymentSet());
				paymentInfo.setUnitUnemploymentPer(infoVo.getUnitUnemploymentPer());
				paymentInfo.setUnitBigailmentPer(infoVo.getUnitBigailmentPer());
				paymentInfo.setPersonalPensionPer(infoVo.getPersonalPensionPer());
				paymentInfo.setPersonalMedicalPer(infoVo.getPersonalMedicalPer());
				paymentInfo.setPersonalUnemploymentPer(infoVo.getPersonalUnemploymentPer());
				paymentInfo.setPersonalBigailmentPer(infoVo.getPersonalBigailmentPer());
				paymentInfo.setCompanyAccrual(infoVo.getCompanyAccrual());
				paymentInfo.setPersonalAccrual(infoVo.getPersonalAccrual());
				paymentInfo.setUnitSocialSum(BigDecimalUtils.safeAdd(paymentInfo.getUnitPensionMoney()
						, paymentInfo.getUnitMedicalMoney(), paymentInfo.getUnitBirthMoney()
						, paymentInfo.getUnitInjuryMoney()
						, paymentInfo.getUnitUnemploymentMoney()
						, paymentInfo.getUnitBigmailmentMoney()
						, paymentInfo.getCompanyAccrual()));
				paymentInfo.setSocialSecurityPersonalSum(BigDecimalUtils.safeAdd(paymentInfo.getPersonalBigmailmentMoney()
						, paymentInfo.getPersonalPensionMoney()
						, paymentInfo.getPersonalMedicalMoney()
						, paymentInfo.getPersonalUnemploymentMoney()
						, paymentInfo.getPersonalAccrual()));
				paymentInfo.setSocialSum(BigDecimalUtils.safeAdd(
						paymentInfo.getUnitSocialSum(), paymentInfo.getSocialSecurityPersonalSum()));
				paymentInfo.setSumAll(paymentInfo.getSocialSum());
				paymentInfo.setCreateBy(user.getId());
				paymentInfo.setCreateName(user.getNickname());
				paymentInfo.setSocialId(UUID.randomUUID().toString());
				int res = baseMapper.insert(paymentInfo);
				if (res < 0) {
					errorMessageMap.put(UUID.randomUUID().toString(),new ErrorDetailVO(infoVo.getRowIndex(), CommonConstants.ZERO_INT, infoVo.getEmpIdcard(), paymentInfo.getSocialHousehold(), paymentInfo.getProvidentHousehold(), infoVo.getEmpName(), CommonConstants.SAVE_FAILED));
				} else {
					errorMessageMap.put(UUID.randomUUID().toString(),new ErrorDetailVO(infoVo.getRowIndex(), CommonConstants.ONE_INT, infoVo.getEmpIdcard(), paymentInfo.getSocialHousehold(), paymentInfo.getProvidentHousehold(), infoVo.getEmpName(), CommonConstants.SAVE_SUCCESS));
				}
			}
		}
		return errorMessageMap;
	}

	@Override
	public R<List<ErrorDetailVO>> importSocialHeFeiDiy(InputStream inputStream, String random, String type) {
		YifuUser user = SecurityUtils.getUser();
		String sumNumKey = user.getId() + CommonConstants.DOWN_LINE_STRING + "sum_key";
		if (Common.isNotNull(redisUtil.get(sumNumKey))) {
			redisUtil.remove(sumNumKey);
		}
		String importSuccessKey = user.getId() + CommonConstants.DOWN_LINE_STRING + CommonConstants.PAYMENT_SOCIAL_WAIT_EXPORT;
		if (Common.isNotNull(redisUtil.get(importSuccessKey))) {
			redisUtil.remove(importSuccessKey);
		}
		//养老插入的集合
		ConcurrentHashMap<String,TPaymentInfo> batchYlInsertList = new ConcurrentHashMap<>();
		//工伤插入的集合
		ConcurrentHashMap<String,TPaymentInfo> batchGsInsertList = new ConcurrentHashMap<>();
		//失业插入的集合
		ConcurrentHashMap<String,TPaymentInfo> batchSyInsertList = new ConcurrentHashMap<>();
		//医疗插入的集合
		ConcurrentHashMap<String,TPaymentInfo> batchYyInsertList = new ConcurrentHashMap<>();
		//获取所有项目信息
		Map<String, TSettleDomainSelectVo> domainMap = this.getSelectVoMap();
		//地区数据
		HashMap<String, String> areaMap = new HashMap<>();
		HashMap<String, String> areaMap2 = new HashMap<>();
		R<AreaVo> areaListR = upmsDaprUtils.getAreaListR();
		if (Common.isNotNull(areaListR)) {
			AreaVo areaList = areaListR.getData();
			if (null != areaList && !areaList.getSysAreaList().isEmpty()) {
				for (SysArea area : areaList.getSysAreaList()) {
					areaMap.put(Integer.toString(area.getId()), area.getAreaName());
					areaMap2.put(area.getAreaName() + CommonConstants.DOWN_LINE_STRING + (
							null == area.getParentId() ? "null" : (0 == area.getParentId() ? "null" : Integer.toString(
									area.getParentId()))), Integer.toString(area.getId()));
				}
			}
		}
		ConcurrentHashMap<String, ErrorDetailVO> errorMessageMap = new ConcurrentHashMap<>();
		ExcelUtil<TPaymentHeFeiVo> util1 = new ExcelUtil<>(TPaymentHeFeiVo.class);
		ConcurrentHashMap<String, BigDecimal> pensionMoneyMap = new ConcurrentHashMap<>();
		ConcurrentHashMap<String, BigDecimal> bigMoneyMap = new ConcurrentHashMap<>();
		ConcurrentHashMap<String, BigDecimal> unEmpMoneyMap = new ConcurrentHashMap<>();
		ConcurrentHashMap<String, BigDecimal> injuryMoneyMap = new ConcurrentHashMap<>();
		ConcurrentHashMap<String, BigDecimal> medicalMoneyMap = new ConcurrentHashMap<>();
		// 写法2：
		// 匿名内部类 不用额外写一个DemoDataListener
		// 这里 需要指定读用哪个class去读，然后读取第一个sheet 文件流会自动关闭
		try {
			EasyExcel.read(inputStream, TPaymentHeFeiVo.class, new ReadListener<TPaymentHeFeiVo>() {
				/**
				 * 单次缓存的数据量
				 */
				public static final int BATCH_COUNT = CommonConstants.BATCH_COUNT;
				Integer rowNumber;
				/**
				 *临时存储
				 */
				private List<TPaymentHeFeiVo> cachedDataList = ListUtils.newArrayListWithExpectedSize(BATCH_COUNT);

				@Override
				public void invoke(TPaymentHeFeiVo data, AnalysisContext context) {
					// 获取总行数（含表头）
					rowNumber = context.readSheetHolder().getApproximateTotalRowNumber();

					ReadRowHolder readRowHolder = context.readRowHolder();
					Integer rowIndex = readRowHolder.getRowIndex();
					data.setRowIndex(rowIndex + 1);
					ErrorMessage errorMessage = util1.checkEntity(data, data.getRowIndex());
					if (Common.isNotNull(errorMessage)) {
						errorMessageMap.put(UUID.randomUUID().toString(),new ErrorDetailVO(errorMessage.getLineNum(), errorMessage.getMessage()));
					} else {
						cachedDataList.add(data);
					}
					if (cachedDataList.size() >= BATCH_COUNT) {
						saveData();
						// 存储完成清理 list
						cachedDataList = ListUtils.newArrayListWithExpectedSize(BATCH_COUNT);
					}
				}

				@Override
				public void doAfterAllAnalysed(AnalysisContext context) {
					saveData();
				}

				/**
				 * 加上存储数据库
				 */
				private void saveData() {
					log.info("{}条数据，开始存储数据库！", cachedDataList.size());
					importTPaymentSocialHeFei(cachedDataList, errorMessageMap, type, rowNumber, pensionMoneyMap,
							bigMoneyMap, unEmpMoneyMap, injuryMoneyMap, medicalMoneyMap, sumNumKey, importSuccessKey
							, batchGsInsertList,batchSyInsertList,batchYlInsertList,batchYyInsertList, areaMap,
							areaMap2,domainMap);
					log.info("存储数据库成功！");
				}
			}).sheet().doRead();
			pensionMoneyMap.clear();
			bigMoneyMap.clear();
			unEmpMoneyMap.clear();
			injuryMoneyMap.clear();
			medicalMoneyMap.clear();
			areaMap.clear();
			areaMap2.clear();
			domainMap.clear();
			//批量插入数据
			//养老
			List<TPaymentInfo> list;
			if (!batchYlInsertList.isEmpty()) {
				list = new ArrayList<>(batchYlInsertList.values());
				this.saveBatch(list);
				batchYlInsertList.clear();
				list.clear();
			}
			//工伤
			if (!batchGsInsertList.isEmpty()) {
				list = new ArrayList<>(batchGsInsertList.values());
				this.saveBatch(list);
				batchGsInsertList.clear();
				list.clear();
			}
			//医疗
			if (!batchYyInsertList.isEmpty()) {
				list = new ArrayList<>(batchYyInsertList.values());
				this.saveBatch(list);
				batchYyInsertList.clear();
				list.clear();
			}
			//失业
			if (!batchSyInsertList.isEmpty()) {
				list = new ArrayList<>(batchSyInsertList.values());
				this.saveBatch(list);
				batchSyInsertList.clear();
				list.clear();
			}
		} catch (Exception e) {
			log.error(CommonConstants.IMPORT_DATA_ANALYSIS_ERROR, e);
			return R.failed(CommonConstants.IMPORT_DATA_ANALYSIS_ERROR);
		}
		List<ErrorDetailVO> errorMessageList = new ArrayList<>(errorMessageMap.values());
		errorMessageMap.clear();
		return this.judgeAllMessage(errorMessageList);
	}

	@Override
	public R<List<ErrorMessage>> importTaxSocialInfoDiy(InputStream inputStream) {

		//养老插入的集合
		ConcurrentHashMap<String,TPaymentInfo> batchYlInsertList = new ConcurrentHashMap<>();
		//工伤插入的集合
		ConcurrentHashMap<String,TPaymentInfo> batchGsInsertList = new ConcurrentHashMap<>();
		//失业插入的集合
		ConcurrentHashMap<String,TPaymentInfo> batchSyInsertList = new ConcurrentHashMap<>();
		//医疗插入的集合
		ConcurrentHashMap<String,TPaymentInfo> batchYyInsertList = new ConcurrentHashMap<>();
		//大病插入的集合
		ConcurrentHashMap<String,TPaymentInfo> batchBigInsertList = new ConcurrentHashMap<>();
		//生育插入的集合
		ConcurrentHashMap<String,TPaymentInfo> batchBirthInsertList = new ConcurrentHashMap<>();
		//获取所有项目信息
		Map<String, TSettleDomainSelectVo> domainMap = this.getSelectVoMap();
		//地区数据
		HashMap<String, String> areaMap = new HashMap<>();
		HashMap<String, String> areaMap2 = new HashMap<>();
		R<AreaVo> areaListR = upmsDaprUtils.getAreaListR();
		if (Common.isNotNull(areaListR)) {
			AreaVo areaList = areaListR.getData();
			if (null != areaList && !areaList.getSysAreaList().isEmpty()) {
				for (SysArea area : areaList.getSysAreaList()) {
					areaMap.put(Integer.toString(area.getId()), area.getAreaName());
					areaMap2.put(area.getAreaName() + CommonConstants.DOWN_LINE_STRING + (
							null == area.getParentId() ? "null" : (0 == area.getParentId() ? "null" : Integer.toString(
									area.getParentId()))), Integer.toString(area.getId()));
				}
			}
		}
		ConcurrentHashMap<String, ErrorMessage> errorMessageMap = new ConcurrentHashMap<>();
		ExcelUtil<TPaymentTaxSocialVo> util1 = new ExcelUtil<>(TPaymentTaxSocialVo.class);
		ConcurrentHashMap<String, BigDecimal> pensionMoneyMap = new ConcurrentHashMap<>();
		ConcurrentHashMap<String, BigDecimal> bigMoneyMap = new ConcurrentHashMap<>();
		ConcurrentHashMap<String, BigDecimal> unEmpMoneyMap = new ConcurrentHashMap<>();
		ConcurrentHashMap<String, BigDecimal> injuryMoneyMap = new ConcurrentHashMap<>();
		ConcurrentHashMap<String, BigDecimal> medicalMoneyMap = new ConcurrentHashMap<>();
		ConcurrentHashMap<String, BigDecimal> birthMoneyMap = new ConcurrentHashMap<>();
		// 写法2：
		// 匿名内部类 不用额外写一个DemoDataListener
		// 这里 需要指定读用哪个class去读，然后读取第一个sheet 文件流会自动关闭
		try {
			EasyExcel.read(inputStream, TPaymentTaxSocialVo.class, new ReadListener<TPaymentTaxSocialVo>() {
				/**
				 * 单次缓存的数据量
				 */
				public static final int BATCH_COUNT = CommonConstants.BATCH_COUNT;
				Integer rowNumber;
				/**
				 *临时存储
				 */
				private List<TPaymentTaxSocialVo> cachedDataList = ListUtils.newArrayListWithExpectedSize(BATCH_COUNT);

				@Override
				public void invoke(TPaymentTaxSocialVo data, AnalysisContext context) {
					// 获取总行数（含表头）
					rowNumber = context.readSheetHolder().getApproximateTotalRowNumber();

					ReadRowHolder readRowHolder = context.readRowHolder();
					Integer rowIndex = readRowHolder.getRowIndex();
					data.setRowIndex(rowIndex + 1);
					ErrorMessage errorMessage = util1.checkEntity(data, data.getRowIndex());
					if (Common.isNotNull(errorMessage)) {
						errorMessageMap.put(UUID.randomUUID().toString(),new ErrorMessage(errorMessage.getLineNum(), errorMessage.getMessage(),data));
					} else {
						cachedDataList.add(data);
					}
					if (cachedDataList.size() >= BATCH_COUNT) {
						saveData();
						// 存储完成清理 list
						cachedDataList = ListUtils.newArrayListWithExpectedSize(BATCH_COUNT);
					}
				}

				@Override
				public void doAfterAllAnalysed(AnalysisContext context) {
					saveData();
				}

				/**
				 * 加上存储数据库
				 */
				private void saveData() {
					log.info("{}条数据，开始存储数据库！", cachedDataList.size());
					importTPaymentSocialTax(cachedDataList, errorMessageMap, pensionMoneyMap,birthMoneyMap,
							bigMoneyMap, unEmpMoneyMap, injuryMoneyMap, medicalMoneyMap
							, batchGsInsertList,batchSyInsertList,batchYlInsertList,batchYyInsertList,
							batchBigInsertList, batchBirthInsertList,areaMap,
							areaMap2,domainMap);
					log.info("存储数据库成功！");
				}
			}).sheet().doRead();
			pensionMoneyMap.clear();
			bigMoneyMap.clear();
			unEmpMoneyMap.clear();
			injuryMoneyMap.clear();
			medicalMoneyMap.clear();
			birthMoneyMap.clear();
			areaMap.clear();
			areaMap2.clear();
			domainMap.clear();
			//批量插入数据
			List<TPaymentInfo> list;
			if (!batchYlInsertList.isEmpty()) {
				list = new ArrayList<>(batchYlInsertList.values());
				this.saveBatch(list);
				batchYlInsertList.clear();
				list.clear();
			}
			//工伤
			if (!batchGsInsertList.isEmpty()) {
				list = new ArrayList<>(batchGsInsertList.values());
				this.saveBatch(list);
				batchGsInsertList.clear();
				list.clear();
			}
			//医疗
			if (!batchYyInsertList.isEmpty()) {
				list = new ArrayList<>(batchYyInsertList.values());
				this.saveBatch(list);
				batchYyInsertList.clear();
				list.clear();
			}
			//失业
			if (!batchSyInsertList.isEmpty()) {
				list = new ArrayList<>(batchSyInsertList.values());
				this.saveBatch(list);
				batchSyInsertList.clear();
				list.clear();
			}
			//大病
			if (!batchBigInsertList.isEmpty()) {
				list = new ArrayList<>(batchBigInsertList.values());
				this.saveBatch(list);
				batchBigInsertList.clear();
				list.clear();
			}
			//生育
			if (!batchBirthInsertList.isEmpty()) {
				list = new ArrayList<>(batchBirthInsertList.values());
				this.saveBatch(list);
				batchBirthInsertList.clear();
				list.clear();
			}
		} catch (Exception e) {
			log.error(CommonConstants.IMPORT_DATA_ANALYSIS_ERROR, e);
			return R.failed(CommonConstants.IMPORT_DATA_ANALYSIS_ERROR);
		}
		List<ErrorMessage> errorMessageList = new ArrayList<>(errorMessageMap.values());
		errorMessageMap.clear();
		return this.judgeAllMessage1(errorMessageList);
	}

	private void batchSavePaymentFundInfo(List<TPaymentInfoVo> list, List<ErrorDetailVO> errorMessageList,
										  List<TPaymentInfo> batchInsertList,HashMap<String, String> areaMap,
										  HashMap<String, String> areaMap2,Map<String,TSettleDomainSelectVo> domainMap,
										  HashMap<String, Object> paymentInfoMap) {
		try {
			if (Common.isNotNull(list)) {
				TPaymentInfo paymentInfo = null;
				TSocialFundInfo fund;
				String temp;
				List<TProvidentFund> fundlist;
				TProvidentFund tProvidentFund = null;

				//获取身份证列表
				List<String> idcards = list.stream().map(TPaymentInfoVo::getEmpIdcard).collect(Collectors.toList());
				//已存在档案数据
				//已存在派增公积金数据
				List<TSocialFundInfo> fundList = socialFundInfoMapper.selectList(Wrappers.<TSocialFundInfo>query().lambda()
						.in(TSocialFundInfo::getEmpIdcard, Common.listObjectToStrList(list, ExcelAttributeConstants.EMPIDCARD)));
				HashMap<String, Object> fundMap = fundList.stream().collect(HashMap::new, (m, v) ->
						m.put(v.getEmpIdcard(), v), HashMap::putAll);

				List<String> monthList = list.stream().map(TPaymentInfoVo::getProvidentPayMonth).collect(Collectors.toList());

				//已存在社保缴费库数据  非删除状态
				List<TPaymentInfo> paymentInfos = baseMapper.selectListForPaymentImport1(monthList, idcards);

				if (Common.isNotNull(paymentInfos)) {
					for (TPaymentInfo info : paymentInfos) {
						paymentInfoMap.put(info.getProvidentPayAddr()
										+ CommonConstants.DOWN_LINE_STRING
										+ info.getEmpIdcard()
										+ CommonConstants.DOWN_LINE_STRING
										+ info.getProvidentPayMonth()
										+ CommonConstants.DOWN_LINE_STRING
										+ info.getProvidentCreateMonth()
										+ CommonConstants.DOWN_LINE_STRING
										+ BigDecimalUtils.safeAdd(info.getProvidentSum()).doubleValue()
								, info);
					}
				}
				String[] areaArray;
				TSettleDomain domain;
				String errorInfo;
				for (TPaymentInfoVo infoVo : list) {
					if (Common.isNotNull(infoVo.getEmpIdcard())) {
						infoVo.setEmpIdcard(infoVo.getEmpIdcard().replace("x", "X"));
					}
					//检查数据规范性
					if (!Common.isNotNull(infoVo.getEmpIdcard())) {
						errorMessageList.add(new ErrorDetailVO(infoVo.getRowIndex(), CommonConstants.ZERO_INT, infoVo.getEmpIdcard(), infoVo.getSocialHousehold(), infoVo.getProvidentHousehold(), infoVo.getEmpName(), CommonConstants.DOWN_LINE_STRING + "员工身份证不可为空！"));
						continue;
					}
					if (!Common.isNotNull(infoVo.getProvidentPayMonth())) {
						errorMessageList.add(new ErrorDetailVO(infoVo.getRowIndex(), CommonConstants.ZERO_INT, infoVo.getEmpIdcard(), infoVo.getSocialHousehold(), infoVo.getProvidentHousehold(), infoVo.getEmpName(), CommonConstants.DOWN_LINE_STRING + "公积金缴纳月份不可为空！"));
						continue;
					}
					if (!Common.isNotNull(infoVo.getProvidentCreateMonth())) {
						errorMessageList.add(new ErrorDetailVO(infoVo.getRowIndex(), CommonConstants.ZERO_INT, infoVo.getEmpIdcard(), infoVo.getSocialHousehold(), infoVo.getProvidentHousehold(), infoVo.getEmpName(), CommonConstants.DOWN_LINE_STRING + "公积金生成月份不可为空！"));
						continue;
					}
					if (!Common.isNotNull(infoVo.getProvidentPercent())) {
						errorMessageList.add(new ErrorDetailVO(infoVo.getRowIndex(), CommonConstants.ZERO_INT, infoVo.getEmpIdcard(), infoVo.getSocialHousehold(), infoVo.getProvidentHousehold(), infoVo.getEmpName(), CommonConstants.DOWN_LINE_STRING + "公积金单边比例不可为空！"));
						continue;
					}
					if (!Common.isNotNull(infoVo.getUnitProvidentSet())) {
						errorMessageList.add(new ErrorDetailVO(infoVo.getRowIndex(), CommonConstants.ZERO_INT, infoVo.getEmpIdcard(), infoVo.getSocialHousehold(), infoVo.getProvidentHousehold(), infoVo.getEmpName(), CommonConstants.DOWN_LINE_STRING + "公积金单边基数不可为空！"));
						continue;
					}
					if (!Common.isNotNull(infoVo.getProvidentPayAddr())) {
						errorMessageList.add(new ErrorDetailVO(infoVo.getRowIndex(), CommonConstants.ZERO_INT, infoVo.getEmpIdcard(), infoVo.getSocialHousehold(), infoVo.getProvidentHousehold(), infoVo.getEmpName(), CommonConstants.DOWN_LINE_STRING + "公积金缴纳地不可为空！"));
						continue;
					}
					if (fundMap.size() > CommonConstants.ZERO_INT) {
						fund = (TSocialFundInfo) fundMap.get(infoVo.getEmpIdcard());
						//对身份证与人员姓名的对应关系进行校验
						if (null != fund && !fund.getEmpName().equals(infoVo.getEmpName())) {
							errorMessageList.add
									(new ErrorDetailVO(infoVo.getRowIndex(), CommonConstants.ZERO_INT, infoVo.getEmpIdcard(), fund.getSocialHousehold(), fund.getProvidentHousehold(), infoVo.getEmpName(), "姓名与身份证信息不一致，请核实后再次尝试！"));
							continue;
						}
						areaArray = infoVo.getProvidentPayAddr().split(CommonConstants.CENTER_SPLIT_LINE_STRING);
						fund = checkAddress(areaArray, areaMap, fund, areaMap2, infoVo);
						//无对应员工公积金数据
						if (null == fund) {
							boolean isTrueAdder = false;
							fundlist = providentFundMapper.selectList(Wrappers.<TProvidentFund>query().lambda()
									.eq(TProvidentFund::getEmpIdcard, infoVo.getEmpIdcard())
									.eq(TProvidentFund::getFundProvince, infoVo.getFundProvince())
									.eq(TProvidentFund::getDeleteFlag,CommonConstants.ZERO_INT) //添加删除状态兼容历史数据
									.eq(TProvidentFund::getFundCity, infoVo.getFundCity()));
							if (CollectionUtils.isNotEmpty(fundlist)) {
								for (TProvidentFund providentFund : fundlist) {
									if ((Common.isEmpty(infoVo.getFundTown()) || (Common.isNotNull(infoVo.getFundTown()) &&
											infoVo.getFundTown().equals(providentFund.getFundTown()))) &&
											DateUtil.dateToString(providentFund.getProvidentStart(), "yyyyMM").compareTo(infoVo.getProvidentPayMonth()) <= 0 &&
											(Common.isEmpty(providentFund.getFundReduceDate()) || (Common.isNotNull(providentFund.getFundReduceDate()) &&
													DateUtil.dateToString(providentFund.getFundReduceDate(), "yyyyMM").compareTo(infoVo.getProvidentPayMonth()) >= 0))) {
										isTrueAdder = true;
										tProvidentFund = providentFund;
										break;
									}
								}
							}
							if (!isTrueAdder) {
								errorMessageList.add(new ErrorDetailVO(infoVo.getRowIndex(), CommonConstants.ZERO_INT, infoVo.getEmpIdcard(), infoVo.getSocialHousehold(), infoVo.getProvidentHousehold(), infoVo.getEmpName(),
										"无对应员工（身份证：" + infoVo.getEmpIdcard() + ")" + "的公积金数据(请查验公积金缴纳地)！"));
								continue;
							}
						} else {
							tProvidentFund = null;
						}
						//计算公积金合计，个人金额和单位金额一致
						infoVo.setProvidentSum(BigDecimalUtils.safeAdd(infoVo.getUnitProvidentSum(), infoVo.getPersonalProvidentSum()));
						// 判重
						if (paymentInfoMap.size() > CommonConstants.ZERO_INT) {
							paymentInfo = (TPaymentInfo) paymentInfoMap.get(infoVo.getProvidentPayAddr()
									+ CommonConstants.DOWN_LINE_STRING
									+ infoVo.getEmpIdcard().trim()
									+ CommonConstants.DOWN_LINE_STRING
									+ infoVo.getProvidentPayMonth().trim()
									+ CommonConstants.DOWN_LINE_STRING
									+ infoVo.getProvidentCreateMonth().trim()
									+ CommonConstants.DOWN_LINE_STRING
									+ Math.round(BigDecimalUtils.safeAdd(infoVo.getProvidentSum()).doubleValue() * 100) / 100.0);
						}
						//存在公积金缴费数据
						if (null != paymentInfo && BigDecimalUtils.isNullToZero(paymentInfo.getProvidentSum()).compareTo(BigDecimal.ZERO) != 0) {

							//允许覆盖，但已核准表或工资结算或已锁定不允许覆盖
							errorMessageList.add(new ErrorDetailVO(infoVo.getRowIndex(), CommonConstants.ZERO_INT, infoVo.getEmpIdcard(), paymentInfo.getSocialHousehold(), paymentInfo.getProvidentHousehold(), infoVo.getEmpName(), "已存在对应员工身份证" +
									infoVo.getEmpName() + CommonConstants.DOWN_LINE_STRING + infoVo.getEmpIdcard()
									+ "公积金缴费数据，禁止覆盖！"));
							continue;
						}

						if (Common.isEmpty(tProvidentFund)) {
							tProvidentFund = providentFundMapper.selectOne(Wrappers.<TProvidentFund>query().lambda()
									.eq(TProvidentFund::getEmpIdcard, infoVo.getEmpIdcard()).groupBy(TProvidentFund::getCreateTime)
									.last(CommonConstants.LAST_ONE_SQL));
						}
						paymentInfo = new TPaymentInfo();
						paymentInfo.setLockStatus(CommonConstants.ZERO_STRING);
						if (Common.isNotNull(fund)) {
							paymentInfo.setEmpId(fund.getEmpId());
							paymentInfo.setEmpIdcard(fund.getEmpIdcard());
							paymentInfo.setEmpName(fund.getEmpName());
							if (Common.isNotNull(domainMap)) {
								domain = domainMap.get(fund.getSettleDomainCodeFund());
							} else {
								domain = null;
							}
							if (Common.isEmpty(domain)) {
								errorMessageList.add(new ErrorDetailVO(infoVo.getRowIndex(),
										CommonConstants.ZERO_INT, infoVo.getEmpIdcard(), paymentInfo.getSocialHousehold(),
										paymentInfo.getProvidentHousehold(), infoVo.getEmpName(), SocialConstants.NOT_EXIT_SETTLEiNFO));
								continue;
							}
							paymentInfo.setBpoFlag(domain.getBpoFlag());
							paymentInfo.setSettleDomainId(fund.getSettleDomainFund());
							paymentInfo.setSecondIndicatorBelong(domain.getSecondIndicatorBelong());
							paymentInfo.setSettleDomainName(fund.getSettleDomainNameFund());
							paymentInfo.setSettleDomainCode(fund.getSettleDomainCodeFund());
							paymentInfo.setUnitId(fund.getUnitIdFund());
							paymentInfo.setUnitName(fund.getUnitNameFund());
							paymentInfo.setFundProvince(fund.getFundProvince());
							paymentInfo.setFundCity(fund.getFundCity());
							paymentInfo.setFundTown(Common.isNotNull(fund.getFundTown()) ? fund.getFundTown(): "");
							paymentInfo.setProvidentHousehold(fund.getProvidentHouseholdName());
						} else if (Common.isNotNull(tProvidentFund)) {
							paymentInfo.setEmpId(tProvidentFund.getEmpId());
							paymentInfo.setEmpIdcard(tProvidentFund.getEmpIdcard());
							paymentInfo.setEmpName(tProvidentFund.getEmpName());
							//获取项目信息
							if (Common.isNotNull(domainMap)) {
								domain = domainMap.get(tProvidentFund.getSettleDomainCode());
							} else {
								domain = null;
							}
							if (Common.isEmpty(domain)) {
								errorMessageList.add(new ErrorDetailVO(infoVo.getRowIndex(),
										CommonConstants.ZERO_INT, infoVo.getEmpIdcard(), paymentInfo.getSocialHousehold(),
										paymentInfo.getProvidentHousehold(), infoVo.getEmpName(), SocialConstants.NOT_EXIT_SETTLEiNFO));
								continue;
							}
							paymentInfo.setSettleDomainName(domain.getDepartName());
							paymentInfo.setSecondIndicatorBelong(domain.getSecondIndicatorBelong());
							paymentInfo.setUnitId(domain.getCustomerId());
							paymentInfo.setUnitName(domain.getCustomerName());
							paymentInfo.setBpoFlag(domain.getBpoFlag());
							paymentInfo.setSettleDomainId(tProvidentFund.getSettleDomain());
							paymentInfo.setSettleDomainCode(tProvidentFund.getSettleDomainCode());
							paymentInfo.setFundProvince(tProvidentFund.getFundProvince());
							paymentInfo.setFundCity(tProvidentFund.getFundCity());
							paymentInfo.setFundTown(Common.isNotNull(tProvidentFund.getFundTown()) ? tProvidentFund.getFundTown(): "");
							paymentInfo.setProvidentHousehold(tProvidentFund.getProvidentHouseholdName());
						}
						// 项目信息校验
						errorInfo = settleInfoCheck(paymentInfo);
						if (!Common.isEmpty(errorInfo)){
							errorMessageList.add(new ErrorDetailVO(infoVo.getRowIndex(),
									CommonConstants.ZERO_INT, infoVo.getEmpIdcard(), paymentInfo.getSocialHousehold(),
									paymentInfo.getProvidentHousehold(), infoVo.getEmpName(),
									SocialConstants.ERROR_PRI + errorInfo + SocialConstants.ERROR_END));
							continue;
						}
						if (Common.isNotNull(tProvidentFund)) {
							paymentInfo.setInauguralTeam(Common.isNotNull(tProvidentFund.getInauguralTeam()) ? tProvidentFund.getInauguralTeam(): "");
							paymentInfo.setEmpNo(Common.isNotNull(tProvidentFund.getEmpNo()) ? tProvidentFund.getEmpNo(): "");
						} else {
							paymentInfo.setInauguralTeam("");
							paymentInfo.setEmpNo("");
						}
						paymentInfo.setProvidentPayMonth(infoVo.getProvidentPayMonth());
						if (null != paymentInfo.getFundProvince()) {
							temp = areaMap.get(paymentInfo.getFundProvince());
							if (Common.isNotNull(temp)) {
								paymentInfo.setProvidentPayAddr(temp);
							}
						}
						if (null != paymentInfo.getFundCity()) {
							temp = areaMap.get(paymentInfo.getFundCity());
							if (Common.isNotNull(temp)) {
								paymentInfo.setProvidentPayAddr(paymentInfo.getProvidentPayAddr()
										+ CommonConstants.CENTER_SPLIT_LINE_STRING + temp);
							}
						}
						if (null != paymentInfo.getFundTown()) {
							temp = areaMap.get(paymentInfo.getFundTown());
							if (Common.isNotNull(temp)) {
								paymentInfo.setProvidentPayAddr(paymentInfo.getProvidentPayAddr()
										+ CommonConstants.CENTER_SPLIT_LINE_STRING + temp);
							}
						} else {
							paymentInfo.setFundTown("");
						}

						paymentInfo.setProvidentCreateMonth(infoVo.getProvidentCreateMonth());
						paymentInfo.setUnitProvidentSet(null == infoVo.getUnitProvidentSet() ? BigDecimal.ZERO : infoVo.getUnitProvidentSet());
						paymentInfo.setPersonalProidentSet(null == infoVo.getUnitProvidentSet() ? BigDecimal.ZERO : infoVo.getUnitProvidentSet());
						paymentInfo.setProvidentPercent(null == infoVo.getProvidentPercent() ? BigDecimal.ZERO : infoVo.getProvidentPercent());
						//个人单边比例 fxj 2024-12-06 v1.7.3
						paymentInfo.setPersonalProvidentPercent(null == infoVo.getPersonalProvidentPercent() ? BigDecimal.ZERO : infoVo.getPersonalProvidentPercent());
						paymentInfo.setProvidentNo(infoVo.getProvidentNo());
						//个人单表金额  fxj 2024-12-06 v1.7.3
						paymentInfo.setPersonalProvidentSum(null == infoVo.getPersonalProvidentSum() ? BigDecimal.ZERO : infoVo.getPersonalProvidentSum());
						paymentInfo.setUnitProvidentSum(null == infoVo.getUnitProvidentSum() ? BigDecimal.ZERO : infoVo.getUnitProvidentSum());
						paymentInfo.setProvidentSum(null == infoVo.getProvidentSum() ? BigDecimal.ZERO : infoVo.getProvidentSum());
						paymentInfo.setSumAll(paymentInfo.getProvidentSum());
						paymentInfo.setFundId(UUID.randomUUID().toString());
						batchInsertList.add(paymentInfo);
						errorMessageList.add(new ErrorDetailVO(infoVo.getRowIndex(), CommonConstants.ONE_INT,
								infoVo.getEmpIdcard(), infoVo.getSocialHousehold(), infoVo.getProvidentHousehold(),
								infoVo.getEmpName(), CommonConstants.SAVE_SUCCESS,CommonConstants.GREEN));
						paymentInfoMap.put(paymentInfo.getProvidentPayAddr()
								+ CommonConstants.DOWN_LINE_STRING
								+ paymentInfo.getEmpIdcard().trim()
								+ CommonConstants.DOWN_LINE_STRING
								+ paymentInfo.getProvidentPayMonth().trim()
								+ CommonConstants.DOWN_LINE_STRING
								+ paymentInfo.getProvidentCreateMonth().trim()
								+ CommonConstants.DOWN_LINE_STRING
								+ BigDecimalUtils.safeAdd(paymentInfo.getProvidentSum()).doubleValue(), paymentInfo);
					} else {
						errorMessageList.add(new ErrorDetailVO(infoVo.getRowIndex(), CommonConstants.ZERO_INT, infoVo.getEmpIdcard(), infoVo.getSocialHousehold(), infoVo.getProvidentHousehold(), infoVo.getEmpName(),
								"无对应员工（身份证：" + infoVo.getEmpIdcard() + ")" + "的公积金数据(请查验公积金缴纳地)！"));
					}
				}
			}
		} catch (Exception e) {
			log.error("数据批量导入异常：" + e);
		}
	}

	@Override
	public R<List<ErrorDetailVO>> batchImportPaymentFundInfo(InputStream inputStream, int type) {
		List<ErrorDetailVO> errorMessageList = new ArrayList<>();
		ExcelUtil<TPaymentInfoVo> util1 = new ExcelUtil<>(TPaymentInfoVo.class);
		//批量插入的集合
		List<TPaymentInfo> batchInsertList = new ArrayList<>();
		//获取所有项目信息
		Map<String, TSettleDomainSelectVo> domainMap = this.getSelectVoMap();
		//地区数据
		HashMap<String, String> areaMap = new HashMap<>();
		HashMap<String, String> areaMap2 = new HashMap<>();
		//公积金唯一性检验条件：身份证编码+公积金缴纳月份
		HashMap<String, Object> paymentInfoMap = new HashMap<>();
		R<AreaVo> areaListR = upmsDaprUtils.getAreaListR();
		if (Common.isNotNull(areaListR)) {
			AreaVo areaList = areaListR.getData();
			if (null != areaList && !areaList.getSysAreaList().isEmpty()) {
				for (SysArea area : areaList.getSysAreaList()) {
					areaMap.put(Integer.toString(area.getId()), area.getAreaName());
					areaMap2.put(area.getAreaName() + CommonConstants.DOWN_LINE_STRING + (
							null == area.getParentId() ? "null" : (0 == area.getParentId() ? "null" : Integer.toString(
									area.getParentId()))), Integer.toString(area.getId()));
				}
			}
		}
		// 写法2：
		// 匿名内部类 不用额外写一个DemoDataListener
		// 这里 需要指定读用哪个class去读，然后读取第一个sheet 文件流会自动关闭
		try {
			EasyExcel.read(inputStream, TPaymentInfoVo.class, new ReadListener<TPaymentInfoVo>() {
				/**
				 * 单次缓存的数据量
				 */
				public static final int BATCH_COUNT = CommonConstants.BATCH_COUNT;
				/**
				 *临时存储
				 */
				private List<TPaymentInfoVo> cachedDataList = ListUtils.newArrayListWithExpectedSize(BATCH_COUNT);

				@Override
				public void invoke(TPaymentInfoVo data, AnalysisContext context) {
					ReadRowHolder readRowHolder = context.readRowHolder();
					Integer rowIndex = readRowHolder.getRowIndex();
					data.setRowIndex(rowIndex + 1);
					ErrorMessage errorMessage = util1.checkEntity(data, data.getRowIndex());
					if (Common.isNotNull(errorMessage)) {
						errorMessageList.add(new ErrorDetailVO(errorMessage.getLineNum(), errorMessage.getMessage()));
					} else {
						//直接兼容多比例 fxj 2024-12-06 v1.7.3   type=1 为多比例
						if (type == CommonConstants.ZERO_INT){
							//非多比例时 直接赋值个人公积金比例和金额  以便后面统一处理
							data.setPersonalProvidentPercent(null==data.getProvidentPercent()? BigDecimal.ZERO:data.getProvidentPercent());
							data.setPersonalProvidentSum(null==data.getUnitProvidentSum()? BigDecimal.ZERO:data.getUnitProvidentSum());
						}else {
							// 多比例时 单位公积金比例 和金额 用冗余字段赋值
							data.setProvidentPercent(null==data.getUnitProvidentPercent()? BigDecimal.ZERO:data.getUnitProvidentPercent());
							data.setUnitProvidentSum(null==data.getUnitProvidentFee()? BigDecimal.ZERO:data.getUnitProvidentFee());
							data.setPersonalProidentSet(null==data.getUnitProvidentSet()? BigDecimal.ZERO:data.getUnitProvidentSet());
						}
						cachedDataList.add(data);
					}
					if (cachedDataList.size() >= BATCH_COUNT) {
						saveData();
						// 存储完成清理 list
						cachedDataList = ListUtils.newArrayListWithExpectedSize(BATCH_COUNT);
					}
				}

				@Override
				public void doAfterAllAnalysed(AnalysisContext context) {
					saveData();
				}

				/**
				 * 加上存储数据库
				 */
				private void saveData() {
					log.info("{}条数据，开始存储数据库！", cachedDataList.size());
					batchSavePaymentFundInfo(cachedDataList, errorMessageList, batchInsertList, areaMap, areaMap2
							,domainMap, paymentInfoMap);
					log.info("存储数据库成功！");
				}
			}).sheet().doRead();
			//批量插入数据
			if (!batchInsertList.isEmpty()) {
				this.saveBatch(batchInsertList);
				batchInsertList.clear();
			}
			areaMap.clear();
			areaMap2.clear();
			domainMap.clear();
		} catch (Exception e) {
			log.error(CommonConstants.IMPORT_DATA_ANALYSIS_ERROR, e);
			return R.failed(CommonConstants.IMPORT_DATA_ANALYSIS_ERROR);
		}
		return this.judgeAllMessage(errorMessageList);
	}

	private void importTPaymentSocialTax(List<TPaymentTaxSocialVo> list,
										   ConcurrentHashMap<String, ErrorMessage> errorMessageList,
										   ConcurrentHashMap<String, BigDecimal> pensionMoneyMap,
										   ConcurrentHashMap<String, BigDecimal> birthMoneyMap,
										   ConcurrentHashMap<String, BigDecimal> bigMoneyMap,
										   ConcurrentHashMap<String, BigDecimal> unEmpMoneyMap,
										   ConcurrentHashMap<String, BigDecimal> injuryMoneyMap,
										   ConcurrentHashMap<String, BigDecimal> medicalMoneyMap,
										   ConcurrentHashMap<String,TPaymentInfo> batchGsInsertList,
										   ConcurrentHashMap<String,TPaymentInfo> batchSyInsertList,
										   ConcurrentHashMap<String,TPaymentInfo> batchYlInsertList,
										   ConcurrentHashMap<String,TPaymentInfo> batchYyInsertList,
										   ConcurrentHashMap<String, TPaymentInfo> batchBigInsertList,
										   ConcurrentHashMap<String, TPaymentInfo> batchBirthInsertList,
										   HashMap<String, String> areaMap,
										   HashMap<String, String> areaMap2,Map<String,TSettleDomainSelectVo> domainMap) {

		// 将以下代码提取出来，使用paymentInfoMap提升性能，避免list多次循环查询数据库浪费性能
		// 导入前做队列空闲判断，防止队列不足出现数据丢失的场景
		if (CollUtil.isNotEmpty(list)) {

			int taskSize = list.size() / partSize + CommonConstants.ONE_INT;
			int residualCapacity = yfSocialImportThreadPoolExecutor.getResidualCapacity();
			if (taskSize > residualCapacity) {
				errorMessageList.put(UUID.randomUUID().toString(),new ErrorMessage(-1, MsgUtils.getMessage(ErrorCodes.SOCIALINFO_LIST_NUM_LARGE)));
			} else {
				//已存在的档案数据
				List<String> monthList = Common.listObjectToStrList(list, ExcelAttributeConstants.SOCIAL_PAY_MONTH).stream().distinct().collect(Collectors.toList());
				//已存在社保缴费库数据  非删除状态
				List<TPaymentInfo> paymentInfos = baseMapper.selectListForPaymentImport(monthList,
						Common.listObjectToStrList(list, ExcelAttributeConstants.EMPIDCARD));
				//养老
				ConcurrentHashMap<String, TPaymentInfo> paymentInfoPensionMap = new ConcurrentHashMap<>();
				//大病救助金
				ConcurrentHashMap<String, TPaymentInfo> paymentInfoBigMap = new ConcurrentHashMap<>();
				//失业
				ConcurrentHashMap<String, TPaymentInfo> paymentInfoUnEmpMap = new ConcurrentHashMap<>();
				//工伤
				ConcurrentHashMap<String, TPaymentInfo> paymentInfoInjuryMap = new ConcurrentHashMap<>();
				//医保
				ConcurrentHashMap<String, TPaymentInfo> paymentInfoMedicalMap = new ConcurrentHashMap<>();
				//生育
				ConcurrentHashMap<String, TPaymentInfo> paymentInfoBirthMap = new ConcurrentHashMap<>();
				if (Common.isNotNull(paymentInfos)) {
					for (TPaymentInfo info : paymentInfos) {
						if (BigDecimalUtils.safeAdd(BigDecimalUtils.isNullToZero(info.getUnitPensionMoney()),
								BigDecimalUtils.isNullToZero(info.getPersonalPensionMoney())).compareTo(BigDecimal.ZERO) != 0) {
							if (null != paymentInfoPensionMap.get(info.getSocialPayAddr()
									+ CommonConstants.DOWN_LINE_STRING
									+ info.getEmpIdcard()
									+ CommonConstants.DOWN_LINE_STRING
									+ info.getSocialPayMonth()
									+ CommonConstants.DOWN_LINE_STRING
									+ info.getSocialCreateMonth()
									+ CommonConstants.DOWN_LINE_STRING
									+ PaymentConstants.PENSION_RISK)) {
								info.setYbSameFlg("1");
							}
							paymentInfoPensionMap.put(info.getSocialPayAddr()
											+ CommonConstants.DOWN_LINE_STRING
											+ info.getEmpIdcard()
											+ CommonConstants.DOWN_LINE_STRING
											+ info.getSocialPayMonth()
											+ CommonConstants.DOWN_LINE_STRING
											+ info.getSocialCreateMonth()
											+ CommonConstants.DOWN_LINE_STRING
											+ PaymentConstants.PENSION_RISK
									, info);
						}
						if (BigDecimalUtils.safeAdd(BigDecimalUtils.isNullToZero(info.getUnitUnemploymentMoney()),
								BigDecimalUtils.isNullToZero(info.getPersonalUnemploymentMoney())).compareTo(BigDecimal.ZERO) != 0) {
							if (null != paymentInfoUnEmpMap.get(info.getSocialPayAddr()
									+ CommonConstants.DOWN_LINE_STRING
									+ info.getEmpIdcard()
									+ CommonConstants.DOWN_LINE_STRING
									+ info.getSocialPayMonth()
									+ CommonConstants.DOWN_LINE_STRING
									+ info.getSocialCreateMonth()
									+ CommonConstants.DOWN_LINE_STRING
									+ PaymentConstants.UNEMPLOYEEMENT_RISK)) {
								info.setSySameFlg("1");
							}
							paymentInfoUnEmpMap.put(info.getSocialPayAddr()
											+ CommonConstants.DOWN_LINE_STRING
											+ info.getEmpIdcard()
											+ CommonConstants.DOWN_LINE_STRING
											+ info.getSocialPayMonth()
											+ CommonConstants.DOWN_LINE_STRING
											+ info.getSocialCreateMonth()
											+ CommonConstants.DOWN_LINE_STRING
											+ PaymentConstants.UNEMPLOYEEMENT_RISK
									, info);
						}
						if (BigDecimalUtils.isNullToZero(info.getUnitInjuryMoney()).compareTo(BigDecimal.ZERO) != 0) {
							if (null != paymentInfoInjuryMap.get(info.getSocialPayAddr()
									+ CommonConstants.DOWN_LINE_STRING
									+ info.getEmpIdcard()
									+ CommonConstants.DOWN_LINE_STRING
									+ info.getSocialPayMonth()
									+ CommonConstants.DOWN_LINE_STRING
									+ info.getSocialCreateMonth()
									+ CommonConstants.DOWN_LINE_STRING
									+ PaymentConstants.INJURY_RISK)) {
								info.setGsSameFlg("1");
							}
							paymentInfoInjuryMap.put(info.getSocialPayAddr()
											+ CommonConstants.DOWN_LINE_STRING
											+ info.getEmpIdcard()
											+ CommonConstants.DOWN_LINE_STRING
											+ info.getSocialPayMonth()
											+ CommonConstants.DOWN_LINE_STRING
											+ info.getSocialCreateMonth()
											+ CommonConstants.DOWN_LINE_STRING
											+ PaymentConstants.INJURY_RISK
									, info);
						}
						if (BigDecimalUtils.safeAdd(BigDecimalUtils.isNullToZero(info.getUnitMedicalMoney()),
								BigDecimalUtils.isNullToZero(info.getPersonalMedicalMoney())).compareTo(BigDecimal.ZERO) != 0) {
							if (null != paymentInfoMedicalMap.get(info.getSocialPayAddr()
									+ CommonConstants.DOWN_LINE_STRING
									+ info.getEmpIdcard()
									+ CommonConstants.DOWN_LINE_STRING
									+ info.getSocialPayMonth()
									+ CommonConstants.DOWN_LINE_STRING
									+ info.getSocialCreateMonth()
									+ CommonConstants.DOWN_LINE_STRING
									+ PaymentConstants.MEDICAL)) {
								info.setYlSameFlg("1");
							}
							paymentInfoMedicalMap.put(info.getSocialPayAddr()
											+ CommonConstants.DOWN_LINE_STRING
											+ info.getEmpIdcard()
											+ CommonConstants.DOWN_LINE_STRING
											+ info.getSocialPayMonth()
											+ CommonConstants.DOWN_LINE_STRING
											+ info.getSocialCreateMonth()
											+ CommonConstants.DOWN_LINE_STRING
											+ PaymentConstants.MEDICAL
									, info);
						}
						if (BigDecimalUtils.safeAdd(BigDecimalUtils.isNullToZero(info.getPersonalBigmailmentMoney()),
								BigDecimalUtils.isNullToZero(info.getUnitBigmailmentMoney())).compareTo(BigDecimal.ZERO) != 0) {
							if (null != paymentInfoBigMap.get(info.getSocialPayAddr()
									+ CommonConstants.DOWN_LINE_STRING
									+ info.getEmpIdcard()
									+ CommonConstants.DOWN_LINE_STRING
									+ info.getSocialPayMonth()
									+ CommonConstants.DOWN_LINE_STRING
									+ info.getSocialCreateMonth()
									+ CommonConstants.DOWN_LINE_STRING
									+ SocialConstants.DB)) {
								info.setDbSameFlg("1");
							}
							paymentInfoBigMap.put(info.getSocialPayAddr()
											+ CommonConstants.DOWN_LINE_STRING
											+ info.getEmpIdcard()
											+ CommonConstants.DOWN_LINE_STRING
											+ info.getSocialPayMonth()
											+ CommonConstants.DOWN_LINE_STRING
											+ info.getSocialCreateMonth()
											+ CommonConstants.DOWN_LINE_STRING
											+ SocialConstants.DB
									, info);
						}
						if (BigDecimalUtils.isNullToZero(info.getUnitBirthMoney()).compareTo(BigDecimal.ZERO) != 0) {
							if (null != paymentInfoBirthMap.get(info.getSocialPayAddr()
									+ CommonConstants.DOWN_LINE_STRING
									+ info.getEmpIdcard()
									+ CommonConstants.DOWN_LINE_STRING
									+ info.getSocialPayMonth()
									+ CommonConstants.DOWN_LINE_STRING
									+ info.getSocialCreateMonth()
									+ CommonConstants.DOWN_LINE_STRING
									+ SocialConstants.BIR)) {
								info.setBrSameFlg("1");
							}
							paymentInfoBirthMap.put(info.getSocialPayAddr()
											+ CommonConstants.DOWN_LINE_STRING
											+ info.getEmpIdcard()
											+ CommonConstants.DOWN_LINE_STRING
											+ info.getSocialPayMonth()
											+ CommonConstants.DOWN_LINE_STRING
											+ info.getSocialCreateMonth()
											+ CommonConstants.DOWN_LINE_STRING
											+ SocialConstants.BIR
									, info);
						}
					}
				}

				// -----------------------------线程池处理list，批量保存社保信息开始--------------------------------
				List<CompletableFuture<ConcurrentHashMap<String, ErrorMessage>>> completableFutureList = new ArrayList<>();

				try {
					// 1.list.size()不足100时直接执行
					if (list.size() < 100) {
						CompletableFuture<ConcurrentHashMap<String, ErrorMessage>> listCompletableFuture = CompletableFuture.supplyAsync(()
										-> executeImportSocialListTax(list, areaMap, areaMap2,
										paymentInfoPensionMap, paymentInfoMedicalMap, paymentInfoUnEmpMap, paymentInfoInjuryMap,
										paymentInfoBigMap,paymentInfoBirthMap, errorMessageList, pensionMoneyMap, birthMoneyMap,bigMoneyMap,
										unEmpMoneyMap, injuryMoneyMap, medicalMoneyMap,	batchGsInsertList,
										batchSyInsertList, batchYlInsertList, batchYyInsertList, batchBigInsertList, batchBirthInsertList,domainMap),
								yfSocialImportThreadPoolExecutor);
						completableFutureList.add(listCompletableFuture);
					} else {
						int j = 25;
						for (int i = 0; i < 100; i = i + 25) {
							// 单个线程每次执行25条
							List<TPaymentTaxSocialVo> finalTempList1 = list.subList(i,i+j);
							CompletableFuture<ConcurrentHashMap<String, ErrorMessage>> listCompletableFuture = CompletableFuture.supplyAsync(()
											-> executeImportSocialListTax(finalTempList1
											, areaMap, areaMap2, paymentInfoPensionMap, paymentInfoMedicalMap,
											paymentInfoUnEmpMap, paymentInfoInjuryMap, paymentInfoBigMap,paymentInfoBirthMap,
											errorMessageList, pensionMoneyMap, birthMoneyMap, bigMoneyMap, unEmpMoneyMap,
											injuryMoneyMap, medicalMoneyMap, batchGsInsertList, batchSyInsertList,
											batchYlInsertList, batchYyInsertList, batchBigInsertList, batchBirthInsertList, domainMap),
									yfSocialImportThreadPoolExecutor);
							completableFutureList.add(listCompletableFuture);
						}
					}

					// 阻塞当前线程，等待所有的线程执行完毕
					boolean computeFlag;
					do {
						computeFlag = false;
						for (CompletableFuture<ConcurrentHashMap<String, ErrorMessage>> listCompletableFuture : completableFutureList) {
							if (!listCompletableFuture.isDone()) {
								computeFlag = true;
							}
						}
					} while (computeFlag);

					paymentInfoBigMap.clear();
					paymentInfoInjuryMap.clear();
					paymentInfoUnEmpMap.clear();
					paymentInfoPensionMap.clear();
					paymentInfoMedicalMap.clear();
					paymentInfoBirthMap.clear();
				} catch (Exception e) {
					log.error("社保缴费库数据批量导入异常：" + e);
					paymentInfoBigMap.clear();
					paymentInfoInjuryMap.clear();
					paymentInfoUnEmpMap.clear();
					paymentInfoPensionMap.clear();
					paymentInfoMedicalMap.clear();
					paymentInfoBirthMap.clear();
				}
			}
		}
	}

	private void importTPaymentSocialHeFei(List<TPaymentHeFeiVo> list,
										   ConcurrentHashMap<String, ErrorDetailVO> errorMessageList,
										   String type, Integer rowNumber,
										   ConcurrentHashMap<String, BigDecimal> pensionMoneyMap,
										   ConcurrentHashMap<String, BigDecimal> bigMoneyMap,
										   ConcurrentHashMap<String, BigDecimal> unEmpMoneyMap,
										   ConcurrentHashMap<String, BigDecimal> injuryMoneyMap,
										   ConcurrentHashMap<String, BigDecimal> medicalMoneyMap,
										   String sumNumKey, String importSuccessKey,
										   ConcurrentHashMap<String,TPaymentInfo> batchGsInsertList,
										   ConcurrentHashMap<String,TPaymentInfo> batchSyInsertList,
										   ConcurrentHashMap<String,TPaymentInfo> batchYlInsertList,
										   ConcurrentHashMap<String,TPaymentInfo> batchYyInsertList,
										   HashMap<String, String> areaMap,
										   HashMap<String, String> areaMap2,Map<String,TSettleDomainSelectVo> domainMap) {

		// 将以下代码提取出来，使用paymentInfoMap提升性能，避免list多次循环查询数据库浪费性能
		// 导入前做队列空闲判断，防止队列不足出现数据丢失的场景
		if (CollUtil.isNotEmpty(list)) {
			int taskSize = list.size() / partSize + CommonConstants.ONE_INT;
			int residualCapacity = yfSocialImportThreadPoolExecutor.getResidualCapacity();
			if (taskSize > residualCapacity) {
				errorMessageList.put(UUID.randomUUID().toString(),new ErrorDetailVO(-1, MsgUtils.getMessage(ErrorCodes.SOCIALINFO_LIST_NUM_LARGE)));
			} else {

				// -----------------------------生成paymentInfoMap本段开始--------------------------------
				//已存在的档案数据
				List<String> monthList = Common.listObjectToStrList(list, ExcelAttributeConstants.SOCIAL_PAY_MONTH).stream().distinct().collect(Collectors.toList());
				//已存在社保缴费库数据  非删除状态
				List<TPaymentInfo> paymentInfos = baseMapper.selectListForPaymentImport(monthList,
						Common.listObjectToStrList(list, ExcelAttributeConstants.EMPIDCARD));
				//养老
				ConcurrentHashMap<String, TPaymentInfo> paymentInfoPensionMap = new ConcurrentHashMap<>();
				//大病救助金
				ConcurrentHashMap<String, TPaymentInfo> paymentInfoBigMap = new ConcurrentHashMap<>();
				//失业
				ConcurrentHashMap<String, TPaymentInfo> paymentInfoUnEmpMap = new ConcurrentHashMap<>();
				//工伤
				ConcurrentHashMap<String, TPaymentInfo> paymentInfoInjuryMap = new ConcurrentHashMap<>();
				//医保
				ConcurrentHashMap<String, TPaymentInfo> paymentInfoMedicalMap = new ConcurrentHashMap<>();
				if (Common.isNotNull(paymentInfos)) {
					for (TPaymentInfo info : paymentInfos) {

						if (BigDecimalUtils.safeAdd(BigDecimalUtils.isNullToZero(info.getUnitPensionMoney()),
								BigDecimalUtils.isNullToZero(info.getPersonalPensionMoney())).compareTo(BigDecimal.ZERO) != 0) {
							if (null != paymentInfoPensionMap.get(info.getSocialPayAddr()
									+ CommonConstants.DOWN_LINE_STRING
									+ info.getEmpIdcard()
									+ CommonConstants.DOWN_LINE_STRING
									+ info.getSocialPayMonth()
									+ CommonConstants.DOWN_LINE_STRING
									+ info.getSocialCreateMonth()
									+ CommonConstants.DOWN_LINE_STRING
									+ PaymentConstants.PENSION_RISK)) {
								info.setYbSameFlg("1");
							}
							paymentInfoPensionMap.put(info.getSocialPayAddr()
											+ CommonConstants.DOWN_LINE_STRING
											+ info.getEmpIdcard()
											+ CommonConstants.DOWN_LINE_STRING
											+ info.getSocialPayMonth()
											+ CommonConstants.DOWN_LINE_STRING
											+ info.getSocialCreateMonth()
											+ CommonConstants.DOWN_LINE_STRING
											+ PaymentConstants.PENSION_RISK
									, info);
						}
						if (BigDecimalUtils.safeAdd(BigDecimalUtils.isNullToZero(info.getUnitUnemploymentMoney()),
								BigDecimalUtils.isNullToZero(info.getPersonalUnemploymentMoney())).compareTo(BigDecimal.ZERO) != 0) {
							if (null != paymentInfoUnEmpMap.get(info.getSocialPayAddr()
									+ CommonConstants.DOWN_LINE_STRING
									+ info.getEmpIdcard()
									+ CommonConstants.DOWN_LINE_STRING
									+ info.getSocialPayMonth()
									+ CommonConstants.DOWN_LINE_STRING
									+ info.getSocialCreateMonth()
									+ CommonConstants.DOWN_LINE_STRING
									+ PaymentConstants.UNEMPLOYEEMENT_RISK)) {
								info.setSySameFlg("1");
							}
							paymentInfoUnEmpMap.put(info.getSocialPayAddr()
											+ CommonConstants.DOWN_LINE_STRING
											+ info.getEmpIdcard()
											+ CommonConstants.DOWN_LINE_STRING
											+ info.getSocialPayMonth()
											+ CommonConstants.DOWN_LINE_STRING
											+ info.getSocialCreateMonth()
											+ CommonConstants.DOWN_LINE_STRING
											+ PaymentConstants.UNEMPLOYEEMENT_RISK
									, info);
						}
						if (BigDecimalUtils.isNullToZero(info.getUnitInjuryMoney()).compareTo(BigDecimal.ZERO) != 0) {
							if (null != paymentInfoInjuryMap.get(info.getSocialPayAddr()
									+ CommonConstants.DOWN_LINE_STRING
									+ info.getEmpIdcard()
									+ CommonConstants.DOWN_LINE_STRING
									+ info.getSocialPayMonth()
									+ CommonConstants.DOWN_LINE_STRING
									+ info.getSocialCreateMonth()
									+ CommonConstants.DOWN_LINE_STRING
									+ PaymentConstants.INJURY_RISK)) {
								info.setGsSameFlg("1");
							}
							paymentInfoInjuryMap.put(info.getSocialPayAddr()
											+ CommonConstants.DOWN_LINE_STRING
											+ info.getEmpIdcard()
											+ CommonConstants.DOWN_LINE_STRING
											+ info.getSocialPayMonth()
											+ CommonConstants.DOWN_LINE_STRING
											+ info.getSocialCreateMonth()
											+ CommonConstants.DOWN_LINE_STRING
											+ PaymentConstants.INJURY_RISK
									, info);
						}
						if (BigDecimalUtils.safeAdd(BigDecimalUtils.isNullToZero(info.getUnitMedicalMoney()),
								BigDecimalUtils.isNullToZero(info.getPersonalMedicalMoney())).compareTo(BigDecimal.ZERO) != 0) {
							if (null != paymentInfoMedicalMap.get(info.getSocialPayAddr()
									+ CommonConstants.DOWN_LINE_STRING
									+ info.getEmpIdcard()
									+ CommonConstants.DOWN_LINE_STRING
									+ info.getSocialPayMonth()
									+ CommonConstants.DOWN_LINE_STRING
									+ info.getSocialCreateMonth()
									+ CommonConstants.DOWN_LINE_STRING
									+ PaymentConstants.MEDICAL)) {
								info.setYlSameFlg("1");
							}
							paymentInfoMedicalMap.put(info.getSocialPayAddr()
											+ CommonConstants.DOWN_LINE_STRING
											+ info.getEmpIdcard()
											+ CommonConstants.DOWN_LINE_STRING
											+ info.getSocialPayMonth()
											+ CommonConstants.DOWN_LINE_STRING
											+ info.getSocialCreateMonth()
											+ CommonConstants.DOWN_LINE_STRING
											+ PaymentConstants.MEDICAL
									, info);
						}
						if (BigDecimalUtils.safeAdd(BigDecimalUtils.isNullToZero(info.getPersonalBigmailmentMoney()),
								BigDecimalUtils.isNullToZero(info.getUnitBigmailmentMoney())).compareTo(BigDecimal.ZERO) != 0) {
							if (null != paymentInfoBigMap.get(info.getSocialPayAddr()
									+ CommonConstants.DOWN_LINE_STRING
									+ info.getEmpIdcard()
									+ CommonConstants.DOWN_LINE_STRING
									+ info.getSocialPayMonth()
									+ CommonConstants.DOWN_LINE_STRING
									+ info.getSocialCreateMonth()
									+ CommonConstants.DOWN_LINE_STRING
									+ SocialConstants.DB)) {
								info.setDbSameFlg("1");
							}
							paymentInfoBigMap.put(info.getSocialPayAddr()
											+ CommonConstants.DOWN_LINE_STRING
											+ info.getEmpIdcard()
											+ CommonConstants.DOWN_LINE_STRING
											+ info.getSocialPayMonth()
											+ CommonConstants.DOWN_LINE_STRING
											+ info.getSocialCreateMonth()
											+ CommonConstants.DOWN_LINE_STRING
											+ SocialConstants.DB
									, info);
						}
					}
				}
				// -----------------------------生成paymentInfoMap本段结束--------------------------------

				// -----------------------------线程池处理list，批量保存社保信息开始--------------------------------
				List<CompletableFuture<ConcurrentHashMap<String, ErrorDetailVO>>> completableFutureList = new ArrayList<>();

				// 创建一个数值格式化对象
				NumberFormat numberFormat = NumberFormat.getInstance();
				// 设置精确到小数点后2位
				numberFormat.setMaximumFractionDigits(2);
				String maerialRatio = "";
				Integer bfInt = (Integer) redisUtil.get(sumNumKey);
				if (Common.isNotNull(bfInt)) {
					if (rowNumber > bfInt + 1) {
						maerialRatio = numberFormat.format(((float) bfInt / (float) rowNumber) * 100);
						bfInt = bfInt + 100;
						redisUtil.set(sumNumKey, bfInt, 360L);
					} else {
						maerialRatio = "100";
					}
				} else {
					if (rowNumber >= 100) {
						maerialRatio = numberFormat.format(((float) 100 / (float) rowNumber) * 100);
						bfInt = 100;
						redisUtil.set(sumNumKey, bfInt, 360L);
					} else {
						maerialRatio = "100";
					}
				}
				redisUtil.set(importSuccessKey, maerialRatio, 360L);

				try {
					// 1.list.size()不足100时直接执行
					if (list.size() < 100) {
						CompletableFuture<ConcurrentHashMap<String, ErrorDetailVO>> listCompletableFuture = CompletableFuture.supplyAsync(()
										-> executeImportSocialListThree(list, areaMap, areaMap2,
										paymentInfoPensionMap, paymentInfoMedicalMap, paymentInfoUnEmpMap, paymentInfoInjuryMap,
										paymentInfoBigMap, type, errorMessageList, pensionMoneyMap, bigMoneyMap,
										unEmpMoneyMap, injuryMoneyMap, medicalMoneyMap,	batchGsInsertList,
										batchSyInsertList, batchYlInsertList, batchYyInsertList,domainMap),
								yfSocialImportThreadPoolExecutor);
						completableFutureList.add(listCompletableFuture);
					} else {
						int j = 25;
						for (int i = 0; i < 100; i = i + 25) {
							// 单个线程每次执行25条
							List<TPaymentHeFeiVo> finalTempList1 = list.subList(i,i+j);
							CompletableFuture<ConcurrentHashMap<String, ErrorDetailVO>> listCompletableFuture = CompletableFuture.supplyAsync(()
											-> executeImportSocialListThree(finalTempList1
											, areaMap, areaMap2, paymentInfoPensionMap, paymentInfoMedicalMap,
											paymentInfoUnEmpMap, paymentInfoInjuryMap, paymentInfoBigMap, type,
											errorMessageList, pensionMoneyMap, bigMoneyMap, unEmpMoneyMap,
											injuryMoneyMap, medicalMoneyMap, batchGsInsertList, batchSyInsertList,
											batchYlInsertList, batchYyInsertList, domainMap),
									yfSocialImportThreadPoolExecutor);
							completableFutureList.add(listCompletableFuture);
						}
					}

					// 阻塞当前线程，等待所有的线程执行完毕
					boolean computeFlag;
					do {
						computeFlag = false;
						for (CompletableFuture<ConcurrentHashMap<String, ErrorDetailVO>> listCompletableFuture : completableFutureList) {
							if (!listCompletableFuture.isDone()) {
								computeFlag = true;
							}
						}
					} while (computeFlag);

					paymentInfoBigMap.clear();
					paymentInfoInjuryMap.clear();
					paymentInfoUnEmpMap.clear();
					paymentInfoPensionMap.clear();
					paymentInfoMedicalMap.clear();
				} catch (Exception e) {
					log.error("社保缴费库数据批量导入异常：" + e);
					paymentInfoBigMap.clear();
					paymentInfoInjuryMap.clear();
					paymentInfoUnEmpMap.clear();
					paymentInfoPensionMap.clear();
					paymentInfoMedicalMap.clear();
				}
			}
		}
	}

	private ConcurrentHashMap<String, ErrorDetailVO> executeImportSocialListThree(List<TPaymentHeFeiVo> list,
															 HashMap<String, String> areaMap,
															 HashMap<String, String> areaMap2,
															 ConcurrentHashMap<String, TPaymentInfo> paymentInfoPensionMap,
															 ConcurrentHashMap<String, TPaymentInfo> paymentInfoMedicalMap,
															 ConcurrentHashMap<String, TPaymentInfo> paymentInfoUnEmpMap,
															 ConcurrentHashMap<String, TPaymentInfo> paymentInfoInjuryMap,
															 ConcurrentHashMap<String, TPaymentInfo> paymentInfoBigMap,
															 String type, ConcurrentHashMap<String, ErrorDetailVO> errorMessageList,
															 ConcurrentHashMap<String, BigDecimal> pensionMoneyMap,
															 ConcurrentHashMap<String, BigDecimal> bigMoneyMap,
															 ConcurrentHashMap<String, BigDecimal> unEmpMoneyMap,
															 ConcurrentHashMap<String, BigDecimal> injuryMoneyMap,
															 ConcurrentHashMap<String, BigDecimal> medicalMoneyMap,
															 ConcurrentHashMap<String, TPaymentInfo> batchGsInsertList,
															 ConcurrentHashMap<String, TPaymentInfo> batchSyInsertList,
															 ConcurrentHashMap<String, TPaymentInfo> batchYlInsertList,
															 ConcurrentHashMap<String, TPaymentInfo> batchYyInsertList,
															 Map<String,TSettleDomainSelectVo> domainMap) {
		if (Common.isNotNull(list)) {
			TPaymentInfo payExists;
			TSocialFundInfo socialInfo = null;
			TSocialInfo tSocialInfo = null;
			String temp;
			List<TSocialInfo> socialist;
			TSettleDomain domain;

			List<TSocialFundInfo> socialInfoList = socialFundInfoMapper.selectList(Wrappers.<TSocialFundInfo>query().lambda()
					.in(TSocialFundInfo::getEmpIdcard, Common.listObjectToStrList(list, ExcelAttributeConstants.EMPIDCARD))
					.in(TSocialFundInfo::getSocialStatus,CommonConstants.socialStatus));

			//已存在的社保数据
			HashMap<String, TSocialFundInfo> socialMap = new HashMap<>();
			if (Common.isNotNull(socialInfoList)) {
				for (TSocialFundInfo tSocialInfo1 : socialInfoList) {
					socialMap.put(tSocialInfo1.getEmpIdcard()
							+ CommonConstants.DOWN_LINE_STRING + tSocialInfo1.getSocialProvince()
							+ CommonConstants.DOWN_LINE_STRING + tSocialInfo1.getSocialCity()
							+ CommonConstants.DOWN_LINE_STRING + (null == tSocialInfo1.getSocialTown()
							? "null" : tSocialInfo1.getSocialTown()), tSocialInfo1);
				}
			}

			String[] areaArray;
			String exitMoney;
			String errorInfo;
			for (TPaymentHeFeiVo infoVo : list) {
				if (Common.isNotNull(infoVo.getEmpIdcard())) {
					infoVo.setEmpIdcard(infoVo.getEmpIdcard().replace("x", "X"));
				}
				//导入校验
				if (socialThreeCheckBase(errorMessageList, infoVo, type)) {
					continue;
				}
				//采用客服导入的地址
				areaArray = infoVo.getSocialPayAddr().split(CommonConstants.CENTER_SPLIT_LINE_STRING);
				infoVo = initAddressThree(areaArray, areaMap2, infoVo);
				//无对应员工的社保数据
				if (socialMap.size() > CommonConstants.ZERO_INT) {
					if (null == infoVo.getSocialProvince() || null == infoVo.getSocialCity()) {
						errorMessageList.put(UUID.randomUUID().toString(),new ErrorDetailVO(infoVo.getRowIndex(), CommonConstants.ZERO_INT, infoVo.getEmpIdcard(), "", "", infoVo.getEmpName(), "社保缴纳地填写错误，请核实后再次尝试！"));
						continue;
					}
					socialInfo = socialMap.get(infoVo.getEmpIdcard()
							+ CommonConstants.DOWN_LINE_STRING + infoVo.getSocialProvince()
							+ CommonConstants.DOWN_LINE_STRING + infoVo.getSocialCity()
							+ CommonConstants.DOWN_LINE_STRING + (null == infoVo.getSocialTown() ? "null" : infoVo.getSocialTown()));

					//对身份证与人员姓名的对应关系进行校验
					if (socialInfo != null && !socialInfo.getEmpName().equals(infoVo.getEmpName())) {
						errorMessageList.put(UUID.randomUUID().toString(),new ErrorDetailVO(infoVo.getRowIndex(), CommonConstants.ZERO_INT, infoVo.getEmpIdcard(), "", "", infoVo.getEmpName(), "姓名与身份证信息不一致，请核实后再次尝试！"));
						continue;
					}
					if (socialInfo != null && socialInfo.getSocialStartDate() == null) {
						errorMessageList.put(UUID.randomUUID().toString(),new ErrorDetailVO(infoVo.getRowIndex(), CommonConstants.ZERO_INT, infoVo.getEmpIdcard(), "", "", infoVo.getEmpName(), SocialConstants.ERROR_TEMPLATE + "的社保起缴日期为空！"));
						continue;
					}
				}
				if (null == socialInfo) {
					boolean isTrueAdder = false;
					socialist = socialInfoMapper.selectList(Wrappers.<TSocialInfo>query().lambda()
							.eq(TSocialInfo::getEmpIdcard, infoVo.getEmpIdcard())
							.eq(TSocialInfo::getSocialProvince, infoVo.getSocialProvince().toString())
							.eq(TSocialInfo::getSocialCity, infoVo.getSocialCity().toString())
							.eq(TSocialInfo::getDeleteFlag,CommonConstants.ZERO_STRING) //兼容历史数据的调整
							.in(TSocialInfo::getHandleStatus,CommonConstants.socialInfoStatus)
					);
					if (CollectionUtils.isNotEmpty(socialist)) {
						for (TSocialInfo socialInfo1 : socialist) {
							if ((Common.isEmpty(infoVo.getSocialTown()) || (Common.isNotNull(infoVo.getSocialTown()) &&
									infoVo.getSocialTown().toString().equals(socialInfo1.getSocialTown()))) &&
									DateUtil.dateToString(socialInfo1.getSocialStartDate(), "yyyyMM").compareTo(infoVo.getSocialPayMonth()) <= 0 &&
									(Common.isEmpty(socialInfo1.getSocialReduceDate()) || (Common.isNotNull(socialInfo1.getSocialReduceDate()) &&
											DateUtil.dateToString(socialInfo1.getSocialReduceDate(), "yyyyMM").compareTo(infoVo.getSocialPayMonth()) >= 0))) {
								isTrueAdder = true;
								tSocialInfo = socialInfo1;
								break;
							}
						}
					}
					if (!isTrueAdder) {
						errorMessageList.put(UUID.randomUUID().toString(),new ErrorDetailVO(infoVo.getRowIndex(), CommonConstants.ZERO_INT, infoVo.getEmpIdcard(), "", "", infoVo.getEmpName(),
								"无对应员工（身份证：" + infoVo.getEmpIdcard() + ")" + "的社保数据(请查验社保缴纳地)"));
						continue;
					}
				} else {
					tSocialInfo = null;
				}

				//判断是否存在养老缴费数据
				if (PaymentConstants.PENSION_RISK.equals(infoVo.getRiskType())) {
					//导入模板判重 养老
					exitMoney = infoVo.getEmpIdcard().concat(infoVo.getSocialPayMonth().concat(infoVo.getSocialCreateMonth()).concat(PaymentConstants.PENSION_RISK));
					if (pensionMoneyMap.get(exitMoney) != null && BigDecimalUtils.safeMultiply(BigDecimalUtils.safeAdd(
							BigDecimalUtils.isNullToZero(infoVo.getPersonalMoney()), BigDecimalUtils.isNullToZero(
									infoVo.getUnitMoney())), pensionMoneyMap.get(exitMoney),6).compareTo(BigDecimal.ZERO) > 0) {
						errorMessageList.put(UUID.randomUUID().toString(),new ErrorDetailVO(infoVo.getRowIndex(), CommonConstants.ZERO_INT, infoVo.getEmpIdcard(), "", "",
								infoVo.getEmpName(), SocialConstants.ERROR_TEMPLATE + "的养老缴费数据"));
						continue;
					} else {
						pensionMoneyMap.put(exitMoney, BigDecimalUtils.safeAdd(BigDecimalUtils.isNullToZero(infoVo.getPersonalMoney()),
								BigDecimalUtils.isNullToZero(infoVo.getUnitMoney())));
					}

					payExists = paymentInfoPensionMap.get(infoVo.getSocialPayAddr()
							+ CommonConstants.DOWN_LINE_STRING
							+ infoVo.getEmpIdcard().trim()
							+ CommonConstants.DOWN_LINE_STRING
							+ infoVo.getSocialPayMonth().trim()
							+ CommonConstants.DOWN_LINE_STRING
							+ infoVo.getSocialCreateMonth().trim()
							+ CommonConstants.DOWN_LINE_STRING
							+ PaymentConstants.PENSION_RISK);
					//存在社保缴费数据
					if (null != payExists && ((null != payExists.getYbSameFlg() && CommonConstants.ONE_STRING.equals(payExists.getYbSameFlg()))
							|| (BigDecimalUtils.safeMultiply(BigDecimalUtils.safeAdd(
							BigDecimalUtils.isNullToZero(infoVo.getPersonalMoney()),
							BigDecimalUtils.isNullToZero(infoVo.getUnitMoney())), BigDecimalUtils.safeAdd(
							BigDecimalUtils.isNullToZero(payExists.getUnitPensionMoney()),
							BigDecimalUtils.isNullToZero(payExists.getPersonalPensionMoney())),6).compareTo(BigDecimal.ZERO) > 0))) {
						errorMessageList.put(UUID.randomUUID().toString(),new ErrorDetailVO(infoVo.getRowIndex(), CommonConstants.ZERO_INT, infoVo.getEmpIdcard(), payExists.getSocialHousehold(), payExists.getProvidentHousehold(), infoVo.getEmpName(), "已存在对应员工身份证" + infoVo.getEmpIdcard()
								+ "的养老缴费数据,请勿重复导入！"));
						continue;
					}
				}

				//判断是否存在失业缴费数据
				if (PaymentConstants.UNEMPLOYEEMENT_RISK.equals(infoVo.getRiskType())) {
					//导入模板判重 失业
					exitMoney = infoVo.getEmpIdcard().concat(infoVo.getSocialPayMonth().concat(infoVo.getSocialCreateMonth()).concat(PaymentConstants.UNEMPLOYEEMENT_RISK));
					if (unEmpMoneyMap.get(exitMoney) != null && BigDecimalUtils.safeMultiply(BigDecimalUtils.safeAdd(
							BigDecimalUtils.isNullToZero(infoVo.getUnitMoney()), BigDecimalUtils.isNullToZero(
									infoVo.getPersonalMoney())), unEmpMoneyMap.get(exitMoney),6).compareTo(BigDecimal.ZERO) > 0) {
						errorMessageList.put(UUID.randomUUID().toString(),new ErrorDetailVO(infoVo.getRowIndex(), CommonConstants.ZERO_INT, infoVo.getEmpIdcard(), "", "",
								infoVo.getEmpName(), SocialConstants.ERROR_TEMPLATE + "的失业缴费数据"));
						continue;
					} else {
						unEmpMoneyMap.put(exitMoney, BigDecimalUtils.safeAdd(
								BigDecimalUtils.isNullToZero(infoVo.getUnitMoney()),
								BigDecimalUtils.isNullToZero(infoVo.getPersonalMoney())));
					}

					payExists = paymentInfoUnEmpMap.get(infoVo.getSocialPayAddr()
							+ CommonConstants.DOWN_LINE_STRING
							+ infoVo.getEmpIdcard().trim()
							+ CommonConstants.DOWN_LINE_STRING
							+ infoVo.getSocialPayMonth().trim()
							+ CommonConstants.DOWN_LINE_STRING
							+ infoVo.getSocialCreateMonth().trim()
							+ CommonConstants.DOWN_LINE_STRING
							+ PaymentConstants.UNEMPLOYEEMENT_RISK);
					//存在社保缴费数据
					if (null != payExists && ((null != payExists.getSySameFlg() && CommonConstants.ONE_STRING.equals(payExists.getSySameFlg()))
							|| (BigDecimalUtils.safeMultiply(BigDecimalUtils.safeAdd(
							BigDecimalUtils.isNullToZero(infoVo.getPersonalMoney()),
							BigDecimalUtils.isNullToZero(infoVo.getUnitMoney())), BigDecimalUtils.safeAdd(
							BigDecimalUtils.isNullToZero(payExists.getUnitUnemploymentMoney()),
							BigDecimalUtils.isNullToZero(payExists.getPersonalUnemploymentMoney())),6).compareTo(BigDecimal.ZERO) > 0))) {
						errorMessageList.put(UUID.randomUUID().toString(),new ErrorDetailVO(infoVo.getRowIndex(), CommonConstants.ZERO_INT, infoVo.getEmpIdcard(), payExists.getSocialHousehold(), payExists.getProvidentHousehold(), infoVo.getEmpName(), "已存在对应员工身份证" + infoVo.getEmpIdcard()
								+ "的失业缴费数据,请勿重复导入！"));
						continue;
					}
				}

				//判断是否存在医保缴费数据
				if (CommonConstants.ONE_STRING.equals(type)) {
					//导入模板判重 医疗
					exitMoney = infoVo.getEmpIdcard().concat(infoVo.getSocialPayMonth().concat(infoVo.getSocialCreateMonth()).concat(PaymentConstants.MEDICAL));
					if (medicalMoneyMap.get(exitMoney) != null && BigDecimalUtils.safeMultiply(BigDecimalUtils.safeAdd(
							BigDecimalUtils.isNullToZero(infoVo.getUnitMedicalMoney()), BigDecimalUtils.isNullToZero(
									infoVo.getPersonalMedicalMoney())), medicalMoneyMap.get(exitMoney),6).compareTo(BigDecimal.ZERO) > 0) {
						errorMessageList.put(UUID.randomUUID().toString(),new ErrorDetailVO(infoVo.getRowIndex(), CommonConstants.ZERO_INT, infoVo.getEmpIdcard(), "", "",
								infoVo.getEmpName(), SocialConstants.ERROR_TEMPLATE + "的医保缴费数据"));
						continue;
					} else {
						medicalMoneyMap.put(exitMoney, BigDecimalUtils.safeAdd(
								BigDecimalUtils.isNullToZero(infoVo.getUnitMedicalMoney()),
								BigDecimalUtils.isNullToZero(infoVo.getPersonalMedicalMoney())));
					}

					payExists = paymentInfoMedicalMap.get(infoVo.getSocialPayAddr()
							+ CommonConstants.DOWN_LINE_STRING
							+ infoVo.getEmpIdcard().trim()
							+ CommonConstants.DOWN_LINE_STRING
							+ infoVo.getSocialPayMonth().trim()
							+ CommonConstants.DOWN_LINE_STRING
							+ infoVo.getSocialCreateMonth().trim()
							+ CommonConstants.DOWN_LINE_STRING
							+ PaymentConstants.MEDICAL);

					//存在社保缴费数据
					if (null != payExists && ((null != payExists.getYlSameFlg() && CommonConstants.ONE_STRING.equals(payExists.getYlSameFlg()))
							|| (BigDecimalUtils.safeMultiply(BigDecimalUtils.safeAdd(
							BigDecimalUtils.isNullToZero(infoVo.getUnitMedicalMoney()),
							BigDecimalUtils.isNullToZero(infoVo.getPersonalMedicalMoney())), BigDecimalUtils.safeAdd(
							BigDecimalUtils.isNullToZero(payExists.getUnitMedicalMoney()),
							BigDecimalUtils.isNullToZero(payExists.getPersonalMedicalMoney())),6).compareTo(BigDecimal.ZERO) > 0))) {
						errorMessageList.put(UUID.randomUUID().toString(),new ErrorDetailVO(infoVo.getRowIndex(), CommonConstants.ZERO_INT, infoVo.getEmpIdcard(), payExists.getSocialHousehold(), payExists.getProvidentHousehold(), infoVo.getEmpName(), "已存在对应员工身份证" + infoVo.getEmpIdcard()
								+ "的医保缴费数据,请勿重复导入！"));
						continue;
					}
				}

				//判断是否存在工伤缴费数据
				if (PaymentConstants.INJURY_RISK.equals(infoVo.getRiskType())) {
					//导入模板判重 工伤
					exitMoney = infoVo.getEmpIdcard().concat(infoVo.getSocialPayMonth().concat(infoVo.getSocialCreateMonth()).concat(PaymentConstants.INJURY_RISK));
					if (injuryMoneyMap.get(exitMoney) != null && BigDecimalUtils.safeMultiply(BigDecimalUtils.safeAdd(
									BigDecimalUtils.isNullToZero(infoVo.getPersonalMoney()),
									BigDecimalUtils.isNullToZero(infoVo.getUnitMoney())),
							injuryMoneyMap.get(exitMoney),6).compareTo(BigDecimal.ZERO) > 0) {
						errorMessageList.put(UUID.randomUUID().toString(),new ErrorDetailVO(infoVo.getRowIndex(), CommonConstants.ZERO_INT, infoVo.getEmpIdcard(), "", "",
								infoVo.getEmpName(), SocialConstants.ERROR_TEMPLATE + "的工伤缴费数据"));
						continue;
					} else {
						injuryMoneyMap.put(exitMoney, BigDecimalUtils.safeAdd(
								BigDecimalUtils.isNullToZero(infoVo.getPersonalMoney()),
								BigDecimalUtils.isNullToZero(infoVo.getUnitMoney())));
					}

					payExists = paymentInfoInjuryMap.get(infoVo.getSocialPayAddr()
							+ CommonConstants.DOWN_LINE_STRING
							+ infoVo.getEmpIdcard().trim()
							+ CommonConstants.DOWN_LINE_STRING
							+ infoVo.getSocialPayMonth().trim()
							+ CommonConstants.DOWN_LINE_STRING
							+ infoVo.getSocialCreateMonth().trim()
							+ CommonConstants.DOWN_LINE_STRING
							+ PaymentConstants.INJURY_RISK);

					//存在社保缴费数据
					if (null != payExists && ((null != payExists.getGsSameFlg() && CommonConstants.ONE_STRING.equals(payExists.getGsSameFlg()))
							|| (BigDecimalUtils.safeMultiply(BigDecimalUtils.safeAdd(
									BigDecimalUtils.isNullToZero(infoVo.getPersonalMoney()),
									BigDecimalUtils.isNullToZero(infoVo.getUnitMoney())),
							BigDecimalUtils.isNullToZero(payExists.getUnitInjuryMoney()),6).compareTo(BigDecimal.ZERO) > 0))) {
						errorMessageList.put(UUID.randomUUID().toString(),new ErrorDetailVO(infoVo.getRowIndex(), CommonConstants.ZERO_INT, infoVo.getEmpIdcard(), payExists.getSocialHousehold(), payExists.getProvidentHousehold(), infoVo.getEmpName(), "已存在对应员工身份证" + infoVo.getEmpIdcard()
								+ "的单位工伤缴费数据,请勿重复导入！"));
						continue;
					}
				}

				//判断是否存在医疗救助金缴费数据
				if (CommonConstants.ONE_STRING.equals(type)) {
					//导入模板判重 医疗救助金
					exitMoney = infoVo.getEmpIdcard().concat(infoVo.getSocialPayMonth().concat(infoVo.getSocialCreateMonth()).concat(SocialConstants.DB));
					if (bigMoneyMap.get(exitMoney) != null && BigDecimalUtils.safeMultiply(BigDecimalUtils.safeAdd(
									BigDecimalUtils.isNullToZero(infoVo.getUnitBigailmentMoney()),
									BigDecimalUtils.isNullToZero(infoVo.getPersonalBigailmentMoney())),
							bigMoneyMap.get(exitMoney),6).compareTo(BigDecimal.ZERO) > 0) {
						errorMessageList.put(UUID.randomUUID().toString(),new ErrorDetailVO(infoVo.getRowIndex(), CommonConstants.ZERO_INT, infoVo.getEmpIdcard(), "", "",
								infoVo.getEmpName(), SocialConstants.ERROR_TEMPLATE + "的医疗救助金缴费数据"));
						continue;
					} else {
						bigMoneyMap.put(exitMoney, BigDecimalUtils.safeAdd(
								BigDecimalUtils.isNullToZero(infoVo.getUnitBigailmentMoney()),
								BigDecimalUtils.isNullToZero(infoVo.getPersonalBigailmentMoney())));
					}

					payExists = paymentInfoBigMap.get(infoVo.getSocialPayAddr()
							+ CommonConstants.DOWN_LINE_STRING
							+ infoVo.getEmpIdcard().trim()
							+ CommonConstants.DOWN_LINE_STRING
							+ infoVo.getSocialPayMonth().trim()
							+ CommonConstants.DOWN_LINE_STRING
							+ infoVo.getSocialCreateMonth().trim()
							+ CommonConstants.DOWN_LINE_STRING
							+ SocialConstants.DB);

					//存在社保缴费数据
					if (null != payExists && ((null != payExists.getDbSameFlg() && CommonConstants.ONE_STRING.equals(payExists.getDbSameFlg()))
							|| (BigDecimalUtils.safeMultiply(BigDecimalUtils.safeAdd(
							BigDecimalUtils.isNullToZero(infoVo.getUnitBigailmentMoney()),
							BigDecimalUtils.isNullToZero(infoVo.getPersonalBigailmentMoney())), BigDecimalUtils.safeAdd(
							BigDecimalUtils.isNullToZero(payExists.getUnitBigmailmentMoney()),
							BigDecimalUtils.isNullToZero(payExists.getPersonalBigmailmentMoney())),6).compareTo(BigDecimal.ZERO) > 0))) {
						errorMessageList.put(UUID.randomUUID().toString(),new ErrorDetailVO(infoVo.getRowIndex(), CommonConstants.ZERO_INT, infoVo.getEmpIdcard(), payExists.getSocialHousehold(), payExists.getProvidentHousehold(), infoVo.getEmpName(), "已存在对应员工身份证" + infoVo.getEmpIdcard()
								+ "的医疗救助金缴费数据,请勿重复导入！"));
						continue;
					}
				}

				if (Common.isEmpty(tSocialInfo)) {
					tSocialInfo = socialInfoMapper.selectOne(Wrappers.<TSocialInfo>query().lambda()
							.eq(TSocialInfo::getEmpIdcard, infoVo.getEmpIdcard()).groupBy(TSocialInfo::getCreateTime)
							.in(TSocialInfo::getHandleStatus,CommonConstants.socialInfoStatus)
							.last(CommonConstants.LAST_ONE_SQL));
				}

				payExists = new TPaymentInfo();
				payExists.setLockStatus(CommonConstants.ZERO_STRING);
				if (Common.isNotNull(socialInfo)) {
					payExists.setEmpId(socialInfo.getEmpId());
					payExists.setEmpIdcard(socialInfo.getEmpIdcard());
					payExists.setEmpName(socialInfo.getEmpName());
					if (Common.isNotNull(domainMap)) {
						domain = domainMap.get(socialInfo.getSettleDomainCode());
					} else {
						domain = null;
					}
					if (Common.isEmpty(domain)) {
						errorMessageList.put(UUID.randomUUID().toString(), new ErrorDetailVO(infoVo.getRowIndex(),
								CommonConstants.ZERO_INT, infoVo.getEmpIdcard(), payExists.getSocialHousehold(),
								payExists.getProvidentHousehold(), infoVo.getEmpName(), SocialConstants.NOT_EXIT_SETTLEiNFO));
						continue;
					}
					payExists.setBpoFlag(domain.getBpoFlag());
					payExists.setSecondIndicatorBelong(domain.getSecondIndicatorBelong());
					payExists.setSettleDomainId(socialInfo.getSettleDomain());
					payExists.setSettleDomainCode(Common.isNotNull(socialInfo.getSettleDomainCode()) ? socialInfo.getSettleDomainCode(): "");
					payExists.setUnitId(Common.isNotNull(socialInfo.getUnitId()) ? socialInfo.getUnitId(): "");
					payExists.setSettleDomainName(Common.isNotNull(socialInfo.getSettleDomainName()) ? socialInfo.getSettleDomainName(): "");
					payExists.setUnitName(Common.isNotNull(socialInfo.getUnitName()) ? socialInfo.getUnitName(): "");
					payExists.setSocialProvince(socialInfo.getSocialProvince());
					payExists.setSocialCity(socialInfo.getSocialCity());
					payExists.setSocialTown(Common.isNotNull(socialInfo.getSocialTown()) ? socialInfo.getSocialTown(): "");
					payExists.setSocialHousehold(socialInfo.getSocialHouseholdName());
				} else if (Common.isNotNull(tSocialInfo)) {
					payExists.setEmpId(tSocialInfo.getEmpId());
					payExists.setEmpIdcard(tSocialInfo.getEmpIdcard());
					payExists.setEmpName(tSocialInfo.getEmpName());
					if (Common.isNotNull(domainMap)) {
						domain = domainMap.get(tSocialInfo.getSettleDomainCode());
					} else {
						domain = null;
					}
					if (Common.isEmpty(domain)) {
						errorMessageList.put(UUID.randomUUID().toString(), new ErrorDetailVO(infoVo.getRowIndex(),
								CommonConstants.ZERO_INT, infoVo.getEmpIdcard(), payExists.getSocialHousehold(),
								payExists.getProvidentHousehold(), infoVo.getEmpName(), SocialConstants.NOT_EXIT_SETTLEiNFO));
						continue;
					}
					payExists.setSettleDomainId(tSocialInfo.getSettleDomain());
					payExists.setSettleDomainCode(tSocialInfo.getSettleDomainCode());
					payExists.setSecondIndicatorBelong(domain.getSecondIndicatorBelong());
					payExists.setSettleDomainName(domain.getDepartName());
					payExists.setUnitId(domain.getCustomerId());
					payExists.setUnitName(domain.getCustomerName());
					payExists.setBpoFlag(domain.getBpoFlag());
					payExists.setSocialProvince(tSocialInfo.getSocialProvince());
					payExists.setSocialCity(tSocialInfo.getSocialCity());
					payExists.setSocialTown(Common.isNotNull(tSocialInfo.getSocialTown()) ? tSocialInfo.getSocialTown(): "");
					payExists.setSocialHousehold(tSocialInfo.getSocialHouseholdName());
				}
				// 项目信息校验
				errorInfo = settleInfoCheck(payExists);
				if (!Common.isEmpty(errorInfo)){
					errorMessageList.put(UUID.randomUUID().toString(), new ErrorDetailVO(infoVo.getRowIndex(),
							CommonConstants.ZERO_INT, infoVo.getEmpIdcard(), payExists.getSocialHousehold(),
							payExists.getProvidentHousehold(), infoVo.getEmpName(), SocialConstants.ERROR_PRI
							+ errorInfo + SocialConstants.ERROR_END));
					continue;
				}
				if (Common.isNotNull(tSocialInfo)) {
					payExists.setInauguralTeam(Common.isNotNull(tSocialInfo.getInauguralTeam()) ? tSocialInfo.getInauguralTeam(): "");
					payExists.setEmpNo(Common.isNotNull(tSocialInfo.getEmpNo()) ? tSocialInfo.getEmpNo(): "");
				} else {
					payExists.setInauguralTeam("");
					payExists.setEmpNo("");
				}
				payExists.setSocialPayMonth(infoVo.getSocialPayMonth());

				if (null != payExists.getSocialProvince()) {
					temp = areaMap.get(payExists.getSocialProvince());
					if (Common.isNotNull(temp)) {
						payExists.setSocialPayAddr(temp);
					}
				}
				if (null != payExists.getSocialCity()) {
					temp = areaMap.get(payExists.getSocialCity());
					if (Common.isNotNull(temp)) {
						payExists.setSocialPayAddr(payExists.getSocialPayAddr() + CommonConstants.CENTER_SPLIT_LINE_STRING + temp);
					}
				}
				if (null != payExists.getSocialTown()) {
					temp = areaMap.get(payExists.getSocialTown());
					if (Common.isNotNull(temp)) {
						payExists.setSocialPayAddr(payExists.getSocialPayAddr() + CommonConstants.CENTER_SPLIT_LINE_STRING + temp);
					}
				} else {
					payExists.setSocialTown("");
				}
				payExists.setSocialSecurityNo(infoVo.getSocialSecurityNo());
				payExists.setSocialCreateMonth(infoVo.getSocialCreateMonth());
				payExists.setCreateTime(LocalDateTime.now());
				payExists.setSocialId(UUID.randomUUID().toString());
				if (PaymentConstants.PENSION_RISK.equals(infoVo.getRiskType())) {
					payExists.setUnitPensionMoney(infoVo.getUnitMoney());
					payExists.setUnitPensionSet(infoVo.getUnitSet());
					payExists.setPersonalPensionMoney(infoVo.getPersonalMoney());
					payExists.setUnitSocialSum(BigDecimalUtils.safeAdd(payExists.getUnitPensionMoney()
							, payExists.getUnitSocialSum()));
					payExists.setSocialSecurityPersonalSum(BigDecimalUtils.safeAdd(payExists.getPersonalPensionMoney()
							, payExists.getSocialSecurityPersonalSum()));
					payExists.setSocialSum(BigDecimalUtils.safeAdd(payExists.getUnitSocialSum(), payExists.getSocialSecurityPersonalSum()));
					payExists.setSumAll(payExists.getSocialSum());
					batchYlInsertList.put(UUID.randomUUID().toString(),payExists);
				}
				if (PaymentConstants.UNEMPLOYEEMENT_RISK.equals(infoVo.getRiskType())) {
					payExists.setUnitUnemploymentMoney(infoVo.getUnitMoney());
					payExists.setPersonalUnemploymentMoney(infoVo.getPersonalMoney());
					payExists.setUnitUnemploymentSet(infoVo.getUnitSet());
					payExists.setUnitSocialSum(BigDecimalUtils.safeAdd(payExists.getUnitUnemploymentMoney()
							, payExists.getUnitSocialSum()));
					payExists.setSocialSecurityPersonalSum(BigDecimalUtils.safeAdd(payExists.getPersonalUnemploymentMoney()
							, payExists.getSocialSecurityPersonalSum()));
					payExists.setSocialSum(BigDecimalUtils.safeAdd(payExists.getUnitSocialSum(), payExists.getSocialSecurityPersonalSum()));
					payExists.setSumAll(payExists.getSocialSum());
					batchSyInsertList.put(UUID.randomUUID().toString(),payExists);
				}
				if (PaymentConstants.INJURY_RISK.equals(infoVo.getRiskType())) {
					payExists.setUnitInjuryMoney(infoVo.getUnitMoney());
					payExists.setUnitInjurySet(infoVo.getUnitSet());
					payExists.setUnitSocialSum(BigDecimalUtils.safeAdd(payExists.getUnitInjuryMoney()
							, payExists.getUnitSocialSum()));
					payExists.setSocialSum(BigDecimalUtils.safeAdd(payExists.getUnitSocialSum(), payExists.getSocialSecurityPersonalSum()));
					payExists.setSumAll(payExists.getSocialSum());
					batchGsInsertList.put(UUID.randomUUID().toString(),payExists);
				}
				if (CommonConstants.ONE_STRING.equals(type)) {
					payExists.setUnitMedicalMoney(null == infoVo.getUnitMedicalMoney() ? BigDecimal.ZERO : infoVo.getUnitMedicalMoney());
					payExists.setPersonalMedicalMoney(null == infoVo.getPersonalMedicalMoney() ? BigDecimal.ZERO : infoVo.getPersonalMedicalMoney());
					payExists.setUnitBigmailmentMoney(null == infoVo.getUnitBigailmentMoney() ? BigDecimal.ZERO : infoVo.getUnitBigailmentMoney());
					payExists.setUnitMedicalSet(null == infoVo.getMedicalSet() ? BigDecimal.ZERO : infoVo.getMedicalSet());
					payExists.setPersonalBigmailmentMoney(null == infoVo.getPersonalBigailmentMoney() ? BigDecimal.ZERO : infoVo.getPersonalBigailmentMoney());
					payExists.setSocialSecurityNo(null == infoVo.getSocialSecurityNo() ? "" : infoVo.getSocialSecurityNo());
					payExists.setUnitSocialSum(BigDecimalUtils.safeAdd(payExists.getUnitMedicalMoney()
							, payExists.getUnitBigmailmentMoney()
							, payExists.getUnitSocialSum()));
					payExists.setSocialSecurityPersonalSum(BigDecimalUtils.safeAdd(payExists.getPersonalMedicalMoney()
							, payExists.getPersonalBigmailmentMoney()
							, payExists.getSocialSecurityPersonalSum()));
					payExists.setSocialSum(BigDecimalUtils.safeAdd(payExists.getUnitSocialSum(), payExists.getSocialSecurityPersonalSum()));
					payExists.setSumAll(payExists.getSocialSum());
					batchYyInsertList.put(UUID.randomUUID().toString(),payExists);
				}
				errorMessageList.put(UUID.randomUUID().toString(),new ErrorDetailVO(infoVo.getRowIndex(), CommonConstants.ONE_INT,
						infoVo.getEmpIdcard(),
						payExists.getSocialHousehold(),
						payExists.getProvidentHousehold(), infoVo.getEmpName(),
						"对应员工身份证" + infoVo.getEmpIdcard() + CommonConstants.SAVE_SUCCESS,CommonConstants.GREEN));
			}
		}
		return errorMessageList;
	}

	private ConcurrentHashMap<String, ErrorMessage> executeImportSocialListTax(List<TPaymentTaxSocialVo> list,
																				  HashMap<String, String> areaMap,
																				  HashMap<String, String> areaMap2,
																				  ConcurrentHashMap<String, TPaymentInfo> paymentInfoPensionMap,
																				  ConcurrentHashMap<String, TPaymentInfo> paymentInfoMedicalMap,
																				  ConcurrentHashMap<String, TPaymentInfo> paymentInfoUnEmpMap,
																				  ConcurrentHashMap<String, TPaymentInfo> paymentInfoInjuryMap,
																				  ConcurrentHashMap<String, TPaymentInfo> paymentInfoBigMap,
																			      ConcurrentHashMap<String, TPaymentInfo> paymentInfoBirthMap,
																			      ConcurrentHashMap<String, ErrorMessage> errorMessageList,
																				  ConcurrentHashMap<String, BigDecimal> pensionMoneyMap,
																				  ConcurrentHashMap<String, BigDecimal> birthMoneyMap,
																				  ConcurrentHashMap<String, BigDecimal> bigMoneyMap,
																				  ConcurrentHashMap<String, BigDecimal> unEmpMoneyMap,
																				  ConcurrentHashMap<String, BigDecimal> injuryMoneyMap,
																				  ConcurrentHashMap<String, BigDecimal> medicalMoneyMap,
																				  ConcurrentHashMap<String, TPaymentInfo> batchGsInsertList,
																				  ConcurrentHashMap<String, TPaymentInfo> batchSyInsertList,
																				  ConcurrentHashMap<String, TPaymentInfo> batchYlInsertList,
																				  ConcurrentHashMap<String, TPaymentInfo> batchYyInsertList,
																				  ConcurrentHashMap<String, TPaymentInfo> batchBigInsertList,
																				  ConcurrentHashMap<String, TPaymentInfo> batchBirthInsertList,
																				  Map<String,TSettleDomainSelectVo> domainMap) {
		if (Common.isNotNull(list)) {
			TPaymentInfo payExists;
			TPaymentInfo payInsert;
			TSocialFundInfo socialInfo = null;
			TSocialInfo tSocialInfo = null;
			String temp;
			List<TSocialInfo> socialist;
			TSettleDomain domain;

			List<TSocialFundInfo> socialInfoList = socialFundInfoMapper.selectList(Wrappers.<TSocialFundInfo>query().lambda()
					.in(TSocialFundInfo::getEmpIdcard, Common.listObjectToStrList(list, ExcelAttributeConstants.EMPIDCARD))
					.in(TSocialFundInfo::getSocialStatus, CommonConstants.socialStatus));

			//已存在的社保数据
			HashMap<String, TSocialFundInfo> socialMap = new HashMap<>();
			if (Common.isNotNull(socialInfoList)) {
				for (TSocialFundInfo tSocialInfo1 : socialInfoList) {
					socialMap.put(tSocialInfo1.getEmpIdcard()
							+ CommonConstants.DOWN_LINE_STRING + tSocialInfo1.getSocialProvince()
							+ CommonConstants.DOWN_LINE_STRING + tSocialInfo1.getSocialCity()
							+ CommonConstants.DOWN_LINE_STRING + (null == tSocialInfo1.getSocialTown()
							? "null" : tSocialInfo1.getSocialTown()), tSocialInfo1);
				}
			}

			String[] areaArray;
			String exitMoneyPer;
			String exitMoneyCon;
			String exitInsertPaymnet;
			String errorInfo;
			for (TPaymentTaxSocialVo infoVo : list) {
				if (Common.isNotNull(infoVo.getEmpIdcard())) {
					infoVo.setEmpIdcard(infoVo.getEmpIdcard().replace("x", "X"));
				}
				//导入校验
				if (socialThreeCheckBaseTax(errorMessageList, infoVo)) {
					continue;
				}
				//采用客服导入的地址
				areaArray = infoVo.getSocialPayAddr().split(CommonConstants.CENTER_SPLIT_LINE_STRING);
				infoVo = initAddressThreeTax(areaArray, areaMap2, infoVo);
				//无对应员工的社保数据
				if (socialMap.size() > CommonConstants.ZERO_INT) {
					if (null == infoVo.getSocialProvince() || null == infoVo.getSocialCity()) {
						errorMessageList.put(UUID.randomUUID().toString(),new ErrorMessage(infoVo.getRowIndex(), "社保缴纳地填写错误，请核实后再次尝试！",infoVo));
						continue;
					}
					socialInfo = socialMap.get(infoVo.getEmpIdcard()
							+ CommonConstants.DOWN_LINE_STRING + infoVo.getSocialProvince()
							+ CommonConstants.DOWN_LINE_STRING + infoVo.getSocialCity()
							+ CommonConstants.DOWN_LINE_STRING + (null == infoVo.getSocialTown() ? "null" : infoVo.getSocialTown()));

					//对身份证与人员姓名的对应关系进行校验
					if (socialInfo != null && !socialInfo.getEmpName().equals(infoVo.getEmpName())) {
						errorMessageList.put(UUID.randomUUID().toString(),new ErrorMessage(infoVo.getRowIndex(), "姓名与身份证信息不一致，请核实后再次尝试！",infoVo));
						continue;
					}
					if (socialInfo != null && socialInfo.getSocialStartDate() == null) {
						errorMessageList.put(UUID.randomUUID().toString(),new ErrorMessage(infoVo.getRowIndex(), SocialConstants.ERROR_TEMPLATE + "的社保起缴日期为空！",infoVo));
						continue;
					}
				}
				if (null == socialInfo) {
					boolean isTrueAdder = false;
					socialist = socialInfoMapper.selectList(Wrappers.<TSocialInfo>query().lambda()
							.eq(TSocialInfo::getEmpIdcard, infoVo.getEmpIdcard())
							.eq(TSocialInfo::getSocialProvince, infoVo.getSocialProvince().toString())
							.eq(TSocialInfo::getSocialCity, infoVo.getSocialCity().toString())
							.eq(TSocialInfo::getDeleteFlag,CommonConstants.ZERO_STRING) //兼容历史数据的调整
							.in(TSocialInfo::getHandleStatus, CommonConstants.socialInfoStatus));
					if (CollectionUtils.isNotEmpty(socialist)) {
						for (TSocialInfo socialInfo1 : socialist) {
							if ((Common.isEmpty(infoVo.getSocialTown()) || (Common.isNotNull(infoVo.getSocialTown()) &&
									infoVo.getSocialTown().toString().equals(socialInfo1.getSocialTown()))) &&
									DateUtil.dateToString(socialInfo1.getSocialStartDate(), "yyyyMM").compareTo(infoVo.getSocialPayMonth()) <= 0 &&
									(Common.isEmpty(socialInfo1.getSocialReduceDate()) || (Common.isNotNull(socialInfo1.getSocialReduceDate()) &&
											DateUtil.dateToString(socialInfo1.getSocialReduceDate(), "yyyyMM").compareTo(infoVo.getSocialPayMonth()) >= 0))) {
								isTrueAdder = true;
								tSocialInfo = socialInfo1;
								break;
							}
						}
					}
					if (!isTrueAdder) {
						errorMessageList.put(UUID.randomUUID().toString(),new ErrorMessage(infoVo.getRowIndex(),
								"无对应员工（身份证：" + infoVo.getEmpIdcard() + ")" + "的社保数据(请查验社保缴纳地)",infoVo));
						continue;
					}
				} else {
					tSocialInfo = null;
				}

				payExists = new TPaymentInfo();
				if (Common.isEmpty(tSocialInfo)) {
					tSocialInfo = socialInfoMapper.selectOne(Wrappers.<TSocialInfo>query().lambda()
							.eq(TSocialInfo::getEmpIdcard, infoVo.getEmpIdcard()).groupBy(TSocialInfo::getCreateTime)
							.in(TSocialInfo::getHandleStatus, CommonConstants.socialInfoStatus)
							.last(CommonConstants.LAST_ONE_SQL));
				}

				payExists.setLockStatus(CommonConstants.ZERO_STRING);
				if (Common.isNotNull(socialInfo)) {
					payExists.setEmpId(socialInfo.getEmpId());
					payExists.setEmpIdcard(socialInfo.getEmpIdcard());
					payExists.setEmpName(socialInfo.getEmpName());
					if (Common.isNotNull(domainMap)) {
						domain = domainMap.get(socialInfo.getSettleDomainCode());
					} else {
						domain = null;
					}
					if (Common.isEmpty(domain)) {
						errorMessageList.put(UUID.randomUUID().toString(), new ErrorMessage(infoVo.getRowIndex(), SocialConstants.NOT_EXIT_SETTLEiNFO,infoVo));
						continue;
					}
					payExists.setBpoFlag(domain.getBpoFlag());
					payExists.setSecondIndicatorBelong(domain.getSecondIndicatorBelong());
					payExists.setSettleDomainId(socialInfo.getSettleDomain());
					payExists.setSettleDomainCode(Common.isNotNull(socialInfo.getSettleDomainCode()) ? socialInfo.getSettleDomainCode(): "");
					payExists.setUnitId(Common.isNotNull(socialInfo.getUnitId()) ? socialInfo.getUnitId(): "");
					payExists.setSettleDomainName(Common.isNotNull(socialInfo.getSettleDomainName()) ? socialInfo.getSettleDomainName(): "");
					payExists.setUnitName(Common.isNotNull(socialInfo.getUnitName()) ? socialInfo.getUnitName(): "");
					payExists.setSocialProvince(socialInfo.getSocialProvince());
					payExists.setSocialCity(socialInfo.getSocialCity());
					payExists.setSocialTown(Common.isNotNull(socialInfo.getSocialTown()) ? socialInfo.getSocialTown(): "");
					payExists.setSocialHousehold(socialInfo.getSocialHouseholdName());
				} else if (Common.isNotNull(tSocialInfo)) {
					payExists.setEmpId(tSocialInfo.getEmpId());
					payExists.setEmpIdcard(tSocialInfo.getEmpIdcard());
					payExists.setEmpName(tSocialInfo.getEmpName());
					if (Common.isNotNull(domainMap)) {
						domain = domainMap.get(tSocialInfo.getSettleDomainCode());
					} else {
						domain = null;
					}
					if (Common.isEmpty(domain)) {
						errorMessageList.put(UUID.randomUUID().toString(), new ErrorMessage(infoVo.getRowIndex(), SocialConstants.NOT_EXIT_SETTLEiNFO,infoVo));
						continue;
					}
					payExists.setSettleDomainId(tSocialInfo.getSettleDomain());
					payExists.setSettleDomainCode(tSocialInfo.getSettleDomainCode());
					payExists.setSecondIndicatorBelong(domain.getSecondIndicatorBelong());
					payExists.setSettleDomainName(domain.getDepartName());
					payExists.setUnitId(domain.getCustomerId());
					payExists.setUnitName(domain.getCustomerName());
					payExists.setBpoFlag(domain.getBpoFlag());
					payExists.setSocialProvince(tSocialInfo.getSocialProvince());
					payExists.setSocialCity(tSocialInfo.getSocialCity());
					payExists.setSocialTown(Common.isNotNull(tSocialInfo.getSocialTown()) ? tSocialInfo.getSocialTown(): "");
					payExists.setSocialHousehold(tSocialInfo.getSocialHouseholdName());
				}
				// 项目信息校验
				errorInfo = settleInfoCheck(payExists);
				if (!Common.isEmpty(errorInfo)){
					errorMessageList.put(UUID.randomUUID().toString(), new ErrorMessage(infoVo.getRowIndex(), SocialConstants.ERROR_PRI
							+ errorInfo + SocialConstants.ERROR_END,infoVo));
					continue;
				}
				if (Common.isNotNull(tSocialInfo)) {
					payExists.setInauguralTeam(Common.isNotNull(tSocialInfo.getInauguralTeam()) ? tSocialInfo.getInauguralTeam(): "");
					payExists.setEmpNo(Common.isNotNull(tSocialInfo.getEmpNo()) ? tSocialInfo.getEmpNo(): "");
				} else {
					payExists.setInauguralTeam("");
					payExists.setEmpNo("");
				}
				payExists.setSocialPayMonth(infoVo.getSocialPayMonth());

				if (null != payExists.getSocialProvince()) {
					temp = areaMap.get(payExists.getSocialProvince());
					if (Common.isNotNull(temp)) {
						payExists.setSocialPayAddr(temp);
					}
				}
				if (null != payExists.getSocialCity()) {
					temp = areaMap.get(payExists.getSocialCity());
					if (Common.isNotNull(temp)) {
						payExists.setSocialPayAddr(payExists.getSocialPayAddr() + CommonConstants.CENTER_SPLIT_LINE_STRING + temp);
					}
				}
				if (null != payExists.getSocialTown()) {
					temp = areaMap.get(payExists.getSocialTown());
					if (Common.isNotNull(temp)) {
						payExists.setSocialPayAddr(payExists.getSocialPayAddr() + CommonConstants.CENTER_SPLIT_LINE_STRING + temp);
					}
				} else {
					payExists.setSocialTown("");
				}
				payExists.setSocialSecurityNo(CommonConstants.EMPTY_STRING);
				payExists.setSocialCreateMonth(infoVo.getSocialCreateMonth());
				payExists.setCreateTime(LocalDateTime.now());
				payExists.setSocialId(UUID.randomUUID().toString());
				//判断是否存在养老数据
				if (PaymentConstants.COMPANY_YL.equals(infoVo.getRiskType()) || PaymentConstants.PENSION_YL.equals(infoVo.getRiskType())) {
					//导入模板判重 养老
					exitMoneyPer = infoVo.getEmpIdcard().concat(infoVo.getSocialPayMonth().concat(infoVo.getSocialCreateMonth()).concat(PaymentConstants.COMPANY_YL));
					exitMoneyCon = infoVo.getEmpIdcard().concat(infoVo.getSocialPayMonth().concat(infoVo.getSocialCreateMonth()).concat(PaymentConstants.PENSION_YL));
					exitInsertPaymnet = infoVo.getEmpIdcard().concat(infoVo.getSocialPayMonth().concat(infoVo.getSocialCreateMonth()).concat(PaymentConstants.PENSION_RISK));
					if (PaymentConstants.COMPANY_YL.equals(infoVo.getRiskType())) {
						if (pensionMoneyMap.get(exitMoneyCon) != null && BigDecimalUtils.safeMultiply(
								BigDecimalUtils.isNullToZero(infoVo.getPaymentMoney())
								, pensionMoneyMap.get(exitMoneyCon),6).compareTo(BigDecimal.ZERO) > 0) {
							errorMessageList.put(UUID.randomUUID().toString(), new ErrorMessage(infoVo.getRowIndex(),SocialConstants.ERROR_TEMPLATE + "的单位养老缴费数据",infoVo));
							continue;
						} else {
							if (Common.isNotNull(pensionMoneyMap.get(exitMoneyPer))) {
								payExists.setPersonalPensionMoney(pensionMoneyMap.get(exitMoneyPer));
							} else {
								payExists.setPersonalPensionMoney(BigDecimal.ZERO);
							}
							payExists.setUnitPensionMoney(infoVo.getPaymentMoney());
							pensionMoneyMap.put(exitMoneyCon, BigDecimalUtils.isNullToZero(infoVo.getPaymentMoney()));
						}
					} else {
						if (pensionMoneyMap.get(exitMoneyPer) != null && BigDecimalUtils.safeMultiply(
								BigDecimalUtils.isNullToZero(infoVo.getPaymentMoney())
								, pensionMoneyMap.get(exitMoneyPer),6).compareTo(BigDecimal.ZERO) > 0) {
							errorMessageList.put(UUID.randomUUID().toString(), new ErrorMessage(infoVo.getRowIndex(), SocialConstants.ERROR_TEMPLATE + "的个人养老缴费数据",infoVo));
							continue;
						} else {
							if (Common.isNotNull(pensionMoneyMap.get(exitMoneyCon))) {
								payExists.setUnitPensionMoney(pensionMoneyMap.get(exitMoneyCon));
							} else {
								payExists.setUnitPensionMoney(BigDecimal.ZERO);
							}
							payExists.setPersonalPensionMoney(infoVo.getPaymentMoney());
							pensionMoneyMap.put(exitMoneyPer, BigDecimalUtils.isNullToZero(infoVo.getPaymentMoney()));
						}
					}
					payExists.setUnitPensionSet(infoVo.getPaymentSet());
					payExists.setUnitSocialSum(Common.isEmpty(payExists.getUnitPensionMoney()) ? BigDecimal.ZERO : payExists.getUnitPensionMoney());
					payExists.setSocialSecurityPersonalSum(Common.isEmpty(payExists.getPersonalPensionMoney()) ? BigDecimal.ZERO : payExists.getPersonalPensionMoney());
					payExists.setSocialSum(BigDecimalUtils.safeAdd(payExists.getUnitSocialSum(), payExists.getSocialSecurityPersonalSum()));
					payExists.setSumAll(payExists.getSocialSum());

					payInsert = paymentInfoPensionMap.get(infoVo.getSocialPayAddr()
							+ CommonConstants.DOWN_LINE_STRING
							+ infoVo.getEmpIdcard().trim()
							+ CommonConstants.DOWN_LINE_STRING
							+ infoVo.getSocialPayMonth().trim()
							+ CommonConstants.DOWN_LINE_STRING
							+ infoVo.getSocialCreateMonth().trim()
							+ CommonConstants.DOWN_LINE_STRING
							+ PaymentConstants.PENSION_RISK);
					//存在社保缴费数据
					if (null != payInsert && ((null != payInsert.getYbSameFlg() && CommonConstants.ONE_STRING.equals(payInsert.getYbSameFlg()))
							|| (BigDecimalUtils.safeMultiply(payExists.getSocialSum(), BigDecimalUtils.safeAdd(
							BigDecimalUtils.isNullToZero(payInsert.getUnitPensionMoney()),
							BigDecimalUtils.isNullToZero(payInsert.getPersonalPensionMoney())),6).compareTo(BigDecimal.ZERO) > 0))) {
						errorMessageList.put(UUID.randomUUID().toString(),new ErrorMessage(infoVo.getRowIndex(), "已存在对应员工身份证" + infoVo.getEmpIdcard()
								+ "的养老缴费数据,请勿重复导入！",infoVo));
						continue;
					}
					batchYlInsertList.put(exitInsertPaymnet, payExists);
				}

				//判断是否存在失业缴费数据
				if (PaymentConstants.COMPANY_UNEMPLOYEEMENT.equals(infoVo.getRiskType()) || PaymentConstants.PENSION_UNEMPLOYEEMENT.equals(infoVo.getRiskType())) {
					//导入模板判重 失业
					exitMoneyPer = infoVo.getEmpIdcard().concat(infoVo.getSocialPayMonth().concat(infoVo.getSocialCreateMonth()).concat(PaymentConstants.PENSION_UNEMPLOYEEMENT));
					exitMoneyCon = infoVo.getEmpIdcard().concat(infoVo.getSocialPayMonth().concat(infoVo.getSocialCreateMonth()).concat(PaymentConstants.COMPANY_UNEMPLOYEEMENT));
					exitInsertPaymnet = infoVo.getEmpIdcard().concat(infoVo.getSocialPayMonth().concat(infoVo.getSocialCreateMonth()).concat(PaymentConstants.UNEMPLOYEEMENT_RISK));
					if (PaymentConstants.COMPANY_UNEMPLOYEEMENT.equals(infoVo.getRiskType())) {
						if (unEmpMoneyMap.get(exitMoneyCon) != null && BigDecimalUtils.safeMultiply(
								BigDecimalUtils.isNullToZero(infoVo.getPaymentMoney())
								, unEmpMoneyMap.get(exitMoneyCon),6).compareTo(BigDecimal.ZERO) > 0) {
							errorMessageList.put(UUID.randomUUID().toString(), new ErrorMessage(infoVo.getRowIndex(), SocialConstants.ERROR_TEMPLATE + "的单位失业缴费数据",infoVo));
							continue;
						} else {
							if (Common.isNotNull(unEmpMoneyMap.get(exitMoneyPer))) {
								payExists.setPersonalUnemploymentMoney(unEmpMoneyMap.get(exitMoneyPer));
							} else {
								payExists.setPersonalUnemploymentMoney(BigDecimal.ZERO);
							}
							payExists.setUnitUnemploymentMoney(infoVo.getPaymentMoney());
							unEmpMoneyMap.put(exitMoneyCon, BigDecimalUtils.isNullToZero(infoVo.getPaymentMoney()));
						}
					} else {
						if (unEmpMoneyMap.get(exitMoneyPer) != null && BigDecimalUtils.safeMultiply(
								BigDecimalUtils.isNullToZero(infoVo.getPaymentMoney())
								, unEmpMoneyMap.get(exitMoneyPer),6).compareTo(BigDecimal.ZERO) > 0) {
							errorMessageList.put(UUID.randomUUID().toString(), new ErrorMessage(infoVo.getRowIndex(), SocialConstants.ERROR_TEMPLATE + "的个人失业缴费数据",infoVo));
							continue;
						} else {
							if (Common.isNotNull(unEmpMoneyMap.get(exitMoneyCon))) {
								payExists.setUnitUnemploymentMoney(unEmpMoneyMap.get(exitMoneyCon));
							} else {
								payExists.setUnitUnemploymentMoney(BigDecimal.ZERO);
							}
							payExists.setPersonalUnemploymentMoney(infoVo.getPaymentMoney());
							unEmpMoneyMap.put(exitMoneyPer, BigDecimalUtils.isNullToZero(infoVo.getPaymentMoney()));
						}
					}
					payExists.setUnitUnemploymentSet(infoVo.getPaymentSet());
					payExists.setUnitSocialSum(Common.isEmpty(payExists.getUnitUnemploymentMoney()) ? BigDecimal.ZERO : payExists.getUnitUnemploymentMoney());
					payExists.setSocialSecurityPersonalSum(Common.isEmpty(payExists.getPersonalUnemploymentMoney()) ? BigDecimal.ZERO : payExists.getPersonalUnemploymentMoney());
					payExists.setSocialSum(BigDecimalUtils.safeAdd(payExists.getUnitSocialSum(), payExists.getPersonalUnemploymentMoney()));
					payExists.setSumAll(payExists.getSocialSum());

					payInsert = paymentInfoUnEmpMap.get(infoVo.getSocialPayAddr()
							+ CommonConstants.DOWN_LINE_STRING
							+ infoVo.getEmpIdcard().trim()
							+ CommonConstants.DOWN_LINE_STRING
							+ infoVo.getSocialPayMonth().trim()
							+ CommonConstants.DOWN_LINE_STRING
							+ infoVo.getSocialCreateMonth().trim()
							+ CommonConstants.DOWN_LINE_STRING
							+ PaymentConstants.UNEMPLOYEEMENT_RISK);
					//存在社保缴费数据
					if (null != payInsert && ((null != payInsert.getSySameFlg() && CommonConstants.ONE_STRING.equals(payInsert.getSySameFlg()))
							|| (BigDecimalUtils.safeMultiply(payExists.getSocialSum(), BigDecimalUtils.safeAdd(
							BigDecimalUtils.isNullToZero(payInsert.getUnitUnemploymentMoney()),
							BigDecimalUtils.isNullToZero(payInsert.getPersonalUnemploymentMoney())),6).compareTo(BigDecimal.ZERO) > 0))) {
						errorMessageList.put(UUID.randomUUID().toString(),new ErrorMessage(infoVo.getRowIndex(), "已存在对应员工身份证" + infoVo.getEmpIdcard()
								+ "的失业缴费数据,请勿重复导入！",infoVo));
						continue;
					}
					batchSyInsertList.put(exitInsertPaymnet, payExists);
				}

				//判断是否存在医疗缴费数据
				if (PaymentConstants.COMPANY_MEDICAL.equals(infoVo.getRiskType()) || PaymentConstants.PENSION_MEDICAL.equals(infoVo.getRiskType())) {
					//导入模板判重医疗
					exitMoneyPer = infoVo.getEmpIdcard().concat(infoVo.getSocialPayMonth().concat(infoVo.getSocialCreateMonth()).concat(PaymentConstants.PENSION_MEDICAL));
					exitMoneyCon = infoVo.getEmpIdcard().concat(infoVo.getSocialPayMonth().concat(infoVo.getSocialCreateMonth()).concat(PaymentConstants.COMPANY_MEDICAL));
					exitInsertPaymnet = infoVo.getEmpIdcard().concat(infoVo.getSocialPayMonth().concat(infoVo.getSocialCreateMonth()).concat(PaymentConstants.MEDICAL));
					if (PaymentConstants.COMPANY_MEDICAL.equals(infoVo.getRiskType())) {
						if (medicalMoneyMap.get(exitMoneyCon) != null && BigDecimalUtils.safeMultiply(
								BigDecimalUtils.isNullToZero(infoVo.getPaymentMoney())
								, medicalMoneyMap.get(exitMoneyCon),6).compareTo(BigDecimal.ZERO) > 0) {
							errorMessageList.put(UUID.randomUUID().toString(), new ErrorMessage(infoVo.getRowIndex(), SocialConstants.ERROR_TEMPLATE + "的单位医疗缴费数据",infoVo));
							continue;
						} else {
							if (Common.isNotNull(medicalMoneyMap.get(exitMoneyPer))) {
								payExists.setPersonalMedicalMoney(medicalMoneyMap.get(exitMoneyPer));
							} else {
								payExists.setPersonalMedicalMoney(BigDecimal.ZERO);
							}
							payExists.setUnitMedicalMoney(infoVo.getPaymentMoney());
							medicalMoneyMap.put(exitMoneyCon, BigDecimalUtils.isNullToZero(infoVo.getPaymentMoney()));
						}
					} else {
						if (medicalMoneyMap.get(exitMoneyPer) != null && BigDecimalUtils.safeMultiply(
								BigDecimalUtils.isNullToZero(infoVo.getPaymentMoney())
								, medicalMoneyMap.get(exitMoneyPer),6).compareTo(BigDecimal.ZERO) > 0) {
							errorMessageList.put(UUID.randomUUID().toString(), new ErrorMessage(infoVo.getRowIndex(), SocialConstants.ERROR_TEMPLATE + "的个人医疗缴费数据",infoVo));
							continue;
						} else {
							if (Common.isNotNull(medicalMoneyMap.get(exitMoneyCon))) {
								payExists.setUnitMedicalMoney(medicalMoneyMap.get(exitMoneyCon));
							} else {
								payExists.setUnitMedicalMoney(BigDecimal.ZERO);
							}
							payExists.setPersonalMedicalMoney(infoVo.getPaymentMoney());
							medicalMoneyMap.put(exitMoneyPer, BigDecimalUtils.isNullToZero(infoVo.getPaymentMoney()));
						}
					}
					payExists.setUnitMedicalSet(infoVo.getPaymentSet());
					payExists.setUnitSocialSum(Common.isEmpty(payExists.getUnitMedicalMoney()) ? BigDecimal.ZERO : payExists.getUnitMedicalMoney());
					payExists.setSocialSecurityPersonalSum(Common.isEmpty(payExists.getPersonalMedicalMoney()) ? BigDecimal.ZERO : payExists.getPersonalMedicalMoney());
					payExists.setSocialSum(BigDecimalUtils.safeAdd(payExists.getUnitSocialSum(), payExists.getSocialSecurityPersonalSum()));
					payExists.setSumAll(payExists.getSocialSum());

					payInsert = paymentInfoMedicalMap.get(infoVo.getSocialPayAddr()
							+ CommonConstants.DOWN_LINE_STRING
							+ infoVo.getEmpIdcard().trim()
							+ CommonConstants.DOWN_LINE_STRING
							+ infoVo.getSocialPayMonth().trim()
							+ CommonConstants.DOWN_LINE_STRING
							+ infoVo.getSocialCreateMonth().trim()
							+ CommonConstants.DOWN_LINE_STRING
							+ PaymentConstants.MEDICAL);
					//存在社保缴费数据
					if (null != payInsert && ((null != payInsert.getYlSameFlg() && CommonConstants.ONE_STRING.equals(payInsert.getYlSameFlg()))
							|| (BigDecimalUtils.safeMultiply(payExists.getSocialSum(), BigDecimalUtils.safeAdd(
							BigDecimalUtils.isNullToZero(payInsert.getUnitMedicalMoney()),
							BigDecimalUtils.isNullToZero(payInsert.getPersonalMedicalMoney())),6).compareTo(BigDecimal.ZERO) > 0))) {
						errorMessageList.put(UUID.randomUUID().toString(),new ErrorMessage(infoVo.getRowIndex(), "已存在对应员工身份证" + infoVo.getEmpIdcard()
								+ "的医疗缴费数据,请勿重复导入！",infoVo));
						continue;
					}
					batchYyInsertList.put(exitInsertPaymnet, payExists);
				}

				//判断是否存在工伤缴费数据
				if (PaymentConstants.INJURY_RISK.equals(infoVo.getRiskType())) {
					//导入模板判重工伤
					exitMoneyCon = infoVo.getEmpIdcard().concat(infoVo.getSocialPayMonth().concat(infoVo.getSocialCreateMonth()).concat(PaymentConstants.INJURY_RISK));
					exitInsertPaymnet = infoVo.getEmpIdcard().concat(infoVo.getSocialPayMonth().concat(infoVo.getSocialCreateMonth()).concat(PaymentConstants.INJURY_RISK));
					if (injuryMoneyMap.get(exitMoneyCon) != null && BigDecimalUtils.safeMultiply(
							BigDecimalUtils.isNullToZero(infoVo.getPaymentMoney())
							, injuryMoneyMap.get(exitMoneyCon),6).compareTo(BigDecimal.ZERO) > 0) {
						errorMessageList.put(UUID.randomUUID().toString(), new ErrorMessage(infoVo.getRowIndex(), SocialConstants.ERROR_TEMPLATE + "的单位工伤缴费数据",infoVo));
						continue;
					} else {
						payExists.setUnitInjuryMoney(infoVo.getPaymentMoney());
						injuryMoneyMap.put(exitMoneyCon, BigDecimalUtils.isNullToZero(infoVo.getPaymentMoney()));
					}
					payExists.setUnitInjurySet(infoVo.getPaymentSet());
					payExists.setUnitSocialSum(Common.isEmpty(payExists.getUnitInjuryMoney()) ? BigDecimal.ZERO : payExists.getUnitInjuryMoney());
					payExists.setSocialSum(BigDecimalUtils.safeAdd(payExists.getUnitSocialSum()));
					payExists.setSumAll(payExists.getSocialSum());

					payInsert = paymentInfoInjuryMap.get(infoVo.getSocialPayAddr()
							+ CommonConstants.DOWN_LINE_STRING
							+ infoVo.getEmpIdcard().trim()
							+ CommonConstants.DOWN_LINE_STRING
							+ infoVo.getSocialPayMonth().trim()
							+ CommonConstants.DOWN_LINE_STRING
							+ infoVo.getSocialCreateMonth().trim()
							+ CommonConstants.DOWN_LINE_STRING
							+ PaymentConstants.INJURY_RISK);
					//存在社保缴费数据
					if (null != payInsert && ((null != payInsert.getGsSameFlg() && CommonConstants.ONE_STRING.equals(payInsert.getGsSameFlg()))
							|| (BigDecimalUtils.safeMultiply(infoVo.getPaymentMoney(),
							BigDecimalUtils.isNullToZero(payInsert.getUnitInjuryMoney()),6).compareTo(BigDecimal.ZERO) > 0))) {
						errorMessageList.put(UUID.randomUUID().toString(),new ErrorMessage(infoVo.getRowIndex(), "已存在对应员工身份证" + infoVo.getEmpIdcard()
								+ "的单位工伤缴费数据,请勿重复导入！",infoVo));
						continue;
					}
					batchGsInsertList.put(exitInsertPaymnet, payExists);
				}

				//判断是否存在大病救助金缴费数据
				if (PaymentConstants.COMPANY_BIG.equals(infoVo.getRiskType()) || PaymentConstants.PENSION_BIG.equals(infoVo.getRiskType())) {
					//导入模板判重大病救助金
					exitMoneyPer = infoVo.getEmpIdcard().concat(infoVo.getSocialPayMonth().concat(infoVo.getSocialCreateMonth()).concat(PaymentConstants.PENSION_BIG));
					exitMoneyCon = infoVo.getEmpIdcard().concat(infoVo.getSocialPayMonth().concat(infoVo.getSocialCreateMonth()).concat(PaymentConstants.COMPANY_BIG));
					exitInsertPaymnet = infoVo.getEmpIdcard().concat(infoVo.getSocialPayMonth().concat(infoVo.getSocialCreateMonth()).concat(PaymentConstants.BIG));
					if (PaymentConstants.COMPANY_BIG.equals(infoVo.getRiskType())) {
						if (bigMoneyMap.get(exitMoneyCon) != null && BigDecimalUtils.safeMultiply(
								BigDecimalUtils.isNullToZero(infoVo.getPaymentMoney())
								, bigMoneyMap.get(exitMoneyCon),6).compareTo(BigDecimal.ZERO) > 0) {
							errorMessageList.put(UUID.randomUUID().toString(), new ErrorMessage(infoVo.getRowIndex(), SocialConstants.ERROR_TEMPLATE + "的单位大病救助金缴费数据",infoVo));
							continue;
						} else {
							if (Common.isNotNull(bigMoneyMap.get(exitMoneyPer))) {
								payExists.setPersonalBigmailmentMoney(bigMoneyMap.get(exitMoneyPer));
							} else {
								payExists.setPersonalBigmailmentMoney(BigDecimal.ZERO);
							}
							payExists.setUnitBigmailmentMoney(infoVo.getPaymentMoney());
							bigMoneyMap.put(exitMoneyCon, BigDecimalUtils.isNullToZero(infoVo.getPaymentMoney()));
						}
					} else {
						if (bigMoneyMap.get(exitMoneyPer) != null && BigDecimalUtils.safeMultiply(
								BigDecimalUtils.isNullToZero(infoVo.getPaymentMoney())
								, bigMoneyMap.get(exitMoneyPer),6).compareTo(BigDecimal.ZERO) > 0) {
							errorMessageList.put(UUID.randomUUID().toString(), new ErrorMessage(infoVo.getRowIndex(), SocialConstants.ERROR_TEMPLATE + "的个人大病救助金缴费数据",infoVo));
							continue;
						} else {
							if (Common.isNotNull(bigMoneyMap.get(exitMoneyCon))) {
								payExists.setUnitBigmailmentMoney(bigMoneyMap.get(exitMoneyCon));
							} else {
								payExists.setUnitBigmailmentMoney(BigDecimal.ZERO);
							}
							payExists.setPersonalBigmailmentMoney(infoVo.getPaymentMoney());
							bigMoneyMap.put(exitMoneyPer, BigDecimalUtils.isNullToZero(infoVo.getPaymentMoney()));
						}
					}
					payExists.setUnitSocialSum(Common.isEmpty(payExists.getUnitBigmailmentMoney()) ? BigDecimal.ZERO : payExists.getUnitBigmailmentMoney());
					payExists.setSocialSecurityPersonalSum(Common.isEmpty(payExists.getPersonalBigmailmentMoney()) ? BigDecimal.ZERO : payExists.getPersonalBigmailmentMoney());
					payExists.setSocialSum(BigDecimalUtils.safeAdd(payExists.getUnitSocialSum(), payExists.getSocialSecurityPersonalSum()));
					payExists.setSumAll(payExists.getSocialSum());

					payInsert = paymentInfoBigMap.get(infoVo.getSocialPayAddr()
							+ CommonConstants.DOWN_LINE_STRING
							+ infoVo.getEmpIdcard().trim()
							+ CommonConstants.DOWN_LINE_STRING
							+ infoVo.getSocialPayMonth().trim()
							+ CommonConstants.DOWN_LINE_STRING
							+ infoVo.getSocialCreateMonth().trim()
							+ CommonConstants.DOWN_LINE_STRING
							+ PaymentConstants.BIG);
					//存在社保缴费数据
					if (null != payInsert && ((null != payInsert.getDbSameFlg() && CommonConstants.ONE_STRING.equals(payInsert.getDbSameFlg()))
							|| (BigDecimalUtils.safeMultiply(payExists.getSocialSum(), BigDecimalUtils.safeAdd(
							BigDecimalUtils.isNullToZero(payInsert.getUnitBigmailmentMoney()),
							BigDecimalUtils.isNullToZero(payInsert.getPersonalBigmailmentMoney())),6).compareTo(BigDecimal.ZERO) > 0))) {
						errorMessageList.put(UUID.randomUUID().toString(),new ErrorMessage(infoVo.getRowIndex(),"已存在对应员工身份证" + infoVo.getEmpIdcard()
								+ "的大病救助金缴费数据,请勿重复导入！",infoVo));
						continue;
					}
					batchBigInsertList.put(exitInsertPaymnet, payExists);
				}

				//判断是否存在生育缴费数据
				if (PaymentConstants.COMPANY_BIRTH.equals(infoVo.getRiskType())) {
					//导入模板判重生育
					exitMoneyCon = infoVo.getEmpIdcard().concat(infoVo.getSocialPayMonth().concat(infoVo.getSocialCreateMonth()).concat(PaymentConstants.COMPANY_BIRTH));
					exitInsertPaymnet = infoVo.getEmpIdcard().concat(infoVo.getSocialPayMonth().concat(infoVo.getSocialCreateMonth()).concat(PaymentConstants.BIRTH));
					if (birthMoneyMap.get(exitMoneyCon) != null && BigDecimalUtils.safeMultiply(
							BigDecimalUtils.isNullToZero(infoVo.getPaymentMoney())
							, birthMoneyMap.get(exitMoneyCon),6).compareTo(BigDecimal.ZERO) > 0) {
						errorMessageList.put(UUID.randomUUID().toString(),new ErrorMessage(infoVo.getRowIndex(), SocialConstants.ERROR_TEMPLATE +
								"的单位生育缴费数据",infoVo));
						continue;
					} else {
						payExists.setUnitBirthMoney(infoVo.getPaymentMoney());
						birthMoneyMap.put(exitMoneyCon, BigDecimalUtils.isNullToZero(infoVo.getPaymentMoney()));
					}
					payExists.setUnitBirthSet(infoVo.getPaymentSet());
					payExists.setUnitSocialSum(Common.isEmpty(payExists.getUnitBirthMoney()) ? BigDecimal.ZERO : payExists.getUnitBirthMoney());
					payExists.setUnitSocialSum(payExists.getUnitBirthMoney());
					payExists.setSocialSum(BigDecimalUtils.safeAdd(payExists.getUnitSocialSum()));
					payExists.setSumAll(payExists.getSocialSum());

					payInsert = paymentInfoBirthMap.get(infoVo.getSocialPayAddr()
							+ CommonConstants.DOWN_LINE_STRING
							+ infoVo.getEmpIdcard().trim()
							+ CommonConstants.DOWN_LINE_STRING
							+ infoVo.getSocialPayMonth().trim()
							+ CommonConstants.DOWN_LINE_STRING
							+ infoVo.getSocialCreateMonth().trim()
							+ CommonConstants.DOWN_LINE_STRING
							+ PaymentConstants.BIRTH);
					//存在社保缴费数据
					if (null != payInsert && ((null != payInsert.getBrSameFlg() && CommonConstants.ONE_STRING.equals(payInsert.getBrSameFlg()))
							|| (BigDecimalUtils.safeMultiply(infoVo.getPaymentMoney(),
							BigDecimalUtils.isNullToZero(payInsert.getUnitBirthMoney()),6).compareTo(BigDecimal.ZERO) > 0))) {
						errorMessageList.put(UUID.randomUUID().toString(),new ErrorMessage(infoVo.getRowIndex(), "已存在对应员工身份证" + infoVo.getEmpIdcard()
								+ "的单位生育缴费数据,请勿重复导入！",infoVo));
						continue;
					}
					batchBirthInsertList.put(exitInsertPaymnet, payExists);
				}
			}
		}
		return errorMessageList;
	}

	/**
	 * 导入校验
	 **/
	private boolean socialThreeCheckBase(ConcurrentHashMap<String, ErrorDetailVO> errorMessageList,
										 TPaymentHeFeiVo infoVo, String type) {
		if (!Common.isNotNull(infoVo.getSocialPayMonth())) {
			errorMessageList.put(UUID.randomUUID().toString(),new ErrorDetailVO(infoVo.getRowIndex(), CommonConstants.ZERO_INT, infoVo.getEmpIdcard(), "", "", infoVo.getEmpName(), "社保缴纳月份不可为空！"));
			return true;
		}
		if (!Common.isNotNull(infoVo.getSocialCreateMonth())) {
			errorMessageList.put(UUID.randomUUID().toString(),new ErrorDetailVO(infoVo.getRowIndex(), CommonConstants.ZERO_INT, infoVo.getEmpIdcard(), "", "", infoVo.getEmpName(), "社保生成月份不可为空！"));
			return true;
		}
		if (!Common.isNotNull(infoVo.getSocialPayAddr())) {
			errorMessageList.put(UUID.randomUUID().toString(),new ErrorDetailVO(infoVo.getRowIndex(), CommonConstants.ZERO_INT, infoVo.getEmpIdcard(), "", "", infoVo.getEmpName(), "社保缴纳地不可为空！"));
			return true;
		}
		if (CommonConstants.ZERO_STRING.equals(type) && !PaymentConstants.PENSION_RISK.equals(infoVo.getRiskType())
				&& !PaymentConstants.UNEMPLOYEEMENT_RISK.equals(infoVo.getRiskType())
				&& !PaymentConstants.INJURY_RISK.equals(infoVo.getRiskType())) {
			errorMessageList.put(UUID.randomUUID().toString(),new ErrorDetailVO(infoVo.getRowIndex(), CommonConstants.ZERO_INT, infoVo.getEmpIdcard(), "", "", infoVo.getEmpName(), "无相关险种！"));
			return true;
		}
		return false;
	}


	/**
	 * 导入校验
	 **/
	private boolean socialThreeCheckBaseTax(ConcurrentHashMap<String, ErrorMessage> errorMessageList,
											TPaymentTaxSocialVo infoVo) {
		if (!Common.isNotNull(infoVo.getSocialPayMonth())) {
			errorMessageList.put(UUID.randomUUID().toString(),new ErrorMessage(infoVo.getRowIndex(), "社保缴纳月份不可为空！",infoVo));
			return true;
		}
		if (!Common.isNotNull(infoVo.getSocialCreateMonth())) {
			errorMessageList.put(UUID.randomUUID().toString(),new ErrorMessage(infoVo.getRowIndex(), "社保生成月份不可为空！",infoVo));
			return true;
		}
		if (!Common.isNotNull(infoVo.getSocialPayAddr())) {
			errorMessageList.put(UUID.randomUUID().toString(),new ErrorMessage(infoVo.getRowIndex(), "社保缴纳地不可为空！",infoVo));
			return true;
		}
		List<String> riskList = Stream.of("职工基本养老保险(单位缴纳)","职工基本养老保险(个人缴纳)","失业保险(单位缴纳)","失业保险(个人缴纳)"
				,"职工基本医疗保险(个人缴纳)","职工基本医疗保险(单位缴纳)","工伤保险","单位大病救助金","个人大病救助金","单位生育").collect(Collectors.toList());
		if (Common.isNotNull(infoVo.getRiskType()) && riskList.stream().noneMatch(e -> e.equals(infoVo.getRiskType()))) {
			errorMessageList.put(UUID.randomUUID().toString(),new ErrorMessage(infoVo.getRowIndex(), "险种填写不正确！",infoVo));
			return true;
		}
		return false;
	}

	/**
	 * 转换缴纳地址为省市县ID
	 **/
	private TPaymentHeFeiVo initAddressThree(String[] areaArray, HashMap<String, String> areaMap2, TPaymentHeFeiVo s) {
		if (null == areaArray || null == areaMap2 || null == s) {
			return s;
		}
		String temp;
		if (areaArray.length >= CommonConstants.TWO_INT) {
			temp = areaMap2.get(areaArray[0] + CommonConstants.DOWN_LINE_STRING + "null");
			if (Common.isNotNull(temp)) {
				s.setSocialProvince(Integer.valueOf(temp));
			}
			temp = areaMap2.get(areaArray[1] + CommonConstants.DOWN_LINE_STRING + (null == s.getSocialProvince()
					? "null" : Integer.toString(s.getSocialProvince())));
			if (Common.isNotNull(temp)) {
				s.setSocialCity(Integer.valueOf(temp));
			}
			if (areaArray.length >= CommonConstants.THREE_INT) {
				temp = areaMap2.get(areaArray[2] + CommonConstants.DOWN_LINE_STRING + (null == s.getSocialCity()
						? "null" : Integer.toString(s.getSocialCity())));
				if (Common.isNotNull(temp)) {
					s.setSocialTown(Integer.valueOf(temp));
				}
			}
		}
		return s;
	}

	/**
	 * 转换缴纳地址为省市县ID
	 **/
	private TPaymentTaxSocialVo initAddressThreeTax(String[] areaArray, HashMap<String, String> areaMap2, TPaymentTaxSocialVo s) {
		if (null == areaArray || null == areaMap2 || null == s) {
			return s;
		}
		String temp;
		if (areaArray.length >= CommonConstants.TWO_INT) {
			temp = areaMap2.get(areaArray[0] + CommonConstants.DOWN_LINE_STRING + "null");
			if (Common.isNotNull(temp)) {
				s.setSocialProvince(Integer.valueOf(temp));
			}
			temp = areaMap2.get(areaArray[1] + CommonConstants.DOWN_LINE_STRING + (null == s.getSocialProvince()
					? "null" : Integer.toString(s.getSocialProvince())));
			if (Common.isNotNull(temp)) {
				s.setSocialCity(Integer.valueOf(temp));
			}
			if (areaArray.length >= CommonConstants.THREE_INT) {
				temp = areaMap2.get(areaArray[2] + CommonConstants.DOWN_LINE_STRING + (null == s.getSocialCity()
						? "null" : Integer.toString(s.getSocialCity())));
				if (Common.isNotNull(temp)) {
					s.setSocialTown(Integer.valueOf(temp));
				}
			}
		}
		return s;
	}

	//比对缴纳地是否一致
	private TSocialFundInfo checkAddress(String[] areaArray, HashMap<String, String> areaMap, TSocialFundInfo s,
										 HashMap<String, String> areaMap2, TPaymentInfoVo infoVo) {
		if (null == areaArray || null == areaMap || null == s) {
			return null;
		}
		String temp;
		if (areaArray.length >= CommonConstants.TWO_INT) {
			temp = areaMap2.get(areaArray[0] + CommonConstants.DOWN_LINE_STRING + "null");
			if (Common.isNotNull(temp)) {
				infoVo.setFundProvince(temp);
			}
			temp = areaMap2.get(areaArray[1] + CommonConstants.DOWN_LINE_STRING + (null == infoVo.getFundProvince()
					? "null" : infoVo.getFundProvince()));
			if (Common.isNotNull(temp)) {
				infoVo.setFundCity(temp);
			}
			if (areaArray.length >= CommonConstants.THREE_INT) {
				temp = areaMap2.get(areaArray[2] + CommonConstants.DOWN_LINE_STRING + (null == infoVo.getFundCity()
						? "null" : infoVo.getFundCity()));
				if (Common.isNotNull(temp)) {
					infoVo.setFundTown(temp);
				}
			}
			if (null != s.getFundProvince()) {
				if (areaArray[0].equals(areaMap.get(s.getFundProvince()))) {
					if (null != s.getFundCity()) {
						if (areaArray[1].equals(areaMap.get(s.getFundCity()))) {
							if (areaArray.length >= CommonConstants.THREE_INT) {
								if (null != s.getFundTown() && areaArray[CommonConstants.TWO_INT].equals(
										areaMap.get(s.getFundTown()))) {
									return s;
								}
							} else {
								if (null == s.getFundTown()) {
									return s;
								}
							}
						}
					} else {
						return null;
					}
				}

			} else {
				return null;
			}

		} else if (areaArray.length == 1) {
			if (null != s.getFundProvince() && null == s.getFundCity()) {
				if (areaArray[0].equals(areaMap.get(s.getFundProvince()))) {
					return s;
				}
			} else {
				return null;
			}
		}
		return null;
	}

	/**
	 * 薪资获取缴费库
	 *
	 * @Author hgw
	 * @Date 2022-8-10 18:06:13
	 **/
	@Override
	public TPaymentVo selectTPaymentBySalaryVo(TPaymentBySalaryVo tPaymentBySalaryVo) {
		List<TPaymentBySalaryVo> list = baseMapper.selectTPaymentBySalaryVo(tPaymentBySalaryVo);
		TPaymentVo vo = new TPaymentVo();
		vo.setPaymentList(list);
		return vo;
	}

	@Override
	public int updatePaymentSocialStatusToSettle(List<String> idList) {
		if (idList != null && !idList.isEmpty()) {
			return baseMapper.updatePaymentSocialStatusByIdList(idList, CommonConstants.ONE_STRING);
		}
		return 0;
	}

	@Override
	public int updatePaymentSocialStatusToNoSettle(List<String> idList) {
		if (idList != null && !idList.isEmpty()) {
			return baseMapper.updatePaymentSocialStatusByIdList(idList, CommonConstants.ZERO_STRING);
		}
		return 0;
	}

	@Override
	public int updatePaymentFundStatusToSettle(List<String> idList) {
		if (idList != null && !idList.isEmpty()) {
			return baseMapper.updatePaymentFundStatusByIdList(idList, CommonConstants.ONE_STRING);
		}
		return 0;
	}

	@Override
	public int updatePaymentFundStatusToNoSettle(List<String> idList) {
		if (idList != null && !idList.isEmpty()) {
			return baseMapper.updatePaymentFundStatusByIdList(idList, CommonConstants.ZERO_STRING);
		}
		return 0;
	}

	@Override
	public void updatePaymentSocialAndFound(UpdateSocialFoundVo infoVo) {
		if (Common.isNotNull(infoVo)) {
			baseMapper.updatePaymentSocialAndFound(infoVo);
		}
	}

	@Override
	public void createPaymentSocialInfo() {
		//获取所有未推送的社保实缴明细数据
		long count = baseMapper.getTPaymentInfoSumPushCount(null);
		if (count > 0) {
			int i = (int) Math.ceil((double) count / CommonConstants.ONE_THOUSAND_INT);
			Map<String, TSettleDomainSelectVo> mapSelectVo = this.getSelectVoMap();
			List<TPaymentInfoPushVo> unPushs = baseMapper.getTPaymentInfoSumPushList(null);
			if (!unPushs.isEmpty()) {
				List<TPaymentInfoPushVo> pushList;
				int k = 0;
				for (int j = 0; j < i; j++) {
					synchronized (this) {
						if (j == i-1) {
							pushList = unPushs.subList(k, unPushs.size());
						} else {
							pushList = unPushs.subList(k, k+1000);
						}
						k = k + 1000;
						if (Common.isNotNull(pushList)) {
							//推送数据封装并推送
							doJointSocialTask.asynchronousEkpPaymentSocial(pushList, mapSelectVo);
						}
					}
				}
			}
		}
	}

	@Override
	public void createPaymentFundInfo() {
		long count = baseMapper.selectCount(Wrappers.<TPaymentInfo>query().lambda()
				.eq(TPaymentInfo::getPushStatus, CommonConstants.ONE_STRING)
				.eq(TPaymentInfo::getLockStatus, CommonConstants.ONE_STRING)
				.isNotNull(TPaymentInfo::getFundId));

		if (count > 0) {
			Map<String, TSettleDomainSelectVo> mapSelectVo = this.getSelectVoMap();
			List<TPaymentInfo> unPushs = baseMapper.getTPaymentFundAllPushInfo();
			int i = (int) Math.ceil((double) count / CommonConstants.ONE_THOUSAND_INT);
			if (!unPushs.isEmpty()) {
				List<TPaymentInfo> pushList;
				int k = 0;
				for (int j = 0; j < i; j++) {
					synchronized (this) {
						if (j == i - 1) {
							pushList = unPushs.subList(k, unPushs.size());
						} else {
							pushList = unPushs.subList(k, k + 1000);
						}
						k = k + 1000;
						if (Common.isNotNull(pushList)) {
							//推送数据封装并推送
							doJointSocialTask.asynchronousEkpPaymentFund(pushList, mapSelectVo);
						}
					}
				}
			}
		}
	}

	@Override
	public R<Boolean> pushPaymentSocialFundInfo(TPaymentInfoSearchVo searchVo) {
		YifuUser user = SecurityUtils.getUser();
		String key = CacheConstants.PAYMENT_SOCIAL_PUSH + CommonConstants.DOWN_LINE_STRING +user.getId() ;
		if (Common.isNotNull(redisUtil.get(key))) {
			return R.failed("用户正在推送实缴数据中，禁止重复推送！");
		} else {
			redisUtil.set(key, user.getId(), 1200L);
		}
		// 获取redis分布式事务锁
		String requestId;
		try {
			requestId = RedisDistributedLock.getLock(key,"10");
		} catch (Exception e) {
			throw new RuntimeException(ResultConstants.NO_GETLOCK_DATA+CommonConstants.DOWN_LINE_STRING+e.getMessage());
		}
		if (Common.isNotNull(requestId)) {
			Map<String, TSettleDomainSelectVo> mapSelectVo = this.getSelectVoMap();
			//手动推送未推送的社保公积金明细数据
			createPaymentSocialInfoReal(user, searchVo, mapSelectVo);
			createPaymentFundInfoReal(user, searchVo, mapSelectVo);
			//推送社保公积金收入数据
			String redisKey = String.valueOf(UUID.randomUUID()).replaceAll("-", "") + "_incomePush";
			createPaymentInfoIncomeReal(user, searchVo, mapSelectVo, redisKey);
			createPaymentFundIncomeReal(user, searchVo, mapSelectVo, redisKey);
			//推送失败的数据重新推送
			if (Common.isNotNull(redisUtil.get(redisKey))) {
				List<TIncome> list = (List<TIncome>) redisUtil.get(redisKey);
				for (TIncome income : list) {
					doJointSocialTask.asynchronousEkpIncomePaymentT(income);
				}
				redisUtil.remove(redisKey);
			}
			redisUtil.remove(key);
			//主动释放锁
			RedisDistributedLock.unlock(key, requestId);
			return R.ok();
		}else {
			return R.failed(ResultConstants.NO_GETLOCK_DATA);
		}
	}

	@Override
	public R<Boolean> batchUpdatePaymentInfo(TPaymentInfoSearchVo searchVo) {
		YifuUser user = SecurityUtils.getUser();
		if (Common.isEmpty(user)) {
			return R.failed("获取登录用户信息失败！");
		}
		searchVo.setCreateBy(user.getId());
		List<String> list = baseMapper.getTPaymentInfoList(searchVo);
		if (Common.isEmpty(list)) {
			return R.failed("未找到本人创建的未标识确认无误的数据");
		} else {
			LambdaUpdateWrapper<TPaymentInfo> updateWrapper = new UpdateWrapper<TPaymentInfo>().lambda();
			updateWrapper.set(TPaymentInfo::getLockStatus, CommonConstants.ONE_STRING).in(TPaymentInfo::getId, list);
			return R.ok(this.update(updateWrapper));
		}
	}

	@Override
	public void createPaymentInfoIncome() {
		long count = baseMapper.selectCount(Wrappers.<TPaymentInfo>query().lambda()
				.eq(TPaymentInfo::getIncomeStatus, CommonConstants.ONE_STRING)
				.eq(TPaymentInfo::getLockStatus, CommonConstants.ONE_STRING)
				.eq(TPaymentInfo::getIsIncomeStatus, CommonConstants.ZERO_STRING)
				.isNotNull(TPaymentInfo::getSocialId));
		if (count > 0) {
			List<TPaymentInfo> sumList;
			int i = (int) Math.ceil((double) count / CommonConstants.TEN_THOUSAND_INT);
			Map<String, TSettleDomainSelectVo> mapSelectVo = this.getSelectVoMap();
			String redisKey = String.valueOf(UUID.randomUUID()).replaceAll("-", "") + "_incomePush";
			for (int j = 0; j < i; j++) {
				//判断缴费库中社保合计和本次导入合计相加是否为0，为0则不生成收入
				sumList = baseMapper.selectList(Wrappers.<TPaymentInfo>query().lambda()
						.eq(TPaymentInfo::getIncomeStatus, CommonConstants.ONE_STRING)
						.eq(TPaymentInfo::getLockStatus, CommonConstants.ONE_STRING)
						.eq(TPaymentInfo::getIsIncomeStatus, CommonConstants.ZERO_STRING)
						.isNotNull(TPaymentInfo::getSocialId).last(" limit 0,10000"));
				synchronized (this) {
					if (Common.isNotNull(sumList)) {
						//生成收入
						createIncomeInfo(sumList, CommonConstants.ONE_STRING, mapSelectVo, redisKey);
					}
				}
			}
			//推送失败的数据重新推送
			if (Common.isNotNull(redisUtil.get(redisKey))) {
				List<TIncome> list = (List<TIncome>) redisUtil.get(redisKey);
				for (TIncome income : list) {
					doJointSocialTask.asynchronousEkpIncomePaymentT(income);
				}
				redisUtil.remove(redisKey);
			}
		}
	}

	@Override
	public void createPaymentFundIncome() {
		long count = baseMapper.selectCount(Wrappers.<TPaymentInfo>query().lambda()
				.eq(TPaymentInfo::getIncomeStatus, CommonConstants.ONE_STRING)
				.eq(TPaymentInfo::getLockStatus, CommonConstants.ONE_STRING)
				.eq(TPaymentInfo::getIsIncomeStatus, CommonConstants.ZERO_STRING)
				.isNotNull(TPaymentInfo::getFundId));
		if (count > 0) {
			List<TPaymentInfo> sumList;
			int i = (int) Math.ceil((double) count / CommonConstants.TEN_THOUSAND_INT);
			Map<String, TSettleDomainSelectVo> mapSelectVo = this.getSelectVoMap();
			String redisKey = String.valueOf(UUID.randomUUID()).replaceAll("-", "") + "_incomePush";
			for (int j = 0; j < i; j++) {
				sumList = baseMapper.selectList(Wrappers.<TPaymentInfo>query().lambda()
						.eq(TPaymentInfo::getIncomeStatus, CommonConstants.ONE_STRING)
						.eq(TPaymentInfo::getLockStatus, CommonConstants.ONE_STRING)
						.eq(TPaymentInfo::getIsIncomeStatus, CommonConstants.ZERO_STRING)
						.isNotNull(TPaymentInfo::getFundId).last(" limit 0,10000"));
				synchronized (this) {
					if (Common.isNotNull(sumList)) {
						//生成公积金收入
						createIncomeInfo(sumList, CommonConstants.TWO_STRING, mapSelectVo, redisKey);
					}
				}
			}
			//推送失败的数据重新推送
			if (Common.isNotNull(redisUtil.get(redisKey))) {
				List<TIncome> list = (List<TIncome>) redisUtil.get(redisKey);
				for (TIncome income : list) {
					doJointSocialTask.asynchronousEkpIncomePaymentT(income);
				}
				redisUtil.remove(redisKey);
			}
		}
	}

	@Override
	public void signPaymentNoIncomeFlag() {
		//标识根据项目不需要生成收入的数据
		long count = baseMapper.selectCount(Wrappers.<TPaymentInfo>query().lambda()
				.eq(TPaymentInfo::getIncomeStatus, CommonConstants.ONE_STRING)
				.eq(TPaymentInfo::getLockStatus, CommonConstants.ONE_STRING));
		if (count > 0) {
			List<TPaymentInfo> unPushInfo;
			int i = (int) Math.ceil((double) count / CommonConstants.TEN_THOUSAND_INT);
			for (int j = 0; j < i; j++) {
				unPushInfo = baseMapper.selectList(Wrappers.<TPaymentInfo>query().lambda()
						.eq(TPaymentInfo::getIncomeStatus, CommonConstants.ONE_STRING)
						.eq(TPaymentInfo::getLockStatus, CommonConstants.ONE_STRING)
						.last(" limit 0,10000"));
				synchronized (this) {
					if (Common.isNotNull(unPushInfo)) {
						//判断是否需要生成收入并标识
						signIncomeFlag(unPushInfo);
					}
				}
			}
		}
	}

	public void createPaymentSocialInfoReal(YifuUser user, TPaymentInfoSearchVo searchVo,
											Map<String, TSettleDomainSelectVo> mapSelectVo) {
		//获取所有未推送的社保实缴明细数据
		searchVo.setCreateBy(user.getId());
		long count = baseMapper.getTPaymentInfoSumPushCount(searchVo);
		if (count > 0) {
			List<TPaymentInfoPushVo> unPushs = baseMapper.getTPaymentInfoSumPushList(searchVo);
			int i = (int) Math.ceil((double) count / CommonConstants.ONE_THOUSAND_INT);
			if (!unPushs.isEmpty()) {
				List<TPaymentInfoPushVo> pushList;
				int k = 0;
				for (int j = 0; j < i; j++) {
					synchronized (this) {
						if (j == i - 1) {
							pushList = unPushs.subList(k, unPushs.size());
						} else {
							pushList = unPushs.subList(k, k + 1000);
						}
						k = k + 1000;
						if (Common.isNotNull(pushList)) {
							//推送数据封装并推送
							doJointSocialTask.asynchronousEkpPaymentSocial(pushList, mapSelectVo);
						}
					}
				}
			}
		}
	}

	public void createPaymentFundInfoReal(YifuUser user, TPaymentInfoSearchVo searchVo,
										  Map<String, TSettleDomainSelectVo> mapSelectVo) {
		//获取所有未推送的公积金实缴明细数据
		searchVo.setLockStatus(CommonConstants.ONE_STRING);
		long count = baseMapper.getTPaymentFundPushCount(searchVo, user.getId());
		if (count > 0) {
			List<TPaymentInfo> unPushs = baseMapper.getTPaymentFundPushInfo(searchVo, user.getId());
			int i = (int) Math.ceil((double) count / CommonConstants.ONE_THOUSAND_INT);
			if (!unPushs.isEmpty()) {
				List<TPaymentInfo> pushList;
				int k = 0;
				for (int j = 0; j < i; j++) {
					synchronized (this) {
						if (j == i - 1) {
							pushList = unPushs.subList(k, unPushs.size());
						} else {
							pushList = unPushs.subList(k, k + 1000);
						}
						k = k + 1000;
						if (Common.isNotNull(pushList)) {
							//推送数据封装并推送
							doJointSocialTask.asynchronousEkpPaymentFund(pushList, mapSelectVo);
						}
					}
				}
			}
		}
	}

	public void createPaymentInfoIncomeReal(YifuUser user, TPaymentInfoSearchVo searchVo,
											Map<String, TSettleDomainSelectVo> mapSelectVo, String redisKey) {
		searchVo.setLockStatus(CommonConstants.ONE_STRING);
		long count = baseMapper.getTPaymentSocialIncomeCount(searchVo, user.getId());
		if (count > 0) {
			List<TPaymentInfo> sumList;
			int i = (int) Math.ceil((double) count / CommonConstants.TEN_THOUSAND_INT);
			for (int j = 0; j < i; j++) {
				sumList = baseMapper.getTPaymentSocialIncomeInfo(searchVo, user.getId());
				if (Common.isNotNull(sumList)) {
					//生成收入
					createIncomeInfo(sumList, CommonConstants.ONE_STRING, mapSelectVo, redisKey);
				}
			}
		}
	}

	public void createPaymentFundIncomeReal(YifuUser user, TPaymentInfoSearchVo searchVo,
											Map<String, TSettleDomainSelectVo> mapSelectVo, String redisKey) {
		searchVo.setLockStatus(CommonConstants.ONE_STRING);
		long count = baseMapper.getTPaymentFundIncomeCount(searchVo, user.getId());
		if (count > 0) {
			List<TPaymentInfo> sumList;
			int i = (int) Math.ceil((double) count / CommonConstants.TEN_THOUSAND_INT);
			for (int j = 0; j < i; j++) {
				sumList = baseMapper.getTPaymentFundIncomeInfo(searchVo, user.getId());
				if (Common.isNotNull(sumList)) {
					//生成公积金收入
					createIncomeInfo(sumList, CommonConstants.TWO_STRING, mapSelectVo, redisKey);
				}
			}
		}
	}

	@Override
	public TPaymentVo getPaymentSocialAndFound(TPaymentInfo info) {
		List<TPaymentInfo> sumList = baseMapper.selectList(Wrappers.<TPaymentInfo>query().lambda()
				.eq(TPaymentInfo::getEmpIdcard, info.getEmpIdcard())
				.eq(TPaymentInfo::getSettleDomainId, info.getSettleDomainId())
				.eq(TPaymentInfo::getSocialCreateMonth, DateUtil.getYearAndMonth(LocalDateTime.now(),0)));
		TPaymentVo paymentVo = new TPaymentVo();
		paymentVo.setPaymentInfoList(sumList);
		return paymentVo;
	}

	public void signIncomeFlag(List<TPaymentInfo> updateList) {
		//获取所有的项目编码
		List<String> deptNoList = updateList.stream().map(TPaymentInfo::getSettleDomainCode).collect(Collectors.toList());
		//获取对应项目信息
		Map<String, TSettleDomain> data = new HashMap<>();
		TSettleDomain settleDomain;
		try {
			R<TSettleDomainListVo> infoByCodes = archivesDaprUtil.getSettleInfoByCodes(deptNoList);
			if (null != infoByCodes && Common.isNotNull(infoByCodes.getData()) && Common.isNotNull(infoByCodes.getData().getMapVO())) {
				data = infoByCodes.getData().getMapVO();
			}
			if (Common.isNotNull(data)) {
				for (TPaymentInfo paymentInfo : updateList) {
					settleDomain = data.get(paymentInfo.getSettleDomainCode());
					boolean isIncomeFlag = false;
					if (Common.isNotNull(settleDomain)) {
						if (Common.isNotNull(settleDomain.getManageServerItem()) && ((settleDomain.getManageServerItem().contains(CommonConstants.ONE_STRING)
								&& Common.isNotNull(paymentInfo.getSocialId())) || (settleDomain.getManageServerItem().contains(CommonConstants.TWO_STRING)
								&& Common.isNotNull(paymentInfo.getFundId()))) && CommonConstants.ZERO_STRING.equals(settleDomain.getManagementTag()) &&
								CommonConstants.TWO_STRING.equals(settleDomain.getMrSettleType())) {
							//实缴模式
							isIncomeFlag = true;
						}
						if (Common.isNotNull(settleDomain.getRiskServerItem()) && ((settleDomain.getRiskServerItem().contains(CommonConstants.ONE_STRING)
								&& Common.isNotNull(paymentInfo.getSocialId())) || (settleDomain.getRiskServerItem().contains(CommonConstants.TWO_STRING)
								&& Common.isNotNull(paymentInfo.getFundId()))) && CommonConstants.ZERO_STRING.equals(settleDomain.getRiskFundTag()) &&
								CommonConstants.TWO_STRING.equals(settleDomain.getMrSettleType())) {
							//实缴模式
							isIncomeFlag = true;
						}
					}
					if (!isIncomeFlag) {
						baseMapper.updateBySocialIncomeFlag(paymentInfo.getId());
					}
				}
			}
		} catch (Exception e) {
			log.error("标识是否需要生成收入异常", e);
		}
	}

	public void createIncomeInfo(List<TPaymentInfo> updateList, String socialFundFlag,
								 Map<String, TSettleDomainSelectVo> mapSelectVo, String redisKey) {
		List<TIncomeDetail> exitIncome;
		TSettleDomain settleDomain;
		try {
			for (TPaymentInfo paymentInfo : updateList) {
				boolean exitFlag = false;
				if (CommonConstants.ONE_STRING.equals(socialFundFlag)) {
					exitIncome = detailMapper.selectList(Wrappers.<TIncomeDetail>query().lambda()
							.eq(TIncomeDetail::getEmpIdcard, paymentInfo.getEmpIdcard())
							.eq(TIncomeDetail::getPayMonth, paymentInfo.getSocialPayMonth())
							.eq(TIncomeDetail::getDeptId, paymentInfo.getSettleDomainId())
							.eq(TIncomeDetail::getSourceType, CommonConstants.ONE_STRING));
				} else {
					exitIncome = detailMapper.selectList(Wrappers.<TIncomeDetail>query().lambda()
							.eq(TIncomeDetail::getEmpIdcard, paymentInfo.getEmpIdcard())
							.eq(TIncomeDetail::getPayMonth, paymentInfo.getProvidentPayMonth())
							.eq(TIncomeDetail::getDeptId, paymentInfo.getSettleDomainId())
							.eq(TIncomeDetail::getSourceType, CommonConstants.TWO_STRING));
				}
				if (Common.isNotNull(exitIncome)) {
					BigDecimal sumMoney = BigDecimal.ZERO;
					for (TIncomeDetail income : exitIncome) {
						sumMoney = BigDecimalUtils.safeAdd(income.getMoney(), sumMoney);
						if (paymentInfo.getId().equals(income.getSourceId())) {
							exitFlag = true;
						}
					}
					if (exitFlag) {
						baseMapper.updateBySocialIncomeFlag(paymentInfo.getId());
						continue;
					}
					if (sumMoney.compareTo(BigDecimal.ZERO) > 0) {
						exitFlag = true;
					}
				}

				//获取项目信息
				if (Common.isNotNull(mapSelectVo)) {
					settleDomain = mapSelectVo.get(paymentInfo.getSettleDomainCode());
				} else {
					settleDomain = null;
				}

				int isSum = 0;
				if (Common.isNotNull(settleDomain)) {
					boolean isIncomeFlag = false;
					// 含有社保，则计算收入
					if (Common.isNotNull(settleDomain.getManageServerItem()) && ((settleDomain.getManageServerItem().contains(CommonConstants.ONE_STRING)
							&& CommonConstants.ONE_STRING.equals(socialFundFlag)) || (settleDomain.getManageServerItem().contains(CommonConstants.TWO_STRING)
							&& CommonConstants.TWO_STRING.equals(socialFundFlag))) && CommonConstants.ZERO_STRING.equals(settleDomain.getManagementTag())
							&& CommonConstants.TWO_STRING.equals(settleDomain.getMrSettleType())) {
						//实缴模式
						BigDecimal gMoney;
						if (CommonConstants.TWO_STRING.equals(settleDomain.getManagementType())) {
							gMoney = settleDomain.getManagementFee();
						} else if (CommonConstants.THREE_STRING.equals(settleDomain.getManagementType())) {
							gMoney = settleDomain.getManagementFee();
						} else {
							isSum = 1;
							if (CommonConstants.ONE_STRING.equals(socialFundFlag)) {
								gMoney = BigDecimalUtils.safeMultiply(paymentInfo.getSocialSum(),
										settleDomain.getManagementFee().divide(new BigDecimal("100"),
												CommonConstants.FIVE_INT, RoundingMode.HALF_UP));
							} else {
								gMoney = BigDecimalUtils.safeMultiply(paymentInfo.getProvidentSum(),
										settleDomain.getManagementFee().divide(new BigDecimal("100"),
												CommonConstants.FIVE_INT, RoundingMode.HALF_UP));
							}
						}
						if (!exitFlag || isSum == 1) {
							isIncomeFlag = true;
							createIncomeInsurance(paymentInfo, settleDomain, CommonConstants.ONE_STRING,
									settleDomain.getManagementFee().toString(), settleDomain.getManagementType(),
									gMoney, socialFundFlag, redisKey);
						}
					}
					if (Common.isNotNull(settleDomain.getRiskServerItem()) && ((settleDomain.getRiskServerItem().contains(CommonConstants.ONE_STRING)
							&& CommonConstants.ONE_STRING.equals(socialFundFlag)) || (settleDomain.getRiskServerItem().contains(CommonConstants.TWO_STRING)
							&& CommonConstants.TWO_STRING.equals(socialFundFlag))) && CommonConstants.ZERO_STRING.equals(settleDomain.getRiskFundTag())
							&& CommonConstants.TWO_STRING.equals(settleDomain.getMrSettleType())) {
						//实缴模式
						BigDecimal money;
						if (CommonConstants.TWO_STRING.equals(settleDomain.getRiskFundType())) {
							money = settleDomain.getRiskFundFee();
						} else if (CommonConstants.THREE_STRING.equals(settleDomain.getRiskFundType())) {
							money = settleDomain.getRiskFundFee();
						} else {
							isSum = 2;
							if (CommonConstants.ONE_STRING.equals(socialFundFlag)) {
								money = BigDecimalUtils.safeMultiply(paymentInfo.getSocialSum(),
										settleDomain.getRiskFundFee().divide(new BigDecimal("100"),
												CommonConstants.FIVE_INT, RoundingMode.HALF_UP));
							} else {
								money = BigDecimalUtils.safeMultiply(paymentInfo.getProvidentSum(),
										settleDomain.getRiskFundFee().divide(new BigDecimal("100"),
												CommonConstants.FIVE_INT, RoundingMode.HALF_UP));
							}
						}
						if (!exitFlag || isSum == 2) {
							isIncomeFlag = true;
							createIncomeInsurance(paymentInfo, settleDomain, CommonConstants.TWO_STRING,
									settleDomain.getRiskFundFee().toString(), settleDomain.getRiskFundType(),
									money, socialFundFlag, redisKey);
						}
					}
					if (!isIncomeFlag) {
						baseMapper.updateBySocialIncomeFlag(paymentInfo.getId());
					}
				}
			}
		} catch (Exception e) {
			log.error("生成社保收入异常", e);
		}
	}

	public void createIncomeInsurance(TPaymentInfo library, TSettleDomain settleDomain, String feeType,
									  String charges, String feeMode, BigDecimal money, String sourceType,
									  String redisKey) {
		//生成收入数据
		TIncomeDetail detail = new TIncomeDetail();
		detail.setCreateTime(DateUtil.getCurrentDateTime());
		detail.setRedisKey(redisKey);
		detail.setDeptName(settleDomain.getDepartName());
		detail.setDeptNo(settleDomain.getDepartNo());
		detail.setDeptId(settleDomain.getId());
		detail.setEmpIdcard(library.getEmpIdcard());
		detail.setEmpName(library.getEmpName());
		detail.setUnitNo(settleDomain.getCustomerNo());
		detail.setUnitId(settleDomain.getCustomerId());
		detail.setUnitName(settleDomain.getCustomerName());
		detail.setDataCreateMonth(DateUtil.addMonth(0));
		detail.setSourceId(library.getId());
		detail.setSourceType(sourceType);
		if (CommonConstants.ONE_STRING.equals(sourceType)) {
			detail.setCreateMonth(library.getSocialCreateMonth());
			detail.setPayMonth(library.getSocialPayMonth());
		} else {
			detail.setCreateMonth(library.getProvidentCreateMonth());
			detail.setPayMonth(library.getProvidentPayMonth());
		}
		detail.setMoney(money);
		detail.setFeeType(feeType);
		detail.setFeeMode(feeMode);
		detail.setCharges(charges);
		detail.setMrSettleType(settleDomain.getMrSettleType());
		detail.setId(CommonConstants.NULL);
		detail.setRedData(CommonConstants.ZERO_STRING);
		incomeService.saveBathDetail(detail, library.getId());
	}

	/**
	 * @param changeDeptVo 变更主体数据
	 * @Description: 费用划转-ekp同步hro
	 * @Author: hgw
	 * @Date: 2022/11/16 10:39
	 * @return: com.yifu.cloud.plus.v1.yifu.common.core.util.R<java.lang.String>
	 **/
	@Override
	public R<String> changeDeptByEkp(ChangeDeptVo changeDeptVo) {
		// 获取项目信息：
		TSettleDomainSelectVo dept = archivesDaprUtil.selectDeptByNo(changeDeptVo.getNowProjectno());
		if (dept != null && dept.getId() != null) {
			changeDeptVo.setDept(dept);
			// 变更数据的主键id
			Set<String> idSet;

			// 存储日志使用的
			StringBuilder socialId = new StringBuilder();
			StringBuilder fundId = new StringBuilder();
			StringBuilder manageId = new StringBuilder();
			StringBuilder riskId = new StringBuilder();
			StringBuilder insuranceId = new StringBuilder();
			// 如果选择了社保公积金信息要划转，则校验。
			// 否则跳过这一步，直接划转
			if ((changeDeptVo.getShebao() != null && !changeDeptVo.getShebao().isEmpty())
					|| (changeDeptVo.getGongjijin() != null && !changeDeptVo.getGongjijin().isEmpty())) {
				idSet = new HashSet<>();
				TPaymentSocialPush socialPush;
				if (changeDeptVo.getShebao() != null && !changeDeptVo.getShebao().isEmpty()) {
					for (ChangeDeptDetailVo vo : changeDeptVo.getShebao()) {
						socialPush = pushMapper.selectById(vo.getId());
						//根据明细id更新结算状态
						if (null != socialPush) {
							List<String> idStr = Common.initStrToList(socialPush.getPaymentIds().replaceAll("'",""),",");
							if (null != idStr) {
								idSet.addAll(idStr);
								for (String s :idStr) {
									socialId.append(s).append(CommonConstants.DUNHAO_STRING);
								}
							}
						} else {
							idSet.add(vo.getId());
							socialId.append(vo.getId()).append(CommonConstants.DUNHAO_STRING);
						}
					}
				}
				if (changeDeptVo.getGongjijin() != null && !changeDeptVo.getGongjijin().isEmpty()) {
					for (ChangeDeptDetailVo vo : changeDeptVo.getGongjijin()) {
						idSet.add(vo.getId());
						fundId.append(vo.getId()).append(CommonConstants.DUNHAO_STRING);
					}
				}
				if (!idSet.isEmpty()) {
						// 查询是否允许划转缴费库、预估库 的 社保、公积金
					List<String> settleList = baseMapper.checkPaymentChange(idSet);
					if (settleList.isEmpty()) {
						settleList = tForecastLibraryMapper.checkForecastChange(idSet);
					}
					if (!settleList.isEmpty()) {
						String idStr = Common.ListToStr(settleList,",");
						return R.failed(idStr + "的社保公积金已被结算，请先退回并删除工资表！");
					}

					// 1划转缴费率、预估库的项目（社保公积金）
					baseMapper.changePaymentDept(idSet, dept);
					tForecastLibraryMapper.changeForecastDept(idSet, dept);
				}
			}

			// 2划转管理费、风险金
			if ((changeDeptVo.getGuanlifei() != null && !changeDeptVo.getGuanlifei().isEmpty())
					|| (changeDeptVo.getFenxianjin() != null && !changeDeptVo.getFenxianjin().isEmpty())) {
				idSet = new HashSet<>();
				if (changeDeptVo.getGuanlifei() != null && !changeDeptVo.getGuanlifei().isEmpty()) {
					for (ChangeDeptDetailVo vo : changeDeptVo.getGuanlifei()) {
						idSet.add(vo.getId());
						manageId.append(vo.getId()).append(CommonConstants.DUNHAO_STRING);
					}
				}
				if (changeDeptVo.getFenxianjin() != null && !changeDeptVo.getFenxianjin().isEmpty()) {
					for (ChangeDeptDetailVo vo : changeDeptVo.getFenxianjin()) {
						idSet.add(vo.getId());
						riskId.append(vo.getId()).append(CommonConstants.DUNHAO_STRING);
					}
				}
				if (!idSet.isEmpty()) {
					incomeService.changeIncomeAndDetailDept(idSet, dept);
				}
			}
			// 3划转商险
			if (changeDeptVo.getShangxian() != null && !changeDeptVo.getShangxian().isEmpty()) {
				idSet = new HashSet<>();
				for (ChangeDeptDetailVo vo : changeDeptVo.getShangxian()) {
					idSet.add(vo.getId());
					insuranceId.append(vo.getId()).append(CommonConstants.DUNHAO_STRING);
				}
				if (!idSet.isEmpty()) {
					insuranceDaprUtil.ekpUpdateInsuranceDept(changeDeptVo);
				}
			}

			// 4 记录日志
			TEkpChangeDeptLog log = new TEkpChangeDeptLog();
			log.setCreateName(changeDeptVo.getCreator());
			log.setCreateTime(new Date());
			log.setPreDeptName(changeDeptVo.getPreProjectname());
			log.setPreDeptNo(changeDeptVo.getPreProjectno());
			log.setNewDeptName(changeDeptVo.getNowProjectname());
			log.setNewDeptNo(changeDeptVo.getNowProjectno());
			log.setTransferType(changeDeptVo.getTransferType());
			log.setSocialId(socialId.toString());
			log.setFundId(fundId.toString());
			log.setManageId(manageId.toString());
			log.setRiskId(riskId.toString());
			log.setInsuranceId(insuranceId.toString());
			// 4记录费用划转日志
			tEkpChangeDeptLogService.save(log);
			return R.ok();
		} else {
			return R.failed("根据新编码未获取到项目信息");
		}
	}

	@Override
	public Boolean updateSocialSettleStatus(List<EkpSocialViewVo> viewVoList) {
		if (!viewVoList.isEmpty()) {
			TForecastLibrary library;
			TPaymentSocialPush socialPush;
			TPaymentInfo paymentInfo;
			try {
				for (EkpSocialViewVo viewVo : viewVoList) {
					//判断预估还是实缴
					if (viewVo.getSettleFlag().contains(SocialConstants.DIFF_TYPE_THR)) {
						socialPush = pushMapper.selectById(viewVo.getId());
						//根据明细id更新结算状态
						if (null != socialPush) {
							List<TPaymentInfo> paymentList = baseMapper.getAllPushInfoById(socialPush.getPaymentIds());
							if (!paymentList.isEmpty()) {
								for (TPaymentInfo tPaymentInfo : paymentList) {
									//判断是收入还是支出结算单号
									if (CommonConstants.ZERO_STRING.equals(viewVo.getPayFlag())) {
										tPaymentInfo.setIncomeSettleFlag(viewVo.getIncomeSettleFlag());
										tPaymentInfo.setIncomeCollectFlag(viewVo.getIncomeCollectFlag());
										baseMapper.updateStatusById(tPaymentInfo);
									} else {
										tPaymentInfo.setPaySettleFlag(CommonConstants.ZERO_STRING);
										tPaymentInfo.setPayCollectFlag(viewVo.getPayCollectFlag());
										baseMapper.updateStatusById(tPaymentInfo);

									}
									log.info("缴费库实缴费用状态更新");
								}
							}
						} else {
							//根据明细id更新结算状态
							paymentInfo = baseMapper.selectById(viewVo.getId());
							if (Common.isNotNull(paymentInfo)) {
								//判断是收入还是支出结算单号
								if (CommonConstants.ZERO_STRING.equals(viewVo.getPayFlag())) {
									paymentInfo.setIncomeSettleFlag(viewVo.getIncomeSettleFlag());
									paymentInfo.setIncomeCollectFlag(viewVo.getIncomeCollectFlag());
								} else {
									paymentInfo.setPaySettleFlag(CommonConstants.ZERO_STRING);
									paymentInfo.setPayCollectFlag(viewVo.getPayCollectFlag());
								}
								baseMapper.updateStatusById(paymentInfo);
								log.info("缴费库实缴费用状态更新");
							}
						}
					} else if (viewVo.getSettleFlag().contains(SocialConstants.DIFF_TYPE_ONE)) {
						//根据明细id更新结算状态
						library = tForecastLibraryMapper.selectById(viewVo.getId());
						if (Common.isNotNull(library)) {
							//判断是收入还是支出结算单号
							if (CommonConstants.ZERO_STRING.equals(viewVo.getPayFlag())) {
								library.setIncomeSettleFlag(viewVo.getIncomeSettleFlag());
								library.setIncomeCollectFlag(viewVo.getIncomeCollectFlag());
							} else {
								library.setPaySettleFlag(CommonConstants.ZERO_STRING);
								library.setPayCollectFlag(viewVo.getPayCollectFlag());
							}
							tForecastLibraryMapper.updateForecastStatusById(library);
						}
					}
				}
			} catch (Exception e) {
				log.error("更新社保结算状态失败", e);
				return false;
			}
		}
		return true;
	}

	private Map<String, TSettleDomainSelectVo> getSelectVoMap() {
		R<TSettleDomainListVo> settleDomainR = archivesDaprUtil.selectAllSettleDomainSelectVos();
		Map<String,TSettleDomainSelectVo> mapSelectVo = null;
		if (Common.isNotNull(settleDomainR) && Common.isNotNull(settleDomainR.getData())){
			mapSelectVo = settleDomainR.getData().getMapSelectVo();
		}
		if (Common.isEmpty(mapSelectVo)){
			ServiceUtil.runTimeExceptionDiy(CommonConstants.SETTLE_DOMAIN_GET_ERROR);
		}
		return mapSelectVo;
	}

	// hgw2023-1-6 10:44:00以下：B端相关接口
	/**
	 * 按年查询指定人的缴费库数据
	 * @Author fxj
	 * @Date 2020-08-25
	 * @param year
	 * @param empId
	 **/
	@Override
	public List<PaymentBusinessPageVo> getPaymentByYearAndEmpId(String year, String empId) {
		List<PaymentBusinessPageVo> voList =  new ArrayList<>();
		TPaymentInfo paymentInfo = new TPaymentInfo();
		paymentInfo.setEmpId(empId);
		paymentInfo.setLikeYear(year);
		getPaymentBusinessPagesVoList(voList, paymentInfo,null, null);
		//排序
		paymentBusinessVosortByMonth(voList);
		return voList;
	}
	/**
	 * 缴费月份倒序
	 * @Author pwang
	 * @Date 2020-09-18 10:41
	 * @param list
	 * @return
	 **/
	private void paymentBusinessVosortByMonth(List<PaymentBusinessPageVo> list){
		Collections.sort(list, new Comparator<PaymentBusinessPageVo>() {
			@Override
			public int compare(PaymentBusinessPageVo o1, PaymentBusinessPageVo o2) {
				return o2.getMonth().compareTo(o1.getMonth());
			}
		});
	}

	private void getPaymentBusinessPagesVoList(List<PaymentBusinessPageVo> voList, TPaymentInfo paymentInfo
			, List<String> settleDomainIds, List<String> empIds) {
		List<TPaymentInfoVo> paymentAllInfoVoList =  baseMapper.getPaymentAllInfoList(paymentInfo, settleDomainIds
				, null,empIds);
		HashMap<String,PaymentBusinessPageVo> pageVoHashMap = new HashMap<>();
		if (Common.isNotNull(paymentAllInfoVoList)){
			PaymentBusinessPageVo pageVo;
			String payMonth;
			for (TPaymentInfoVo infoVo:paymentAllInfoVoList){
				payMonth = infoVo.getSocialPayMonth();
				if (Common.isEmpty(payMonth)) {
					payMonth = infoVo.getProvidentPayMonth();
				}
				if (Common.isNotNull(payMonth)){
					pageVo = pageVoHashMap.get(payMonth);
					if (null == pageVo){
						pageVo = new PaymentBusinessPageVo();
					}
					pageVo.setMonth(payMonth);
					// 处理合计
					initPaymentSum(pageVo,false, infoVo);
					pageVoHashMap.put(payMonth,pageVo);
				}
			}
		}
		if (Common.isNotNull(pageVoHashMap)){
			voList.addAll(sortValues(pageVoHashMap));
		}
	}

	private Collection sortValues(HashMap<String,PaymentBusinessPageVo> pageVoHashMap){
		List<PaymentBusinessPageVo>  temp  = new ArrayList<>();
		if (!pageVoHashMap.isEmpty()){
			Set set = pageVoHashMap.keySet();
			Object[] arr = set.toArray();
			Arrays.sort(arr);
			for (int i=arr.length-1;i>=0;i--) {
				temp.add(pageVoHashMap.get(arr[i]));
			}
		}
		return  temp;
	}

	/**
	 * 按年月查询指定人的缴费库数据：年月格式 YYYYMM
	 * @Author fxj
	 * @Date 2020-08-25
	 * @param month
	 * @param empId
	 **/
	@Override
	public PaymentBusinessPageVo getPaymentByMonthAndEmpId(String month, String empId) {
		TPaymentInfo paymentInfo = new TPaymentInfo();
		paymentInfo.setEmpId(empId);
		paymentInfo.setSocialPayMonth(month);
		PaymentBusinessPageVo pageVo = getPaymentBusinessPageVo(paymentInfo);
		return pageVo;
	}

	private PaymentBusinessPageVo getPaymentBusinessPageVo(TPaymentInfo paymentInfo) {
		List<TPaymentInfoVo> paymentAllInfoVoList =  baseMapper.getPaymentAllInfoList(paymentInfo, null, null, null);
		PaymentBusinessPageVo pageVo = new PaymentBusinessPageVo();
		if (Common.isNotNull(paymentAllInfoVoList)){
			boolean isRefund;
			boolean isSocial;
			boolean  isInjury;
			for (TPaymentInfoVo infoVo:paymentAllInfoVoList){
				if (Common.isNotNull(infoVo.getSocialPayMonth())){
					pageVo.setMonth(infoVo.getSocialPayMonth());
				} else {
					pageVo.setMonth(infoVo.getProvidentPayMonth());
				}
				pageVo.setEmpId(infoVo.getEmpId());
				// 处理退费
				isRefund = null != infoVo.getSumAll() && infoVo.getSumAll().compareTo(BigDecimal.ZERO)  < CommonConstants.ZERO_INT;
				handleRefundMoney(pageVo, isRefund, infoVo);
				// 处理合计
				initPaymentSum(pageVo, isRefund, infoVo);
				// 处理各种金额比例数据  单位养老大于零默认为派单基数
				isSocial = (null != infoVo.getUnitPensionMoney() && infoVo.getUnitPensionMoney().compareTo(BigDecimal.ZERO) > CommonConstants.ZERO_INT)
						|| (null != infoVo.getUnitMedicalMoney() && infoVo.getUnitMedicalMoney().compareTo(BigDecimal.ZERO) > CommonConstants.ZERO_INT)
						|| (null != infoVo.getUnitUnemploymentMoney() && infoVo.getUnitUnemploymentMoney().compareTo(BigDecimal.ZERO) > CommonConstants.ZERO_INT)
						|| (null != infoVo.getUnitBirthMoney() && infoVo.getUnitBirthMoney().compareTo(BigDecimal.ZERO) > CommonConstants.ZERO_INT);
				// 非兼职工伤 非退费 处理
				handleSocialAndRefundMoney(pageVo, isRefund, isSocial, infoVo);
				// 处理兼职工伤数据
				isInjury = BigDecimalUtils.safeAdd(infoVo.getUnitPensionMoney(),infoVo.getUnitMedicalMoney(),infoVo.getUnitUnemploymentMoney(),infoVo.getUnitBirthMoney()).compareTo(BigDecimal.ZERO) == 0
						&& null != infoVo.getUnitInjuryMoney()
						&& infoVo.getUnitInjuryMoney().compareTo(BigDecimal.ZERO) > 0;
				// 处理 公积金和 非兼职工伤的退费数据
				handleSocialAndInjuryMoney(pageVo, isRefund, isInjury, infoVo);
			}
		}
		return pageVo;
	}
	/**
	 * 处理社保和退费金额
	 * @Author fxj
	 * @Date 2020-08-31
	 * @param pageVo
	 * @param isRefund
	 * @param isSocial
	 * @param infoVo
	 * @return
	 **/
	private void handleSocialAndRefundMoney(PaymentBusinessPageVo pageVo, boolean isRefund, boolean isSocial, TPaymentInfoVo infoVo) {
		if (isSocial && !isRefund){
			pageVo.setPersonalPensionSet(infoVo.getUnitPensionSet());
			pageVo.setPersonalMedicalSet(infoVo.getUnitMedicalSet());
			pageVo.setPersonalUnemploymentSet(infoVo.getUnitUnemploymentSet());
			pageVo.setUnitPensionSet(infoVo.getUnitPensionSet());
			pageVo.setUnitMedicalSet(infoVo.getUnitMedicalSet());
			pageVo.setUnitInjurySet(infoVo.getUnitInjurySet());
			pageVo.setUnitUnemploymentSet(infoVo.getUnitUnemploymentSet());
			pageVo.setUnitBirthSet(infoVo.getUnitBirthSet());
			pageVo.setPersonalPensionPer(infoVo.getPersonalPensionPer());
			pageVo.setPersonalMedicalPer(infoVo.getPersonalMedicalPer());
			pageVo.setPersonalUnemploymentPer(infoVo.getPersonalUnemploymentPer());
			pageVo.setUnitPensionPer(infoVo.getUnitPensionPer());
			pageVo.setUnitMedicalPer(infoVo.getUnitMedicalPer());
			pageVo.setUnitInjuryPer(infoVo.getUnitInjuryPer());
			pageVo.setUnitUnemploymentPer(infoVo.getUnitUnemploymentPer());
			pageVo.setUnitBirthPer(infoVo.getUnitBirthPer());
		}
	}
	/**
	 * 处理退费金额
	 * @Author fxj
	 * @Date 2020-08-31
	 * @param pageVo
	 * @param isRefund
	 * @param infoVo
	 * @return
	 **/
	private void handleRefundMoney(PaymentBusinessPageVo pageVo, boolean isRefund, TPaymentInfoVo infoVo) {
		if (isRefund){
			pageVo.setPersonalRefund(BigDecimalUtils.safeAdd(pageVo.getPersonalRefund(),
					infoVo.getPersonalPensionMoney(),
					infoVo.getPersonalMedicalMoney(),
					infoVo.getPersonalUnemploymentMoney(),
					infoVo.getPersonalBigmailmentMoney(),
					infoVo.getPersonalProvidentSum()));
			pageVo.setUnitRefund(BigDecimalUtils.safeAdd(pageVo.getUnitRefund(),
					infoVo.getUnitPensionMoney(),
					infoVo.getUnitMedicalMoney(),
					infoVo.getUnitInjuryMoney(),
					infoVo.getUnitBirthMoney(),
					infoVo.getUnitUnemploymentMoney(),
					infoVo.getUnitBigmailmentMoney(),
					infoVo.getUnitProvidentSum()));
		}
	}

	/**
	 * 处理兼职工伤金额
	 * @Author fxj
	 * @Date 2020-08-31
	 * @param pageVo
	 * @param isRefund
	 * @param isInjury
	 * @param infoVo
	 * @return
	 **/
	private void handleSocialAndInjuryMoney(PaymentBusinessPageVo pageVo, boolean isRefund, boolean isInjury, TPaymentInfoVo infoVo) {
		if (isInjury){
			pageVo.setInjuryAloneSet(infoVo.getUnitInjurySet());
			pageVo.setInjuryAloneMoney(BigDecimalUtils.safeAdd(pageVo.getInjuryAloneMoney(),infoVo.getUnitInjuryMoney()));
			pageVo.setInjuryAlonePer(infoVo.getUnitInjuryPer());
		}
		// 处理公积金
		if (null != infoVo.getProvidentPercent()){
			pageVo.setProvidentPercent(infoVo.getProvidentPercent());
		}
		if (null != infoVo.getUnitProvidentSet()){
			pageVo.setPersonalProidentSet(infoVo.getUnitProvidentSet());
			pageVo.setUnitProvidentSet(infoVo.getUnitProvidentSet());
		}
		// 处理非兼职工伤非退费数据
		if (!isInjury && !isRefund){
			pageVo.setPersonalPensionMoney(BigDecimalUtils.safeAdd(pageVo.getPersonalPensionMoney(),infoVo.getPersonalPensionMoney()));
			pageVo.setPersonalMedicalMoney(BigDecimalUtils.safeAdd(pageVo.getPersonalMedicalMoney(),infoVo.getPersonalMedicalMoney()));
			pageVo.setPersonalUnemploymentMoney(BigDecimalUtils.safeAdd(pageVo.getPersonalUnemploymentMoney(),infoVo.getPersonalUnemploymentMoney()));
			pageVo.setPersonalBigmailmentMoney(BigDecimalUtils.safeAdd(pageVo.getPersonalBigmailmentMoney(),infoVo.getPersonalBigmailmentMoney()));
			pageVo.setUnitPensionMoney(BigDecimalUtils.safeAdd(pageVo.getUnitPensionMoney(),infoVo.getUnitPensionMoney()));
			pageVo.setUnitMedicalMoney(BigDecimalUtils.safeAdd(pageVo.getUnitMedicalMoney(),infoVo.getUnitMedicalMoney()));
			pageVo.setUnitInjuryMoney(BigDecimalUtils.safeAdd(pageVo.getUnitInjuryMoney(),infoVo.getUnitInjuryMoney()));
			pageVo.setUnitBirthMoney(BigDecimalUtils.safeAdd(pageVo.getUnitBirthMoney(),infoVo.getUnitBirthMoney()));
			pageVo.setUnitUnemploymentMoney(BigDecimalUtils.safeAdd(pageVo.getUnitUnemploymentMoney(),infoVo.getUnitUnemploymentMoney()));
			pageVo.setUnitBigmailmentMoney(BigDecimalUtils.safeAdd(pageVo.getUnitBigmailmentMoney(),infoVo.getUnitBigmailmentMoney()));

		}
	}

	/**
	 * 合计缴费库对应数据
	 * @Author fxj
	 * @Date 2020-08-25
	 * @param pageVo
	 * @param infoVo
	 * @return
	 **/
	private void initPaymentSum(PaymentBusinessPageVo pageVo,boolean isRefund, TPaymentInfoVo infoVo) {
		if (!isRefund){
			pageVo.setFundPersonalSum(BigDecimalUtils.safeAdd(pageVo.getFundPersonalSum(), infoVo.getPersonalProvidentSum()));
			pageVo.setFundUnitSum(BigDecimalUtils.safeAdd(pageVo.getFundUnitSum(), infoVo.getUnitProvidentSum()));
		}
		pageVo.setCompanyAccrual(BigDecimalUtils.safeAdd(pageVo.getCompanyAccrual(), infoVo.getCompanyAccrual()));
		pageVo.setPersonalAccrual(BigDecimalUtils.safeAdd(pageVo.getPersonalAccrual(), infoVo.getPersonalAccrual()));
		pageVo.setSocialUnitSum(BigDecimalUtils.safeAdd(pageVo.getSocialUnitSum(),
				infoVo.getUnitPensionMoney(),
				infoVo.getUnitMedicalMoney(),
				infoVo.getUnitInjuryMoney(),
				infoVo.getUnitBirthMoney(),
				infoVo.getUnitUnemploymentMoney(),
				infoVo.getUnitBigmailmentMoney()));
		pageVo.setSocialPersonalSum(BigDecimalUtils.safeAdd(pageVo.getSocialPersonalSum(),
				infoVo.getPersonalPensionMoney(),
				infoVo.getPersonalMedicalMoney(),
				infoVo.getPersonalUnemploymentMoney(),
				infoVo.getPersonalBigmailmentMoney()));
		pageVo.setSum(BigDecimalUtils.safeAdd(pageVo.getSum(),infoVo.getCompanyAccrual(),
				infoVo.getPersonalAccrual(),
				infoVo.getPersonalProvidentSum(),
				infoVo.getUnitProvidentSum(),
				infoVo.getSocialSecurityPersonalSum(),
				infoVo.getUnitSocialSum()));
	}

	/**
	 * B端社保公积金列表查询
	 * @Author fxj
	 * @Date 2020-08-28
	 * @param page
	 * @param socialAndFundBusinessPageVo
	 * @param settleDomainIds
	 * @return
	 **/
	@Override
	public List<SocialAndFundBusinessPageVo> getSocialAndFundBusinessPage(Page<SocialAndFundBusinessPageVo> page, SocialAndFundBusinessPageVo socialAndFundBusinessPageVo, List<String> settleDomainIds) {
		List<SocialAndFundBusinessPageVo> pageVo = baseMapper.getSocialAndFundBusinessDataPage(socialAndFundBusinessPageVo, settleDomainIds);
		List<SocialAndFundBusinessPageVo> pageVosEmpCount = baseMapper.getSocialAndFundBusinessDataCount(socialAndFundBusinessPageVo, settleDomainIds);
		if (Common.isNotNull(pageVo) && Common.isNotNull(pageVosEmpCount)){
			HashMap<String ,Integer> monthPeopleCount = new HashMap<>();
			for (SocialAndFundBusinessPageVo vo:pageVosEmpCount){
				monthPeopleCount.put(vo.getMonth(),vo.getPeopleCount());
			}
			for (SocialAndFundBusinessPageVo vo:pageVo){
				vo.setPeopleCount(monthPeopleCount.get(vo.getMonth()));
			}
		}
		return pageVo;
	}
	/**
	 * 按月查询对应权限的缴费库数据
	 * @Author fxj
	 * @Date 2020-08-25
	 * @param page
	 * @param paymentBusinessPageVo
	 * @param type
	 * @return
	 **/
	@Override
	public IPage<PaymentBusinessPageVo> getPaymentByMonthAndAuth(Page<PaymentBusinessPageVo> page, PaymentBusinessPageVo paymentBusinessPageVo, List<String> settleDomainIds, String type) {
		List<String>  empIds = null;
		if (CommonConstants.ONE_STRING.equals(type)) {
			empIds = baseMapper.getSocialOrFundAddEmpIds(paymentBusinessPageVo.getMonth(),paymentBusinessPageVo.getSettleDomainId(),settleDomainIds);
			if (empIds.isEmpty()) {
				return page;
			}
		}
		IPage<PaymentBusinessPageVo> pageVo = baseMapper.getPaymentBusinessPageVo(page,paymentBusinessPageVo,settleDomainIds,empIds);
		List<PaymentBusinessPageVo> pageVos = pageVo.getRecords();
		if (Common.isNotNull(pageVos)){
			for (PaymentBusinessPageVo vo:pageVos){
				vo.setSum(BigDecimalUtils.safeAdd(vo.getUnitSum(),vo.getPersonalSum()));
			}
		}
		page.setRecords(pageVos);
		return page;
	}
	/**
	 * 按年月查询指定结算主体或权限内的缴费库数据统计
	 * @Author fxj
	 * @Date 2020-08-31
	 * @param month
	 * @param settleDomainId
	 * @return
	 **/
	@Override
	public PaymentBusinessPageDetail getPaymentBusinessPageDetailByMonthAndAuth(String month, String settleDomainId, List<String> settleDomainIds) {
		PaymentBusinessPageDetail detail = new PaymentBusinessPageDetail();
		// 1.派增办理成功的社保和公积金人数
		detail.setPersonalCount(baseMapper.getSocialOrFundAddCount(month,settleDomainId,settleDomainIds,CommonConstants.ZERO_INT));
		// 2.当月派增办理成功的社保和公积金人数
		detail.setPersonalAdd(baseMapper.getSocialOrFundAddCount(month,settleDomainId,settleDomainIds, CommonConstants.ONE_INT));
		// 3.当月派减办理成功的社保和公积金人数
		detail.setPersonalReduce(baseMapper.getSocialOrFundReduceCount(month,settleDomainId,settleDomainIds));
		return detail;
	}

	/**
	 * 查询派减的社保和公积金的分页数据
	 * @Author fxj
	 * @Date 2020-08-31
	 * @param page
	 * @param month
	 * @param settleDomainId
	 * @return
	 **/
	@Override
	public IPage<SocialAndFundReduceBusinessVo> getSocialAndFundReduceInfo(Page<SocialAndFundReduceBusinessVo> page, String month, String settleDomainId, List<String> settleDomainIds) {
		IPage<SocialAndFundReduceBusinessVo> pageVos = baseMapper.getSocialAndFundReduceInfo(page,month,settleDomainId,settleDomainIds);
		if (null != pageVos && Common.isNotNull(pageVos.getRecords())){
			for (SocialAndFundReduceBusinessVo vo:pageVos.getRecords()){
				initReduceBusinessData(vo);
			}
		}
		return pageVos;
	}

	private void initReduceBusinessData(SocialAndFundReduceBusinessVo vo) {
		int index;
		if (Common.isNotNull(vo.getLeaveDate())){
			index = vo.getLeaveDate().indexOf(CommonConstants.COMMA_CHAR);
			if (index > 0){
				vo.setLeaveDate(vo.getLeaveDate().substring(CommonConstants.ZERO_INT,index));
			}
		}
		if (Common.isNotNull(vo.getSocialReduceDate())){
			index = vo.getSocialReduceDate().indexOf(CommonConstants.COMMA_CHAR);
			if (index > 0){
				vo.setSocialReduceDate(vo.getSocialReduceDate().substring(CommonConstants.ZERO_INT,index));
			}
		}
		if (Common.isNotNull(vo.getFundReduceDate())){
			index = vo.getFundReduceDate().indexOf(CommonConstants.COMMA_CHAR);
			if (index > 0){
				vo.setFundReduceDate(vo.getFundReduceDate().substring(CommonConstants.ZERO_INT,index));
			}
		}
	}
	// hgw2023-1-6 10:44:31以上，B端相关

	//项目信息校验
	private String settleInfoCheck(TPaymentInfo payExists) {
		StringBuilder errorInfo = new StringBuilder();
		if (Common.isEmpty(payExists.getSettleDomainName())) {
			errorInfo.append("项目名称、");
		}
		if (Common.isEmpty(payExists.getSettleDomainCode())) {
			errorInfo.append("项目编码、");
		}
		if (Common.isEmpty(payExists.getBpoFlag())) {
			errorInfo.append("是否BPO、");
		}
		if (errorInfo.toString().isEmpty()) {
			return null;
		}else {
			return errorInfo.substring(0,errorInfo.length() - 1);
		}
	}

	/**
	 * @Author fxj
	 * @Description 实缴导入列表导出不合并数据校验，生成月份为空时 数据量超出2W 前端提示
	 * @Date 14:57 2024/8/5
	 * @Param
	 * @return
	 **/
	@Override
	public R<Integer> listExportCheck(HttpServletResponse response, TPaymentInfoSearchVo searchVo) {
		return R.ok(baseMapper.selectCountTPaymentInfo(searchVo));
	}
	/**
	 * @Author fxj
	 * @Description 缴费库合并导出 检车 生成月份为空 数据条数超出2W条后 前端给提示
	 * @Date 15:09 2024/8/5
	 * @Param
	 * @return
	 **/
	@Override
	public R<Integer> listSumExportCheck(HttpServletResponse response, TPaymentInfoSearchVo searchVo){
		boolean flag = Common.isEmpty(searchVo.getEmpIdcard())
				&& Common.isEmpty(searchVo.getSocialSecurityNo())
				&& Common.isEmpty(searchVo.getUnitName())
				&& Common.isEmpty(searchVo.getSettleDomainName())
				&& Common.isEmpty(searchVo.getSocialCreateMonth())
				&& Common.isEmpty(searchVo.getSocialPayMonth())
				&& Common.isEmpty(searchVo.getCreateName())
				&& null == searchVo.getCreateTimeEnd()
				&& Common.isEmpty(searchVo.getSecondIndicatorBelong())
				&& Common.isEmpty(searchVo.getPushStatus())
				&& Common.isEmpty(searchVo.getLockStatus());
		// 单独处理户数据查询
		if (flag && Common.isEmpty(searchVo.getSocialProvince())){
			// 只有社保户
			if (Common.isNotNull(searchVo.getSocialHousehold()) && !Common.isNotNull(searchVo.getProvidentHousehold())){
				//特殊处理皖信户
				if ("安徽皖信人力资源管理有限公司".equals(searchVo.getSocialHousehold())){
					return R.ok(20001);
				}
				return R.ok(baseMapper.selectCountPaymentSearchInfoSocialByLimit(searchVo));
			}
			//只有公积金户
			if (Common.isNotNull(searchVo.getProvidentHousehold()) && !Common.isNotNull(searchVo.getSocialHousehold())){
				//特殊处理皖信户
				if ("安徽皖信人力资源管理有限公司".equals(searchVo.getProvidentHousehold())){
					return R.ok(20001);
				}
				return R.ok(baseMapper.selectCountPaymentSearchInfoSocialByLimit(searchVo));
			}
		}
		// 单独处理区域数据
		if (flag && Common.isEmpty(searchVo.getSocialHousehold())
				&& Common.isEmpty(searchVo.getProvidentHousehold())){
			if ((Common.isEmpty(searchVo.getSocialCity()) && "12".equals(searchVo.getSocialProvince()))
					||(Common.isEmpty(searchVo.getSocialTown()) && "135".equals(searchVo.getSocialCity()))){
				return R.ok(20001);
			}
		}
		return R.ok(baseMapper.selectCountSumPaymentInfo(searchVo));
	}
	/**
	 * @Author fxj
	 * @Description 缴费库查询合并导出 校验， 生成月份为空时 导出条数超出2W 前端给提示
	 * @Date 15:13 2024/8/5
	 * @Param
	 * @return
	 **/
	@Override
	public R<Integer> sumSearchExportCheck(HttpServletResponse response, TPaymentInfoSearchVo searchVo){
		boolean flag = Common.isEmpty(searchVo.getEmpIdcard())
				&& Common.isEmpty(searchVo.getSocialSecurityNo())
				&& Common.isEmpty(searchVo.getUnitName())
				&& Common.isEmpty(searchVo.getSettleDomainName())
				&& Common.isEmpty(searchVo.getSocialCreateMonth())
				&& Common.isEmpty(searchVo.getSocialPayMonth())
				&& Common.isEmpty(searchVo.getCreateName())
				&& null == searchVo.getCreateTimeEnd()
				&& Common.isEmpty(searchVo.getSecondIndicatorBelong())
				&& Common.isEmpty(searchVo.getPushStatus())
				&& Common.isEmpty(searchVo.getLockStatus());
		// 单独处理户数据查询
		if (flag && Common.isEmpty(searchVo.getSocialProvince())){
			// 只有社保户
			if (Common.isNotNull(searchVo.getSocialHousehold()) && !Common.isNotNull(searchVo.getProvidentHousehold())){
				//特殊处理皖信户
				if ("安徽皖信人力资源管理有限公司".equals(searchVo.getSocialHousehold())){
					return R.ok(20001);
				}
				return R.ok(baseMapper.selectCountPaymentSearchInfoSocialByLimit(searchVo));
			}
			//只有公积金户
			if (Common.isNotNull(searchVo.getProvidentHousehold()) && !Common.isNotNull(searchVo.getSocialHousehold())){
				//特殊处理皖信户
				if ("安徽皖信人力资源管理有限公司".equals(searchVo.getProvidentHousehold())){
					return R.ok(20001);
				}
				return R.ok(baseMapper.selectCountPaymentSearchInfoSocialByLimit(searchVo));
			}
		}
		// 单独处理区域数据
		if (flag && Common.isEmpty(searchVo.getSocialHousehold())
				&& Common.isEmpty(searchVo.getProvidentHousehold())){
			if ((Common.isEmpty(searchVo.getSocialCity()) && "12".equals(searchVo.getSocialProvince()))
					||(Common.isEmpty(searchVo.getSocialTown()) && "135".equals(searchVo.getSocialCity()))){
				return R.ok(20001);
			}
		}

		/*if (Common.isEmpty(searchVo.getEmpIdcard())
				&& Common.isEmpty(searchVo.getUnitName())
				&& Common.isEmpty(searchVo.getSettleDomainName())
				&& Common.isEmpty(searchVo.getSocialCreateMonth())
				&& Common.isEmpty(searchVo.getSocialPayMonth())
				&& Common.isEmpty(searchVo.getSocialProvince())
				&& Common.isEmpty(searchVo.getSecondIndicatorBelong())){
			// 只有社保户
			if (Common.isNotNull(searchVo.getSocialHousehold())){
				return R.ok(baseMapper.selectCountPaymentSearchInfoSocialByLimit(searchVo));
			}
			//只有公积金户
			if (Common.isNotNull(searchVo.getProvidentHousehold())){
				return R.ok(baseMapper.selectCountPaymentSearchInfoSocialByLimit(searchVo));
			}
		}*/
		return R.ok(baseMapper.selectCountPaymentSearchInfo(searchVo));
	}
	private boolean socialFlag(TPaymentInfoSearchVo tPaymentInfo){
		return  ("安徽皖信人力资源管理有限公司".equals(tPaymentInfo.getSocialHousehold())
				|| "安徽皖信人力资源管理有限公司肥东分公司".equals(tPaymentInfo.getSocialHousehold())) && Common.isEmpty(tPaymentInfo.getEmpIdcard())
				&& Common.isEmpty(tPaymentInfo.getUnitName())
				&& Common.isEmpty(tPaymentInfo.getSettleDomainName())
				&& Common.isEmpty(tPaymentInfo.getSettleDomainCode())
				&& Common.isEmpty(tPaymentInfo.getSocialCreateMonth())
				&& Common.isEmpty(tPaymentInfo.getSocialPayMonth())
				&& Common.isEmpty(tPaymentInfo.getSocialProvince())
				&& Common.isEmpty(tPaymentInfo.getSecondIndicatorBelong())
				&& Common.isEmpty(tPaymentInfo.getProvidentHousehold());
	}

	private boolean cityFlag(TPaymentInfoSearchVo tPaymentInfo){
		return (("135".equals(tPaymentInfo.getSocialCity()) && Common.isEmpty(tPaymentInfo.getSocialTown()))
				|| ("12".equals(tPaymentInfo.getSocialProvince()) && Common.isEmpty(tPaymentInfo.getSocialCity())))
				&& Common.isEmpty(tPaymentInfo.getEmpIdcard())
				&& Common.isEmpty(tPaymentInfo.getUnitName())
				&& Common.isEmpty(tPaymentInfo.getSettleDomainName())
				&& Common.isEmpty(tPaymentInfo.getSettleDomainCode())
				&& Common.isEmpty(tPaymentInfo.getSocialCreateMonth())
				&& Common.isEmpty(tPaymentInfo.getSocialPayMonth())
				&& Common.isEmpty(tPaymentInfo.getSecondIndicatorBelong())
				&& Common.isEmpty(tPaymentInfo.getProvidentHousehold())
				&& Common.isEmpty(tPaymentInfo.getSocialHousehold());
	}
	@Override
	public R<IPage<TPaymentInfo>> specialHandle(Page<TPaymentInfo> page, TPaymentInfoSearchVo tPaymentInfo) {
		//确认为大户查询或安徽省或安徽省合肥市单独查询提示选择更多条件
		String res = searchCheck(tPaymentInfo);
		if (Common.isNotNull(res)){
			return R.failed(res);
		}
		//判断社保户
		if (socialFlag(tPaymentInfo)){
			return getLock(page, tPaymentInfo);
		}
		//判断缴纳地
		if (cityFlag(tPaymentInfo)){
			return getLock(page, tPaymentInfo);
		}
		return  null;
	}

	@Override
	public R<IPage<TPaymentInfoNewVo>> specialHandleNew(Page<TPaymentInfo> page, TPaymentInfoSearchVo tPaymentInfo) {
		//确认为大户查询或安徽省或安徽省合肥市单独查询提示选择更多条件
		String res = searchCheck(tPaymentInfo);
		if (Common.isNotNull(res)){
			return R.failed(res);
		}
		//判断社保户
		if (socialFlag(tPaymentInfo)){
			return getLockNew(page, tPaymentInfo);
		}
		//判断缴纳地
		if (cityFlag(tPaymentInfo)){
			return getLockNew(page, tPaymentInfo);
		}
		return  null;
	}

	private R<IPage<TPaymentInfoNewVo>> getLockNew(Page<TPaymentInfo> page, TPaymentInfoSearchVo tPaymentInfo) {
		String keyTemp = CacheConstants.PAYMENT_SEARCH_REPEAT;
		String requestId = null;
		try {
			requestId = RedisDistributedLock.getLock(keyTemp,"120");
			if (Common.isNotNull(requestId)) {
				//查询数据
				return this.getTPaymentInfoNewPage(page, tPaymentInfo);
			} else {
				return R.failed(ResultConstants.NO_GETLOCK_DATA_SEARCH);
			}
		} catch (Exception e) {
			throw new RuntimeException(ResultConstants.NO_GETLOCK_DATA+CommonConstants.DOWN_LINE_STRING+e.getMessage());
		}finally {
			//主动释放锁
			RedisDistributedLock.unlock(keyTemp, requestId);
		}
	}

	private R<IPage<TPaymentInfo>> getLock(Page<TPaymentInfo> page, TPaymentInfoSearchVo tPaymentInfo) {
		String keyTemp = CacheConstants.PAYMENT_SEARCH_REPEAT;
		String requestId = null;
		try {
			requestId = RedisDistributedLock.getLock(keyTemp,"120");

			if (Common.isNotNull(requestId)) {
				//查询数据
				return new R<>(this.getTPaymentInfoPage(page, tPaymentInfo));
			} else {
				return R.failed(ResultConstants.NO_GETLOCK_DATA_SEARCH);
			}
		} catch (Exception e) {
			throw new RuntimeException(ResultConstants.NO_GETLOCK_DATA+CommonConstants.DOWN_LINE_STRING+e.getMessage());
		}finally {
			//主动释放锁
			RedisDistributedLock.unlock(keyTemp, requestId);
		}
	}
	private void exportError(HttpServletResponse response, String errorMessage) {
		String fileName = "导出异常" + DateUtil.getThisTime() + CommonConstants.XLSX;
		//获取要导出的列表
		List<ExportErrorVo> list = new ArrayList<>();
		list.add(new ExportErrorVo(errorMessage));
		long count = 0;
		ServletOutputStream out = null;
		try {
			out = response.getOutputStream();
			response.setContentType(CommonConstants.MULTIPART_FORM_DATA);
			response.setCharacterEncoding("utf-8");
			response.setHeader(CommonConstants.CONTENT_DISPOSITION, CommonConstants.ATTACHMENT_FILENAME + URLEncoder.encode(fileName, "UTF-8"));
			// 这里 需要指定写用哪个class去写，然后写到第一个sheet，然后文件流会自动关闭
			ExcelWriter excelWriter = EasyExcelFactory.write(out, ExportErrorVo.class).build();
			int index = 0;
			WriteSheet writeSheet = EasyExcelFactory.writerSheet("异常信息" + index).build();
			excelWriter.write(list, writeSheet);
			if (Common.isNotNull(list)) {
				list.clear();
			}
			out.flush();
			excelWriter.finish();
		} catch (Exception e) {
			log.error("执行异常", e);
		} finally {
			try {
				if (null != out) {
					out.close();
				}
			} catch (IOException e) {
				log.error("执行异常", e);
			}
		}
	}

	public String searchCheck(TPaymentInfoSearchVo searchVo){
		boolean flag = Common.isEmpty(searchVo.getEmpIdcard())
				&& Common.isEmpty(searchVo.getSocialSecurityNo())
				&& Common.isEmpty(searchVo.getUnitName())
				&& Common.isEmpty(searchVo.getSettleDomainName())
				&& Common.isEmpty(searchVo.getSettleDomainCode())
				&& Common.isEmpty(searchVo.getSocialCreateMonth())
				&& Common.isEmpty(searchVo.getSocialPayMonth())
				&& Common.isEmpty(searchVo.getCreateName())
				&& null == searchVo.getCreateTimeEnd()
				&& Common.isEmpty(searchVo.getSecondIndicatorBelong())
				&& Common.isEmpty(searchVo.getPushStatus())
				&& Common.isEmpty(searchVo.getLockStatus());
		// 单独处理户数据查询
		if (flag && Common.isEmpty(searchVo.getSocialProvince())){
			// 只有社保户
			if (Common.isNotNull(searchVo.getSocialHousehold()) && !Common.isNotNull(searchVo.getProvidentHousehold())){
				//特殊处理皖信户
				if ("安徽皖信人力资源管理有限公司".equals(searchVo.getSocialHousehold())){
					return "当前条件查询量较大，请选择更多条件";
				}
			}
			//只有公积金户
			if (Common.isNotNull(searchVo.getProvidentHousehold()) && !Common.isNotNull(searchVo.getSocialHousehold())){
				//特殊处理皖信户
				if ("安徽皖信人力资源管理有限公司".equals(searchVo.getProvidentHousehold())){
					return "当前条件查询量较大，请选择更多条件";
				}
			}
		}
		// 单独处理区域数据
		if (flag && Common.isEmpty(searchVo.getSocialHousehold())
				&& Common.isEmpty(searchVo.getProvidentHousehold())){
			if ((Common.isEmpty(searchVo.getSocialCity()) && "12".equals(searchVo.getSocialProvince()))
					||(Common.isEmpty(searchVo.getSocialTown()) && "135".equals(searchVo.getSocialCity()))){
				return "当前条件查询量较大，请选择更多条件";
			}
		}
		return null;
	}
}
