/**
  * Description:保存提现申请<br>
  *
  * @author justin.xu
  * @version 0.1 2014年6月19日
  * @param request
  * @param session
  * @param response
  * @param takeCashMoneyVo
  * @return String
  */
 @RequestMapping(value = "saveTakeCash")
 @RequiresAuthentication
 public @ResponseBody String saveTakeCash(
     HttpServletRequest request,
     HttpSession session,
     HttpServletResponse response,
     TakeCashMoneyVo takeCashMoneyVo) {
   String result = "success";
   try {
     ShiroUser shiroUser = currentUser();
     if (super.judgeBlackByType(BusinessConstants.BLACK_TYPE_CASH)) {
       return "";
     }
     if (shiroUser.getIsFinancialUser() == 0) {
       return "借款用户无法提现!";
     }
     // 查询用户认证信息
     MemberApproVo memberApproVo = memberService.queryMemberApproByUserId(shiroUser.getUserId());
     // 您还没有进行手机认证,请先进行手机认证
     if (null == memberApproVo.getMobilePassed()
         || memberApproVo.getMobilePassed() != Constants.YES) {
       return "请先进行手机认证";
     }
     // 判断是否通过了实名认证
     if (null == memberApproVo.getNamePassed()
         || memberApproVo.getNamePassed() != Constants.REALNAME_APPR_ISPASSED_PASSED) {
       return "请先进行实名认证";
     }
     MemberCnd memberCnd = new MemberCnd();
     memberCnd.setId(shiroUser.getUserId());
     MemberVo memberVo = memberService.queryMemberByCnd(memberCnd);
     // 未设置交易密码
     if (null == memberVo.getPaypassword() || "".equals(memberVo.getPaypassword())) {
       return "请先设置交易密码";
     }
     if (null != takeCashMoneyVo && StringUtils.isNotEmpty(takeCashMoneyVo.getTakeMoney())) {
       if (Double.valueOf(takeCashMoneyVo.getTakeMoney()) < 100) {
         return "提现金额必须大于¥100!";
       }
       if (Double.valueOf(takeCashMoneyVo.getTakeMoney()) > 500000) {
         return "提现金额必须小于¥500000!";
       }
     } else {
       return "提现金额不能为空!";
     }
     result = cashRecordService.saveTakeCash(takeCashMoneyVo, memberVo, request);
     if (!"success".equals(result)) {
       return result;
     }
   } catch (AppException ae) {
     return ae.getMessage();
   } catch (Exception e) {
     logger.error("保持提现出错", e);
     return "网络连接异常,请刷新页面或稍后重试!";
   }
   return result;
 }
 /**
  * Description:进行手机认证<br>
  *
  * @author justin.xu
  * @version 0.1 2014年4月30日
  * @param request
  * @param session
  * @param mobile 手机号
  * @param activeCode 验证码
  * @return String
  */
 @RequestMapping(value = "activeMobile")
 @ResponseBody
 public MessageBox activeMobile(
     HttpServletRequest request, HttpSession session, String mobile, String activeCode) {
   String result = "success";
   try {
     ShiroUser shiroUser = currentUser();
     MobileApproVo mobileApproVo =
         mobileApproService.queryMobileApproByUserId(shiroUser.getUserId());
     // 修改手机号码操作
     if (null != mobileApproVo
         && null != mobileApproVo.getPassed()
         && mobileApproVo.getPassed() == Constants.YES) {
       return new MessageBox("0", "手机号码已认证通过");
     }
     MemberCnd memberCnd = new MemberCnd();
     memberCnd.setId(shiroUser.getUserId());
     MemberVo memberVo = memberService.queryMemberByCnd(memberCnd);
     result =
         mobileApproService.saveMobileAppro(
             memberVo, mobile, activeCode, request, BusinessConstants.MOBILE_APPRO_FUNCTION);
   } catch (AppException ae) {
     result = ae.getMessage();
   } catch (Exception e) {
     result = "网络连接异常,请刷新页面或稍后重试!";
     e.printStackTrace();
   }
   if (BusinessConstants.SUCCESS.equals(result)) {
     return new MessageBox("1", "短信认证成功!");
   }
   return new MessageBox("0", result);
 }
 /**
  * Description:修改绑定手机时,对原来的手机号码认证<br>
  *
  * @author hujianpan
  * @version 0.1 2014年4月30日
  * @param request
  * @param session
  * @param mobile 手机号
  * @param activeCode 验证码
  * @return String
  */
 @RequestMapping(value = "verifyCurrentUserMobile")
 @ResponseBody
 public MessageBox verifyCurrentUserMobile(
     HttpServletRequest request, HttpSession session, String mobile, String activeCode) {
   String result = "success";
   ShiroUser shiroUser = currentUser();
   try {
     MemberCnd memberCnd = new MemberCnd();
     memberCnd.setId(shiroUser.getUserId());
     MemberVo memberVo = memberService.queryMemberByCnd(memberCnd);
     memberVo.setIsModify(true);
     result =
         mobileApproService.saveMobileAppro(
             memberVo,
             mobile,
             activeCode,
             request,
             BusinessConstants.MOBILE_APPRO_RESET_FUNCTION,
             BusinessConstants.SMS_TEMPLATE_TYPE_VERIFYSUCCESS_MOBILE_CODE);
   } catch (AppException ae) {
     result = ae.getMessage();
   } catch (Exception e) {
     result = "网络连接异常,请刷新页面或稍后重试!";
     e.printStackTrace();
   }
   if (BusinessConstants.SUCCESS.equals(result)) {
     // 记录到session中,代表验证原有手机通过
     session.setAttribute(
         BusinessConstants.MOBILE_APPRO_RESET_FUNCTION + shiroUser.getUserId(), "true");
     return new MessageBox("1", "短信认证成功!");
   }
   return new MessageBox("0", result);
 }
 /**
  * Description:安全中心-手机验证码校验通过<br>
  *
  * @author hujianpan
  * @version 0.1 2014年9月4日
  * @param request
  * @param user_id
  * @param uuid
  * @param email
  * @return String
  * @throws Exception
  */
 @RequiresAuthentication
 @RequestMapping(value = "/approMobileSuccess")
 public ModelAndView approMobileSuccess(HttpServletRequest request) throws Exception {
   Member member = currentMember();
   ModelAndView mv = new ModelAndView("account/approve/mobile/approMobileSuccess");
   mv.addObject("mobile", request.getParameter("mobile"));
   MemberApproVo memberApproVo = memberService.queryMemberApproByUserId(member.getId());
   mv.addObject("memberApproVo", memberApproVo);
   return mv;
 }
  /**
   * Description:跳转到提现菜单页面<br>
   *
   * @author justin.xu
   * @version 0.1 2014年5月21日
   * @param request
   * @return ModelAndView
   */
  @RequestMapping(value = "toCashIndex")
  @RequiresAuthentication
  public ModelAndView toTopupMain() throws Exception {
    ModelAndView mv = new ModelAndView("account/cash/cashIndex");
    ShiroUser shiroUser = currentUser();
    if (super.judgeBlackByType(BusinessConstants.BLACK_TYPE_CASH)) {
      mv = new ModelAndView("redirect:/myaccount/toIndex.html");
      return mv;
    }
    MemberCnd memberCnd = new MemberCnd();
    memberCnd.setId(shiroUser.getUserId());
    MemberVo memberVo = memberService.queryMemberByCnd(memberCnd);

    // 查询用户认证信息
    MemberApproVo memberApproVo = memberService.queryMemberApproByUserId(shiroUser.getUserId());
    // 您还没有进行手机认证,请先进行手机认证
    if (null == memberApproVo.getMobilePassed()
        || memberApproVo.getMobilePassed() != Constants.YES) {
      mv.addObject("errorCode", "-3");
      return mv;
    }
    // 判断是否通过了实名认证
    if (null == memberApproVo.getNamePassed()
        || memberApproVo.getNamePassed() != Constants.REALNAME_APPR_ISPASSED_PASSED) {
      mv.addObject("errorCode", "-1");
      return mv;
    }

    // 如果交易密码为空,则跳到交易密码页面
    if (null == memberVo.getPaypassword() || "".equals(memberVo.getPaypassword())) {
      mv.addObject("errorCode", "-4");
      return mv;
    }

    // 设置菜单名
    mv.addObject(BusinessConstants.ACCOUNT_FIRST_MENU, BusinessConstants.LEFT_MENU_ZJ);
    mv.addObject(BusinessConstants.ACCOUNT_SECOND_MENU, BusinessConstants.LEFT_MENU_ZJ_TAKE_CASH);
    return mv;
  }
 /**
  * Description:判断当前登录用户是否设置了交易密码,如果设置了交易密码,则返回:true,如果没有设置,则返回:false<br>
  *
  * @author justin.xu
  * @version 0.1 2014年7月14日
  * @param session
  * @return String
  */
 @RequestMapping(value = "/isPayPasswordExist")
 public @ResponseBody String isPayPasswordExist(HttpSession session) {
   String result = "success";
   ShiroUser shiroUser = currentUser();
   MemberCnd memberCnd = new MemberCnd();
   memberCnd.setId(shiroUser.getUserId());
   MemberVo memberVo = memberService.queryMemberByCnd(memberCnd);
   if (null == memberVo) {
     result = "notlogin";
   } else if (null == memberVo.getPaypassword() || "".equals(memberVo.getPaypassword())) {
     result = "nopaypassword";
   }
   return result;
 }
  /**
   * Description:进入注册页面<br>
   *
   * @author justin.xu
   * @version 0.1 2014年4月21日
   * @param request
   * @return ModelAndView
   */
  @RequestMapping(value = "/toRegister")
  public ModelAndView toRegister(HttpServletRequest request, HttpServletResponse response) {
    /** *** 微信站点首页域名 **** */
    final String WX_MAIN_URL = new String("http://m.gcjr.com/regist");
    // 判断是否需要重定向和跳转
    String ua = currentRequest().getHeader("User-Agent");
    String inviterName = null;
    String realName = null; // 显示真实姓名
    ModelAndView mv = new ModelAndView("member/userRegiste");
    String userIdMD5 = request.getParameter("code");
    String redId = request.getParameter("redId");
    // 如果来自内部推广,则判断该链接的有效性,即邀请人是否存在
    if (userIdMD5 != null && !StringUtils.isEmpty(userIdMD5)) {
      MemberCnd memberCnd = new MemberCnd();
      memberCnd.setUserIdMD5(userIdMD5);
      MemberVo memberVo = memberService.queryMemberByCnd(memberCnd);
      RealNameApproVo vo = realNameApproMapper.getByUserId(memberVo.getId());
      if (vo != null && !StringUtils.isEmpty(vo.getSecuritRealName())) {
        realName = vo.getSecuritRealName();
      }
      if (null != memberVo && !StringUtils.isEmpty(memberVo.getUsername())) {
        inviterName = memberVo.getUsername();
      }
    }

    if (isMobileTerminal(ua)) {
      return redirect(WX_MAIN_URL)
          .addObject("inviterName", CharacterEncoder.encodeURL(inviterName, "UTF-8"))
          .addObject("realName", CharacterEncoder.encodeURL(realName, "UTF-8"))
          .addObject("redId", CharacterEncoder.encodeURL(redId, "UTF-8"));
    }
    CookieGenerator cookieGenerator = new CookieGenerator();
    cookieGenerator.setCookieMaxAge(30 * 24 * 60 * 60);
    String tid = request.getParameter("tid"); // 如果来源于易瑞特,则为必有参数
    if (null != tid) {
      cookieGenerator.setCookieName("tid");
      cookieGenerator.addCookie(response, tid);
      request.getSession().setAttribute("tid", tid);
    }

    String extendLinkSourceName = request.getParameter("source"); // 链接来源
    if (!StringUtils.isEmpty(extendLinkSourceName)) {
      String linkSourceValue = Dictionary.getValue(1100, extendLinkSourceName.trim());
      request.getSession().setAttribute("linkSourceValue", linkSourceValue);
    }
    return mv.addObject("inviterName", inviterName)
        .addObject("realName", realName)
        .addObject("redId", CharacterEncoder.encodeURL(redId, "UTF-8"));
  }
  /**
   * Description:手机认证成功<br>
   *
   * @author hujianpan
   * @version 0.1 2014年9月01日
   * @param request
   * @throws Exception
   */
  @RequiresAuthentication
  @RequestMapping(value = "/mobailCheckSuccess")
  public ModelAndView mobailCheckSuccess(HttpServletRequest request) throws Exception {
    ModelAndView mv = new ModelAndView("member/registerSucess");
    Member member = currentMember();
    String userName = null;
    if (member == null || "".equals(member.getUsername().trim())) {
      forword(BusinessConstants.NO_PAGE_FOUND_404);
    } else {
      userName = member.getUsername();
    }
    MemberApproVo memberApproVo = memberService.queryMemberApproByUserId(member.getId());
    mv.addObject("memberApproVo", memberApproVo);
    mv.addObject("userName", null == userName ? "手机认证出现问题" : userName + "  您好,恭喜您注册并激活成功!");

    return mv;
  }
 /**
  * Description:跳转到会员手机认证界面<br>
  *
  * @author hujianpan
  * @version 0.1 2014年8月30日
  * @return String
  */
 @RequiresAuthentication
 @RequestMapping(value = "/toMobailCheckMemberInfo")
 public ModelAndView checkMemberInfo(HttpServletRequest request) {
   Member member = currentMember();
   if (null == member || StringUtils.isEmpty(member.getUsername())) {
     return forword(BusinessConstants.TOP_HOME_ADDRESS);
   }
   // 通过用户名查询上一步的信息
   MemberCnd memberCnd = new MemberCnd();
   memberCnd.setUsername(member.getUsername());
   MemberVo memberVo = memberService.queryMemberByCnd(memberCnd);
   // 0:正式身份 -1:游客身份
   if (null != memberVo && BusinessConstants.VISITOR_OFFICIAL == memberVo.getType()) {
     return forword(BusinessConstants.TOP_HOME_ADDRESS);
   }
   return forword("/member/register_CheckMemberByMobail");
 }
  /**
   * Description:进入提现页面<br>
   *
   * @author justin.xu
   * @version 0.1 2014年6月18日
   * @param request
   * @param session
   * @return
   * @throws Exception String
   */
  @RequestMapping(value = "toGetcash")
  @RequiresAuthentication
  public ModelAndView getcash(HttpServletRequest request, HttpSession session) throws Exception {
    ModelAndView mav = new ModelAndView("account/cash/getcash");
    ShiroUser shiroUser = currentUser();
    if (super.judgeBlackByType(BusinessConstants.BLACK_TYPE_CASH)) {
      mav = new ModelAndView("redirect:/myaccount/toIndex.html");
      return mav;
    }
    // 当前帐号信息
    AccountVo accountVo = accountService.queryAccountByUserId(shiroUser.getUserId());
    mav.addObject("accountVo", accountVo);

    BigDecimal maxDrawMoney = cashRecordService.getMaxDrawMoney(shiroUser.getUserId());

    // 当前用户银行卡信息
    BankInfoVo currentBankCardVo = bankInfoService.getUserCurrentCard(shiroUser.getUserId());

    // 查询银行卡数量;
    int cardNum = bankInfoService.querytBankCardNum(shiroUser.getUserId());
    mav.addObject("cardNum", cardNum);

    // 查询银行卡操作日志中的锁定记录(type=0的记录)
    int cardLock = bankInfoService.querytBankCardLock(shiroUser.getUserId());
    mav.addObject("cardLock", cardLock);

    // 查询用户信息
    MemberCnd memberCnd = new MemberCnd();
    memberCnd.setId(shiroUser.getUserId());
    MemberVo memberVo = memberService.queryMemberByCnd(memberCnd);
    // 未设置交易密码
    if (null == memberVo.getPaypassword() || "".equals(memberVo.getPaypassword())) {
      mav.addObject("nosetPaypassword", true);
    }
    if (vipLevelService.getIsSvipByUserId(shiroUser.getUserId())) {
      mav.addObject("isSvip", "yes");
    } else {
      mav.addObject("isSvip", "no");
    }
    mav.addObject("currentBankCardVo", currentBankCardVo);
    mav.addObject("maxDrawMoney", maxDrawMoney);
    Integer getCashedCount = cashRecordService.getCashedCount(shiroUser.getUserId(), new Date());
    mav.addObject("getCashedCount", getCashedCount);
    return mav;
  }
 /**
  * Description:跳转到会员邮箱和手机认证界面<br>
  *
  * @author hujianpan
  * @version 0.1 2014年8月30日
  * @param memberRegisterCnd
  * @return String
  */
 @RequestMapping(value = "/toCheckMemberInfo")
 public ModelAndView checkMemberInfo(HttpServletRequest request) {
   Member member = new Member();
   ShiroUser shiroUser = currentUser();
   member.setId(shiroUser.getUserId());
   member.setUsername(shiroUser.getUserName());
   if (null == member || StringUtils.isEmpty(member.getUsername())) {
     return redirect("/" + BusinessConstants.TOP_HOME_ADDRESS);
   }
   // 通过用户名查询上一步的信息
   MemberCnd memberCnd = new MemberCnd();
   memberCnd.setUsername(member.getUsername());
   MemberVo memberVo = memberService.queryMemberByCnd(memberCnd);
   // 0:正式身份 -1:游客身份
   if (null != memberVo && BusinessConstants.VISITOR_OFFICIAL == memberVo.getType()) {
     logger.info("当前用户已经认证通过");
     return redirect("/" + BusinessConstants.TOP_HOME_ADDRESS);
   }
   return forword("/member/register_CheckMember")
       .addObject("currentEmail", memberVo.getEmail() == null ? "" : memberVo.getEmail());
 }
  /**
   * Description:登录方法<br>
   *
   * @author justin.xu
   * @version 0.1 2014年5月7日
   * @param request
   * @param session
   * @param response
   * @param memberLoginCnd
   * @return String
   */
  @RequestMapping(value = "/login")
  @ValidateToken
  @ResponseBody
  public MessageBox login(
      HttpSession session, HttpServletResponse response, MemberLoginCnd memberLoginCnd)
      throws AuthenticationException {
    try {
      Object object = session.getAttribute(CSRFTokenManager.CSRF_PARAM_COUNTER);
      if (object != null && ((Integer) (object)).intValue() > 2) {
        if (memberLoginCnd.getCheckCode() == null || "".equals(memberLoginCnd.getCheckCode())) {
          return MessageBox.build("0", "请你输入验证码");
        }
        String randomCode = (String) currentSession().getAttribute("randomCode");
        if (!memberLoginCnd.getCheckCode().equals(randomCode)) {
          return MessageBox.build("0", "验证码不正确");
        }
      }

      long t1 = System.currentTimeMillis();
      logger.info(memberLoginCnd.getUsername() + " ----- login ----- begin time : " + t1);

      // shiro登录
      UsernamePasswordToken token =
          new UsernamePasswordToken(
              memberLoginCnd.getUsername(),
              MD5.toMD5(memberLoginCnd.getPasswd()),
              BusinessConstants.MEMBER_OPERATE_ON_PORTAL);
      Subject subject = SecurityUtils.getSubject();
      subject.login(token);

      long t2 = System.currentTimeMillis();
      logger.info(
          memberLoginCnd.getUsername() + " ----- login ----- shiro login cost : " + (t2 - t1));

      LoginCnd loginCnd = new LoginCnd();
      loginCnd.setUserId(currentUser().getUserId());
      loginCnd.setUserName(currentUser().getUserName());
      loginCnd.setIp(HttpTookit.getRealIpAddr(currentRequest()));
      loginCnd.setSessionId(session.getId());
      loginCnd.setPlatform(currentUser().getPlatform());
      // 调用登录逻辑
      String msg = memberService.saveLogin(loginCnd);

      long t3 = System.currentTimeMillis();
      logger.info(
          memberLoginCnd.getUsername() + " ----- login ----- save login cost : " + (t3 - t2));

      // 用于sso
      cookieRetrievingCookieGenerator.addCookie(
          currentRequest(), response, TicketCryptor.encrypt(currentUser().getSsoTicket()));

      long t4 = System.currentTimeMillis();
      logger.error(
          memberLoginCnd.getUsername() + " ----- login ----- add sso cookie cost : " + (t4 - t3));
      System.out.println(memberLoginCnd.getSaveid() + "hhe");
      // 保存cookie
      if ("1".equals(memberLoginCnd.getSaveid())) {
        CookieGenerator cookieGenerator = new CookieGenerator();
        cookieGenerator.setCookieMaxAge(2147483647);
        cookieGenerator.setCookieName(COOKIE_LOGIN_USERID);
        cookieGenerator.addCookie(response, memberLoginCnd.getCookieusername());
      } else {
        CookieGenerator cookieGenerator = new CookieGenerator();
        cookieGenerator.setCookieMaxAge(0);
        cookieGenerator.setCookieName(COOKIE_LOGIN_USERID);
        cookieGenerator.addCookie(response, memberLoginCnd.getCookieusername());
      }

      long t5 = System.currentTimeMillis();
      logger.error(
          memberLoginCnd.getUsername()
              + " ----- login ----- add username cookie cost : "
              + (t5 - t4));

      // 小红点提示状态
      RedAccount redAccount = redAccountService.queryRedDotState(currentUser().getUserId());
      if (redAccount != null) {
        currentSession().setAttribute("redDot", redAccount);
      }
      // 抽奖机会提醒
      int lotteryChanceCount =
          lotteryChanceInfoService.queryLotteryNumTotal("11", currentUser().getUserId());
      if (lotteryChanceCount > 0) {
        currentSession().setAttribute("lotteryChanceCount", lotteryChanceCount);
      }
      if (BusinessConstants.VISITOR_UNAUTHERIZED.equals(msg)) {
        return MessageBox.build("2", "请先前往认证");
      }

      if (object != null) {
        currentSession().removeAttribute(CSRFTokenManager.CSRF_PARAM_COUNTER);
      }
    } catch (UnknownAccountException e) {
      return MessageBox.build("0", "账户名不存在");
    } catch (IncorrectCredentialsException ice) {
      return MessageBox.build("0", "账户名与密码不匹配");
    } catch (LockedAccountException lae) {
      return MessageBox.build("0", "账户已经锁定");
    } catch (Exception e) {
      if (isLogin()) {
        SecurityUtils.getSubject().logout();
      }
      logger.error("登录失败", e);
      return MessageBox.buildForCounter("3", "账号与密码不匹配");
    }

    String backUrl = memberLoginCnd.getBackUrl();
    if (backUrl != null && !backUrl.trim().equals("")) {
      logger.info("******自动跳转登陆前页面=" + backUrl + "******");
      return MessageBox.build("8", backUrl);
    }

    return MessageBox.build("1", "success");
  }