/**
* @Project: hehenian-web
* @Package com.hehenian.web.view.loan.action
* @Title: LoanDetailAction.java
* @Description: TODO
* @author: liuzgmf
* @date 2014年12月11日 上午10:00:04
* @Copyright: HEHENIAN Co.,Ltd. All rights reserved.
* @version V1.0
*/
package com.hehenian.web.view.loan.action;
import java.io.IOException;
import java.text.DecimalFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import net.sf.json.JSONObject;
import org.apache.commons.lang.StringUtils;
import org.apache.commons.lang.time.DateFormatUtils;
import org.apache.log4j.Logger;
import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFRichTextString;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.struts2.ServletActionContext;
import org.apache.struts2.interceptor.ServletRequestAware;
import org.codehaus.jackson.map.ObjectMapper;
import org.codehaus.jackson.type.TypeReference;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;
import com.hehenian.biz.common.base.dataobject.NPageDo;
import com.hehenian.biz.common.base.result.IResult;
import com.hehenian.biz.common.loan.ILoanDetailService;
import com.hehenian.biz.common.loan.dataobject.LoanDetailDo;
import com.hehenian.biz.common.loan.dataobject.LoanDetailDo.LoanStatus;
import com.hehenian.biz.common.system.dataobject.SettDetailDo;
import com.hehenian.biz.common.trade.ISettleCalculatorService;
import com.hehenian.biz.common.util.CalculateUtils;
import com.hehenian.web.common.contant.WebConstants;
import com.hehenian.web.common.util.ServletUtils;
import com.opensymphony.xwork2.ActionSupport;
/**
*
* @author: liuzgmf
* @date 2014年12月11日 上午10:00:04
*/
@Scope("prototype")
@Component("loanDetailAction")
public class LoanDetailAction extends ActionSupport implements ServletRequestAware {
private static final long serialVersionUID = 1L;
private final Logger logger = Logger.getLogger(this.getClass());
private DecimalFormat df = new DecimalFormat("##0.00");
@Autowired
private ILoanDetailService loanDetailService;
@Autowired
private ISettleCalculatorService settleCalculatorService;
private LoanDetailDo loanDetailDo = new LoanDetailDo();
private HttpServletRequest request;
private static Map<Integer, Double> creditRateMap = new HashMap<Integer, Double>();
static {
// 借款期限3个月授信比例
creditRateMap.put(1, 1.5);
creditRateMap.put(2, 2.0);
creditRateMap.put(3, 2.5);
creditRateMap.put(4, 3.0);
creditRateMap.put(5, 3.5);
// 借款期限6个月授信比例
creditRateMap.put(6, 3.0);
creditRateMap.put(7, 3.5);
creditRateMap.put(8, 4.0);
creditRateMap.put(9, 4.5);
creditRateMap.put(10, 5.0);
}
@Override
public void setServletRequest(HttpServletRequest request) {
this.request = request;
}
/**
* @return loanDetailDo
*/
public LoanDetailDo getLoanDetailDo() {
return loanDetailDo;
}
/**
* @param loanDetailDo
* the loanDetailDo to set
*/
public void setLoanDetailDo(LoanDetailDo loanDetailDo) {
this.loanDetailDo = loanDetailDo;
}
/**
* 新增借款申请信息
*
* @return
* @author: liuzgmf
* @date: 2014年12月11日上午10:47:22
*/
public String addLoanDetail() {
IResult<?> result = loanDetailService.addLoanDetail(loanDetailDo);
if (result.isSuccess()) {
request.setAttribute(WebConstants.MESSAGE_KEY, "借款申请成功!");
return SUCCESS;
} else {
request.setAttribute(WebConstants.MESSAGE_KEY, result.getErrorMessage());
return ERROR;
}
}
/**
* 修改借款申请借款的状态
*
* @return
* @author: liuzgmf
* @date: 2014年12月16日上午11:07:57
*/
public String changeLoanStatus() {
String loanId = request.getParameter("loanId");
String status = request.getParameter("loanStatus");
JSONObject jsonObject = new JSONObject();
if (StringUtils.isBlank(loanId) || StringUtils.isBlank(status)) {
jsonObject.put("success", false);
jsonObject.put("message", "参数有误!");
ServletUtils.writeJson(jsonObject.toString());
return null;
}
LoanStatus loanStatus = (status.equals("CHECKED") ? LoanStatus.CHECKED : LoanStatus.UNCHECKED);
IResult<?> result = loanDetailService.changeLoanStatus(Long.parseLong(loanId), loanStatus);
if (result.isSuccess()) {
jsonObject.put("success", true);
jsonObject.put("message", "操作成功!");
ServletUtils.writeJson(jsonObject.toString());
return null;
} else {
jsonObject.put("success", false);
jsonObject.put("message", "操作失败!");
ServletUtils.writeJson(jsonObject.toString());
return null;
}
}
/**
* 计算授信金额
*
* @return
* @author: liuzgmf
* @date: 2014年12月15日上午9:27:47
*/
public String calCreditAmount() {
// 如果月收入或借款期限为空,则返回错误信息
if (StringUtils.isBlank(request.getParameter("income"))
|| StringUtils.isBlank(request.getParameter("loanPeriod"))) {
JSONObject jsonObject = new JSONObject();
jsonObject.put("error", true);
jsonObject.put("errorMessage", "计算出错,请刷新页面后再试!");
ServletUtils.write(jsonObject.toString());
return null;
}
double income = Double.parseDouble(request.getParameter("income"));
int loanPeriod = Integer.parseInt(request.getParameter("loanPeriod"));
loanPeriod = (loanPeriod < 6 ? 3 : 6);// 借款期限小于6个月,则按3个月计算,大于等于6个月,则按6个月计算
int index = 1;
if (CalculateUtils.le(income, 3000)) {
index = 1;
}
if (CalculateUtils.gt(income, 3000) && CalculateUtils.le(income, 5000)) {
index = 2;
}
if (CalculateUtils.gt(income, 5000) && CalculateUtils.le(income, 8000)) {
index = 3;
}
if (CalculateUtils.gt(income, 8000) && CalculateUtils.le(income, 10000)) {
index = 4;
}
if (CalculateUtils.gt(income, 10000)) {
index = 5;
}
index = (loanPeriod == 6 ? (index + 5) : index);
double creditAmount = CalculateUtils.round(CalculateUtils.mul(income, creditRateMap.get(index)), 0);
// 借款期限为6个月,最高可借贷100000元
if (loanPeriod == 6 && CalculateUtils.gt(creditAmount, 100000)) {
creditAmount = 100000;
}
// 借款期限为3个月,最高可借贷70000元
if (loanPeriod == 3 && CalculateUtils.gt(creditAmount, 70000)) {
creditAmount = 70000;
}
JSONObject jsonObject = new JSONObject();
jsonObject.put("error", false);
jsonObject.put("creditAmount", creditAmount);
ServletUtils.write(jsonObject.toString());
return null;
}
/**
* 计算还款明细金额(本金,利息,还款总额)
*
* @return
* @author: liuzgmf
* @date: 2014年12月15日上午11:27:39
*/
public String calRepayDetail() {
double loanAmount = Double.parseDouble(request.getParameter("loanAmount"));
int loanPeriod = Integer.parseInt(request.getParameter("loanPeriod"));
loanPeriod = (loanPeriod < 6 ? 3 : 6);// 借款期限小于6个月,则按3个月计算,大于等于6个月,则按6个月计算
double annualRate = (loanPeriod == 3 ? 8.4 : 9.0);// 借款期限为3个月为8.4%,6个月为9%
List<SettDetailDo> settDetailDoList = settleCalculatorService.calSettDetail(loanAmount, annualRate, loanPeriod,
5l);
List<Map<String, String>> repayDetailList = new ArrayList<Map<String, String>>(settDetailDoList.size());
double totalAmount = 0.00;
for (SettDetailDo detailDo : settDetailDoList) {
Map<String, String> map = new LinkedHashMap<String, String>();
map.put("times", detailDo.getPeriod() + "");
map.put("principal", df.format(detailDo.getPrincipal()));
double interest = CalculateUtils.add(CalculateUtils.add(detailDo.getInterest(), detailDo.getConsultFee()),
detailDo.getServFee());
map.put("interest", df.format(interest));
double repayAmount = CalculateUtils.add(interest, detailDo.getPrincipal());
map.put("repayAmount", df.format(repayAmount));
totalAmount = CalculateUtils.add(totalAmount, repayAmount);
map.put("totalAmount", df.format(totalAmount));
repayDetailList.add(map);
}
try {
ObjectMapper objectMapper = new ObjectMapper();
String jsonString = objectMapper.writeValueAsString(repayDetailList);
ServletUtils.writeJson(jsonString);
} catch (Exception e) {
logger.error(e.getMessage(), e);
}
return null;
}
public String queryLoanDetails() {
Map<String, Object> searchItems = new HashMap<String, Object>();
searchItems.put("idNo", loanDetailDo.getIdNo());
searchItems.put("mobile", loanDetailDo.getMobile());
searchItems.put("loanStatus", loanDetailDo.getLoanStatus());
long currentPage = (StringUtils.isNotBlank(request.getParameter("curPage")) ? Long.parseLong(request
.getParameter("curPage")) : 1);
long pageSize = (StringUtils.isNotBlank(request.getParameter("pageSize")) ? Long.parseLong(request
.getParameter("pageSize")) : 10);
long beginCount = (currentPage - 1) * pageSize;
searchItems.put("beginCount", (beginCount < 0 ? 0 : beginCount));
searchItems.put("pageSize", pageSize);
NPageDo<LoanDetailDo> pageDo = loanDetailService.queryLoanDetails(searchItems);
pageDo.setCurrentPage(currentPage);
pageDo.setPageSize(pageSize);
request.setAttribute("pageDo", pageDo);
return SUCCESS;
}
/**
*
* @return
* @author: liuzgmf
* @date: 2014年12月24日下午2:22:30
*/
public String exportLoanDetails() {
Map<String, Object> searchItems = new HashMap<String, Object>();
searchItems.put("idNo", loanDetailDo.getIdNo());
searchItems.put("mobile", loanDetailDo.getMobile());
searchItems.put("loanStatus", loanDetailDo.getLoanStatus());
long currentPage = (StringUtils.isNotBlank(request.getParameter("curPage")) ? Long.parseLong(request
.getParameter("curPage")) : 1);
long pageSize = (StringUtils.isNotBlank(request.getParameter("pageSize")) ? Long.parseLong(request
.getParameter("pageSize")) : 10);
long beginCount = (currentPage - 1) * pageSize;
searchItems.put("beginCount", (beginCount < 0 ? 0 : beginCount));
searchItems.put("pageSize", pageSize);
NPageDo<LoanDetailDo> pageDo = loanDetailService.queryLoanDetails(searchItems);
ServletOutputStream out = null;
try {
// Write the output to a file
HSSFWorkbook wb = createWorkbook(pageDo.getModelList());
HttpServletResponse response = ServletActionContext.getResponse();
response.setContentType("application/x-msdownload");
response.setHeader("Content-Disposition",
"attachment;filename=" + DateFormatUtils.format(new Date(), "yyyyMMddHHmmssSS") + ".xls");
out = ServletActionContext.getResponse().getOutputStream();
wb.write(out);
out.flush();
out.close();
} catch (IOException e) {
logger.error(e.getMessage(), e);
} finally {
if (out != null) {
try {
out.close();
} catch (IOException e) {
logger.error(e.getMessage(), e);
}
}
}
return null;
}
private HSSFWorkbook createWorkbook(List<LoanDetailDo> loanDetailDoList) {
HSSFWorkbook wb = new HSSFWorkbook();
HSSFSheet sheet = wb.createSheet();
List<Object[]> rows = new ArrayList<Object[]>(loanDetailDoList.size());
rows.add(new Object[] { "个人资料" });
rows.add(new Object[] { "客户名称", "性别", "年龄", "婚姻状况", "居住状况", "学历", "信用卡总张数", "信用卡总额度", "申请者身份证号码", "车辆总数量",
"公司名称", "公司地址", "职位级别", "企业性质", "现公司工作年限", "公司行业", "月收入 ", "支出合计", "借款金额", "申请期限", "产品类型", "*还款方式",
"*年利率(%)", "*筹标期限(天)", " 贷款资金用途", "借款咨询方", "咨询方分行", "所属专区", "业务编号" });
for (LoanDetailDo loanDetailDo : loanDetailDoList) {
double annualRate = (loanDetailDo.getLoanPeriod() == 3 ? 8.4 : 9.0);
rows.add(new Object[] { loanDetailDo.getRealName(), loanDetailDo.getSex(), loanDetailDo.getAge(), "已婚",
"买房", "本科及以上", 0, 0, loanDetailDo.getIdNo(), 0, "花样年集团(中国)有限公司", "深圳市福田区保税区福年广场", "高级经理", "股份制企业",
3, "商业服务", loanDetailDo.getIncome(), 2000.00, loanDetailDo.getLoanAmount(),
loanDetailDo.getLoanPeriod(), 1, "JTD", annualRate, 5, "消费贷", "合和年在线", "合和年在线", 0, "000001" });
}
int rownum = 0;
for (Object[] data : rows) {
HSSFRow row = sheet.createRow(rownum++);
int cellnum = 0;
for (Object obj : data) {
sheet.autoSizeColumn((short) cellnum);
HSSFCell cell = row.createCell((short) (cellnum++));
if (obj instanceof Date)
cell.setCellValue((Date) obj);
else if (obj instanceof Boolean)
cell.setCellValue((Boolean) obj);
else if (obj instanceof String)
cell.setCellValue(new HSSFRichTextString((String) obj));
else if (obj instanceof Double)
cell.setCellValue((Double) obj);
else if (obj instanceof Integer)
cell.setCellValue((Integer) obj);
else if (obj instanceof Short)
cell.setCellValue((Short) obj);
else if (obj instanceof Long)
cell.setCellValue((Long) obj);
}
}
return wb;
}
/**
* 根据身份证号码查询借款申请信息
*
* @return
* @author: liuzgmf
* @date: 2014年12月16日下午7:33:10
*/
public String getByIdNo() {
String idNo = request.getParameter("idNo");
JSONObject jsonObject = new JSONObject();
if (StringUtils.isBlank(idNo)) {
jsonObject.put("error", true);
jsonObject.put("message", "参数有误!");
ServletUtils.write(jsonObject.toString());
return null;
}
LoanDetailDo loanDetailDo = loanDetailService.getByIdNo(idNo);
if (loanDetailDo == null) {
jsonObject.put("error", true);
jsonObject.put("message", "身份证号码不存在!");
ServletUtils.write(jsonObject.toString());
return null;
}
jsonObject.put("error", false);
jsonObject.put("realName", loanDetailDo.getRealName());
jsonObject.put("loanStatus", loanDetailDo.getLoanStatus());
jsonObject.put("applyDate", DateFormatUtils.format(loanDetailDo.getCreateTime(), "yyyy-MM-dd"));
if (loanDetailDo.getLoanStatus().equals(LoanStatus.CHECKED)
|| loanDetailDo.getLoanStatus().equals(LoanStatus.LOANS)) {
jsonObject.put("auditDate", DateFormatUtils.format(loanDetailDo.getUpdateTime(), "yyyy-MM-dd"));
} else {
jsonObject.put("auditDate", "");
}
if (loanDetailDo.getLoanStatus().equals(LoanStatus.LOANS)) {
jsonObject.put("loanDate", DateFormatUtils.format(loanDetailDo.getBorrowDo().getAuditTime(), "yyyy-MM-dd"));
} else {
jsonObject.put("loanDate", "");
}
ServletUtils.write(jsonObject.toString());
return null;
}
/**
* 根据借款状态查询借款申请信息
*
* @return
* @author: liuzgmf
* @date: 2014年12月11日上午10:47:36
*/
public String queryUncheckedLoanDetails() {
List<LoanDetailDo> loanDetailDoList = loanDetailService.queryByLoanStatus(LoanStatus.PROCESSING);
List<Map<String, String>> loanDetailList = new ArrayList<Map<String, String>>(loanDetailDoList.size());
for (LoanDetailDo loanDetailDo : loanDetailDoList) {
Map<String, String> map = new LinkedHashMap<String, String>();
map.put("loanId", loanDetailDo.getLoanId() + "");
map.put("realName", loanDetailDo.getRealName());
map.put("idNo", loanDetailDo.getIdNo());
map.put("mobile", loanDetailDo.getMobile());
map.put("income", df.format(loanDetailDo.getIncome()));
loanDetailList.add(map);
}
try {
ObjectMapper objectMapper = new ObjectMapper();
String jsonString = objectMapper.writeValueAsString(loanDetailList);
ServletUtils.writeJson(jsonString);
} catch (Exception e) {
logger.error(e.getMessage(), e);
}
return null;
}
/**
* 通知借款申请校验结果
*
* @return
* @author: liuzgmf
* @date: 2014年12月11日下午4:48:56
*/
public String checkLoanDetail() {
String jsonString = request.getParameter("checkDetail");
if (StringUtils.isBlank(jsonString)) {
return null;
}
try {
ObjectMapper mapper = new ObjectMapper();
List<HashMap<String, String>> params = mapper.readValue(jsonString,
new TypeReference<List<HashMap<String, String>>>() {
});
if (params == null || params.size() == 0) {
return null;
}
List<LoanDetailDo> loanDetailDoList = new ArrayList<LoanDetailDo>(params.size());
for (HashMap<String, String> map : params) {
LoanDetailDo loanDetailDo = new LoanDetailDo();
loanDetailDo.setLoanId(Long.parseLong(map.get("loanId")));
if (map.get("checked") != null && map.get("checked").equals("true")) {
loanDetailDo.setLoanStatus(LoanStatus.CHECKED);
} else {
loanDetailDo.setLoanStatus(LoanStatus.UNCHECKED);
loanDetailDo.setCheckDesc(getCheckDesc(map));
}
loanDetailDoList.add(loanDetailDo);
}
loanDetailService.updateLoanDetail(loanDetailDoList);
} catch (IOException e) {
logger.error(e.getMessage(), e);
}
return null;
}
/**
* 获取借款申请验证描叙
*
* @param map
* @return
* @author: liuzgmf
* @date: 2014年12月11日下午2:15:50
*/
private String getCheckDesc(HashMap<String, String> map) {
StringBuffer checkedDesc = new StringBuffer();
// 真实姓名
String checked = map.get("realName");
if (StringUtils.isNotBlank(checked)) {
checkedDesc.append("realName:" + checked + ";");
}
// 身份证号码
checked = map.get("idNo");
if (StringUtils.isNotBlank(checked)) {
checkedDesc.append("idNo:" + checked + ";");
}
// 手机号码
checked = map.get("mobile");
if (StringUtils.isNotBlank(checked)) {
checkedDesc.append("mobile:" + checked + ";");
}
// 月收入
checked = map.get("income");
if (StringUtils.isNotBlank(checked)) {
checkedDesc.append("income:" + checked + ";");
}
if (checkedDesc.length() > 1) {
return (checkedDesc.substring(0, checkedDesc.length() - 1));
} else {
return null;
}
}
}