/** * */ package com.sp2p.service; import java.math.BigDecimal; import java.sql.Connection; import java.sql.SQLException; import java.text.ParseException; import java.util.Date; import java.util.HashMap; import java.util.Map; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import com.shove.Convert; import com.shove.base.BaseService; import com.shove.config.IPayConfig; import com.shove.data.DataException; import com.shove.data.dao.MySQL; import com.shove.security.Encrypt; import com.sp2p.dao.FinanceDao; import com.sp2p.dao.FundRecordDao; import com.sp2p.dao.RechargeDao; import com.sp2p.dao.RechargeDetailDao; import com.sp2p.dao.UserDao; import com.sp2p.util.DateUtil; /** * 充值详细 * * @author Administrator * */ public class RechargeDetailService extends BaseService { public static Log log = LogFactory.getLog(RechargeDetailService.class); private RechargeDetailDao rechargeDetailDao; private FundRecordDao fundRecordDao; private UserDao userDao; private FinanceDao financeDao; private RechargeDao rechargeDao; /** * 添加充值详细 * * @param paramMap * 参数值 * @return * @throws SQLException */ public long addRechargeDetail(Map<String, String> paramMap) throws SQLException { Connection conn = MySQL.getConnection(); long result = -1; try { result = rechargeDetailDao.addRechargeDetail(conn, paramMap); conn.commit(); } catch (SQLException e) { log.error(e); e.printStackTrace(); conn.rollback(); } finally { conn.close(); } return result; } /** * 添加充值详细 * * @param paramMap * 参数值 * @return * @throws SQLException */ public long updateRechargeDetail(long id, Map<String, String> paramMap) throws SQLException { Connection conn = MySQL.getConnection(); long result = -1; try { result = rechargeDetailDao.updateRechargeDetail(conn, id, paramMap); conn.commit(); } catch (SQLException e) { log.error(e); e.printStackTrace(); conn.rollback(); } finally { conn.close(); } return result; } /** * 删除充值详细,可删除多个 * * @param conn * @param ids * id字符串,用,隔开 * @return * @throws SQLException */ public long deleteRechargeDetail(String ids) throws SQLException { Connection conn = MySQL.getConnection(); long result = -1; try { result = rechargeDetailDao.deleteRechargeDetail(conn, ids); conn.commit(); } catch (SQLException e) { log.error(e); e.printStackTrace(); conn.rollback(); } finally { conn.close(); } return result; } /** * 根据ID获取充值详细信息 * * @param conn * @param id * @return * @throws SQLException * @throws DataException */ public Map<String, String> getRechargeDetail(long id) throws SQLException, DataException { Connection conn = MySQL.getConnection(); Map<String, String> result = null; try { result = rechargeDetailDao.getRechargeDetail(conn, id); conn.commit(); } catch (SQLException e) { log.error(e); e.printStackTrace(); conn.rollback(); } finally { conn.close(); } return result; } /** * 在线充值 * * @param paramMap * @return * @throws SQLException * @throws DataException * @throws ParseException */ public int userPay(Map<String, Object> paramMap) throws SQLException, DataException, ParseException { int returnId = -1; try { log.info("1-"); String[] extraCommonParam = (String[]) paramMap .get("extraCommonParam"); BigDecimal total_fee = (BigDecimal) paramMap.get("total_fee"); String paynumber = (String) paramMap.get("paynumber"); String paybank = (String) paramMap.get("paybank"); String notify_timeStr = (String) paramMap.get("notify_time"); String buyer_email = (String) paramMap.get("buyer_email"); Long orderId = Convert.strToLong(extraCommonParam[0], -1);// 获得订单编号 if (orderId < 0) { return -2;// 订单编号错误 } Long userId = Convert.strToLong(extraCommonParam[1], -1);// 获得用户编号 if (userId < 0) { return -3;// 用户编号错误 } log.info("2-"); Date notify_time = DateUtil.strToDate(notify_timeStr); log.info("3-"); returnId = userPayIn(orderId, userId, total_fee, paynumber, paybank, buyer_email, notify_time); } catch (SQLException e) { log.error(e); e.printStackTrace(); throw e; } catch (DataException e) { log.error(e); e.printStackTrace(); throw e; } return returnId;// 成功! } /** * 到用户支付 * @param paramMap * @return * @throws SQLException * @throws DataException * @throws ParseException */ public int usergoPay(Map<String, Object> paramMap) throws SQLException, DataException, ParseException { int returnId = -1; try { log.info("1-"); BigDecimal total_fee = new BigDecimal(paramMap.get("tranAmt") + ""); String paynumber = (String) paramMap.get("orderId"); String paybank = (String) paramMap.get("paybank"); String notify_timeStr = (String) paramMap.get("tranFinishTime"); String buyer_email = (String) paramMap.get("buyerName"); Long orderId = Convert.strToLong(paramMap.get("merRemark1") + "", -1);// 获得订单编号 if (orderId < 0) { return -2;// 订单编号错误 } Long userId = Convert .strToLong(paramMap.get("merRemark2") + "", -1);// 获得用户编号 if (userId < 0) { return -3;// 用户编号错误 } log.info("2-"); Date notify_time = DateUtil.YYYYMMDDHHMMSS.parse(notify_timeStr); log.info("3-"); returnId = userPayIn(orderId, userId, total_fee, paynumber, paybank, buyer_email, notify_time); } catch (SQLException e) { log.error(e); e.printStackTrace(); throw e; } catch (DataException e) { log.error(e); e.printStackTrace(); throw e; } return returnId;// 成功! } /** * 用户支付 * @param orderId * @param userId * @param total_fee * @param paynumber * @param paybank * @param buyer_email * @param notify_time * @return * @throws DataException * @throws SQLException */ private int userPayIn(Long orderId, Long userId, BigDecimal total_fee, String paynumber, String paybank, String buyer_email, Date notify_time) throws DataException, SQLException { Connection conn = MySQL.getConnection(); int result = -7; try { Map<String, String> detailMap = rechargeDetailDao .getRechargeDetail(conn, orderId); long rechargeId = Convert.strToLong(detailMap.get("rechargeId"), -1); long uId = Convert.strToLong(detailMap.get("userId")+"", -1); if(userId != uId){ return -1; } //根据订单号 查询订单 if (detailMap != null) { if ("1".equals(detailMap.get("result"))) { result = -4;// 已支付 } else if (total_fee.compareTo(new BigDecimal(detailMap .get("rechargeMoney"))) != 0) { result = -5;// 充值金额不相等 } else if (rechargeId == -1) { result = -8; // 充值表不存在 } else { Map<String, String> paramMap = new HashMap<String, String>(); // 修改充值详细状态 String rechargeTime = DateUtil.dateToString(notify_time); paramMap.put("rechargeMoney", total_fee + ""); paramMap.put("rechargeTime", rechargeTime); paramMap.put("result", "1"); paramMap.put("paynumber", paynumber); paramMap.put("bankName", paybank); paramMap.put("buyerEmail", buyer_email); long resultCount = rechargeDetailDao.updateRechargeDetail(conn, orderId, paramMap); if(resultCount > 0){ if(uId == -1){ conn.rollback(); return -3;// 用户编号错误 } // 向用户帐号打款 userDao.addUserUsableAmount(conn, total_fee .doubleValue(), uId); Map<String, String> userAmountMap = financeDao .queryUserAmountAfterHander(conn, uId); if (userAmountMap == null) { userAmountMap = new HashMap<String, String>(); } // 向资金记录充值 double operMoney = total_fee.doubleValue(); Map<String, String> fundMap = new HashMap<String, String>(); fundMap.put("userId", uId + ""); fundMap.put("fundMode", "在线充值"); fundMap.put("handleSum", operMoney + ""); fundMap.put("recordTime", DateUtil .dateToString(new Date())); fundMap.put("trader", "-1"); fundMap.put("usableSum", userAmountMap.get("usableSum")); fundMap.put("freezeSum", userAmountMap.get("freezeSum")); fundMap.put("dueinSum", userAmountMap.get("forPI")); fundMap.put("remark", "在线充值"); fundMap.put("income", operMoney+""); fundMap.put("operateType", 2 + ""); fundRecordDao.addFundRecord(conn, fundMap); // 修改充值表 Map<String, String> rechargeMap = new HashMap<String, String>(); rechargeMap.put("rechargeMoney", operMoney + ""); rechargeMap.put("result", "1"); rechargeDao.updateRecharge(conn, rechargeId, rechargeMap); result = 1; // 成功 }else{ conn.rollback(); return -4; } } } else { result = -6;// 支付详细不存在 } conn.commit(); } catch (SQLException e) { log.error(e); e.printStackTrace(); conn.rollback(); throw e; } catch (DataException e) { log.error(e); e.printStackTrace(); conn.rollback(); throw e; } finally { conn.close(); } return result; } /** * * @param paramMap * @return * @throws Exception */ public int userIPay(Map<String, Object> paramMap) throws Exception { int returnId = -1; try { log.info("1-"); BigDecimal total_fee = new BigDecimal(paramMap.get("amount") + ""); String paynumber = (String) paramMap.get("ipsbillno"); String paybank = (String) paramMap.get("paybank"); String[] paras = Encrypt.decryptSES(paramMap.get("attach")+"", IPayConfig.ipay_see_key).split("_"); if(paras == null || paras.length != 2){ return -2; } Long orderId = Convert.strToLong(paras[0], -1);// 获得订单编号 if (orderId < 0) { return -2;// 订单编号错误 } Long userId = Convert.strToLong(paras[1], -1);// 获得用户编号 if (userId < 0) { return -3;// 用户编号错误 } log.info("2-"); Date notify_time = new Date(); log.info("3-"); returnId = userPayIn(orderId, userId, total_fee, paynumber, paybank, "", notify_time); } catch (Exception e) { log.error(e); e.printStackTrace(); throw e; } return returnId;// 成功! } public void setFundRecordDao(FundRecordDao fundRecordDao) { this.fundRecordDao = fundRecordDao; } public void setUserDao(UserDao userDao) { this.userDao = userDao; } public void setRechargeDao(RechargeDao rechargeDao) { this.rechargeDao = rechargeDao; } public void setRechargeDetailDao(RechargeDetailDao rechargeDetailDao) { this.rechargeDetailDao = rechargeDetailDao; } public void setFinanceDao(FinanceDao financeDao) { this.financeDao = financeDao; } }