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 com.brilliance.isc.bo.*;
import com.brilliance.isc.bo.model.Cfabop;
import com.brilliance.isc.bo.model.Cfaead;
import com.brilliance.isc.bo.model.CfaeadBizInfo;
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.vo.PtsptaVo;
import com.brilliance.isc.mda.dao.*;
import org.slf4j.spi.MDCAdapter;
import org.springframework.beans.factory.NoSuchBeanDefinitionException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.math.BigDecimal;
import java.util.List;

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

    @Autowired
    EblmodService eblmodService;

    @Autowired
    SysmodService sysmodService;


    @Autowired
    private CodetableService codetableService;

    @Autowired
    private PtsptaToolComponent ptsptaToolComponent;

    @Autowired
    EblMapper eblMapper;

    @Autowired
    EadMapper eadMapper;

    @Autowired
    EarMapper earMapper;

    @Autowired
    private PtyMapper ptyMapper;

    @Autowired
    private PtaMapper ptaMapper;

    @Override
    public void cfaBopSaveData(Cfabop cfabop) {
        //重置防止空指针
        cfabop.reset();
        //取海外代付报送模型进行处理
        Cfaead cfaead = cfabop.getCfaead();
        if( MdaUtils.compareTo(cfaead.getBasflg(),"X") != 0 && MdaUtils.compareTo(cfaead.getDclflg(),"X") != 0 ){
            return ;
        }

        CfaeadBizInfo cfaeadBizInfo =cfaead.getCfaeadBizInfo();

        if("X".equals(cfaead.getBasflg())){
            //生成外债编号
            if("A".equals(cfaead.getCfatyp())){
                if(MdaUtils.isEmpty(cfaead.getRecgrp().getBas().getExdebtcode())) {
                    getReference(cfabop);
                }
            }

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

        //EBL 处理
        cfaead.getEblmod().getEbl().setResamt(cfaeadBizInfo.getResamt());
        cfaead.getEblmod().getEbl().setOwnextkey(cfaead.getOwnextkey());
        cfaead.getEblmod().getEbl().setOwnref(cfaeadBizInfo.getDfdownref());
        cfaead.getEblmod().getEbl().setRptno(cfaead.getRecgrp().getBas().getExdebtcode());

        eblmodService.setEblData(cfaead.getEblmod(),"EAD",cfaead.getRecgrp().getBas().getValuedate());
        sysmodService.sdbInsert(cfaead.getEblmod().getEbl());

        //变动信息处理
        if("X".equals(cfaead.getDclflg())){
            int dclcnt = cfaead.getRecgrp().getDcl().size();
            for(int i=0;i<dclcnt;i++){
                cfaead.getRecgrp().getDcl().get(i).setExdebtcode(cfaead.getRecgrp().getBas().getExdebtcode());
                cfaead.getRecgrp().getDcl().get(i).setSta("W");
                cfaead.getRecgrp().getDcl().get(i).setEblinr(cfaead.getEblmod().getEbl().getInr());
                cfaead.getRecgrp().getDcl().get(i).setBuscode(cfaeadBizInfo.getDfdownref());
                cfaead.getRecgrp().getDcl().get(i).setCredat(Dates.today());

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

            }
        }

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

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

    }

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

    @Override
    public Cfabop cfaMappingData(Cfabop cfabop) {
        //初始化处理
        initCfabop(cfabop);

        //开始试算
        Cfaead cfaead = cfabop.getCfaead();
        CfaeadBizInfo cfaeadBiz = cfaead.getCfaeadBizInfo();

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

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

            //签约币种
            if(!cfaead.getRecgrp().getBas().isModified("contractcurr")) {
                cfaead.getRecgrp().getBas().setContractcurr( cfaeadBiz.getMaxcur());
            }

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


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

            //债权人代码
            PtsptaVo dffptspta = cfaeadBiz.getDff();
            String dffptybic = "";
            String dffptynam = "";
            String dffptyinr = "";
            if(!MdaUtils.isEmpty(dffptspta)){
                dffptyinr = dffptspta.getPtyinr();
                Pty pty = ptyMapper.selectByPtyinr(dffptyinr);
                if(!MdaUtils.isEmpty(pty)){
                    dffptybic = pty.getExtkey();
                    dffptynam = pty.getNam();
                }
            }
            if(!cfaead.getRecgrp().getBas().isModified("creditorcode")) {
                cfaead.getRecgrp().getBas().setCreditorcode(dffptybic);
            }

            //债权人英文名称
            if(!cfaead.getRecgrp().getBas().isModified("creditornamen")) {
                cfaead.getRecgrp().getBas().setCreditornamen(dffptynam);
            }

            //债权人中文名称
            if(!cfaead.getRecgrp().getBas().isModified("creditorname")) {
                cfaead.getRecgrp().getBas().setCreditorname(cfaeadBiz.getBankcn());
            }

            //年化利率值
            BigDecimal anninrate = new BigDecimal(0);
            if(!MdaUtils.isEmpty(cfaeadBiz.getActrat())){
                anninrate = cfaeadBiz.getActrat().divide(new BigDecimal(100));
            }
            if(!cfaead.getRecgrp().getBas().isModified("anninrate")) {
                cfaead.getRecgrp().getBas().setAnninrate(anninrate);
            }

            //是否浮动利率
            if(!cfaead.getRecgrp().getBas().isModified("floatrate")) {
                if("1".equals(cfaeadBiz.getFlttyp()) || "2".equals(cfaeadBiz.getFlttyp())){
                    cfaead.getRecgrp().getBas().setFloatrate("Y");
                }else{
                    cfaead.getRecgrp().getBas().setFloatrate("N");
                }
            }

            //债权人总部所在国家（地区）代码
            if(!cfaead.getRecgrp().getBas().isModified("crehqcode")) {
               String heqcty = eblmodService.getHeqBankCountry(dffptyinr);
               cfaead.getRecgrp().getBas().setCrehqcode(codetableService.getTblLabel(heqcty,"CTYCOD"));
            }

            //债权人经营地所在国家（地区）代码
            if(!cfaead.getRecgrp().getBas().isModified("opercode")) {
                cfaead.getRecgrp().getBas().setOpercode(codetableService.getTblLabel(Strings.mid(dffptybic,5,2),"CTYCOD"));
            }

            //通过交易判断角色信息
            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(!cfaead.getRecgrp().getBas().isModified("appcode")) {
                cfaead.getRecgrp().getBas().setAppcode(jsucod);
            }

            //申请人名称
            if(!cfaead.getRecgrp().getBas().isModified("appname")) {
                cfaead.getRecgrp().getBas().setAppname(nam1);
            }

            //承继的远期信用证承兑银行业务参号
            if("BRTSET".equals(Strings.mid(cfabop.getTransName().toUpperCase(),1,6))){
                if(!cfaead.getRecgrp().getBas().isModified("inltcabuscode")) {
                    cfaead.getRecgrp().getBas().setInltcabuscode(cfaeadBiz.getBrdownref());
                }
            }

            //对方与本机构的关系 -- 改为手工选择，原TD逻辑作废

            //是否不纳入跨境融资风险加权余额计算
            if(!cfaead.getRecgrp().getBas().isModified("spapfeboindex")) {
                cfaead.getRecgrp().getBas().setSpapfeboindex("N");
            }

            //提交场景下生成申报号码，否则快照文件中没有申报号码
            if(SettleContext.isSavTransSta()) {
                if(MdaUtils.isEmpty(cfaead.getRecgrp().getBas().getExdebtcode())) {
                    getReference(cfabop);
                }
            }

        }

        //操作类型为 M-修改  试算 签约 能够修改 到期日 和 利率 -- 信息都从 bizinfo取
        if("M".equals(cfaead.getCfatyp())&&"X".equals(cfaead.getBasflg())){
            //到期日
            if(!MdaUtils.isEmpty(cfaeadBiz.getMatdat())){
                if(!cfaead.getRecgrp().getBas().isModified("maturity")) {
                    cfaead.getRecgrp().getBas().setMaturity(cfaeadBiz.getMatdat());
                }
            }

            //年化利率值
            BigDecimal anninrate = new BigDecimal(0);
            if(!MdaUtils.isEmpty(cfaeadBiz.getActrat())){
                anninrate = cfaeadBiz.getActrat().divide(new BigDecimal(100));
                if(!cfaead.getRecgrp().getBas().isModified("anninrate")) {
                    if(MdaUtils.compareTo(anninrate,cfaeadBiz.getOldctrat()) != 0){
                        cfaead.getRecgrp().getBas().setAnninrate(anninrate);
                    }
                }
            }
        }

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

            //银行业务参号
            if(!cfaead.getRecgrp().getDcl().get(0).isModified("buscode")) {
                cfaead.getRecgrp().getDcl().get(0).setBuscode(cfaeadBiz.getDfdownref());
            }

            //变动类型
            if(!cfaead.getRecgrp().getDcl().get(0).isModified("changtype")) {
                cfaead.getRecgrp().getDcl().get(0).setChangtype("1101");
            }

            //变动日期
            if(!cfaead.getRecgrp().getDcl().get(0).isModified("chdate")) {
                cfaead.getRecgrp().getDcl().get(0).setChdate(cfaeadBiz.getStttendat());
            }

            //变动币种
            if(!cfaead.getRecgrp().getDcl().get(0).isModified("chcurrency")) {
                cfaead.getRecgrp().getDcl().get(0).setChcurrency(cfaeadBiz.getMaxcur());
            }

            //变动金额
            if(!cfaead.getRecgrp().getDcl().get(0).isModified("chamount")) {
                cfaead.getRecgrp().getDcl().get(0).setChamount(cfaeadBiz.getMaxamt());
            }

            //提交场景下需要赋值，否则快照文件缺少申报号码 变动编号
            if(SettleContext.isSavTransSta()){
                //外债编号
                if(MdaUtils.isEmpty(cfaead.getRecgrp().getDcl().get(0).getExdebtcode())){
                    cfaead.getRecgrp().getDcl().get(0).setExdebtcode(cfaead.getRecgrp().getBas().getExdebtcode());
                }

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

            }
        }

        //操作类型为 S-变动  试算 还本变动 和 付息变动(利息不为0)
        if("S".equals(cfaead.getCfatyp())&&"X".equals(cfaead.getDclflg())){
            int dclnum = cfaead.getRecgrp().getDcl().size();

            //还本变动
            //外债编号
            cfaead.getRecgrp().getDcl().get(0).setExdebtcode(cfaead.getRecgrp().getBas().getExdebtcode());

            //试算中 变动操作类型固定新增
            cfaead.getRecgrp().getDcl().get(0).setActiontype("A");

            //银行业务参号
            if(!cfaead.getRecgrp().getDcl().get(0).isModified("buscode")) {
                cfaead.getRecgrp().getDcl().get(0).setBuscode(cfaeadBiz.getDfdownref());
            }

            //变动类型
            if(!cfaead.getRecgrp().getDcl().get(0).isModified("changtype")) {
                cfaead.getRecgrp().getDcl().get(0).setChangtype("1201");
            }

            //变动日期
            if(!cfaead.getRecgrp().getDcl().get(0).isModified("chdate")) {
                cfaead.getRecgrp().getDcl().get(0).setChdate(Dates.today());
            }

            //变动币种
            if(!cfaead.getRecgrp().getDcl().get(0).isModified("chcurrency")) {
                cfaead.getRecgrp().getDcl().get(0).setChcurrency(cfaeadBiz.getMaxcur());
            }

            //变动金额
            if(!cfaead.getRecgrp().getDcl().get(0).isModified("chamount")) {
                cfaead.getRecgrp().getDcl().get(0).setChamount(cfaeadBiz.getMaxamt());
            }

            //外债编号
            if(MdaUtils.isEmpty(cfaead.getRecgrp().getDcl().get(0).getExdebtcode())){
                cfaead.getRecgrp().getDcl().get(0).setExdebtcode(cfaead.getRecgrp().getBas().getExdebtcode());
            }

            //提交场景下需要赋值，否则快照文件缺少 变动编号
            if(SettleContext.isSavTransSta()){
                //变动编号
                if(MdaUtils.isEmpty(cfaead.getRecgrp().getDcl().get(0).getChangeno())){
                    cfaead.getRecgrp().getDcl().get(0).setChangeno(eblmodService.getChangeNo(cfaead.getRecgrp().getBas().getExdebtcode()));
                }

            }



            //付息变动
            if(dclnum > 1){
                //外债编号
                cfaead.getRecgrp().getDcl().get(1).setExdebtcode(cfaead.getRecgrp().getBas().getExdebtcode());

                //试算中 变动操作类型固定新增
                cfaead.getRecgrp().getDcl().get(1).setActiontype("A");

                //银行业务参号
                if(!cfaead.getRecgrp().getDcl().get(1).isModified("buscode")) {
                    cfaead.getRecgrp().getDcl().get(1).setBuscode(cfaeadBiz.getDfdownref());
                }

                //变动类型
                if(!cfaead.getRecgrp().getDcl().get(1).isModified("changtype")) {
                    cfaead.getRecgrp().getDcl().get(1).setChangtype("1301");
                }

                //变动日期
                if(!cfaead.getRecgrp().getDcl().get(1).isModified("chdate")) {
                    cfaead.getRecgrp().getDcl().get(1).setChdate(Dates.today());
                }

                //变动币种
                if(!cfaead.getRecgrp().getDcl().get(1).isModified("chcurrency")) {
                    cfaead.getRecgrp().getDcl().get(1).setChcurrency(cfaeadBiz.getRescur());
                }

                //变动金额
                if(!cfaead.getRecgrp().getDcl().get(1).isModified("chamount")) {
                    cfaead.getRecgrp().getDcl().get(1).setChamount(cfaeadBiz.getResamt());
                }

                //外债编号
                if(MdaUtils.isEmpty(cfaead.getRecgrp().getDcl().get(1).getExdebtcode())){
                    cfaead.getRecgrp().getDcl().get(1).setExdebtcode(cfaead.getRecgrp().getBas().getExdebtcode());
                }

                //变动编号
                if(SettleContext.isSavTransSta()){
                    if(MdaUtils.isEmpty(cfaead.getRecgrp().getDcl().get(1).getChangeno())){
                        cfaead.getRecgrp().getDcl().get(1).setChangeno(eblmodService.getChangeNo(cfaead.getRecgrp().getBas().getExdebtcode()));
                    }
                }
            }

        }

        return cfabop;
    }

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

        Cfaead cfaead = cfabop.getCfaead();
        if(!MdaUtils.isEmpty(ownref)){
            String eblinr = "";
            eblinr = eblMapper.selectMaxInrByOwnrefAndObjtyp(ownref,"EAD");

            //读取签约 EAD 信息  以及流水信息 ebl
            if(!MdaUtils.isEmpty(eblinr)){
                Ead ead = eadMapper.selectByEblinr(eblinr);
                if(ead != null){
                    cfaead.setOldead(ead);
                    cfaead.getRecgrp().setBas(ead);
                }

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

                }

            }
        }

        return cfabop;
    }

    @Override
    public void cfabopRePair(String trninr) {
        if (MdaUtils.isEmpty(trninr)) {
            return;
        }
        Ebl eblObj = eblMapper.selectByTrninrAndObjtyp(trninr,"EAD");
        if (!MdaUtils.isEmpty(eblObj)) {
            String objInr = eblObj.getObjinr();
            String objType = eblObj.getObjtyp();
            String eblInr = eblObj.getInr();
            

            //删除业务关联报送数据,变动可能是多条
            Ead ead = eadMapper.selectByEblinr(eblInr);
            List<Ear> earList = earMapper.selectByEblinr(eblInr);

            if (!MdaUtils.isEmpty(ead)) {
                sysmodService.sdbDeleteWithLog(ead);
            }

            for (int i = 0; i < earList.size(); i++) {
                if (!MdaUtils.isEmpty(earList.get(i))) {
                    sysmodService.sdbDeleteWithLog(earList.get(i));
                }
            }

            sysmodService.sdbDeleteWithLog(eblObj);

        }
    }

    @Override
    public void storeContract(Cfabop cfabop) {
        Cfaead cfaead = cfabop.getCfaead();
        //保存BAS信息
        if ("X".equals(cfaead.getBasflg())) {
            String inrBas = cfaead.getRecgrp().getBas().getInr();
            //判断Inr对应的BAS对象为空
            if (!inrBas.isEmpty() && eadMapper.selectByInr(inrBas) != null) {
                sysmodService.sdbUpdateWithLog(cfaead.getRecgrp().getBas());
            } else {
                if (cfaead.getRecgrp().getBas().getInr().isEmpty()) {
                    sysmodService.sdbInsertWithLog(cfaead.getRecgrp().getBas());
                } else {
                    sysmodService.sdbUndeleteWithLog(cfaead.getRecgrp().getBas());
                }

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

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

            }
        }
    }

    @Override
    public void getReference(Cfabop cfabop) {
        Cfaead cfaead = cfabop.getCfaead();
        String objtyp = codetableService.getTblKey("EAD","CFACOD");
        String decnum = cfaead.getRecgrp().getBas().getDebtorcode();
        String ref = "";
        if( MdaUtils.isEmpty(cfaead.getRecgrp().getBas().getExdebtcode()) || (!MdaUtils.isEmpty(cfaead.getRecgrp().getBas().getExdebtcode()) && ! validReference(cfabop) ) )
        {
            ref = eblmodService.getCFARef ( cfaead.getRecgrp().getBas().getValuedate(), objtyp, decnum, false, "" );
            if( ! MdaUtils.isEmpty(ref) )
            {
                cfaead.getRecgrp().getBas().setExdebtcode(ref);
            }
            if( MdaUtils.isEmpty(ref) )
            {
                MdaUtils.exitRule();
            }
        }
    }

    @Override
    public boolean validReference(Cfabop cfabop) {
        Cfaead cfaead = cfabop.getCfaead();
        if(MdaUtils.isEmpty(cfaead.getRecgrp().getBas().getExdebtcode())){
            return false;
        }

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

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

    @Override
    public void initCfabop(Cfabop cfabop) {

        //试算逻辑中不重新读取前后数据，只在交易初始化下读取一次就行，不然试算的数据会被覆盖
        //固定值设置 债务类型
        if(!cfabop.getCfaead().getRecgrp().getBas().isModified("debtype")) {
            cfabop.getCfaead().getRecgrp().getBas().setDebtype("1106");
        }

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

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

        //设置变动记录数 dclnum
        int dclnum = 0;
        if("1".equals(cfabop.getCfaead().getCfaflg()) || "3".equals(cfabop.getCfaead().getCfaflg())){
            if("A".equals(cfabop.getCfaead().getCfatyp())){
                dclnum = 1;
            }else if("S".equals(cfabop.getCfaead().getCfatyp())){
                dclnum = 1;
                BigDecimal resamt = new BigDecimal(0);
                if(!MdaUtils.isEmpty(cfabop.getCfaead().getCfaeadBizInfo().getResamt())){
                    resamt = cfabop.getCfaead().getCfaeadBizInfo().getResamt();
                }
                if(MdaUtils.compareTo(resamt,0) > 0){
                    dclnum = 2;
                }
            }
        }

        cfabop.getCfaead().setDclnum(dclnum);

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

    }
}
