详细设计文档.docx
《详细设计文档.docx》由会员分享,可在线阅读,更多相关《详细设计文档.docx(31页珍藏版)》请在冰豆网上搜索。
详细设计文档
详细设计文档
文档编号V1.0版本密级
研发生产中心项目名称报表审批发布功能
项目来源
报表审批发布功能
详细设计说明书
2011-03-26编写:
范屹日期:
检查:
日期:
审核:
日期:
批准:
日期:
版权所有不得复制
文档变更记录
序号变更(+/-)说明作者版本号日期批准1新建文档范屹V1.02011-03-262
1.引言..............................................................................................................................................4
1.1编写目的和范围................................................................................................................4
1.2术语表................................................................................................................................4
1.3使用的文字处理和绘图工具............................................................................................4
1.4定义....................................................................................................................................4
1.5BI系统总体架构(基于已有的BI系统上进行开发)..................................................4
2.模块设计......................................................................................................................................6
2.1用例图................................................................................................................................6
2.2功能设计说明....................................................................................................................83.数据库设计................................................................................................................................30
......................................................................................................303.1表................................
3.2视图..................................................................................................................................32
4.系统出错处理............................................................................................................................34
1.引言
1.1编写目的和范围
企业内部的各类报表指标为是需要上报给上级领导进行查看,企业的掌舵者对企业将来发展的决策都是根据这些报表指标来进行的,尤其是企业内部的财务和资金数据更不能有一丝一毫的偏差。
因此这些指标数据如果发生错误,将会对企业将来的发展造成很大影响,所
以对于此类数据,需要通过层层审批、确认正确后才能进行展示。
本详细设计说明书编写的目的是说明程序模块的设计考虑,包括程序描述、输入/输出、
算法和流程逻辑等,为软件编程和系统维护提供基础。
本说明书的预期读者为系统设计人员、
软件开发人员、软件测试人员和项目评审人员。
1.2术语表
序号术语或缩略语说明性定义
1DW数据仓库(DataWarehouse)
2BI商业智能(BusinessIntelligence)
1.3使用的文字处理和绘图工具
文字处理软件:
WPSOffice2010
绘图工具:
Visio
1.4定义
AJAX:
AJAX即“AsynchronousJavaScriptandXML”(异步JavaScript和XML),AJAX并
JesseJamesGaiiett创造的名词,是指一种创建交互式网页应用的网页开非缩写词,而是由
发技术。
1.5BI系统总体架构(个人对BI系统理解)
2.模块设计
2.1用例图
2.2报表指标管理处理流程图
2.3审核操作处理流程图
2.4功能设计说明
用例名称:
查看报表模块
用例标识号:
101
参与者:
操作人员
简要说明:
操作人员在相关主题树状菜单中选择需要查看的报表
前置条件:
操作人员已经成功登录M1BI系统。
基本事件流:
1(操作人员鼠标点击某主题树形菜单中的报表
2(如果报表审核能过,则可以正常显示
3(如果报表未能被审核能过,则不会显示报表,且显示提示信息
4(用例终止
其他事件流A1:
异常事件流:
后置条件:
操作人员可以查看所需要的报表
主要程序代码清单:
清单1:
是否有特权可以访问报表
privatebooleanisExtraPrivilege(TreeNodenode,TDmGyUserUser)throwsException{
//获取报表负责人所在的单位因为不通过报表数据的维度来看这个问题而是通过报表对象来看这个问题
StringgnDm=this.pzgl.getReportUserOrg(node.getNodeid());
//取出当前登录用户所在的组织和节点信息
UserOrgMappingmapping=this.pzgl.getOrgMappingByUser(User.getMc());
if(mapping!
=null){
//如果当前的登录用户是报表负责人的上级,则也可以查看此报表
if(isMyBoss(mapping.getGnDm(),gnDm)){
returntrue;
}else{
//如果当前查看用户(或者是登录用户)已经被授过权了,则也能查看些报表
ListmatchUsers=
this.pzgl.getCanViewThisReportUsers(node.getNodeid());
if(matchUsers.contains(User.getMc())){
returntrue;
}else{
returnfalse;
}
}
}else{
returnfalse;
}
}
清单2:
判断是否能显示报
publicbooleancanDisplayReport(TreeNodenode)throwsException{
intcount=0;
//判断当前报表是下属子公司是否都已经审核发布完成
count=this.pzgl.countNotPubAudit(node.getNodeid());
if(count>0){
returnfalse;
}else{
//判断当前报表是否存在一个指标,此指标也同时存在于其它未发布的报表中的
count=this.pzgl.countNotPubWithIndex(node.getNodeid());
if(count>0){
returnfalse;
}else{
//判断是否当前报表中的指标是否都被审核过了
count=this.pzgl.countReportNotAudit(node.getNodeid());
if(count>0){
returnfalse;
}else{
//判断当前报表中是否还有没有审核通过的指标
count=this.pzgl.countReportIndexNotAudit(node.getNodeid());
if(count>0){
returnfalse;
}else{
returntrue;
}
}
}
}
}
清单3:
通过回逆的方法,判断当前登录用户是不是报表创建者的组织的上级
如果是就返回true,如果不是就返回false
publicbooleanisMyBoss(Stringmy,Stringcomparator)throwsException{
OrgInfoinfo=this.pzgl.getOrgInfo(comparator);
if(my.trim().equals(info.getSjgnDm().trim())){
returntrue;
}else{
if("0".equals(info.getSjgnDm().trim())){
returnfalse;
}else{
returnisMyBoss(my,info.getSjgnDm());
}
}
}
用例名称:
报表展现页面审核操作
用例标识号:
102
参与者:
操作人员
简要说明:
在报表展现页面内提供页面的审核操作
由于目前存在上级公司可以查看下级公司的未审核通过的报表,或者授过权的用户也可以直接查看未经审核的报表。
前置条件:
操作人员已经成功登录M1BI系统。
查看的报表,报表本身及内部指标必须经过审核
如果未能通过审核,当且仅当登录用户必须属于上级公司人员或者已授权用户才能正常访问报表
基本事件流:
1(如果是已经发布的报表,可以点击报表顶部的反发布按钮
2(点击“反发布”按钮后,则报表进入待审核状态,则报表顶部会出现当然的报表状态,以及“审核”,“打回”二个操作按钮
3(当点击“审核”操作按钮,则报表状态变更为已审核,则会出现“发布”及“反审核”操作按钮
4(点击"反审核"后,报表状态变更为待审核状态,页面可参照第2步骤
5、点击“发布”按钮后,报表状态变更为发布状态,页面可参照第1步骤
6、接第2步骤,如果点击“打回”操作按钮,则报表状态变更为未审核状态,页面会出现“审核”操作按钮
其他事件流A1:
状态变更图:
后置条件:
如果进行报表展现页面审核操作后
如果报表状态为发布,则操作人员可以正常访问报表
如果未能通过审核,当且仅当登录用户必须属于上级公司人员或者已授权用户才能查看报表,
反之不能正常访问报表
主要程序代码清单:
清单1:
AJAX调用的js方法,处理页面展现时的审核操作
functionhandlerAudit(userid,nodeid,operation){
//alert(operation);
varreturnValue=xmlhttpsend("${appPath}/changeAuditStatus.action","&NodeID="+
nodeid+"&operation="+operation);
varstr="";
varbuttonStr="";
if(returnValue!
=null&&returnValue!
=""){
if(returnValue=="1"){
str+="未审批";
buttonStr+="onclick=\"javascript:
handlerAudit('"+
userid+"','"+nodeid+"','audit');\"/>";
}elseif(returnValue=="2"){
str+="待审批";
buttonStr+="onclick=\"javascript:
handlerAudit('"+
userid+"','"+nodeid+"','tbd');\"/>";
buttonStr+="onclick=\"javascript:
handlerAudit('"+
userid+"','"+nodeid+"','audit');\"/>";
}elseif(returnValue=="3"){
str+="已审批";
buttonStr+="onclick=\"javascript:
handlerAudit('"+
userid+"','"+nodeid+"','publish');\"/>";
buttonStr+="核onclick=\"javascript:
handlerAudit('"+
userid+"','"+nodeid+"','reverseAudit');\"/>";
}elseif(returnValue=="4"){
str+="已发布";
buttonStr+="布onclick=\"javascript:
handlerAudit('"+
userid+"','"+nodeid+"','reversePublish');\"/>";
}else{
str+="审批操作有误";
}
document.getElementById("ajaxHandlerResult").innerHTML=str;
document.getElementById("ajaxTakeIn").innerHTML=buttonStr;
}
清单2:
报表审核状态的枚举类
publicenumReportAuditStatus{
NOAUDIT("1"),//未审核
WAITAUDIT("2"),//待审核
AUDITED("3"),//审核过
PUBLISHED("4");//发布
privateStringvalue;
privateReportAuditStatus(Stringvalue){
this.value=value;
}
publicStringgetValue(){
returnvalue;
}
}
用例名称:
报表数据组织检索(审核管理)用例标识号:
103
参与者:
操作人员
简要说明:
每个报表下面存在着多个不同的数据组织,我们需要根据状态及数据组织名称(也就是公司
名称)进行检查
前置条件:
操作人员已经成功登录M1BI系统,且必须有审核管理权限
基本事件流:
1(点击“系统管理”下面的“审核管理”菜单项
2(然后选择右边的树状菜单项中的具体报表
3(在右边的查询页面,选则过滤条件,然后点击查询按钮,然后会出现查询结果。
查询字段
中会出现“审批公司”,“状态”信息项以及操作铵钮s
4(用例终止
其他事件流A1:
异常事件流:
后置条件:
操作人员可以查看所需要的报表数据组织
主要程序代码清单:
清单1:
审核管理页面查询
publicStringshglQuery()throwsException{
//公共属性start
ActionContextctx=ActionContext.getContext();
HttpServletRequestrequest=
(HttpServletRequest)ctx.get(ServletActionContext.HTTP_REQUEST);
HttpSessionsession=request.getSession();
TDmGyUserusers=(TDmGyUser)session.getAttribute(USER);
HttpServletResponseresponse=
(HttpServletResponse)ctx.get(ServletActionContext.HTTP_RESPONSE);
//end
//审核状态
Stringstatus=request.getParameter("status");
//报表中文名称
StringText=request.getParameter("Text");
//审核公司名称
Stringcompany=request.getParameter("company");
//报表节点ID
StringNodeID=request.getParameter("NodeID");
//如果报表节点ID不存在,则直接返回
if(StringUtils.isBlank(NodeID)){
return"";
}
Listlist=pzgl.getAuditUnit(NodeID,status,company);
if(list!
=null&&!
list.isEmpty()){
UserOrgMappingmapping=this.pzgl.getOrgMappingByUser(users.getMc());
for(intindex=0;indexShglshgl=(Shgl)list.get(index);
if(mapping.getGnDm().equals(shgl.getJgDm())){
shgl.setCanDisplay(true);
}else{
if(isMyBoss(mapping.getGnDm(),shgl.getJgDm())){
shgl.setCanDisplay(true);
}else{
shgl.setCanDisplay(false);
}
}
}
}
request.setAttribute("auditJgList",list);
request.setAttribute("Text",Text);
request.setAttribute("NodeID",NodeID);
request.setAttribute("company",company);
request.setAttribute("status",status);
return"suc";
}
用例名称:
报表数据组织审核(审核管理)
用例标识号:
104
参与者:
操作人员
简要说明:
操作人员可以对报表下面的数据组织进行审核操作前置条件:
操作人员已经成功登录M1BI系统,且必须有审核管理权限报表下面的数据组织只能由组织对应岗位人员进行审核操作基本事件流:
1(接用例103,当然用户属于物产集团下岗位,则可以对物产集团数据进行审核,目前物产
集团数据当前状态为未审核。
2(如果点击通过按钮后,则页面相应变更,而且查询结果会聚集到物产集团数据上,方便操
作人员查看
3(如果点击发布操作按钮,则页面变更为
4(具体操作可以参照用例202.
5、用例结束
其他事件流A1:
异常事件流:
后置条件:
主要程序代码清单:
清单1:
是否有特权可以访问报表
publicvoidgetAjaxInfo()throwsException{
//公共属性start
ActionContextctx=ActionContext.getContext();
HttpServletRequestrequest=
(HttpServletRequest)ctx.get(ServletActionContext.HTTP_REQUEST);
HttpServletResponseresponse=
(HttpServletResponse)ctx.get(ServletActionContext.HTTP_RESPONSE);
//end
StringappPath=(String)request.getSession().getAttribute("appPath");
if(appPath==null){
appPath="/M1BI";
}
response.setCharacterEncoding("utf-8");
response.setContentType("text/xml");
response.setHeader("Cache-Control","no-cache");
TDmGyUserUser=(TDmGyUser)request.getSession().getAttribute("USER");
Stringuserid=User.ge