Browse Source
Merge in PG/plugin-report-doc-demo from release/10.0 to persist/10.0 * commit 'fdab8450935fd1e87409a982fc9f5052ca94fbf0': 无JIRA任务 修复一些demo编译问题,已经程序数据集逻辑不严谨问题(getColumnName可能报错NPE) 程序网络报表-https://help.fanruan.com/finereport/doc-view-685.html 决策报表示例代码修改 程序网络报表-https://help.fanruan.com/finereport/doc-view-685.html 帮助文档中二次开发模块,程序网络报表文档中决策报表的示例代码 删除非产品内置的自定义函数 java文件 已经和manto沟通 删除内容:CellSum.java、DateDiff.java、FlagHtmlColor.java、gauthority.java、IRR.java、ReportCheck.java、StringCat.java、StringImage.java、SubSection.java、Ubm.java、Widget2Image.javapersist/10.0
Okcean
4 years ago
15 changed files with 45 additions and 776 deletions
@ -0,0 +1,34 @@ |
|||||||
|
package com.fr.demo; |
||||||
|
|
||||||
|
import java.util.Map; |
||||||
|
import javax.servlet.http.HttpServletRequest; |
||||||
|
|
||||||
|
import com.fr.form.main.Form; |
||||||
|
import com.fr.form.main.FormIO; |
||||||
|
import com.fr.log.FineLoggerFactory; |
||||||
|
import com.fr.web.weblet.Formlet; |
||||||
|
|
||||||
|
|
||||||
|
public class SimpleReportletDemoFrm extends Formlet { |
||||||
|
|
||||||
|
@Override |
||||||
|
public void setParameterMap(Map arg0) { |
||||||
|
// TODO Auto-generated method stub
|
||||||
|
|
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
protected Form createForm(HttpServletRequest request) throws Exception { |
||||||
|
Form form = null; |
||||||
|
//模板的相对路径
|
||||||
|
String tplPath = "//doc//frm//决策报表入门.frm"; |
||||||
|
this.setTplPath(tplPath); |
||||||
|
try { |
||||||
|
form = FormIO.readForm(tplPath); |
||||||
|
} catch (Exception e) { |
||||||
|
FineLoggerFactory.getLogger().error(e.getMessage(), e); |
||||||
|
} |
||||||
|
return form; |
||||||
|
} |
||||||
|
|
||||||
|
} |
@ -1,14 +0,0 @@ |
|||||||
package com.fr.function; |
|
||||||
|
|
||||||
import com.fr.base.Utils; |
|
||||||
import com.fr.script.AbstractFunction; |
|
||||||
|
|
||||||
public class CellSum extends AbstractFunction { |
|
||||||
public Object run(Object[] args) { |
|
||||||
String sum = Utils.objectToNumber(new SUM().run(args), false) |
|
||||||
.toString(); // 直接调用FR内部的SUM方法
|
|
||||||
String result = "所在单元格为:" + this.getCalculator().getCurrentColumnRow() |
|
||||||
+ ";总和为:" + sum; // 获取当前单元格拼出最终结果
|
|
||||||
return result; |
|
||||||
} |
|
||||||
} |
|
@ -1,67 +0,0 @@ |
|||||||
package com.fr.function; |
|
||||||
|
|
||||||
import com.fr.script.AbstractFunction; |
|
||||||
import com.fr.stable.Primitive; |
|
||||||
import java.util.Date; |
|
||||||
import java.util.regex.Matcher; |
|
||||||
import java.util.regex.Pattern; |
|
||||||
|
|
||||||
public class DateDiff extends AbstractFunction |
|
||||||
{ |
|
||||||
private static final long serialVersionUID = -2863679010825725885L; |
|
||||||
public String format = null; |
|
||||||
private Long dif = Long.valueOf(0L); |
|
||||||
|
|
||||||
public Object run(Object[] paramArrayOfObject) |
|
||||||
{ |
|
||||||
try |
|
||||||
{ |
|
||||||
Long localLong1 = Long.valueOf(((Date)paramArrayOfObject[0]).getTime()); |
|
||||||
Long localLong2 = Long.valueOf(((Date)paramArrayOfObject[1]).getTime()); |
|
||||||
this.dif = Long.valueOf(localLong2.longValue() - localLong1.longValue()); |
|
||||||
this.format = ((String)paramArrayOfObject[2]); |
|
||||||
replace("((?i)y)", Long.valueOf(31536000000L)); |
|
||||||
replace("((?i)q)", Long.valueOf(7776000000L)); |
|
||||||
replace("M", Long.valueOf(2592000000L)); |
|
||||||
replace("((?i)w)", Long.valueOf(604800000L)); |
|
||||||
replace("((?i)d)", Long.valueOf(86400000L)); |
|
||||||
replace("((?i)h)", Long.valueOf(3600000L)); |
|
||||||
replace("m", Long.valueOf(60000L)); |
|
||||||
replace("((?i)s)", Long.valueOf(1000L)); |
|
||||||
try |
|
||||||
{ |
|
||||||
return Long.valueOf(Long.parseLong(this.format)); |
|
||||||
} |
|
||||||
catch (Exception localException2) |
|
||||||
{ |
|
||||||
return this.format; |
|
||||||
} |
|
||||||
} |
|
||||||
catch (Exception localException1) |
|
||||||
{ |
|
||||||
} |
|
||||||
return Primitive.ERROR_VALUE; |
|
||||||
} |
|
||||||
|
|
||||||
public void replace(String paramString, Long paramLong) |
|
||||||
{ |
|
||||||
Pattern localPattern = Pattern.compile(paramString + "\\{\\d*?\\}"); |
|
||||||
Matcher localMatcher = localPattern.matcher(this.format); |
|
||||||
int i = (int)(this.dif.longValue() / paramLong.longValue()); |
|
||||||
int j = 1; |
|
||||||
while (localMatcher.find()) |
|
||||||
{ |
|
||||||
String str1 = localMatcher.group(); |
|
||||||
str1 = str1.replaceAll(paramString + "\\{", ""); |
|
||||||
str1 = str1.replaceAll("\\}", ""); |
|
||||||
int k = Integer.parseInt(str1); |
|
||||||
String str2 = String.format("%0" + k + "d", new Object[] { Integer.valueOf(i) }); |
|
||||||
if (j != 0) |
|
||||||
{ |
|
||||||
j = 0; |
|
||||||
this.dif = Long.valueOf(this.dif.longValue() - i * paramLong.longValue()); |
|
||||||
} |
|
||||||
this.format = this.format.replaceFirst(paramString + "\\{\\d*?\\}", str2); |
|
||||||
} |
|
||||||
} |
|
||||||
} |
|
@ -1,67 +0,0 @@ |
|||||||
package com.fr.function; |
|
||||||
import com.fr.script.AbstractFunction; |
|
||||||
import com.fr.stable.Primitive; |
|
||||||
public class FlagHtmlColor extends AbstractFunction { |
|
||||||
public Object run(Object[] args) { |
|
||||||
String txt=""; |
|
||||||
String color=""; |
|
||||||
String flag=""; |
|
||||||
if(null==args||args.length==0){ |
|
||||||
return Primitive.ERROR_NAME; |
|
||||||
}else if(args.length==1){ |
|
||||||
txt=args[0].toString(); |
|
||||||
color="red"; |
|
||||||
flag="N"; |
|
||||||
}else if(args.length==2){ |
|
||||||
txt=args[0].toString(); |
|
||||||
color=args[1].toString(); |
|
||||||
flag="N"; |
|
||||||
}else{ |
|
||||||
txt=args[0].toString(); |
|
||||||
color=args[1].toString(); |
|
||||||
flag=args[2].toString(); |
|
||||||
} |
|
||||||
String result=getHtmlStr(txt, color, flag); |
|
||||||
return result; |
|
||||||
} |
|
||||||
public String getHtmlStr(String txt,String color,String flag){ |
|
||||||
String starthtml="<font color='"+color+"'>"; |
|
||||||
String endhtml="</font>"; |
|
||||||
StringBuffer sb=new StringBuffer(); |
|
||||||
int len=txt.length(); |
|
||||||
if("N".equalsIgnoreCase(flag)){//数字
|
|
||||||
for(int i=0;i<len;i++){ |
|
||||||
char c=txt.charAt(i); |
|
||||||
if(c>='0'&&c<='9'){ |
|
||||||
String str=starthtml+c+endhtml; |
|
||||||
sb.append(str); |
|
||||||
}else{ |
|
||||||
sb.append(c); |
|
||||||
} |
|
||||||
} |
|
||||||
}else if("C".equalsIgnoreCase(flag)){//字母
|
|
||||||
for(int i=0;i<len;i++){ |
|
||||||
char c=txt.charAt(i); |
|
||||||
if((c>='a'&&c<='z')||(c>='A'&&c<='Z')){ |
|
||||||
String str=starthtml+c+endhtml; |
|
||||||
sb.append(str); |
|
||||||
}else{ |
|
||||||
sb.append(c); |
|
||||||
} |
|
||||||
} |
|
||||||
} else if("Z".equalsIgnoreCase(flag)){//中文
|
|
||||||
for(int i=0;i<len;i++){ |
|
||||||
char c=txt.charAt(i); |
|
||||||
if(c >= 0x4E00 && c <= 0x9FA5){ |
|
||||||
String str=starthtml+c+endhtml; |
|
||||||
sb.append(str); |
|
||||||
}else{ |
|
||||||
sb.append(c); |
|
||||||
} |
|
||||||
} |
|
||||||
}else{ |
|
||||||
return txt; |
|
||||||
} |
|
||||||
return sb.toString(); |
|
||||||
} |
|
||||||
} |
|
@ -1,152 +0,0 @@ |
|||||||
package com.fr.function; |
|
||||||
|
|
||||||
import java.math.BigDecimal; |
|
||||||
|
|
||||||
import com.fr.general.FArray; |
|
||||||
import com.fr.general.GeneralUtils; |
|
||||||
import com.fr.script.AbstractFunction; |
|
||||||
|
|
||||||
public class IRR extends AbstractFunction { |
|
||||||
|
|
||||||
private static final long serialVersionUID = 7634415917398642321L; |
|
||||||
private static final String ERROR_VALUE = "#NUM!"; |
|
||||||
|
|
||||||
|
|
||||||
@Override |
|
||||||
public Object run(Object[] args) { |
|
||||||
try{ |
|
||||||
if(1 == args.length){ |
|
||||||
return run( transArr( (FArray) args[0] ) ); |
|
||||||
}else if(2 == args.length){ |
|
||||||
return run( transArr( (FArray) args[0] ), trans( args[1] ) ); |
|
||||||
} |
|
||||||
}catch(Exception e){ |
|
||||||
System.out.println(e); |
|
||||||
} |
|
||||||
return ERROR_VALUE; |
|
||||||
} |
|
||||||
|
|
||||||
/** |
|
||||||
* 将其他类型的数字转换为大数(保证精度) |
|
||||||
* @param ele |
|
||||||
* @return |
|
||||||
*/ |
|
||||||
private static BigDecimal trans(Object ele){ |
|
||||||
try{ |
|
||||||
String val = GeneralUtils.objectToString(ele); |
|
||||||
return new BigDecimal(val); |
|
||||||
}catch(Exception e){ |
|
||||||
|
|
||||||
} |
|
||||||
return (BigDecimal) ele; |
|
||||||
} |
|
||||||
|
|
||||||
/** |
|
||||||
* 将数组转换为大数数组 |
|
||||||
* @param in |
|
||||||
* @return |
|
||||||
*/ |
|
||||||
private static FArray<BigDecimal> transArr(FArray in){ |
|
||||||
FArray<BigDecimal> rt = new FArray<BigDecimal>(); |
|
||||||
for(int i=0;i<in.length();i++){ |
|
||||||
Object ele = in.elementAt(i); |
|
||||||
rt.add(trans(ele)); |
|
||||||
} |
|
||||||
return rt; |
|
||||||
} |
|
||||||
|
|
||||||
|
|
||||||
private static BigDecimal run(FArray<BigDecimal> cashflow){ |
|
||||||
return run( cashflow, new BigDecimal(0.1d) ); |
|
||||||
} |
|
||||||
|
|
||||||
private static BigDecimal run(FArray<BigDecimal> cashflow,BigDecimal guess){ |
|
||||||
BigDecimal maxrate = initRateMax(cashflow,guess); |
|
||||||
BigDecimal minrate = initRateMin(cashflow,guess); |
|
||||||
for( int i=0; i<Init_Max_Loop; i++ ){ |
|
||||||
BigDecimal testrate = minrate.add(maxrate).divide( new BigDecimal(2d) ); |
|
||||||
BigDecimal npv = NPV( cashflow, testrate ); |
|
||||||
if( npv.abs().compareTo(Accuracy) == LESS ){ |
|
||||||
guess = testrate; |
|
||||||
break; |
|
||||||
}else if( npv.compareTo(ZERO) == LESS ){ |
|
||||||
minrate = testrate; |
|
||||||
}else{ |
|
||||||
maxrate = testrate; |
|
||||||
} |
|
||||||
} |
|
||||||
//保留16位小数(足够精度)
|
|
||||||
return guess.setScale(16,BigDecimal.ROUND_HALF_UP); |
|
||||||
} |
|
||||||
|
|
||||||
//最小精度
|
|
||||||
private static final BigDecimal Accuracy = new BigDecimal(0.00000001d); |
|
||||||
//最大循环次数,excel用的是20次,不过精度只到小数点后两位,而且不一定一定能算出值,为了尽可能保证算出结果,我增加到100次,
|
|
||||||
private static final int Init_Max_Loop = 100; |
|
||||||
|
|
||||||
private static final BigDecimal ZERO = new BigDecimal(0); |
|
||||||
private static final BigDecimal ONE = new BigDecimal(1); |
|
||||||
private static final BigDecimal Z005 = new BigDecimal(0.005d); |
|
||||||
private static final BigDecimal Z2 = new BigDecimal(0.2d); |
|
||||||
|
|
||||||
private static final int GREATER = 1; |
|
||||||
private static final int LESS = -1; |
|
||||||
|
|
||||||
/** |
|
||||||
* 生成一个使NPV为负数的R作为内部收益率下限值 |
|
||||||
* @param cashflow |
|
||||||
* @param guess |
|
||||||
* @return |
|
||||||
*/ |
|
||||||
private static BigDecimal initRateMin(FArray<BigDecimal> cashflow,BigDecimal guess){ |
|
||||||
for( int i=0; i<Init_Max_Loop; i++ ){ |
|
||||||
BigDecimal npv = NPV( cashflow, guess ); |
|
||||||
|
|
||||||
if( npv.compareTo(ZERO) == LESS ){ |
|
||||||
return guess; |
|
||||||
} |
|
||||||
BigDecimal step = guess.abs().multiply( Z2 ); |
|
||||||
guess = guess.add( step.compareTo( Z005 ) == LESS ? Z005 : step ); |
|
||||||
} |
|
||||||
return guess; |
|
||||||
} |
|
||||||
|
|
||||||
/** |
|
||||||
* 生成一个使NPV为正数的R作为内部收益率的上限制 |
|
||||||
* @param cashflow |
|
||||||
* @param guess |
|
||||||
* @return |
|
||||||
*/ |
|
||||||
private static BigDecimal initRateMax(FArray<BigDecimal> cashflow,BigDecimal guess){ |
|
||||||
for( int i=0; i<Init_Max_Loop; i++ ){ |
|
||||||
BigDecimal npv = NPV( cashflow, guess ); |
|
||||||
|
|
||||||
if( npv.compareTo(ZERO) == GREATER ){ |
|
||||||
return guess; |
|
||||||
} |
|
||||||
BigDecimal step = guess.abs().multiply( Z2 ); |
|
||||||
guess = guess.subtract( step.compareTo( Z005 ) == LESS ? Z005 : step ); |
|
||||||
} |
|
||||||
return guess; |
|
||||||
} |
|
||||||
|
|
||||||
/** |
|
||||||
* 算NPV |
|
||||||
* @param cashflow |
|
||||||
* @param rate |
|
||||||
* @return |
|
||||||
*/ |
|
||||||
private static BigDecimal NPV(FArray<BigDecimal> cashflow,BigDecimal rate){ |
|
||||||
BigDecimal npv = ZERO; |
|
||||||
BigDecimal rpowj = ONE;//(1+r)^0
|
|
||||||
BigDecimal radd1 = rate.add(ONE);//1+r
|
|
||||||
for( int j=0; j<cashflow.length(); j++ ){ |
|
||||||
BigDecimal valuej = cashflow.elementAt(j); |
|
||||||
npv = npv.add( valuej.divide( rpowj, 10, BigDecimal.ROUND_HALF_DOWN ) );// vj / (1+r)^j
|
|
||||||
rpowj = rpowj.multiply(radd1); // (1+r)^j
|
|
||||||
//npv += cashflow.elementAt(j) / Math.pow( 1+rate, j );
|
|
||||||
} |
|
||||||
return npv; |
|
||||||
} |
|
||||||
|
|
||||||
} |
|
@ -1,142 +0,0 @@ |
|||||||
// 自定义函数实现表间校验
|
|
||||||
package com.fr.function; |
|
||||||
|
|
||||||
import com.fr.base.ResultFormula; |
|
||||||
import com.fr.base.operator.common.CommonOperator; |
|
||||||
import com.fr.chart.activator.ChartBaseActivator; |
|
||||||
import com.fr.cluster.engine.activator.standalone.StandaloneModeActivator; |
|
||||||
import com.fr.config.activator.BaseDBActivator; |
|
||||||
import com.fr.config.activator.ConfigurationActivator; |
|
||||||
import com.fr.env.operator.CommonOperatorImpl; |
|
||||||
import com.fr.general.I18nResource; |
|
||||||
import com.fr.health.activator.ModuleHealActivator; |
|
||||||
import com.fr.io.ResourceRepositoryActivator; |
|
||||||
import com.fr.io.TemplateWorkBookIO; |
|
||||||
import com.fr.json.JSONArray; |
|
||||||
import com.fr.json.JSONObject; |
|
||||||
import com.fr.main.impl.WorkBook; |
|
||||||
import com.fr.main.workbook.ResultWorkBook; |
|
||||||
import com.fr.module.Module; |
|
||||||
import com.fr.module.tool.ActivatorToolBox; |
|
||||||
import com.fr.report.ReportActivator; |
|
||||||
import com.fr.report.RestrictionActivator; |
|
||||||
import com.fr.report.cell.CellElement; |
|
||||||
import com.fr.report.module.ReportBaseActivator; |
|
||||||
import com.fr.report.report.ResultReport; |
|
||||||
import com.fr.report.write.WriteActivator; |
|
||||||
import com.fr.scheduler.SchedulerActivator; |
|
||||||
import com.fr.script.AbstractFunction; |
|
||||||
import com.fr.stable.WriteActor; |
|
||||||
import com.fr.store.StateServiceActivator; |
|
||||||
import com.fr.workspace.simple.SimpleWork; |
|
||||||
import com.fr.write.cal.WB; |
|
||||||
|
|
||||||
import java.util.HashMap; |
|
||||||
|
|
||||||
public class ReportCheck extends AbstractFunction { |
|
||||||
private static HashMap wMap = new HashMap(); |
|
||||||
|
|
||||||
public Object run(Object[] args) { |
|
||||||
// 获取公式中的参数
|
|
||||||
String cptname = args[0].toString(); // 获取报表名称
|
|
||||||
int colnumber = Integer.parseInt(args[2].toString()); // 所取单元格所在列
|
|
||||||
int rownumber = Integer.parseInt(args[3].toString()); // 所取单元格所在行
|
|
||||||
// 定义返回的值
|
|
||||||
Object returnValue = null; |
|
||||||
// 定义报表运行环境,用于执行报表
|
|
||||||
Module module = ActivatorToolBox.simpleLink(new BaseDBActivator(), |
|
||||||
new ConfigurationActivator(), |
|
||||||
new ResourceRepositoryActivator(), |
|
||||||
new StandaloneModeActivator(), |
|
||||||
new ModuleHealActivator(), |
|
||||||
new StateServiceActivator(), |
|
||||||
new ChartBaseActivator(), |
|
||||||
new SchedulerActivator(), |
|
||||||
new ReportBaseActivator(), |
|
||||||
new RestrictionActivator(), |
|
||||||
new ReportActivator(), |
|
||||||
new WriteActivator()); |
|
||||||
SimpleWork.supply(CommonOperator.class, new CommonOperatorImpl()); |
|
||||||
String envpath = "//Applications//FineReport10_325//webapps//webroot//WEB-INF";//工程路径
|
|
||||||
SimpleWork.checkIn(envpath); |
|
||||||
I18nResource.getInstance(); |
|
||||||
module.start(); |
|
||||||
|
|
||||||
|
|
||||||
try { |
|
||||||
ResultWorkBook rworkbook = null; |
|
||||||
// 读取模板
|
|
||||||
WorkBook workbook = (WorkBook)TemplateWorkBookIO |
|
||||||
.readTemplateWorkBook(cptname); |
|
||||||
// 获取需要传递给报表的参数名与参数值,格式如[{"name":para1name,"value":para1value},{"name":para2name,"value":para2value},......]
|
|
||||||
JSONArray parasArray = new JSONArray(args[1].toString()); |
|
||||||
// 需要判断是否是5秒内执行过的
|
|
||||||
// 取出保存的resultworkbook;
|
|
||||||
Object tempWObj = wMap.get(cptname + parasArray.toString()); |
|
||||||
if (tempWObj != null) { |
|
||||||
// 取出hashmap里面保存的TpObj;
|
|
||||||
TpObj curTpObj = (TpObj) tempWObj; |
|
||||||
|
|
||||||
if ((System.currentTimeMillis() - curTpObj.getExeTime()) < 8000) { |
|
||||||
rworkbook = curTpObj.getRworkbook(); |
|
||||||
} else { |
|
||||||
wMap.remove(cptname + parasArray.toString()); |
|
||||||
} |
|
||||||
} |
|
||||||
// 如果没有设置,需要生成
|
|
||||||
if (rworkbook == null) { |
|
||||||
JSONObject jo = new JSONObject(); |
|
||||||
// 定义报表执行时使用的paraMap,保存参数名与值
|
|
||||||
java.util.Map parameterMap = new java.util.HashMap(); |
|
||||||
if (parasArray.length() > 0) { |
|
||||||
for (int i = 0; i < parasArray.length(); i++) { |
|
||||||
jo = parasArray.getJSONObject(i); |
|
||||||
parameterMap.put(jo.get("name"), jo.get("value")); |
|
||||||
} |
|
||||||
} |
|
||||||
// 执行报表
|
|
||||||
rworkbook = workbook.execute(parameterMap, new WriteActor()); |
|
||||||
// 保存下来
|
|
||||||
wMap.put(cptname + parasArray.toString(), new TpObj(rworkbook, |
|
||||||
System.currentTimeMillis())); |
|
||||||
} |
|
||||||
// 获取报表结果中对应Cell的值
|
|
||||||
ResultReport report = rworkbook.getResultReport(0); |
|
||||||
CellElement cellElement = ((WB) report).getCellElement(colnumber, rownumber); |
|
||||||
returnValue = cellElement.getValue().toString(); |
|
||||||
if(cellElement.getValue() instanceof ResultFormula) { |
|
||||||
returnValue = ((ResultFormula)cellElement.getValue()).getResult().toString(); |
|
||||||
} |
|
||||||
} catch (Exception e) { |
|
||||||
e.printStackTrace(); |
|
||||||
} |
|
||||||
return returnValue; |
|
||||||
} |
|
||||||
|
|
||||||
class TpObj { |
|
||||||
private ResultWorkBook rworkbook = null; |
|
||||||
private long exeTime = System.currentTimeMillis(); |
|
||||||
|
|
||||||
public TpObj(ResultWorkBook rworkbook, long exeTime) { |
|
||||||
this.setRworkbook(rworkbook); |
|
||||||
this.setExeTime(exeTime); |
|
||||||
} |
|
||||||
|
|
||||||
public ResultWorkBook getRworkbook() { |
|
||||||
return rworkbook; |
|
||||||
} |
|
||||||
|
|
||||||
public void setRworkbook(ResultWorkBook rworkbook) { |
|
||||||
this.rworkbook = rworkbook; |
|
||||||
} |
|
||||||
|
|
||||||
public long getExeTime() { |
|
||||||
return exeTime; |
|
||||||
} |
|
||||||
|
|
||||||
public void setExeTime(long exeTime) { |
|
||||||
this.exeTime = exeTime; |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
} |
|
@ -1,15 +0,0 @@ |
|||||||
package com.fr.function; |
|
||||||
|
|
||||||
import com.fr.script.AbstractFunction; |
|
||||||
|
|
||||||
public class StringCat extends AbstractFunction { |
|
||||||
public Object run(Object[] args) { |
|
||||||
String result = ""; |
|
||||||
Object para; |
|
||||||
for (int i = 0; i < args.length; i++) { |
|
||||||
para = args[i]; |
|
||||||
result += para.toString(); |
|
||||||
} |
|
||||||
return result; |
|
||||||
} |
|
||||||
} |
|
@ -1,59 +0,0 @@ |
|||||||
//图片在下文字在上
|
|
||||||
package com.fr.function; |
|
||||||
|
|
||||||
import com.fr.base.GraphHelper; |
|
||||||
import com.fr.data.core.db.BinaryObject; |
|
||||||
import com.fr.log.FineLoggerFactory; |
|
||||||
import com.fr.script.AbstractFunction; |
|
||||||
import com.fr.stable.CoreGraphHelper; |
|
||||||
import javax.imageio.ImageIO; |
|
||||||
import java.awt.Graphics2D; |
|
||||||
import java.awt.Image; |
|
||||||
import java.awt.image.BufferedImage; |
|
||||||
import java.io.IOException; |
|
||||||
|
|
||||||
|
|
||||||
/** |
|
||||||
* 图片在下文字在上 |
|
||||||
*/ |
|
||||||
public class StringImage extends AbstractFunction { |
|
||||||
@Override |
|
||||||
public Object run(Object[] args) { |
|
||||||
Image result = null; |
|
||||||
int p = 0; |
|
||||||
Object[] ob = new Object[2]; |
|
||||||
for (int i = 0; (i < args.length && p <= 1); i++) { |
|
||||||
if (args[i] == null) { |
|
||||||
continue; |
|
||||||
} |
|
||||||
ob[p] = args[i]; |
|
||||||
p++; |
|
||||||
|
|
||||||
} |
|
||||||
|
|
||||||
if (ob[1] instanceof BinaryObject) { |
|
||||||
BinaryObject binaryObject = (BinaryObject) ob[1]; |
|
||||||
try { |
|
||||||
result = initStringImage((String) ob[0], ImageIO.read(binaryObject.getInputStream())); |
|
||||||
} catch (IOException e) { |
|
||||||
e.printStackTrace(); |
|
||||||
} |
|
||||||
} else if (ob[1] instanceof Image) { |
|
||||||
result = initStringImage((String) ob[0], (Image) ob[1]); |
|
||||||
} else { |
|
||||||
FineLoggerFactory.getLogger().warn("Unsupported type of " + ob[1].getClass()); |
|
||||||
} |
|
||||||
|
|
||||||
return result; |
|
||||||
} |
|
||||||
|
|
||||||
private Image initStringImage(String name, Image image) { |
|
||||||
BufferedImage splashBuffedImage = CoreGraphHelper.toBufferedImage(image); |
|
||||||
Graphics2D splashG2d = splashBuffedImage.createGraphics(); |
|
||||||
double centerX = 25; |
|
||||||
double centerY = 25; |
|
||||||
GraphHelper.drawString(splashG2d, name, centerX, centerY); |
|
||||||
return splashBuffedImage; |
|
||||||
} |
|
||||||
|
|
||||||
} |
|
@ -1,45 +0,0 @@ |
|||||||
//SubSection函数-Oracle查询参数个数限制
|
|
||||||
package com.fr.function; |
|
||||||
|
|
||||||
import com.fr.general.FArray; |
|
||||||
import com.fr.script.AbstractFunction; |
|
||||||
|
|
||||||
public class SubSection extends AbstractFunction { |
|
||||||
public Object run(Object[] args) { |
|
||||||
// 获取第一个对象,即取得传入的参数
|
|
||||||
Object para = args[0]; |
|
||||||
String parastr = para.toString(); |
|
||||||
// 由于是复选参数,因此要去掉前后的"("和")"
|
|
||||||
if (parastr.startsWith("(") && parastr.endsWith(")")) { |
|
||||||
parastr = parastr.substring(1, parastr.length() - 1); |
|
||||||
} |
|
||||||
// 将字符串转为","分割的数组
|
|
||||||
String test[] = parastr.split(","); |
|
||||||
int len = test.length; |
|
||||||
int loopnum = len / 500; |
|
||||||
if (len % 500 != 0) { |
|
||||||
loopnum += 1; |
|
||||||
} |
|
||||||
; |
|
||||||
// 返回的值是数组,需要定义成我们内部的类型FArray
|
|
||||||
FArray result = new FArray(); |
|
||||||
String str = ""; |
|
||||||
int k = 1; |
|
||||||
for (int i = 0; i < loopnum; i++) { |
|
||||||
for (int j = 500 * i; j < 500 * (i + 1) && j < len; j++) { |
|
||||||
if (k != 500 && j != (len - 1)) { |
|
||||||
str += test[j] + ","; |
|
||||||
} else { |
|
||||||
str += test[j]; |
|
||||||
} |
|
||||||
k++; |
|
||||||
} |
|
||||||
// 每500个形成一组并在每组外部加上"("和")"
|
|
||||||
str = "(" + str + ")"; |
|
||||||
result.add(str); |
|
||||||
str = ""; |
|
||||||
k = 1; |
|
||||||
} |
|
||||||
return result; |
|
||||||
} |
|
||||||
} |
|
@ -1,25 +0,0 @@ |
|||||||
// 自定义函数Unicode编码转化为中文
|
|
||||||
package com.fr.function; |
|
||||||
|
|
||||||
import com.fr.script.AbstractFunction; |
|
||||||
|
|
||||||
public class Ubm extends AbstractFunction { |
|
||||||
public Object run(Object[] args) { |
|
||||||
String str = args[0].toString(); |
|
||||||
String st = ""; |
|
||||||
StringBuffer buffer = new StringBuffer(); |
|
||||||
while (str.length() > 0) { |
|
||||||
if (str.startsWith("%u")) { |
|
||||||
st = str.substring(2, 6); |
|
||||||
char ch = (char) Integer.parseInt(String.valueOf(st), 16); |
|
||||||
buffer.append(new Character(ch).toString()); |
|
||||||
str = str.substring(6); |
|
||||||
} else { |
|
||||||
st = str.substring(0, str.indexOf("%u")); |
|
||||||
buffer.append(st); |
|
||||||
str = str.substring(st.length()); |
|
||||||
} |
|
||||||
} |
|
||||||
return buffer.toString(); |
|
||||||
} |
|
||||||
} |
|
@ -1,105 +0,0 @@ |
|||||||
// 导出打印单选按钮及复选框
|
|
||||||
package com.fr.function; |
|
||||||
|
|
||||||
import com.fr.base.AbstractPainter; |
|
||||||
import com.fr.base.BaseUtils; |
|
||||||
import com.fr.base.GraphHelper; |
|
||||||
import com.fr.base.Style; |
|
||||||
import com.fr.general.FArray; |
|
||||||
import com.fr.general.FRFont; |
|
||||||
import com.fr.script.AbstractFunction; |
|
||||||
import com.fr.stable.Primitive; |
|
||||||
import com.fr.stable.StringUtils; |
|
||||||
|
|
||||||
import java.awt.Color; |
|
||||||
import java.awt.FontMetrics; |
|
||||||
import java.awt.Graphics; |
|
||||||
import java.awt.Graphics2D; |
|
||||||
import java.awt.Image; |
|
||||||
|
|
||||||
public class Widget2Image extends AbstractFunction { |
|
||||||
public Object run(Object[] args) { |
|
||||||
if (args.length < 3) |
|
||||||
return Primitive.NULL; |
|
||||||
// 第一个参数:控件类型,不区分大小写
|
|
||||||
String type = args[0].toString().toLowerCase(); |
|
||||||
if (!("checkbox".equals(type) || "radiobutton".equals(type))) |
|
||||||
return Primitive.ERROR_VALUE; |
|
||||||
// 第二个参数:控件按钮个数
|
|
||||||
int num = Integer.parseInt(args[1].toString()); |
|
||||||
// 第三个参数:按钮组的值,哪些被选中
|
|
||||||
String selection = args[2].toString(); |
|
||||||
// 第四个参数:可选参数,按钮组对应的显示值数组
|
|
||||||
FArray textArray = new FArray(); |
|
||||||
if (args.length == 4 && args[3] instanceof FArray) { |
|
||||||
textArray = (FArray) args[3]; |
|
||||||
} |
|
||||||
return new WidgetPaint(type, num, selection, textArray); |
|
||||||
} |
|
||||||
|
|
||||||
public static class WidgetPaint extends AbstractPainter { |
|
||||||
public static String CHECK_ON = "/com/fr/web/images/checkon.gif"; |
|
||||||
public static String CHECK_OFF = "/com/fr/web/images/checkoff.gif"; |
|
||||||
public static String RADIO_ON = "/com/fr/web/images/radioon.gif"; |
|
||||||
public static String RADIO_OFF = "/com/fr/web/images/radiooff.gif"; |
|
||||||
public static FRFont DEFUALT_FONT = FRFont.getInstance(); |
|
||||||
public static FontMetrics FontMetrics = GraphHelper |
|
||||||
.getFontMetrics(DEFUALT_FONT); |
|
||||||
private String type; |
|
||||||
private int num; |
|
||||||
private String selection; |
|
||||||
private FArray textArray; |
|
||||||
|
|
||||||
{ |
|
||||||
DEFUALT_FONT = DEFUALT_FONT.applyForeground(Color.BLACK); |
|
||||||
} |
|
||||||
|
|
||||||
public WidgetPaint(String type, int num, String selection, |
|
||||||
FArray textArray) { |
|
||||||
this.type = type; |
|
||||||
this.num = num; |
|
||||||
this.selection = selection; |
|
||||||
this.textArray = textArray; |
|
||||||
} |
|
||||||
|
|
||||||
private String resolveText(int i) { |
|
||||||
if (i < this.textArray.length()) { |
|
||||||
return this.textArray.elementAt(i).toString(); |
|
||||||
} |
|
||||||
return StringUtils.EMPTY; |
|
||||||
} |
|
||||||
|
|
||||||
public void paint(Graphics g, int width, int height, int resolution, |
|
||||||
Style style) { |
|
||||||
String OFF = CHECK_OFF; |
|
||||||
String ON = CHECK_ON; |
|
||||||
if ("radiobutton".equals(type)) { |
|
||||||
OFF = RADIO_OFF; |
|
||||||
ON = RADIO_ON; |
|
||||||
} |
|
||||||
Image[] checkOFFON = {BaseUtils.readImage(OFF), |
|
||||||
BaseUtils.readImage(ON)}; |
|
||||||
int[] imgWidths = {checkOFFON[0].getWidth(null), |
|
||||||
checkOFFON[1].getWidth(null)}; |
|
||||||
int[] imgHeights = {checkOFFON[0].getHeight(null), |
|
||||||
checkOFFON[1].getHeight(null)}; |
|
||||||
Graphics2D g2d = (Graphics2D) g; |
|
||||||
g2d.setFont(FRFont.getInstance()); |
|
||||||
g2d.setPaint(Color.BLACK); |
|
||||||
int x = 2; |
|
||||||
int y = (height - imgHeights[0]) / 2; |
|
||||||
String select = selection; |
|
||||||
for (int i = 0; i < num; i++) { |
|
||||||
int bit = Integer.parseInt(select.substring(i, i + 1)); |
|
||||||
g2d.drawImage(checkOFFON[bit], x, y, imgWidths[bit], |
|
||||||
imgHeights[bit], null); |
|
||||||
x += imgWidths[bit] + 2; |
|
||||||
String text = resolveText(i); |
|
||||||
g2d.setBackground(Color.BLACK); |
|
||||||
g2d.drawString(text, (float) x, (float) (y + FontMetrics |
|
||||||
.getAscent())); |
|
||||||
x += FontMetrics.stringWidth(text) + 2; |
|
||||||
} |
|
||||||
} |
|
||||||
} |
|
||||||
} |
|
@ -1,77 +0,0 @@ |
|||||||
package com.fr.test; |
|
||||||
|
|
||||||
import com.fr.base.FRContext; |
|
||||||
import com.fr.base.Formula; |
|
||||||
import com.fr.general.FArray; |
|
||||||
import com.fr.json.JSONObject; |
|
||||||
import com.fr.script.AbstractFunction; |
|
||||||
import com.fr.script.Calculator; |
|
||||||
import com.fr.stable.Primitive; |
|
||||||
|
|
||||||
public class gauthority extends AbstractFunction { |
|
||||||
public gauthority() { |
|
||||||
} |
|
||||||
|
|
||||||
public Object run(Object[] args) { |
|
||||||
int[] newArgs = new int[args.length]; |
|
||||||
|
|
||||||
for (int i = 0; i < args.length; ++i) { |
|
||||||
if (!(args[i] instanceof Integer) || (Integer) args[i] <= 0) { |
|
||||||
return Primitive.ERROR_NAME; |
|
||||||
} |
|
||||||
|
|
||||||
newArgs[i] = (Integer) args[i]; |
|
||||||
} |
|
||||||
|
|
||||||
FArray res = new FArray(); |
|
||||||
Calculator ca = this.getCalculator(); |
|
||||||
Formula f = new Formula("$fr_userposition"); |
|
||||||
|
|
||||||
try { |
|
||||||
Object dp = ca.eval(f); |
|
||||||
if (dp instanceof FArray) { |
|
||||||
FArray fa = (FArray) dp; |
|
||||||
|
|
||||||
for (int i = 0; i < fa.length(); ++i) { |
|
||||||
JSONObject jo = (JSONObject) fa.elementAt(i); |
|
||||||
String dName = jo.getString("jobTitle"); |
|
||||||
if (newArgs.length == 0) { |
|
||||||
res.add(dName); |
|
||||||
} else { |
|
||||||
String[] dNames = dName.split(","); |
|
||||||
res.add(this.buildRes(dNames, newArgs)); |
|
||||||
} |
|
||||||
} |
|
||||||
} |
|
||||||
} catch (Exception var12) { |
|
||||||
FRContext.getLogger().error(var12.getMessage(), var12); |
|
||||||
} |
|
||||||
|
|
||||||
return res; |
|
||||||
} |
|
||||||
|
|
||||||
private String buildRes(String[] dNames, int[] args) { |
|
||||||
StringBuffer sb = new StringBuffer(); |
|
||||||
|
|
||||||
for (int i = 0; i < args.length; ++i) { |
|
||||||
int index = args[i]; |
|
||||||
if (dNames.length >= index) { |
|
||||||
sb.append(dNames[index - 1]).append(","); |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
return sb.substring(0, sb.length() > 0 ? sb.length() - 1 : 0); |
|
||||||
} |
|
||||||
|
|
||||||
public Type getType() { |
|
||||||
return OTHER; |
|
||||||
} |
|
||||||
|
|
||||||
public String getCN() { |
|
||||||
return "GETUSERDEPARTMENTS():返回角色部门\n示例:\nGETUSERDEPARTMENTS():返回角色所有部门,若多个部门则数组\nGETUSERDEPARTMENTS(3,2):返回角色该部门的第三层和第二层名字,\n若多个部门则返回数组,若没有第三层则只显示第二层"; |
|
||||||
} |
|
||||||
|
|
||||||
public String getEN() { |
|
||||||
return ""; |
|
||||||
} |
|
||||||
} |
|
Loading…
Reference in new issue