前の営業日のカスタム関数の計算


アルゴリズムの説明
1.日付パラメータを取得し、自己減算
2.週末かどうかを判断し、実行しない場合4
3.当日仕事に調整するかどうかを判断し、そうでなければ1を実行する
4.現在の日付が祝日かどうかを判断し、もしそうであれば1を実行する
5.土日祝日ではないと判断
6.現在の日付を返し、終了します.
プロファイル:
パラメータには、次の2つのケースがあります.
参照
1.入力が空で、現在の日付の前の営業日を返します.
2.日付パラメータとして入力、フォーマット:2008年5月3日
プロファイルの読み込みproperties
#work=日付1、説明;日付2、説明;....
work=20080404、メーデー;2008,0501,こどもの日
#swap=日付1、調整タイプ、説明;日付2、調整タイプ、説明;...
#調整タイプは0,1に分けられ、そのうち0は当日勤務、1は当日休憩
例えば、メーデーは2日の休みに調整します:2008,0501,0、メーデーは引き続き出勤します;200800502,1,2号休憩
swap=20080501,0、メーデーは引き続き出勤します;200800502,1,2号休憩
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,locale);
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%designerWEB-INFclassesに配置
ディレクトリまたは適用%WEB-INF%classesディレクトリ
2 customFunctionsを修正する.propertiesファイルカスタム関数の追加
getWorkingDays=0,com.runqian.mis.util.GetWorkingDays