休假申请(下)

系统启动后,访问应用,系统提示你需要登录。输入默认的系统管理员用户名和密码admin,lingdot。登录后,你将看到metawork系统管理的主界面。

1 实体操作配置

展开节点"实体元数据->休假申请",点击唯一的子结点"休假申请"。然后在右边出现的几个Tab页中,选择"操作"Tab页。按照文档最开始的业务分析图上所展示的结果,休假申请这个实体需要有四个操作:列表、编辑、审核、查看。

1.1 列表

点击新建按钮,如下填写:

属性名 备注
名称 列表 中文名称
别名 list 操作标识
方法
<?xml version="1.0" encoding="UTF-8"?>
     <MethodConfig>
          <method name="list" default="true"/>
     </MethodConfig>
填写别名后,方法会自动生成,不需要修改
操作规则 勾选"审批结果、审批人、审批人->名字、请假时间、编号、提出人、提出人->名字 其中箭头代表下级节点

之后点击保存。这个操作配置的含义是在列表操作调用Action中指定的list方法,并且页面显示我们所指定的列。另外,list(以及edit、view、exportExcel等)是一个特殊的操作别名,如果我们不新增这样的操作,那么系统在需要的时候会调用同样采用了这些别名的通用操作(系统管理员点击"通用操作"可以看到这些通用操作)。例如现在我们不建立这个列表操作,那么将来在展现休假申请列表的时候就会采用别名为list的通用操作。通用操作有一般来说普适的操作规则,例如通用列表操作的规则是列出实体的简单属性(也就是不包括那些关联实体的属性,例如休假申请的提出人将不会在列表中显示)。

1.2 编辑

然后我们以同样的方法建立编辑操作,按照需求,这个操作会在普通职员提出休假申请的时候被使用:

属性名 备注
名称 编辑 中文名称
别名 edit 操作标识
方法
<?xml version="1.0" encoding="UTF-8"?>
     <MethodConfig>
          <method name="edit" type="GET" default="true"/>
          <method name="save" type="POST"/>
          <method name="delete" type="DELETE"/>
     </MethodConfig>
这一段可以在通用操作里的通用编辑操作中看到,完全一样
操作规则 勾选"提出时间、请假时间、请假缘由、编号、提出人、提出人->编号、提出人->名称、审核人、审核人->编号"  

我们实现了一定程度的表单控制,例如操作用metawork风格写出来的表单中,操作规则里面没有勾选的属性将会被自动隐藏。

最后,根据需求设定,职员提出申请的时候申请人应该就是自己,于是在操作规则上我们需要为提出人->编号设置一个默认值。选中提出人->编号节点,点击下面的节点属性按钮,然后在出现的对话框中,点击新建按钮,在新出现的配置行中,填写属性名为default,值为%{#session.currentUser.id}。最后采用相同的方式,给提出人->名称节点也增加一个default属性,值为%{#session.currentUser.name}。含义很明显,是让这两个属性的初始值设置为当前用户的编号和名字。

然后保存这个操作。

1.3 审核

然后以同样的方法建立审核操作,这个操作将在审核人员打开休假申请的时候使用:

属性名 备注
名称 审核 中文名称
别名 check 操作标识
方法
<?xml version="1.0" encoding="UTF-8"?>
     <MethodConfig>
          <method name="edit" type="GET" default="true"/>
          <method name="save" type="POST"/>
          <method name="delete" type="DELETE"/>
     </MethodConfig>
这一段可以在通用操作里的通用编辑操作中看到,完全一样
操作规则 勾选所有的第一级节点,以及提出人->名称节点,审批人->编号节点  

在审核的时候,审核人员应该不可以修改提出人填写休假申请信息,所以:用Ctrl键选中"提出时间、请假时间、请假缘由、提出人、提出人->名称"节点,然后点击"设置属性"按钮,属性名称写readOnly,值写true。然后保存这个操作。

1.4 查看

最后以同样的方法建立查看操作,按照需求,这个操作将在普通职员打开已经提交的休假申请的时候使用:

属性名 备注
名称 查看 中文名称
别名 view 操作标识
方法 <?xml version="1.0" encoding="UTF-8"?><MethodConfig><method name="view" default="true"/></MethodConfig> 填写别名后,方法会自动生成
操作规则 勾选所有的第一级节点,以及提出人->名称节点,审批人->编号节点  

在查看休假申请的时候,我们需要将这些属性全部设置为只读。按着Ctrl键选中全部已经勾选的节点,然后点击"设置属性"按钮,属性名称写readOnly,值写true。然后保存这个操作。

经过以上过程我们建立了所有需要的操作规则。

2 功能

然后,点击功能Tab页,我们来建立功能。

2.1 休假申请功能

在列表中可以看到系统中已经默认加入了一个叫做application的功能,我们设定这是普通职员在管理自己的休假申请的时候使用的功能。打开他,我们需要修改一下属性:

属性名 备注
名称 休假申请审核 中文名称
别名 check 功能标识
默认操作 休假申请-列表 含义是如果用户使用这个功能而没指定使用什么操作的时候,则采用这个操作
允许操作 休假申请-列表、休假申请-查看、休假申请-编辑  
数据范围
<?xml version="1.0" encoding="UTF-8"?>
<conditions>
     <field name="user.id" operator="eq" 
            value="${currentUser}.id"/>
</conditions>
含义是使用这个功能只能处理提出人是当前用户的休假申请

2.2 审核

保存上面的休假申请功能后,然后我们新建另外一个功能,也就是审核人员所使用的功能:

属性名 备注
名称 休假申请审核 中文名称
别名 check 功能标识
默认操作 休假申请-列表  
允许操作 休假申请-列表、休假申请-查看、休假申请-审核  
数据范围
<?xml version="1.0" encoding="UTF-8"?>
<conditions>
     <field name="user.id" operator="eq"
            value="${currentUser}.id"/>
</conditions>
含义是使用这个功能只能处理审核人是当前用户的休假申请

3 视图

功能建立好之后,我们来配置视图。

3.1 编辑视图

点击视图Tab页,点击新建按钮,新建一个视图配置:

属性名 备注
实体类型 休假申请  
操作 休假申请-编辑  
名称 类型 休假申请编辑视图
类型 JSP 视图类型
描述符 /vocation/application-edit.jsp 页面位置
视图数据
<?xml version="1.0" encoding="UTF-8"?>
<viewdata>
     <data id="checkers" function="user">
          <conditions>
               <field name="organization.fullName"
                      operator="like" value="好梦一日游公司"/>
          </conditions>
     </data>
</viewdata>
视图数据就是在视图中需要用到的数据,
例如这里定义一个数据为checkers,含义
是好梦一日游公司的人员,在视图中,就
可以用viewData.checkers来引用,例如
application-edit.jsp中的
entity.checker.id的list属性

3.2 审核视图

保存后,再次点击新建,建立审核视图:

属性名 备注
实体类型 休假申请  
操作 休假申请-审核  
名称 类型 休假申请审核视图
类型 JSP 视图类型
描述符 /vocation/application-edit.jsp 页面位置
数据范围
<?xml version="1.0" encoding="UTF-8"?>
<viewdata>
     <data id="checkers" function="user">
          <conditions>
               <field name="organization.fullName"
                      operator="like" value="好梦一日游公司"/>
          </conditions>
     </data>
</viewdata>
 

3.1 查看视图

保存后,再次点击新建,建立查看视图:

属性名 备注
实体类型 休假申请  
操作 休假申请-查看  
名称 类型 休假申请查看视图
类型 JSP 视图类型
描述符 /vocation/application-edit.jsp 页面位置
数据范围
<?xml version="1.0" encoding="UTF-8"?>
<viewdata>
     <data id="checkers" function="user">
          <conditions>
               <field name="organization.fullName"
                      operator="like" value="好梦一日游公司"/>
          </conditions>
     </data>
</viewdata>
 

如果不针对一个操作建立视图配置,那么默认会使用实体元数据的folder属性指定的目录下的"实体别名-操作别名.jsp"文件。

4 机构

视图建立好之后,我们开始维护行为主题:机构、角色、人员。

点击左边的组织机构节点,新建一个机构,名称为"好梦一日游公司",保存之。然后展开组织机构节点,点击出现的"好梦一日游公司"子结点(如果没有,那么可以点击一下刷新节点树的按钮,或者重新登录)。右边的工作区终会出现人员、角色、子机构等Tab页。点击子机构Tab页,然后用同样的方法增加"忽悠部"、"善后部"两个子机构。

5 角色

点击角色Tab页。

5.1 普通职员角色

新建第一个角色,名称为普通职员,别名为ROLE_HM_MEMBER,序号为1。选中根节点,然后点击新增按钮,添加一个节点,名称为"休假申请",然后选中该节点,点击节点属性按钮,在出现的属性对话框中,增加一项属性配置,名称为function,值为application。含义是点击这个节点的时候使用application功能。保存。

5.2 领导角色

新建第二个角色,名称为领导,别名为ROLE_HM_LEADER,序号为2。选中根节点,然后点击新增按钮,添加一个节点,名称为"休假申请审核",然后选中该节点,点击节点属性按钮,在出现的属性对话框中,增加一项属性配置,名称为function,值为check。含义是点击这个节点的时候使用check功能,再增加一个属性配置,名称为groupBy,值为checkResult,含义是按照审核结果分组显示休假申请。保存。

6 人员

下面我们来增加人员。

点击好梦一日游公司的人员Tab页,新增一个人员,名字为尤优,登录名为youyou,密码为lingdot。然后保存。刷新人员列表后,选中新出现的尤优条目,点击维护角色按钮,再出来的页面中,给尤优赋予领导和全体人员两个角色。保存后再回到人员Tab页,打开尤优,点击"同步节点树"按钮,于是可以看到领导和全体人员两个角色的节点被同步到了尤优的节点树上。点击保存。

以同样的方法在忽悠部中添加一个人员,名字为大忽悠,登录名dahuyou,密码lingdot。然后保存。之后维护其角色,赋予全体人员和普通职员两个角色,然后同样同步该人员的节点树并保存。

7 在列表中根据不同功能使用不同操作

最后,为了实现不同状态的休假申请再打开的时候,使用不同的操作,我们需要写一个application-list.js,放在vocation/script目录下。在休假申请的列表页面,会自动载入实体folder配置指定的目录下的script子目录下的"实体别名-操作别名.js"这样一个文件。文件内容如下:

metawork.listConfig.add("initTools",function(tools){
	tools.removeKey("delete");
	if(metawork.functionAlias=="check"){//如果当期那功能是审核
		tools.removeKey("new");
		tools.removeKey("open");
		tools.removeKey("copy");
		
		tools.insert(0,"open",{
			text: '打开',
			handler : checkOrView  //打开按钮调用checkOrView方法
		});
	}
	else{//如果当前功能是application
		
		tools.removeKey("open");
		
		tools.insert(1,"open",{
			text: '打开',
			handler : editOrView
		});
	}
});

//双击某一行的时候,同样进行功能判断
metawork.listConfig.add("rowDBClickHandler",function(grid){
	if(metawork.functionAlias=="check")
		checkOrView();
	else if(metawork.functionAlias=="application")
		editOrView();	
});

//如果审核状态为"待审核",那么调用审核操作,否则调用查看操作
function checkOrView(){
	var selected = metawork.grid.getSelectionModel().getSelected();
	if(selected==null){
		Ext.Msg.alert("错误","请选择申请!");
		return;
	}
	var id = selected.get("id");
	if(selected.get("checkResult")=="待审核")
		parent.addTab(metawork.contextPath + "/check/check.xhtml?id=" + id, "休假申请",true,"check-" + id);
	else
		parent.addTab(metawork.contextPath + "/check/view.xhtml?id=" + id, "休假申请",true,"edit-" + id);
}

//如果审核人为空,则调用编辑操作,否则调用查看操作
function editOrView(){
	var selected = metawork.grid.getSelectionModel().getSelected();
	if(selected==null){
		Ext.Msg.alert("错误","请选择申请!");
		return;
	}
	var id = selected.get("id");
	var checker = selected.get("checker.name");
	if(checker == "")
		parent.addTab(metawork.contextPath + "/application/edit.xhtml?id=" + id, "休假申请",true,"edit-" + id);
	else
		parent.addTab(metawork.contextPath + "/application/view.xhtml?id=" + id, "休假申请",true,"edit-" + id);
}

最终实现了如下功能:

对于普通职员,使用application功能的时候,如果没填写过审核人,那么一直可以编辑休假申请,如果填写了审核人,那么就只能查看了。
对于领导,使用check功能的时候,如果审核结果是待审核,那么可以执行审核操作,如果审核结果不是待审核,那么也只能查看了。

到这里,所有的开发、配置工作完成了。你可以使用dahuyou以及youyou账户登录,体验一下系统了。

8.总结

//TODO 总结...

团队
Group: Lingdot
Allan Zhang (allanz)
guyan6644@163.com
Jonney Xian (jonney)
jonney_82@163.com
刘 洛麒 (llq667)
llq667@gmail.com
孙 海龙 (sunhl)
sunny.hl@163.com
宋颂 (ssong)
ss0070@163.com
张盈盈 (zyy200411)
04281118@bjtu.edu.cn
牛 俊力 (niujl)
05272140@bjtu.edu.cn
胡文锦 (cattyjin)
07122053@bjtu.edu.cn
苏 哲 (billy)
mvpierce34@gmail.com

标签

 
(没有)