核算函数开发说明文档开发核算函数说明文档..................................................................................................................1一、“取历史绝对期间数据”公式使用说明.......................................................................1二、薪酬公式开发配置说明。...............................................................................................2三、代码编写规范。..............................................................................................................4四、公式查询。......................................................................................................................4附录..................................................................................................................................................4一、“取历史绝对期间数据”公式使用说明如图“取历史绝对期间数据”公式需要传递5个参数,分别是计算规则名称,薪酬项目名称,统计年,统计月和统计次数5个参数,该公式会根据这几个参数获取历史绝对期间的薪酬数据。设置好公式之后选择公式名称并点击模拟执行在弹出框中选好需要核算的人员然后模拟执行算出结果。二、薪酬公式开发配置说明。使用管理员登陆系统,进入“开发平台”点击“核算函数”选项,在新页面中点击“创建”按钮新建函数:在定义公式界面注意,参数类型只能为String或者double类型,如果方法内部确实要用到其他数数值数据类型,请在java方法内部进行转换。返回值类型根据java方法内部的返回结果为String或者double进行返回(注意参数和返回结果为数值类型请用double)。三、代码编写规范。新建公式可以在com.kingdee.shr.compensation.service.CalFunItemSalary类中添加新的方法进行实现,如上述“取历史绝对期间数据”公式的例子,(附录是该公式的代码实现)该类存在于eas\Server\server\lib\server\eas\shr_compensation-server.jar包中,开发人员可以对该jar包反编译后在CalFunItemSalary中加入自己定义公式的实现代码后在编译成class文件替换以前jar包中的CalFunItemSalary.class。建议开发人员自己新建类,并在方法中实现自己公式的逻辑代码,然后将该类编译之后的class文件加入到hr_compensation-server.ja中相应的目录下。(在这里需注意无论是新建类还是在原有类中加方法实现,加入的代码中不可有jar包导入,必须使用类的全路径,如需要使用Date对象不能使用Datedate=newDate(),而应使用java.util.Datedate=newjava.util.Date()的形式),替换jar包后需要重启服务器才能生效。Java中新建的函数方法可以直接使用系统自动传入的四个参数java.util.MapparamMap(包含了该员工的薪酬核算记录,员工id),java.util.HashMaptempMap(缓存对象,保存所有薪酬项目名称和字段序号),com.kingdee.shr.compensation.CalSchemeInfocalScheme(计算规则),StringmainTableRowFilter(查询过滤条件)。四、核算函数查询。核算函数的设置与实现过程会在后台进行保存,后台数据表名为:T_HR_SFormulaFunc。如果已经设置好函数的配置,可以根据后台查询到该记录,以后升级的时候再插入这些数据便可以不用再到开发平台进行函数设置,但java的实现代码不可缺少。后台查询如:select*fromT_HR_SFormulaFuncwherefname_l2like'取历史绝对期间数据'。获取插入该语句可以在查询分析器中执行geninsertselect*fromT_HR_SFormulaFuncwherefdefine='FunGetHistoryItemSalaryByTime';注意这里要点击运行服务器脚本而不是执行sql,执行结果如图,执行这个insert语句就可以不用再到开发平台进行函数设置。附录/***@paramparamMap*存取薪酬核算表信息*@paramtempMap*用于缓存对象*@paramcalScheme*计算规则*@parammainTableRowFilter*过滤条件*@paramschemeName*计算规则名称*@paramcmpItemsName*薪酬项目*@paramcountYear*统计年*@paramcountMonth*统计月*@paramaccountNum*计算次数*@return取历史绝对期间数据*@throwsjava.sql.SQLException*/publicdoublegetHistoryItemSalaryByTime(java.util.MapparamMap,java.util.HashMaptempMap,com.kingdee.shr.compensation.CalSchemeInfocalScheme,StringmainTableRowFilter,StringschemeName,StringcmpItemsName,doublecountYear,doublecountMonth,doubleaccountNum)throwsjava.sql.SQLException{Stringnumber=calScheme.getNumber();//计算规则编码Stringname=calScheme.getName();//计算规则名称java.util.Calendarpal=java.util.Calendar.getInstance();pal.set(java.util.Calendar.YEAR,newDouble(countYear).intValue());pal.set(java.util.Calendar.MONTH,newDouble(countMonth-1).intValue());intyear=pal.get(java.util.Calendar.YEAR);intmonth=pal.get(java.util.Calendar.MONTH)+1;StringpersonId=(String)paramMap.get("T_HR_SCMPCALTABLE_FPERSONID");Stringfid=(String)paramMap.get("T_HR_SCMPCALTABLE_FID");StringfieldSn=cmpItemsName.substring(cmpItemsName.lastIndexOf("_")+1);if(com.kingdee.util.StringUtils.isEmpty(cmpItemsName)||paramMap.get("T_HR_SCMPCALTABLE_FPERSONID")==null){return0;}StringtempMapKey="PeriodItem_"+personId+"_"+cmpItemsName+schemeName+countYear+countMonth+accountNum;StringtempMapKey2="";java.util.MapresultMap=newjava.util.HashMap();StringfixPayMapKey="CalItem_"+personId+"_"+cmpItemsName+schemeName+countYear+countMonth+accountNum;if(tempMap.get(fixPayMapKey)==null){//缓存所有项目薪酬和字段序号tempMap.put(fixPayMapKey,getCmpCalTableName());}resultMap=(java.util.Map)tempMap.get(fixPayMapKey);//在计算规则内没找到公式输入的项目名称,直接返回0if(resultMap.get(cmpItemsName)==null){return0;}else{fieldSn="S"+resultMap.get(cmpItemsName);}if(tempMap.get(tempMapKey)==null){Stringsql_B="selectfpersonIdfromT_HR_SCmpCalTablewherefid='"+fid+"'";if(!com.kingdee.util.StringUtils.isEmpty(mainTableRowFilter)){sql_B="selectfpersonIdfromT_HR_SCmpCalTablewhere"+mainTableRowFilter;}Stringsql="selectA.fpersonId,A."+fieldSn+",A.FCmpPeriodTypefromT_HR_SCmpCalTableA"+"innerjoin("+sql_B+")BonB.fpersonId=A.fpersonId"+"innerjoint_hr_scalschemeConA.fcalschemeid=C.fid"+"whereA.FPeriodYear="+year+"andA.FPeriodMonth="+month+"andC.fname_l2='"+schemeName+"'andA.FCalTime="+accountNum;doublepay=0;com.kingdee.bos.Contextctx=com.kingdee.shr.compensation.app.formula.data.Tools.getInstance().getCtx();com.kingdee.jdbc.rowset.IRowSetset;try{set=com.kingdee.eas.util.app.DbUtil.executeQuery(ctx,sql);while(set.next()){tempMapKey2="PeriodItem_"+set.getString(1)+"_"+cmpItemsName+schemeName+countYear+countMonth+accountNum;pay=set.getFloat(2);//缓存计算好的人员该项目的数据tempMap.put(tempMapKey2,pay);}}catch(com.kingdee.bos.BOSExceptione){e.printStackTrace();}catch(java.sql.SQLExceptione){e.printStackTrace();}}doubleresultValue=0;if(tempMap.get(tempMapKey)!=null){resultValue=(Double)tempMap.get(tempMapKey);}returnresultValue;}