循环现金贷提款 - TFDWithDraw
TFDWithDrawHandler.java#execute()

@startuml
(*)  --> ==initTxnContext==
note left:init TxnContext
note right:传入req,初始化中间交易信息TxnInfo


--> ==checkReq==
note left:检查报文
note right:检查金额必须大于0,否则throw E_1043 exception(字段格式错误)



--> ==checkRepeatTxn==
note left:重复交易检查
note right:通过外部流水号(serviceSn)和机构(acqId),查询是否有Order.\n如果有则为重复交易.throw E_9998 exception



--> ==loadData==
note left:加载信息
note right:"ACCT,ACCTO,CARDO,LOAN,LOAN_REG,CUSTOMER"



--> ==getProdParam==
note left:确认产品参数
partition getProdParam() {
    -->[getProdParam()] txnInfo获取贷款产品
    --> "如果产品代码为空,从账户产品取默认产品代码"
    -> "根据贷款产品代码，反向获取账户产品"
    --> "检查"
    note left: 检查贷款产品号与账户产品上的默认分期类型\n对应的贷款产品号是否一致;
    -> "产品等参数设到TxnContext"
}



==getProdParam== --> ==validateForApply==
note left:检查放款参数
partition validateForApply() {
    if "分期类型 != 随借随还"
        -r->[true]"throw E_1052 exception(无效贷款产品)" as E_1052
    else
    if "放款类型 != 循环贷款多次放款"
        -->[true]E_1052
    else
    if "账户有效期 < 业务日期"
        ->[true]throw E_1056 exception(超过合同放款有效期)
    else
        ->[false]"检查借据状态"
    endif

    partition checkLoan() {
        if "借据分期状态 == 终止"
            -r->[true]throw E_1018 exception(贷款已终止)
        else
        if "借据分期状态 == 完成"
            -r->[true]throw E_1019 exception(贷款已结清)
        else
        if "借据分期状态 != 活动状态"
            -r->[true]throw E_1015 exception(无效贷款)
    }
}



==validateForApply== --> ==checkTFDBlockCode==
note left:检查锁定码



==checkTFDBlockCode== --> ==valiLoanOtb==
note left:检查放款额度(OTB)
partition valiLoanOtb() {
        if "交易额度 > 账户可用额度"
            ->[true]"throw E_1010 exception" as E_1010
        else
            -l->[false]"#获取信用计划.\n#获取还款计划"
            -->"#计算必定会入账\n但还未入账的息费类金额.\n#计算提现手续费.\n#费用总和."
            if "费用总和 > 账户可用额度 ?"
            -->[true]E_1010
            endif
        endif
    }



==valiLoanOtb== --> ==bizProc==
note left:业务处理，事务控制
partition bizProc() {
    --> [bizProc()]建立放款注册
    note left:生成并保存LoanReg.\nLoanReg中包含借据号
    ->"更新并保存交易流水--CCS_AUTHMEMO_O"
    -->"组装订单 -- CCS_ORDER"
    ->"更新并保存未入账金额 -- CCS_ACCTO"
    -->"判断卡号"
    note left:"如果客户传入卡号，\n则用传的卡号交易，\n否则用原卡号交易"
}

==bizProc== --> ==payResultProc==
note left:支付并处理结果,单独事务处理.
partition payResultProc() {
    -->"组装支付指令"
    ->"获取金融交易流水--CCS_AUTHMEMO_O"
    if "放款阀值(产品的阀值) < 交易金额"
        ->[true] throw E_9004 E_1055 exception \n("贷款金额大于自动放款阈值，待人工审核放款")
    else
        -l->[false]放款处理
    partition loanProc() {
        ->"更新CCS_ACCTO"
        ->"发送支付指令"
        if "放款结果?"
            -l->[失败]throw ProcessException
        else
            ->[成功]"更新订单--CCS_ORDER"
            -->"随借随还不更新账户信息--CCS_ACCT"
            ->"更新联机账户--CCS_ACCTO"
            -->"更新贷款注册信息--CCS_LOANREG"
            ->"更新联机流水--CCS_AUTHMEMO_O"
            -->"新增入账流水,保存到当日交易入账表--CCS_TXN_POST"
        endif
    }
    endif
}

==payResultProc== --> ==sendSMS==
note left:发送还算成功，成功/失败短信

--> "返回响应"
-->(*)
@enduml