自定义函数解决工作日问题

第28章 自定义函数解决工作日问题

1. 问题概述
报表参数模板在第一次加载进来,查询日期需要有默认值,由于公司正常情况下周六周日是不上班的,需要默认值显示的上一个工作日,如:今天是2011-05-09(星期一),默认值显示为2011-05-06(上周五)

如:今天是2011-05-10(星期二),默认值显示为2011-05-09,

2. 算法及调用规则

A.算法:
1.根据当前日期now()找到昨天lastday()
2.根据昨天,利用自定义函数判断当前是不是工作日, 如果不是工作日就递归查找之前最近的工作日
B:报表参数模板上的用法:


自定义函数的登记:


3. 程序说明

调用格式:workDay();例:workDay(lastday(now()))

package expression;

import java.util.Date;

import java.text.*;

import com.runqian.base4.util.ReportError;

import com.runqian.report4.model.expression.*;

import com.runqian.report4.usermodel.*;

import java.util.Calendar;

public class workDay extends Function {

public Object calculate(Context ctx, boolean inputValue) {

if (this.paramList.size() == 0)

throw new ReportError(该函数需要一个参数!);

// 取得计算表达式

Expression exp = (Expression) this.paramList.get(0);

if (exp == null)

throw new ReportError(包含有无效参数!);

Object obj = Variant2.getValue(exp.calculate(ctx, inputValue), false,false);

Date date = (Date) obj;

return judgeresult(date);

}

private static String judgeresult(Date date) {

SimpleDateFormat df = new SimpleDateFormat(“yyyy-MM-dd”);

String datestr = df.format(date);

System.out.println(“[昨天:]“+datestr);

Calendar cal = Calendar.getInstance();

cal.setTime(date);

int week = cal.get(Calendar.DAY_OF_WEEK);

System.out.println(“[]“ + week + “[工作日]“);

// 先判断当天是不是工作日

if (isWorkDay(week)) {

return datestr;

}

// 如果不是工作日就递归查找之前最近的工作日

else {

do {

cal.add(Calendar.DATE, -1);

week = cal.get(Calendar.DAY_OF_WEEK);

} while (!isWorkDay(week));

datestr = df.format(cal.getTime());

return datestr;

}

}

private static boolean isWorkDay(int week) {

if (week == 7 || week == 1) {// 周六日的判断

return false;

} else {

return true;

}

}

}