/**
  * 根据周期生成收款单
  *
  * @param client 客户数据
  */
 public void costsFactory(Client client) {
   Date startDate;
   try {
     startDate = sdf.parse(client.getHlcRegStartDate());
     Date validate = startDate;
     Date endDate = sdf.parse(client.getHlcRegEndDate());
     Calendar calendar = Calendar.getInstance();
     calendar.setTime(startDate);
     int cycle = getCycle(client);
     // 判断是否是一次性收款
     if (cycle == ONEOFF) {
       calendar.setTime(startDate);
       paybleFactory(client, validate, calendar, cycle);
     } else {
       while (startDate.before(endDate) || startDate.equals(endDate)) {
         paybleFactory(client, validate, calendar, cycle);
         calendar.add(Calendar.MONTH, cycle);
         startDate = calendar.getTime();
       }
     }
   } catch (ParseException e) {
     // TODO Auto-generated catch block
     e.printStackTrace();
   }
 }
  /**
   * 计算一次性付款的月差
   *
   * @param client
   * @return 总月数
   * @throws ParseException
   */
  public int mothCalculate(Client client) throws ParseException {
    String startDate = client.getHlcRegStartDate();
    String endDate = client.getHlcRegEndDate();
    Date startTime = sdf.parse(startDate);
    Date endTime = sdf.parse(endDate);
    int countMonth = 0;

    Calendar calendar = Calendar.getInstance();
    calendar.setTime(startTime);
    while (startTime.before(endTime)) {
      calendar.add(Calendar.MONTH, 1);
      countMonth++;
      startTime = calendar.getTime();
    }
    return countMonth;
  }
  /**
   * 生成收款单
   *
   * @param client 客户数据
   * @param validate 初始校验日期
   * @param calendar 当前时间
   * @param cycle
   */
  private void paybleFactory(Client client, Date validate, Calendar calendar, int cycle) {
    int maxDate = calendar.getActualMaximum(Calendar.DAY_OF_MONTH);
    int month = calendar.get(Calendar.MONTH) + 1;
    String monthStr = addZero(month);
    PhfeeInfo phfeeInfo = new PhfeeInfo();

    phfeeInfo.setClientCode(client.getClientCode());
    phfeeInfo.setCheckFlag("SJZT_00");
    phfeeInfo.setRemark(client.getPropertyHealthRemark());
    phfeeInfo.setOrgSysCode(client.getOrgSysCode());
    // 当每月最大日期小于收款日期,则按该月最大日期为收款日期
    if (maxDate < validate.getDate()) {
      phfeeInfo.setReceiveDate(
          calendar.get(Calendar.YEAR) + "-" + monthStr + "-" + addZero(maxDate));
    } else {
      calendar.set(Calendar.DATE, validate.getDate());
      phfeeInfo.setReceiveDate(
          calendar.get(Calendar.YEAR)
              + "-"
              + monthStr
              + "-"
              + addZero(calendar.get(Calendar.DATE)));
    }
    // 一次性付款
    if (cycle == 0) {
      int mothCalculate;
      try {
        mothCalculate = mothCalculate(client);
        phfeeInfo.setReceiveRent(client.getMonthlyPayableFee() * mothCalculate);
        phfeeInfo.setHalthFee(client.getMonthlyHalthFee() * mothCalculate);
        phfeeInfo.setOtherFee(client.getMonthlyOtherFee() * mothCalculate);
      } catch (ParseException e) {
        e.printStackTrace();
      }
    } else {
      phfeeInfo.setReceiveRent(client.getMonthlyPayableFee() * cycle);
      phfeeInfo.setHalthFee(client.getMonthlyHalthFee() * cycle);
      phfeeInfo.setOtherFee(client.getMonthlyOtherFee() * cycle);
    }

    phfeeInfoDAO.save(phfeeInfo);
  }
 // 根据周期参数,返回相应的整形周期
 private Integer getCycle(Client client) {
   String paymentcycle = client.getPaymentcycle();
   if ("PayCyc_001".equals(paymentcycle)) {
     return MONTH;
   } else if ("PayCyc_002".equals(paymentcycle)) {
     return QUARTER;
   } else if ("PayCyc_003".equals(paymentcycle)) {
     return HALFAYEAR;
   } else if ("PayCyc_004".equals(paymentcycle)) {
     return YEAR;
   } else if ("PayCyc_005".equals(paymentcycle)) {
     return ONEOFF;
   } else {
     return null;
   }
 }