org.fbi.fskfq.processor.T4013Processor.java Source code

Java tutorial

Introduction

Here is the source code for org.fbi.fskfq.processor.T4013Processor.java

Source

package org.fbi.fskfq.processor;

import org.apache.commons.lang.StringUtils;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.fbi.fskfq.domain.cbs.T4011Request.CbsTia4011;
import org.fbi.fskfq.domain.cbs.T4013Request.CbsTia4013;
import org.fbi.fskfq.domain.cbs.T4013Request.CbsTia4013Item;
import org.fbi.fskfq.domain.cbs.T4013Response.CbsToa4013;
import org.fbi.fskfq.domain.tps.base.TpsTia;
import org.fbi.fskfq.domain.tps.base.TpsToaXmlBean;
import org.fbi.fskfq.domain.tps.txn.TpsTia2402;
import org.fbi.fskfq.domain.tps.txn.TpsTia2457;
import org.fbi.fskfq.domain.tps.txn.TpsToa9000;
import org.fbi.fskfq.domain.tps.txn.TpsToa9910;
import org.fbi.fskfq.enums.BillStatus;
import org.fbi.fskfq.enums.TxnRtnCode;
import org.fbi.fskfq.helper.FbiBeanUtils;
import org.fbi.fskfq.helper.MybatisFactory;
import org.fbi.fskfq.repository.dao.FsKfqPaymentInfoMapper;
import org.fbi.fskfq.repository.dao.FsKfqPaymentItemMapper;
import org.fbi.fskfq.repository.model.FsKfqPaymentInfo;
import org.fbi.fskfq.repository.model.FsKfqPaymentInfoExample;
import org.fbi.fskfq.repository.model.FsKfqPaymentItem;
import org.fbi.linking.codec.dataformat.SeperatedTextDataFormat;
import org.fbi.linking.processor.ProcessorException;
import org.fbi.linking.processor.standprotocol10.Stdp10ProcessorRequest;
import org.fbi.linking.processor.standprotocol10.Stdp10ProcessorResponse;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.net.SocketTimeoutException;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.*;

/**
 * Created by zhanrui on 13-12-31.
 * for ccb  
 * -for ccb
 */
public class T4013Processor extends AbstractTxnProcessor {
    private Logger logger = LoggerFactory.getLogger(this.getClass());

    public void doRequest(Stdp10ProcessorRequest request, Stdp10ProcessorResponse response)
            throws ProcessorException, IOException {
        CbsTia4013 cbsTia;
        try {
            cbsTia = getCbsTia(request.getRequestBody());
        } catch (Exception e) {
            logger.error(".", e);
            marshalAbnormalCbsResponse(TxnRtnCode.CBSMSG_UNMARSHAL_FAILED, null, response);
            return;
        }

        //
        FsKfqPaymentInfo paymentInfo = selectNotCanceledPaymentInfoFromDB(cbsTia.getBillNo());
        if (paymentInfo != null) {
            String billStatus = paymentInfo.getLnkBillStatus();
            if (billStatus.equals(BillStatus.PAYOFF.getCode())) { //
                marshalAbnormalCbsResponse(TxnRtnCode.TXN_PAY_REPEATED, null, response);
                logger.info("===.");
                return;
            } else if (!billStatus.equals(BillStatus.INIT.getCode())) { //
                marshalAbnormalCbsResponse(TxnRtnCode.TXN_EXECUTE_FAILED, "", response);
                logger.info("===.");
                return;
            }
        }

        //
        TpsToaXmlBean tpsToa = processTpsTx(cbsTia, request, response);
        if (tpsToa == null) { //
            return;
        }
        //
        String result = tpsToa.getMaininfoMap().get("RESULT");
        if (result != null && !"1457101".equals(result)) { //
            TpsToa9000 tpsToa9000 = new TpsToa9000();
            try {
                FbiBeanUtils.copyProperties(tpsToa.getMaininfoMap(), tpsToa9000, true);
                marshalAbnormalCbsResponse(TxnRtnCode.TXN_EXECUTE_FAILED, tpsToa9000.getAddWord(), response);
            } catch (Exception e) {
                logger.error(".", e);
                marshalAbnormalCbsResponse(TxnRtnCode.TXN_EXECUTE_FAILED, ".",
                        response);

            }
        } else if ("1457101".equals(result)) { // 
            processTxn(cbsTia, request, tpsToa, response);
            String cbsRespMsg = generateCbsRespMsg(tpsToa);
            String rtnStatus = tpsToa.getMaininfoMap().get("SUCC_CODE");
            if (!"OK".equals(rtnStatus)) {
                marshalAbnormalCbsResponse(TxnRtnCode.TXN_EXECUTE_FAILED, rtnStatus, response);
            } else {
                processTxn(cbsTia, request, tpsToa, response);
                cbsRespMsg = generateCbsRespMsg(tpsToa);
                response.setHeader("rtnCode", TxnRtnCode.TXN_EXECUTE_SECCESS.getCode());
                response.setResponseBody(cbsRespMsg.getBytes(response.getCharacterEncoding()));
            }
        } else { //- 
            try {
                String rtnStatus = tpsToa.getMaininfoMap().get("SUCC_CODE");
                String bill_no = tpsToa.getMaininfoMap().get("BILL_NO");
                if (!cbsTia.getBillNo().equals(bill_no)) {
                    marshalAbnormalCbsResponse(TxnRtnCode.TXN_EXECUTE_FAILED, "", response);
                } else {
                    if (!"OK".equals(rtnStatus)) {
                        marshalAbnormalCbsResponse(TxnRtnCode.TXN_EXECUTE_FAILED, rtnStatus, response);
                    } else {
                        processTxn(cbsTia, request, tpsToa, response);
                        String cbsRespMsg = generateCbsRespMsg(tpsToa);
                        response.setHeader("rtnCode", TxnRtnCode.TXN_EXECUTE_SECCESS.getCode());
                        response.setResponseBody(cbsRespMsg.getBytes(response.getCharacterEncoding()));
                    }
                }
            } catch (Exception e) {
                marshalAbnormalCbsResponse(TxnRtnCode.TXN_EXECUTE_FAILED, e.getMessage(), response);
                logger.error(".", e);
            }
        }

    }

    //
    private TpsToaXmlBean processTpsTx(CbsTia4013 tia, Stdp10ProcessorRequest request,
            Stdp10ProcessorResponse response) {
        TpsTia tpsTia = assembleTpsRequestBean(tia, request);
        TpsToaXmlBean tpsToa = new TpsToaXmlBean();

        byte[] sendTpsBuf;
        try {
            sendTpsBuf = generateTpsTxMsgHeader(tpsTia, request);
        } catch (Exception e) {
            logger.error(".", e);
            response.setHeader("rtnCode", TxnRtnCode.TPSMSG_MARSHAL_FAILED.getCode());
            return tpsToa;
        }

        try {
            String dataType = tpsTia.getHeader().getDataType();
            byte[] recvTpsBuf = processThirdPartyServer(sendTpsBuf, dataType);
            String recvTpsMsg = new String(recvTpsBuf, "GBK");

            String rtnDataType = substr(recvTpsMsg, "<dataType>", "</dataType>").trim();
            if ("9910".equals(rtnDataType)) { // 9910
                TpsToa9910 tpsToa9910 = transXmlToBeanForTps9910(recvTpsBuf);
                String errType = tpsToa9910.Body.Object.Record.result;
                String errMsg = tpsToa9910.Body.Object.Record.add_word;
                if (StringUtils.isNotEmpty(errType) && "E301".equals(errType)) { //
                    T9905Processor t9905Processor = new T9905Processor();
                    t9905Processor.doRequest(request, response);
                    errMsg = ",.";
                } else { //
                    if (StringUtils.isEmpty(errMsg))
                        errMsg = ":";
                    else
                        errMsg = ":" + errMsg;
                }
                marshalAbnormalCbsResponse(TxnRtnCode.TXN_EXECUTE_FAILED, errMsg, response);
                logger.info("===()\n" + tpsToa9910.toString());
                return null;
            } else { // 1402
                tpsToa = transXmlToBeanForTps(recvTpsBuf);
            }
        } catch (SocketTimeoutException e) {
            logger.error(".", e);
            response.setHeader("rtnCode", TxnRtnCode.MSG_RECV_TIMEOUT.getCode());
            return null;
        } catch (Exception e) {
            logger.error(".", e);
            response.setHeader("rtnCode", TxnRtnCode.MSG_COMM_ERROR.getCode());
            return null;
        }

        return tpsToa;
    }

    //====
    //Starring
    private CbsTia4013 getCbsTia(byte[] body) throws Exception {
        CbsTia4013 tia = new CbsTia4013();
        SeperatedTextDataFormat starringDataFormat = new SeperatedTextDataFormat(
                tia.getClass().getPackage().getName());
        tia = (CbsTia4013) starringDataFormat.fromMessage(new String(body, "GBK"), "CbsTia4013");
        return tia;
    }

    //
    private FsKfqPaymentInfo selectNotCanceledPaymentInfoFromDB(String billNo) {
        SqlSessionFactory sqlSessionFactory = MybatisFactory.ORACLE.getInstance();
        FsKfqPaymentInfoMapper mapper;
        try (SqlSession session = sqlSessionFactory.openSession()) {
            mapper = session.getMapper(FsKfqPaymentInfoMapper.class);
            FsKfqPaymentInfoExample example = new FsKfqPaymentInfoExample();
            example.createCriteria().andBillNoEqualTo(billNo)
                    .andLnkBillStatusNotEqualTo(BillStatus.CANCELED.getCode());
            List<FsKfqPaymentInfo> infos = mapper.selectByExample(example);
            if (infos.size() == 0) {
                return null;
            }
            if (infos.size() != 1) { //
                throw new RuntimeException(".");
            }
            return infos.get(0);
        }
    }

    //BEAN
    private TpsTia assembleTpsRequestBean(CbsTia4013 cbstia, Stdp10ProcessorRequest request) {
        TpsTia2457 tpstia = new TpsTia2457();
        TpsTia2457.BodyRecord record = ((TpsTia2457.Body) tpstia.getBody()).getObject().getRecord();
        FbiBeanUtils.copyProperties(cbstia, record, true);

        List<TpsTia2457.BodyRecord.DetailRecord> detailRecords = new ArrayList<>();
        for (CbsTia4013Item cbsTia4013Item : cbstia.getItems()) {
            TpsTia2457.BodyRecord.DetailRecord detailRecord = new TpsTia2457.BodyRecord.DetailRecord();
            FbiBeanUtils.copyProperties(cbsTia4013Item, detailRecord, true);
            detailRecords.add(detailRecord);
        }
        record.setObject(detailRecords);
        generateTpsBizMsgHeader(tpstia, "2457", request);
        return tpstia;
    }

    //=============
    private void processTxn(CbsTia4013 cbsTia, Stdp10ProcessorRequest request, TpsToaXmlBean tpsToa,
            Stdp10ProcessorResponse response) {
        FsKfqPaymentInfo paymentInfo;
        SqlSessionFactory sqlSessionFactory = MybatisFactory.ORACLE.getInstance();
        SqlSession session = sqlSessionFactory.openSession();
        String orignResult = tpsToa.getMaininfoMap().get("RESULT");
        boolean updateFlag = false;
        try {
            //            if ("1457101".equals(orignResult)) {
            paymentInfo = selectNotCanceledPaymentInfoFromDB(cbsTia.getBillNo());

            if (paymentInfo != null) {
                updateFlag = true;
            } else {
                paymentInfo = new FsKfqPaymentInfo();
                FbiBeanUtils.copyProperties(cbsTia, paymentInfo);

                Map<String, String> toaMap = tpsToa.getMaininfoMap();
                paymentInfo.setChrId(toaMap.get("CHR_ID"));
                paymentInfo.setBilltypeCode(toaMap.get("BILLTYPE_CODE"));
                paymentInfo.setBilltypeName(toaMap.get("BILLTYPE_NAME"));
                // 2457 cbstia,
                // paymentInfo.setVerifyNo(toaMap.get("VERIFY_NO"));

                paymentInfo.setVerifyNo(cbsTia.getVerifyNo());
                paymentInfo.setMakedate(toaMap.get("MAKEDATE"));
                paymentInfo.setIenCode(toaMap.get("IEN_CODE"));
                paymentInfo.setIenName(toaMap.get("IEN_NAME"));
                paymentInfo.setSetYear(toaMap.get("SET_YEAR"));

                //TODO BankIndateincomingstatuspm_code 
                Date date = null;
                try {
                    date = new SimpleDateFormat("yyyyMMddHHmmss").parse(request.getHeader("txnTime"));
                } catch (ParseException e) {
                    e.printStackTrace();
                }
                paymentInfo.setBankIndate(new SimpleDateFormat("yyyy-MM-dd").format(date));

                paymentInfo.setBusinessId(request.getHeader("serialNo"));

                paymentInfo.setOperPayBankid(request.getHeader("branchId"));
                paymentInfo.setOperPayTlrid(request.getHeader("tellerId"));
                paymentInfo.setOperPayDate(new SimpleDateFormat("yyyyMMdd").format(new Date()));
                paymentInfo.setOperPayTime(new SimpleDateFormat("HHmmss").format(new Date()));
                paymentInfo.setOperPayHostsn(request.getHeader("serialNo"));

                paymentInfo.setManualFlag("1"); //
                paymentInfo.setArchiveFlag("0");

                paymentInfo.setPkid(UUID.randomUUID().toString());
            }

            // TODO  2402 - 20141231
            TpsTia2402 tpstia = new TpsTia2402();
            TpsTia2402.BodyRecord record = ((TpsTia2402.Body) tpstia.getBody()).getObject().getRecord();
            // TODO BEAN 2402Bean
            FbiBeanUtils.copyProperties(cbsTia, record, true);
            record.setChr_id(paymentInfo.getChrId());
            record.setBank_indate(paymentInfo.getBankIndate());
            record.setIncomestatus(paymentInfo.getIncomestatus());
            record.setRoute_user_code(paymentInfo.getRouteUserCode());
            record.setBusiness_id(paymentInfo.getBusinessId());
            record.setLicense(paymentInfo.getLicense());
            record.setIncomestatus("5");

            generateTpsBizMsgHeader(tpstia, "2402", request);
            tpstia.getHeader().setMsgRef(request.getHeader("serialNo") + "9");
            tpstia.getHeader().setMsgId(request.getHeader("txnTime") + request.getHeader("serialNo") + "9");

            //            TpsToaXmlBean tps2402Toa = new TpsToaXmlBean();

            byte[] sendTpsBuf = new byte[0];
            try {
                sendTpsBuf = generateTpsTxMsgHeader(tpstia, request);
            } catch (UnsupportedEncodingException e) {
                e.printStackTrace();
            }

            String dataType = tpstia.getHeader().getDataType();
            byte[] recvTpsBuf = new byte[0];
            try {
                recvTpsBuf = processThirdPartyServer(sendTpsBuf, dataType);
            } catch (Exception e) {
                e.printStackTrace();
            }
            String recvTpsMsg = null;
            try {
                recvTpsMsg = new String(recvTpsBuf, "GBK");
            } catch (UnsupportedEncodingException e) {
                e.printStackTrace();
            }

            String rtnDataType = substr(recvTpsMsg, "<dataType>", "</dataType>").trim();
            if ("9910".equals(rtnDataType)) { // 9910
                TpsToa9910 tpsToa9910 = transXmlToBeanForTps9910(recvTpsBuf);
                String errType = tpsToa9910.Body.Object.Record.result;
                String errMsg = tpsToa9910.Body.Object.Record.add_word;
                if (StringUtils.isEmpty(errMsg))
                    errMsg = ":";
                else
                    errMsg = ":" + errMsg;
                marshalAbnormalCbsResponse(TxnRtnCode.TXN_EXECUTE_FAILED, errMsg, response);
                logger.info("===()\n" + tpsToa9910.toString());
                throw new RuntimeException(errMsg);

            } else { // 1402
                tpsToa = transXmlToBeanForTps(recvTpsBuf);
                if (tpsToa == null) { //
                    throw new RuntimeException("");
                }
                String result = tpsToa.getMaininfoMap().get("RESULT");
                if (result != null) { //
                    TpsToa9000 tpsToa9000 = new TpsToa9000();
                    FbiBeanUtils.copyProperties(tpsToa.getMaininfoMap(), tpsToa9000, true);
                    marshalAbnormalCbsResponse(TxnRtnCode.TXN_EXECUTE_FAILED, tpsToa9000.getAddWord(), response);
                } else {
                    String rtnStatus = tpsToa.getMaininfoMap().get("SUCC_CODE");
                    String chr_id = tpsToa.getMaininfoMap().get("CHR_ID");
                    String bill_no = tpsToa.getMaininfoMap().get("BILL_NO");
                    // 2014-12-23 40132457
                    paymentInfo.setHostBookFlag("0");
                    paymentInfo.setHostChkFlag("0");
                    paymentInfo.setFbBookFlag("0");
                    paymentInfo.setFbChkFlag("0");

                    //                    paymentInfo.setAreaCode("KaiFaQu-FeiShui");
                    //20150105  
                    paymentInfo.setAreaCode(cbsTia.getAreaCode());
                    paymentInfo.setHostAckFlag("0");
                    paymentInfo.setLnkBillStatus(BillStatus.INIT.getCode()); // 
                    FsKfqPaymentInfoMapper infoMapper = session.getMapper(FsKfqPaymentInfoMapper.class);

                    if (!paymentInfo.getChrId().equals(chr_id) || !paymentInfo.getBillNo().equals(bill_no)) {
                        marshalAbnormalCbsResponse(TxnRtnCode.TXN_EXECUTE_FAILED, "", response);
                    } else {
                        if (!"OK".equals(rtnStatus)) {
                            marshalAbnormalCbsResponse(TxnRtnCode.TXN_EXECUTE_FAILED, rtnStatus, response);
                        } else {
                            // 

                            // 20141231 ccblinking
                            paymentInfo.setHostBookFlag("1");
                            paymentInfo.setHostChkFlag("0");
                            paymentInfo.setFbBookFlag("1");
                            paymentInfo.setFbChkFlag("0");

                            //                            paymentInfo.setAreaCode("KaiFaQu-FeiShui");
                            //20150105  
                            paymentInfo.setAreaCode(cbsTia.getAreaCode());
                            paymentInfo.setHostAckFlag("0");
                            paymentInfo.setLnkBillStatus(BillStatus.PAYOFF.getCode()); //

                            marshalSuccessTxnCbsResponse(response);

                            if ("1457101".equals(orignResult) || updateFlag) {
                                //  
                                infoMapper.updateByPrimaryKey(paymentInfo);
                            }
                        }
                        if (!updateFlag) {
                            infoMapper.insert(paymentInfo);
                            //Items
                            FsKfqPaymentItemMapper itemMapper = session.getMapper(FsKfqPaymentItemMapper.class);
                            for (CbsTia4013Item cbsTia4013Item : cbsTia.getItems()) {
                                FsKfqPaymentItem item = new FsKfqPaymentItem();
                                FbiBeanUtils.copyProperties(cbsTia4013Item, item);
                                item.setMainPkid(paymentInfo.getPkid());
                                itemMapper.insert(item);
                            }
                        }
                    }

                }
                // TODO-----------
                session.commit();
            }
        } finally {
            session.close();
        }
    }

    //CBS

    private String generateCbsRespMsg(TpsToaXmlBean tpsToa) {
        CbsToa4013 cbsToa = new CbsToa4013();
        Map<String, String> toaMap = tpsToa.getMaininfoMap();
        FbiBeanUtils.copyProperties(toaMap, cbsToa, true);

        String cbsRespMsg = "";
        Map<String, Object> modelObjectsMap = new HashMap<String, Object>();
        modelObjectsMap.put(cbsToa.getClass().getName(), cbsToa);
        SeperatedTextDataFormat cbsDataFormat = new SeperatedTextDataFormat(
                cbsToa.getClass().getPackage().getName());
        try {
            cbsRespMsg = (String) cbsDataFormat.toMessage(modelObjectsMap);
        } catch (Exception e) {
            throw new RuntimeException(".", e);
        }
        return cbsRespMsg;
    }

}