package com.engine.salary.entity.siaccount.bo;

import com.alibaba.fastjson.JSON;
import com.engine.salary.entity.salaryacct.po.ExcelAcctResultPO;
import com.engine.salary.entity.salaryacct.po.SalaryAcctResultPO;
import com.engine.salary.entity.salarysob.dto.SalarySobEmpFieldDTO;
import com.engine.salary.entity.sicategory.po.ICategoryPO;
import com.engine.salary.entity.siexport.po.AccountExportPO;
import com.engine.salary.entity.siexport.po.ExcelAccountExportPO;
import com.engine.salary.entity.taxagent.po.TaxAgentPO;
import com.engine.salary.enums.salaryitem.SalaryDataTypeEnum;
import com.engine.salary.mapper.sicategory.ICategoryMapper;
import com.engine.salary.mapper.taxagent.TaxAgentMapper;
import com.engine.salary.util.SalaryEntityUtil;
import com.engine.salary.util.SalaryI18nUtil;
import com.engine.salary.util.db.MapperProxyFactory;
import com.engine.salary.util.page.Column;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;

import java.util.*;
import java.util.function.Function;
import java.util.stream.Collectors;

import static com.engine.salary.enums.UserStatusEnum.getDefaultLabelByValue;

/**
 * @Author: sy
 * @Description: 福利核算线上线下对比结果
 * @Date: 2022/9/28
 **/
public class InsuranceComparisonResultBO {
    /**
     * 数据类型的后缀标识
     * 为了展示千分位，福利核算结果列表、线上线下对比结果列表需要返回给前端列表字段的数据类型，字段索引+后缀标识
     */
    private static final String DATA_TYPE_SUFFIX = "_type";


    /**
     * 构建福利核算结果列表的表头（线下对比）
     *
     */
    public static List<Column> buildTableColumns4ComparisonResult(Set<Long> insuranceBaseSet, Set<Long> insurancePerPaySet, Set<Long> insuranceComPaySet, boolean welBaseDiffSign) {

        List<ICategoryPO> listAll = MapperProxyFactory.getProxy(ICategoryMapper.class).listAll();
        List<ICategoryPO> socialWelfareList = listAll.stream().filter(e -> e.getWelfareType() == 1 && e.getIsUse() == 1 && insuranceBaseSet.contains(e.getId())).collect(Collectors.toList());
        List<ICategoryPO> fundWelfareList = listAll.stream().filter(e -> e.getWelfareType() == 2 && e.getIsUse() == 1 && insuranceBaseSet.contains(e.getId())).collect(Collectors.toList());
        List<ICategoryPO> otherWelfareList = listAll.stream().filter(e -> e.getWelfareType() == 3 && e.getIsUse() == 1 && insuranceBaseSet.contains(e.getId())).collect(Collectors.toList());

        List<ICategoryPO> socialWelPerList = listAll.stream().filter(e -> e.getWelfareType() == 1 && e.getIsUse() == 1 && insurancePerPaySet.contains(e.getId())).collect(Collectors.toList());
        List<ICategoryPO> fundWelPerList = listAll.stream().filter(e -> e.getWelfareType() == 2 && e.getIsUse() == 1 && insurancePerPaySet.contains(e.getId())).collect(Collectors.toList());
        List<ICategoryPO> otherWelPerList = listAll.stream().filter(e -> e.getWelfareType() == 3 && e.getIsUse() == 1 && insurancePerPaySet.contains(e.getId())).collect(Collectors.toList());

        List<ICategoryPO> socialWelComList = listAll.stream().filter(e -> e.getWelfareType() == 1 && e.getIsUse() == 1 && insuranceComPaySet.contains(e.getId())).collect(Collectors.toList());
        List<ICategoryPO> fundWelComList = listAll.stream().filter(e -> e.getWelfareType() == 2 && e.getIsUse() == 1 && insuranceComPaySet.contains(e.getId())).collect(Collectors.toList());
        List<ICategoryPO> otherWelComList = listAll.stream().filter(e -> e.getWelfareType() == 3 && e.getIsUse() == 1 && insuranceComPaySet.contains(e.getId())).collect(Collectors.toList());
        List<Column> columns = Lists.newArrayList();
        // 员工信息字段
        columns.add(new Column("姓名", "userName", "userName"));
        columns.add(new Column("部门", "department", "department"));
        columns.add(new Column("手机号", "mobile", "mobile"));
        columns.add(new Column("工号", "workcode", "workcode"));
        columns.add(new Column("员工状态", "employeeStatus", "employeeStatus"));
        columns.add(new Column("数据来源", "sourceFrom", "sourceFrom"));
        columns.add(new Column("个税扣缴义务人", "socialPayOrg", "socialPayOrg"));
        columns.add(new Column("社保账号", "socialAccount", "socialAccount"));
        columns.add(new Column("社保方案名称", "socialSchemeName", "socialSchemeName"));
        //组装社保基数
        if (welBaseDiffSign) {
            List<Column> socialComColumns = Lists.newArrayList();
            for (ICategoryPO po : socialWelfareList) {
                columns.add(new Column(po.getInsuranceName() + SalaryI18nUtil.getI18nLabel(0, "申报基数") + SalaryI18nUtil.getI18nLabel(0,"个人")
                        , po.getId() + "socialPerBase", po.getId() + "socialPerBase"));
                socialComColumns.add(new Column(po.getInsuranceName() +  SalaryI18nUtil.getI18nLabel(0, "申报基数") + SalaryI18nUtil.getI18nLabel(0,"单位")
                        , po.getId() + "socialComBase", po.getId() + "socialComBase"));
            }
            columns.addAll(socialComColumns);
        } else {
            for (ICategoryPO po : socialWelfareList) {
                columns.add(new Column(po.getInsuranceName() + "申报基数", po.getId() + "socialBase", po.getId() + "socialBase"));
            }
        }
//        for (ICategoryPO po : socialWelfareList) {
//            columns.add(new Column(po.getInsuranceName() + "申报基数", po.getId() + "socialBase", po.getId() + "socialBase"));
//        }
        columns.add(new Column("公积金账号", "fundAccount", "fundAccount"));
        columns.add(new Column("公积金方案名称", "fundSchemeName", "fundSchemeName"));
        //组装公积金基数
        if (welBaseDiffSign) {
            List<Column> fundComColumns = Lists.newArrayList();
            for (ICategoryPO po : fundWelfareList) {
                columns.add(new Column(po.getInsuranceName() + SalaryI18nUtil.getI18nLabel(0, "申报基数") + SalaryI18nUtil.getI18nLabel(0,"个人")
                        , po.getId() + "fundPerBase", po.getId() + "fundPerBase"));
                fundComColumns.add(new Column(po.getInsuranceName() + SalaryI18nUtil.getI18nLabel(0, "申报基数") + SalaryI18nUtil.getI18nLabel(0,"单位")
                        , po.getId() + "fundComBase", po.getId() + "fundComBase"));
            }
            columns.addAll(fundComColumns);
        } else {
            for (ICategoryPO po : fundWelfareList) {
                columns.add(new Column(po.getInsuranceName() + "申报基数", po.getId() + "fundBase", po.getId() + "fundBase"));
            }
        }
//        for (ICategoryPO po : fundWelfareList) {
//            columns.add(new Column(po.getInsuranceName() + "申报基数", po.getId() + "fundBase", po.getId() + "fundBase"));
//        }
        columns.add(new Column("补充公积金账号", "supplementFundAccount", "supplementFundAccount"));
        columns.add(new Column("其他福利方案名称", "otherSchemeName", "otherSchemeName"));
        //组装其他福利基数
        if (welBaseDiffSign) {
            List<Column> otherComColumns = Lists.newArrayList();
            for (ICategoryPO po : otherWelfareList) {
                columns.add(new Column(po.getInsuranceName() + SalaryI18nUtil.getI18nLabel(0, "申报基数") + SalaryI18nUtil.getI18nLabel(0,"个人")
                        , po.getId() + "otherPerBase", po.getId() + "otherPerBase"));
                otherComColumns.add(new Column(po.getInsuranceName() + SalaryI18nUtil.getI18nLabel(0, "申报基数") + SalaryI18nUtil.getI18nLabel(0,"单位")
                        , po.getId() + "otherComBase", po.getId() + "otherComBase"));
            }
            columns.addAll(otherComColumns);
        } else {
            for (ICategoryPO po : otherWelfareList) {
                columns.add(new Column(po.getInsuranceName() + "申报基数", po.getId() + "otherBase", po.getId() + "otherBase"));
            }
        }
//        for (ICategoryPO po : otherWelfareList) {
//            columns.add(new Column(po.getInsuranceName() + "申报基数", po.getId() + "otherBase", po.getId() + "otherBase"));
//        }

        //社保个人（生育保险个人、工伤保险个人、失业保险个人、养老保险个人、医疗保险个人）
        for (ICategoryPO po : socialWelPerList) {
            columns.add(new Column(po.getInsuranceName() + "个人", po.getId() + "socialPer", po.getId() + "socialPer"));
        }
        columns.add(new Column("社保个人合计", "socialPerSum", "socialPerSum"));
        //住房公积金个人、补充住房公积金个人
        for (ICategoryPO po : fundWelPerList) {
            columns.add(new Column(po.getInsuranceName() + "个人", po.getId() + "fundPer", po.getId() + "fundPer"));
        }
        columns.add(new Column("公积金个人合计", "fundPerSum", "fundPerSum"));
        //其他个人（比如企业年金个人）
        for (ICategoryPO po : otherWelPerList) {
            columns.add(new Column(po.getInsuranceName() + "个人", po.getId() + "otherPer", po.getId() + "otherPer"));
        }
        columns.add(new Column("其他福利个人合计", "otherPerSum", "otherPerSum"));
        columns.add(new Column("个人合计", "perSum", "perSum"));
        //社保单位（生育保险单位、工伤保险单位、失业保险单位、养老保险单位、医疗保险单位）
        for (ICategoryPO po : socialWelComList) {
            columns.add(new Column(po.getInsuranceName() + "单位", po.getId() + "socialCom", po.getId() + "socialCom"));
        }
        columns.add(new Column("社保单位合计", "socialComSum", "socialComSum"));
        //住房公积金单位、补充住房公积金单位
        for (ICategoryPO po : fundWelComList) {
            columns.add(new Column(po.getInsuranceName() + "单位", po.getId() + "fundCom", po.getId() + "fundCom"));
        }
        columns.add(new Column("公积金单位合计", "fundComSum", "fundComSum"));
        //其他单位（比如企业年金单位）
        for (ICategoryPO po : otherWelComList) {
            columns.add(new Column(po.getInsuranceName() + "单位", po.getId() + "otherCom", po.getId() + "otherCom"));
        }
        columns.add(new Column("其他福利单位合计", "otherComSum", "otherComSum"));
        columns.add(new Column("单位合计", "comSum", "comSum"));

        columns.add(new Column("社保合计", "socialSum", "socialSum"));
        columns.add(new Column("公积金合计", "fundSum", "fundSum"));
        columns.add(new Column("其他福利合计", "otherSum", "otherSum"));
        columns.add(new Column("合计", "total", "total"));
        return columns;
    }

    /**
     * 构建福利核算线下对比结果
     *
     */
    public static List<Map<String, Object>> buildComparisonTableData(List<AccountExportPO> accountExportPOS, List<ExcelAccountExportPO> excelAccountExportPOS
            , Map<Long, String> schemeIdNameMap, boolean welBaseDiffSign) {

        Map<Long, List<ExcelAccountExportPO>> excelResultMap = SalaryEntityUtil.group2Map(excelAccountExportPOS, ExcelAccountExportPO::getEmployeeId);
//        Map<String, List<AccountExportPO>> acctResultMap = SalaryEntityUtil.group2Map(accountExportPOS, AccountExportPO::getWorkcode);

        List<TaxAgentPO> paymentList = MapperProxyFactory.getProxy(TaxAgentMapper.class).listAll();
        Map<Long, TaxAgentPO> paymentMap = paymentList.stream().collect(Collectors.toMap(TaxAgentPO::getId, Function.identity()));

        List<Map<String, Object>> resultList = Lists.newArrayListWithExpectedSize(accountExportPOS.size());

        //遍历线上数据
        for (AccountExportPO accountExportPO : accountExportPOS) {

            Map<String, Object> map = Maps.newHashMap();
            // 记录线下值和系统值之间是否存在差异
            map.put("different", "false");

            //设置基本字段信息和类型
            map.put("userName", accountExportPO.getUserName());
            map.put("userName" + DATA_TYPE_SUFFIX, SalaryDataTypeEnum.STRING.getValue());
            map.put("department", accountExportPO.getDepartmentName());
            map.put("department" + DATA_TYPE_SUFFIX, SalaryDataTypeEnum.STRING.getValue());
            map.put("mobile", accountExportPO.getTelephone());
            map.put("mobile" + DATA_TYPE_SUFFIX, SalaryDataTypeEnum.STRING.getValue());
            map.put("workcode", accountExportPO.getWorkcode());
            map.put("workcode" + DATA_TYPE_SUFFIX, SalaryDataTypeEnum.STRING.getValue());
            map.put("employeeStatus", accountExportPO.getUserStatus() == null ? "" : getDefaultLabelByValue(accountExportPO.getUserStatus()));
            map.put("employeeStatus" + DATA_TYPE_SUFFIX, SalaryDataTypeEnum.STRING.getValue());
            map.put("socialPayOrg", paymentMap.get(accountExportPO.getSocialPayOrg()) == null ? "" : paymentMap.get(accountExportPO.getSocialPayOrg()).getName());
            map.put("socialPayOrg" + DATA_TYPE_SUFFIX, SalaryDataTypeEnum.STRING.getValue());

            //社保账号、公积金账号、补充公积金账号
            map.put("fundAccount", accountExportPO.getFundAccount());
            map.put("fundAccount" + DATA_TYPE_SUFFIX, SalaryDataTypeEnum.STRING.getValue());
            map.put("socialAccount", accountExportPO.getSocialAccount());
            map.put("socialAccount" + DATA_TYPE_SUFFIX, SalaryDataTypeEnum.STRING.getValue());
            map.put("supplementFundAccount", accountExportPO.getSupplementFundAccount());
            map.put("supplementFundAccount" + DATA_TYPE_SUFFIX, SalaryDataTypeEnum.STRING.getValue());

            //福利方案名称
            map.put("socialSchemeName", schemeIdNameMap.get(accountExportPO.getSocialSchemeId()));
            map.put("fundSchemeName", schemeIdNameMap.get(accountExportPO.getFundSchemeId()));
            map.put("otherSchemeName", schemeIdNameMap.get(accountExportPO.getOtherSchemeId()));

            //线下值
            List<ExcelAccountExportPO> excelResultValueList = excelResultMap.get(accountExportPO.getEmployeeId());
            ExcelAccountExportPO excelAccountExportPO = new ExcelAccountExportPO();
            if (excelResultValueList != null && excelResultValueList.size() == 1) {
                excelAccountExportPO = excelResultValueList.get(0);
            }
            if (welBaseDiffSign) {
                //社保基数-个人，socialPaymentBaseString
                welfareElementCompare(map, accountExportPO.getSocialPaymentBaseString(), excelAccountExportPO.getSocialPaymentBaseString(), "PerBase", 1);
                //公积金基数-个人，fundPaymentBaseString
                welfareElementCompare(map, accountExportPO.getFundPaymentBaseString(), excelAccountExportPO.getFundPaymentBaseString(), "PerBase", 2);
                //其他福利基数-个人，otherPaymentBaseString
                welfareElementCompare(map, accountExportPO.getOtherPaymentBaseString(), excelAccountExportPO.getOtherPaymentBaseString(), "PerBase", 3);

                //社保基数-公司，socialPaymentComBaseString
                welfareElementCompare(map, accountExportPO.getSocialPaymentComBaseString(), excelAccountExportPO.getSocialPaymentComBaseString(), "ComBase", 1);
                //公积金基数-公司，fundPaymentComBaseString
                welfareElementCompare(map, accountExportPO.getFundPaymentComBaseString(), excelAccountExportPO.getFundPaymentComBaseString(), "ComBase", 2);
                //其他福利基数-公司，otherPaymentComBaseString
                welfareElementCompare(map, accountExportPO.getOtherPaymentComBaseString(), excelAccountExportPO.getOtherPaymentComBaseString(), "ComBase", 3);
            } else {
                //社保基数，socialPaymentBaseString
                welfareElementCompare(map, accountExportPO.getSocialPaymentBaseString(), excelAccountExportPO.getSocialPaymentBaseString(), "Base", 1);
                //公积金基数，fundPaymentBaseString
                welfareElementCompare(map, accountExportPO.getFundPaymentBaseString(), excelAccountExportPO.getFundPaymentBaseString(), "Base", 2);
                //其他福利基数，otherPaymentBaseString
                welfareElementCompare(map, accountExportPO.getOtherPaymentBaseString(), excelAccountExportPO.getOtherPaymentBaseString(), "Base", 3);
            }
            //社保个人socialPerJson
            welfareElementCompare(map, accountExportPO.getSocialPerJson(), excelAccountExportPO.getSocialPerJson(), "Per", 1);
            //公积金个人fundPerJson
            welfareElementCompare(map, accountExportPO.getFundPerJson(), excelAccountExportPO.getFundPerJson(), "Per", 2);
            //其他个人otherPerJson
            welfareElementCompare(map, accountExportPO.getOtherPerJson(), excelAccountExportPO.getOtherPerJson(), "Per", 3);
            //社保单位socialComJson
            welfareElementCompare(map, accountExportPO.getSocialComJson(), excelAccountExportPO.getSocialComJson(), "Com", 1);
            //公积金单位fundComJson
            welfareElementCompare(map, accountExportPO.getFundComJson(), excelAccountExportPO.getFundComJson(), "Com", 2);
            //其他单位otherComJson
            welfareElementCompare(map, accountExportPO.getOtherComJson(), excelAccountExportPO.getOtherComJson(), "Com", 3);

            //各种合计
            welfareSumCompare(map, accountExportPO, excelAccountExportPO);

            resultList.add(map);
        }
        return resultList;
    }

    private static Map<String, Object> welfareElementCompare(Map<String, Object> map, String accountJson, String excelAccountJson, String welfareStand, Integer welfareType) {
        List<ICategoryPO> listAll = MapperProxyFactory.getProxy(ICategoryMapper.class).listAll();
        List<ICategoryPO> accountWelfareList = listAll.stream().filter(e -> e.getWelfareType().equals(welfareType)).collect(Collectors.toList());

        String baseTypeInfo = welfareType.equals(1) ? "social" : (welfareType.equals(2) ? "fund" : "other");

        Map<String, String> accountMap = JSON.parseObject(accountJson, HashMap.class);
        Map<String, String> excelAccountMap = JSON.parseObject(excelAccountJson, HashMap.class);
        for (ICategoryPO welfare : accountWelfareList) {
            Map<String, Object> temp = Maps.newHashMap();

            if (accountMap != null && accountMap.get(welfare.getId().toString()) != null) {
                temp.put("acctResultValue", dealNull(accountMap.get(welfare.getId().toString())));
            } else {
                temp.put("acctResultValue", "");
            }
            if (excelAccountMap != null && excelAccountMap.get(welfare.getId().toString()) != null) {
                temp.put("excelResultValue", dealNull(excelAccountMap.get(welfare.getId().toString())));
            }else {
                temp.put("excelResultValue", "");
            }
            map.put(welfare.getId() + baseTypeInfo + welfareStand, temp);
            // 薪资项目字段的字段类型
            map.put(welfare.getId() + baseTypeInfo + welfareStand + DATA_TYPE_SUFFIX,  SalaryDataTypeEnum.STRING.getValue());
//            if (map.get("different").equals("false") && !temp.get("acctResultValue").equals(temp.get("excelResultValue"))) {
//                map.put("different", "true");
//            }
            if (map.get("different").equals("false") && SalaryEntityUtil.empty2Zero(temp.get("acctResultValue").toString()).compareTo(SalaryEntityUtil.empty2Zero(temp.get("excelResultValue").toString())) != 0) {
                map.put("different", "true");
            }
        }
        return map;

    }
    private static Map<String, Object> welfareSumCompare(Map<String, Object> map, AccountExportPO accountExportPO, ExcelAccountExportPO excelAccountExportPO) {

        //社保个人合计、公积金个人合计、其他福利个人合计、个人合计
        Map<String, Object> socialPerSumTemp = Maps.newHashMap();
        socialPerSumTemp.put("acctResultValue", dealNull(accountExportPO.getSocialPerSum()));
        socialPerSumTemp.put("excelResultValue", dealNull(excelAccountExportPO.getSocialPerSum()));
        map.put("socialPerSum", socialPerSumTemp);
        map.put("socialPerSum" + DATA_TYPE_SUFFIX, SalaryDataTypeEnum.STRING.getValue());
//        if (map.get("different").equals("false") && !socialPerSumTemp.get("acctResultValue").equals(socialPerSumTemp.get("excelResultValue"))) {
//            map.put("different", "true");
//        }
        if (map.get("different").equals("false") && SalaryEntityUtil.empty2Zero(socialPerSumTemp.get("acctResultValue").toString())
                .compareTo(SalaryEntityUtil.empty2Zero(socialPerSumTemp.get("excelResultValue").toString())) != 0) {
            map.put("different", "true");
        }

        Map<String, Object> fundPerSumTemp = Maps.newHashMap();
        fundPerSumTemp.put("acctResultValue", dealNull(accountExportPO.getFundPerSum()));
        fundPerSumTemp.put("excelResultValue", dealNull(excelAccountExportPO.getFundPerSum()));
        map.put("fundPerSum", fundPerSumTemp);
        map.put("fundPerSum" + DATA_TYPE_SUFFIX, SalaryDataTypeEnum.STRING.getValue());
//        if (map.get("different").equals("false") && !fundPerSumTemp.get("acctResultValue").equals(fundPerSumTemp.get("excelResultValue"))) {
//            map.put("different", "true");
//        }
        if (map.get("different").equals("false") && SalaryEntityUtil.empty2Zero(fundPerSumTemp.get("acctResultValue").toString())
                .compareTo(SalaryEntityUtil.empty2Zero(fundPerSumTemp.get("excelResultValue").toString())) != 0) {
            map.put("different", "true");
        }

        Map<String, Object> otherPerSumTemp = Maps.newHashMap();
        otherPerSumTemp.put("acctResultValue", dealNull(accountExportPO.getOtherPerSum()));
        otherPerSumTemp.put("excelResultValue", dealNull(excelAccountExportPO.getOtherPerSum()));
        map.put("otherPerSum", otherPerSumTemp);
        map.put("otherPerSum" + DATA_TYPE_SUFFIX, SalaryDataTypeEnum.STRING.getValue());
//        if (map.get("different").equals("false") && !otherPerSumTemp.get("acctResultValue").equals(otherPerSumTemp.get("excelResultValue"))) {
//            map.put("different", "true");
//        }
        if (map.get("different").equals("false") && SalaryEntityUtil.empty2Zero(otherPerSumTemp.get("acctResultValue").toString())
                .compareTo(SalaryEntityUtil.empty2Zero(otherPerSumTemp.get("excelResultValue").toString())) != 0) {
            map.put("different", "true");
        }

        Map<String, Object> perSumTemp = Maps.newHashMap();
        perSumTemp.put("acctResultValue", dealNull(accountExportPO.getPerSum()));
        perSumTemp.put("excelResultValue", dealNull(excelAccountExportPO.getPerSum()));
        map.put("perSum", perSumTemp);
        map.put("perSum" + DATA_TYPE_SUFFIX, SalaryDataTypeEnum.STRING.getValue());
//        if (map.get("different").equals("false") && !perSumTemp.get("acctResultValue").equals(perSumTemp.get("excelResultValue"))) {
//            map.put("different", "true");
//        }
        if (map.get("different").equals("false") && SalaryEntityUtil.empty2Zero(perSumTemp.get("acctResultValue").toString())
                .compareTo(SalaryEntityUtil.empty2Zero(perSumTemp.get("excelResultValue").toString())) != 0) {
            map.put("different", "true");
        }

        //社保单位合计、公积金单位合计、其他福利单位合计、单位合计
        Map<String, Object> socialComSumTemp = Maps.newHashMap();
        socialComSumTemp.put("acctResultValue", dealNull(accountExportPO.getSocialComSum()));
        socialComSumTemp.put("excelResultValue", dealNull(excelAccountExportPO.getSocialComSum()));
        map.put("socialComSum", socialComSumTemp);
        map.put("socialComSum" + DATA_TYPE_SUFFIX, SalaryDataTypeEnum.STRING.getValue());
//        if (map.get("different").equals("false") && !socialComSumTemp.get("acctResultValue").equals(socialComSumTemp.get("excelResultValue"))) {
//            map.put("different", "true");
//        }
        if (map.get("different").equals("false") && SalaryEntityUtil.empty2Zero(socialComSumTemp.get("acctResultValue").toString())
                .compareTo(SalaryEntityUtil.empty2Zero(socialComSumTemp.get("excelResultValue").toString())) != 0) {
            map.put("different", "true");
        }

        Map<String, Object> fundComSumTemp = Maps.newHashMap();
        fundComSumTemp.put("acctResultValue", dealNull(accountExportPO.getFundComSum()));
        fundComSumTemp.put("excelResultValue", dealNull(excelAccountExportPO.getFundComSum()));
        map.put("fundComSum", fundComSumTemp);
        map.put("fundComSum" + DATA_TYPE_SUFFIX, SalaryDataTypeEnum.STRING.getValue());
//        if (map.get("different").equals("false") && !fundComSumTemp.get("acctResultValue").equals(fundComSumTemp.get("excelResultValue"))) {
//            map.put("different", "true");
//        }
        if (map.get("different").equals("false") && SalaryEntityUtil.empty2Zero(fundComSumTemp.get("acctResultValue").toString())
                .compareTo(SalaryEntityUtil.empty2Zero(fundComSumTemp.get("excelResultValue").toString())) != 0) {
            map.put("different", "true");
        }

        Map<String, Object> otherComSumTemp = Maps.newHashMap();
        otherComSumTemp.put("acctResultValue", dealNull(accountExportPO.getOtherComSum()));
        otherComSumTemp.put("excelResultValue", dealNull(excelAccountExportPO.getOtherComSum()));
        map.put("otherComSum", otherComSumTemp);
        map.put("otherComSum" + DATA_TYPE_SUFFIX, SalaryDataTypeEnum.STRING.getValue());
//        if (map.get("different").equals("false") && !otherComSumTemp.get("acctResultValue").equals(otherComSumTemp.get("excelResultValue"))) {
//            map.put("different", "true");
//        }
        if (map.get("different").equals("false") && SalaryEntityUtil.empty2Zero(otherComSumTemp.get("acctResultValue").toString())
                .compareTo(SalaryEntityUtil.empty2Zero(otherComSumTemp.get("excelResultValue").toString())) != 0) {
            map.put("different", "true");
        }

        Map<String, Object> perComTemp = Maps.newHashMap();
        perComTemp.put("acctResultValue", dealNull(accountExportPO.getComSum()));
        perComTemp.put("excelResultValue", dealNull(excelAccountExportPO.getComSum()));
        map.put("comSum", perComTemp);
        map.put("comSum" + DATA_TYPE_SUFFIX, SalaryDataTypeEnum.STRING.getValue());
//        if (map.get("different").equals("false") && !perComTemp.get("acctResultValue").equals(perComTemp.get("excelResultValue"))) {
//            map.put("different", "true");
//        }
        if (map.get("different").equals("false") && SalaryEntityUtil.empty2Zero(perComTemp.get("acctResultValue").toString())
                .compareTo(SalaryEntityUtil.empty2Zero(perComTemp.get("excelResultValue").toString())) != 0) {
            map.put("different", "true");
        }

        //社保合计、公积金合计、其他福利合计、合计
        Map<String, Object> socialSumTemp = Maps.newHashMap();
        socialSumTemp.put("acctResultValue", dealNull(accountExportPO.getSocialSum()));
        socialSumTemp.put("excelResultValue", dealNull(excelAccountExportPO.getSocialSum()));
        map.put("socialSum", socialSumTemp);
        map.put("socialSum" + DATA_TYPE_SUFFIX, SalaryDataTypeEnum.STRING.getValue());
//        if (map.get("different").equals("false") && !socialSumTemp.get("acctResultValue").equals(socialSumTemp.get("excelResultValue"))) {
//            map.put("different", "true");
//        }
        if (map.get("different").equals("false") && SalaryEntityUtil.empty2Zero(socialSumTemp.get("acctResultValue").toString())
                .compareTo(SalaryEntityUtil.empty2Zero(socialSumTemp.get("excelResultValue").toString())) != 0) {
            map.put("different", "true");
        }

        Map<String, Object> fundSumTemp = Maps.newHashMap();
        fundSumTemp.put("acctResultValue", dealNull(accountExportPO.getFundSum()));
        fundSumTemp.put("excelResultValue", dealNull(excelAccountExportPO.getFundSum()));
        map.put("fundSum", fundSumTemp);
        map.put("fundSum" + DATA_TYPE_SUFFIX, SalaryDataTypeEnum.STRING.getValue());
//        if (map.get("different").equals("false") && !fundSumTemp.get("acctResultValue").equals(fundSumTemp.get("excelResultValue"))) {
//            map.put("different", "true");
//        }
        if (map.get("different").equals("false") && SalaryEntityUtil.empty2Zero(fundSumTemp.get("acctResultValue").toString())
                .compareTo(SalaryEntityUtil.empty2Zero(fundSumTemp.get("excelResultValue").toString())) != 0) {
            map.put("different", "true");
        }

        Map<String, Object> otherSumTemp = Maps.newHashMap();
        otherSumTemp.put("acctResultValue", dealNull(accountExportPO.getOtherSum()));
        otherSumTemp.put("excelResultValue", dealNull(excelAccountExportPO.getOtherSum()));
        map.put("otherSum", otherSumTemp);
        map.put("otherSum" + DATA_TYPE_SUFFIX, SalaryDataTypeEnum.STRING.getValue());
//        if (map.get("different").equals("false") && !otherSumTemp.get("acctResultValue").equals(otherSumTemp.get("excelResultValue"))) {
//            map.put("different", "true");
//        }
        if (map.get("different").equals("false") && SalaryEntityUtil.empty2Zero(otherSumTemp.get("acctResultValue").toString())
                .compareTo(SalaryEntityUtil.empty2Zero(otherSumTemp.get("excelResultValue").toString())) != 0) {
            map.put("different", "true");
        }

        Map<String, Object> totalTemp = Maps.newHashMap();
        totalTemp.put("acctResultValue", dealNull(accountExportPO.getTotal()));
        totalTemp.put("excelResultValue", dealNull(excelAccountExportPO.getTotal()));
        map.put("total", totalTemp);
        map.put("total" + DATA_TYPE_SUFFIX, SalaryDataTypeEnum.STRING.getValue());
//        if (map.get("different").equals("false") && !totalTemp.get("acctResultValue").equals(totalTemp.get("excelResultValue"))) {
//            map.put("different", "true");
//        }
        if (map.get("different").equals("false") && SalaryEntityUtil.empty2Zero(totalTemp.get("acctResultValue").toString())
                .compareTo(SalaryEntityUtil.empty2Zero(totalTemp.get("excelResultValue").toString())) != 0) {
            map.put("different", "true");
        }

        return map;
    }

    private static String dealNull(String data) {
        if (data == null || "0".equals(data) || "0.00".equals(data)) {
            return "";
        }
        return data;
    }
}
