/**
*
*/
package com.sp2p.service;
import java.math.BigDecimal;
import java.sql.Connection;
import java.sql.SQLException;
import java.text.SimpleDateFormat;
import java.util.Collections;
import java.util.Date;
import java.util.HashMap;
import java.util.HashSet;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import net.sf.json.JSONObject;
import org.apache.commons.lang.StringEscapeUtils;
import org.apache.commons.lang.StringUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import com.shove.Convert;
import com.shove.base.BaseService;
import com.shove.data.DataException;
import com.shove.data.dao.MySQL;
import com.shove.util.BeanMapUtils;
import com.shove.util.ServletUtils;
import com.shove.util.UtilDate;
import com.shove.vo.PageBean;
import com.sp2p.constants.IAmountConstants;
import com.sp2p.constants.IConstants;
import com.sp2p.constants.IFundConstants;
import com.sp2p.constants.IInformTemplateConstants;
import com.sp2p.dao.AccountUsersDao;
import com.sp2p.dao.AssignmentDebtDao;
import com.sp2p.dao.AuctionDebtDao;
import com.sp2p.dao.CostManagerDao;
import com.sp2p.dao.FinanceDao;
import com.sp2p.dao.FundRecordDao;
import com.sp2p.dao.InvestDao;
import com.sp2p.dao.OperationLogDao;
import com.sp2p.dao.UserDao;
import com.sp2p.dao.admin.AdminDao;
import com.sp2p.dao.admin.BorrowManageDao;
import com.sp2p.dao.admin.RiskManageDao;
import com.sp2p.util.DateUtil;
import com.sp2p.util.WebUtil;
/**
* 债权转让
*
* @author Administrator
*
*/
public class AssignmentDebtService extends BaseService {
public static Log log = LogFactory.getLog(AssignmentDebtService.class);
private AssignmentDebtDao assignmentDebtDao;
private UserDao userDao;
private AuctionDebtDao auctionDebtDao;
private RiskManageDao riskManageDao;
private FundRecordDao fundRecordDao;
private SelectedService selectedService;
private FinanceDao financeDao;
private InvestDao investDao;
private CostManagerDao costManagerDao;
private AwardService awardService;
private AccountUsersDao accountUsersDao;
private BorrowManageDao borrowManageDao;
private OperationLogDao operationLogDao;
private AdminDao adminDao;
public AccountUsersDao getAccountUsersDao() {
return accountUsersDao;
}
public void setAccountUsersDao(AccountUsersDao accountUsersDao) {
this.accountUsersDao = accountUsersDao;
}
public void setSelectedService(SelectedService selectedService) {
this.selectedService = selectedService;
}
public void setAwardService(AwardService awardService) {
this.awardService = awardService;
}
public void setFinanceDao(FinanceDao financeDao) {
this.financeDao = financeDao;
}
public void setCostManagerDao(CostManagerDao costManagerDao) {
this.costManagerDao = costManagerDao;
}
public void setAssignmentDebtDao(AssignmentDebtDao assignmentDebtDao) {
this.assignmentDebtDao = assignmentDebtDao;
}
public void setUserDao(UserDao userDao) {
this.userDao = userDao;
}
public void setInvestDao(InvestDao investDao) {
this.investDao = investDao;
}
public void setAuctionDebtDao(AuctionDebtDao auctionDebtDao) {
this.auctionDebtDao = auctionDebtDao;
}
public void setFundRecordDao(FundRecordDao fundRecordDao) {
this.fundRecordDao = fundRecordDao;
}
/**
* 添加债权转让
*
* @param paramMap
* 参数值
* @return
* @throws SQLException
*/
public long addAssignmentDebt(Map<String, String> paramMap) throws SQLException {
Connection conn = MySQL.getConnection();
Map<String, String> userMap = new HashMap<String, String>();
long result = -1;
try {
if (!assignmentDebtDao.isHaveAssignmentDebt(conn, Convert.strToLong(paramMap.get("investId"), -1), Convert.strToLong(paramMap.get("alienatorId"), -1))) {
result = assignmentDebtDao.addAssignmentDebt(conn, paramMap);
String borrowTitle = assignmentDebtDao.getBorrowTitle(conn, result);
// 添加用户动态
String cotent = "债权转让了借款<a href=queryDebtDetailHHN.do?id=" + result + " target=_blank>" + borrowTitle + "</a>";
financeDao.addUserDynamic(conn, Convert.strToLong(paramMap.get("alienatorId"), -1), cotent);
userMap = userDao.queryUserById(conn, Convert.strToLong(paramMap.get("alienatorId"), -1));
operationLogDao.addOperationLog(conn, "t_assignment_debt", Convert.strToStr(userMap.get("username"), ""), IConstants.INSERT,
Convert.strToStr(userMap.get("lastIP"), ""), 0, "发布债权转让", 1);
conn.commit();
result = 1;
} else {
conn.commit();
}
} catch (SQLException e) {
log.error(e);
e.printStackTrace();
conn.rollback();
} catch (DataException e) {
log.error(e);
e.printStackTrace();
conn.rollback();
} finally {
conn.close();
}
return result;
}
/**
* 添加债权转让
*
* @param paramMap
* 参数值
* @return
* @throws SQLException
*/
public long updateAssignmentDebt(long id, long debtStatus, Map<String, String> paramMap) throws SQLException {
Connection conn = MySQL.getConnection();
long result = -1;
try {
result = assignmentDebtDao.updateAssignmentDebt(conn, id, debtStatus + "", 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 deleteAssignmentDebt(String ids) throws SQLException {
Connection conn = MySQL.getConnection();
long result = -1;
try {
result = assignmentDebtDao.deleteAssignmentDebt(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> getAssignmentDebt(long id) throws SQLException, DataException {
Map<String, String> result = null;
if (id < 0)
return result;
Connection conn = MySQL.getConnection();
try {
result = assignmentDebtDao.getAssignmentDebt(conn, id);
conn.commit();
} catch (SQLException e) {
log.error(e);
e.printStackTrace();
conn.rollback();
throw e;
} catch (DataException e) {
log.error(e);
e.printStackTrace();
throw e;
} finally {
conn.close();
}
return result;
}
/**
* 查询前台的全部债权
*
* @param pageBean
* @throws SQLException
*/
@SuppressWarnings({ "rawtypes", "unchecked" })
public void queryAllDebt(String borrowTitle, long debtSum, long auctionBasePrice, long auctionMode, long isLate, long publishDays, String debtStatus, PageBean pageBean)
throws SQLException {
Connection conn = MySQL.getConnection();
StringBuilder condition = new StringBuilder();
if (StringUtils.isNotBlank(debtStatus)) {
String idStr = StringEscapeUtils.escapeSql("'" + debtStatus + "'");
String idSQL = "-2";
idStr = idStr.replaceAll("'", "");
String[] array = idStr.split(",");
for (int n = 0; n <= array.length - 1; n++) {
idSQL += "," + array[n];
}
condition.append(" AND debtStatus in(");
condition.append(idSQL);
condition.append(") ");
}
if (StringUtils.isNotBlank(borrowTitle)) {
condition.append(" AND borrowTitle like '%");
condition.append(StringEscapeUtils.escapeSql(borrowTitle));
condition.append("%' ");
}
if (debtSum > 0) {
if (debtSum == 1) {
condition.append(" AND debtSum < 3000 ");
} else if (debtSum == 2) {
condition.append(" AND debtSum >= 3000 and debtSum < 5000 ");
} else if (debtSum == 3) {
condition.append(" AND debtSum >= 5000 and debtSum < 10000 ");
} else if (debtSum == 4) {
condition.append(" AND debtSum >= 10000 and debtSum < 20000 ");
} else if (debtSum == 5) {
condition.append(" AND debtSum >= 20000 and debtSum < 50000 ");
} else if (debtSum == 6) {
condition.append(" AND debtSum >= 50000 ");
}
}
if (auctionBasePrice > 0) {
if (auctionBasePrice == 1) {
condition.append(" AND auctionBasePrice < 3000 ");
} else if (auctionBasePrice == 2) {
condition.append(" AND auctionBasePrice >= 3000 and auctionBasePrice < 5000 ");
} else if (auctionBasePrice == 3) {
condition.append(" AND auctionBasePrice >= 5000 and auctionBasePrice < 10000 ");
} else if (auctionBasePrice == 4) {
condition.append(" AND auctionBasePrice >= 10000 and auctionBasePrice < 20000 ");
} else if (auctionBasePrice == 5) {
condition.append(" AND auctionBasePrice >= 20000 and auctionBasePrice < 50000 ");
} else if (auctionBasePrice == 6) {
condition.append(" AND auctionBasePrice >= 50000 ");
}
}
if (auctionMode > 0) {
condition.append(" AND auctionMode =");
condition.append(auctionMode);
}
if (isLate > 0) {
condition.append(" AND isLate =");
condition.append(isLate);
}
if (publishDays > 0) {
if (publishDays > 30) {
condition.append(" AND datediff(now(),publishTime) >= ");
condition.append(publishDays);
} else {
condition.append(" AND datediff(now(),publishTime) <= ");
condition.append(publishDays);
}
}
try {
dataPage(conn, pageBean, "v_t_debt_borrow_person", " * ", " ORDER BY CASE debtStatus when 2 then 'a' when 1 then 'b' when 3 then 'c' end,actionTime DESC ",
condition.toString());
} catch (SQLException e) {
log.error(e);
e.printStackTrace();
} catch (DataException e) {
log.error(e);
e.printStackTrace();
} finally {
conn.close();
}
}
@SuppressWarnings({ "unchecked" })
public void queryAllDebts(PageBean pageBean) throws SQLException {
Connection conn = MySQL.getConnection();
try {
dataPage(conn, pageBean, "v_t_usable_debt", "*", "", "");
} catch (SQLException e) {
log.error(e);
e.printStackTrace();
} catch (DataException e) {
log.error(e);
e.printStackTrace();
} finally {
conn.close();
}
}
/**
* 查询可以转让的借款
*/
@SuppressWarnings({ "unchecked", "rawtypes" })
public void queryCanAssignmentDebt(long userId, String borrowTitle, String borrowerName, PageBean pageBean) throws SQLException {
Connection conn = MySQL.getConnection();
StringBuilder condition = new StringBuilder();
if (userId > 0) {
condition.append(" and investor =");
condition.append(userId);
condition.append(" ");
}
if (StringUtils.isNotBlank(borrowerName)) {
condition.append(" and borrowerName like '%");
condition.append(StringEscapeUtils.escapeSql(borrowerName));
condition.append("%' ");
}
if (StringUtils.isNotBlank(borrowTitle)) {
condition.append(" and borrowTitle like '%");
condition.append(StringEscapeUtils.escapeSql(borrowTitle));
condition.append("%' ");
}
condition.append(" and remainDay > 5 ");
try {
dataPage(conn, pageBean, "v_t_can_assignment_borrow", "*", "", condition.toString());
} catch (SQLException e) {
log.error(e);
e.printStackTrace();
} catch (DataException e) {
log.error(e);
e.printStackTrace();
} finally {
conn.close();
}
}
/**
* 竞拍中的债权
*
* @param userId
* @param borrowTitle
* @param borrowerName
* @param pageBean
* @throws SQLException
*/
public void queryAuctingDebt(long userId, String borrowTitle, String borrowerName, String debtStatus, PageBean pageBean) throws SQLException {
Connection conn = MySQL.getConnection();
StringBuilder condition = new StringBuilder();
if (userId > 0) {
condition.append(" and alienatorId =");
condition.append(userId);
condition.append(" ");
}
if (StringUtils.isNotBlank(borrowerName)) {
condition.append(" and borrowerName like '%");
condition.append(StringEscapeUtils.escapeSql(borrowerName));
condition.append("%' ");
}
if (StringUtils.isNotBlank(borrowTitle)) {
condition.append(" and borrowTitle like '%");
condition.append(StringEscapeUtils.escapeSql(borrowTitle));
condition.append("%' ");
}
if (StringUtils.isNotBlank(debtStatus)) {
String idStr = StringEscapeUtils.escapeSql("'" + debtStatus + "'");
String idSQL = "-2";
idStr = idStr.replaceAll("'", "");
String[] array = idStr.split(",");
for (int n = 0; n <= array.length - 1; n++) {
idSQL += "," + array[n];
}
condition.append(" and debtStatus in(");
condition.append(idSQL);
condition.append(") ");
}
try {
dataPage(conn, pageBean, "v_t_auction_assignmentdebt", "*", "", condition.toString());
} catch (SQLException e) {
log.error(e);
e.printStackTrace();
} catch (DataException e) {
log.error(e);
e.printStackTrace();
} finally {
conn.close();
}
}
/**
* 申请转让中的债权
*
* @param borrowerName
* @param alienatorName
* @param debtStatus
* @param pageBean
* @throws SQLException
*/
public void queryApplyDebt(String borrowerName, String alienatorName, String debtStatus, PageBean pageBean) throws SQLException {
Connection conn = MySQL.getConnection();
StringBuilder condition = new StringBuilder();
if (StringUtils.isNotBlank(debtStatus)) {
String idStr = StringEscapeUtils.escapeSql("'" + debtStatus + "'");
String idSQL = "-2";
idStr = idStr.replaceAll("'", "");
String[] array = idStr.split(",");
for (int n = 0; n <= array.length - 1; n++) {
idSQL += "," + array[n];
}
condition.append(" AND debtStatus in(");
condition.append(idSQL);
condition.append(") ");
}
if (StringUtils.isNotBlank(borrowerName)) {
condition.append(" AND borrowerName like '%");
condition.append(StringEscapeUtils.escapeSql(borrowerName));
condition.append("%' ");
}
if (StringUtils.isNotBlank(alienatorName)) {
condition.append(" AND alienatorName like '%");
condition.append(StringEscapeUtils.escapeSql(alienatorName));
condition.append("%' ");
}
try {
dataPage(conn, pageBean, "v_t_assignment_debt_audit", "*", "", condition.toString());
} catch (SQLException e) {
log.error(e);
e.printStackTrace();
} catch (DataException e) {
log.error(e);
e.printStackTrace();
} finally {
conn.close();
}
}
/**
* 查询还款债权
*
* @param borrowId
* @param userId
* @return
* @throws SQLException
*/
public List<Map<String, Object>> queryDebtBacking(long borrowId, long userId, long investId) throws SQLException {
Connection conn = MySQL.getConnection();
List<Map<String, Object>> result = null;
try {
result = assignmentDebtDao.queryDebtBacking(conn, borrowId, userId, investId);
conn.commit();
} catch (SQLException e) {
log.error(e);
e.printStackTrace();
conn.rollback();
} catch (DataException e) {
log.error(e);
e.printStackTrace();
} finally {
conn.close();
}
return result;
}
/**
* 添加债务信息
*
* @param id
* @param userId
* @param msgContent
* @return
* @throws SQLException
* @throws DataException
*/
public long addDebtMsg(long id, Long userId, String msgContent) throws SQLException, DataException {
Connection conn = MySQL.getConnection();
Map<String, String> userMap = new HashMap<String, String>();
long returnId = -1;
try {
returnId = assignmentDebtDao.addDebtMsg(conn, id, userId, msgContent);
userMap = userDao.queryUserById(conn, userId);
operationLogDao.addOperationLog(conn, "t_msgboard", Convert.strToStr(userMap.get("username"), ""), IConstants.INSERT, Convert.strToStr(userMap.get("lastIP"), ""), 0,
"发布债权留言", 1);
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 returnId;
}
/**
* 根据Id查询债权留言板
*
* @param id
* @param pageBean
* @throws SQLException
* @throws DataException
*/
public void queryDebtMSGBord(long id, PageBean pageBean) throws SQLException, DataException {
Connection conn = connectionManager.getConnection();
try {
dataPage(conn, pageBean, " v_t_debt_msgbord", " * ", " order by id desc ", " and modeId =" + id);
} catch (SQLException e) {
log.error(e);
e.printStackTrace();
throw e;
} catch (DataException e) {
log.error(e);
e.printStackTrace();
throw e;
} finally {
conn.close();
}
}
/**
* 查询债权借款信息
*
* @param borrowerName
* @param alienatorName
* @param debtStatus
* @throws SQLException
*/
public void queryAssignmentDebt(String borrowerName, String alienatorName, String debtStatus, PageBean pageBean) throws SQLException {
Connection conn = MySQL.getConnection();
StringBuilder condition = new StringBuilder();
if (StringUtils.isNotBlank(debtStatus)) {
String idStr = StringEscapeUtils.escapeSql("'" + debtStatus + "'");
String idSQL = "-2";
idStr = idStr.replaceAll("'", "");
String[] array = idStr.split(",");
for (int n = 0; n <= array.length - 1; n++) {
idSQL += "," + array[n];
}
condition.append(" AND debtStatus in(");
condition.append(idSQL);
condition.append(") ");
}
if (StringUtils.isNotBlank(borrowerName)) {
condition.append(" AND borrowerName like '%");
condition.append(StringEscapeUtils.escapeSql(borrowerName));
condition.append("%' ");
}
if (StringUtils.isNotBlank(alienatorName)) {
condition.append(" AND alienatorName like '%");
condition.append(StringEscapeUtils.escapeSql(alienatorName));
condition.append("%' ");
}
try {
dataPage(conn, pageBean, "v_admin_assignment_debt_borrow", "*", " order by auctionEndTime desc", condition.toString());
} catch (SQLException e) {
log.error(e);
e.printStackTrace();
} catch (DataException e) {
log.error(e);
e.printStackTrace();
} finally {
conn.close();
}
}
/**
* 结束债权转让
*
* @throws SQLException
* @throws DataException
*/
public long auctingDebtSuccess(long debtId, long userId, int type) throws SQLException {
Connection conn = MySQL.getConnection();
Map<String, String> userMap = new HashMap<String, String>();
long result = -1;
try {
if (assignmentDebtDao.isDebtInStatus(conn, debtId, "1,2")) {
long dealResult = auctDebtSuccess(conn, debtId);
if (dealResult == 1) {
if (type == 1) {
userMap = userDao.queryUserById(conn, userId);
operationLogDao.addOperationLog(conn, "t_assignment_debt", Convert.strToStr(userMap.get("username"), ""), IConstants.UPDATE,
Convert.strToStr(userMap.get("lastIP"), ""), 0, "用户结束债权转让", 1);
} else {
// 查询后台管理员
userMap = adminDao.queryAdminById(conn, userId);
operationLogDao.addOperationLog(conn, "t_assignment_debt", Convert.strToStr(userMap.get("userName"), ""), IConstants.UPDATE,
Convert.strToStr(userMap.get("lastIP"), ""), 0, "管理员结束债权转让", 1);
}
conn.commit();
result = 1;
} else {
conn.rollback();
}
} else {
conn.rollback();
}
} catch (SQLException e) {
conn.rollback();
log.error(e);
e.printStackTrace();
} catch (DataException e) {
conn.rollback();
log.error(e);
e.printStackTrace();
} catch (Exception e) {
conn.rollback();
log.error(e);
e.printStackTrace();
} finally {
conn.close();
}
return result;
}
/**
* 结束债权转让
*/
@SuppressWarnings("unchecked")
public long auctDebtSuccess(Connection conn, long debtId) throws Exception {
long result = -1;
Map<String, String> debtMap = null;
Date nowDate = new Date();
Map<String, String> maxMap = null;
Map<String, String> auctionerUserMap = null;
Map<String, String> userMap = null;
Map<String, String> fundRecordMap = null;
Map<String, String> investMap = null;
Map<String, String> investHistoryMap = null;
Map<String, String> investUpdateMap = null;
Map<String, String> userAmountMap = null;
Map<String, String> alienatorUserMap = null;
Map<String, String> updateDebtMap = null;
try {
debtMap = assignmentDebtDao.getAssignmentDebt(conn, debtId);
/**
* 转让人
* */
long alienatorId = Convert.strToLong(debtMap.get("alienatorId"), -1);
long borrowId = Convert.strToLong(debtMap.get("borrowId"), -1);
/**
* 竞拍者
*/
long auctionerId = Convert.strToLong(debtMap.get("auctionerId"), -1);
long investId = Convert.strToLong(debtMap.get("investId"), -1);
double debtSum = Convert.strToDouble(debtMap.get("debtSum"), 0.0);
maxMap = auctionDebtDao.queryAuctionMaxPriceAndCount(conn, debtId);
nowDate = new Date();
String now = DateUtil.dateToString(nowDate);
// 查询借款信息得到借款时插入的平台收费标准
Map<String, String> maps = borrowManageDao.queryBorrowInfo(conn, borrowId);
// 得到收费标准的json代码
String feelog = Convert.strToStr(maps.get("feelog"), "");
Map<String, Double> feeMap = (Map<String, Double>) JSONObject.toBean(JSONObject.fromObject(feelog), HashMap.class);
if (maxMap != null && StringUtils.isNotBlank(maxMap.get("auctionCount")) && !"0".equals(maxMap.get("auctionCount"))) {
// 转让者扣除手续费
double manageFee = debtSum * Convert.strToDouble(feeMap.get(IAmountConstants.CREDIT_TRANSFER_FEE_RATE) + "", 0);
// 修改转让表
updateDebtMap = new HashMap<String, String>();
updateDebtMap.put("auctionEndTime", now);
updateDebtMap.put("debtStatus", "3");
updateDebtMap.put("manageFee", manageFee + "");
long updateCount = assignmentDebtDao.updateAssignmentDebt(conn, debtId, "2", updateDebtMap);
if (updateCount != 0) {
result = 1;
String basePath = WebUtil.getBasePath();
double maxPrice = Convert.strToDouble(maxMap.get("maxAuctionPrice"), 0.0);
// 更新投资还款记录是债权转让的状态
investDao.updateInvestDebtStatus(conn, investId, auctionerId);
// 操作投资表
// 添加投资历史表
investMap = investDao.getInvest(conn, investId);
investHistoryMap = new HashMap<String, String>();
investHistoryMap.putAll(investMap);
// investHistoryMap.remove("id");
investHistoryMap.put("recivedPrincipal", investMap.get("hasPrincipal"));
investHistoryMap.put("recievedInterest", investMap.get("hasInterest"));
investHistoryMap.put("repayStatus", "2");
investHistoryMap.put("recivedFI", investMap.get("hasFI"));
investHistoryMap.put("manageFee", "0");
investDao.addInvestHistory(conn, investHistoryMap);
// 修改投资表
investUpdateMap = new HashMap<String, String>();
investUpdateMap.put("investor", auctionerId + "");
investUpdateMap.put("hasPI", "0");
double realAmount = (Convert.strToDouble(investMap.get("recivedPrincipal"), 0.0) - Convert.strToDouble(investMap.get("hasPrincipal"), 0.0));
double recievedInterest = (Convert.strToDouble(investMap.get("recievedInterest"), 0.0) - Convert.strToDouble(investMap.get("hasInterest"), 0.0));
investUpdateMap.put("realAmount", realAmount + "");
investUpdateMap.put("recivedPrincipal", realAmount + "");
investUpdateMap.put("recievedInterest", recievedInterest + "");
investUpdateMap.put("hasPrincipal", "0");
investUpdateMap.put("hasInterest", "0");
investUpdateMap.put("isDebt", "2");
investUpdateMap.put("manageFee", "0");
investUpdateMap.put("recivedFI", (Convert.strToDouble(investMap.get("recivedFI"), 0.0) - Convert.strToDouble(investMap.get("hasFI"), 0.0)) + "");
investUpdateMap.put("hasFI", "0");
investDao.updateInvest(conn, investId, investUpdateMap);
// 扣除竞拍者金额
auctionerUserMap = auctionDebtDao.getUserById(conn, auctionerId);
userMap = new HashMap<String, String>();
double usableSum = Convert.strToDouble(auctionerUserMap.get("usableSum"), 0.0);
double freezeSum = Convert.strToDouble(auctionerUserMap.get("freezeSum"), 0.0);
double dueinSum = Convert.strToDouble(auctionerUserMap.get("dueinSum"), 0.0);
userMap.put("dueinSum", (dueinSum + debtSum) + "");
userMap.put("freezeSum", (freezeSum - maxPrice) + "");
userDao.updateUser(conn, auctionerId, userMap);
// 竞拍者竞拍成功资金记录表
userAmountMap = financeDao.queryUserAmountAfterHander(conn, auctionerId);
if (userAmountMap == null) {
userAmountMap = new HashMap<String, String>();
}
String borrowTitle = assignmentDebtDao.getBorrowTitle(conn, debtId);
/*String remark = "债权转让[<a href=" + basePath + "/queryDebtDetailHHN.do?id=" + debtId + " target='_blank'>" + borrowTitle + "</a>]竞拍成功扣除";
fundRecordMap = new HashMap<String, String>();
fundRecordMap.put("userId", auctionerId + "");
fundRecordMap.put("fundMode", "债权转让成功扣除");
fundRecordMap.put("handleSum", maxPrice + "");
fundRecordMap.put("usableSum", userAmountMap.get("usableSum"));
fundRecordMap.put("freezeSum", userAmountMap.get("freezeSum"));
fundRecordMap.put("dueinSum", (Convert.strToDouble(userAmountMap.get("forPI"), 0.0) - (realAmount + recievedInterest)) + "");
fundRecordMap.put("trader", alienatorId + "");
fundRecordMap.put("recordTime", now);
fundRecordMap.put("remarks", remark);
fundRecordMap.put("spending", maxPrice + "");
fundRecordMap.put("operateType", 726 + "");
fundRecordDao.addFundRecord(conn, fundRecordMap);*/
String remarks = "债权转让[<a href=" + basePath + "/queryDebtDetailHHN.do?id=" + debtId + " target='_blank'>" + borrowTitle + "</a>]成功,待收金额增加";
// 债权转让成功待收增加
auctionerUserMap = auctionDebtDao.getUserById(conn, auctionerId);
fundRecordMap = new HashMap<String, String>();
fundRecordMap.put("userId", auctionerId + "");
fundRecordMap.put("fundMode", "待收金额增加");
fundRecordMap.put("handleSum", (realAmount + recievedInterest) + "");
fundRecordMap.put("usableSum", userAmountMap.get("usableSum"));
fundRecordMap.put("freezeSum", userAmountMap.get("freezeSum"));
fundRecordMap.put("dueinSum", userAmountMap.get("forPI"));
fundRecordMap.put("trader", alienatorId + "");
fundRecordMap.put("recordTime", now);
fundRecordMap.put("remarks", remarks);
fundRecordMap.put("operateType", 1005 + "");
fundRecordDao.addFundRecord(conn, fundRecordMap);
// 转让者待收金额减少资金记录
userAmountMap = financeDao.queryUserAmountAfterHander(conn, alienatorId);
if (userAmountMap == null) {
userAmountMap = new HashMap<String, String>();
}
String remark1 = "债权转让[<a href=" + basePath + "/queryDebtDetailHHN.do?id=" + debtId + " target='_blank'>" + borrowTitle + "</a>]竞拍成功,待收金额减少";
fundRecordMap = new HashMap<String, String>();
fundRecordMap.put("userId", alienatorId + "");
fundRecordMap.put("fundMode", "待收金额减少");
fundRecordMap.put("handleSum", (realAmount + recievedInterest) + "");
fundRecordMap.put("usableSum", userAmountMap.get("usableSum"));
fundRecordMap.put("freezeSum", userAmountMap.get("freezeSum"));
fundRecordMap.put("dueinSum", userAmountMap.get("forPI"));
fundRecordMap.put("trader", auctionerId + "");
fundRecordMap.put("recordTime", now);
fundRecordMap.put("remarks", remark1);
fundRecordMap.put("operateType", 1003 + "");
fundRecordDao.addFundRecord(conn, fundRecordMap);
// 添加转让者金额
alienatorUserMap = auctionDebtDao.getUserById(conn, alienatorId);
userMap = new HashMap<String, String>();
usableSum = Convert.strToDouble(alienatorUserMap.get("usableSum"), 0.0);
userMap.put("usableSum", (usableSum + maxPrice) + "");
dueinSum = Convert.strToDouble(alienatorUserMap.get("dueinSum"), 0.0);
userMap.put("dueinSum", (dueinSum - debtSum) + "");
userDao.updateUser(conn, alienatorId, userMap);
// 转让者转让成功资金记录
userAmountMap = financeDao.queryUserAmountAfterHander(conn, alienatorId);
if (userAmountMap == null) {
userAmountMap = new HashMap<String, String>();
}
String remark2 = "债权转让[<a href=" + basePath + "/queryDebtDetailHHN.do?id=" + debtId + " target='_blank'>" + borrowTitle + "</a>]竞拍成功收入";
fundRecordMap = new HashMap<String, String>();
fundRecordMap.put("userId", alienatorId + "");
fundRecordMap.put("fundMode", "债权转让成功");
fundRecordMap.put("handleSum", maxPrice + "");
fundRecordMap.put("usableSum", userAmountMap.get("usableSum"));
fundRecordMap.put("freezeSum", userAmountMap.get("freezeSum"));
fundRecordMap.put("dueinSum", userAmountMap.get("forPI"));
fundRecordMap.put("trader", auctionerId + "");
fundRecordMap.put("recordTime", now);
fundRecordMap.put("remarks", remark2);
fundRecordMap.put("income", maxPrice + "");
fundRecordMap.put("operateType", 201 + "");
fundRecordDao.addFundRecord(conn, fundRecordMap);
alienatorUserMap = auctionDebtDao.getUserById(conn, alienatorId);
userMap = new HashMap<String, String>();
usableSum = Convert.strToDouble(alienatorUserMap.get("usableSum"), 0.0);
userMap.put("usableSum", (usableSum - manageFee) + "");
userDao.updateUser(conn, alienatorId, userMap);
fundRecordMap = new HashMap<String, String>();
userAmountMap = financeDao.queryUserAmountAfterHander(conn, alienatorId);
if (userAmountMap == null) {
userAmountMap = new HashMap<String, String>();
}
/* String remark3 = "债权转让[<a href=" + basePath + "/queryDebtDetailHHN.do?id=" + debtId + " target='_blank'>" + borrowTitle + "</a>]转让手续费扣除";
fundRecordMap.put("userId", alienatorId + "");
fundRecordMap.put("fundMode", "债权转让手续费扣除");
fundRecordMap.put("handleSum", manageFee + "");
fundRecordMap.put("usableSum", userAmountMap.get("usableSum"));
fundRecordMap.put("freezeSum", userAmountMap.get("freezeSum"));
fundRecordMap.put("dueinSum", userAmountMap.get("forPI"));
fundRecordMap.put("recordTime", now);
fundRecordMap.put("remarks", remark3);
fundRecordMap.put("spending", manageFee + "");
fundRecordMap.put("operateType", 701 + "");
fundRecordMap.put("ordId", debtId+"_3"); //债权转让类型为3
fundRecordDao.addFundRecord(conn, fundRecordMap);*/
}
} else {
// 修改转让表
updateDebtMap = new HashMap<String, String>();
updateDebtMap.put("auctionEndTime", now);
updateDebtMap.put("debtStatus", "5");
long updateCount = assignmentDebtDao.updateAssignmentDebt(conn, debtId, "2", updateDebtMap);
if (updateCount != 0) {
result = 1;
}
}
return result;
} catch (Exception e) {
log.info(e);
throw e;
}
}
public void setRiskManageDao(RiskManageDao riskManageDao) {
this.riskManageDao = riskManageDao;
}
/**
* 提前还款时处理正在竞拍中的债权
*
* @param repayId
* 还款Id
* @return
* @throws SQLException
* @throws DataException
*/
public long preRepayment(Connection conn, long repayId) throws SQLException, DataException {
long result = -1;
try {
long borrowId = auctionDebtDao.queryBorrowIdByRepayId(conn, repayId);
List<Map<String, Object>> debtList = assignmentDebtDao.queryAssignmentDebtIds(conn, borrowId, "1,2");
if (debtList != null) {
for (Map<String, Object> map : debtList) {
long id = Convert.strToLong(map.get("id") + "", -1);
assignmentDebt(conn, id, "1,2", 7);
}
}
result = 1;
} catch (SQLException e) {
log.error(e);
throw e;
} catch (DataException e) {
log.error(e);
throw e;
}
return result;
}
/**
* 撤销转让
*
* @param debtId
* @param debtStatus
* 5:撤销,7:提前还款
* @throws SQLException
*/
public long cancelAssignmentDebt(long debtId, int debtStatus, long userId, int type) throws SQLException {
Connection conn = MySQL.getConnection();
Map<String, String> userMap = new HashMap<String, String>();
long result = -1;
try {
if (assignmentDebtDao.isDebtInStatus(conn, debtId, "1,2")) {
long dealResult = assignmentDebt(conn, debtId, "1,2", debtStatus);
if (dealResult == 1) {
if (type == 1) {
userMap = userDao.queryUserById(conn, userId);
operationLogDao.addOperationLog(conn, "t_assignment_debt", Convert.strToStr(userMap.get("username"), ""), IConstants.UPDATE,
Convert.strToStr(userMap.get("lastIP"), ""), 0, "用户取消债权转让", 1);
} else {
userMap = adminDao.queryAdminById(conn, userId);
operationLogDao.addOperationLog(conn, "t_assignment_debt", Convert.strToStr(userMap.get("userName"), ""), IConstants.UPDATE,
Convert.strToStr(userMap.get("lastIP"), ""), 0, "管理员取消债权转让", 1);
}
conn.commit();
result = 1;
} else {
conn.rollback();
}
} else {
conn.commit();
}
} catch (SQLException e) {
conn.rollback();
log.error(e);
e.printStackTrace();
} catch (DataException e) {
conn.rollback();
log.error(e);
e.printStackTrace();
} finally {
conn.close();
}
return result;
}
/**
* 债权转让失败操作
*
* @param conn
* @param debtId
* @param debtStatus
* 5:撤销,7:提前还款
* @throws DataException
* @throws SQLException
*/
private long assignmentDebt(Connection conn, long debtId, String preDebtStatus, int debtStatus) throws SQLException, DataException {
long result = -1;
List<Map<String, Object>> auctionList = auctionDebtDao.queryAuctionDebtByDebtId(conn, debtId);
String borrowTitle = assignmentDebtDao.getBorrowTitle(conn, debtId);
String basePath = WebUtil.getBasePath();
Map<String, String> updateDebtMap = new HashMap<String, String>();
updateDebtMap.put("auctionEndTime", DateUtil.dateToString(new Date()));
updateDebtMap.put("debtStatus", debtStatus + "");
long updateCount = assignmentDebtDao.updateAssignmentDebt(conn, debtId, preDebtStatus, updateDebtMap);
if (updateCount != 0) {
result = 1;
if (auctionList != null) {
Map<Long, Double> frezeMap = new HashMap<Long, Double>(); // 记录解冻的资金
for (Map<String, Object> map : auctionList) {
long userId = Convert.strToLong(map.get("userId") + "", -1);
Map<String, String> auctionerUserMap = auctionDebtDao.getUserById(conn, userId);
Map<String, String> userMap = new HashMap<String, String>();
double usableSum = Convert.strToDouble(auctionerUserMap.get("usableSum"), 0.0);
double freezeSum = Convert.strToDouble(auctionerUserMap.get("freezeSum"), 0.0);
double auctionPrice = Convert.strToDouble(map.get("auctionPrice") + "", 0.0);
// 防止解冻重复解冻金额
if (frezeMap.containsKey(userId)) {
double oldAcutionPrice = frezeMap.get(userId);
if (oldAcutionPrice >= auctionPrice) {
continue;
} else {
frezeMap.put(userId, auctionPrice);// 记录该用户最大竞拍值
auctionPrice = auctionPrice - oldAcutionPrice;
}
} else {
frezeMap.put(userId, auctionPrice);// 记录该用户竞拍
}
userMap.put("usableSum", (usableSum + auctionPrice) + "");
userMap.put("freezeSum", (freezeSum - auctionPrice) + "");
if (userDao.updateUser(conn, userId, userMap) > 0) {
// 解冻资金操作记录
Map<String, String> userAmountMap = financeDao.queryUserAmountAfterHander(conn, userId);
if (userAmountMap == null) {
userAmountMap = new HashMap<String, String>();
}
double usableSumAfter = Convert.strToDouble(userAmountMap.get("usableSum") + "", 0);
double freezeSumAfter = Convert.strToDouble(userAmountMap.get("freezeSum") + "", 0);
double forPI = Convert.strToDouble(userAmountMap.get("forPI") + "", 0);
String remark = "[<a href=" + basePath + "/queryDebtDetailHHN.do?id=" + debtId + " target=_blank>" + borrowTitle + "</a>]竞拍失败解冻";
fundRecordDao.addFundRecord(conn, userId, "债权转让竞拍解冻", auctionPrice, usableSumAfter, freezeSumAfter, forPI, -1, remark, auctionPrice, 0.0, -1, -1, 202, 0.0);
String ipAddress = ServletUtils.getRemortIp();
int result4 = accountUsersDao.addAccountUsers(conn, IFundConstants.FREEZE_CREDIT_OUT, userId, new BigDecimal(auctionPrice), -1L, remark, ipAddress);
result4 = accountUsersDao.addAccountUsers(conn, IFundConstants.FREEZE_CREDIT_IN, userId, new BigDecimal(auctionPrice), -1L, remark, ipAddress);
// 竞拍者消息提醒
// 发送通知,通过通知模板
Map<String, Object> informTemplateMap = getInformTemplate();
Map<String, String> noticeMap = new HashMap<String, String>();
// 消息模版
// 站内信
String informTemplate = informTemplateMap.get(IInformTemplateConstants.FAIL_BID).toString();
if (informTemplate == null) {
conn.rollback();
return -1L;
}
informTemplate = informTemplate.replace("date", DateUtil.dateToString((new Date())));
informTemplate = informTemplate.replace("describe", "<a href=" + basePath + "/queryDebtDetailHHN.do?id=" + debtId + " target=_blank>" + borrowTitle
+ "</a>");
informTemplate = informTemplate.replace("money", auctionPrice + "");
noticeMap.put("mail", informTemplate);
// 邮件
String e_informTemplate = informTemplateMap.get(IInformTemplateConstants.E_FAIL_BID).toString();
if (e_informTemplate == null) {
conn.rollback();
return -1L;
}
e_informTemplate = e_informTemplate.replace("date", DateUtil.dateToString((new Date())));
e_informTemplate = e_informTemplate.replace("describe", "<a href=" + basePath + "/queryDebtDetailHHN.do?id=" + debtId + ">" + borrowTitle + "</a>");
e_informTemplate = e_informTemplate.replace("money", auctionPrice + "");
noticeMap.put("email", e_informTemplate);
// 短信
String s_informTemplate = informTemplateMap.get(IInformTemplateConstants.S_FAIL_BID).toString();
if (s_informTemplate == null) {
conn.rollback();
return -1L;
}
s_informTemplate = s_informTemplate.replace("userName", assignmentDebtDao.queryUserNameById(conn, userId));
s_informTemplate = s_informTemplate.replace("date", DateUtil.dateToString((new Date())));
s_informTemplate = s_informTemplate.replace("describe", borrowTitle);
s_informTemplate = s_informTemplate.replace("money", auctionPrice + "");
noticeMap.put("note", e_informTemplate);
selectedService.sendNoticeMSG(conn, userId, "债权转让竞拍报告", noticeMap, IConstants.NOTICE_MODE_5);
}
}
}
}
return result;
}
/**
* 检查债权是否过期并设置过期参数
*
* @return
* @throws SQLException
*/
public boolean checkDueDebt() throws SQLException {
Connection conn = MySQL.getConnection();
boolean result = false;
try {
List<Map<String, Object>> debtList = assignmentDebtDao.queryDueDebt(conn);
if (debtList != null) {
for (Map<String, Object> map : debtList) {
if ("2".equals(map.get("debtStatus") + "")) {
Long id = Convert.strToLong(map.get("id") + "", -1);
auctDebtSuccess(conn, id);
}
}
}
conn.commit();
result = true;
} catch (SQLException e) {
conn.rollback();
log.error(e);
e.printStackTrace();
} catch (DataException e) {
conn.rollback();
log.error(e);
e.printStackTrace();
} catch (Exception e) {
conn.rollback();
log.error(e);
e.printStackTrace();
} finally {
conn.close();
}
return result;
}
/**
* 查询竞拍成功的用户和转让者
*
* @param aid
* @return
* @throws SQLException
* @throws DataException
*/
public Map<String, String> queryDebtUserName(long aid) throws SQLException, DataException {
Connection conn = MySQL.getConnection();
Map<String, String> map = new HashMap<String, String>();
try {
map = assignmentDebtDao.queryDebtUserName(conn, aid);
} catch (DataException e) {
log.error(e);
e.printStackTrace();
throw e;
} catch (SQLException e) {
log.error(e);
e.printStackTrace();
throw e;
} finally {
conn.close();
}
return map;
}
public Map<String, String> queryApplyDebtDetail() throws SQLException, DataException {
Connection conn = connectionManager.getConnection();
Map<String, String> map = new HashMap<String, String>();
try {
map = assignmentDebtDao.queryApplyDebtDetail(conn);
} catch (SQLException e) {
log.error(e);
e.printStackTrace();
} catch (DataException e) {
log.error(e);
e.printStackTrace();
throw e;
} finally {
conn.close();
}
return map;
}
public Map<String, String> queryApplySuccessDebtDetail() throws SQLException, DataException {
Connection conn = connectionManager.getConnection();
Map<String, String> map = new HashMap<String, String>();
try {
map = assignmentDebtDao.queryApplySuccessDebtDetail(conn);
} catch (SQLException e) {
log.error(e);
e.printStackTrace();
} catch (DataException e) {
log.error(e);
e.printStackTrace();
throw e;
} finally {
conn.close();
}
return map;
}
public Map<String, String> queryApplyFailDebtDetail() throws SQLException, DataException {
Connection conn = connectionManager.getConnection();
Map<String, String> map = new HashMap<String, String>();
try {
map = assignmentDebtDao.queryApplyFailDebtDetail(conn);
} catch (SQLException e) {
log.error(e);
e.printStackTrace();
} catch (DataException e) {
log.error(e);
e.printStackTrace();
throw e;
} finally {
conn.close();
}
return map;
}
public void setBorrowManageDao(BorrowManageDao borrowManageDao) {
this.borrowManageDao = borrowManageDao;
}
public OperationLogDao getOperationLogDao() {
return operationLogDao;
}
public void setOperationLogDao(OperationLogDao operationLogDao) {
this.operationLogDao = operationLogDao;
}
public void setAdminDao(AdminDao adminDao) {
this.adminDao = adminDao;
}
/**
* 查询可以转让的债权
*
* @param pageBean
*
* @param borrowTitle
* @param borrowerName
* @param pageBean
* @throws SQLException
*/
@SuppressWarnings({ "rawtypes", "unchecked" })
public void queryAssignmentDebtable(PageBean pageBean, long userId) throws SQLException {
Connection conn = MySQL.getConnection();
try {
dataPage(conn, pageBean, "v_t_transferable_debt", " * ", "", " and investor=" + userId);
} catch (Exception e) {
log.error(e);
e.printStackTrace();
} finally {
conn.close();
}
}
/**
* 债权转让 查询即将发布债权
*
* @param pageBean
* @param userId
* @throws SQLException
*/
@SuppressWarnings({ "rawtypes", "unchecked" })
public void queryAssigRedayDebt(PageBean pageBean) throws Exception {
Connection conn = MySQL.getConnection();
try {
dataPage(conn, pageBean, "v_t_reday_debt", " * ", "", " ");
} catch (Exception e) {
log.error(e);
e.printStackTrace();
throw e;
} finally {
conn.close();
}
}
public void updateBackBuy(Connection conn, String investId) throws Exception {
String command = "select b.investList,b.borrowId from t_backbuy b left join t_invest i on b.borrowId=i.borrowId where i.id=" + investId;
Map<String, String> map = BeanMapUtils.dataSetToMap(MySQL.executeQuery(conn, command));
long borrowId = Convert.strToLong(map.get("borrowId"), 0);
HashSet<Long> list = new HashSet<Long>();// 已回购债权列表
for (String string : Convert.strToStr(map.get("investList"), "").split(",")) {
long temp = Convert.strToLong(string, -1);
if (temp > 0)
list.add(temp);
}
command = "SELECT group_concat(id) ids from t_invest where borrowId=" + borrowId;
String idStr = BeanMapUtils.dataSetToMap(MySQL.executeQuery(conn, command)).get("ids");
HashSet<Long> ids = new HashSet<Long>();// 投资列表
for (String string : Convert.strToStr(idStr, "").split(",")) {
long temp = Convert.strToLong(string, -1);
if (temp > 0)
ids.add(temp);
}
if (ids.equals(list)) {//当相等时,回购完毕
MySQL.executeNonQuery(conn, "update t_backbuy set status=2 where borrowId=" + borrowId);
}
}
}