package com.sp2p.service.admin; import java.math.BigDecimal; import java.sql.Connection; import java.sql.SQLException; import java.text.DecimalFormat; import java.util.ArrayList; import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Map; import net.sf.json.JSONArray; import net.sf.json.JSONObject; import org.apache.commons.lang.StringUtils; import com.shove.Convert; import com.shove.base.BaseService; import com.shove.config.ChinaPnrConfig; import com.shove.data.DataSet; import com.shove.data.dao.MySQL; import com.shove.util.BeanMapUtils; import com.shove.vo.PageBean; import com.sp2p.dao.admin.AdminDao; import com.sp2p.dao.admin.FIManageDao; import com.sp2p.dao.admin.merDao; import com.sp2p.database.Dao.Procedures; import com.sp2p.util.ChinaPnRInterface; import com.sp2p.util.DateUtil; /** * 商户管理 service */ public class merService extends BaseService { private merDao merDao; private AdminDao adminDao; private FIManageDao fiManageDao; public void setAdminDao(AdminDao adminDao) { this.adminDao = adminDao; } public void setMerDao(merDao merDao) { this.merDao = merDao; } public void setFiManageDao(FIManageDao fiManageDao) { this.fiManageDao = fiManageDao; } public String merRecharge(String subAcct, double amount, String cardDcFlag) throws SQLException { Connection conn = MySQL.getConnection(); Date now = new Date(); String html = ""; String ordDate = DateUtil.dateToYMD(now); String moneyStr = new DecimalFormat("0.00").format(amount); try { // 为了不和前台充值冲突,出现重复交易,取个ordIdR long ordId = merDao.addRecharge(conn); merDao.deleteRechargeDetails(conn, ordId); ordId = merDao.addMerRecharge(conn, ordId, amount, subAcct, now); if (ordId <= 0) { conn.rollback(); return html; } html = ChinaPnRInterface.netSave("商户充值", ordId + "", "", ChinaPnrConfig.chinapnr_merCustId, ordDate, moneyStr, "B2B", "merSave", ChinaPnrConfig.chinapnr_retUrl_bg, cardDcFlag); conn.commit(); } catch (Exception e) { e.printStackTrace(); } finally { conn.close(); } return html; } /** 充值成功 */ public String updateMerRecharge(String id, String trxId, String fee) throws SQLException { Connection conn = MySQL.getConnection(); try { // 查询子账户,同步数据 String usableMoney = ""; JSONObject json = JSONObject.fromObject(ChinaPnRInterface.queryAccts()); JSONArray js = json.getJSONArray("AcctDetails"); for (int i = 0; i < js.size(); i++) { JSONObject j = js.getJSONObject(i); String subAcct = j.getString("SubAcctId");// 子账户 if (ChinaPnrConfig.chinapnr_cfb.equals(subAcct)) { usableMoney = j.getString("AcctBal");// 账户余额 } String subAcctMoney = j.getString("AcctBal");// 账户余额 adminDao.updateAdminMoney(conn, subAcct, subAcctMoney); } if (StringUtils.isBlank(usableMoney)) { usableMoney = adminDao.queryAdminByAcctId(conn, ChinaPnrConfig.chinapnr_cfb); } merDao.updateMerRechargeSuccess(conn, id, trxId, fee, usableMoney); conn.commit(); return "充值成功"; } catch (Exception e) { conn.rollback(); e.printStackTrace(); } finally { conn.close(); } return "系统异常"; } /** 充值失败处理 **/ public void netSaveFail(String ordId, String trxId, String fee) throws SQLException { long id = Convert.strToLong(ordId, -1); if (id < 0) return; Connection conn = MySQL.getConnection(); try { // 查询子账户,同步数据 String usableMoney = ""; JSONObject json = JSONObject.fromObject(ChinaPnRInterface.queryAccts()); JSONArray js = json.getJSONArray("AcctDetails"); for (int i = 0; i < js.size(); i++) { JSONObject j = js.getJSONObject(i); String subAcct = j.getString("SubAcctId");// 子账户 if (ChinaPnrConfig.chinapnr_cfb.equals(subAcct)) { usableMoney = j.getString("AcctBal");// 账户余额 } String subAcctMoney = j.getString("AcctBal");// 账户余额 adminDao.updateAdminMoney(conn, subAcct, subAcctMoney); } if (StringUtils.isBlank(usableMoney)) { usableMoney = adminDao.queryAdminByAcctId(conn, ChinaPnrConfig.chinapnr_cfb); } long ret = merDao.netSaveFail(conn, id, trxId, fee, usableMoney); if (ret > 0) { conn.commit(); } } catch (Exception e) { conn.rollback(); e.printStackTrace(); } finally { conn.close(); } } /** * 商户转账 * * @param adminId * @param amount * @param outSubAcct * @param inSubAcct * @return * @throws Exception */ @SuppressWarnings("null") public String merRechargeTransfer(long adminId, double amount, String outSubAcct, String inSubAcct) throws Exception { Connection conn = MySQL.getConnection(); // Date now = new Date(); // String html = ""; // String ordDate = DateUtil.dateToYMD(now); // String moneyStr = new DecimalFormat("0.00").format(amount); // 查询出账账户信息 Map<String, String> outMap = merDao.queryOutSubAcct(conn, outSubAcct); // 查询入账账户信息 Map<String, String> inMap = merDao.queryInSubAcct(conn, inSubAcct); // JSONObject transfer = null; JSONObject json = null; // JSONObject json1 = null; try { // long ordId = merDao.addRepayment(conn, new Date()); long ordId = merDao.addBack_w(conn); // merDao.deleteBack_w(conn,ordId); if (ordId <= 0) { conn.rollback(); return null; } if (outMap == null || inMap == null) { json.getString("系统异常"); return null; } String jsonTransfer = ChinaPnRInterface.transfer(ordId + "", ChinaPnrConfig.chinapnr_merCustId, outSubAcct, amount + "", ChinaPnrConfig.chinapnr_merCustId, inSubAcct); json = JSONObject.fromObject(jsonTransfer); int codeTransfer = json.getInt("RespCode"); if (codeTransfer == 0) { // 删除插入的测试数据 // merDao.deleteRepayment(conn, ordId); String jsonStr = ChinaPnRInterface.queryBalanceBg(outMap.get("usrCustId"));// 汇付查询专属账户余额 json = JSONObject.fromObject(jsonStr); int RespCode = json.getInt("RespCode"); String outAvlBal = json.getString("AvlBal"); outAvlBal = outAvlBal.replaceAll(",", ""); // 更新出账账户余额--汇付结果 if (RespCode == 0) { if ((outMap.get("subAcctMoney") != outAvlBal) || (!outMap.get("subAcctMoney").equals(outAvlBal))) { merDao.updateOutSubAcct(conn, outAvlBal, outSubAcct); } } // if (RespCode == 0) { // JSONArray array = json.getJSONArray("AcctDetails"); // for (int i = 0; i < array.size(); i++) { // JSONObject jjj = array.getJSONObject(i); // if (jjj.getString("SubAcctId").equals( // outMap.get("subAcct"))) { // String avlBal = jjj.getString("AvlBal"); // avlBal = avlBal.replace(",", ""); // // 更新出账账户余额--汇付结果 // if ((outMap.get("subAcctMoney") != outAvlBal) || // (!outMap.get("subAcctMoney").equals(outAvlBal))) { // merDao.updateOutSubAcct(conn, outAvlBal,outSubAcct); // } // } // } // } // 汇付查询专属账户余额 String jsonStr1 = ChinaPnRInterface.queryBalanceBg(inMap.get("usrCustId")); json = JSONObject.fromObject(jsonStr1); int RespCode1 = json.getInt("RespCode"); String inAvlBal = json.getString("AvlBal"); inAvlBal = inAvlBal.replace(",", ""); // 更新入账账户余额--汇付结果 if (RespCode1 == 0) { if ((inMap.get("inAcctMoney") != inAvlBal) || (!inMap.get("inAcctMoney").equals(inAvlBal))) { merDao.updateInSubAcct(conn, inAvlBal, inSubAcct); } } json.getString("RespDesc"); conn.commit(); } else { conn.rollback(); } } catch (Exception e) { e.printStackTrace(); conn.rollback(); } finally { conn.close(); } return json.getString("RespDesc"); } /** 充值记录 */ @SuppressWarnings("unchecked") public void queryMerRechargeList(PageBean pageBean, String start, String end) throws SQLException { Connection conn = MySQL.getConnection(); String cmd = ""; if (!StringUtils.isBlank(start)) { cmd += " and rechargeTime >= '" + start + "'"; } if (!StringUtils.isBlank(end)) { cmd += " and DATE_ADD(rechargeTime,INTERVAL -1 day)<= '" + end + "'"; } try { dataPage(conn, pageBean, " t_merRecharge ", " id,money,rechargeTime,subAcct,result,ifnull(trxId,'--') as trxId,usableSum,fee ", " order by rechargeTime desc ", cmd); } catch (Exception e) { e.printStackTrace(); } finally { conn.close(); } } /** * 充值记录 * * @param queryTrade * @param endTime */ public List<Map<String, Object>> queryOrdIdList(String userName, String startTime, String endTime, String queryTrade) throws SQLException { Connection conn = MySQL.getConnection(); List<Map<String, Object>> map = null; // 查询充值ID try { if (null != queryTrade && (queryTrade == "NETSAVE" || queryTrade.equals("NETSAVE"))) { map = merDao.queryTrechargeDetail(conn, userName, startTime, endTime); } if (null != queryTrade && (queryTrade == "LOANS" || queryTrade.equals("LOANS"))) { map = merDao.queryLoans(conn, userName, startTime, endTime); } if (null != queryTrade && (queryTrade == "REPAYMENT" || queryTrade.equals("REPAYMENT"))) { map = merDao.queryRepayment(conn, userName, startTime, endTime); } if (null != queryTrade && (queryTrade == "CASH" || queryTrade.equals("CASH"))) { map = merDao.queryCash(conn, userName, startTime, endTime); } if (null != queryTrade && (queryTrade == "CASHAUDIT" || queryTrade.equals("CASHAUDIT"))) { map = merDao.queryCashAudit(conn, userName, startTime, endTime); } if (null != queryTrade && (queryTrade == "INITIATIVETENDER" || queryTrade.equals("INITIATIVETENDER"))) { map = merDao.queryInitiativeTender(conn, userName, startTime, endTime); } if (null != queryTrade && (queryTrade == "MERCASH" || queryTrade.equals("MERCASH"))) { map = merDao.queryMerCash(conn, userName, startTime, endTime); } } catch (Exception e) { e.printStackTrace(); } finally { conn.close(); } return map; } /** * 交易状态查询 * * @param ordId * @param startTime * @param queryTrade * @return */ public String queryTransStatus(String ordId, String startTime, String queryTrade) throws Exception { JSONObject json = null; try { String jsonStr = ChinaPnRInterface.queryTransStat(ordId, startTime, queryTrade);// 汇付查询交易状态 json = JSONObject.fromObject(jsonStr); } catch (Exception e) { e.printStackTrace(); } return json.getString("RespDesc"); } /** * 对账时,根据userCustId获取用户名 * * @param pageBean * 汇付返回的数据,封装在pageBean里面 * */ @SuppressWarnings("unchecked") public void getUsernameByCustId(PageBean pageBean) throws SQLException { List<Map<String, String>> list = pageBean.getPage(); if (list == null || list.size() == 0) { return; } StringBuilder cmd = new StringBuilder(" select username,usrCustId from t_user where usrCustId in ("); for (Map<String, String> map : list) { cmd.append(map.get("UsrCustId")).append(","); } cmd.deleteCharAt(cmd.length() - 1).append(") "); Connection conn = MySQL.getConnection(); try { DataSet dataSet = MySQL.executeQuery(conn, cmd.toString()); dataSet.tables.get(0).rows.genRowsMap(); List<Map<String, Object>> names = dataSet.tables.get(0).rows.rowsMap; Map<String, Object> name = new HashMap<String, Object>(); for (Map<String, Object> map : names) {// 获取usrCustId:username键值对 name.put(map.get("usrCustId") + "", map.get("username")); } for (Map<String, String> map : list) {// 加入username属性 if (ChinaPnrConfig.chinapnr_merCustId.equals(map.get("UsrCustId"))) { map.put("username", "商户"); } else { map.put("username", name.get(map.get("UsrCustId")) + ""); } } pageBean.setPage(list); } catch (Exception e) { e.printStackTrace(); } finally { conn.close(); } } /** * 投标对账时调用,根据InvestCustId 和 BorrCustId查找用户名 */ @SuppressWarnings("unchecked") public void getUsernameByCustId2(PageBean pageBean) throws SQLException { List<Map<String, String>> list = pageBean.getPage(); if (list == null || list.size() == 0) { return; } StringBuilder cmd = new StringBuilder(" select username,usrCustId from t_user where usrCustId in ("); for (Map<String, String> map : list) { cmd.append(map.get("InvestCustId")).append(",").append(map.get("BorrCustId")).append(","); } cmd.deleteCharAt(cmd.length() - 1).append(") "); Connection conn = MySQL.getConnection(); try { DataSet dataSet = MySQL.executeQuery(conn, cmd.toString()); dataSet.tables.get(0).rows.genRowsMap(); List<Map<String, Object>> names = dataSet.tables.get(0).rows.rowsMap; Map<String, Object> name = new HashMap<String, Object>(); for (Map<String, Object> map : names) {// 获取usrCustId:username键值对 name.put(map.get("usrCustId") + "", map.get("username")); } for (Map<String, String> map : list) {// 加入username属性 map.put("investor", name.get(map.get("InvestCustId")) + ""); map.put("borrower", name.get(map.get("BorrCustId")) + ""); } pageBean.setPage(list); } catch (Exception e) { e.printStackTrace(); } finally { conn.close(); } } /** * 子账户取现 * * @return * @throws Exception * [参数说明] * */ @SuppressWarnings("null") public String addMerCash(double transAmt, String userId, Long adminId, String subAcct, String usrCustId) throws Exception { Connection conn = MySQL.getConnection(); JSONObject json = null; try { // 添加提现记录 long ordId = fiManageDao.addMerCash(conn, userId, transAmt, adminId); if (ordId < 0) { conn.rollback(); return json.getString("操作失败"); } String amtStr = new DecimalFormat("0.00").format(transAmt); json = JSONObject.fromObject(ChinaPnRInterface.merCash(ordId + "", subAcct, amtStr, "")); if (json == null) { return json.getString("签名错误"); } if (null != json && json.getInt("RespCode") != 0) { conn.rollback(); return json.getString("RespDesc"); } fiManageDao.updateMerCash(conn, ordId, json.getString("OpenAcctId"), json.getString("FeeAmt")); // 更新子账户余额 String jsonStr = ChinaPnRInterface.queryAccts();// 汇付查()询专属账户余额 if (null != jsonStr && !jsonStr.equals("签名错误")) { json = JSONObject.fromObject(jsonStr); int RespCode = json.getInt("RespCode"); if (RespCode == 0) { JSONArray array = json.getJSONArray("AcctDetails"); for (int i = 0; i < array.size(); i++) { JSONObject jjj = array.getJSONObject(i); if (jjj.getString("SubAcctId").equals(subAcct)) { String avlBal = jjj.getString("AvlBal"); avlBal = avlBal.replace(",", ""); // 更新出账账户余额--汇付结果 adminDao.updateSubAcct(conn, avlBal, subAcct.toString()); } } } } } catch (Exception e) { e.printStackTrace(); return json.getString("RespDesc"); } finally { conn.close(); } return json.toString(); } /** * 查询子账户取现记录 * * @param pageBean * @param userID * @throws Exception * [参数说明] */ public List<Map<String, Object>> queryCfbMerCashList(long userId) throws Exception { Connection conn = MySQL.getConnection(); List<Map<String, Object>> map = null; try { map = merDao.queryCfbMerCashList(conn, userId); } catch (Exception e) { e.printStackTrace(); } finally { conn.close(); } return map; } public String getUsrId(String busiCode) throws Exception { Connection conn = MySQL.getConnection(); try { long id = MySQL.executeNonQuery(conn, " insert into t_user (enable) values (3)"); MySQL.executeNonQuery(conn, " delete from t_user where id=" + id); MySQL.executeNonQuery(conn, " insert into t_company (id,busiCode) values (" + id + ",'" + busiCode + "')"); conn.commit(); return id + ""; } catch (Exception e) { e.printStackTrace(); return null; } finally { conn.close(); } } @SuppressWarnings("unchecked") public Map<String, String> queryCompanyInfo(long usrCustId, PageBean pageBean) throws Exception { Map<String, String> map = null; JSONObject json = JSONObject.fromObject(ChinaPnRInterface.queryBalanceBg(usrCustId + "")); String AvlBal = json.getString("AvlBal").replaceAll(",", "");// 可用余额 String FrzBal = json.getString("FrzBal").replaceAll(",", "");// 冻结金额 String AcctBal = json.getString("AcctBal").replaceAll(",", "");// 资产金额 Connection conn = MySQL.getConnection(); try { map = BeanMapUtils.dataSetToMap(MySQL.executeQuery(conn, "select id from t_user where usrCustId=" + usrCustId)); if (map == null) { return null; } long userId = Convert.strToLong(map.get("id"), 0); if (userId <= 0) { return null; } MySQL.executeNonQuery(conn, "update t_user set usableSum=" + AvlBal + ",freezeSum=" + FrzBal + " where id=" + userId); DataSet ds = new DataSet(); List<Object> outParameterValues = new ArrayList<Object>(); Procedures.pr_getUserAmountSumary(conn, ds, outParameterValues, userId); ds.tables.get(0).rows.genRowsMap(); map = BeanMapUtils.dataSetToMap(ds); map.put("acctBal", AcctBal); map.put("usable", AvlBal); map.put("free", FrzBal); map.putAll(BeanMapUtils.dataSetToMap(MySQL.executeQuery(conn, "select name,busiCode from t_company where usrCustId=" + usrCustId))); dataPage(conn, pageBean, "v_t_bankcard_query", "*", " order by commitTime", " and userId=" + userId); conn.commit(); } catch (Exception e) { e.printStackTrace(); } finally { conn.close(); } return map; } public Map<String, String> addRecharge(String amount, String usrCustId) throws Exception { Map<String, String> map = new HashMap<String, String>(); Connection conn = MySQL.getConnection(); try { Map<String, String> usr = BeanMapUtils.dataSetToMap(MySQL.executeQuery(conn, "select id from t_user where usrCustId=" + usrCustId)); if (usr == null || Convert.strToLong(usr.get("id"), -1) < 0) { return null; } long userId = Convert.strToLong(usr.get("id"), -1); if (userId <= 0) { return null; } long ordId = MySQL.executeNonQuery(conn, "insert into t_recharge_detail (userId, rechargeTime, rechargeType, rechargeMoney, cost)" + " values (" + userId + ", now(), 1, " + amount + ", 0.0)"); map.put("ordId", ordId + ""); map.put("userId", userId + ""); conn.commit(); } catch (Exception e) { e.printStackTrace(); } finally { conn.close(); } return map; } public long comWithdraw(double money, String usrCustId) throws SQLException { Connection conn = MySQL.getConnection(); long ordId = -1L; DataSet ds = new DataSet(); List<Object> outParameterValues = new ArrayList<Object>(); try { Map<String, String> usr = BeanMapUtils.dataSetToMap(MySQL.executeQuery(conn, "select id from t_user where usrCustId=" + usrCustId)); if (usr == null || Convert.strToLong(usr.get("id"), -1) < 0) { return ordId; } long userId = Convert.strToLong(usr.get("id"), -1); if (userId <= 0) { return ordId; } Procedures.p_amount_withdraw(conn, ds, outParameterValues, userId, "", new BigDecimal(money), -1, "", "", DateUtil.dateToYMD(new Date()), -1, "", ""); long ret = Convert.strToLong(outParameterValues.get(0) + "", -1); if (ret <= 0) { conn.rollback(); return ordId; } ordId = Convert.strToLong(outParameterValues.get(2) + "", -1); conn.commit(); } catch (Exception e) { e.printStackTrace(); } finally { conn.close(); } return ordId; } }