/** * @Project: hehenian-mobile * @Package com.hehenian.mobile.web.controller.finance * @Title: InvestControll.java * @Description: 投资 * * @author: zhanbmf * @date 2015-3-31 上午11:34:23 * @Copyright: HEHENIAN Co.,Ltd. All rights reserved. * @version V1.0 */ package com.hehenian.mobile.web.controller.finance; import java.math.BigDecimal; import java.util.Calendar; import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Map; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; import net.sf.json.JSONObject; import org.apache.commons.lang.ObjectUtils; import org.apache.commons.lang.RandomStringUtils; import org.apache.commons.lang.StringUtils; import org.apache.commons.lang.math.NumberUtils; import org.apache.log4j.Logger; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import com.hehenian.biz.common.account.IPersonService; import com.hehenian.biz.common.account.IUserService; import com.hehenian.biz.common.account.IUserThirdPartyService; import com.hehenian.biz.common.account.UserType; import com.hehenian.biz.common.account.dataobject.AccountUserDo; import com.hehenian.biz.common.account.dataobject.InviteCodeDo; import com.hehenian.biz.common.account.dataobject.PersonDo; import com.hehenian.biz.common.account.dataobject.UserThirdPartyDo; import com.hehenian.biz.common.colorlife.ColorLifeBuyService; import com.hehenian.biz.common.dqlc.IDqlcService; import com.hehenian.biz.common.trade.IOperationLogService; import com.hehenian.biz.common.userhome.IUserIncomeService; import com.hehenian.biz.common.userhome.dataobject.UserIncomeDo; import com.hehenian.biz.common.util.DateUtils; import com.hehenian.biz.common.util.DesSecurityUtil; import com.hehenian.biz.common.util.huifu.IConstants; import com.hehenian.biz.common.wygj.IOffsetService; import com.hehenian.biz.common.wygj.IParkingFeeService; import com.hehenian.biz.common.wygj.IPropertyManagementFeeService; import com.hehenian.biz.common.wygj.SysCodeService; import com.hehenian.biz.common.wygj.dataobject.OffsetDetailsDo; import com.hehenian.biz.common.wygj.dataobject.OffsetRecordsDo; import com.hehenian.biz.common.wygj.dataobject.ParkingDetailDo; import com.hehenian.biz.common.wygj.dataobject.ParkingFeeDo; import com.hehenian.biz.common.wygj.dataobject.PropertyManagementDetailDo; import com.hehenian.biz.common.wygj.dataobject.PropertyManagementFeeDo; import com.hehenian.common.annotations.RequireLogin; import com.hehenian.common.utils.ResponseUtils; import com.hehenian.mobile.common.utils.ColorLifeUtils; import com.hehenian.mobile.common.utils.PreciseCompute; import com.hehenian.mobile.web.controller.BaseController; import com.hhn.hessian.cardverify.ICardVerifyService; import com.hhn.hessian.invest.IFundInvestService; import com.hhn.hessian.invest.IInvestProductService; import com.hhn.hessian.query.IQueryService; import com.hhn.hessian.recharge.IRechargeService; import com.hhn.pojo.FundBankCard; import com.hhn.pojo.FundTrade; import com.hhn.pojo.FundUserAccount; import com.hhn.pojo.Invest; import com.hhn.pojo.ProductRate; import com.hhn.util.BaseReturn; import com.hhn.util.Constants; import com.hhn.util.DqlcConfig; @Controller @RequestMapping(value = "/finance") public class InvestControll extends BaseController { protected Logger logger = Logger.getLogger(this.getClass()); @Autowired private IFundInvestService fundInvestmentService; @Autowired private IInvestProductService investProductService; @Autowired private IQueryService queryService; @Autowired private ICardVerifyService cardVerifyService; @Autowired public DqlcConfig dqlcConfig; @Autowired private IDqlcService dqlcService; @Autowired private IRechargeService rechargeService; @Autowired private IUserService userService; @Autowired private IUserThirdPartyService userThirdPartyService; @Autowired private IOperationLogService operationLogService; @Autowired private ColorLifeBuyService colorLifeBuyService; @Autowired private IPersonService personService; @Autowired private IUserIncomeService userIncomeService; @Autowired private IParkingFeeService parkingFeeService; @Autowired private IOffsetService offsetService; @Autowired private SysCodeService sysCodeService; @Autowired private IPropertyManagementFeeService manageFeeService; /** * 购买参数输入 * @param request * @param response * @return * @author: zhanbmf * @date 2015-3-30 下午4:37:58 */ @RequireLogin(injectPersonDo = true) @RequestMapping(value = "prepay") public String prepay(HttpServletRequest request,HttpServletResponse response) { int pId = NumberUtils.toInt(request.getParameter("pid"), -1); long userId = super.getUserId(); //绑定卡标识 int bankCardId = NumberUtils.toInt(request.getParameter("bank_card_id"), -1); if(pId <= 0) { return "redirect:/product/plist.do"; } BaseReturn prbr = investProductService.getProductRateById(pId); if(prbr.getReturnCode() != 0 || prbr.getData() == null) { return "redirect:/product/plist.do"; } ProductRate pr = (ProductRate)prbr.getData(); if(pr.getChannel() == 1 && pr.getSub_channel() == 1) { InviteCodeDo inviteDO = userService.findInviteCodeByDO(new InviteCodeDo(super.getUserId())); //如果不是员工 if(inviteDO == null) { return "redirect:/product/plist.do"; } } request.setAttribute("product", pr); FundBankCard fbc = null; if(bankCardId > 0) { BaseReturn cardBr = cardVerifyService.getBankCardById(bankCardId); if(cardBr != null && cardBr.getReturnCode() == 0 && cardBr.getData() != null) { fbc = (FundBankCard)cardBr.getData(); if(fbc.getUser_id().intValue() != Long.valueOf(userId).intValue() ) { return "redirect:/product/plist.do"; } fbc.setCard_no(Constants.getLastFourCardNo(fbc.getCard_no())); request.setAttribute("bingCard", fbc); } }else{ //BaseReturn cardReturn = queryService.queryBindedBankCard(Long.valueOf(super.getUserId()).intValue()); //获取绑定银行卡queryBindedBankCard BaseReturn bankReturn = queryService.queryBankCard(Long.valueOf(userId).intValue() ); if(bankReturn.getReturnCode() == 0 && bankReturn.getData() != null) { fbc = (FundBankCard)bankReturn.getData(); fbc.setCard_no(Constants.getLastFourCardNo(fbc.getCard_no())); request.setAttribute("bingCard", fbc); } } //账户余额 BaseReturn balance = queryService.queryUserBalance(Long.valueOf(super.getUserId()).intValue()); //查询用户余额 BigDecimal balanceAmount = new BigDecimal(0); if (balance.getReturnCode() == 0 && balance.getData() != null) { FundUserAccount balanceInfo = (FundUserAccount) balance.getData(); if (balanceInfo != null) { balanceAmount = balanceInfo.getBalance_amount() == null ? new BigDecimal(0) : balanceInfo.getBalance_amount(); } } request.setAttribute("balanceAmount", balanceAmount); BaseReturn existProduct = queryService.queryPay(); BigDecimal remainAmount = BigDecimal.ZERO; if (existProduct.getReturnCode() != 0 || existProduct.getData() == null) { request.setAttribute("canInvest", dqlcConfig.investMoneyScope); } else { BigDecimal canInvest = (BigDecimal) existProduct.getData(); if (null != canInvest) { remainAmount = canInvest.add(new BigDecimal(dqlcConfig.investMoneyScope)); if (BigDecimal.ZERO.compareTo(remainAmount) > 0) { remainAmount = BigDecimal.ZERO; } } request.setAttribute("canInvest", remainAmount); } return "finance/prepay"; } /** * 产品详情 * @param request * @param response * @return * @author: zhanbmf * @date 2015-3-30 下午4:37:58 */ @RequireLogin(injectPersonDo = true) @RequestMapping(value = "invest") public void invest(HttpServletRequest request,HttpServletResponse response) { BaseReturn br = new BaseReturn(BaseReturn.Err_data_inValid, ""); //选购产品 int pId = NumberUtils.toInt(request.getParameter("pid"), -1); //购买金额 int amount = NumberUtils.toInt(request.getParameter("amount")); //绑定卡标识 int bankCardId = NumberUtils.toInt(request.getParameter("bank_card_id"), -1); //推荐人 String recommentPhone = request.getParameter("recommentPhone"); if(pId <= 0 || amount < 1) { ResponseUtils.renderJson(response, null, JSONObject.fromObject(br).toString()) ; return; } //实名认证 设置支付密码 PersonDo pd = super.getPerson(); BaseReturn result = checkP(request, response, pd); if(result.getReturnCode()>0){ ResponseUtils.renderJson(response, null, JSONObject.fromObject(result).toString()) ; return; } //查询用户手机号 Integer userId = Long.valueOf(super.getUserId()).intValue(); AccountUserDo aud = super.getAccountUser(); BaseReturn prbr = investProductService.getProductRateById(pId); if(prbr.getReturnCode() != 0 || prbr.getData() == null) { ResponseUtils.renderJson(response, null, JSONObject.fromObject(br).toString()) ; return; } String mobile = aud.getMobilePhone(); if (StringUtils.isNotBlank(mobile) && mobile.startsWith("-")) { mobile = mobile.substring(1); } ProductRate pr = (ProductRate)prbr.getData(); HttpSession session = request.getSession(); //用户投资金额 BigDecimal investAmount = new BigDecimal(amount); Map<String, Object> map = new HashMap<String, Object>(); map.put("user_id", userId); //jiangwmf added //添加冲抵相关信息 map.put("offsetDetailId", request.getParameter("offsetDetailId")); map.put("offsetfee", request.getParameter("offsetfee")); map.put("offsetBegin", request.getParameter("offsetBegin")); map.put("offsetEnd", request.getParameter("offsetEnd")); //end //渠道来源 String source = super.getSourcFrom(); logger.debug("sourceFrom:=======>"+source); // 查询投资人账户余额 BaseReturn balance = queryService.queryUserBalance(userId); FundUserAccount userAccount = (FundUserAccount) balance.getData(); BigDecimal accountBalance = new BigDecimal(0); if (userAccount != null && userAccount.getBalance_amount() != null) { accountBalance = userAccount.getBalance_amount(); } session.setAttribute("userBalance", accountBalance); //add zhangjhmf 2015-04-07 添加代理人账户判断 int accountType = 0; if(aud != null){ accountType= aud.getAccountType(); } if(1 == accountType){ FundBankCard fundBankCard = new FundBankCard(); //如果账户余额足够,则直接购买 if (investAmount.doubleValue() <= accountBalance.doubleValue()) { br = doUserInvest(userId, pr, investAmount, investAmount, new BigDecimal("0.00"), source, fundBankCard.getCard_no(), fundBankCard.getBank_code(), fundBankCard.getBank_name(),recommentPhone, map); map.put("investPro", pr.getProduct_name()); System.out.println(JSONObject.fromObject(br).toString()); ResponseUtils.renderJson(response, ResponseUtils.UTF8, JSONObject.fromObject(br).toString()) ; return; }else{ br.setReturnCode(8); br.setMessageInfo("账户余额不足"); ResponseUtils.renderJson(response, null, JSONObject.fromObject(br).toString()) ; return; } }else{ // 查询绑卡信息 // 否则判断是否先绑卡 // HashMap<String,String> param = new HashMap<String,String>(); // param.put("userId", userId.toString()); // BaseReturn bankCard = cardVerifyService.queryOldBindingCard(param); BaseReturn bankCard = cardVerifyService.getBankCardById(bankCardId); FundBankCard fundBankCard = (FundBankCard) bankCard.getData(); logger.debug("bankCard info:" + fundBankCard); // if (bankCard.getReturnCode() != 0 || fundBankCard == null || StringUtils.isBlank(fundBankCard.getCard_no())) { // //return new BaseReturn(1, bankCard.getData(), bankCard.getMessageInfo()); // //return new BaseReturn(2, "请先绑定银行卡"); // br.setReturnCode(2); // br.setMessageInfo("请先绑定银行卡"); // ResponseUtils.renderJson(response, null, JSONObject.fromObject(br).toString()) ; // return; // } Map<String, Object> bankInfo = new HashMap<String, Object>(); bankInfo.put("bankCode", fundBankCard.getBank_code()); bankInfo.put("bankNo", fundBankCard.getCard_no()); BaseReturn bandingCount = queryService.getBingCount(Long.valueOf(super.getUserId()).intValue()); bankInfo.put("bankCount", ((Integer) (bandingCount.getData())).intValue()); // 投资金额大于风控金额时,需要验证码 /* BigDecimal moneySms = new BigDecimal(dqlcConfig.MONEY_NEED_SMS); String verifyCode = request.getParameter("verifyCode"); if (investAmount.doubleValue() >= moneySms.doubleValue()) { if (StringUtils.isBlank(verifyCode)) { logger.debug("bankCard info:" + fundBankCard); if (fundBankCard != null && fundBankCard.getBank_status() == 2) { //return new BaseReturn(3, bankInfo, "输入验证金额"); br.setReturnCode(3); br.setMessageInfo("输入验证金额"); ResponseUtils.renderJson(response, null, JSONObject.fromObject(br).toString()) ; return; } map.put("bankName", fundBankCard.getBank_name()); map.put("bankNo", fundBankCard.getCard_no()); map.put("bankCode", fundBankCard.getBank_code()); //return new BaseReturn(4, map, "请提交验证码"); br.setReturnCode(4); br.setMessageInfo("请提交验证码"); ResponseUtils.renderJson(response, null, JSONObject.fromObject(br).toString()) ; return; } else { boolean flag = dqlcService.checkPhoneVerifyCode(mobile, verifyCode); if (!flag) { //return new BaseReturn(1, "验证码不正确"); br.setReturnCode(1); br.setMessageInfo("验证码不正确"); ResponseUtils.renderJson(response, null, JSONObject.fromObject(br).toString()) ; return; } } } else { if (StringUtils.isBlank(verifyCode)){ if (fundBankCard==null || StringUtils.isEmpty(fundBankCard.getCard_no())){ //return new BaseReturn(2, "请先绑定银行卡"); br.setReturnCode(2); br.setMessageInfo("您尚未绑定银行卡,无法进行购买/充值."); ResponseUtils.renderJson(response, null, JSONObject.fromObject(br).toString()) ; return; } if (fundBankCard!=null && fundBankCard.getBank_status()==2){ //return new BaseReturn(3, bankInfo,"输入验证金额"); br.setReturnCode(3); br.setMessageInfo("输入验证金额"); ResponseUtils.renderJson(response, null, JSONObject.fromObject(br).toString()) ; return; } }else{ boolean flag = dqlcService.checkPhoneVerifyCode(mobile, verifyCode); if (!flag) { //return new BaseReturn(1, "验证码不正确"); br.setReturnCode(1); br.setMessageInfo("验证码不正确"); ResponseUtils.renderJson(response, null, JSONObject.fromObject(br).toString()) ; return; } } }*/ if (recommentPhone!=null && StringUtils.isNotEmpty(recommentPhone)){ session.setAttribute("recommentPhone", recommentPhone); }else{ recommentPhone = (String)session.getAttribute("recommentPhone"); } //是否完成实名认证 to do... //是否完成支付密码设定 to do... logger.debug("realName==============>" + pd.getRealName()); session.setAttribute("userHidPhone", Constants.getHidePhone(mobile)); logger.debug("==============>" + Constants.getHidePhone(mobile)); session.setAttribute("userPhone", mobile); logger.debug("==============>" + Constants.getHidePhone(mobile)); session.setAttribute("realName", pd.getRealName()); session.setAttribute("idNo", Constants.getHideIdNo(pd.getIdNo())); //0:勾选余额,1:未勾选余额 String payStatus = request.getParameter("payStatus"); //map.put("userName", super.getUserName(request)); map.put("userName", aud.getUsername()); map.put("idNo", pd.getIdNo()); map.put("investPro", pr.getProduct_name()); if("1".equals(payStatus)){ map.put("AMOUNT", investAmount.toString()); logger.debug("invoke interface charge money parameter: user_id==>" + map.get("user_id") + ",amount==>" + map.get("AMOUNT")); logger.debug("charge money...............................start"); BaseReturn chargeReturn = rechargeService.recharge(map); logger.debug("charge money ..............................end,returnCode:"+chargeReturn.getReturnCode()); if (chargeReturn.getReturnCode()==0) { // return doUserInvest(userId, rateId, mounth, investAmount, accountBalance, investAmount, source, fundBankCard.getCard_no(), fundBankCard.getBank_code(), fundBankCard.getBank_name(), recommentPhone, map); //return doUserInvest(userId, pr.getProduct_rate_id().toString(), pr.getPeriod().toString(), investAmount, accountBalance, investAmount, source, fundBankCard.getCard_no(), fundBankCard.getBank_code(), fundBankCard.getBank_name(), recommentPhone, map); br = doUserInvest(userId, pr, investAmount, accountBalance, investAmount, source, fundBankCard.getCard_no(), fundBankCard.getBank_code(), fundBankCard.getBank_name(), recommentPhone, map); //return chargeReturn; ResponseUtils.renderJson(response, null, JSONObject.fromObject(br).toString()) ; return; }else if(chargeReturn.getReturnCode() == 1){ Map<String,Object> returnMap = new HashMap<String,Object>(); returnMap.put("bankInfo", fundBankCard); returnMap.put("data", chargeReturn.getData()); chargeReturn.setData(returnMap); //return chargeReturn; ResponseUtils.renderJson(response, null, JSONObject.fromObject(chargeReturn).toString()) ; return; }else { //return chargeReturn; //return chargeReturn; ResponseUtils.renderJson(response, null, JSONObject.fromObject(chargeReturn).toString()) ; return; } }else { //如果账户余额足够,则直接购买 if (investAmount.doubleValue() <= accountBalance.doubleValue()) { //BigDecimal afterBalance = accountBalance.subtract(investAmount); // return doUserInvest(userId, rateId,mounth, investAmount, investAmount, new BigDecimal("0.00"), source, fundBankCard.getCard_no(), fundBankCard.getBank_code(), fundBankCard.getBank_name(),recommentPhone, map); //return doUserInvest(userId, pr.getProduct_rate_id().toString() ,pr.getPeriod().toString(), investAmount, investAmount, new BigDecimal("0.00"), source, fundBankCard.getCard_no(), fundBankCard.getBank_code(), fundBankCard.getBank_name(),recommentPhone, map); br = doUserInvest(userId, pr, investAmount, investAmount, new BigDecimal("0.00"), source, fundBankCard.getCard_no(), fundBankCard.getBank_code(), fundBankCard.getBank_name(),recommentPhone, map); System.out.println(JSONObject.fromObject(br).toString()); ResponseUtils.renderJson(response, ResponseUtils.UTF8, JSONObject.fromObject(br).toString()) ; return; } //充值后购买 BigDecimal chargeAmount = investAmount.subtract(accountBalance); map.put("AMOUNT", chargeAmount.toString()); logger.debug("invoke interface charge money parameter: user_id==>" + map.get("user_id") + ",amount==>" + map.get("AMOUNT")); logger.debug("charge money...............................start"); BaseReturn chargeReturn = rechargeService.recharge(map); logger.debug("charge money ..............................end,returnCode:" + chargeReturn.getReturnCode()); if (chargeReturn.getReturnCode() == 0) { // return doUserInvest(userId, rateId,mounth, investAmount, accountBalance, chargeAmount, source, fundBankCard.getCard_no(), fundBankCard.getBank_code(), fundBankCard.getBank_name(),recommentPhone, map); //return doUserInvest(userId, pr.getProduct_rate_id().toString() ,pr.getPeriod().toString(), investAmount, accountBalance, chargeAmount, source, fundBankCard.getCard_no(), fundBankCard.getBank_code(), fundBankCard.getBank_name(),recommentPhone, map); br = doUserInvest(userId, pr, investAmount, accountBalance, chargeAmount, source, fundBankCard.getCard_no(), fundBankCard.getBank_code(), fundBankCard.getBank_name(),recommentPhone, map); ResponseUtils.renderJson(response, null, JSONObject.fromObject(br).toString()) ; return; }else if(chargeReturn.getReturnCode() == 1){ Map<String,Object> returnMap = new HashMap<String,Object>(); returnMap.put("bankInfo", fundBankCard); returnMap.put("data", chargeReturn.getData()); chargeReturn.setData(returnMap); //return chargeReturn; }else { //return chargeReturn; } ResponseUtils.renderJson(response, null, JSONObject.fromObject(chargeReturn).toString()) ; return; } } } private BaseReturn checkP(HttpServletRequest request,HttpServletResponse response, PersonDo person){ BaseReturn br = new BaseReturn(); //是否完成实名认证 to do... //PersonDo person = personService.getByUserId(super.getUserId()); //是否完成支付密码设定 to do... AccountUserDo audo = userService.getById(super.getUserId()); //是否已经绑定银行卡 // BaseReturn bankCard = cardVerifyService.getBankCardById(bankCardId); // FundBankCard fundBankCard = (FundBankCard) bankCard.getData(); // logger.debug("bankCard info:" + fundBankCard); //Long userId = getUserId(); //绑定的银行卡信息 BaseReturn cardReturn = queryService.queryBindedBankCard(Long.valueOf(super.getUserId()).intValue()); List<FundBankCard> list = (List)cardReturn.getData(); System.out.println("person======" + person == null); if(NumberUtils.toInt(ObjectUtils.toString(person.getAuditStatus(), "-100"), -100) != 3){ br.setReturnCode(5); br.setMessageInfo("您尚未完成实名认证,无法进行购买/充值."); }else if(org.springframework.util.StringUtils.isEmpty(audo.getPayPassword())){ br.setReturnCode(6); br.setMessageInfo("您尚未设置支付密码,无法进行购买/充值."); }else if (list.size() <= 0) { br.setReturnCode(7); br.setMessageInfo("您尚未绑定银行卡,无法进行购买/充值."); } return br; } /** * 添加银行之前先验证是否已经实名验证,设置支付密码 * @param request * @param response * @return */ @RequireLogin(injectPersonDo = true) @RequestMapping(value = "setUp") public void setUp(HttpServletRequest request,HttpServletResponse response){ BaseReturn br = checkP(request, response, super.getPerson()); ResponseUtils.renderText(response, null, JSONObject.fromObject(br).toString()); } //用户投资处理 private BaseReturn doUserInvest(Integer userId,ProductRate pr,BigDecimal investAmount,BigDecimal balance,BigDecimal charge,String source,String bankNo,String bankCode,String bankName,String recommentPhone,Map<String, Object> map){ Invest invest = new Invest(); invest.setUser_id(userId); invest.setMonth(Integer.valueOf(pr.getPeriod())); invest.setRateId(Integer.valueOf(pr.getProduct_rate_id())); invest.setMoney(investAmount); invest.setTargetType(source); invest.setRecommendPhone(recommentPhone); logger.debug("user investment start.........................."); BaseReturn investReturn = fundInvestmentService.investment(invest); logger.debug("user investment end............................returnCode:"+investReturn.getReturnCode()); if (investReturn.getReturnCode()==0){ //+多宝、+车宝 需要插入冲抵期限和明细信息 if(pr.getChannel()==1&&(pr.getSub_channel()==2||pr.getSub_channel()==3)){ this.insertOffsetLogs(userId,pr,(FundTrade)investReturn.getData(),map); } map.put("mouth", pr.getPeriod()); map.put("investAmount", investAmount); map.put("balanceAmount", balance); map.put("chargeAmount", charge); map.put("bankNo", Constants.getHideBandNo(bankNo)); map.put("bankCode",bankCode); map.put("bankName",bankName); map.put("data",investReturn.getData()); investReturn.setData(map); return investReturn; }else{ return new BaseReturn(1, investReturn.getData(),investReturn.getMessageInfo()); } } /** * 增加+多宝、+车宝的冲抵记录和冲抵明细 * @param userId * @param pr * @param fundTrade * @param map */ private void insertOffsetLogs(Integer userId,ProductRate pr,FundTrade fundTrade,Map<String, Object> map){ //物业国际 getChannel =1、 +多宝getSub_channel()==2、 +车宝getSub_channel()==3 //更新冲抵地址的状态为 已冲抵 if(pr.getSub_channel()==2){//多宝冲抵物业费 PropertyManagementDetailDo pmdd = new PropertyManagementDetailDo(); pmdd.setId(Integer.parseInt(map.get("offsetDetailId").toString())); pmdd.setInfotype(1); manageFeeService.updatePropertyManagementDetailDo(pmdd); }else if(pr.getSub_channel()==3){//车宝冲抵停车费 ParkingDetailDo pdd = new ParkingDetailDo(); pdd.setId(Integer.parseInt(map.get("offsetDetailId").toString())); pdd.setInfotype(1); parkingFeeService.updateParkingDetail(pdd); } //增加+多宝、+车宝的冲抵记录和冲抵明细 OffsetRecordsDo ord = new OffsetRecordsDo(); ord.setId(Integer.parseInt(map.get("offsetDetailId").toString())); ord.setTrade_id(fundTrade.getTrade_id()); ord.setUser_id(userId); ord.setBegindate(map.get("offsetBegin").toString()); ord.setEnddate(map.get("offsetEnd").toString()); ord.setFee(Double.parseDouble(map.get("offsetfee").toString())); if(pr.getSub_channel()==2){//多宝冲抵物业费 ord.setInfotype(0); }else if(pr.getSub_channel()==3){//车宝冲抵停车费 ord.setInfotype(1); } int rCount = offsetService.insertOffsetRecord(ord); if(rCount>0){ //2.增增加冲抵明细 t_offset_detailinfo int factPeriod = 0; if(pr.getChannel()==1 && pr.getSub_channel()==3){//车宝 factPeriod = pr.getPeriod()+1; }else if(pr.getChannel()==1 && pr.getSub_channel()==2){//多宝 factPeriod = pr.getPeriod(); } for (int i = 1; i <= factPeriod; i++) { OffsetDetailsDo odd = new OffsetDetailsDo(); odd.setTrade_id(fundTrade.getTrade_id()); odd.setTimeframe(i+"/"+factPeriod); odd.setOffsetdate(DateUtils.getYearAfter(Calendar.MONTH,i)+"-" + getMonthStr(DateUtils.getMonthAfter(Calendar.MONTH,i))); odd.setInfostatus(0); odd.setFee(Double.parseDouble(map.get("offsetfee").toString())); odd.setIsvalid(1);//默认有效,赎回后置为无效 offsetService.insertOffsetDetail(odd); } } } @RequestMapping(value = "agreement") public String agreement(){ //是否是彩生活渠道channel=1彩生活渠道|0官方渠道 物业国际普通通道 员工通道 int channel = 1; int subChannel = NumberUtils.toInt(request.getParameter("subChannel"), 0); return "finance/serviceAgreement"; } /** * 进入到绑卡页面 http://www.hehenian.com/hhn_web/bindCardPhonePage.do * @param request * @param response * @return * @author: zhanbmf * @date 2015-4-1 上午3:40:37 */ @RequireLogin(injectPersonDo = true) @RequestMapping(value = "bindCard", method = RequestMethod.GET) public String bindCard(HttpServletRequest request,HttpServletResponse response) { Map<String, Object> map = new HashMap<String, Object>(); //查询账户名和手机号 PersonDo pd = super.getPerson(); map.put("realName", pd.getRealName()==null?"":pd.getRealName()); map.put("idNo", Constants.getHideIdNo(pd.getIdNo())); request.setAttribute("result", map); return "finance/bindBank"; } @RequireLogin @RequestMapping(value = "bindCardPhone") public void bindCardPhone(HttpServletRequest request,HttpServletResponse response) { try { Map<String, String> param = new HashMap<String, String>(); String bankCode = request.getParameter("bankCode");//银行代码 String userAccount = request.getParameter("userAccount");//银行卡号 userAccount = userAccount.replaceAll(" ", ""); if (bankCode == null || "".equals(bankCode)) { ResponseUtils.renderText(response, null, JSONObject.fromObject(new BaseReturn(1,"银行代码不能为空")).toString()); return; } else { param.put("bankCode", bankCode); } if (userAccount == null || "".equals(userAccount)) { ResponseUtils.renderText(response, null, JSONObject.fromObject(new BaseReturn(1,"银行卡号不能为空")).toString()); return; } else { param.put("bankNo", userAccount); } param.put("userId", String.valueOf(super.getUserId())); logger.debug("bindCardPhone Parameter: bankNo="+userAccount+",bankNo="+bankCode); logger.debug("bindCardPhone invocation start............................"); BaseReturn baseReturn = cardVerifyService.sendBankIdentifyCode(param); logger.debug("bindCardPhone sendBankIdentifyCode:::"+baseReturn.getReturnCode()); logger.debug("bindCardPhone invocation end.............................."); ResponseUtils.renderText(response, null, JSONObject.fromObject(baseReturn).toString()); }catch (Exception e){ ResponseUtils.renderText(response, null, JSONObject.fromObject(new BaseReturn(1,"系统正忙请稍后重试")).toString()); } } /** * 绑卡下一步(金额验证页) * @param request * @param response * @return * @author: chenzhpmf * @date 2015-4-4 下午8:31:24 */ @RequireLogin @RequestMapping(value = "moneyVerify", method = RequestMethod.GET) public String moneyVerification(HttpServletRequest request,HttpServletResponse response){ return "finance/moneyVerification"; } /** * 验证银行卡 * @param request * @param response * @author: chenzhpmf * @date 2015-4-4 下午8:30:48 */ @RequireLogin @RequestMapping(value = "verifyCard", method = RequestMethod.POST) public void verifyCard(HttpServletRequest request,HttpServletResponse response) { Map<String, String> map = new HashMap<String, String>(); String money = request.getParameter("money");//金额; if (StringUtils.isBlank(money)){ ResponseUtils.renderText(response, null, JSONObject.fromObject(new BaseReturn(1,"金额不能为空")).toString()); return; } String account = request.getParameter("account"); if (account==null || StringUtils.isEmpty(account)){ ResponseUtils.renderText(response, null, JSONObject.fromObject(new BaseReturn(1,"付款银行不能为空")).toString()); return; } Long userId = getUserId(); map.put("userId", String.valueOf(userId)); map.put("amount", money); map.put("account", account); try { logger.debug("verifyCardPhone checkBankIdentifyCode::userId:::" + userId + "::amount::" + money); logger.debug("verifyCardPhone invocation start............................"); BaseReturn baseReturn = cardVerifyService.checkBankIdentifyCode(map); logger.debug("verifyCardPhone return checkBankIdentifyCode:"+baseReturn.getReturnCode()); logger.debug("verifyCardPhone invocation end.............................."); ResponseUtils.renderText(response, null, JSONObject.fromObject(baseReturn).toString()); }catch (Exception e){ logger.error(e); ResponseUtils.renderText(response, null, JSONObject.fromObject(new BaseReturn(1,"系统正忙请稍后重试")).toString()); } } /** * 产品详情 * @param request * @param response * @return * @author: zhanbmf * @date 2015-3-30 下午4:37:58 */ @RequireLogin(injectPersonDo = true) @RequestMapping(value = "investHb") public void investHb(HttpServletRequest request,HttpServletResponse response) { BaseReturn br = new BaseReturn(BaseReturn.Err_data_inValid, ""); //选购产品 int pId = NumberUtils.toInt(request.getParameter("pid"), -1); //购买金额 int amount = NumberUtils.toInt(request.getParameter("amount")); String code = request.getParameter("code"); //推荐人 if(pId <= 0) { ResponseUtils.renderJson(response, null, JSONObject.fromObject(br).toString()) ; return; } BaseReturn prbr = investProductService.getProductRateById(pId); if(prbr.getReturnCode() != 0 || prbr.getData() == null) { ResponseUtils.renderJson(response, null, JSONObject.fromObject(br).toString()) ; return; } //查询用户手机号 Integer userId = Long.valueOf(super.getUserId()).intValue(); AccountUserDo aud = super.getAccountUser(); PersonDo pd = super.getPerson(); if(pd.getAuditStatus() != 3){ br.setReturnCode(1); br.setMessageInfo("请进行实名认证!"); ResponseUtils.renderJson(response, null, JSONObject.fromObject(br).toString()) ; return ; } String mobile = aud.getMobilePhone(); if (StringUtils.isNotBlank(mobile) && mobile.startsWith("-")) { mobile = mobile.substring(1); } ProductRate pr = (ProductRate)prbr.getData(); HttpSession session = request.getSession(); //用户投资金额 BigDecimal investAmount = new BigDecimal(amount); Map<String, Object> map = new HashMap<String, Object>(); map.put("user_id", userId); //渠道来源 String source = super.getSourcFrom(); logger.debug("sourceFrom:=======>"+source); // 查询投资人账户余额 UserThirdPartyDo upo = userThirdPartyService.getByUserId(new Long(userId).intValue()); String oauser = upo == null ? "" : upo.getThethirdusername(); Float balance = ColorLifeUtils.getEmpBalance(oauser); // balance = 1000f; BigDecimal accountBalance = new BigDecimal(balance); if(balance.doubleValue() - investAmount.doubleValue() < 0){ br.setReturnCode(8); br.setMessageInfo("账户余额不足"); ResponseUtils.renderJson(response, null, JSONObject.fromObject(br).toString()) ; return; } if(investAmount.doubleValue() - 500 < 0){ br.setReturnCode(8); br.setMessageInfo("购买金额不能少于500"); ResponseUtils.renderJson(response, null, JSONObject.fromObject(br).toString()) ; return; } session.setAttribute("userBalance", accountBalance); int checkPassword = ColorLifeUtils.checkPayPwd(oauser, code); // checkPassword = 1; // checkPassword = 2; //校验密码失败 if(1 == checkPassword){ br.setReturnCode(8); br.setMessageInfo("红包支付密码输入错误!"); ResponseUtils.renderJson(response, null, JSONObject.fromObject(br).toString()) ; return; }else if(2 == checkPassword){ //无红包支付密码 br.setReturnCode(8); br.setMessageInfo("请设置红包支付密码!"); ResponseUtils.renderJson(response, null, JSONObject.fromObject(br).toString()) ; return; } //保存订单 Map<String, Object> corolLifeBuyInfo= new HashMap<String, Object>(); corolLifeBuyInfo.put("product_id",pr.getProduct_rate_id()); corolLifeBuyInfo.put("real_name",pd.getRealName()); corolLifeBuyInfo.put("user_id",pd.getUserId()); corolLifeBuyInfo.put("buy_money",investAmount); corolLifeBuyInfo.put("buy_time",new Date()); corolLifeBuyInfo.put("status",1); corolLifeBuyInfo.put("insert_time",new Date()); try { corolLifeBuyInfo = colorLifeBuyService.saveBuyInfo(corolLifeBuyInfo); } catch (Exception e) { br.setReturnCode(8); br.setMessageInfo("购买产品失败,请重试"); ResponseUtils.renderJson(response, null, JSONObject.fromObject(br).toString()) ; return; } String orderNo = ObjectUtils.toString(corolLifeBuyInfo.get("order_id")); //String orderNo = System.currentTimeMillis() + RandomStringUtils.randomNumeric(2); String result = ColorLifeUtils.elicaiSuccessSyntony(oauser,orderNo, pr.getPeriod().toString(), investAmount.toString(),code, ""); // JSONObject elicai = JSONObject.fromObject(result); // String status = ObjectUtils.toString(elicai.get("status")); if(null == result) { br.setReturnCode(8); br.setMessageInfo("扣款失败,请重试!"); ResponseUtils.renderJson(response, null, JSONObject.fromObject(br).toString()) ; return; } logger.info(aud.getId()+aud.getMobilePhone()+oauser+"购买红包理财"+amount+"元"); //add zhangjhmf 2015-4-20 将购买金额传入日志中。 operationLogService.addOperationLog("t_color_life_buy_info", aud.getUsername(), IConstants.UPDATE, aud.getLastIP(), investAmount.doubleValue(), oauser+"购买红包理财"+amount+"元", 1); map.put("mouth", 6); map.put("investAmount", investAmount); map.put("balanceAmount", ObjectUtils.toString(ColorLifeUtils.getEmpBalance(oauser))); map.put("chargeAmount", 0); map.put("data",br.getData()); br.setData(map); br.setReturnCode(0); br.setMessageInfo("操作成功"); ResponseUtils.renderJson(response, null, JSONObject.fromObject(br).toString()) ; return; } @RequireLogin(injectPersonDo = true) @RequestMapping(value = "prepayHb") public String prepayHb(HttpServletRequest request,HttpServletResponse response) { int pId = NumberUtils.toInt(request.getParameter("pid"), -1); long userId = super.getUserId(); BaseReturn prbr = investProductService.getProductRateById(pId); if(prbr.getReturnCode() != 0 || prbr.getData() == null) { return "redirect:/product/plist.do"; } ProductRate pr = (ProductRate)prbr.getData(); request.setAttribute("product", pr); //账户余额 // BaseReturn balance = queryService.queryUserBalance(Long.valueOf(super.getUserId()).intValue()); //查询用户余额 Integer userid = new Long(userId).intValue(); UserThirdPartyDo upo = userThirdPartyService.getByUserId(userid); String oauser = upo == null ? "" : upo.getThethirdusername(); BigDecimal balanceAmount = new BigDecimal(ColorLifeUtils.getEmpBalance(oauser)); // if (balance.getReturnCode() == 0 && balance.getData() != null) { // FundUserAccount balanceInfo = (FundUserAccount) balance.getData(); // if (balanceInfo != null) { // balanceAmount = balanceInfo.getBalance_amount() == null ? new BigDecimal(0) : balanceInfo.getBalance_amount(); // } // } request.setAttribute("balanceAmount", balanceAmount); BaseReturn existProduct = queryService.queryPay(); BigDecimal remainAmount = BigDecimal.ZERO; if (existProduct.getReturnCode() != 0 || existProduct.getData() == null) { request.setAttribute("canInvest", dqlcConfig.investMoneyScope); } else { BigDecimal canInvest = (BigDecimal) existProduct.getData(); if (null != canInvest) { remainAmount = canInvest.add(new BigDecimal(dqlcConfig.investMoneyScope)); if (BigDecimal.ZERO.compareTo(remainAmount) > 0) { remainAmount = BigDecimal.ZERO; } } request.setAttribute("canInvest", remainAmount); } return "finance/prepayHB"; } /** * 项目投资页 * @param request * @param response * @return * @throws Exception */ @RequireLogin(injectPersonDo = true) @RequestMapping("projectInvest") public String projectInvest(HttpServletRequest request, HttpServletResponse response, Model model) throws Exception { AccountUserDo user = getAccountUser(); PersonDo personDo = personService.getByUserId(user.getId()); request.setAttribute("usrCustId", user.getUsrCustId());// 汇付会员编号 request.setAttribute("userId", user.getId());// 会员编号 request.setAttribute("realName", personDo.getRealName());// 真实姓名 request.setAttribute("idNo", personDo.getIdNo());// 身份证 DesSecurityUtil des = new DesSecurityUtil(); String userI = des.encrypt(user.getId().toString()); request.setAttribute("userI", userI); String uri = getPath(); request.setAttribute("url", uri); /** * usableAmount,freezeSum ,dailyIncome,assetValue,recivedPrincipal */ UserIncomeDo userIncomeDo = userIncomeService.queryUserIncome( user.getId() + "", UserType.HEHENIAN.name()); request.setAttribute("userIncomeDo", userIncomeDo); return "finance/capital"; } /** * +车宝,+多宝购买 * @param request * @param response * @return * @author: jiangwmf * @date 2015-4-23 下午4:37:58 */ @RequireLogin(injectPersonDo = true) @RequestMapping(value = "prepayCB") public String prepayCB(HttpServletRequest request,HttpServletResponse response) { //产品id int pId = NumberUtils.toInt(request.getParameter("pid"), -1); long userId = super.getUserId(); //冲抵信息id int offsetId = NumberUtils.toInt(request.getParameter("offsetId"), -1); //绑定卡标识 int bankCardId = NumberUtils.toInt(request.getParameter("bank_card_id"), -1); //查询产品收益率、收益期限 --用来计算费用 BaseReturn prbr = investProductService.getProductRateById(pId); if(prbr.getReturnCode() != 0 || prbr.getData() == null) { return "redirect:/product/plist.do"; } ProductRate pr = (ProductRate)prbr.getData(); request.setAttribute("product", pr); BigDecimal fee = null;//物业费\停车费 BigDecimal period = null; if(pr.getSub_channel()==3){ ParkingDetailDo offsetDetail = null; ///查询冲抵信息(冲抵停车费信息(t_parking_detailinfo)及停车费金额(t_parking_fee))信息 if(offsetId>0){ offsetDetail = parkingFeeService.getParkingDetailDoById(offsetId); }else{ offsetDetail = parkingFeeService.getDefaultByUserId(new Long(userId).intValue()); } if(offsetDetail==null){ return "redirect:/product/plist.do"; } request.setAttribute("offsetDetail", offsetDetail); ParkingFeeDo offsetFee = parkingFeeService.getByParams(offsetDetail.getMainaddressid(),offsetDetail.getPlate_number()); if(offsetFee==null){ return "redirect:/product/plist.do"; } request.setAttribute("offsetFee",offsetFee); request.setAttribute("roomOrPlateNo", offsetFee.getPlate_number()); String addressDesc = sysCodeService.getByCommunityCode(offsetFee.getMainaddressid().toString()).replace(",",""); request.setAttribute("addressDesc",addressDesc); fee = new BigDecimal(offsetFee.getParking_fee());//物业费 period = new BigDecimal(pr.getPeriod()+1); //period = new BigDecimal(pr.getPeriod()); }else if(pr.getSub_channel()==2){ PropertyManagementDetailDo offsetDetail = null; ///查询冲抵信息(冲抵停车费信息(t_parking_detailinfo)及停车费金额(t_parking_fee))信息 if(offsetId>0){ offsetDetail = manageFeeService.getPropertyManagementDetailDoById(offsetId); }else{ offsetDetail = manageFeeService.getDefaultByUserId(new Long(userId).intValue()); } if(offsetDetail==null){ return "redirect:/product/plist.do"; } request.setAttribute("offsetDetail", offsetDetail); PropertyManagementFeeDo offsetFee = manageFeeService.getByParams(offsetDetail.getMainaddressid(),offsetDetail.getBuilding(),offsetDetail.getRoomnum(),offsetDetail.getTheowner()); if(offsetFee==null){ return "redirect:/product/plist.do"; } request.setAttribute("offsetFee",offsetFee); request.setAttribute("roomOrPlateNo", offsetFee.getRoomnum()); String addressDesc = sysCodeService.getByCommunityCode(offsetFee.getMainaddressid().toString()).replace(",",""); request.setAttribute("addressDesc",addressDesc); fee = new BigDecimal(offsetFee.getProperty_fee());//物业费 period = new BigDecimal(pr.getPeriod()); } //冲抵时间 String offsetCur = DateUtils.getCurrentYear() + "-" +getMonthStr(DateUtils.getCurrentMonth()); String offsetDelay = DateUtils.getYearAfter(Calendar.MONTH,period.intValue())+"-" + getMonthStr(DateUtils.getMonthAfter(Calendar.MONTH,period.intValue())); request.setAttribute("offsetCur",offsetCur); request.setAttribute("offsetDelay",offsetDelay); //费用计算(预存金额、每月冲抵物业费、预期收益) Map<String,Object> map = calOffsetFee(period,pr.getRate(),fee); request.setAttribute("preDepositAmount", map.get("preDepositAmount")); request.setAttribute("obtainAllAmount", map.get("obtainAllAmount")); //检查余额是否足够? FundBankCard fbc = null; if(bankCardId > 0) { BaseReturn cardBr = cardVerifyService.getBankCardById(bankCardId); if(cardBr != null && cardBr.getReturnCode() == 0 && cardBr.getData() != null) { fbc = (FundBankCard)cardBr.getData(); if(fbc.getUser_id().intValue() != Long.valueOf(userId).intValue() ) { return "redirect:/product/plist.do"; } fbc.setCard_no(Constants.getLastFourCardNo(fbc.getCard_no())); request.setAttribute("bingCard", fbc); } }else{ //BaseReturn cardReturn = queryService.queryBindedBankCard(Long.valueOf(super.getUserId()).intValue()); //获取绑定银行卡 BaseReturn bankReturn = queryService.queryBankCard(Long.valueOf(userId).intValue() ); if(bankReturn.getReturnCode() == 0 && bankReturn.getData() != null) { fbc = (FundBankCard)bankReturn.getData(); fbc.setCard_no(Constants.getLastFourCardNo(fbc.getCard_no())); request.setAttribute("bingCard", fbc); } } //账户余额 BaseReturn balance = queryService.queryUserBalance(Long.valueOf(super.getUserId()).intValue()); //查询用户余额 BigDecimal balanceAmount = new BigDecimal(0); if (balance.getReturnCode() == 0 && balance.getData() != null) { FundUserAccount balanceInfo = (FundUserAccount) balance.getData(); if (balanceInfo != null) { balanceAmount = balanceInfo.getBalance_amount() == null ? new BigDecimal(0) : balanceInfo.getBalance_amount(); } } request.setAttribute("balanceAmount", balanceAmount); BaseReturn existProduct = queryService.queryPay(); BigDecimal remainAmount = BigDecimal.ZERO; if (existProduct.getReturnCode() != 0 || existProduct.getData() == null) { request.setAttribute("canInvest", dqlcConfig.investMoneyScope); } else { BigDecimal canInvest = (BigDecimal) existProduct.getData(); if (null != canInvest) { remainAmount = canInvest.add(new BigDecimal(dqlcConfig.investMoneyScope)); if (BigDecimal.ZERO.compareTo(remainAmount) > 0) { remainAmount = BigDecimal.ZERO; } } request.setAttribute("canInvest", remainAmount); } return "finance/prepayCB"; } private String getMonthStr(int mth){ String curmthStr = String.valueOf(mth); if(mth<10){ curmthStr = "0"+curmthStr; } return curmthStr; } /** * 计算预存金额和返还本息收益 * @param period * @param rate * @param fee * @return * @author: jiangwmf * @date 2015-4-23 下午4:37:58 */ private Map<String,Object> calOffsetFee(BigDecimal period,BigDecimal rate,BigDecimal fee){ // 客户理财年化收益率3%=0.03 // 合和年理财年化收益率10%=0.1 Map<String,Object> map = new HashMap<String,Object>(); double preDepositAmount = PreciseCompute.div(PreciseCompute.mul(fee.doubleValue(), period.doubleValue()), PreciseCompute.sub(0.1, rate.doubleValue()), 2); int amount = (new BigDecimal(preDepositAmount/1000).setScale(0, BigDecimal.ROUND_HALF_UP).intValue()+1)*1000; System.out.println("预存本金:"+preDepositAmount +",产品价格:"+amount); //预存本金=(200*12)/(10%-3%)=34285.71 //产品价格=35000.00 double obtainAllAmount = new BigDecimal(PreciseCompute.mul(amount, 1.03)).setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue(); map.put("preDepositAmount", amount); map.put("obtainAllAmount", obtainAllAmount); return map; } public static void main(String[] args) { System.out.println(System.currentTimeMillis() + "" + RandomStringUtils.randomNumeric(2)); } }