您的位置:首页 > 其它

用友nc65 uap公式开发

2017-12-07 17:58 621 查看

用友nc65 uap公式开发

1.应用场景:

上面有一次博客说了如何使用自定义公式解决房产多显问题,这次是在人力资本模块薪资函数公式面板上新加一个公式,实现特定的需求。如图所示:新加一个距起薪日工作日天数公式。



2.开发思路:

和开发自定义公式不同的是:系统公式需要在home/resources下配置两个xml文件,一个是前台显示,一个是后台功能实现类指定,而在人力资本模块使用了多余校验,还需要我们再次配置多语资源文件在:E:\nchome_1106\nchome\langlib
2.1配置xml
前台xml在:nchome\resources\formulaconfig\custfunction\hrwa下的default.xml文件夹加入如下代码:
<formula>
<customType>9</customType>
<functionName>WaperiodDays</functionName>
<functionClass>nc.ui.wa.formular.func.WaperiodDays</functionClass>
</formula>
如图如图所示:



后台功能实现xml路径在:nchome\resources\hr\wa\formula下的wa_formula.xml加入如下代码:
<entry>
<string>SALARYPERIODWORKDAYS</string>
<function>
<defaultName>6013commonbasic;06013commonbasic0073</defaultName>
<displayName>salaryPeriodWorkDays</displayName>
<hintMsgRes>6013commonbasic;06013commonbasic0073</hintMsgRes>
<inputSigRes>6013commonbasic;06013commonbasic0135</inputSigRes>
<pattern>salaryPeriodWorkDays\(.*,.*\)</pattern>
<arguments>salaryPeriodWorkDays({0},{1})</arguments>
<returntype>0</returntype>
<parapanel>nc.ui.wa.formular.WageDaysFunctionEditor</parapanel>
<group>WA</group>
<process>nc.impl.wa.func.SalaryPeriodWorkDays</process>
<productCode>UPP6013func</productCode>
</function>
</entry>
其中的多语对应的中文如下:
fvo1.setDefaultName("距起薪日工作日天数");
fvo1.setDisplayName("salaryPeriodWorkDays()");
fvo1.setHintMsgRes("距起薪日工作日天数");
fvo1.setInputSigRes("@薪资函数.期间工作日天数@");
在E:\nchome_1106\nchome\langlib下找到对应的多语文件如下:
06013commonbasic0073=距起薪日工作日天数


如图所示:


其中的<pattern>salaryPeriodWorkDays\(.*,.*\)</pattern>代表两个参数,不带参数如下;salaryPeriodWorkDays\(\),对应的<arguments>salaryPeriodWorkDays({0},{1})</arguments>不用填。
在对应的nc.ui.wa.formular.WaFunctionFactory公式工厂类中装载模版,
如图所示:



这样配置好后重启服务在前台就可以看到对应的函数了。
2.2  对应的java类:
前台java类:
package nc.ui.wa.formular.func;

import nc.ui.hr.formula.func.HrDigitFunc;

public class SalaryPeriodWorkDays  extends HrDigitFunc{
public SalaryPeriodWorkDays() {
numberOfParameters = 2;
}
}


后台功能实现类
package nc.impl.wa.func;

import nc.vo.hr.func.FunctionReplaceVO;
import nc.vo.pub.BusinessException;
import nc.vo.pub.lang.UFDate;
import nc.vo.pub.lang.UFDate;

/**
*
* @author: zenglong
* @ClassName: SalaryPeriodWorkDays
* @Description: 距起薪日工作日函数
* @date: 2017年12月4日
*/
public class SalaryPeriodWorkDays extends AbstractWAFormulaParse {
private static final long serialVersionUID = 3175524099403452930L;

public FunctionReplaceVO getReplaceStr(String formula)
throws BusinessException {

FunctionReplaceVO fvo = new FunctionReplaceVO();
UFDate beginDayLiteralDate = null;
UFDate endDayLiteralDate = null;
String[] arguments = getArguments(formula);
for (int i = 0; i < arguments.length; i++) {
String[] date = arguments[i].split("'");
if (i == 0) {
beginDayLiteralDate = new UFDate(date[1]);
}
if (i == 1) {
endDayLiteralDate = new UFDate(date[1]);
}
}
int sn = getWorkingDaysBetween(beginDayLiteralDate, endDayLiteralDate,
true);
fvo.setReplaceStr(" " + sn + " ");
return fvo;
}

private int getWorkingDaysBetween(UFDate beginDay,
UFDate endDay, boolean includeEndday) {
int countNetWorkingDays = 0;
UFDate today = beginDay;
while (today.before(endDay)) {
if ((today.getWeek() != 6) && (today.getWeek() != 0)) {
countNetWorkingDays++;
}
today = today.getDateAfter(1);
}
if ((includeEndday) && (endDay.getWeek() != 6)
&& (today.getWeek() != 0)) {
countNetWorkingDays++;
}

return countNetWorkingDays;
}
}

3.代码分析:

从nc.impl.hr.formula.parser.WaFormulaProcessParser类中的public
static String parse(String formula, LoginContext context) throws BusinessException的方法,从这里开始解析公式:



调用对应nc.impl.wa.func.AbstractWAFormulaParse下的public
String parse(String pk_org, String formula, Object... params) throws BusinessException方法



到同类下的public String parseAfterValidate(String pk_org, String formula, Object... params) throws BusinessException方法



replaceStr = getReplaceStr(tempformula);方法将会找到对应的后台公式类去执行。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: