/** 更新 */
  @RequestMapping(value = "/update", method = RequestMethod.POST)
  public String update(
      Member member,
      Long memberRankId,
      Integer modifyPoint,
      BigDecimal modifyBalance,
      String depositMemo,
      HttpServletRequest request,
      RedirectAttributes redirectAttributes) {
    member.setMemberRank(memberRankService.find(memberRankId));
    if (!isValid(member)) {
      return ERROR_VIEW;
    }
    Setting setting = SettingUtils.get();
    if (member.getPassword() != null
        && (member.getPassword().length() < setting.getPasswordMinLength()
            || member.getPassword().length() > setting.getPasswordMaxLength())) {
      return ERROR_VIEW;
    }
    Member pMember = memberService.find(member.getId());
    if (pMember == null) {
      return ERROR_VIEW;
    }
    if (!setting.getIsDuplicateEmail()
        && !memberService.emailUnique(pMember.getEmail(), member.getEmail())) {
      return ERROR_VIEW;
    }
    member.removeAttributeValue();
    for (MemberAttribute memberAttribute : memberAttributeService.findList()) {
      String parameter = request.getParameter("memberAttribute_" + memberAttribute.getId());
      if (memberAttribute.getType() == MemberAttribute.Type.name
          || memberAttribute.getType() == MemberAttribute.Type.address
          || memberAttribute.getType() == MemberAttribute.Type.zipCode
          || memberAttribute.getType() == MemberAttribute.Type.phone
          || memberAttribute.getType() == MemberAttribute.Type.mobile
          || memberAttribute.getType() == MemberAttribute.Type.text
          || memberAttribute.getType() == MemberAttribute.Type.select) {
        if (memberAttribute.getIsRequired() && StringUtils.isEmpty(parameter)) {
          return ERROR_VIEW;
        }
        member.setAttributeValue(memberAttribute, parameter);
      } else if (memberAttribute.getType() == MemberAttribute.Type.gender) {
        Gender gender = StringUtils.isNotEmpty(parameter) ? Gender.valueOf(parameter) : null;
        if (memberAttribute.getIsRequired() && gender == null) {
          return ERROR_VIEW;
        }
        member.setGender(gender);
      } else if (memberAttribute.getType() == MemberAttribute.Type.birth) {
        try {
          Date birth =
              StringUtils.isNotEmpty(parameter)
                  ? DateUtils.parseDate(parameter, CommonAttributes.DATE_PATTERNS)
                  : null;
          if (memberAttribute.getIsRequired() && birth == null) {
            return ERROR_VIEW;
          }
          member.setBirth(birth);
        } catch (ParseException e) {
          return ERROR_VIEW;
        }
      } else if (memberAttribute.getType() == MemberAttribute.Type.area) {
        Area area =
            StringUtils.isNotEmpty(parameter) ? areaService.find(Long.valueOf(parameter)) : null;
        if (area != null) {
          member.setArea(area);
        } else if (memberAttribute.getIsRequired()) {
          return ERROR_VIEW;
        }
      } else if (memberAttribute.getType() == MemberAttribute.Type.checkbox) {
        String[] parameterValues =
            request.getParameterValues("memberAttribute_" + memberAttribute.getId());
        List<String> options = parameterValues != null ? Arrays.asList(parameterValues) : null;
        if (memberAttribute.getIsRequired() && (options == null || options.isEmpty())) {
          return ERROR_VIEW;
        }
        member.setAttributeValue(memberAttribute, options);
      }
    }
    if (StringUtils.isEmpty(member.getPassword())) {
      member.setPassword(pMember.getPassword());
    } else {
      member.setPassword(DigestUtils.md5Hex(member.getPassword()));
    }
    if (pMember.getIsLocked() && !member.getIsLocked()) {
      member.setLoginFailureCount(0);
      member.setLockedDate(null);
    } else {
      member.setIsLocked(pMember.getIsLocked());
      member.setLoginFailureCount(pMember.getLoginFailureCount());
      member.setLockedDate(pMember.getLockedDate());
    }

    BeanUtils.copyProperties(
        member,
        pMember,
        new String[] {
          "username",
          "point",
          "amount",
          "balance",
          "registerIp",
          "loginIp",
          "loginDate",
          "safeKey",
          "cart",
          "orders",
          "deposits",
          "payments",
          "couponCodes",
          "receivers",
          "reviews",
          "consultations",
          "favoriteProducts",
          "productNotifies",
          "inMessages",
          "outMessages"
        });
    memberService.update(
        pMember, modifyPoint, modifyBalance, depositMemo, adminService.getCurrent());
    addFlashMessage(redirectAttributes, SUCCESS_MESSAGE);
    return "redirect:list.jhtml";
  }
 /** 保存 */
 @RequestMapping(value = "/save", method = RequestMethod.POST)
 public String save(
     Member member,
     Long memberRankId,
     HttpServletRequest request,
     RedirectAttributes redirectAttributes) {
   member.setMemberRank(memberRankService.find(memberRankId));
   if (!isValid(member, Save.class)) {
     return ERROR_VIEW;
   }
   Setting setting = SettingUtils.get();
   if (member.getUsername().length() < setting.getUsernameMinLength()
       || member.getUsername().length() > setting.getUsernameMaxLength()) {
     return ERROR_VIEW;
   }
   if (member.getPassword().length() < setting.getPasswordMinLength()
       || member.getPassword().length() > setting.getPasswordMaxLength()) {
     return ERROR_VIEW;
   }
   if (memberService.usernameDisabled(member.getUsername())
       || memberService.usernameExists(member.getUsername())) {
     return ERROR_VIEW;
   }
   if (!setting.getIsDuplicateEmail() && memberService.emailExists(member.getEmail())) {
     return ERROR_VIEW;
   }
   member.removeAttributeValue();
   for (MemberAttribute memberAttribute : memberAttributeService.findList()) {
     String parameter = request.getParameter("memberAttribute_" + memberAttribute.getId());
     if (memberAttribute.getType() == MemberAttribute.Type.name
         || memberAttribute.getType() == MemberAttribute.Type.address
         || memberAttribute.getType() == MemberAttribute.Type.zipCode
         || memberAttribute.getType() == MemberAttribute.Type.phone
         || memberAttribute.getType() == MemberAttribute.Type.mobile
         || memberAttribute.getType() == MemberAttribute.Type.text
         || memberAttribute.getType() == MemberAttribute.Type.select) {
       if (memberAttribute.getIsRequired() && StringUtils.isEmpty(parameter)) {
         return ERROR_VIEW;
       }
       member.setAttributeValue(memberAttribute, parameter);
     } else if (memberAttribute.getType() == MemberAttribute.Type.gender) {
       Gender gender = StringUtils.isNotEmpty(parameter) ? Gender.valueOf(parameter) : null;
       if (memberAttribute.getIsRequired() && gender == null) {
         return ERROR_VIEW;
       }
       member.setGender(gender);
     } else if (memberAttribute.getType() == MemberAttribute.Type.birth) {
       try {
         Date birth =
             StringUtils.isNotEmpty(parameter)
                 ? DateUtils.parseDate(parameter, CommonAttributes.DATE_PATTERNS)
                 : null;
         if (memberAttribute.getIsRequired() && birth == null) {
           return ERROR_VIEW;
         }
         member.setBirth(birth);
       } catch (ParseException e) {
         return ERROR_VIEW;
       }
     } else if (memberAttribute.getType() == MemberAttribute.Type.area) {
       Area area =
           StringUtils.isNotEmpty(parameter) ? areaService.find(Long.valueOf(parameter)) : null;
       if (area != null) {
         member.setArea(area);
       } else if (memberAttribute.getIsRequired()) {
         return ERROR_VIEW;
       }
     } else if (memberAttribute.getType() == MemberAttribute.Type.checkbox) {
       String[] parameterValues =
           request.getParameterValues("memberAttribute_" + memberAttribute.getId());
       List<String> options = parameterValues != null ? Arrays.asList(parameterValues) : null;
       if (memberAttribute.getIsRequired() && (options == null || options.isEmpty())) {
         return ERROR_VIEW;
       }
       member.setAttributeValue(memberAttribute, options);
     }
   }
   member.setUsername(member.getUsername().toLowerCase());
   member.setPassword(DigestUtils.md5Hex(member.getPassword()));
   member.setAmount(new BigDecimal(0));
   member.setIsLocked(false);
   member.setLoginFailureCount(0);
   member.setLockedDate(null);
   member.setRegisterIp(request.getRemoteAddr());
   member.setLoginIp(null);
   member.setLoginDate(null);
   member.setSafeKey(null);
   member.setCart(null);
   member.setOrders(null);
   member.setDeposits(null);
   member.setPayments(null);
   member.setCouponCodes(null);
   member.setReceivers(null);
   member.setReviews(null);
   member.setConsultations(null);
   member.setFavoriteProducts(null);
   member.setProductNotifies(null);
   member.setInMessages(null);
   member.setOutMessages(null);
   memberService.save(member, adminService.getCurrent());
   addFlashMessage(redirectAttributes, SUCCESS_MESSAGE);
   return "redirect:list.jhtml";
 }