模版 实验三 详细设计
课程 |
班级 |
学 号 |
姓 名 |
实验时间 |
软件工程导论 |
12电信2 |
12416430 |
吴明 |
2013.00.00 |
软件工程实验报告 三
一、实验名称
系统详细设计
二、实验目的
根据需求分析、概要设计,完成系统的详细设计
三、实验主要内容
详细设计的主要任务是设计每个模块的实现算法、所需的局部数据结构。详细设计的目标有两个:实现模块功能的算法要逻辑上正确和算法描述要简明易懂。
四、实验原理
1、模块说明。说明该模块需要实现什么功能,还有设计要点。
2、流程逻辑。用流程图说明该模块的处理过程。
3、算法。不一定有,如果涉及一些比较特殊的算法或关键模块,就写一下算法的伪代码或用流程图说明。
4、限制条件。该模块的功能有哪些限制,比如用户ID不能重复,只能查询自己权限范围内的用户。
5、输入项。每个子模块可以看做一个”方法“,我传给你什么,你给我输出什么。比如删除用户,输入项就是用户ID。
6、输出项。删除用户的输出项,就是不能在查询模块里查询到已删除的用户
7、界面设计。用visio或者其他工具画一些界面图
8、需要操作的数据表。
五、实验结果
详细设计
目录
一、数据库设计
二、用户界面设计
三、系统实现.
3.1通用功能类的实现
3.2申报开票模块的实现
四、总结和展望
4.1总结
4.2展望
一、数据库设计
为了实现数据持久化,必须在数据库中建立一些对应特定功能的数据表作为存储。主要有业务存储、编码存储和中间表三类。业务存储主要负责存储各类相关资料,比如纳税人登记表、应缴明细表和打印票据表等等;编码存储主要是存放一些不会变动的业务编码,比如税种编码、税目编码表和操作员编码表;中间表主要是为了整个软件顺利运行并记录运行情况的一些表格,比如流水号、文档号等,以下详细说明主要功能表的基本情况。
1、纳税人登记表(CC_DJ)
纳税人编码:系统自动生成,18位或者15位,保证唯一性
车船类型:按提供类型进行选择
车船号码:由车管所提供,唯一
登记日期:登记时间
状态:0表示停运,1表示注销
此外为了关联各数据表,需要设置外键,本表是基础表,其他数据表使用本表的纳税人编码作为关联字段。
2、注销、停运信息(CC_ZTXX)
文档号:系统自动生成,保持唯一性
纳税人编码:与纳税人登记表保持一致
车船类型:按提供类型进行选择
车船号码:与纳税人登记表保持一致
停运、注销日期:停运或注销时间
是否停运、注销:0表示停运,1表示注销
3、欠税信息(CC_QSXX)
在每月做完会计统计后,未缴纳税款自动转入下月欠税,此表用于保存欠税信息,字段有:纳税人编码、税款所属期、税种编码、税目编码、欠税金额。以后通过本表生成每月欠税信息。某户一个年度内缴费额不会改变。税款所属期表示计算本欠税的所属期,以这个字段为开始日期,每月30日为截止日期。
4、开票信息(CC_KPZB和CC_KPFB)
该表主要保存纳税人的开票信息。主要字段:文档号、文档号序号、纳税人编码、税款所属期、开票日期,税种编码、税目编码、交费车辆开票金额、税票号码等信息。因为支持一张票多行记录,所以设计两张表来实现这项功能,主表保存包括文档号,税票号的表,附表保存每张票的明细数据,两者通过ID这项关联。
PowerDesigner对对象模型和数据库建模两者的支持力度都很高,此外,还支持概念模型、业务模型、需求模型等模型的分析设计。为此,在本项目中,我们使用PowerDesigner进行数据库建模工作,采用先生成概念模型再生成物理模型的办法来操作。
在数据库设计中,我们采用分层设计来实现整体数据库的设计,下面以申报模块流程图(如图3.6)来展现申报模块数据库操作的过程,首先操作员会检查申报车辆是否是新车,如果是则应该转入登记模块修改该纳税人的车辆信息(新增车辆),如果不是则判断纳税人是否重复缴纳,如果重复纳税则不须重复开票,否则判断该车是否欠税,如果欠税则在欠税模块进行开票,如果不欠税则判断该纳税人是否有减免,如果减免则转入减免模块,否则在申报开票模块进行开票。
图3.1 车船使用税征收管理系统申报流程图
图3.2 车船使用税征收管理系统数据库申报征收E-R图
流程图分析完毕以后,就可以根据数据流程图来建立概念模型和物理模型,最后实现整个数据库的建立。概念模型不依赖于具体的计算机系统,他是纯粹反映需求的概念结构。建模是在需求分析结果的基础上展开,常常要对数据进行抽象处理。图3.7是车船使用税征管系统申报模块实现的E-R图,根据该E-R图,可以由PowerDesigner生成具体表以及表与表之间的关系。
二、用户界面设计
本系统的设计思路主要是实用、简便、灵活、稳定。整个系统有完整的组织框架和模块分工,但由于涉及篇幅限制,这里我着重介绍下登记和申报开票模块。因为这两个模块是整个征收管理系统运行的核心模块,包涵了本系统80%的业务功能。对于界面设计我们遵循以下几个原则:
一、控件的位置拖放安排
在绝大多数的程序界面设计中,并不是所有的元素都具有相同的重要性,所以应抓住重点,将较重要的元素定位在对用户来说处在一目了然的位置是非常重要的,可以尝试根据“功能”和“关系”来组成一个逻辑信息组。按照控件在功能上的联系,将它们放在一起,在视觉效果上也要比将它们分散在屏幕的各处要好得多。
二、控件的大小与一致性编排
控件的大小设置是程序设计时经常遇到的问题,虽然操作非常简单,却很难决定控件的大小。合理设置控件的大小以达成一致性是界面设计中的重要问题之一,一致性的外观将体现应用程序的协调性。如果缺乏一致性就会使界面混乱无序,会对用户的使用带来不便。
三、合理利用空间,保持界面的简洁
界面设计最重要的原则就是简洁与明了。对于应用程序而言,如果界面看上去很难,则可能程序使用本身也比较复杂,而在设计时稍稍深入考虑一下,便有助于创建看上去和用起来都很简单的界面。
四、合理利用颜色、图像和显示效果来达成内容与形式的统一
依据许多程序设计人员的经验,应当尽量限制应用程序所用颜色的种类,而且色调也应该保持一致。
我们下面主要从登记和申报开票开始进行介绍,申报开票模块界面如图3.8所示。
图3.3 申报开票界面
本系统中登记和申报开票模块是核心模块,和本系统其他模块有很密切的关联,同时和AHTAX2005征管软件里的票证,登记等模块也关系紧密。这两个模块的设计思路关系到整个系统的基本模型,其他模块很多窗口引用了这两个模块的公共类,其中最频繁使用的就是打印通用模块了。
图3.4树型结构的典型窗口
在大部分窗口中,我们都广泛采用了树型结构的框架图做索引(如图3.9),这样做的目的一方面是将原本很复杂的资料结构化,一目了然的反映实际业务,另一方面操作起来通用性强,便于操作员理解。可是这样做的代价是脚本处理非常麻烦,因为虽然窗口上东西很少,按纽通用,可是实际上不同的对象对同一个按纽的处理办法差异很大,而且树型窗口刷新速度较慢,不适合大量数据的显示。所以,我们将这种结构定义在窗口中的一级构架内,减少树型窗口的数据量。另外,将同一按纽下不同功能尽量定义成类或者存储过程,方便调用,减少脚本量,也提高了响应速度。
三、系统实现
本项目在开发过程中,针对所有包、类、窗口、数据窗口、对象的命名都有明确规定,为了减少工作量,保证程序的一致性,我们建立了多个公共父类(如公共查询父窗口、公共提示窗口、公共编码类数据窗口等),父类对象主要用来实现基本操作和基本功能函数,如在查询父窗口中实现窗口居中、窗口拖动的基本操作,在公共编码类数据窗口中实现按数据列正反排序等功能。本系统中所有控件都是以从父类中继承并添加新代码实现的,同时我们也大量使用了面向对象的新技术,比如后面将要提到的自定义类和用户对象等等。
我们根据用例的设计分别进行了实现,车船税征收管理系统下的大类和用例对应关系分别为:
- cc_main.pbl为整个车船税征收管理系统的主要调用模块实现;
- cc_dj.pbl对应单位车辆登记和个人车辆登记用例的实现;
- cc_sbkp.pbl对应申报开票用例的实现;
- cc_kpgl.pbl对应开票管理的实现,如减免、欠税、汇缴等等;
- cc_zxdj.pbl对应停复业注销、非正常户管理用例的实现;
- cc_dj_rd_xdh.pbl对应纳税人管理用例的实现;
- cc_xtwh.pbl对应数据维护用例的实现;
- cc_cxtj.pbl对应为查询统计用例的实现;
- data_base.pbl、data_base2.pbl、cc_database.pbl对应通用功能类的实现;
由于本系统包含内容很多,不能展现全部实现过程,这里仅拿申报开票模块中代表性较强的通用功能类data_base.pbl、data_base2.pbl、cc_sbkp.pbl和功能相对独立的存储过程展开介绍。
3.1通用功能类的实现
通用功能类主要由data_base.pbl、data_base2.pbl、cc_database.pbl三个子类组成,之所以分成三个类是因为通用功能提供的公共函数、类、程序很多,为了便于管理和识别,按照不同功能和作用范围进行了划分。将新开发和设定的系统通用功能放在了data_base.pbl子类中,将AHTAX2005中保留的系统通用功能整合放在了data_base2.pbl子类中,将申报模块特有的基本通用功能放在了cc_database.pbl子类中。下面就以data_base.pbl子类中uo_datawindow用户对象中部分代码为例展示如何进行代码实现。
string ls_parm, ls_czlx //保存传递的参数 String ls_nsr_swjgbm ls_parm = trim(message.stringparm) ls_czlx = right(ls_parm,4) is_swdjzh = left(ls_parm,len(ls_parm) - 4 ) GF_CKJZ(THIS,'C') //设置窗口居中(按窗口) ls_nsr_swjgbm = gst_qjjgbl.gs_swjgbm is_lrdou = f_swdj_get_xtbl_father(ls_nsr_swjgbm,'KYSL_LRDOU') is_yxqx = f_swdj_get_xtbl_father(ls_nsr_swjgbm,'SWDJ_YXQX') is_swdjzh_len = f_swdj_get_xtbl_father(ls_nsr_swjgbm,'SWDJZH_LEN') If isnull(is_yxqx) Or is_yxqx ='' Then ib_yxqx_cq = False Else ib_yxqx_cq = True End If u_log = create u_swdj_base_ds_dw_log Choose Case ls_czlx case '*cx*' //是查询已有受理数据 is_zt = '0' ib_view = True If wf_retrieve_by_djzh(is_swdjzh) < 0 Then Close(this) case '*xg*' //修改数据 is_zt = '2' ib_view = False If wf_retrieve_by_djzh(is_swdjzh) < 0 Then Close(this) Case Else is_zt = '1' ib_view = False wf_init() //准备新增加受理户,初始化数据 wf_protect_other(ib_view) End choose |
公共类uo_datawindow中权限控制脚本
示例代码一:对于纳税人新增车辆的登记录入,需要在操作员登入窗口的时候进行权限控制,即大厅操作员只可以对本分局所辖纳税人新增车辆,税管员也只可对自己所辖纳税人的车辆信息进行修改,在程序中是根据传入的操作员编码和税管员所属税务机关编码来进行判断。
if sqldbcode = -1 then //Database transaction information not available if messagebox("对不起! 你没有连接数据库","选择<确定>按钮在本窗口立即生效!但需重复上次操作!!~r~r~n若仍有问题请关闭本窗口后重新打开!!!",Exclamation!,OKCancel!,1) = 1 then this.settransobject(sqlca) end if elseif sqldbcode = 2403 then messagebox("客户机(你的电脑)与数据库服务器的字符集不匹配!",sqlerrtext,Exclamation!) else MessageBox("数据窗口错误!",'发生错误的数据窗口:'+this.dataobject+'~r~n'+& '错误代码: ' + string(sqldbcode) + '~r~n'+& '错误信息: ' + String(sqlerrtext) + '~r~n'+& '错误发生的缓冲区: '+string(buffer)+'~r~n'+& '错误发生的行号: '+string(row)) end if return 1 |
公共类uo_datawindow中dberror函数脚本
示例代码二:dberror方法为所有继承自uo_datawindow的数据窗口对象提供数据库连接报错提示,提示信息包括连接数据库失败、客户端和服务器端字符集不匹配等错误提示,提示信息中包括发生错误的数据窗口名、错误代码号、错误提示信息内容、错误发生的缓冲区、错误发生的行号等信息。
3.2申报开票模块的实现
为了更好的说明系统实现,我们以设计部分描述较细致的申报开票子模块为例详细阐述。该子模块主要实现的是税务机关受理纳税人申报开票的处理。在此模块中,可以对纳税人进行申报开票、欠税开票、减免税、开票管理等操作。该模块也是由数据窗口、窗口、自定义用户对象等对象组成,我们以其中cc_sbkp.pbl窗口的实现为例来进行说明。在本模块中实现了纳税人大部分税款缴纳和汇缴的处理,并对纳税人申报开票、欠税、减免等资料进行了分项管理,完成之后可以实现“电脑完税证”、“税收通用缴款书”的套打工作。
long ll_count ,ll_rowcount,ls_pzlx,ls_default_pzbm string ls_pzjc ids_pzbm = create datastore ids_pzbm.dataobject = "dw_sbzs_cpzbm" ids_pzbm.settransobject(sqlca) ids_pzbm.retrieve() ll_rowcount = ids_pzbm.rowcount() ids_pzbm.setsort("pzlb A PZBM A") ids_pzbm.sort() for ll_count = 1 to ll_rowcount ddlb_sp.additem(ids_pzbm.getitemstring(ll_count,"pzjc")) end for if isnull(ls_pzlx) or ls_pzlx = '' then ls_pzlx = '1' end if if ls_pzlx = '1' then ls_default_pzbm = '0302' //通用完税证 else ls_default_pzbm = '0112' //通用缴款书 end if string ls_find long ll_find ls_find = "pzbm = '" + ls_default_pzbm + "'" ll_find = ids_pzbm.find(ls_find,1,ids_pzbm.rowcount()) if ll_find <= 0 then ll_find = 1 end if ddlb_sp.selectitem(ll_find) ddlb_sp.post event selectionchanged(ll_find) |
票证初始化事件
示例代码三:票证初始化,选择默认票证的原则是首先当窗口打开时,会对票证类型数据窗口进行初始化,然后根据税务机关设置的默认票证类型从通用缴款书和通用完税证中确定一个。
四、总结和展望
4.1总结
分析方法与设计模式因需求的不同而多种多样。不同的方法,有的可能带来非常明显的优点,而有的可能带来不利的因素。在本次项目的开发过程中,分析与设计的全阶段均完全采用了UML面向对象的先进建模方法,使系统在遵循面向对象原理与软件工程学的基础上,还具有一些使用其它面向对象方法时所不具备的优点。
本次项目的开发过程分成分析与设计两大部分。前一部分以功能为导向,着重于系统要达到的功能。而后一部分以结构为导向,着重于将业务逻辑抽象为类及其之间的关系,这些业务逻辑所要达到的功能,也正是前一部分分析的结果。分析与设计的各阶段均采用了UML面向对象的建模方法,使整体设计更具系统化、标准化、模块化。使用UML设计出来的管理系统,有很多基于业务逻辑抽象出来的类,具有广泛性的、重用性。采用UML进行设计,结合PowerDesigner进行数据库设计,为车船使用税征管系统开发设计提供了较合理的模式。
车船使用税征管系统的成功上线,解决了目前急需解决的车船税业务覆盖面低,流程不规范的问题,提高了运行效率,加强了监督管理,达到了预期设计目标。但是其C/S架构和市级集中的模式限制了其功能的扩展余地,很多网上业务的开展不得不使用独立的外挂系统进行,造成数据资源无法整合利用;由于力求功能覆盖,各模块之间相对独立,各模块关联不够完善,数据挖掘利用程度不高,所以形成了只有报表没有数据分析的局面。
4.2展望
2010年,安徽省地税局将对地税征管信息系统进行全省大集中改造,并对车船税涉税业务进行整合,这个工程的意义和工作量远远大于本项目,在明年的改造项目中,系统将变更为B/S架构,采用Orcale数据库代替现在的Sybase数据库,采用J2EE技术进行开发。在下次改造中,我们将在以下方面实现突破:
1、实现网上审批、网上申报、网上财务指标采集等网上办税业务,将税库银联网、社保联网完善并融入系统中。
2、将征管软件、内网办公平台、外网平台、各类外挂系统进行重新规划整理,建立以征管平台、办公平台、税管员平台为核心的省级集中系统,将征管、办公、宣传、服务等数据资源进行整合。
3、加强数据分析利用,实现报表自定义生成,实现纳税评估、计算机选案、领导决策分析等功能,使征管系统从征管系统升级为征管加决策型软件系统。
通过本次项目,我们总结了很多利用UML进行项目设计开发的经验,在明年的改造项目中,我们将继续尝试使用UML技术指导软件工程的进展,严格按照设计规范和步骤组织实施,充分发挥J2EE架构的优势,为实现电子税务局奠定基础。
参考文献
[1] 《电子商务系统分析与设计》 清华大学出版社出版
[2] 《UML基础教程》张瑜 清华大学出版社
[3] 《信息系统开发方法教程》 陈佳著 清华大学出版社
[4] 《UML和模式应用》姚淑珍 机械工业出版社
[5] 《UML系统分析设计与应用案例》冀振燕 人民邮电出版社