企业售后服务管理信息系统的设计与应用_第1页
企业售后服务管理信息系统的设计与应用_第2页
企业售后服务管理信息系统的设计与应用_第3页
企业售后服务管理信息系统的设计与应用_第4页
企业售后服务管理信息系统的设计与应用_第5页
已阅读5页,还剩50页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

绪论1.1系统开发背景当今社会,随着企业规模不断扩大,有关服务的各种信息也成倍增长,特别有一些比较大的服务性质的的企业,而面对庞大的信息量,有必要开发一套与之相适应的管理系统来提高管理工作的工作效率。通过这样的系统,可以做到信息规范管理,科学统计和快速查询,从而减少管理方面的工作量。在企业中,尤其是在比较大的企业,对于客户的管理是相当重要的,而且也是相当麻烦的,它是客户的管理中最基本的一项常规性工作。而长期以来,这一类型的管理都是依赖人工进行管理的,这样不仅仅浪费了大量的人力物力,而且由于人力的管理,存在着大量的不可预知性,造成服务信息管理的一些规范,使得信息管理陷入“事倍功半”的地步。1.2系统开发的目的和意义以客户为中心的理念在国外兴起于20世纪五十年代,当时很多企业寄希望于通过改进技术、压缩生产周期、改善内部资源管理来提高生产增长率和利润,但是事实上见效甚微。这样企业开始从强调降低经营成本的供应发展侧率来提高生产需求方策略。所谓需求方策略,就是指与客户联系更密切,从客户关系方面挖掘,企业客户管理系统运营而生。实现和客户相关的各种工作的规范化,系统化和自动化,正是一个客户管理系统的目的和意义所在。1.3系统开发任务客户管理系统是一个按照不同权限呈现不同功能的系统,登录权限的不同可以查看不同的内容。超级管理员:超级管理员可以查看系统所有内容,对客户和用户进行各种工作,可以赋予用户角色,更改角色权限,每个权限对应不同的菜单,可以更改工单查询客户资产,并对基础数据有增删改查权限。用户:用户可以查看部分内容,对客户的呼入的信息保存以及生成派工单等信息,在回访中生成回访单。也可以查询客户资产和以及对派工单的查询以及修改,对基础数据部分有查看权限。

2设计方案论述2.1相关技术基于web客户管理信息系统的设计与开发,整个过程应用到许多技术。例如JSP网页设计、SQLSERVER2008数据库、JAVAEE、JAVASCRIPT等,下面介绍一下该系统实现过程中应用到的相关理论与相关开发技术。2.2JSP网页技术JSP全名为JavaServerPages,中文名叫java服务器页面,其根本是一个简化的Servlet设计,它是由SunMicrosystems公司倡导、许多公司参与一起建立的一种动态网页技术标准。JSP技术有点类似ASP技术,它是在传统的网页HTML(标准通用标记语言的子集)文件(*.htm,*.html)中插入Java程序段(Scriptlet)和JSP标记(tag),从而形成JSP文件,后缀名为(*.jsp)。用JSP开发的Web应用是跨平台的,既能在Linux下运行,也能在其他操作系统上运行。它实现了Html语法中的java扩展(以<%,%>形式)。JSP与Servlet一样,是在服务器端执行的。通常返回给客户端的就是一个HTML文本,因此客户端只要有浏览器就能浏览。JSP技术使用Java编程语言编写类XML的tags和scriptlets,来封装产生动态网页的处理逻辑。网页还能通过tags和scriptlets访问存在于服务端的资源的应用逻辑。JSP将网页逻辑与网页设计的显示分离,支持可重用的基于组件的设计,使基于Web的应用程序的开发变得迅速和容易。JSP(JavaServerPages)是一种动态页面技术,它的主要目的是将表示逻辑从Servlet中分离出来。JavaServlet是JSP的技术基础,而且大型的Web应用程序的开发需要JavaServlet和JSP配合才能完成。JSP具备了Java技术的简单易用,完全的面向对象,具有平台无关性且安全可靠,主要面向因特网的所有特点。2.3基于B/S模式的结构体系的简介B/S结构(Browser/Server,浏览器/服务器模式),是WEB兴起后的一种网络结构模式,WEB浏览器是客户端最主要的应用软件。这种模式统一了客户端,将系统功能实现的核心部分集中到服务端上,简化了系统的开发、维护和使用。客户机上只要安装一个浏览器,如NetscapeNavigator或InternetExplorer,服务器安装SQLserver、Oracle、MYSQL等数据库。浏览器通过WebServer同数据库进行数据交互。由于Client/Server结构存在的种种问题,因此人们又在它原有的基础上提出了一种具有三层模式(3-Tier)的应用系统结构浏览器/服务器(Browser/Server)结构。Browser/Server结构是伴随着因特网的兴起,对Client/Server结构的一种改进。从本质上说,Browser/Server结构也是一种Client/Server结构,它可看作是一种由传统的二层模式Client/Server结构发展而来的三层模式Client/Server结构在Web上应用的特例。Browser/Server结构主要是利用了不断成熟的Web浏览器技术:结合浏览器的多种脚本语言和ActiveX技术,用通用浏览器实现原来需要复杂专用软件才能实现的强大功能,同时节约了开发成本。B/S最大的优点就是可以在任何地方进行操作而不用安装任何专门的软件,只要有一台能上网的电脑就能使用,客户端零安装、零维护。系统的扩展非常容易。B/S结构的使用越来越多,特别是由需求推动了AJAX技术的发展,它的程序也能在客户端电脑上进行部分处理,从而大大的减轻了服务端的负担;并增加了交互性,能进行局部实时刷新。2.4基于JSP技术的三层结构模型“三层结构”一次中的“三层”是指:表现层,中间业务(业务逻辑)层以及数据访问(DAO)层。(1)表现层表现层位于最外层(最上层),即离客户最近,用于显示数据和接收用户输入的数据,为用户提供种交互式操作的界面。(2)中间业务(业务逻辑)层中间业务层负责处理用户输入的信息,或者是将这些信息发送给数据访问层进行保存,也可调用数据访问层中的函数再次读出这些数据。中间业务层中还可以包括一些对“商业逻辑”的描述代码。(3)数据访问(DAO)层数据访问层仅实现对数据的保存和读取操作,数据访问可以访问数据库系统、二进制文件、文本文档和XML文档。三者之间的关系如图2.1所示。数据访问表现层中间业务表现层数据访问中间业务数据依赖方向数值返回方向数据访问表现层中间业务表现层数据访问中间业务图2.1三层结构2.5SQLServer2008SQLServer2008在Microsoft的数据平台上发布,可以组织管理任何数据。可以将结构化、半结构化和非结构化文档的数据直接存储到数据库中。可以对数据进行查询、搜索、同步、报告和分析之类的操作。数据可以存储在各种设备上,从数据中心最大的服务器一直到桌面计算机和移动设备,它都可以控制数据而不用管数据存储在哪里。SQLServer2008允许使用Microsoft.NET和VisualStudio开发的自定义应用程序中使用数据,在面向服务的架构(SOA)和通过MicrosoftBizTalkServer进行的业务流程中使用数据。信息工作人员可以通过日常使用的工具直接访问数据。2.6JavaEE技术J2EE(Java2Platform,EnterpriseEdition)是一个为大企业主机级的计算类型而设计的Java平台。Sun微系统(与其工业伙伴一起,例如IBM)设计了J2EE,以此来简化客户级环境下的应用开发。由于创造了标准的可重用模块组件以及由于构建出能自动处理编程中多方面问题的等级结构,J2EE简化了应用程序的开发,也降低了对编程和对受训的程序员的要求。J2EE安全(Security)模型可以让你配置web组件或enterprisebean,这样只有被授权的用户才能访问系统资源.每一客户属于一个特别的角色,而每个角色只允许激活特定的方法。你应在enterprisebean的布置描述中声明角色和可被激活的方法。由于这种声明性的方法,你不必编写加强安全性的规则。J2EE事物管理(TransactionManagement)模型让你指定组成一个事务中所有方法间的关系,这样一个事务中的所有方法被当成一个单一的单元.当客户端激活一个enterprisebean中的方法,容器介入一管理事务。因有容器管理事务,在enterprisebean中不必对事务的边界进行编码。要求控制分布式事务的代码会非常复杂。你只需在布置描述文件中声明enterprisebean的事物属性,而不用编写并调试复杂的代码。容器将读此文件并为你处理此enterprisebean的事务。JNDI寻址(JNDILookup)服务向企业内的多重名字和目录服务提供了一个统一的接口,这样应用程序组件可以访问名字和目录服务.J2EE远程连接(RemoteClientConnectivity)模型管理客户端和enterprisebean间的低层交互.当一个enterprisebean创建后,一个客户端可以调用它的方法就象它和客户端位于同一虚拟机上一样.生存周期管理(LifeCycleManagement)模型管理enterprisebean的创建和移除,一个enterprisebean在其生存周期中将会历经几种状态。容器创建enterprisebean,并在可用实例池与活动状态中移动他,而最终将其从容器中移除。即使可以调用enterprisebean的create及remove方法,容器也将会在后台执行这些任务。数据库连接池(DatabaseConnectionPooling)模型是一个有价值的资源。获取数据库连接是一项耗时的工作,而且连接数非常有限。容器通过管理连接池来缓和这些问题。enterprisebean可从池中迅速获取连接。在bean释放连接之后可为其他bean使用。

3系统的可行性研究和需求分析3.1可行性研究该阶段通过对系统目标的初步调研和分析,提出可行性方案并进行论证。我们在这里主要从技术可行性、经济可行性和操作可行性进行三方面进行分析。3.1.1经济可行性开发该系统所需的相关资料可以通过互联网调查采集,所需的其他应用软件、硬件系统也易于获得。因此,开发成本较低。而引进使用本系统后,与传统方式相比,具有高效性、低成本、高质量的特点,可以节省人力、物力以及财力。所以,从经济角度来看,该系统可行。3.1.2技术可行性开发工具:MyEclipse2014Tomcat7.0数据库环境:SQLserver2008系统环境:MicrosoftWindowsXP或以上版本系统实现依靠相对熟悉的JSP语言和SQLserver2008数据库系统,其基本操作性质还是对数据库进行添加、删除、查找和修改操作。3.1.3操作可行性本系统采用的是B/S结构(浏览器/服务器结构),所以完全基于浏览器界面的开发,只要有一台能上网的电脑就能使用。3.2需求分析进行应用软件系统的研发,首先必须准确了解和分析用户的需求。需求分析是整个设计过程的基础,它将直接影响应用程序的开发速度和质量。本课题设计的目的是为了方便企业管理客户的呼入和回访,不同的用户行驶不同的权利。本企业客户管理系统分为超级管理员和普通用户两种权限,应该具备如下功能:超级管理员系统记录:可以用查询用户,和修改用户的密码以及超级管理员的密码。客户管理:客户的呼入和回访,以及回访单和派工单的生成。基础数据:一些基础数据(地区、服务网点、服务工程师、服务中心)的录入。系统管理:可以管理用户,更改用户的权限统计分析:资产的查询和录入,以及派工单的查询和。普通用户客户管理:客户的呼入和回访,以及回访单和派工单的生成。基础数据:一些基础数据(地区、服务网点、服务工程师、服务中心)的录入统计分析:资产的查询和录入,以及派工单的查询。3.3系统功能模块图企业客户管理系统在对系统进行整体的模块设计之后,就要对整个网站的各个栏目进行设计。系统整体功能模块如图所示:企业客户管理系统基础数据系统管理服务网点用户查询角色管理服务中心服务工程师地区回访密码修改呼入客户管理权限管理工单查询客户资产统计分析系统记录基础数据系统管理服务网点用户查询角色管理服务中心服务工程师地区回访密码修改呼入客户管理权限管理工单查询客户资产统计分析系统记录图3.1企业客户管理功能模块图客户资产用户回访单派工单诉求信息工单查询回访呼入密码修改客户资产用户回访单派工单诉求信息工单查询回访呼入密码修改客户信息客户信息 图3.2用户信息功能模块图3.4数据库设计3.4.1数据库概念设计用户信息表作用:建立用户的基本情况,主要用于管理登录系统以及系统信息。密码密码用户名用户用户名用户图3.3用户信息表客户信息表作用:建立客户的基本情况。姓名姓名客户类型电子邮件客户类型电子邮件客户标签联系人用户信息客户标签联系人用户信息地址地址重要程度联系电话重要程度联系电话图3.4客户信息表诉求表作用:用户保存用户的诉求信息,以及生成回访单号。诉求编号诉求类型诉求编号诉求类型创建时间服务项目服务诉求创建时间服务项目服务诉求紧急程度诉求来源紧急程度诉求来源图3.5诉求表派工表服务项目服务网点服务项目服务网点派工表派工表工单状态服务工程师工单状态服务工程师图3.6派工表回访单表回访开始时间作用:回访单的生成以及修改。回访开始时间通讯结果通讯结果回访表回访表回访单号是否接受回访回访单号是否接受回访回访次数回访次数图3.7回访表资产表作用:用户客户资产的新建,查询以及修改。关联派工表。资产状态资产类型资产状态资产类型生产日期资产表生产日期资产表资产名称资产名称购买途径购买途径图3.8派工表3.4.2数据库逻辑设计用户信息表(id,用户名,密码,姓名等)客户信息表(id,姓名,电子邮件,客户类型,重要程度,地址,电话等)服务诉求表(id,诉求编号,服务项目,诉求来源,诉求类型,创建时间,紧急程度等)派工表(id,服务项目,服务网点,服务工程师,工单状态等)回访表(id,回访单号,回访开始时间,通讯结果,回访次数,是否接受回访等)资产表(id,资产名称,资产类型,资产状态,生产日期,购买途径等)3.4.3数据库物理设计 表3.1用户信息表字段名称类型描述备注user-idInt主键ID主键,不为空usernamevarchar(10)用户名passwordvarchar(50)密码namevarchar(10)客户姓名telephone_numbervarchar(50)电话email_addressvarchar(50)电子邮件qq_numberIntQQ表3.2客户信息表字段名称类型描述备注idint唯一标识主键custFromSysvarchar(10)客户信息来源custNamevarchar(50)客户姓名custProvincevarchar(10)客户所在省份custCityvarchar(10)客户所在城市custCountyvarchar(10)客户所在区县custLevelvarchar(10)客户重要程度1:一般、2:VIPcustLeadingvarchar(10)负责人custTypevarchar(10)客户类型1:工程用户custServiceCentervarchar(50)服务中心custQqvarchar(50)QQcustWxvarchar(50)微信custSinawbvarchar(50)新浪微博custTencentwbvarchar(50)腾讯微博custEmailvarchar(50)邮箱custFamilynumInt家庭人数memovarchar(50)备注custMobilePhonevarchar(10)手机custAddressvarchar(50)地址custTagsvarchar(10)客户标签可在系统中维护crtUserIdInt创建人crtDttmDate创建时间lastuptDttmDate修改时间lastuptUserIdInt修改人enableFlgvarchar(50)是否有效0:无效、1:有效custJobvarchar(50)职业表3.3诉求表字段名称类型描述备注IdInt唯一标识主键,不为空serviceIdvarchar(10)服务单ID外键custIdvarchar(10)客户ID外键serviceNovarchar(10)诉求编号外键serviceTypevarchar(10)诉求类型1:咨询、2:建议、3:表扬、4:投诉、serviceContactvarchar(50)联系人serviceProductTypevarchar(50)产品大类servicePepoevarchar(50)中心负责人serviceProjectvarchar(50)服务项目serviceCentervarchar(50)服务中心serviceSourcevarchar(10)诉求来源1:电话、2:邮件、serviceRequestdatevarchar(50)客户期望时间serviceFirstdatevarchar(50)首次预约时间serviceSheduledatevarchar(50)最后预约时间serviceStatevarchar(10)诉求状态1:开启、2:已回访serviceEmergencyvarchar(10)紧急程度1:普通诉求、2:非常紧急serviceDetailvarchar(50)详细信息crtUserIdInteger创建人crtDttmvarchar(50)创建时间lastuptDttmvarchar(50)修改时间lastuptUserIdInteger修改人enableFlgvarchar(50)是否有效visitDemandvarchar(50)回访需求abnormalReasonvarchar(50)异常原因newFirstreminddatevarchar(50)首次催单时间newEmergercystateInt紧急诉求处理状态1:已处理、2:未处理newRemindtypeInt催单类型1:服务、2:物流、3:无newRemindstatusInt催单状态1:未处理、2:已处理newRemindnumInt催单次数newLastreminddatevarchar(50)最后催单时间complaintTitlevarchar(50)投诉主题complaintTypevarchar(10)投诉分类1:产品问题、complaintCausevarchar(10)投诉原因1:服务细节、disposeDatevarchar(50)处理日期disposeStatevarchar(10)处理状态1:新建、complaintPepoevarchar(50)投诉责任人satisfactionvarchar(10)投诉处理满意度1:满意、2:不满意complaintLevelvarchar(10)投诉等级1:普通投诉、2:重大投诉postponeDatevarchar(50)延期处理时间complaintSourcevarchar(10)投诉来源1:呼入电话complaintScopevarchar(50)重大投诉范围1:来电三次complaintContentvarchar(50)投诉内容disposeResultvarchar(50)处理结果causeAnalysisvarchar(50)原因分析correctvarchar(50)措施纠正whetherNissinvarchar(10)是否当天日清0:否、1:是remindDatevarchar(50)提醒日期表3.4派工表字段名称类型描述备注IdInt唯一标识主键,不为空serviceIdvarchar(10)CRM诉求ID外键custIdvarchar(10)CRM客户ID外键workerIdvarchar(10)CRM派工单ID外键workerTypevarchar(50)派工单类型workerDetailvarchar(50)派工单主题workerStatusInt派工单状态1:新建workerPepoevarchar(50)派工单负责人workerEngineervarchar(50)服务工程师workerTimevarchar(50)派工时间crtUserIdInt创建人crtDttmDate创建时间lastuptDttmDate修改时间lastuptUserIdInteger修改人enableFlgvarchar(50)是否有效serviceNovarchar(50)诉求编号workerNovarchar(10)工单编号buyProductvarchar(10)购买产品serviceRequestDatevarchar(50)服务请求时间completeDatevarchar(50)实际完成时间faultDescvarchar(50)故障描述serviceSitevarchar(50)服务网点serviceEngineervarchar(10)服务工程师siteEngineervarchar(10)网点工程师lastuptCrmUserIdvarchar(50)CRM修改人crtCrmUserIdvarchar(50)CRM创建人faultSceneDescvarchar(50)故障现场现象newServiceitemvarchar(50)服务项目表3.5回访表字段名称类型描述备注IdInteger唯一标识主键,不为空callbackIdvarchar(50)回访单ID外键serviceIdvarchar(50)服务单ID外键custIdvarchar(50)客户ID外键callbackTypevarchar(10)回访类型回访/满意度回访callbackDetailvarchar(50)回访内容callbackeIdvarchar(50)回访单号callbackStatusvarchar(10)回访状态1:新建、2:完成、callbackCallStatusvarchar(10)通讯结果1:OK_接通、callbackTimesvarchar(10)回访累计次数1:一次、2:二次、crtUserIdInt创建人crtDttmDate创建时间lastuptDttmDate修改时间lastuptUserIdInt修改人enableFlgvarchar(10)是否有效0:无效、1:有效serviceNovarchar(50)诉求编号callbackStartdatevarchar(50)回访开始时间acceptrecallvarchar(10)是否接受回访1:接受回访、userIdentityvarchar(10)用户身份1:用户本人接听requestnotevarchar(10)诉求处理结果1:问题已解决、isattend1varchar(10)用户是否在场1:在现场、serviceinformationvarchar(10)是否一次解决问题1:无、2:是、isontimevarchar(10)是否约定时间1:无、2:是、chargevarchar(10)收费信息1:无、2:收费、realychargeDouble实际收费aftertrainvarchar(10)服务完毕后是否介绍产品的维修、保养知识1:无、2:OK_有servertotalvarchar(50)总体服务评分callDatevarchar(50)上门时间suggestionvarchar(50)意见建议不满意statevarchar(10)状态0:活动、1:非活动表3.6资产表字段名称类型描述备注IdInt唯一标识主键,不为空custIdInt客户ID外键productNamevarchar(10)资产名称productCodevarchar(10)资产编号productAddrvarchar(50)地址productTypevarchar(10)资产类型productStatusvarchar(10)资产状态produceDatevarchar(50)生产日期invoiceDatevarchar(50)开票日期deliveryDatevarchar(50)送货日期installDatevarchar(50)安装日期repairJudgevarchar(50)三包判断buyWayvarchar(50)购买途径saleUnitvarchar(50)销售单位provincevarchar(10)省份cityvarchar(10)城市areavarchar(10)地区crtUserIdInteger创建人crtDttmDate创建时间lastuptDttmDate修改时间lastuptUserIdInt修改人enableFlgvarchar(10)是否有效

4系统设计与实现详细设计的工作包括处理过程、代码设计和界面设计三个部分,即根据总体设计的每个功能模块的要求和数据库的逻辑结构,利用相应的开发工具设计出相应的系统过程。4.1用户登录出于是管理系统,所以没有前台展示,进入系统便进入登录界面,如图4.1所示:图4.1登录界面输入同户名和密码后,点击登录,跳转的Action为LoginAction,在数据库中用户表查找相应的用户名和密码,如果找到,则在session中存储当前登录的用户,并跳转到主页面,用户权限不同则看到的菜单也不同,如果帐号和密码不匹配,会出现密码错误。如图4.2所示:图4.2系统主页面用户登录核心代码:publicvarchar(50)login(){ SysUsersysUser=newSysUser(); varchar(50)userName=getrequest().getParameter("userName"); varchar(50)password=getrequest().getParameter("password"); sysUser.setUserName(userName); sysUser.setPassword(password); Listuserlist=this.loginService.loginQuery(sysUser); if(userlist.size()==1){ //返回的List有唯一元素,用户验证成功 //将返回的用户信息装进session对象中,保存用户信息 getsession().setAttribute("sysUser",userlist.get(0)); this.authorityList=this.loginService.authorityQuery(sysUser); getsession().setAttribute("authorityList",authorityList); Listlist=this.loginService.directoryQuery(sysUser); getsession().setAttribute("list",list); returnSUCCESS; }else{ this.getrequest().setAttribute("message","0"); return"cuowu";}}4.2用户功能设计与实现4.2.1密码修改该功能可以修改用户密码,输入正确的用户密码,再输入新密码用来更改密码,如原用户名和密码不匹配,则无法更改密码,如图4.3所示:图4.3密码修改密码修改核心代码://普通用户修改密码publicStringupdatepasd(){ SysUsersysUser=(SysUser)getsession().getAttribute("sysUser"); Stringpassword=getrequest().getParameter("password"); Stringoldpassword=getrequest().getParameter("oldpassword"); sysUser.setPassword(oldpassword.toString()); Listlist=this.systemPasswordService.yanzheng(sysUser); if(list.size()==1){ sysUser.setPassword(password); this.systemPasswordService.updatepswd(sysUser); } return"tiaozhuan"; } //管理员修改密码 publicvoidpasdupdate(){ SysUsersysUser=newSysUser(); StringuserName=getrequest().getParameter("userName"); password=getrequest().getParameter("password"); sysUser.setUserName(userName); sysUser.setPassword(password); this.systemPasswordService.updatepswd(sysUser); //return"tiaozhuan"; } public Stringtiaozhuan(){ return"denglu"; }4.2.2系统管理该功能主要是客户的呼入和回访,可以查询客户的基本信息,如图4.4所示:图4.4客户管理点击呼入,跳转到HuruAction,进入到呼入查询页面,查询数据库数据之后双击数据可以跳转到客户信息处理页面,包括客户信息的保存,修改和联系人的新建,以及服务诉求的新建。生成派工和回访。如图4.5所示;图4.5呼入处理界面点击呼入,跳转到QueryAction,进入到回访查询页面,查询数据库数据之后双击查询出的数据可以跳转到客户信息处理页面,包括客户信息的修改和保存,诉求的保存以及回访单的修改和保存。如图4.6所示;图4.6回访处理界面客户管理核心代码: /*生成派工及回访信息*/ publicvoidnewWorkerAndvisit(){ SysUsersysUser=(SysUser)getsession().getAttribute("sysUser"); intsysUserId=sysUser.getUserId(); //用户id intcustId=Integer.parseInt(getrequest().getParameter("custid")); //客户id intserviceid=Integer.parseInt(getrequest().getParameter("serviceid"));//诉求id StringserviceNo=getrequest().getParameter("serviceNo"); //诉求编号 StringserviceCenter=getrequest().getParameter("serviceCenter");//服务中心 Stringleading=getrequest().getParameter("leading"); //负责人 Stringproject=getrequest().getParameter("project"); //服务项目 Stringproduct=getrequest().getParameter("ab"); //购买产品 product=product.subString(0,product.length()-1); String[]buyProduct=product.split(","); //生成派工单 for(inti=0;i<buyProduct.length;i++){ TCcWorkertw=newTCcWorker(); tw.setBuyProduct(buyProduct[i]); tw.setCustId(Integer.toString(custId)); tw.setServiceNo(serviceNo); tw.setWorkerStatus(Integer.toString(1)); tw.setNewServiceitem(project); tw.setCrtUserId(sysUserId); huruService.saveworkerInfo(tw); } //生成回访记录 TCcCallbackcallback=newTCcCallback(); callback.setCustId(custId); callback.setCrtUserId(sysUserId); callback.setServiceId(serviceid); callback.setCallbackStatus(Integer.toString(1)); callback.setServiceNo(serviceNo); callback.setServiceCenter(serviceCenter); callback.setCallBackLeading(leading); huruService.savecallbackInfo(callback); }//回访查询业务>>回访处理页面>>客户信息 publicvarchar(50)visitdeal(){ //客户id intid=tcustomers.getId(); //客户信息 tcustomers=saveServiceDao.custdeal(id); getrequest().setAttribute("listli",tcustomers); //根据客户id查询回访单信息 System.out.println(tcallback.getCustId()); inttcallbackId=tcallback.getId(); //系统用户 Listlist7=this.saveServiceDao.sysUser(); tcallback=saveServiceDao.backdeal(tcallbackId); inthfdlastupId=tcallback.getLastuptUserId(); StringenterName=tcallback.getEnteringCompleteUser(); System.out.println(enterName); for(inti=0;i<list7.size();i++){ if(hfdlastupId==((SysUser)list7.get(i)).getUserId()){hfdlastUpName=((SysUser)list7.get(i)).getName(); getrequest().setAttribute("hfdlastUpName",hfdlastUpName); } if(enterName==null||enterName.equals("")){ getrequest().setAttribute("hfdEnterName",enterName); } elseif(((SysUser)list7.get(i)).getUserId()==Integer.parseInt(enterName)){ StringenterUserName=((SysUser)list7.get(i)).getName(); getrequest().setAttribute("hfdEnterName",enterUserName); } } getrequest().setAttribute("listli2",tcallback); //根据客户id查询回访历史 Listlist=saveServiceDao.backHistory(id); /* getrequest().setAttribute("listli3",list);*/ List<TCcCallback>tcallback1=newArrayList<TCcCallback>(); List<TCcService>tservice1=newArrayList<TCcService>(); ArrayListlist1=newArrayList(); Object[]obj=null; for(inti=0;i<list.size();i++){ obj=(Object[])list.get(i); tcallback1.add((TCcCallback)obj[0]); tservice1.add((TCcService)obj[1]); } getrequest().setAttribute("tcallback1",tcallback1); getrequest().setAttribute("tservice1",tservice1); //根据客户id查询诉求id inttserviceId=tservice.getId(); tservice=saveServiceDao.servicedeal(tserviceId); getrequest().setAttribute("listli4",tservice); //根据诉求编号查询派工单 intserviceId=tservice.getId(); Listlist5=saveServiceDao.worker(tworker,serviceId); getrequest().setAttribute("listlist5",list5); //查询voc一级分类填充到下拉框中 Listlist6=this.saveServiceDao.vocyj(); getrequest().setAttribute("vocyj",list6); return"visitdeal"; }4.2.3基础数据该功能主要是基础数据的查询和录入,通过时间控件录入基础数据,当呼入和回访需要数据时可以直接调用,程序运行的同时可以加载基础数据,如图4.7所示:图4.7基础数据基础数据时间控件核心代码://用list拿到需要处理的数据 ListprovinceList=monDao.find("fromNewProvinceextensionbase"); ListcityList=monDao.find("fromNewCityextensionbase"); ListdistrictList=monDao.find("fromNewDistrictextensionbase"); ListvocTypeOneList=monDao.find("fromNewTypeone"); ListvocTypeTwoList=monDao.find("fromNewTypetwo"); ListuserList=monDao.find("fromSysUser"); ListcenterEngineerList=monDao.find("fromNewCenterengineer"); ListserviceSiteList=monDao.find("fromNewServicesite"); //用Map保存数据间的关系 MapprovinceCityMap=newHashMap(); MapcityDistrictMap=newHashMap(); MapvocTypeOneVocTypeTwoMap=newHashMap(); MapserviceSiteCenterEngineerMap=newHashMap();4.2.4权限管理用户管理,管理员可以查询用户,对用户进行修改,删除和配置权限等操作,如图4.8所示:图4.8用户管理权限管理,不同的权限有不同的功能,管理园可以给用户配置不同的权限以及权限的新增如图4.9所示:图4.9权限管理系统参数,可以对用户-权限-角色进行查询操作,如图4.10所示:图4.10系统参数系统权限管理核心代码: publicvarchar(50)showRole(){ try{ //获取需要配置角色的用户的信息 Listlist=this.systemUserService.findUser(this.sysUser); this.sysUser=(SysUser)list.get(0); //查出全部角色 this.roleList=this.systemUserService.findRole(); //查出该系统用户拥有的角色list this.userRoleList=this.systemUserService.showRole(this.sysUser); ("方法执行成功。"); }catch(Exceptione){ logger.error("方法执行失败。"); } //返回一个页面 return"showRole"; } //获取添加的用户信息 publicvoidaddUser(){ //判断用户是否存在 Listlist=this.systemUserService.yanzheng(this.sysUser); if(list.size()==0){ systemUserService.addUser(sysUser); }else{ this.getsession().setAttribute("ab","1"); } }4.2.5统计分析客户资产,可以详细查询客户资产,如图4.11所示:图4.11客户资产工单查询,可以查询工单以及对工单的修改,如图4.12所示:图4.12资产查询统计分析核心代码:/*获取工单信息*/ publicStringqueryworker(){ Stringid=this.getrequest().getParameter("id"); /*IntegersiteId=Integer.parseInt(getrequest().getParameter("siteId"));*/ worker=queryGdservice.workerQueryAll(id);//根据custid,获取工单信息然后返回信息 Listsitelist=queryGdservice.querySiteAll();//获取网点list,然后遍历 //intsiteId=Integer.parseInt(worker.getServiceSite()); NewServicesiteservicesite=(NewServicesite)sitelist.get(0); intsiteId=servicesite.getNewServicesiteid(); Listengineerlist=queryGdservice.queryEngineerAll(siteId);//获取工程师list getrequest().setAttribute("worker",worker); getrequest().setAttribute("sitelist",sitelist); getrequest().setAttribute("engineerlist",engineerlist); //getsession().getAttribute("sysUser"); return"infoworker"; } /*服务网点与服务工程师联动*/ publicvoidsiteIndex(){ Stringindex=getrequest().getParameter("index"); intsiteId=Integer.parseInt(index); //通过id获取 Listengineerlist=queryGdservice.queryEngineerAll(siteId); //json返回到前台值 PrintWriterpw; try{ getresponse().setContentType("text/html;charset=utf-8"); pw=getresponse().getWriter(); Stringjson=JSONArray.fromObject(engineerlist).toString(); pw.print(json); pw.flush(); pw.close(); }catch(IOExceptione){ //TODOAuto-generatedcatchblock e.printStackTrace(); } }

5系统测试和结果分析5.1系统测试方法概述比较常见的、典型的系统测试包括恢复测试、安全测试、压力测试。下面对这几种测试进行一一介绍:1)恢复测试恢复测试作为一种系统测试,主要关注导致软件运行失败的各种条件,并验证其恢复过程能否正确执行。在特定情况下,系统需具备容错能力。另外,系统失效必须在规定时间段内被更正,否则将会导致严重的经济损失。2)安全测试安全测试用来验证系统内部的保护机制,以防止非法侵入。在安全测试中,测试人员扮演试图侵入系统的角色,采用各种办法试图突破防线。因此系统安全设计的准则是要想方设法使侵入系统所需的代价更加昂贵。3)压力测试压力测试是指在正常资源下使用异常的访问量、频率或数据量来执行系统。在压力测试中可执行以下测试:①如果平均中断数量是每秒一到两次,那么设计特殊的测试用例产生每秒十次中断。②输入数据量增加一个量级,确定输入功能将如何响应。③在虚拟操作系统下,产生需要最大内存量或其它资源的测试用例,或产生需要过量磁盘存储的数据。5.2系统功能测试主要进行功能测试(含可使用性测试)、兼容性测试、安全测试、文档测试,具体测试内容可详见需求调研完成以后我司编写的《测试用例》。

功能测试:

检查被测系统的所有功能是否满足需求中的描述;

验证需求规格说明书中的功能是否100%覆盖;

识别特殊情况,如出错处理流程,错误提示是否合理;

检查用户界面是否符合窗口程序的标准,界面操作是否简便直观。

兼容性测试:

检测系统在不同的浏览器的兼容性问题,检测是否可以实现所有软件功能。

安全性测试:

根据需求说明检查系统是否达到安全性要求;

数据库的密码是否经过加密;

文档测试:

检查文档的正确性和完整性,内容是否与系统本身相符。

根据相关操作与维护手册,用户能完成操作、使用和维护本系统。5.3系统的实用性分析公司和企业的信息化管理是国家经济信息化建设的基础,对信息资源的开发和管理是企业信息化建设的核心,也是重中之重。其实现的方式是各种企业信息系统的建设实施,SSH2技术是一种web应用系统的开发技术,功能强大,在构建信息化系统中起着强大的作用,是当前构建的新型企业信息管理系统,尤其是对大型的企业信息系统的一种比较高效的开发技术。本论文的研究主要是依托企业的实际需求,阐述了信息系统和SSH2开发平台的技术知识,给出了系统的设计和具体的实现方法,系统开发主要运用SSH2开发技术设计及各模块功能的实现技术。

结论本系统是一个面向中小型企业、具有一定实用性的企业售后客户管理信息系统,它主要完成客户信息的一系列管理。本系统采用Myeclipse作为开发工具,数据库设计上用了SQLServer2008的便利性和实用性。系统总共实现了5大功能模块,分别是系统记录、客户管理、基础数据、系统管理和统计分析,大部分模块都实现了增删改查四项数据操作功能,使公司可以根据现有的客户信息有效的制定下一步的诉求和回访。系统整体界面清爽、简介、友好的感觉,系统操作简单明了,由于系统设计的方面较多,在技术上还有一定的难度,所以,该系统必定会有不足之处,加之水平有限,当前只实现的大部分功能,但总的来说,用心的去完成此系统对我试一次极大的收获。在整个系统开发对过程中,它让我把以往的知识很好的回顾了一遍,同时也让我学到一些新的知识和技术,也发现大量问题,有些在设计过程中已经解决,有些还有待今后慢慢学习。只要学习就会有更多的问题,有更多的难点,有更多的收获。通过这次毕业设计,我从中学到了以下几点:学会自己结局问题,寻求问题的答案,即自我学习能力和解决问题的能力;做事一定要仔细,不可粗枝大叶;做事之前一定要周密的思考,全面分析你要去面对的事情,不可走一步做一步;遇到问题时不可浮躁,要有耐心,从而最终解决问题;学习之后要善于对其进行总结和分析,这样才能正真的不断进步。总之,我人生中的这次难得的毕业设计对我来说是一次成功的体验,可以说这是我大学四年之中收获最大的一次,但是依然还有很多地方需要不断的努力学习提高,我相信,只要简直努力下去,朝着自己的目标永不放弃,成功一定会青睐于我。参考文献郑娅峰,张永强.网页设计与开发.北京:清华大学出版社,2009李兴华.Java开发实战经典.北京:清华大学出版社,2009陈炎龙,刘芳.SQLServer2008数据库教程.北京:科学出版社,2011耿祥义,张跃平,JSP大学实用教程(第二版).北京:电子工业出版社,2013张志峰,马军霞,范乃梅,徐洁,石东海.Web框架技术教程.北京:清华大学出版社,2013Json.Brittain&IanF.Darwin.Tomcat:TheDefinitiveGuide,SecondEdition.USA:O’REILLY,2009谬勇,施俊,李新峰.Struts2+Spring+Hibernate框架技术精讲与整合案例.北京:清华大学出版社,2015刘京华.JavaWeb整合开发王者归来.北京。清华出版社,2010R.J(Bud)Bates.GPRS:GeneralPacketRadioService.McGraw-Hill,2003Cameron,J.R.JSP&JSDtheJacksonapproachtosoftwaredevelopment.SilverSpringMD:IEEEComputerSocietyPress,1983M.J.King,J.P.Pardoe.ProgramdesignusingJSPapracticalintroduction.BasingstokeHampshire:Macmillan,1992JamesGoodwill.PureJavaServerPages.IndianapolisInd:Sams,2000GwenaelLeBodic.MobilemessagingtechnologiesandservicesSMSEMSandMMS.NewYork:J.Wiley,2005李贤华,基于JSP技术的大型网上购物系统的设计与实现[J].计算机与现代化.2008蔡剑,景楠.JavaWeb应用开发:J2EE和Tomcat[M].北京:清华大学出版社,2004孙鑫编著.JavaWeb开发详解[M].电子工业出版社,2006.189-274.孙卫琴.精通struts[M]电子工业出版社.2004年8月.50-70.孙卫琴.精通hibernate[M]电子工业出版社.2005年4月.100-120.林信良.spring2.0技术手册[M]电子工业出版社.2006年6月.50-100.耿祥义编著.JSP基础编程[M].清华大学出版社,2004.55-162徐建波,周新莲.Web设计原理于编程技术[M].中南大学出版社,2005.185-193.孙鑫编著.JavaWeb开发详解[M].电子工业出版社,2006.189-274林上杰,林康司编著.JSP2.0技术手册[M].电子工业出版社,2004.3-6

致谢在这次毕业设计中,在即将完成我大学学习的最后一个阶段之际,回首开发中的苦与甜,发现:只要有付出就会有所得。只要是通过自己的努力,哪怕只获得一点成功,也会感到快乐。衷心感谢我的指导老师,感谢她对我的直到和帮助,老师的指导和帮助对我能够顺利完成这次毕业设计起到了至关重要的作用。另外,还要感觉在这几年来对我施教的老师们,是他们的淳淳教询和带领激励着我在成长和学习的道路上不断前进。时光如梭,大学生涯即将结束,在此,我要深深的感谢在这四年来学院给了我一个好的学习环境,感谢所有的领导和老师对我们这些学子的辛勤培育和关心。没有您们知识的传播,就没有今天我们去工作岗位上创造丰功伟绩。最后,感谢审评老师能抽出宝贵的时间来对我的论文进行审核指正,谢谢您们!

附录1外文参考文献(译文)详细解析Java中抽象类和接口的区别在Java语言中,abstractclass和interface是支持抽象类定义的两种机制。正是由于这两种机制的存在,才赋予了Java强大的面向对象能力。abstractclass和interface之间在对于抽象类定义的支持方面具有很大的相似性,甚至可以相互替换,因此很多开发者在进行抽象类定义时对于abstractclass和interface的选择显得比较随意。其实,两者之间还是有很大的区别的,对于它们的选择甚至反映出对于问题领域本质的理解、对于设计意图的理解是否正确、合理。本文将对它们之间的区别进行一番剖析,试图给开发者提供一个在二者之间进行选择的依据。理解抽象类abstractclass和interface在Java语言中都是用来进行抽象类(本文中的抽象类并非从abstractclass翻译而来,它表示的是一个抽象体,而abstractclass为Java语言中用于定义抽象类的一种方法,请读者注意区分)定义的,那么什么是抽象类,使用抽象类能为我们带来什么好处呢?在面向对象的概念中,我们知道所有的对象都是通过类来描绘的,但是反过来却不是这样。并不是所有的类都是用来描绘对象的,如果一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就是抽象类。抽象类往往用来表征我们在对问题领域进行分析、设计中得出的抽象概念,是对一系列看上去不同,但是本质上相同的具体概念的抽象。比如:如果我们进行一个图形编辑软件的开发,就会发现问题领域存在着圆、三角形这样一些具体概念,它们是不同的,但是它们又都属于形状这样一个概念,形状这个概念在问题领域是不存在的,它就是一个抽象概念。正是因为抽象的概念在问题领域没有对应的具体概念,所以用以表征抽象概念的抽象类是不能够实例化的。在面向对象领域,抽象类主要用来进行类型隐藏。我们可以构造出一个固定的一组行为的抽象描述,但是这组行为却能够有任意个可能的具体实现方式。这个抽象描述就是抽象类,而这一组任意个可能的具体实现则表现为所有可能的派生类。模块可以操作一个抽象体。由于模块依赖于一个固定的抽象体,因此它可以是不允许修改的;同时,通过从这个抽象体派生,也可扩展此模块的行为功能。熟悉OCP的读者一定知道,为了能够实现面向对象设计的一个最核心的原则OCP(Open-ClosedPrinciple),抽象类是其中的关键所在。从语法定义层面看abstractclass和interface在语法层面,Java语言对于abstractclass和interface给出了不同的定义方式,下面以定义一个名为Demo的抽象类为例来说明这种不同。在abstractclass方式中,Demo可以有自己的数据成员,也可以有非abstract的成员方法,而在interface方式的实现中,Demo只能够有静态的不能被修改的数据成员,所有的成员方法都是abstract的。从某种意义上说,interface是一种特殊形式的abstractclass。从编程的角度来看,abstractclass和interface都可以用来实现"designbycontract"的思想。但是在具体的使用上面还是有一些区别的。首先,abstractclass在Java语言中表示的是一种继承关系,一个类只能使用一次继承关系(因为Java不支持多继承--转注)。但是,一个类却可以实现多个interface。也许,这是Java语言的设计者在考虑Java对于多重继承的支持方面的一种折中考虑吧。其次,在abstractclass的定义中,我们可以赋予方法的默认行为。但是在interface的定义中,方法却不能拥有默认行为,为了绕过这个限制,必须使用委托,但是这会增加一些复杂性,有时会造成很大的麻烦。在抽象类中不能定义默认行为还存在另一个比较严重的问题,那就是可能会造成维护上的麻烦。因为如果后来想修改类的界面(一般通过abstractclass或interface来表示)以适应新的情况(比如,添加新的方法或者给已用的方法中添加新的参数)时,就会非常的麻烦,可能要花费很多的时间(对于派生类很多的情况,尤为如此)。但是如果界面是通过abstractclass来实现的,那么可能就只需要修改定义在abstractclass中的默认行为就可以了。同样,如果不能在抽象类中定义默认行为,就会导致同样的方法实现出现在该抽象类的每一个派生类中,违反了"onerule,oneplace"原则,造成代码重复,同样不利于以后的维护。因此,在abstractclass和interface间进行选择时要非常的小心。从设计理念层面看abstractclass和interface上面主要从语法定义和编程的角度论述了abstractclass和interface的区别,这些层面的区别是比较低层次的、非本质的。本小节将从另一个层面:abstractclass和interface所反映出的设计理念,来分析一下二者的区别。作者认为,从这个层面进行分析才能理解二者概念的本质所在。前面已经提到过,abstractclass在Java语言中体现了一种继承关系,要想使得继承关系合理,父类和派生类之间必须存在"is-a"关系,即父类和派生类在概念本质上应该是相同的。对于interface来说则不然,并不要求interface的实现者和interface定义在概念本质上是一致的,仅仅是实现了interface定义的契约而已。为了使论述便于理解,下面将通过一个简单的实例进行说明。考虑这样一个例子,假设在我们的问题领域中有一个关于Door的抽象概念,该Door具有执行两个动作open和close,此时我们可以通过abstractclass或者interface来定义一个表示该抽象概念的类型。其他具体的Door类型可以extends使用abstractclass方式定义的Door或者implements使用interface方式定义的Door。看起来好像使用abstractclass和interface没有大的区别。如果现在要求Door还要具有报警的功能。我们该如何设计针对该例子的类结构呢(在本例中,主要是为了展示abstractclass和interface反映在设计理念上的区别,其他方面无关的问题都做了简化或者忽略)?下面将罗列出可能的解决方案,并从设计理念层面对这些不同的方案进行分析。这种方法违反了面向对象设计中的一个核心原则ISP(InterfaceSegregationPrinciple),在Door的定义中把Door概念本身固有的行为方法和另外一个概念"报警器"的行为方法混在了一起。这样引起的一个问题是那些仅仅依赖于Door这个概念的模块会因为"报警器"这个概念的改变(比如:修改alarm方法的参数)而改变,反之依然。既然open、close和alarm属于两个不同的概念,根据ISP原则应该把它们分别定义在代表这两个概念的抽象类中。定义方式有:这两个概念都使用abstractclass方式定义;两个概念都使用interface方式定义;一个概念使用abstractclass方式定义,另一个概念使用interface方式定义。显然,由于Java语言不支持多重继承,所以两个概念都使用abstractclass方式定义是不可行的。后面两种方式都是可行的,但是对于它们的选择却反映出对于问题领域中的概念本质的理解、对于设计意图的反映是否正确、合理。我们一一来分析、说明。如果两个概念都使用interface方式来定义,那么就反映出两个问题:1、我们可能没有理解清楚问题领域,AlarmDoor在概念本质上到底是Door还是报警器?2、如果我们对于问题领域的理解没有问题,比如:我们通过对于问题领域的分析发现AlarmDoor在概念本质上和Door是一致的,那么我们在实现时就没有能够正确的揭示我们的设计意图,因为在这两个概念的定义上(均使用interface方式定义)反映不出上述含义。如果我们对于问题领域的理解是:AlarmDoor在概念本质上是Door,同时它有具有报警的功能。我们该如何来设计、实现来明确的反映出我们的意思呢?前面已经说过,abstractclass在Java语言中表示一种继承关系,而继承关系在本质上是"is-a"关系。所以对于Door这个概念,我们应该使用abstractclass方式来定义。另外,AlarmDoor又具有报警功能,说明它又能够完成报警概念中定义的行为,所以报警概念可以通过interface方式定义。这种实现方式基本上能够明确的反映出我们对于问题领域的理解,正确的揭示我们的设计意图。其实abstractclass表示的是"is-a"关系,interface表示的是"like-a"关系,大家在选择时可以作为一个依据,当然这是建立在对问题领域的理解上的,比如:如果我们认为AlarmDoor在概念本质上是报警器,同时又具有Door的功能,那么上述的定义方式就要反过来了。小结abstractclass在Java语言中表示的是一种继承关系,一个类只能使用一次继承关系。但是,一个类却可以实现多个interface。在abstractclass中可以有自己的数据成员,也可以有非abstract的成员方法,而在interface中,只能够有静态的不能被修改的数据成员(也就是必须是staticfinal的,不过在interface中一般不定义数据成员),所有的成员方法都是abstract的。abstractclass和interfac

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论