1.命名规范
若视图类型为表单,则java类命名为xxxxxEditHandlerExt,
若为列表,则java类命名为xxxxxListHandlerExt。
二开命名:二开的类名和JS文件名要以Ext结尾。
2.基础资料
2.1 新建
第一步:选择正确的模板,区别开SHR和EAS之间新建基础资料的区别。
第二步:在实体里面删除两个扩展属性,然后发布实体,刷新java代码和元数据。下图是已经删除两个扩展属性的。
第三步:去table那里修改索引的名称,每个基础资料的索引名称之间不能重名。
第四步:选中新建的基础资料,右健更新数据库,导出基础资料的脚本和索引的建表SQL语句。
第五步:在客户端先执行新建索引的脚本,再执行基础资料的建表脚本。
2.2 部署
在开发环境的客户端执行服务器脚本
geninsert select * from t_bs_shrbasicitem where fid='基础资料ID'
再到要部署的环境上的客户端,执行上面生成的插入SQL语句
2.3 视图
用管理员登录系统,在视图那里新建视图,将基础资料的全路径类名拷贝到模型里面,勾选创建基础资料相关视图。部署的话,直接选中基础资料相关的全部视图,全部导出,再导入到其它环境。
2.4 数据维护
默认创建的基础资料在【系统设置】-【公共数据设置】-【公共基础数据】里面。
更改基础资料的路径:【系统设置】-【基础数据设置】-【系统设置】-【公共数据设置】。
全局共享:无论哪个业务组织创建的基础资料,其他组织都可以使用;
向下共享:A业务组织创建的基础资料,A业务组织下的组织可以使用,非A业务组织下的组织不可以使用;
分配共享:A业务组织创建的基础资料,A业务组织下的组织可以使用,其他业务组织需要分配后才能使用;
3.单据
选择单据模板:
4.权限项
4.1 创建:
先建二开父节点的权限项,根据实际情况选择父节点(不同的父节点,再分配权限时位置也不一样),操作类型建议选读,不勾选是否叶子,顺序号建议在当前节点是唯一,其他信息不用填写。
再新建叶子节点的权限项(可能有多个),此时父节点选择上面新建的父节点权限项,根据实际需求选择不同的操作类型,勾选叶子节点。
在URL信息页签那些新增行, 选择视图,选择方法(视图上的按钮名称),要是方法里面没有二开的按钮,那就顺便选择一个方法,然后自动会生成URL,点击保存。然后将自动生成URL修改成method=二开的按钮名称即可。
4.2 分配权限
管理员登录客户端,【应用中心】-【用户管理】-【分配权限】找到二开父节点的权限项里面的分节点的所在位置。
4.3 部署:
管理员登录系统,在【权限项】-【脚本导入导入】-【导入】/【导出】。
5.菜单
5.1 简介
表名 | 菜单级别 |
t_bs_servicecategory | 一级菜单 |
t_bs_servicesubcategory | 二级菜单 |
t_bs_service | 三级菜单 |
5.2 挂菜单
在 二级菜单配置 下,点击 创建 按钮 ,参考页面如下图所示。将新建的 二级菜单 挂在 一级菜单 上,注意在一个二级菜单内的顺序号不能重复,避免每次部署菜单卡片都打乱。保证只要顺序号不重复,随便命名。
5.3 部署
三级菜单可用管理员登录系统,在【三级菜单配置】-【脚本导入导入】-【导入】/【导出】即可。一级和二级菜单可以直接在要部署的环境上新建菜单或者执行插入的SQL语句。有时候,将新的二级和三级菜单一起部署到其他环境,有可能会出现,二级菜单里面没有选择到一级菜单,导致报错或者权限项没生效的情况,这时需要在对应的二级菜单里面手动选择一级菜单即可。
PS: 挂上去的菜单要是更换了 权限项 的话 要重新分配权限才能看得到。
6.视图配置JS
6.1 视图里面的常量:
${appPath} = D:\Kingdee\eas\server\deploy\easweb.ear\shr_web.war\addon
6.2 js文件存放的位置:
eas\server\deploy\easweb.ear\shr_web.war\addon\customer,然后在这里面建文件夹,文件夹以Ext结尾,然后这里就是存放js文件的位置。如果需求太多的话,按模块来划分。在具体的模块里面再新建js。
6.3 在视图配置js:
步骤:用管理员登录系统,利用uipk查找视图,然后找到对应的视图,进入xml,填好js的文件路径,需要扩展JS的话,在二开的JS里面继承视图上原有jsClass name(即标准的js),然后自定义一个jsClass name,并在视图上将自定义的jsClass name配置到视图上,并将二开的JS配置到视图上面。
注意:在customer目录下面的都是二开的。 在工作目录下更改了js记得要及时把部署到服务器的路径下,前端没刷新JS的话,打开F12,找到对应的JS,,然后刷新页面。视图上配置Js的前后顺序就是js的加载顺序。
6.4调试
1、前端调试:
在URL里面加上debug=true即可
7.控件
7.1 组件类型
类型 | 操作 |
F7 | shrPromptBox |
文本 | shrTextField |
下拉框 | shrSelect |
复选框 | shrCheckbox |
按钮 | shrButton |
日期组件 (年、月、年月日) | shrDatePicker |
时间组件 (年、年月、年月日、年月日时分) | shrDateTimePicker |
7.2 控件操作
获取组件:
$("控件id");
获取组件的值:
$("控件id").控件类型('getValue');
设置组件的值:
$("控件id").控件类型('setValue','给控件赋值的内容');
文本赋值:
_self.getField("控件名称").shrTextField("setValue", "");
F7赋值:
$('#字段ID').shrPromptBox('setValue',{name:"",id:"",number:""})
设置组件为可用或不可用:
方法一:通过id来绑定控件
$('#控件的id').shrTextField('disable');//或者设为enable
或者
$('#控件的id').attr("disabled",true).addClass("disabled");//或者设为enable
方法二:通过name来绑定控件
$("input[name='控件名称']").shrPromptBox('disabled');//或者设为enable
说明: sHR的前端js和Jquery的用法是基本相同的。
8.服务器端的照片路径
有时候会出现视图上少了一些照片,导致布尔类型的控件显示不了框。
9.数据查找
9.1.找数据库里面的表:
首先,用管理员登录系统,在对应的页面上,找到uipk,然后去视图里面查询uipk。再去前端页面进行debug调试,然后清空控制台,在network下面的name里面的Request URL里面找到uipk,然后用管理员身份登录,在视图页面查找uipk,打开xml,里面的模型即为要查找实体名称,再从实体里面找到表名。
9.2.查找info对象:
先从后台获取到fid,然后去查询分析器里面先通过uuid查找表名,再去查询uuid,找到对应的entity,若该enetity里面的对应表对象和数据库的表名一致,则该info对象即为目标Info对象。
用uipk在视图里面查找到扩展视图(不用点进去xml),左面的jsclass为页面的js样式,handler为对应的java代码。
9.3.查看DEP对应的表:
第一步:利用uipk找到对应的视图,选中框,如下图所示
第二步:查看视频内的数据来源
或者是
第三步:去寻找对应的元数据,entity下定位到别名,然后再到动态扩展平台高级版上搜索
对应的别名,搜索结果即为DEP的名称。
10.后台常见方法
方法名称 | 触发时机 |
afterCreateNewModel afterInitModel | 初始化设置默认值 |
saveAction | 保存时执行方法 |
beforeSave | 点击保存按钮前进入的方法 |
beforeSubmit | 点击提交按钮前进入的方法 |
verifyModel | 数据检验,点击保存按钮后,会进入该方法 |
getSelectors | 页面初始化,带出F7除了id和name的其它属性 |
PS:抛出异常
throw new SHRWebException(e.getMessage(), e);
注意: 在此时用EAS的方式抛出异常或者用MsgBox的方式可能在此处并不适用。
11.查看视图的编辑状态
shr.getCurrentViewPage().operateState
或者
hr.getUrlRequestParam('method');
有三种状态: VIEW、ADDNEW、EDIT。注意大小写问题,两种不同的方法拿到状态的大小值是不一样的。
12.列表视图增加过滤条件
在对应的F7列表视图的xml里面加上如下代代码
<domain>
<![CDATA[
[
('&',
('你的属性名','=','你的属性值')
)
]
]]>
</domain>
或者直接在下面的地方增加条件
eg:列表视图只显示当前用户的数据
[ ('&', ('submitter.id','=','$CurrentPersonFilter') ) ]
13.启动集群
在服务器上手动启动集群的话采用如下的方式去启用:
14.显示字段属性
F7字段显示编码:
直接在XML加上这个属性
displayFormat="number"
或者下面的地方填写
PS:F7视图需要加上这两个属性
isHRBaseItem="true" bizFilterFields="需要绑定的F7字段"
15.自定义函数
函数类型相当于将新建的核算函数放到选定的类型下面,返回值类型基本上都是选择数据型,参数列表就是后台方法的参数 。
部署时,要将二开的类加到eas\server\lib\server\eas下面的shr_compensation-server.jar里面。
16.值改变事件
16.1 F7:
$("#控件ID").shrPromptBox("option", {
onchange : function(e,value) {
var type = value.current;
.......
}
})
shr("input[name='控件名称']").shrPromptBox("option", {
onchange: function (e, value) {
......
}
})
16.2 分录
BringPersonName: function () {
var self = this;
var grid = waf("#entrys");
grid.wafGrid("option", {
afterSaveCell: function (rowid, cellname, value, iRow, iCol) {
//列名
if (cellname == "person") {
var personName = value.name;
var person = rowid + "_personName";
//赋值
$("#entrys").jqGrid('setRowData', $("#entrys").getRowId(rowid), {
personName: personName
});
}
}
});
},
16.3 日期
bornDayChangeEvent: function () {
var that = this;
that.getField("birthday").on("change", function () {
var bornDay = that.getFieldValue("birthday");
that.checkConstellationAndZodiac(bornDay);
});
},
17.提示框
shr.showError({
message: '提示的内容'
});
shr.showInfo({
message: '提示的内容'
});
shr.showWarning({
message: '提示的内容
});
18.常用代码
// 获取表格选中行的id
var rowId = waf("#grid").wafGrid("getSelectedRows");
// 获取选中行的数据
$('#grid').jqGrid('getRowRealData', rowId);
// 获取组织架构树
var value = $("#treeNavigation").shrGridNavigation('getValue');
// 获取选中行
this.getSelectedIds();
调用后台:
shr.callHandler({
handler: '类全路径名称',
action: '类方法名称',
type: "GET",
param: {
参数: 传参
},
async: false,
success: function (data) {
.......
}
}
})
19.监控器
http://localhost:6888/shr/ces.jsp
20.员工自助新增常用入口
在server\deploy\easweb.ear\shr_web.war\addon\perself\web\webviews\biz\homepage\base\template\commonFunctions.html里面新增一个a标签
21.改造OSF
用管理员登录系统,进去【OSF配置信息】,禁用目标OSF,新增一个新的OSF配置信息,将原来的OSF配置信息全部复制过来(除了编码),然后将原来配置里面的class替换成二开类的全类路径名,启用二开的OSF配置信息。部署的时候,然后找到原来OSF配置信息里面对应的类在哪个jar包里面,然后二开的类放到jar包里面,并将jar包部署到测试环境上。
22.操作日志
查看表t_hr_AtS_billdatalog即可。