java mina FundTradeSAOImpl 入口

package com.pingan.emall.integration.sao.impl;




import com.paic.pafa.app.biz.service.BusinessServiceException;
import com.pingan.emall.biz.communication.TcpConnector;
import com.pingan.emall.dto.MidFundDTO;
import com.pingan.emall.dto.MidRequestDTO;
import com.pingan.emall.dto.MidResponseDTO;
import com.pingan.emall.dto.MidUserDTO;
import com.pingan.emall.integration.sao.FundTradeSAO;
import com.pingan.emall.util.fund.BlowFish;
import com.pingan.emall.util.fund.FundTradeConstants;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import org.apache.log4j.Logger;


/**
 * 發送mina 消息 入口
 * @author lisu005
 *
 */
public class FundTradeSAOImpl implements FundTradeSAO {

private static final Logger LOG = Logger.getLogger(FundTradeSAOImpl.class);
private TcpConnector connector;


@Override
public MidResponseDTO invokeMidRequest(MidRequestDTO request) throws BusinessServiceException {
Object sessionKey = null;
try {
sessionKey = connector.connect();
// sign in
String worksKey = signIn(sessionKey);

// invoke detail mid request
return invokeWithSession(sessionKey, request, worksKey);
} catch (Exception e) {
LOG.error("Exception happens when connect to mid gateway", e);
if (e instanceof BusinessServiceException) {
throw (BusinessServiceException) e;
} else {
throw new BusinessServiceException(e);
}
} finally {
if (sessionKey != null) {
connector.close(sessionKey);
}
}
}

@Override
public MidResponseDTO login(MidUserDTO user) throws BusinessServiceException {
Object sessionKey = null;
try {
sessionKey = connector.connect();
// 100 系統簽入
String worksKey = signIn(sessionKey);

// 調用301接口登錄證券賬戶
MidRequestDTO request = getLoginRequest(user);
MidResponseDTO loginResponse = invokeWithSession(sessionKey, request, worksKey);
if (!loginResponse.isResponseSucceed()) {
return loginResponse;
}
Map<String, String> userRow = loginResponse.getResultList().get(0);
user.setBranch(userRow.get("BRANCH"));
user.setSession(userRow.get("SESSION"));

// 調用309接口查詢資金賬戶
request = getQueryAccountRequest(user);
MidResponseDTO response = invokeWithSession(sessionKey, request, worksKey);
if (!response.isResponseSucceed()) {
return response;
}
List<Map<String, String>> accountRows = response.getResultList();
// 客戶僅有一個資金賬戶, 則默認爲主資金賬戶
String account = accountRows.get(0).get("ACCOUNT");
if (accountRows.size() == 1) {
userRow.put("ACCOUNT", account);
return loginResponse;
}

// 客戶有多個資金賬戶, 調用618接口查詢主資金賬戶
request = getQueryMultiAccountRequest(user);
response = invokeWithSession(sessionKey, request, worksKey);
if (response.isResponseSucceed()) {
for (Map<String, String> accountRow : response.getResultList()) {
if ("1".equals(accountRow.get("ISMAIN"))) {
account = accountRow.get("ACCOUNT");
break;
}
}
}


userRow.put("ACCOUNT", account);
return loginResponse;
} catch(Exception e) {
LOG.error("Exception happens when connect to mid gateway", e);
if (e instanceof BusinessServiceException) {
throw (BusinessServiceException) e;
} else {
throw new BusinessServiceException(e);
}
} finally {
if (sessionKey != null) {
connector.close(sessionKey);
}
}
}

public boolean createFundAccountIfNotExist(MidUserDTO user, MidFundDTO fund) throws BusinessServiceException {
Object sessionKey = null;
try {
sessionKey = connector.connect();
// 100 系統簽入
String worksKey = signIn(sessionKey);
// 查詢用戶是否開了該基金戶, 如已開戶直接返回true
MidRequestDTO request = getQueryFundAccountRequest(user, fund);
MidResponseDTO response = invokeWithSession(sessionKey, request, worksKey);
if (response.isResponseSucceed()) {
return true;
}
// 查詢用戶詳細信息用於開戶
request = getQueryCustomerInfoRequest(user);
   response = invokeWithSession(sessionKey, request, worksKey);
   if (!response.isResponseSucceed()) {
    StringBuilder builder = new StringBuilder();
builder.append("Failed to query detail information of customer ")
.append(user.getUserCode()).append(", responseMessage : ")
.append(response.getResponseMessage());
LOG.error(builder.toString());
return false;
   }
   // 基金開戶
   Map<String, String> userMap = response.getResultList().get(0);
   request = getCreateFundAccountRequest(user, userMap, fund);
   response = invokeWithSession(sessionKey, request, worksKey);
   if (!response.isResponseSucceed()) {
StringBuilder builder = new StringBuilder();
builder.append("Failed to create fund account for customer ")
.append(user.getUserCode()).append(", responseMessage : ")
.append(response.getResponseMessage());
LOG.error(builder.toString());
return false;
}

return true;
} catch(Exception e) {
LOG.error("Exception happens when connect to mid gateway", e);
if (e instanceof BusinessServiceException) {
throw (BusinessServiceException) e;
} else {
throw new BusinessServiceException(e);
}
} finally {
if (sessionKey != null) {
connector.close(sessionKey);
}
}
}

/**
* Do mid sign in

* @param sessionKey
* @return worksKey, return null if sign in failed
* @throws Exception
*/
private String signIn(Object sessionKey) throws Exception {
MidRequestDTO signRequest = new MidRequestDTO(FundTradeConstants.FUNCTION_SIGN_IN);
MidResponseDTO signResponse = connector.send(sessionKey, signRequest);
if (!signResponse.isResponseSucceed()) {
throw new BusinessServiceException("Do mid signIn(302) failed, response message : " + signResponse.getResponseMessage());
}


Map<String, String> signRow = signResponse.getResultList().get(0);
// works key
String encWorksKey = signRow.get(FundTradeConstants.WORKS_KEY);
String decWorksKey = BlowFish.decrypt(encWorksKey, null);

return decWorksKey;
}

private MidResponseDTO invokeWithSession(Object sessionKey, MidRequestDTO request, String worksKey) throws Exception {
request.getHeader().setCrc(worksKey);

MidResponseDTO invokeResponse = connector.send(sessionKey, request);
if (!invokeResponse.isResponseSucceed()) {
return invokeResponse;
}

// Handle next packages
List<Map<String, String>> resultList = new ArrayList<Map<String, String>>();
resultList.addAll(invokeResponse.getResultList());
while (invokeResponse.hasNextPackage()) {
request.getBodyParams().clear();
request.getBodyParams().add(FundTradeConstants.FUNCTION_NEXT_PACKAGE);
request.getHeader().setCrc(worksKey);

invokeResponse = connector.send(sessionKey, request);
if (!invokeResponse.isResponseSucceed()) {
break;
}
resultList.addAll(invokeResponse.getResultList());
}
invokeResponse.setResultList(resultList);


return invokeResponse;
}

/**
* 獲取MID 301 登錄請求
* @param user
* @return MidRequestDTO
* @throws Exception
*/
private MidRequestDTO getLoginRequest(MidUserDTO user) {
MidRequestDTO request = new MidRequestDTO(FundTradeConstants.FUNCTION_LOGIN);
request.getHeader().init(user);
request.getBodyParams().add(FundTradeConstants.USER_ID_CLS_U);
request.getBodyParams().add(user.getUserCode());
request.getBodyParams().add(user.getPassword() + "|1");
request.getBodyParams().add(user.getRemark());
return request;
}

/**
* 獲取MID 309 查詢資金賬戶請求
* @param user
* @return MidRequestDTO
*/
private MidRequestDTO getQueryAccountRequest(MidUserDTO user) {
MidRequestDTO request = new MidRequestDTO(FundTradeConstants.FUNCTION_QUERY_ACCOUNT);
request.getHeader().init(user);
request.getBodyParams().add(user.getUserCode());     // 客戶代碼
request.getBodyParams().add("");                     // 資金賬戶
request.getBodyParams().add("");
return request;
}

/**
* 獲取MID 618 查詢單賬戶多銀行記錄
* @param user
* @return MidRequestDTO
*/
private MidRequestDTO getQueryMultiAccountRequest(MidUserDTO user) {
MidRequestDTO request = new MidRequestDTO(FundTradeConstants.FUNCTION_QUERY_MULTI_ACCOUNT);
request.getHeader().init(user);
request.getBodyParams().add(user.getUserCode());     // 客戶代碼
request.getBodyParams().add("");
request.getBodyParams().add("");
request.getBodyParams().add("");
request.getBodyParams().add("");
request.getBodyParams().add("");
request.getBodyParams().add("200");                  // 本次查詢記錄數
request.getBodyParams().add("");
request.getBodyParams().add("");
request.getBodyParams().add("1");                    // 訪問權限控制
return request;
}

private MidRequestDTO getQueryFundAccountRequest(MidUserDTO user, MidFundDTO fund) {
MidRequestDTO request = new MidRequestDTO(FundTradeConstants.FUNCTION_QUERY_FUND_ACCOUNT);
request.getHeader().init(user);


request.getBodyParams().add(fund.getTaCode());      // 基金公司代碼
request.getBodyParams().add(user.getUserCode());    // 客戶代碼
request.getBodyParams().add("");                    // 基金賬戶
request.getBodyParams().add("");                    // 賬戶狀態
request.getBodyParams().add(user.getUserAccount()); // 資產賬號
return request;
}


private MidRequestDTO getQueryCustomerInfoRequest(MidUserDTO user) {
MidRequestDTO request = new MidRequestDTO(
FundTradeConstants.FUNCTION_QUERY_CUSTOMER);
request.getHeader().init(user);
request.getBodyParams().add(user.getUserCode());    // 客戶代碼


return request;
}

private MidRequestDTO getCreateFundAccountRequest(MidUserDTO user, Map<String, String> userMap, MidFundDTO fund) {
MidRequestDTO request = new MidRequestDTO(FundTradeConstants.FUNCTION_CREATE_FUND_ACCOUNT);
request.getHeader().init(user);


request.getBodyParams().add(user.getUserAccount()); // 資產賬號
request.getBodyParams().add("01"); // 交易行爲 01開戶
request.getBodyParams().add(fund.getTaCode()); // 登記公司代碼
request.getBodyParams().add(""); // 基金賬號
request.getBodyParams().add("0"); // 缺省分紅方式
request.getBodyParams().add("1"); // 對賬單寄送選擇, 1:不寄送
request.getBodyParams().add(""); // TA系統交易手段
request.getBodyParams().add(""); // 密函編號
request.getBodyParams().add("2"); // 客戶資料標示 2
request.getBodyParams().add(userMap.get("USER_NAME")); // 用戶名稱
request.getBodyParams().add(userMap.get("USER_TYPE")); // 用戶性質
request.getBodyParams().add(userMap.get("USER_FNAME")); // 全稱
request.getBodyParams().add(userMap.get("ID_TYPE")); // 證件類型
request.getBodyParams().add(userMap.get("ID_CODE")); // 證件號
request.getBodyParams().add(""); // 法人代表
request.getBodyParams().add(""); // 法人證件類型
request.getBodyParams().add(""); // 法人代表證件號碼
request.getBodyParams().add(""); // 聯繫人
request.getBodyParams().add(""); // 聯繫人證件類型
request.getBodyParams().add(""); // 聯繫人證件號碼
request.getBodyParams().add(""); // 聯繫人電話
request.getBodyParams().add(userMap.get("ADDRESS")); // 通訊地址
request.getBodyParams().add(userMap.get("ZIP_CODE")); // 郵政編碼
request.getBodyParams().add(""); // 電話
request.getBodyParams().add(""); // 移動電話
request.getBodyParams().add(""); // Email
request.getBodyParams().add(""); // 性別
request.getBodyParams().add(""); // 備註

return request;
}


public void setConnector(TcpConnector connector) {
this.connector = connector;
}
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章