



已阅读5页,还剩15页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
软件学院 本科毕业论文(科研训练、毕业设计)题 目:汽车销售管理系统的研究与开发姓 名:学 院:软件学院系:专 业:软件工程年 级:学 号:指导教师(校内): 职称: 指导教师(校外): 职称:年 月 日20汽车销售管理系统的研究与开发 摘要 汽车销售管理系统实现了整个汽车销售过程的电脑化管理,大大降底了管理成本,提高了工作效率。本文介绍了使用JSP语言和MYSQL数据库,在TOMCAT的环境下,采用B/S的模式,并结合HTML,JAVASCRIPT,JAVABEANS等实现汽车销售管理系统的过程。分析了系统的整体运作流程和项目模块组成,同时还分析讨论了在项目实现过程遇到的问题的解决策略和技术。关键词 入仓单 商品车检验单 合格证 调配单 信息管理系统 B/S目 录引言4第一章 汽车销售管理系统4第一节系统应用背景和效益分析4第二节系统特点4第三章 系统实现的总体设计5第一节 数据库51.1 JNDI 链接数据库51.2 连接数据库的JAVABEAN5第二节 系统总体结构6第四章 系统的详细设计与实现7第一节 经理数据统计模块71.1 基本流程71.2 实现方法7第二节 经理图形统计模块102.1 基本流程102.2 实现方法11第三节 入仓模块设计113.1 基本流程113.2 实现方法12第四节 调配模块设计144.1 基本流程144.2 实现方法14第五章 遇到的问题和总结151从数据库中读取或写入数据时的乱码解决技术152在JSP页面中正常显示中文153 Tomcat中SQL语句错误提示的解决163 翻页问题的解决164 系统存在的问题17致谢语18参考文献18引 言一般汽车销售企业里人少但事情较多,管理层既要管业务又要管仓库和财务,每天都要面对不同部门各种各样的报表,各个部门的数据缺乏共享性,许多资料重复录入,错漏难免,造成大量的人力资源浪费,并且资料缺乏一致性。汽车销售管理系统实现了整个汽车销售过程的电脑化管理。从客户来访、咨询、报价、订购,到采购、车辆入库、签定购销合同、交款、提车等多个销售环节上,系统提供了严密的跟踪管理服务,对车辆库存、财务管理、业务分析都提供了一套科学的管理方法;既可以适合于多品牌车辆的销售,也可以适用于专卖店的管理;通过电脑化的管理,汽车销售企业能够掌握市场的第一手资料,有条不紊地开拓市场,更好地挖掘客户资源,进一步提高车辆销售的成功率,同时可以降低销售成本,优化销售中的各个环节,盘活流动资金,提高服务质量,更灵活地适应外部市场环境、提升内部的管理水平、留住客户、赢得商机,从而提高企业在市场上竞争能力。 第一章 汽车销售管理系统第一节 系统应用背景与效益分析 汽车销售与普通商品销售有着极大的差别,在传统的汽车业管理模式中,纸单据及手工管理是其主流方式。这种方式带来是数据可靠性差,运行效率低下,统计分析难度大,抽取对企业有用信息的可能性极小!显然,这种传统的销售管理模式已经不能适应当今汽车销售企业的市场需求。采用先进管理模式来管理客户关系,采用信息化管理手段培源固本,成为企业提升竞争力的重要途径之一。本汽车销售管理系统就是是针对汽车销售企业、汽车养护企业、汽车维修企业和汽车配件企业开发的MIS系统(管理信息系统)。本汽车销售管理系统涵盖汽车销售和服务产业的几乎所有业务环节,内置了科学的管理流程,既可以适用于业务单一的汽车服务企业(如只从事汽车销售,或者只从事汽车维修),也适合于包括多种业务种类的汽车服务企业。第二节 系统特点u 本汽车销售管理系统的子系统之间有良好的接口,子系统之间可以方便的交换数据,保持了数据的一致性。u 本汽车销售管理系统基于流程而非单据的管理,内置科学的管理流程,实现了汽车企业业务流程化管理的需求。 u 本汽车销售管理系统具有严格的角色和权限划分;不同角色之间相互限制,具有较高的安全性;u 本汽车销售管理系统支持Windows客户端和IE客户端,栏目布局以矩阵的形式安排,提供栏目跳转、历史线索轨迹和当前线索定位,真正实现360度的数据视图功能,用户使用极为方便。u 本汽车销售管理系统将简单查询、复合查询、图表和报表分析集成到模块中,用户获取分析结果极为便捷。u 本汽车销售管理系统支持各种单据(如网点定车计划表,定单表,入仓单,商品车检验单,车辆调配表,借用申请表,销售表,改装表等)的生成、预览和打印功能。第二章 系统实现的总体设计本系统采用JSP+MYSQL+TOMCAT的模式。主要由HTML语言实现个性化的静态页面,并用JNDI的方法实现JSP与MYSQL数据库的动态交互,在不同的数据表之间传递数据,从而实现整个汽车销售管理流程数据的一致。第一节 数据库1.1 JNDI链接数据库 由于各模块频繁地与数据库打交道,如何与数据库链接就显得十分重要。JNDI(Java Naming and Directory Interface)是一个为JAVA应用程序提供命名服务的应用程序编程接口(API)。它支持通过一个单一的方法访问不同的新的和已经存在的服务的方法。因此我们采用了此种数据库链接的方法。 这种数据库链接的方法需要重新配置Tomcat中的server.xml和web.xml配置文件。 具体方法如下:l 将mysql的JDBC连接库mm.mysql-2.0.9-bin.jar放入TOMCAT_HOME/common/lib中l 配置TOMCAT_HOME/conf/serer.xml文件在段中加入一个Context: 其功能是在C:Apache GroupTomcat 4.1webapps下创建一个用来存放本汽车销售管理系统的源程序的carsold文件夹。l 在上面加入的段加入 一段由Tomcat 的Sample提供的代码,然后修改其driverClassName, url,和用户帐号就可以了。1.2连接数据库的JAVABEAN各功能模块中需要频繁的进行数据库操作,如果每遇到要使用数据库便建立一次链接将在一定程度上增大系统开销,我们这里有效利用了JAVABEAN,书写一个可操作数据库(添加,修改,删除,关闭链接)的JAVABEAN,每次需操作数据库时,就只需实例化该JAVABEAN,从而提高了服务器效率。一个连接数据库的JAVABEAN,关键是获得与数据源的连接:Context ctx = new InitialContext();/得到一个连接的实例 DataSource ds = (DataSource)ctx.lookup(java:comp/env/jdbc/TestDB); /寻找绑定的数据源 if (ds != null) conn = ds.getConnection(); /获得与数据源的连接 第二节 系统总体结构此系统分为四个模块:录入员模块,经理模块,系统管理员模块和财务模块。不同的模块具有不同的权限和职能。录入员负责录入定车计划表,定单表,入仓单表,销售表,调配表,借用表,客户表,改装表等信息;但不具有修改和删除功能;一旦出现录入错误只能提交删除请求,经经理批准后才能真正从数据库中删除,否则无效;经理有决定是否删除记录的权利,可以查询所有表单,并可以统计销售情况;财务负责合格证的管理;系统管理员负责添加删除登入人员并分配权限,管理电子公告,和部分数据表;软件模块说明如下:汽车销售管理系统模块名称功能名称功能描述录入员模块定车计划各网点向车行提交的订单计划表,表明要定的车定单录入车行向厂家提交的订货订单,可添加或删除此订单信息入仓单录入填写入仓单将车辆入库,并附带生成一份商品车检验单表作为车辆跟踪记录(但前提是财务已输入车辆合格证号,并且合格证状态为未入库)调配各个网点之间调配车辆,填写车辆调配单表作为历史记录销售车辆买出后,填写销售表单,并附带填写客户质料表,作为售后服务的依据(前提是财务收到车款后,将该车的合格证状态为该车已销售)车辆改装在销售过程中,根据客户需求,可以对某种车型进行一定的改装借用项目管理当从某辆车借用某个配件或者借用整车时,填写借用申请单作为记录经理模块查询该模块不设置条件查询,只提供所有的表单查询,即选择相应的表单,显示所有的列表值删除决定是否批准录入员的删除要求,批准后,记录直接从数据库中删除;否决后,不改动数据库,并提示录入员要求未批准;统计统计销售数量,销售额,进货额,也可显示比例图形系统管理员模块添删登陆人员与权限分配电子公告管理添加和删除公告信息维护数据表具体的为:车型表、汽车颜色表、网点表,对这几张表有添加、修改和删除功能。财务人员模块合格证管理当一辆新车运到时,财务在系统中添加合格证号,等车辆要销售时,财务在系统中修改合格证的状态,并将合格证和车辆一并交给客户第四章 系统详细设计与实现第一节 经理数据统计模块1.1基本流程1.2实现方法为了统计方便,我设想统计条件都使用下拉选择框,并且条件是可选的,有选择的都视为统计条件,没有选择的则不视为统计条件。显示结果时,将选中的条件与统计结果(售车总数,销售总额,定货总额)一起显示。要使用选择框选择统计条件,就要在制定HTML页面的过程中使用JSP与数据库交互,从数据库中找出对应的条件名字。以统计条件网点号为例,我们使用了如下的JSP代码段:网点号% java.sql.ResultSet rsb=null;rsb=connect.query(select * from branch;);while(rsb.next()String sb1=new String(rsb.getString(branch_id).getBytes(ISO-8859-1), GB2312);/获得网点号String sb2=new String(rsb.getString(branch_name).getBytes(ISO-8859-1), GB2312);/获得网点名out.print(+sb2+);%特别注意+sb2+,我在这里将option的显示信息赋为网点名,却将option的值赋为网点号。这与我们统计的销售表的格式有关:Sale_id(销售单号)Car_id(车身号)Color_id(颜色号)Car_type_id(车型号)Branch_id(网点号)Saleman_name(售车员名)Sale_price(销售价)Sale_date(销售日期)Delete_sta(是否删除标志) 表一:Sale(销售表)销售表中保存的是branch_id(网点号)。这样一来,使用request.getParameter(branch),就能够获得可在sale中直接查询的branch_id了。要在同一页面中选择多个条件,有选则视为统计条件,没选则不视为条件,只需将用户没有选择的条件值设为“”(代表所有值),这样采用如下的SQL语句,就可以查询出满足所有条件(车型,网点,颜色,起始时间,终止时间)的记录总数,即售车总数;sql=select count(*) as counter from sale where car_type_id like %+car_type_id+%;sql=sql+and branch_id like %+branch_id+%;sql=sql+and color_id like %+color_id+%;sql=sql+and sale_date between +from_time+ and +to_time+;售车总额,进货总额的计算算法描述如下:1. 用如上的SQL语句获得满足统计条件的记录集RS.2. WHILE(RS.NEXT()3. car_id=RS.getString(car_id);4. price+=RS.getFloat(sale_price);5. 用SQL:select price from car_list where car_id=+car_id+获得记录集RS2;6. WHILE(RS2.NEXT())7. inprice+=RS2.getFloat(price);8. END WHILE9. END WHILE其含义为:在满足统计条件的记录集RS中获得car_id(车身号),sale_price(销售价),将RS中每条记录的sale_price 不断累加起来,就获得了售车总额price;进货总额需将所有满足条件的汽车的进货额累加起来,而进货额只有在表car_list(商品车检验单表)中有,因此需连接sale和car_list,而连接词是car_id(车身号)。因此用select price from car_list where car_id=+car_id+就可以获得满足统计条件的car_list中的记录集,再累加其price(进货价),就获得了进货总额inprice.显示选中的统计条件,只需将从上一表单中获得的信息如网点号,int branch_id=request.getParameter(branch),加一判断条件:If branch_id.equals(“%”)Out.println(“”);/%代表没有选中,因此就不必显示Else用如下的SQL语句:branch_sql = select branch_name from branch where branch_id=+ branch_id;获得网点名,显示在页面。结果显示如下:第二节 经理图形统计模块2.1基本流程 2.2 实现方法图形统计,就是要按不同的条件(目前我只先设想了按网点号,按车型,按颜色三个较容易实现的条件),显示内部的售车数的比例图。以按网点统计为例,需知道各网点的售车数和售车总数。售车总数的计算算法描述如下:1. 用sql=select * from branch获得记录集RS;2. WHILE(RS.NEXT())3. branch_id=RS.getString(branch_id);4. 用sql2=select count(sale_id) as saleresult from sale where branch_id=+branch_id+获得记录集RS2;5. WHILE(RS2.NEXT())6. salecounter=rs5.getInt(saleresult);7. total+=salecounter;8. END WHILE;9. END WHILE;其含义为:对每个网点号,获得在sale(销售表)中对应的销售记录数,既各网点的售车数salecounter,再累加起来,获得售车总数total;在获得售车总数后,就可以用比例图显示各网点的销售情况了。我采用的策略是使用同一幅显示图,只是在各网点的图形显示时改变其width属性,都变为该网点的售车数和售车总数的比率。比例图显示的算法描述如下:1. 用sql=select * from branch获得记录集RS;2. WHILE(RS.NEXT())3. branch_id=RS.getString(branch_id);4. 用sql2=select count(sale_id) as saleresult from sale where branch_id=+branch_id+获得记录集RS2;5. WHILE(RS2.NEXT())6. salecounter=rs5.getInt(saleresult);7. 获得比率 h=100*(float)salecounter/(float)total);8. out.println(branch_name+ + salecounter+);9. END WHILE;10. END WHILE;前6步都与计算售车总额的步骤一致,在获得各网点的销售数salecounter后,就取得各网点的售车数和售车总数的比率h,并以此作为该网点图片显示的width属性,width=h;这样就可以获得错落有致的比率图了。显示结果如下:第三节 入仓模块3.1基本流程 3.2实现方法入仓管理就是要将新车信息登记入数据表,留下历史记录。这里涉及两个表,cargo_bill(入仓单表,车辆入库的记录)和car_list(商品车检验单表,车辆信息)。Cargo_id(入仓单号)Receive_date(入仓日期)Cargo_checker(验收员)Cargo_admin(仓管员)Delete_sta(删除标致) 表二cargo_bill(入仓单表)Car_id(车身号)Cargo_id(入仓单号)Coq_id(合格证号)Color_id(颜色号)Car_type_id(车型号)Produce_date(生产日期)Branch_id(网点号)Car_status(车辆状态)Price(进货价)Delete_sta(十分删除标志) 表三car_list(商品车检验单表)根据数据表结构,入仓页面如下设计:其中,合格证号中显示的只能是合格证状态为未入库的车辆,已在库的就不用再入库了。使用如下SQL语句:sql = select distinct coq_id from coq where coq_status=未入库;表单填写完毕,按提交按扭,则可通过request.getParameter(cargo_id)获得,要将这些信息显示在一个页面上,供录入员确认。这里又有一个问题,通过request.getParameter(“”)方法获得的车型,颜色和网点项都是id,这不利于录入员确认。我们采用了了以牺牲效率为代价的方法,即在确认信息显示时,再次以id连接数据表,获取name。以颜色为例:1. 用request.getParameter(color_id)获得color_id(颜色号);2. 用SQL语句color_sql = select color_name from color where color_id=+ color_id获得记录集RS;3. WHILE(RS.NEXT())4. RS.getString(color_name)获得颜色名;5. END WHILE;但我们通过隐性表单传递给插入数据库页面的值,仍是车型,颜色和网点的id,这是由数据表的结构决定的。input type=hidden name=color value=接着,采用如下的SQL语句:sql=insert into cargo_bill (cargo_id,receive_date,cargo_checker,cargo_admin) values ( +in_num+,+in_time+,+name1+,+name2+);sql2=insert into car_list (car_id,cargo_id,coq_id,color_id,car_type_id,produce_date,branch_id,car_status,price) values ( +car_id+,+in_num+,+qua_num+,+color_int+,+car_type_id+,+produce_date+,+branch_id+,+status+,+pricef+);就可以分别将数据插入表cargo_bill和car_list了。在这同时,还需做的就是,改变coq(合格证表)中的coq_status(车辆状态)为“车辆在库”,使用如下SQL语句:updateSql=update coq set coq_status=该车在库 where coq_id=+qua_num + ; 第四节 车辆调配模块4.1基本流程4.2实现方法调配车辆时,需要改变车辆的存放地点,并填写调配单translate作为记录。我的设想是先按车身号查询要调配的车辆信息,修改其存放网点。但应注意只能调配在库的车辆,因此在让用户选择调配车辆的车身号时,显示的车身号就应有限制。使用如下的SQL语句:String sql = new String(select car_id from car_list where car_status=在库.getBytes(GB2312), ISO-8859-1);在从ResultSet中获取值时,应注意字段的类型,不同的类型使用不同的get方法:如是String类型的就用rsc.getString(cargo_id) 方法;如果是float类型,就使用rsc.getFloat(price)方法;由于调配单的内容与商品车检验单内容有一致的地方,为了方便用户,我们将可以从商品车检验单中得到的内容直接写入调配单,成为不可更改状态,减少用户的工作量。如车身号的显示:车身号%String car_id=new String(request.getParameter(car_id).getBytes(ISO-8859-1), GB2312);/直接从前面得到car_id(车身号)out.print();/car_id直接显示在调配单页面,且为不可更改状态:disable=”true”%接着提示用户填写调配单,最后在car_list 表中改变车辆存放网点,同时将调配单信息存入translate就可以了。第五章 遇到的问题和总结开发这个系统,遇到的问题是比较多的,一些比较重要的问题及解决方法是:1从数据库中读取或写入数据时的乱码解决技术刚开始时,由于直接将string写入数据表,可读出来显示时却是一堆问号或乱码。这是因为JAVA中默认的编码方式是UNICODE,而我们通常使用的文件和DB都是基于GB2312或者BIG5等编码。我的解决方法是:对于在网页中输出中文:JAVA在网络传输中使用的编码是ISO-8859-1,故在输出时需要进行转化,如:Stringstr=中文;str=newString(str.getBytes(GB2312),8859_1);但如果在编译程序时,使用的编码是“GB2312”,且在中文平台上运行此程序,不会出现此问题。对于从参数中读取中文:这正好与在网页中输出相反如:str=newString(str.getBytes(8859_1),GB2312);2在JSP页面中正常显示中文刚开始在JSP页面中总是不能正常显示中文,会出现各种乱码。经研究后发现只要在页首加入如下语句:就能正常显示中文了3 Tomcat中SQL语句错误提示的解决在做经理数据统计模块时,我起初的想法是:用branch_id=”条件判断统计条件是否为空,为空则将值设为“%”(代表所有),再用如下的SQL语句就可以统计数据了。sql=select count(*) as counter from sale where car_type_id like %+car_type_id+%;sql=sql+and branch_id like %+branch_id+%;sql=sql+and color_id like %+color_id+%;sql=sql+and sale_date between +from_time+ and +to_time+;但发现虽然能正常显示统计结果,但Tomcat中总提示SQL语句有问题。后来才发现那个判定条件有问题。因为网点号branch_id= request.getParameter(branch),获得的是一个字符串;因此判断条件:branch_id=”无效,根本没有将branch_id值赋为“%”;后来改用判断条件:branch_id.equals(“”)后,就成功解决了此问题,Tomcat不在报告错误了。4翻页问题的解决刚开始总是不能正常的显示翻页,经一翻研究后,才发现其基本操作:%java.lang.StringstrSQL;/SQL语句 intintPageSize;/一页显示的记录数 intintRowCount;/记录总数 intintPageCount;/总页数 intintPage;/待显示页码 java.lang.StringstrPage; inti; /设置一页显示的记录数intPageSize=2; /取得待显示页码 strPage=request.getParameter(page); if(strPage=null) /表明在QueryString中没有page这一个参数,此时显示第一页数据 intPage=1; else /将字符串转换成整型 intPage=java.lang.Integer.parseInt(strPage); if(intPageintPageCount)intPage=intPageCount; % 后面关键的一段是:0) /将记录指针定位到待显示页的第一条记录上 sqlRst.absolute(intPage-1)*intPageSize+1); /显示数据i=0; while(i 第页共页 %if(intPageahref=mysqlpage.jsp?page=下一页 1)%ahref=m
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 煤矿下料口管理办法
- CQI审核管理办法
- 临床质控员管理办法
- 煤矿灾害防治与重大事故处理课件
- 福建省薪酬管理办法
- 中国洗染业管理办法
- 物流分包方管理办法
- 甲方与结算管理办法
- 陕西浮桥管理办法
- j酒店车辆管理办法
- 2023年中国(浦东)知识产权保护中心专利预审员招聘笔试参考题库附带答案详解
- 勘界定标技术报告
- von frey丝K值表完整版
- 危险性较大的分部分项工程施工前安全生产条件核查表
- GB/T 5696-2006预应力混凝土管
- GB/T 528-2009硫化橡胶或热塑性橡胶拉伸应力应变性能的测定
- GB/T 3299-1996日用陶瓷器吸水率测定方法
- 大客户战略管理
- 精轧机组机械设备使用说明书
- 2022年机械制图期末试卷及答案
- 设备维护保养制度-设备维护保养制度规定
评论
0/150
提交评论