package com.brilliance.isc.common.bop.cfa.cfabop.service.impl;

import com.brilliance.mda.runtime.mda.util.Dates;
import com.brilliance.mda.runtime.mda.util.MdaUtils;
import com.brilliance.mda.runtime.mda.util.Strings;
import org.slf4j.LoggerFactory;
import org.slf4j.Logger;
import com.brilliance.isc.bo.*;
import com.brilliance.isc.bo.model.Cfabop;
import com.brilliance.isc.bo.model.Cfaeca;
import com.brilliance.isc.bo.model.CfaecaBizInfo;
import com.brilliance.isc.common.bop.cfa.cfabop.register.CfabopRegister;
import com.brilliance.isc.common.bop.cfa.cfabop.service.CfaReportService;
import com.brilliance.isc.common.bopset.service.EblmodService;
import com.brilliance.isc.common.codetable.service.CodetableService;
import com.brilliance.isc.common.component.PtsptaToolComponent;
import com.brilliance.isc.common.context.SettleContext;
import com.brilliance.isc.common.context.SpringEnvContext;
import com.brilliance.isc.common.exception.CommonServiceException;
import com.brilliance.isc.common.sysmod.SysmodService;
import com.brilliance.isc.common.transaction.help.TransactionHelpService;
import com.brilliance.isc.common.vo.PtsptaVo;
import com.brilliance.isc.mda.dao.*;

import org.springframework.beans.factory.NoSuchBeanDefinitionException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.math.BigDecimal;

import static com.brilliance.mda.runtime.mda.Constants.NULLSTR;


@Service("eca.bop")
public class CfaecaServiceImpl implements CfaReportService {
    private final Logger log = LoggerFactory.getLogger(CfaecaServiceImpl.class);
    /**
     * eba-对外担保签约
     * ebb-对外担保责任余额
     * ebc-对外担保履约
     * ead-外债海外代付签约
     * eaf-外债远期信用证签约
     * ear-外债变动
     * eca-国内外汇贷款签约
     * ecb-国内外汇贷款变动
     */
    private String typeOfCfa = "eca";


    @Autowired
    EblmodService eblmodService;

    @Autowired
    SysmodService sysmodService;


    @Autowired
    TransactionHelpService transactionHelpService;

    @Autowired
    private CodetableService codetableService;

    @Autowired
    private PtsptaToolComponent ptsptaToolComponent;

    @Autowired
    EblMapper eblMapper;

    @Autowired
    EcaMapper ecaMapper;

    @Autowired
    EcbMapper ecbMapper;

    @Autowired
    CdaMapper cdaMapper;

    @Autowired
    private PtyMapper ptyMapper;



    @Override
    public void cfaBopSaveData(Cfabop cfabop){
        //重置防止空指针
        cfabop.reset();
        //取国内外汇贷款报送模型进行处理
        Cfaeca cfaeca = cfabop.getCfaeca();
        if( MdaUtils.compareTo(cfaeca.getBasflg(),"X") != 0 && MdaUtils.compareTo(cfaeca.getDclflg(),"X") != 0 ){
            return ;
        }

        CfaecaBizInfo cfaecaBiz =cfaeca.getCfaecaBizInfo();

        if("X".equals(cfaeca.getBasflg())){
            //生成外债编号
            if("A".equals(cfaeca.getCfatyp())){
                if(MdaUtils.isEmpty(cfaeca.getRecgrp().getBas().getDofoexlocode())) {
                    getReference(cfabop);
                }
                cfaeca.getRecgrp().getBas().setFincod(cfaecaBiz.getFincod());
            }

            cfaeca.getEblmod().getEbl().setBasflg("X");
            if(!"S".equals(cfaeca.getRecgrp().getBas().getSta())){
                cfaeca.getRecgrp().getBas().setInr("");
            }
            cfaeca.getRecgrp().getBas().setSta("W");
        }

        //EBL 处理
        cfaeca.getEblmod().getEbl().setOwnextkey(cfaeca.getOwnextkey());
        cfaeca.getEblmod().getEbl().setOwnref(cfaecaBiz.getFinownref());
        cfaeca.getEblmod().getEbl().setRptno(cfaeca.getRecgrp().getBas().getDofoexlocode());

        eblmodService.setEblData(cfaeca.getEblmod(),"ECA",cfaeca.getRecgrp().getBas().getValuedate());
        sysmodService.sdbInsert(cfaeca.getEblmod().getEbl());

        //变动信息处理
        if("X".equals(cfaeca.getDclflg())){
            int dclcnt = cfaeca.getRecgrp().getDcl().size();
            for(int i=0;i<dclcnt;i++){
               cfaeca.getRecgrp().getDcl().get(i).setDofoexlocode(cfaeca.getRecgrp().getBas().getDofoexlocode());
               cfaeca.getRecgrp().getDcl().get(i).setSta("W");
               cfaeca.getRecgrp().getDcl().get(i).setEblinr(cfaeca.getEblmod().getEbl().getInr());
               cfaeca.getRecgrp().getDcl().get(i).setBuscode(cfaecaBiz.getFinownref());
               cfaeca.getRecgrp().getDcl().get(i).setFincod(cfaecaBiz.getFincod());
               cfaeca.getRecgrp().getDcl().get(i).setCredat(Dates.today());

               if(MdaUtils.isEmpty(cfaeca.getRecgrp().getDcl().get(i).getChangeno())){
                   cfaeca.getRecgrp().getDcl().get(i).setChangeno(eblmodService.getChangeNo(cfaeca.getRecgrp().getBas().getDofoexlocode()));
               }

            }
        }

        //存申报数据表
        cfaeca.getRecgrp().getBas().setEblinr(cfaeca.getEblmod().getEbl().getInr());
        cfaeca.getRecgrp().getBas().setCredat(Dates.today());
        storeContract(cfabop);
        //赋值ebl关联表inr更新
        String objinr = cfaeca.getEblmod().getEbl().getObjinr();
        String basinr = cfaeca.getRecgrp().getBas().getInr();
        if (!objinr.equals(basinr))
        {
            cfaeca.getEblmod().getEbl().setObjinr(basinr);
            sysmodService.sdbUpdate(cfaeca.getEblmod().getEbl());
        }

        //记录报送审计操作 bopsig
        eblmodService.setRecordSig(cfaeca.getEblmod(),"数据提取");
        sysmodService.sdbInsert(cfaeca.getEblmod().getCfasig());

        //保存 CECM 暴露分类
        if("A".equals(cfaeca.getCfatyp())&&"X".equals(cfaeca.getCdaflg())){
            cfaeca.getCda().setTrninr(cfaeca.getEblmod().getEbl().getTrninr());
            sysmodService.sdbInsert(cfaeca.getCda());
        }

    }


    @Override
    public void setCfaType(String cfaType){
        this.typeOfCfa = cfaType;
    }

    @Override
    public Cfabop cfaMappingData(Cfabop cfabop) {

        //初始化处理
        initCfabop(cfabop);

        //开始试算
        Cfaeca cfaeca = cfabop.getCfaeca();
        CfaecaBizInfo cfaecaBiz = cfaeca.getCfaecaBizInfo();

        //试算 签约数据
        //操作类型为 A-新增  试算 签约
        if("A".equals(cfaeca.getCfatyp())&&"X".equals(cfaeca.getBasflg())){
            //起息日
            if(!cfaeca.getRecgrp().getBas().isModified("valuedate")){
                cfaeca.getRecgrp().getBas().setValuedate( cfaecaBiz.getStttendat());
            }

            //到期日
            if(!cfaeca.getRecgrp().getBas().isModified("maturity")) {
                cfaeca.getRecgrp().getBas().setMaturity(cfaecaBiz.getMatdat());
            }

            //贷款币种
            if(!cfaeca.getRecgrp().getBas().isModified("currence")) {
                cfaeca.getRecgrp().getBas().setCurrence( cfaecaBiz.getMaxcur());
            }

            //签约金额
            if(!cfaeca.getRecgrp().getBas().isModified("contractamount")) {
                cfaeca.getRecgrp().getBas().setContractamount( cfaecaBiz.getMaxamt());
            }

            //债权人代码
            if(!cfaeca.getRecgrp().getBas().isModified("creditorcode")) {
                if(!MdaUtils.isEmpty(SettleContext.getUserSession().getWrkbch()) && MdaUtils.compareTo(cfaeca.getOwnextkey(), SettleContext.getUserSession().getWrkbch().getBranch()) == 0){
                    cfaeca.getRecgrp().getBas().setCreditorcode(SettleContext.getUserSession().getWrkbch().getDecnum());
                }else{
                    cfaeca.getRecgrp().getBas().setCreditorcode(eblmodService.getDecnum(cfaeca.getOwnextkey()));
                }
            }

            //通过交易取角色信息
            String rol = "";
            String frmname = Strings.mid(cfabop.getTransName().toUpperCase(),1,6);
            String tran = Strings.mid(frmname,1,2);
            String jsucod= "";
            String nam1="";
            switch( tran )
            {
                case "TR":
                    rol = "FIP";
                    break;
                case "BC":
                    rol = "DRE";
                    break;
                case  "BR":
                    rol = "APL";
                    break;
                case  "CP":
                    rol = "ORC";
                    break;
                case  "BP":
                    rol = "FIA";
                    break;
                default:
                    rol = "APL";
            }
            PtsptaVo ptspta = ptsptaToolComponent.getPtsFromListByRol(cfabop.getPtsList(), rol);
            if(!MdaUtils.isEmpty(ptspta)){
                String ptyinr = ptspta.getPtyinr();
                Pty pty = ptyMapper.selectByPtyinr(ptyinr);
                if(!MdaUtils.isEmpty(pty)){
                    jsucod = pty.getJuscod();
                    nam1 = pty.getNam1();
                }
            }

            //债务人代码
            if(!cfaeca.getRecgrp().getBas().isModified("debtorcode")) {
                cfaeca.getRecgrp().getBas().setDebtorcode(jsucod);
            }

            //债务人中文名称
            if(!cfaeca.getRecgrp().getBas().isModified("debtorname")) {
                cfaeca.getRecgrp().getBas().setDebtorname(nam1);
            }

            //年化利率
            BigDecimal anninrate = new BigDecimal(0);
            if(!MdaUtils.isEmpty(cfaecaBiz.getCfarat())){
                anninrate = cfaecaBiz.getCfarat().divide(new BigDecimal(100));
            }
            if(!cfaeca.getRecgrp().getBas().isModified("anninrate")) {
                cfaeca.getRecgrp().getBas().setAnninrate(anninrate);
            }

            //新国结增加 国内外汇贷款编号生成 -- 新增试算不能产生编号，并发情况下可能会重复 -- 提交的试算模式得生成，否则快照文件中没有申报号码
            //收单行提交也会走事务，这里计数器应该会更新
            if(SettleContext.isSavTransSta()) {
                if(MdaUtils.isEmpty(cfaeca.getRecgrp().getBas().getDofoexlocode())){
                    getReference(cfabop);
                }

            }


        }

        //操作类型为 M-修改  试算 签约个别字段 -- 现在不存在交易修改融资信息，此逻辑无用


        //试算 变动数据
        //操作类型为 A-新增 且变动信息勾选，试算变动信息  提款变动
        if("A".equals(cfaeca.getCfatyp())&&"X".equals(cfaeca.getDclflg())){
            //试算中 变动操作类型固定新增
            cfaeca.getRecgrp().getDcl().get(0).setActiontype("A");

            //银行业务参号
            if(!cfaeca.getRecgrp().getDcl().get(0).isModified("buscode")) {
                cfaeca.getRecgrp().getDcl().get(0).setBuscode(cfaecaBiz.getFinownref());
            }
            //变动日期
            if(!cfaeca.getRecgrp().getDcl().get(0).isModified("changedate")) {
                cfaeca.getRecgrp().getDcl().get(0).setChangedate(cfaecaBiz.getStttendat());
            }
            //期初余额
            if(!cfaeca.getRecgrp().getDcl().get(0).isModified("loanopenbalan")) {
                cfaeca.getRecgrp().getDcl().get(0).setLoanopenbalan(BigDecimal.ZERO);
            }

            //期末余额
            if(!cfaeca.getRecgrp().getDcl().get(0).isModified("endbalan")) {
                cfaeca.getRecgrp().getDcl().get(0).setEndbalan(cfaecaBiz.getMaxamt());
            }

            //提款币种
            if(!cfaeca.getRecgrp().getDcl().get(0).isModified("withcurrence")) {
                cfaeca.getRecgrp().getDcl().get(0).setWithcurrence(cfaecaBiz.getMaxcur());
            }

            //提款金额
            if(!cfaeca.getRecgrp().getDcl().get(0).isModified("withamount")) {
                cfaeca.getRecgrp().getDcl().get(0).setWithamount(cfaecaBiz.getMaxamt());
            }

            //付息金额 付息币种
            BigDecimal intamt = BigDecimal.ZERO;
            if(!MdaUtils.isEmpty(cfaecaBiz.getIntamt())){
                intamt = cfaecaBiz.getIntamt();
            }

            if(!cfaeca.getRecgrp().getDcl().get(0).isModified("inpayamount")) {
                cfaeca.getRecgrp().getDcl().get(0).setInpayamount(intamt);
            }

            //付息金额为0 清空币种
            if(intamt.compareTo(BigDecimal.ZERO) > 0){
                if(!cfaeca.getRecgrp().getDcl().get(0).isModified("inpaycurr")) {
                    cfaeca.getRecgrp().getDcl().get(0).setInpaycurr(cfaecaBiz.getMaxcur());
                }
            }else{
                cfaeca.getRecgrp().getDcl().get(0).setInpaycurr("");
            }

            //增加国内外汇贷款编号赋值 -- 新增试算不能赋值，并发情况下可能会重复  -- 提交场景下需要赋值，否则快照文件缺少申报号码
            if(SettleContext.isSavTransSta()){
                //国内贷款编号
                if(MdaUtils.isEmpty(cfaeca.getRecgrp().getDcl().get(0).getDofoexlocode())){
                    cfaeca.getRecgrp().getDcl().get(0).setDofoexlocode(cfaeca.getRecgrp().getBas().getDofoexlocode());
                }

                //变动编号
                if(MdaUtils.isEmpty(cfaeca.getRecgrp().getDcl().get(0).getChangeno())){
                    cfaeca.getRecgrp().getDcl().get(0).setChangeno(eblmodService.getChangeNo(cfaeca.getRecgrp().getBas().getDofoexlocode()));
                }
            }

            //防止金额字段为空，这里进行重置
            cfaeca.getRecgrp().getDcl().get(0).reset();
        }

        //操作类型为 S-变动 且变动信息勾选，试算变动信息  还本变动
        if("S".equals(cfaeca.getCfatyp())&&"X".equals(cfaeca.getDclflg())){
            //试算中 操作类型固定新增
            cfaeca.getRecgrp().getDcl().get(0).setActiontype("A");

            //银行业务参号
            if(!cfaeca.getRecgrp().getDcl().get(0).isModified("buscode")) {
                cfaeca.getRecgrp().getDcl().get(0).setBuscode(cfaecaBiz.getFinownref());
            }
            //变动日期
            if(!cfaeca.getRecgrp().getDcl().get(0).isModified("changedate")) {
                cfaeca.getRecgrp().getDcl().get(0).setChangedate(Dates.today());
            }


            BigDecimal intamt = BigDecimal.ZERO;
            BigDecimal amt = BigDecimal.ZERO;

            if(!MdaUtils.isEmpty(cfaecaBiz.getTotint())){
                intamt = cfaecaBiz.getTotint();
            }
            if(!MdaUtils.isEmpty(cfaecaBiz.getFinamt())){
                amt = cfaecaBiz.getFinamt();
            }

            //付息金额 -- 一定得使用业务数据
            //if(!cfaeca.getRecgrp().getDcl().get(0).isModified("inpayamount")) {
                cfaeca.getRecgrp().getDcl().get(0).setInpayamount(intamt);
            //}

            //付息币种 付息金额为0时清空付息币种
            if(intamt.compareTo(BigDecimal.ZERO) > 0){
                //if(!cfaeca.getRecgrp().getDcl().get(0).isModified("inpaycurr")) {
                    cfaeca.getRecgrp().getDcl().get(0).setInpaycurr(cfaecaBiz.getMaxcur());
                //}
            }else{
                cfaeca.getRecgrp().getDcl().get(0).setInpaycurr(null);
            }

            //计算期初余额
            BigDecimal loanopenbalan = BigDecimal.ZERO;
            Ecb ecb = ecbMapper.selectLastEndbalan(cfaeca.getRecgrp().getBas().getDofoexlocode() );
            if(ecb != null){
                loanopenbalan = ecb.getEndbalan();
            }

            //期初余额
            if(!cfaeca.getRecgrp().getDcl().get(0).isModified("loanopenbalan")) {
                cfaeca.getRecgrp().getDcl().get(0).setLoanopenbalan(loanopenbalan);
            }

            //期末余额
            if(!cfaeca.getRecgrp().getDcl().get(0).isModified("endbalan")) {
                cfaeca.getRecgrp().getDcl().get(0).setEndbalan(loanopenbalan.subtract(amt));
            }

            //还本币种 -- 还本币种沿用业务数据
            //if(!cfaeca.getRecgrp().getDcl().get(0).isModified("princurr")) {
                cfaeca.getRecgrp().getDcl().get(0).setPrincurr(cfaecaBiz.getMaxcur());
            //}

            //还本金额 -- 还本金额沿用业务数据
            //if(!cfaeca.getRecgrp().getDcl().get(0).isModified("repayamount")) {
                cfaeca.getRecgrp().getDcl().get(0).setRepayamount(amt);
            //}

            //增加国内外汇贷款编号赋值
            if(MdaUtils.isEmpty(cfaeca.getRecgrp().getDcl().get(0).getDofoexlocode())){
                cfaeca.getRecgrp().getDcl().get(0).setDofoexlocode(cfaeca.getRecgrp().getBas().getDofoexlocode());
            }

            //提交场景下增加变动编号赋值，否则快照文件中缺失变动编号
            if(SettleContext.isSavTransSta()){
                //变动编号
                if(MdaUtils.isEmpty(cfaeca.getRecgrp().getDcl().get(0).getChangeno())){
                    cfaeca.getRecgrp().getDcl().get(0).setChangeno(eblmodService.getChangeNo(cfaeca.getRecgrp().getBas().getDofoexlocode()));
                }
            }

            //防止金额字段为空，这里进行重置
            cfaeca.getRecgrp().getDcl().get(0).reset();
        }


            return cfabop;
    }

    @Override
    public Cfabop cfaGetPreData(Cfabop cfabop,String ownref){

        Cfaeca cfaeca = cfabop.getCfaeca();

        if(!MdaUtils.isEmpty(ownref)){
            String eblinr = "";
            eblinr = eblMapper.selectMaxInrByOwnrefAndObjtyp(ownref,"ECA");

            //读取签约 ECA 信息  以及流水信息 ebl
            if(!MdaUtils.isEmpty(eblinr)){
                Eca eca = ecaMapper.selectByEblinr(eblinr);
                if(eca != null){
                    cfaeca.setOldeca(eca);
                    cfaeca.getRecgrp().setBas(eca);
                }

                Ebl ebl = eblMapper.selectByInr(eblinr);
                if(ebl != null){
                    cfaeca.getEblmod().setWrkebl(ebl);
                    cfaeca.setOwnextkey(ebl.getOwnextkey());
                    cfaeca.setPansta("D");

                    //加载  CDA 表数据
                    Cda cda = cdaMapper.selectBytrninr(ebl.getTrninr());
                    if(cda != null){
                        cfaeca.setCda(cda);
                        cfaeca.setCdaflg("X");
                    }

                }

            }
        }

        return cfabop;
    }

    //复核回退删除已入库国内外汇贷款数据 以及 cecm数据
    @Override
    public void cfabopRePair(String trninr) {
        if (MdaUtils.isEmpty(trninr)) {
            return;
        }
        Ebl eblObj = eblMapper.selectByTrninrAndObjtyp(trninr,"ECA");
        if (!MdaUtils.isEmpty(eblObj)) {
            String objInr = eblObj.getObjinr();
            String objType = eblObj.getObjtyp();
            String eblInr = eblObj.getInr();

            //删除业务关联报送数据
            Eca eca = ecaMapper.selectByEblinr(eblInr);
            Ecb ecb = ecbMapper.selectByEblinr(eblInr);
            Cda cda = cdaMapper.selectBytrninr(trninr);
            if (!MdaUtils.isEmpty(eca)) {
                sysmodService.sdbDeleteWithLog(eca);
            }
            if (!MdaUtils.isEmpty(ecb)) {
                sysmodService.sdbDeleteWithLog(ecb);
            }
            if (!MdaUtils.isEmpty(cda)) {
                sysmodService.sdbDeleteWithLog(cda);
            }

            sysmodService.sdbDeleteWithLog(eblObj);

        }
    }

    @Override
    public void storeContract(Cfabop cfabop) {

        Cfaeca cfaeca = cfabop.getCfaeca();
        //保存BAS信息
        if("X".equals(cfaeca.getBasflg())){
            String inrBas = cfaeca.getRecgrp().getBas().getInr();
            //判断Inr对应的BAS对象为空
            if (!inrBas.isEmpty() && ecaMapper.selectByInr(inrBas) != null) {
                sysmodService.sdbUpdateWithLog(cfaeca.getRecgrp().getBas());
            }
            else {
                if (cfaeca.getRecgrp().getBas().getInr().isEmpty()){
                    sysmodService.sdbInsertWithLog(cfaeca.getRecgrp().getBas());
                } else{
                    sysmodService.sdbUndeleteWithLog(cfaeca.getRecgrp().getBas());
                }

                inrBas = cfaeca.getRecgrp().getBas().getInr();
                //cfaeca.getCfamap().getCfarep().getEca().setInr(inrBas);
            }
            if( MdaUtils.compareTo(cfaeca.getEblmod().getDectyp(),"M") == 0 )
            {
                //若是error数据,更改cfaerr中sta状态
                eblmodService.setCFAERRSta( "ECA", "BAS",cfaeca.getRecgrp().getBas().getDofoexlocode(),"" );
            }
        }

        //保存 dcl信息
        if("X".equals(cfaeca.getDclflg())){
            int dclnum = cfaeca.getRecgrp().getDcl().size();
            for (int i = 0; i < dclnum; i++) {
                cfaeca.getRecgrp().getDcl().get(i).setObjtyp("ECA");
                cfaeca.getRecgrp().getDcl().get(i).setObjinr(cfaeca.getRecgrp().getBas().getInr());
                if (MdaUtils.isEmpty(ecbMapper.selectByInr(cfaeca.getRecgrp().getDcl().get(i).getInr()))) {
                    sysmodService.sdbInsertWithLog(cfaeca.getRecgrp().getDcl().get(i));
                } else {
                    sysmodService.sdbUpdateWithLog(cfaeca.getRecgrp().getDcl().get(i));
                }
                if( MdaUtils.compareTo(cfaeca.getEblmod().getDectyp(),"M") == 0 )
                {
                    //若是error数据,更改cfaerr中sta状态
                    eblmodService.setCFAERRSta( "ECA", "DCL",cfaeca.getRecgrp().getBas().getDofoexlocode(),cfaeca.getRecgrp().getDcl().get(i).getChangeno());
                }

            }
        }

    }

    @Override
    /**
     * 生成 国内外汇贷款编号
     * @return
     */
    public void getReference(Cfabop cfabop){
        Cfaeca cfaeca = cfabop.getCfaeca();
        String objtyp = codetableService.getTblKey("ECA","CFACOD");
        String decnum = cfaeca.getRecgrp().getBas().getCreditorcode();
        String ref = NULLSTR;
        if( MdaUtils.isEmpty(cfaeca.getRecgrp().getBas().getDofoexlocode()) || ( ! MdaUtils.isEmpty(cfaeca.getRecgrp().getBas().getDofoexlocode()) && ! validReference(cfabop) ) )
        {
            ref = eblmodService.getCFARef ( cfaeca.getRecgrp().getBas().getValuedate(), objtyp, decnum, false, "" );
            if( ! MdaUtils.isEmpty(ref) )
            {
                cfaeca.getRecgrp().getBas().setDofoexlocode( ref);
            }
            if( MdaUtils.isEmpty(ref) )
            {
                MdaUtils.exitRule();
            }
        }
    }

    @Override
    public boolean validReference(Cfabop cfabop) {
        Cfaeca cfaeca = cfabop.getCfaeca();
        if(MdaUtils.isEmpty(cfaeca.getRecgrp().getBas().getDofoexlocode())){
            return false;
        }

        String objtyp = codetableService.getTblKey("ECA","CFACOD");
        String decnum = cfaeca.getRecgrp().getBas().getCreditorcode();
        String ref = eblmodService.getCFARef ( cfaeca.getRecgrp().getBas().getValuedate(), objtyp, decnum, true, cfaeca.getRecgrp().getBas().getDofoexlocode() );
        if( MdaUtils.compareTo(ref,cfaeca.getRecgrp().getBas().getDofoexlocode()) == 0 )
        {
            return true;
        }
        else
        {
            //清空变动编号，防止repair操作时，变动编号有问题
            int count = cfaeca.getRecgrp().getDcl().size();
            for(int  i = 0;i < count;i++)
            {
                cfaeca.getRecgrp().getDcl().get(i).setChangeno(NULLSTR);
            }
            return false;
        }

    }

//    @Override
//    public void registerCfabopBizInfo(Cfabop cfabop) {
//        String objtyp = cfabop.getRec().getObjtyp();
//        try {
//            CfabopRegister cfabopService = SpringEnvContext.getBean(objtyp.toLowerCase()+".cfabopRegister");
//            cfabopService.registerCfabopBizInfo(cfabop,"ECA");
//        } catch (NoSuchBeanDefinitionException e) {
//            throw new CommonServiceException("没有找到报送数据构建类");
//        }
//
//    }

    @Override
    public void initCfabop(Cfabop cfabop) {

        //前手数据带入不能试算时带入，否则会将页面修改的数据给覆盖,改为交易初始化带入

        //固定值设置 国内外汇贷款类型
        if(!cfabop.getCfaeca().getRecgrp().getBas().isModified("dofoexlotype")) {
            cfabop.getCfaeca().getRecgrp().getBas().setDofoexlotype("1102");
        }

        //操作类型处理
        String actiontype = "A";
        if("M".equals(cfabop.getCfaeca().getCfatyp()) && "X".equals(cfabop.getCfaeca().getBasflg())){
            if("S".equals(cfabop.getCfaeca().getRecgrp().getBas().getSta())){
                actiontype = "C";
            }
        }
        cfabop.getCfaeca().getRecgrp().getBas().setActiontype(actiontype);

        //设置地区机构代码，若无前手数据且为空则直接赋值 客户所属机构
        if(MdaUtils.isEmpty(cfabop.getCfaeca().getRecgrp().getBas().getInr())){
            if(MdaUtils.isEmpty(cfabop.getCfaeca().getOwnextkey())&&!MdaUtils.isEmpty(SettleContext.getUserSession().getWrkbch())){
                cfabop.getCfaeca().setOwnextkey(SettleContext.getUserSession().getWrkbch().getBranch());
            }
        }

        //设置变动记录数 dclnum
        int dclnum = 0;
        if("1".equals(cfabop.getCfaeca().getCfaflg()) || "3".equals(cfabop.getCfaeca().getCfaflg())){
            if("A".equals(cfabop.getCfaeca().getCfatyp()) || "S".equals(cfabop.getCfaeca().getCfatyp())){
                dclnum = 1;
            }
        }

        cfabop.getCfaeca().setDclnum(dclnum);

        //设置空变动信息，用于后续 映射赋值
        if(cfabop.getCfaeca().getRecgrp().getDcl().size() == 0){
            for(int i=0;i<cfabop.getCfaeca().getDclnum();i++){
                Ecb ecb = new Ecb();
                cfabop.getCfaeca().getRecgrp().getDcl().add(ecb);
            }
        }

    }


}
