报表中计算上一个工作日的自定义函数

一个关于求工作日的自定义函数,如下:
函数名称:getWorkingDays

函数功能:计算上一个工作日期

输入参数:形参分为以下两种情况:
1.输入为空,返回当前日期的上一个工作日
2.输入为日期参数,格式:20080503,代表2008年5月三日
读取配置文件输入 working.properties
#work=日期1,说明;日期2,说明;….
work=20080404,五一劳动节;20080501,六一儿童节
#swap = 日期1,调整类型,说明;日期2,调整类型,说明;…
#调整类型分为0,1,其中0代表当天工作,1代表当天休息
#比如,五一调整到2号休息:20080501,0,五一继续上班;20080502,1,2号休息
swap=20080501,0,五一继续上班;20080502,1,2号休息

返回参数:日期类型

算法描述:

1.获取日期参数,然后自减一
2.判断该日期是否是周末,如果否执行4
3.判断当天是否调整为工作,如果否则执行1
4.判断当前日期是否是节假日,如果是则执行1
5.判断当前日期既不是周末也不是节假日
6.返回当前日期,结束。

代码如下:

GetWorkingDays.java

package com.runqian.mis.util;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import com.runqian.report4.model.expression.Expression;
import com.runqian.report4.model.expression.Function;
import com.runqian.report4.model.expression.Variant2;
import com.runqian.report4.usermodel.Context;

public class GetWorkingDays extends Function {
 // 当前日期
 private Date date;
 @Override
 public Object calculate(Context context, boolean inputValue) {
  // 日期格式化
  SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
  // 读取配置文件
  String work = WorkUtils.getWork();
  String swap = WorkUtils.getSwap();
  // 条件结果定义
  boolean result1 = false;
  boolean result2 = false;
  // 获取参数定义
  if (this.paramList.size() < 1)
   this.date = new Date();
  else {
   Expression exp = (Expression) this.paramList.get(0);
   String dateParam = (String) Variant2.getValue(exp.calculate(
     context, inputValue), false, false);
   try {
    this.date = sdf.parse(dateParam);
   } catch (ParseException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
   }
  }
  System.out.println("当前日期为:" + sdf.format(date));
  // 通过Calendar来进行日期减一运算
  Calendar cd = Calendar.getInstance();
  cd.setTime(date);
  // 做循环直到找到合适的日期
  while (true) {
   cd.add(Calendar.DATE, -1);
   date = cd.getTime();
   System.out.println("日期:" + sdf.format(date) + ";星期"
     + (cd.get(Calendar.DAY_OF_WEEK) - 1) % 7);
   // 判断当天是否是周末
   result1 = this.isWeekEnd(date, swap);
   // 判断当天是否是节假日
   result2 = this.isWorkDays(date, work);
   //即不是节假日也不是周末,那么确定日期
   if (result1 == false && result2 == false)
    break;
  }
  return date;
 }

 /**
  * 判断是否是周末
  *
  * @param date
  * @return
  */
 public boolean isWeekEnd(Date date, String swap) {
  boolean flag = false;
  Calendar c = Calendar.getInstance();
  c.setTime(date);
  // 判断是否是周末
  if (c.get(Calendar.DAY_OF_WEEK) == Calendar.SATURDAY
    || c.get(Calendar.DAY_OF_WEEK) == Calendar.SUNDAY) { // 判断是否存在"调整为上班的周末"的列表
   System.out.println("该天为周末");
   if (!this.isSwap(date, swap))
   {   System.out.println("该周末调整为上班!");
    flag = true;
   }
  }
  return flag;
 }

 /**
  * 判断是否是休假日期
  *
  * @param days
  * @return
  */
 public boolean isWorkDays(Date day, String workdays) {
  boolean flag = false;
  // 获取休假日列表
  String[] temp = workdays.split(";");
  for (int i = 0; i < temp.length; i++) {
   String[] work = temp[i].split(",");
   work = this.caluWork(work);
   try {
    if (this.dateCompareTo(day, work[1], work[2])) {
     flag = true;
     System.out.println("该天是法定节假日!");
     break;
    }
   } catch (ParseException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
   }
  }
  return flag;
 }

 /**
  * 对work参数进行处理
  * @param work
  * @return
  */
 public String[] caluWork(String[] work) {
  String[] temp = new String[3];
  if (work.length <= 2) {
   temp[0] = work[0];
   temp[1] = work[1];
   temp[2] = work[1];
  } else
   temp = work;
  return temp;
 }

 /**
  * 判断当天的调整情况,如果调整为工作,返回true,否则返回false 如果调整列表没有这个日期视为当天工作,返回true
  *
  * @param days
  * @return
  */
 public boolean isSwap(Date day, String swapdays) {
  boolean flag = false;
  // 获取日期调整列表
  String[] temp = swapdays.split(",");
  for (int i = 0; i < temp.length; i++) {
   try {
    if (temp[i].equals(this.parseDate(day))) {
     flag = true;
     break;
    }
   } catch (ParseException e1) {
    // TODO Auto-generated catch block
    e1.printStackTrace();
   }
  }
  return flag;
 }

 /**
  * 日期类型转化为字符串
  *
  * @param temp
  * @return
  * @throws ParseException
  */
 public String parseDate(Date date) throws ParseException {
  SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
  return sdf.format(date);
 }

 /**
  * 日期区间比较
  *
  * @param date
  * @param begin
  * @param after
  * @return
  * @throws ParseException
  */
 public boolean dateCompareTo(Date date, String begin, String end)
   throws ParseException {
  boolean flag = false;
  SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss");
  begin = begin + "000000";
  end = end + "235959";
  Date date1 = sdf.parse(begin);
  Date date2 = sdf.parse(end);
  flag = ((date.after(date1)) && (date.before(date2))
    || date.equals(date1) || date.equals(date2));
  return flag;
 }

}

WorkUtils.java:

package com.runqian.mis.util;
import java.util.*;
public class WorkUtils {
  private static final String OPTION_FILE_NAME="work";
  private static  String working;
  private static  String swap;
  /**
   * 初始化
   */
  static{
   ResourceBundle rb = ResourceBundle.getBundle(OPTION_FILE_NAME);
   working = rb.getString("work").trim();
   swap = rb.getString("swap").trim();
  }
  /**
   * 获取节假日
   * @return
   */
  public static String getWork()
  {
  
   return working;
  }
  /**
   * 获取假期调整
   * @return
   */
  public static String getSwap()
  {
  
   return swap;
  }
}

函数使用:
1,把类和配置文件放到设计器的%reportHome%\designer\WEB-INF\classes
目录或者应用的%WEB-INF%\classes
目录
2,修改customFunctions.properties文件添加自定义函数
getWorkingDays=0,com.runqian.mis.util.GetWorkingDays

posted @ 2012-04-13 15:04  报表技术  阅读(555)  评论(0编辑  收藏  举报