package pwc.taxtech.atms.service.impl;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.google.common.collect.Lists;
import org.apache.commons.lang3.StringUtils;
import org.nutz.lang.Lang;
import org.nutz.lang.Strings;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import pwc.taxtech.atms.common.util.BeanUtil;
import pwc.taxtech.atms.common.util.HttpUtil;
import pwc.taxtech.atms.dao.*;
import pwc.taxtech.atms.dto.OperationResultDto;
import pwc.taxtech.atms.dto.ebsdto.*;
import pwc.taxtech.atms.dto.organization.DDSyncOrgInfo;
import pwc.taxtech.atms.dto.organization.OrgSyncData;
import pwc.taxtech.atms.entity.*;
import pwc.taxtech.atms.service.EbsApiService;
import pwc.taxtech.atms.vat.dao.*;
import pwc.taxtech.atms.vat.entity.*;

import javax.annotation.Resource;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.*;

@Service
public class EbsApiServiceImpl implements EbsApiService {

    @Resource
    private JournalEntryMapper journalEntryMapper;
    @Resource
    private TrialBalanceMapper trialBalanceMapper;
    @Resource
    private CashFlowMapper cashFlowMapper;
    @Resource
    private CashFlowFinalMapper cashFlowFinalMapper;
    @Resource
    private BalanceSheetMapper balanceSheetMapper;
    @Resource
    private BalanceSheetPrcMapper balanceSheetPrcMapper;
    @Resource
    private BalanceSheetFinalMapper balanceSheetFinalMapper;
    @Resource
    private BalanceSheetPrcFinalMapper balanceSheetPrcFinalMapper;
    @Resource
    private ProfitLossStatementMapper profitLossStatementMapper;
    @Resource
    private ProfitLossStatementPrcMapper profitLossStatementPrcMapper;
    @Resource
    private ProfitLossStatementFinalMapper profitLossStatementFinalMapper;
    @Resource
    private ProfitLossStatementPrcFinalMapper profitLossStatementPrcFinalMapper;
    @Resource
    private OrganizationAccountingRateMapper organizationAccountingRateMapper;
    @Resource
    private OrganizationMapper organizationMapper;
    @Resource
    private ProjectMapper projectMapper;
    @Resource
    private OrganizationEmployeeMapper organizationEmployeeMapper;
    @Resource
    private OrganizationExtraMapper organizationExtraMapper;
    @Resource
    private DataImportLogMapper dataImportLogMapper;
    @Resource
    private RegionMapper regionMapper;
    @Resource
    private DistributedIdService distributedIdService;
    @Resource
    private BeanUtil beanUtil;

    @Value("${org_sync_url}")
    private String orgSyncUrl;

    @Value("${org_sync_token}")
    private String token;

    private static final Logger logger = LoggerFactory.getLogger(EbsApiServiceImpl.class);

    @Override
    public void queryRemoteServerThenUpdateJE(Long id ,List<JournalEntryQueryDto> items) {
        long start = System.currentTimeMillis();
        logger.debug("start queryRemoteServerThenUpdateJE 日记账表");
        //判断数据是否存在
        if (items.size() == 0) {
            logger.error("empty EBS JournalEntry 日记账表 response, skip processing");
            return;
        }
        logger.debug("requestJEItems 日记账表条目:" + JSON.toJSONString(items));
        for (JournalEntryQueryDto a : items) {
            try {
                processJE(id,a);
            } catch (Exception e) {
                logger.error("break loop as catch:" + e, e);
            }
        }
        updateDataImportLog(id,items.size());
        logger.debug("end queryRemoteServerThenUpdateJE 日记账表,took [{}] ms", System.currentTimeMillis() - start);
    }

    @Override
    public void queryRemoteServerThenUpdateTB(Long id ,List<TrialBalanceQueryDto> items) {
        long start = System.currentTimeMillis();
        logger.debug("start queryRemoteServerThenUpdateTB 科目余额表");
        //判断数据是否存在
        if (items.size() == 0) {
            logger.error("empty EBS TrialBalance 科目余额表 response, skip processing");
            return;
        }
        logger.debug("requestTBItems 科目余额表条目:" + JSON.toJSONString(items));
        for (TrialBalanceQueryDto a : items) {
            try {
                processTB(id,a);
            } catch (Exception e) {
                logger.error("break loop as catch:" + e, e);
            }
        }
        updateDataImportLog(id,items.size());
        logger.debug("end queryRemoteServerThenUpdateTB 科目余额表,took [{}] ms", System.currentTimeMillis() - start);
    }

    @Override
    public void
    queryRemoteServerThenUpdateCF(Long id ,List<CashFlowQueryDto> items) {
        long start = System.currentTimeMillis();
        logger.debug("start queryRemoteServerThenUpdateCF 现金流量表");
        //判断数据是否存在
        if (items.size() == 0) {
            logger.error("empty EBS CashFlow 现金流量表 response, skip processing");
            return;
        }
        logger.debug("requestCFItems 现金流量表条目:" + JSON.toJSONString(items));
        for (CashFlowQueryDto a : items) {
            try {
                processCF(id,a);
            } catch (Exception e) {
                logger.error("break loop as catch:" + e, e);
            }
        }
        updateDataImportLog(id,items.size());
        logger.debug("end queryRemoteServerThenUpdateCF 现金流量表,took [{}] ms", System.currentTimeMillis() - start);
    }

    @Override
    public void queryRemoteServerThenUpdateBS(Long id ,List<BalanceSheetQueryDto> items) {
        long start = System.currentTimeMillis();
        logger.debug("start queryRemoteServerThenUpdateBS 资产负债表");
        //判断数据是否存在
        if (items.size() == 0) {
            logger.error("empty EBS BalanceSheet 资产负债表 response, skip processing");
            return;
        }
        logger.debug("requestBSItems 资产负债表条目:" + JSON.toJSONString(items));
        for (BalanceSheetQueryDto a : items) {
            try {
                processBS(id,a);
            } catch (Exception e) {
                logger.error("break loop as catch:" + e, e);
            }
        }
        updateDataImportLog(id,items.size());
        logger.debug("end queryRemoteServerThenUpdateBS 资产负债表,took [{}] ms", System.currentTimeMillis() - start);
    }

    @Override
    public void queryRemoteServerThenUpdateBSprc(Long id ,List<BalanceSheetPrcQueryDto> items) {
        long start = System.currentTimeMillis();
        logger.debug("start queryRemoteServerThenUpdateBSprc 资产负债表PRC");
        //判断数据是否存在
        if (items.size() == 0) {
            logger.error("empty EBS BSprc 资产负债表PRC response, skip processing");
            return;
        }
        logger.debug("requestBSprcItems 资产负债表PRC条目:" + JSON.toJSONString(items));
        for (BalanceSheetPrcQueryDto a : items) {
            try {
                processBSprc(id,a);
            } catch (Exception e) {
                logger.error("break loop as catch:" + e, e);
            }
        }
        updateDataImportLog(id,items.size());
        logger.debug("end queryRemoteServerThenUpdateBSprc 资产负债表PRC,took [{}] ms", System.currentTimeMillis() - start);
    }

    @Override
    public void queryRemoteServerThenUpdatePL(Long id ,List<ProfitLossStatementQueryDto> items) {
        long start = System.currentTimeMillis();
        logger.debug("start queryRemoteServerThenUpdatePL 利润表");
        //判断数据是否存在
        if (items.size() == 0) {
            logger.error("empty EBS ProfitLossStatement 利润表 response, skip processing");
            return;
        }
        logger.debug("requestPLItems 利润表条目:" + JSON.toJSONString(items));
        for (ProfitLossStatementQueryDto a : items) {
            try {
                processPL(id,a);
            } catch (Exception e) {
                logger.error("break loop as catch:" + e, e);
            }
        }
        updateDataImportLog(id,items.size());
        logger.debug("end queryRemoteServerThenUpdatePL 利润表,took [{}] ms", System.currentTimeMillis() - start);
    }

    @Override
    public void queryRemoteServerThenUpdatePLprc(Long id ,List<ProfitLossStatementPrcQueryDto> items) {
        long start = System.currentTimeMillis();
        logger.debug("start queryRemoteServerThenUpdatePLprc 利润表PRC");
        //判断数据是否存在
        if (items.size() == 0) {
            logger.error("empty EBS ProfitLossStatement 利润表PRC response, skip processing");
            return;
        }
        logger.debug("requestPLItems 利润表PRC条目:" + JSON.toJSONString(items));
        for (ProfitLossStatementPrcQueryDto a : items) {
            try {
                processPLprc(id,a);
            } catch (Exception e) {
                logger.error("break loop as catch:" + e, e);
            }
        }
        updateDataImportLog(id,items.size());
        logger.debug("end queryRemoteServerThenUpdatePLprc 利润表PRC,took [{}] ms", System.currentTimeMillis() - start);
    }

    @Override
    public void queryRemoteServerThenUpdateOAR(Long id ,List<OrganizationAccountingRateQueryDto> items) {
        long start = System.currentTimeMillis();
        logger.debug("start queryRemoteServerThenUpdateOAR 汇率表");
        //判断数据是否存在
        if (items.size() == 0) {
            logger.error("empty EBS OrganizationAccountingRate 汇率表 response, skip processing");
            return;
        }
        logger.debug("requestPLItems 汇率表:" + JSON.toJSONString(items));
        for (OrganizationAccountingRateQueryDto a : items) {
            try {
                processOAR(id,a);
            } catch (Exception e) {
                logger.error("break loop as catch:" + e, e);
            }
        }
        updateDataImportLog(id,items.size());
        logger.debug("end queryRemoteServerThenUpdateOAR 汇率表,took [{}] ms", System.currentTimeMillis() - start);
    }

    private void processJE(Long id,JournalEntryQueryDto item) {
        JournalEntryExample journalEntryExample = new JournalEntryExample();
        item.setTaskId(String.valueOf(id));
        //日记账头ID和日记账行号
        journalEntryExample.createCriteria().andHeaderIdEqualTo(item.getHeaderId()).andLineNumEqualTo(item.getLineNum()).andSourceEqualTo(item.getSource());
        List<JournalEntry> journalEntryList = journalEntryMapper.selectByExample(journalEntryExample);
        //唯一则更新否则插入
        JournalEntry journalEntry = new JournalEntry();
        if (journalEntryList.size() == 1) {
            //todo 待验证
            /*logger.debug("exist and update journalEntry headerId:{},lineNum:{},taskId:{}", item.getHeaderId(), item.getLineNum(),item.getTaskId());
            journalEntry = journalEntryList.get(0);
            populateFieldsJE(item, journalEntry);
            journalEntry.setId(journalEntryList.get(0).getId());
            journalEntryMapper.updateByPrimaryKeySelective(journalEntry);*/
        } else {
            logger.debug("miss and insert journalEntry headerId:{},lineNum:{},taskId:{}", item.getHeaderId(), item.getLineNum(),item.getTaskId());
            populateFieldsJE(item, journalEntry);
            journalEntry.setId(distributedIdService.nextId());
            journalEntry.setCreatedBy("");
            journalEntry.setCreatedDate(new Date());
            journalEntry.setCreateTime(new Date());
            journalEntryMapper.insertSelective(journalEntry);
        }
    }

    private void processTB(Long id,TrialBalanceQueryDto item) {
        TrialBalanceExample example = new TrialBalanceExample();
        item.setTaskId(String.valueOf(id));
        //机构编码和期间
        example.createCriteria().andSegment1EqualTo(item.getSegment1()).andPeriodEqualTo(convertPeriodStr2Int(item.getPeriod())).andTaskIdNotEqualTo(item.getTaskId());
        List<TrialBalance> itemList = trialBalanceMapper.selectByExample(example);
        //唯一则更新否则插入
        TrialBalance result = new TrialBalance();
        if (itemList.size() >0) {
            logger.debug("exist and delete TrialBalance EntityCode:{},Period:{},taskId:{}", item.getSegment1(), convertPeriodStr2Int(item.getPeriod()),item.getTaskId());
            trialBalanceMapper.deleteByExample(example);
        }
        logger.debug("insert TrialBalance EntityCode:{},Period:{},taskId:{}", item.getSegment1(), convertPeriodStr2Int(item.getPeriod()),item.getTaskId());
        populateFieldsTB(item, result);
        result.setId(distributedIdService.nextId());
        result.setCreateBy(getCurrentOperatorName(id));
        result.setCreateTime(new Date());
        trialBalanceMapper.insertSelective(result);
    }

    private void processCF(Long id,CashFlowQueryDto item) {
        CashFlowExample example = new CashFlowExample();
        item.setTaskId(String.valueOf(id));
        //机构编码和期间
        example.createCriteria().andEntityCodeEqualTo(item.getEntityCode()).andPeriodEqualTo(convertPeriodStr2Int(item.getPeriod())).andTaskIdNotEqualTo(item.getTaskId());
        List<CashFlow> itemList = cashFlowMapper.selectByExample(example);
        //唯一则更新否则插入
        CashFlow result = new CashFlow();
        if (itemList.size() >0) {
            logger.debug("exist and delete CashFlow EntityCode:{},Period:{},taskId:{}", item.getEntityCode(), item.getPeriod(),item.getTaskId());
            cashFlowMapper.deleteByExample(example);
        }
        logger.debug("insert CashFlow EntityCode:{},Period:{},taskId:{}", item.getEntityCode(), item.getPeriod(),item.getTaskId());
        populateFieldsCF(item, result);
        result.setId(distributedIdService.nextId());
        result.setCreateTime(new Date());
        result.setCreateBy(getCurrentOperatorName(id));
        cashFlowMapper.insertSelective(result);
        logger.debug("start to insert cashFlowFinal ");
        // 1、写入最终表
        CashFlowExample cashFlowExample = new CashFlowExample();
        cashFlowExample.createCriteria().andEntityCodeEqualTo(item.getEntityCode()).andPeriodEqualTo(result.getPeriod()).andTaskIdNotEqualTo(item.getTaskId());
        if (cashFlowFinalMapper.countByExample(cashFlowExample) > 0) {
            cashFlowFinalMapper.deleteByExample(cashFlowExample);
        }
        cashFlowFinalMapper.insertSelective(result);
    }

    private void processBS(Long id,BalanceSheetQueryDto item) {
        BalanceSheetExample example = new BalanceSheetExample();
        item.setTaskId(String.valueOf(id));
        //机构编码和期间
        example.createCriteria().andEntityCodeEqualTo(item.getEntityCode()).andPeriodEqualTo(convertPeriodStr2Int(item.getPeriod())).andTaskIdNotEqualTo(item.getTaskId());
        List<BalanceSheet> itemList = balanceSheetMapper.selectByExample(example);
        //唯一则更新否则插入
        BalanceSheet result = new BalanceSheet();
        if (itemList.size() >0) {
            logger.debug("exist and delete BalanceSheet EntityCode:{},Period:{},taskId:{}", item.getEntityCode(), item.getPeriod(),item.getTaskId());
            balanceSheetMapper.deleteByExample(example);
        }
        logger.debug("insert BalanceSheet EntityCode:{},Period:{},taskId:{}", item.getEntityCode(), item.getPeriod(),item.getTaskId());
        populateFieldsBS(item, result);
        result.setId(distributedIdService.nextId());
        result.setCreateBy(getCurrentOperatorName(id));
        result.setCreateTime(new Date());
        balanceSheetMapper.insertSelective(result);
        logger.debug("start to insert balanceSheetFinal ");
        // 1、写入最终表
        BalanceSheetExample balanceSheetExample = new BalanceSheetExample();
        balanceSheetExample.createCriteria().andEntityCodeEqualTo(item.getEntityCode()).andPeriodEqualTo(result.getPeriod()).andTaskIdNotEqualTo(item.getTaskId());
        if (balanceSheetFinalMapper.countByExample(balanceSheetExample) > 0) {
            balanceSheetFinalMapper.deleteByExample(balanceSheetExample);
        }
        balanceSheetFinalMapper.insertSelective(result);
    }


    private void processBSprc(Long id,BalanceSheetPrcQueryDto item) {
        BalanceSheetPrcExample example = new BalanceSheetPrcExample();
        item.setTaskId(String.valueOf(id));
        //机构编码和期间
        example.createCriteria().andEntityCodeEqualTo(item.getEntityCode()).andPeriodEqualTo(convertPeriodStr2Int(item.getPeriod())).andTaskIdNotEqualTo(item.getTaskId());
        List<BalanceSheetPrc> itemList = balanceSheetPrcMapper.selectByExample(example);
        //唯一则更新否则插入
        BalanceSheetPrc result = new BalanceSheetPrc();
        if (itemList.size() >0) {
            logger.debug("exist and delete BalanceSheetPrc EntityCode:{},Period:{},taskId:{}", item.getEntityCode(), item.getPeriod(),item.getTaskId());
            balanceSheetPrcMapper.deleteByExample(example);
        }
        logger.debug("insert BalanceSheetPrc EntityCode:{},Period:{},taskId:{}", item.getEntityCode(), item.getPeriod(),item.getTaskId());
        populateFieldsBSprc(item, result);
        result.setId(distributedIdService.nextId());
        result.setCreateBy(getCurrentOperatorName(id));
        result.setCreateTime(new Date());
        balanceSheetPrcMapper.insertSelective(result);
        // 1、写入最终表
        logger.debug("start to insert BalanceSheetPrcFinal ");
        BalanceSheetPrcExample balanceSheetPrcExample = new BalanceSheetPrcExample();
        balanceSheetPrcExample.createCriteria().andEntityCodeEqualTo(item.getEntityCode()).andPeriodEqualTo(result.getPeriod()).andTaskIdNotEqualTo(item.getTaskId());
        if (balanceSheetPrcFinalMapper.countByExample(balanceSheetPrcExample) > 0) {
            balanceSheetPrcFinalMapper.deleteByExample(balanceSheetPrcExample);
        }
        balanceSheetPrcFinalMapper.insertSelective(result);
    }

    private void processPL(Long id,ProfitLossStatementQueryDto item) {
        ProfitLossStatementExample example = new ProfitLossStatementExample();
        item.setTaskId(String.valueOf(id));
        //机构编码和期间
        example.createCriteria().andEntityCodeEqualTo(item.getEntityCode()).andPeriodEqualTo(convertPeriodStr2Int(item.getPeriod())).andTaskIdNotEqualTo(item.getTaskId());
        List<ProfitLossStatement> itemList = profitLossStatementMapper.selectByExample(example);
        //唯一则更新否则插入
        ProfitLossStatement result = new ProfitLossStatement();
        if (itemList.size() >0) {
            logger.debug("exist and delete ProfitLossStatement EntityCode:{},Period:{},taskId:{}", item.getEntityCode(), item.getPeriod(),item.getTaskId());
            profitLossStatementMapper.deleteByExample(example);
        }
        logger.debug("insert ProfitLossStatement EntityCode:{},Period:{},taskId:{}", item.getEntityCode(), item.getPeriod(),item.getTaskId());
        populateFieldsPLS(item, result);
        result.setId(distributedIdService.nextId());
        result.setCreateTime(new Date());
        result.setCreateBy(getCurrentOperatorName(id));
        profitLossStatementMapper.insertSelective(result);
        logger.debug("start to insert profitLossStatementFinal ");
        // 1、写入最终表
        ProfitLossStatementExample profitLossStatementExample = new ProfitLossStatementExample();
        profitLossStatementExample.createCriteria().andEntityCodeEqualTo(item.getEntityCode()).andPeriodEqualTo(result.getPeriod()).andTaskIdNotEqualTo(item.getTaskId());
        if (profitLossStatementFinalMapper.countByExample(profitLossStatementExample) > 0) {
            profitLossStatementFinalMapper.deleteByExample(profitLossStatementExample);
        }
        profitLossStatementFinalMapper.insertSelective(result);
    }

    private void processPLprc(Long id,ProfitLossStatementPrcQueryDto item) {
        ProfitLossStatementPrcExample example = new ProfitLossStatementPrcExample();
        item.setTaskId(String.valueOf(id));
        //机构编码和期间
        example.createCriteria().andEntityCodeEqualTo(item.getEntityCode()).andPeriodEqualTo(convertPeriodStr2Int(item.getPeriod())).andTaskIdNotEqualTo(item.getTaskId());
        List<ProfitLossStatementPrc> itemList = profitLossStatementPrcMapper.selectByExample(example);
        //唯一则更新否则插入
        ProfitLossStatementPrc result = new ProfitLossStatementPrc();
        if (itemList.size() >0) {
            logger.debug("exist and delete ProfitLossStatementPrc EntityCode:{},Period:{},taskId:{}", item.getEntityCode(), item.getPeriod(),item.getTaskId());
            profitLossStatementPrcMapper.deleteByExample(example);
        }
        logger.debug("insert ProfitLossStatementPrc EntityCode:{},Period:{},taskId:{}", item.getEntityCode(), item.getPeriod(),item.getTaskId());
        populateFieldsPLSprc(item, result);
        result.setId(distributedIdService.nextId());
        result.setCreateTime(new Date());
        result.setCreateBy(getCurrentOperatorName(id));
        profitLossStatementPrcMapper.insertSelective(result);
        logger.debug("start to insert profitLossStatementPrcFinal ");
        // 1、写入最终表
        ProfitLossStatementPrcExample profitLossStatementPrcExample = new ProfitLossStatementPrcExample();
        profitLossStatementPrcExample.createCriteria().andEntityCodeEqualTo(item.getEntityCode()).andPeriodEqualTo(result.getPeriod()).andTaskIdNotEqualTo(item.getTaskId());
        if (profitLossStatementPrcFinalMapper.countByExample(profitLossStatementPrcExample) > 0) {
            profitLossStatementPrcFinalMapper.deleteByExample(profitLossStatementPrcExample);
        }
        profitLossStatementPrcFinalMapper.insertSelective(result);
    }

    private void processOAR(Long id,OrganizationAccountingRateQueryDto item) {
        OrganizationAccountingRateExample example = new OrganizationAccountingRateExample();
        item.setTaskId(String.valueOf(id));
        //期间
        example.createCriteria().andPeriodEqualTo(convertPeriodStr2Int(item.getPeriod())).andTaskIdNotEqualTo(item.getTaskId());
        List<OrganizationAccountingRate> itemList = organizationAccountingRateMapper.selectByExample(example);
        //唯一则更新否则插入
        OrganizationAccountingRate result = new OrganizationAccountingRate();
        if (itemList.size() >0) {
            logger.debug("exist and delete OrganizationAccountingRate Period:{},taskId:{}", item.getPeriod(),item.getTaskId());
            organizationAccountingRateMapper.deleteByExample(example);
        }
        logger.debug("insert OrganizationAccountingRate Period:{},taskId:{}", item.getPeriod(),item.getTaskId());
        populateFieldsOAR(item, result);
        result.setId(distributedIdService.nextId());
        result.setCreateTime(new Date());
        result.setCreateBy(getCurrentOperatorName(id));
        organizationAccountingRateMapper.insertSelective(result);
    }

    private void populateFieldsJE(JournalEntryQueryDto item, JournalEntry result) {
        Integer originPeriod=convertPeriodStr2Int(item.getPeriod());
        Integer convertPeriod=convertPeriod12(item.getPeriod());
        result.setOrganizationId(getOrganizationByEbsCode(item.getSegment1()).getId());
        result.setProjectId(getProjectByEbsCodeAndPeriod(result.getOrganizationId(),convertPeriod).getId());
        result.setDate(ebsDateFormat(item.getDate()));
        result.setSource(trimLimit(item.getSource(), 20));
        result.setLedgerId(trimLimit(item.getLedgerId(), 128));
        result.setLedgerName(trimLimit(item.getLedgerName(), 300));
        result.setCurrencyCode(trimLimit(item.getCurrencyCode(), 20));
        result.setStatus(item.getStatus());
        result.setHeaderId(trimLimit(item.getHeaderId(), 128));
        result.setLineNum(trimLimit(item.getLineNum(), 300));
        result.setApprovalStatus(trimLimit(item.getApprovalStatus(), 20));
        result.setPostedStatus(trimLimit(item.getPostedStatus(), 20));
        result.setPeriod(originPeriod);
        result.setAccountingDate(ebsDateFormat(item.getAccountingDate()));
        result.setJournalSource(trimLimit(item.getJournalSource(), 20));
        result.setCategory(trimLimit(item.getCategory(), 50));
        result.setName(trimLimit(item.getName(), 300));
        result.setVoucherNum(trimLimit(item.getVoucherNum(), 128));
        result.setDescription(trimLimit(item.getDescription(), 500));
        result.setSegment1(trimLimit(item.getSegment1(), 300));
        result.setSegment2(trimLimit(item.getSegment2(), 300));
        result.setSegment3(trimLimit(item.getSegment3(), 300));
        result.setSegment4(trimLimit(item.getSegment4(), 300));
        result.setSegment5(trimLimit(item.getSegment5(), 300));
        result.setSegment6(trimLimit(item.getSegment6(), 300));
        result.setSegment7(trimLimit(item.getSegment7(), 300));
        result.setSegment8(trimLimit(item.getSegment8(), 300));
        result.setSegment9(trimLimit(item.getSegment9(), 300));
        result.setSegment10(trimLimit(item.getSegment10(), 300));
        result.setSegment1Name(trimLimit(item.getSegment1Name(), 300));
        result.setSegment2Name(trimLimit(item.getSegment2Name(), 300));
        result.setSegment3Name(trimLimit(item.getSegment3Name(), 300));
        result.setSegment4Name(trimLimit(item.getSegment4Name(), 300));
        result.setSegment5Name(trimLimit(item.getSegment5Name(), 300));
        result.setSegment6Name(trimLimit(item.getSegment6Name(), 300));
        result.setSegment7Name(trimLimit(item.getSegment7Name(), 300));
        result.setSegment8Name(trimLimit(item.getSegment8Name(), 300));
        result.setSegment9Name(trimLimit(item.getSegment9Name(), 300));
        result.setSegment10Name(trimLimit(item.getSegment10Name(), 300));
        result.setJournalCurrencyCode(trimLimit(item.getJournalCurrencyCode(), 20));
        result.setSobCurrencyCode(trimLimit(item.getSobCurrencyCode(), 20));
        result.setAccountedDr(Optional.ofNullable(item.getAccountedDr())
                .map(x -> x.setScale(4, RoundingMode.HALF_UP))
                .orElse(BigDecimal.ZERO));
        result.setAccountedCr(Optional.ofNullable(item.getAccountedCr())
                .map(x -> x.setScale(4, RoundingMode.HALF_UP))
                .orElse(BigDecimal.ZERO));
        result.setEnteredDr(Optional.ofNullable(item.getEnteredDr())
                .map(x -> x.setScale(4, RoundingMode.HALF_UP))
                .orElse(BigDecimal.ZERO));
        result.setEnteredCr(Optional.ofNullable(item.getEnteredCr())
                .map(x -> x.setScale(4, RoundingMode.HALF_UP))
                .orElse(BigDecimal.ZERO));
        result.setCfItem(trimLimit(item.getCfItem(), 50));
        result.setAttribute1(trimLimit(item.getAttribute1(), 300));
        result.setAttribute2(ebsDateFormat(item.getAttribute2()));
        result.setAttribute3(trimLimit(item.getAttribute3(), 300));
        result.setAttribute4(trimLimit(item.getAttribute4(), 300));
        result.setAttribute5(trimLimit(item.getAttribute5(), 300));
        result.setAttribute6(trimLimit(item.getAttribute6(), 300));
        result.setAttribute7(trimLimit(item.getAttribute7(), 300));
        result.setAttribute8(trimLimit(item.getAttribute8(), 300));
        result.setAttribute9(trimLimit(item.getAttribute9(), 300));
        result.setAttribute10(trimLimit(item.getAttribute10(), 300));
        result.setAttribute11(trimLimit(item.getAttribute11(), 300));
        result.setAttribute12(trimLimit(item.getAttribute12(), 300));
        result.setAttribute13(trimLimit(item.getAttribute13(), 300));
        result.setAttribute14(trimLimit(item.getAttribute14(), 300));
        result.setAttribute15(trimLimit(item.getAttribute15(), 300));
        result.setAttribute16(trimLimit(item.getAttribute16(), 300));
        result.setLateUpdatedBy(trimLimit(item.getLateUpdatedBy(), 50));
        result.setLateUpdatedDate(ebsDateFormat(item.getLateUpdatedDate()));
        result.setUpdateTime(new Date());
        result.setCreatedBy(item.getCreatedBy());
        result.setCreatedDate(ebsDateFormat(item.getCreatedDate()));
        result.setTaskId(trimLimit(item.getTaskId(), 128));
        result.setTmsPeriod(convertPeriod);
    }

    private void populateFieldsTB(TrialBalanceQueryDto item, TrialBalance result) {
        Integer originPeriod=convertPeriodStr2Int(item.getPeriod());
        Integer convertPeriod=convertPeriod12(item.getPeriod());
        result.setOrganizationId(getOrganizationByEbsCode(item.getSegment1()).getId());
        result.setProjectId(getProjectByEbsCodeAndPeriod(result.getOrganizationId(),convertPeriod).getId());
        result.setDate(ebsDateFormat(item.getDate()));
        result.setSource(trimLimit(item.getSource(), 20));
        result.setPeriod(originPeriod);
        result.setLedgerId(trimLimit(item.getLedgerId(), 128));
        result.setLedgerName(trimLimit(item.getLedgerName(), 300));
        result.setCurrencyCode(trimLimit(item.getCurrencyCode(), 20));
        result.setStatus(item.getStatus());
        result.setCategory(trimLimit(item.getCategory(), 10));
        result.setAccountCategory(trimLimit(item.getAccountCategory(), 20));
        result.setAcctCode1(trimLimit(item.getAcctCode1(), 300));
        result.setAcctName1(trimLimit(item.getAcctName1(), 300));
        result.setAcctName2(trimLimit(item.getAcctName2(), 300));
        result.setAcctName3(trimLimit(item.getAcctName3(), 300));
        result.setSegment1(trimLimit(item.getSegment1(), 300));
        result.setSegment2(trimLimit(item.getSegment2(), 300));
        result.setSegment3(trimLimit(item.getSegment3(), 300));
        result.setSegment4(trimLimit(item.getSegment4(), 300));
        result.setSegment5(trimLimit(item.getSegment5(), 300));
        result.setSegment6(trimLimit(item.getSegment6(), 300));
        result.setSegment7(trimLimit(item.getSegment7(), 300));
        result.setSegment8(trimLimit(item.getSegment8(), 300));
        result.setSegment9(trimLimit(item.getSegment9(), 300));
        result.setSegment10(trimLimit(item.getSegment10(), 300));
        result.setSegment1Name(trimLimit(item.getSegment1Name(), 300));
        result.setSegment2Name(trimLimit(item.getSegment2Name(), 300));
        result.setSegment3Name(trimLimit(item.getSegment3Name(), 300));
        result.setSegment4Name(trimLimit(item.getSegment4Name(), 300));
        result.setSegment5Name(trimLimit(item.getSegment5Name(), 300));
        result.setSegment6Name(trimLimit(item.getSegment6Name(), 300));
        result.setSegment7Name(trimLimit(item.getSegment7Name(), 300));
        result.setSegment8Name(trimLimit(item.getSegment8Name(), 300));
        result.setSegment9Name(trimLimit(item.getSegment9Name(), 300));
        result.setSegment10Name(trimLimit(item.getSegment10Name(), 300));
        result.setBegBal(Optional.ofNullable(item.getBegBal())
                .map(x -> x.setScale(4, RoundingMode.HALF_UP))
                .orElse(BigDecimal.ZERO));
        result.setPeriodDr(Optional.ofNullable(item.getPeriodDr())
                .map(x -> x.setScale(4, RoundingMode.HALF_UP))
                .orElse(BigDecimal.ZERO));
        result.setPeriodCr(Optional.ofNullable(item.getPeriodCr())
                .map(x -> x.setScale(4, RoundingMode.HALF_UP))
                .orElse(BigDecimal.ZERO));
        result.setEndBal(Optional.ofNullable(item.getEndBal())
                .map(x -> x.setScale(4, RoundingMode.HALF_UP))
                .orElse(BigDecimal.ZERO));
        result.setQtdDr(Optional.ofNullable(item.getQtdDr())
                .map(x -> x.setScale(4, RoundingMode.HALF_UP))
                .orElse(BigDecimal.ZERO));
        result.setQtdCr(Optional.ofNullable(item.getQtdCr())
                .map(x -> x.setScale(4, RoundingMode.HALF_UP))
                .orElse(BigDecimal.ZERO));
        result.setYtdDr(Optional.ofNullable(item.getYtdDr())
                .map(x -> x.setScale(4, RoundingMode.HALF_UP))
                .orElse(BigDecimal.ZERO));
        result.setYtdCr(Optional.ofNullable(item.getYtdCr())
                .map(x -> x.setScale(4, RoundingMode.HALF_UP))
                .orElse(BigDecimal.ZERO));
        result.setBegBalBeq(Optional.ofNullable(item.getBegBalBeq())
                .map(x -> x.setScale(4, RoundingMode.HALF_UP))
                .orElse(BigDecimal.ZERO));
        result.setPeriodDrBeq(Optional.ofNullable(item.getPeriodDrBeq())
                .map(x -> x.setScale(4, RoundingMode.HALF_UP))
                .orElse(BigDecimal.ZERO));
        result.setPeriodCrBeq(Optional.ofNullable(item.getPeriodCrBeq())
                .map(x -> x.setScale(4, RoundingMode.HALF_UP))
                .orElse(BigDecimal.ZERO));
        result.setEndBalBeq(Optional.ofNullable(item.getEndBalBeq())
                .map(x -> x.setScale(4, RoundingMode.HALF_UP))
                .orElse(BigDecimal.ZERO));
        result.setQtdDrBeq(Optional.ofNullable(item.getQtdDrBeq())
                .map(x -> x.setScale(4, RoundingMode.HALF_UP))
                .orElse(BigDecimal.ZERO));
        result.setQtdCrBeq(Optional.ofNullable(item.getQtdCrBeq())
                .map(x -> x.setScale(4, RoundingMode.HALF_UP))
                .orElse(BigDecimal.ZERO));
        result.setYtdDrBeq(Optional.ofNullable(item.getYtdDrBeq())
                .map(x -> x.setScale(4, RoundingMode.HALF_UP))
                .orElse(BigDecimal.ZERO));
        result.setYtdCrBeq(Optional.ofNullable(item.getYtdCrBeq())
                .map(x -> x.setScale(4, RoundingMode.HALF_UP))
                .orElse(BigDecimal.ZERO));
        result.setUpdateTime(new Date());
        result.setTaskId(trimLimit(item.getTaskId(), 128));
        result.setTmsPeriod(convertPeriod);
    }

    private void populateFieldsCF(CashFlowQueryDto item, CashFlow result) {
        Integer originPeriod=convertPeriodStr2Int(item.getPeriod());
        Integer convertPeriod=convertPeriod12(item.getPeriod());
        result.setOrganizationId(getOrganizationByEbsCode(item.getEntityCode()).getId());
        result.setProjectId(getProjectByEbsCodeAndPeriod(result.getOrganizationId(),convertPeriod).getId());
        result.setDate(ebsDateFormat(item.getDate()));
        result.setSource(trimLimit(item.getSource(), 128));
        result.setPeriod(originPeriod);
        result.setStatus(item.getStatus());
        result.setLedgerId(trimLimit(item.getLedgerId(), 128));
        result.setLedgerName(trimLimit(item.getLedgerName(), 300));
        result.setLedgerCurrencyCode(trimLimit(item.getLedgerCurrencyCode(), 128));
        result.setEntityCode(trimLimit(item.getEntityCode(), 128));
        result.setEntityName(trimLimit(item.getEntityName(), 300));
        result.setCategory(trimLimit(item.getCategory(), 300));
        result.setFrequency(trimLimit(item.getFrequency(), 300));
        result.setItemName(trimLimit(item.getItemName(), 300));
        result.setItemName2(trimLimit(item.getItemName2(), 300));
        result.setPeriodAmt(Optional.ofNullable(item.getPeriodAmt())
                .map(x -> x.setScale(4, RoundingMode.HALF_UP))
                .orElse(BigDecimal.ZERO));
        result.setYtdAmt(Optional.ofNullable(item.getYtdAmt())
                .map(x -> x.setScale(4, RoundingMode.HALF_UP))
                .orElse(BigDecimal.ZERO));
        result.setUpdateTime(new Date());
        result.setTaskId(trimLimit(item.getTaskId(), 128));
        result.setTmsPeriod(convertPeriod);
    }

    private void populateFieldsBS(BalanceSheetQueryDto item, BalanceSheet result) {
        Integer originPeriod=convertPeriodStr2Int(item.getPeriod());
        Integer convertPeriod=convertPeriod12(item.getPeriod());
        result.setOrganizationId(getOrganizationByEbsCode(item.getEntityCode()).getId());
        result.setProjectId(getProjectByEbsCodeAndPeriod(result.getOrganizationId(),convertPeriod).getId());
        result.setDate(ebsDateFormat(item.getDate()));
        result.setSource(trimLimit(item.getSource(), 20));
        result.setPeriod(originPeriod);
        result.setStatus(item.getStatus());
        result.setLedgerId(trimLimit(item.getLedgerId(), 128));
        result.setLedgerName(trimLimit(item.getLedgerName(), 300));
        result.setLedgerCurrencyCode(trimLimit(item.getLedgerCurrencyCode(), 20));
        result.setEntityCode(trimLimit(item.getEntityCode(), 300));
        result.setEntityName(trimLimit(item.getEntityName(), 300));
        result.setCategory(trimLimit(item.getCategory(), 300));
        result.setFrequency(trimLimit(item.getFrequency(), 300));
        result.setItemName(trimLimit(item.getItemName(), 300));
        result.setEndBal(Optional.ofNullable(item.getEndBal())
                .map(x -> x.setScale(4, RoundingMode.HALF_UP))
                .orElse(BigDecimal.ZERO));
        result.setBegBal(Optional.ofNullable(item.getBegBal())
                .map(x -> x.setScale(4, RoundingMode.HALF_UP))
                .orElse(BigDecimal.ZERO));
        result.setUpdateTime(new Date());
        result.setTaskId(trimLimit(item.getTaskId(), 128));
        result.setTmsPeriod(convertPeriod);
    }

    private void populateFieldsBSprc(BalanceSheetPrcQueryDto item, BalanceSheetPrc result) {
        Integer originPeriod=convertPeriodStr2Int(item.getPeriod());
        Integer convertPeriod=convertPeriod12(item.getPeriod());
        result.setOrganizationId(getOrganizationByEbsCode(item.getEntityCode()).getId());
        result.setProjectId(getProjectByEbsCodeAndPeriod(result.getOrganizationId(),convertPeriod).getId());
        result.setDate(ebsDateFormat(item.getDate()));
        result.setSource(trimLimit(item.getSource(), 20));
        result.setPeriod(originPeriod);
        result.setStatus(item.getStatus());
        result.setLedgerId(trimLimit(item.getLedgerId(), 128));
        result.setLedgerName(trimLimit(item.getLedgerName(), 300));
        result.setLedgerCurrencyCode(trimLimit(item.getLedgerCurrencyCode(), 20));
        result.setEntityCode(trimLimit(item.getEntityCode(), 300));
        result.setEntityName(trimLimit(item.getEntityName(), 300));
        result.setCategory(trimLimit(item.getCategory(), 300));
        result.setFrequency(trimLimit(item.getFrequency(), 300));
        result.setItemName(trimLimit(item.getItemName(), 300));
        result.setEndBal(Optional.ofNullable(item.getEndBal())
                .map(x -> x.setScale(4, RoundingMode.HALF_UP))
                .orElse(BigDecimal.ZERO));
        result.setBegBal(Optional.ofNullable(item.getBegBal())
                .map(x -> x.setScale(4, RoundingMode.HALF_UP))
                .orElse(BigDecimal.ZERO));
        result.setTmsPeriod(convertPeriod);
        result.setTaskId(trimLimit(item.getTaskId(), 128));
        result.setUpdateTime(new Date());
    }

    private void populateFieldsPLS(ProfitLossStatementQueryDto item, ProfitLossStatement result) {
        Integer originPeriod=convertPeriodStr2Int(item.getPeriod());
        Integer convertPeriod=convertPeriod12(item.getPeriod());
        result.setOrganizationId(getOrganizationByEbsCode(item.getEntityCode()).getId());
        result.setProjectId(getProjectByEbsCodeAndPeriod(result.getOrganizationId(),convertPeriod).getId());
        result.setDate(ebsDateFormat(item.getDate()));
        result.setSource(trimLimit(item.getSource(), 20));
        result.setPeriod(originPeriod);
        result.setStatus(item.getStatus());
        result.setLedgerId(trimLimit(item.getLedgerId(), 128));
        result.setLedgerName(trimLimit(item.getLedgerName(), 300));
        result.setLedgerCurrencyCode(trimLimit(item.getLedgerCurrencyCode(), 20));
        result.setEntityCode(trimLimit(item.getEntityCode(), 300));
        result.setEntityName(trimLimit(item.getEntityName(), 300));
        result.setCategory(trimLimit(item.getCategory(), 300));
        result.setFrequency(trimLimit(item.getFrequency(), 300));
        result.setItemName(trimLimit(item.getItemName(), 300));
        result.setPeriodAmt(Optional.ofNullable(item.getPeriodAmt())
                .map(x -> x.setScale(4, RoundingMode.HALF_UP))
                .orElse(BigDecimal.ZERO));
        result.setYtdAmt(Optional.ofNullable(item.getYtdAmt())
                .map(x -> x.setScale(4, RoundingMode.HALF_UP))
                .orElse(BigDecimal.ZERO));
        result.setTaskId(trimLimit(item.getTaskId(), 128));
        result.setTmsPeriod(convertPeriod);
        result.setUpdateTime(new Date());
    }

    private void populateFieldsPLSprc(ProfitLossStatementPrcQueryDto item, ProfitLossStatementPrc result) {
        Integer originPeriod=convertPeriodStr2Int(item.getPeriod());
        Integer convertPeriod=convertPeriod12(item.getPeriod());
        result.setOrganizationId(getOrganizationByEbsCode(item.getEntityCode()).getId());
        result.setProjectId(getProjectByEbsCodeAndPeriod(result.getOrganizationId(),convertPeriod).getId());
        result.setDate(ebsDateFormat(item.getDate()));
        result.setSource(trimLimit(item.getSource(), 20));
        result.setPeriod(originPeriod);
        result.setStatus(item.getStatus());
        result.setLedgerId(trimLimit(item.getLedgerId(), 128));
        result.setLedgerName(trimLimit(item.getLedgerName(), 300));
        result.setLedgerCurrencyCode(trimLimit(item.getLedgerCurrencyCode(), 20));
        result.setEntityCode(trimLimit(item.getEntityCode(), 300));
        result.setEntityName(trimLimit(item.getEntityName(), 300));
        result.setCategory(trimLimit(item.getCategory(), 300));
        result.setFrequency(trimLimit(item.getFrequency(), 300));
        result.setItemName(trimLimit(item.getItemName(), 300));
        result.setPeriodAmt(Optional.ofNullable(item.getPeriodAmt())
                .map(x -> x.setScale(4, RoundingMode.HALF_UP))
                .orElse(BigDecimal.ZERO));
        result.setYtdAmt(Optional.ofNullable(item.getYtdAmt())
                .map(x -> x.setScale(4, RoundingMode.HALF_UP))
                .orElse(BigDecimal.ZERO));
        result.setTaskId(trimLimit(item.getTaskId(), 128));
        result.setUpdateTime(new Date());
        result.setTmsPeriod(convertPeriod);
    }

    private void populateFieldsOAR(OrganizationAccountingRateQueryDto item, OrganizationAccountingRate result) {
        //汇率表period存放格式原始yyyyMMdd
        Integer convertPeriod=convertPeriodStr2Int(item.getPeriod());
        result.setDate(ebsDateFormat(item.getDate()));
        result.setSource(trimLimit(item.getSource(), 128));
        result.setPeriod(convertPeriod);
        result.setConvertionType(trimLimit(item.getConvertionType(), 100));
        result.setCurrencyFrom(trimLimit(item.getCurrencyFrom(), 10));
        result.setCurrencyTo(trimLimit(item.getCurrencyTo(), 10));
        result.setEndDate(ebsDateFormat(item.getInvalidDate()));
        result.setRate(item.getRate().floatValue());
        result.setTaskId(trimLimit(item.getTaskId(), 128));
        result.setUpdateTime(new Date());
    }
    @Override
    public void queryRemoteServerThenUpdateOrg(Long id , List<OrganizationQueryDto> items) {
        long start = System.currentTimeMillis();
        logger.debug("start queryRemoteServerThenUpdateOrg 机构表");
        //判断数据是否存在
        if (items.size() == 0) {
            logger.error("empty EBS Organization 机构表 response, skip processing");
            return;
        }
        logger.debug("organization 汇率表:" + JSON.toJSONString(items));
        for (OrganizationQueryDto a : items) {
            try {
                processORG(a);
            } catch (Exception e) {
                logger.error("break loop as catch:" + e, e);
            }
        }
        updateDataImportLog(id,items.size());
        logger.debug("end queryRemoteServerThenUpdateOrg 机构表,took [{}] ms", System.currentTimeMillis() - start);
    }

    @Override
    public void changeCallBackStatus(EbsCallBackDto ebsCallBackDto) {
        DataImportLog dataImportLog = new DataImportLog();
        dataImportLog.setId(ebsCallBackDto.getTaskId());
        dataImportLog.setImportResult(ebsCallBackDto.getTaskStatus().equals("S")?true:false);
        dataImportLog.setErrorMsg(ebsCallBackDto.getTaskDesc());
        dataImportLog.setUpdateTime(new Date());
        int res = dataImportLogMapper.updateByPrimaryKeySelective(dataImportLog);
        if (res < 0) {
            logger.warn(String.format("warn callBack end [%s]", ebsCallBackDto.getTaskId()));
        }
    }

    private void processORG(OrganizationQueryDto a) {
        // 机构信息
        OrganizationExample organizationExample = new OrganizationExample();
        organizationExample.createCriteria().andTaxPayerNumberEqualTo(a.getTaxPayerNumber());
        List<Organization> orgs = organizationMapper.selectByExample(organizationExample);
        Organization org = beanUtil.copyProperties(a,new Organization());
        OrganizationExample orgExample = new OrganizationExample();
        orgExample.createCriteria().andNameEqualTo(a.getParentName());
        List<Organization> orgParents = organizationMapper.selectByExample(organizationExample);
        String orgId = "";
        if(orgParents.size()>0){
            org.setParentId(orgParents.get(0).getId());
        }

        if(orgs.size()<1){
            orgId = UUID.randomUUID().toString();
            org.setId(orgId);
            org.setApiUpdateFlag(true);
            organizationMapper.insertSelective(org);
        }else{
            orgId = orgs.get(0).getId();
            org.setId(orgs.get(0).getId());
            org.setApiUpdateFlag(true);
            org.setUpdateTime(new Date());
            organizationMapper.updateByPrimaryKeySelective(org);
        }
        // 机构其他信息
        OrganizationExtraExample organizationExtraExample = new OrganizationExtraExample();
        organizationExtraExample.createCriteria().andOrganizationIdEqualTo(org.getId());
        List<OrganizationExtra> orgExs = organizationExtraMapper.selectByExample(organizationExtraExample);
        OrganizationExtra orgEx = beanUtil.copyProperties(a,new OrganizationExtra());
        orgEx.setReportingCurrency(a.getCurrencyCode());
        if(orgExs.size()<1){
            orgEx.setId(distributedIdService.nextId());
            orgEx.setOrganizationId(orgId);
            organizationExtraMapper.insertSelective(orgEx);
        }else{
            orgEx.setId(orgExs.get(0).getId());
            orgEx.setOrganizationId(orgId);
            orgEx.setUpdateTime(new Date());
            organizationExtraMapper.updateByExampleSelective(orgEx,organizationExtraExample);
        }
        // 雇员信息
        OrganizationEmployee oe = new OrganizationEmployee();
        oe.setId(distributedIdService.nextId());
        oe.setOrganizationId(orgId);
        oe.setEmployeesNumEnd(a.getStaffSize());
        organizationEmployeeMapper.insertSelective(oe);
    }

    private void updateDataImportLog(Long id, int size) {
        DataImportLog dataImportLogTemp = dataImportLogMapper.selectByPrimaryKey(id);
        DataImportLog dataImportLog = new DataImportLog();
        dataImportLog.setId(id);
        dataImportLog.setRecordSize((dataImportLogTemp==null?0:dataImportLogTemp.getRecordSize())+size);
        dataImportLog.setImportResult(true);
        dataImportLog.setUpdateTime(new Date());
        int res = dataImportLogMapper.updateByPrimaryKeySelective(dataImportLog);
        if (res < 0) {
            logger.warn(String.format("无调用记录[%s]", id));
        }
    }

    @Override
    public OperationResultDto syncOrg() {
        Map<String, String> headers = new HashMap<>();
        headers.put("token", token);
        headers.put("Content-Type", "application/x-www-form-urlencoded");
        headers.put("Idap", "eddie.wu_v");
        int pageSize = 1;
        List<OrgSyncData> failObjs = Lists.newArrayList();
        int totalCount = 0;
        int success = 0;
        try {
            for (int i = 1; i <= pageSize; i++) {
                String response = HttpUtil.get(orgSyncUrl + "?currentPage=" + i, headers);
                logger.info("机构信息同步记录:" + response);
                DDSyncOrgInfo ddSyncOrgInfo = JSONObject.parseObject(response, DDSyncOrgInfo.class);
                pageSize = ddSyncOrgInfo.getTotalPage();
                totalCount = ddSyncOrgInfo.getTotalCount();
                List<OrgSyncData> orgSyncDatas = ddSyncOrgInfo.getData();
                for (OrgSyncData osd : orgSyncDatas) {
                    OrganizationExample example = new OrganizationExample();
                    example.createCriteria().andNameEqualTo(osd.getNameCN());
                    Organization o = new Organization();
                    o.setClientCode(osd.getCode());
                    o.setCode(osd.getCode());
                    o.setEnterpriseAccountCode(String.valueOf(osd.getSobId()));
                    o.setEnterpriseAccountName(osd.getSobName());
                    o.setCurrencyCode(osd.getCurrencyCode());
                    o.setLegalEntity(osd.getLegalEntity());
                    o.setLegalPersonName(osd.getLegalRepresentative());
                    o.setAddress(osd.getAddress());
                    o.setCreateTime(osd.getGmtCreate());
                    o.setUpdateTime(osd.getGmtModified());
                    o.setPsCode(osd.getPsCode());
                    RegionExample regionExample = new RegionExample();
                    regionExample.createCriteria().andShortNameEqualTo(osd.getCompanyLocation());
                    List<Region> regions = regionMapper.selectByExample(regionExample);
                    if (regions.size() > 0) {
                        o.setRegionId(regions.get(0).getId());
                    }
                    if (organizationMapper.countByExample(example) < 1) {
                        failObjs.add(osd);
                    }
                    success += organizationMapper.updateByExampleSelective(o, example);
                }
            }
            logger.info("同步未匹配的机构记录:"+ JSON.toJSONString(failObjs));
        } catch (Exception e) {
            logger.error(String.format("机构信息同步异常:[%s]", e.getMessage()), e);
        }
        String msg = String.format("主数据中共[%s]条记录;成功匹配[%s]条;未匹配内容为[%s]",totalCount,success,JSON.toJSONString(failObjs));
        return OperationResultDto.success(msg);
    }

    /**
     * 获取操作人信息
     * @param id
     * @return
     */
    private String getCurrentOperatorName(Long id){
        DataImportLog dataImportLog= dataImportLogMapper.selectByPrimaryKey(id);
        String operator=dataImportLog!=null?dataImportLog.getOperator():"";
        return  operator;
    }

    /**
     * 获取格式化时间
     * 返回时间类型 yyyy-MM-dd HH:mm:ss
     * @param date
     * @return
     */
    private Date ebsDateFormat(String date){
        if(date!=null){
            try {
                Integer x=  date.split("-").length-1;
                SimpleDateFormat simpleDateFormat=null;
                Date dateFm=null;
                if(x==1) {
                    simpleDateFormat=new SimpleDateFormat("yyyy-MM");
                    dateFm=simpleDateFormat.parse(date);
                    return dateFm;
                }
                Integer y=  date.split(":").length-1;
                if(y==2) {
                    simpleDateFormat=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
                    dateFm=simpleDateFormat.parse(date);
                    return dateFm;
                }
                if(x==2) {
                    simpleDateFormat=new SimpleDateFormat("yyyy-MM-dd");
                    dateFm=simpleDateFormat.parse(date);
                    return dateFm;
                }
            }catch (ParseException px){
                px.printStackTrace();
            }
        }
        return  null;
    }

    /**对拓展字段进行查询赋值
     * 根据Ebs返回的数据机构编码查询到具体机构
     * @param code
     * @return
     */
    private Organization getOrganizationByEbsCode(String code){
        OrganizationExample example=new OrganizationExample();
        example.createCriteria().andCodeEqualTo(code);
        List<Organization> list=organizationMapper.selectByExample(example);
        Organization organization=new Organization();
        organization.setId("");
        if(list.size()>0){
            organization.setId(list.get(0).getId());
        }
        return organization;
    }

    /**
     * *对拓展字段进行查询赋值
     * 根据Ebs返回的数据机构编码和期间查询到具体机构,期间到年yyyy=period/100
     * @param orgId
     * @param period
     * @return
     */
    private Project getProjectByEbsCodeAndPeriod(String orgId,Integer period){
        ProjectExample example=new ProjectExample();
        example.createCriteria().andOrganizationIdEqualTo(orgId).andYearEqualTo(period/100);
        List<Project> list=projectMapper.selectByExample(example);
        Project project=new Project();
        project.setId("");
        if(list.size()>0){
            project.setId(list.get(0).getId());
        }
        return project;
    }

    /**
     * 期间格式转换为原始的int类型
     * @param periodStr
     * @return
     */
    private Integer convertPeriodStr2Int(String periodStr){
        periodStr=StringUtils.replace(periodStr, "-", "");
        Integer period=Integer.parseInt(periodStr);
        return period;
    }

    /**
     * 期间格式转换yyyy13均改为yyyy12
     * 返回的数据与用户在税务系统选择的期间需一致,
     * 但用户选择12期时请求的数据应为YYYY-12和YYYY-13即12期和13期的数据,
     * EBS返回的数据可以包含YYYY-12和YYYY-13
     * @param periodStr
     * @return
     */
    private Integer convertPeriod12(String periodStr){
        Integer period= convertPeriodStr2Int(periodStr);
        if(period%100>12){
            period= (period/100)*100+12;
        }
        return period;
    }

    /**
     * Trim字符串,并限定字符串的长度. 如果是输入值是空指针,会返回空字符串
     */
    public String trimLimit(String str, int limit) {
        if (Strings.isBlank(str)) {
            return "";
        }
        String tmp = str.trim();
        String result = cutString(tmp, limit);
        if (result == null) {
            result = "";
        }
        return result;
    }

    /**
     * 限定字符串的长度.
     */
    public String cutString(String s, int length) {
        if (Lang.isEmpty(length) || Lang.isEmpty(s)) {
            return "";
        } else if (s.length() <= length) {
            return s;
        } else {
            return s.substring(0, length);
        }
    }
}