项目报告
进销存管理系统的设计与实现
进入21世纪以来,商业管理中需要处理的数据和信息越来越多。大量的数据和繁杂的数据使得古老的手工处理数据的方式渐渐显得力不从心。甚至有些信息处理的方式在手工处理的模式下是根本无法是实现的,只能利用计算机的高运行频率来进行迭代计算。而且最近国家正在提倡大众创业,中小型企业很多。中小企业在我国经济发展中具有重要地位,目前我国的中小企业数量多,地区分布广泛,行业分布跨度大。随着全球经济一体化的发展和电子商务的兴起,中小企业之间的竞争将越来越激烈。网络及电子商务的迅猛发展突破了时间、空间的局限性,给中小企业带来了更多的发展机会,同时也增大了企业之间的竞争强度。这就要求中小企业必须改变企业的经营管理模式,提高企业的运营效率。随着技术发展,电脑操作及管理日趋简化,电脑知识日趋普及,同时市场经济快速多变,竞争激烈,企业采用电脑管理进货、库存、销售等诸多环节也已成为必然趋势。
关键词:进销存管理系统;B/S结构;mysql数据库;JSP;spring;springMVC;spring boot;JPA
目 录
第一章 绪论................................................................................ 1
第二章 相关技术与方法............................................................ 3
第三章 系统分析......................................................................... 6
第四章 系统设计...................................................................... 16
第五章 系统实现...................................................................... 35
第六章 系统测试...................................................................... 47
第七章 总结............................................................................... 53
参考文献..................................................................................... 54
致 谢......................................................................................... 55
目前,许多的中小企业普遍存在一个问题:企业的决策者看到的进销存资料及相关报表都是比较繁杂,让本应该一目了然的结果因信息的分散使得产生的结果无法保持一致和完整,造成企业在进销存管理上问题很多。由此发展而来的进销存管理系统就能够很好的解决上面出现的问题,能够将数据快速转化为有效信息,为企业管理者制定生存发展决策提供了依据。
在现今社会中,各个产品的质量都相差不大,现在顾客对个性化服务的期望值越来越高,在产品质量一样的情况下顾客更看重的是哪家的服务更好。企业的竞争已渐渐从产品的竞争这个战场转变到服务的竞争这个战场,因此企业要发展的话就必须要进一步优化业务流程来提高企业自身的竞争能力。因此,加强进销存管理是企业能适应现阶段发展的必然,通过计算机来快速准确地完成大量本来由人工手工完成的工作,这是真正达到合理和充分利用现有资源,减轻了员工的工作压力,提高了企业的生产效率。
信息已深入到现代社会的各个行业,因此信息的管理需要有一个信息管理系统,进销存管理系统就是这样一个系统。进销存管理系统开发的市场将是非常庞大的。在这飞速发展的信息时代,这类的信息管理系统的开发为中小型企业带来了方便和有效的信息,促进了经济的发展。
实现一个进销存管理系统,实现对企业运作过程中的进货、销售、仓储的电子化操作,可以节省大量人力物力,可以说对企业的运作带来不可限量的好处。实现一个简单实用,操作界面友好的进销存管理系统是首要解决的任务。然后一是要实现对库存数据进行分析,对接下来的进货进行一些指导;二是实现对销售数据的采集分析,对企业决策者对下一个季度或者年份的销售计划提供一个参考的功能。系统肯定要具备对进销存的一些基本的增删改查操作。
第一章绪论:主要叙述了进销存管理系统开发的缘由和意义,也就是开发这个系统的背景。开发这个系统有哪些优点,开发的这个系统具备哪一些功能,或者说能开发出哪些功能,对这些功能进行了一个概述。
第二章相关技术和方法:本章节首先是概述了系统的结构,用那些技术搭建的开发环境;接下来是简单介绍了一下关键功能和是怎么实现这些关键功能;最后是介绍了用到的开发工具。
第三章系统分析:本章节的重点系统分析,主要从可行性分析和需求分析两方面入手。可行性分析从技术可行性、经济可行性、操作可行性三个方面进行综合分析,最终得出系统开发的可行;需求分析从两个方面分析:系统总体需求和用例图分析,从这两个方面确定系统是可行的。
第四章系统设计:本章节主要分为系统类设计、关键业务设计、数据库设计三个模块。系统类设计主要是用类图来呈现系统中类的一些属性和功能;关键业务设计主要是用顺序图来直观的呈现这些功能的处理流程和处理步骤;数据库设计首先是用了ER图来直观的把数据库表的一些属性表示出来,其次对涉及到的每一张表都进行了分析和介绍。
第五章系统实现:本章节主要是对核心功能介绍,首先是功能描述,然后附上实现的界面,接下来详细描述功能的实现过程并且附上实现这些功能的核心代码。
第六章系统测试:本章是说明测试目标和测试计划,对测试目标给出测试用例,并分析测试结果是否达到系统预期,如未达到提出改进的措施。
第七章总结:本章主要是对进销存系统的设计的整个过程做一个总结,说明本论文的结构组成,从绪论开始到总结结束,对每一个大的章节内容进行简单的叙述。并且阐述了自己的收获与不足,给出不足的解决方案。
本章从研究的背景开始,叙述了进销存管理系统开发的整个流程,为什么要开发这个系统,开发这个系统有啥优势。其次就是描述了本系统需要开发出什么的功能,需要具备什么样的功能,能否开发出这些功能。最后对正文的每个章节进行了一个简单的描述。
本系统设计采用的是MAVEN + SPRING BOOT+ JPA 的架构来搭建的项目。Maven是一个不错的项目管理工具,它包含了一个项目对象模型,一组标准集合,一个项目生命周期,一个依赖管理系统,和用来运行定义在生命周期阶段中插件目标的逻辑。由于 Maven 的缺省构建规则具有不错的可重用性,因此用Maven 可以快速的构建项目。Spring Boot是由Pivotal团队提供的全新框架,设计这个框架目的就是用来简化Spring应用的初始搭建以和开发过程。这个框架使用了特定的方式做配置,因此开发人员不需要和传统的Spring应用一样写大量的配置文件。Springboot具有以下优势:创建的Spring应用程序是独立的;本身嵌入了Tomcat,无需部署WAR文件;Maven配置作了简化;自动配置Spring。因此用maven加上spring boot可以让我们快速的搭建起项目来,可以省去很多繁琐的步骤。
JPA全称为Java Persistence API,是通过注解或者XML来描述对象-关系表的映射关系,并且可以将在运行的Entity类对象存储到数据库中去。使用JPA可以打破一般简单持久化框架的局限,在我们开发企业级应用中发挥更大作用,因为JPA支持容器级事务:大数据集、事务、并发等。使用JPA创建实体非常简单,就和我们平常创建一个JAVA类一样,不存在任何的约束和限制,我们只需要在对应的实体上标注javax.persistence.Entity注解即可;开发人员很容易就可以掌握JPA,因为JPA没有特殊的规则和太多的设计模式,框架和接口都很简单。JPA采用的原则是非侵入式原则,因此对其他框架的兼容性很好,易于和其他框架集成。JPA中定义了和Hibernate HQL相似的QL:JPQL,它是EJB QL的一种拓展,操作的对象是实体,而不是关系数据库的一张表。而且能够正常的支持SQL才能够提供的高级查询特性:批量修改和更新、JOIN、GROUPBY、HAVING等,并且支持子查询功能。最重要的是JPA也支持面向对象的高级特性,这样的话开发者在开发企业级应用时能够最大化的使用面向对象的模型来设计,而不用自己来处理这些特性的持久化。
用这三个技术搭建项目框架,可以快速完成,省去许多简单繁杂的步骤,对于我们快速开发是有非常大的优势的。
作为一个进销存管理系统,其最根本的功能还是在对采购管理、销售管理和库存管理上面,其他的功能都是在这个的基础上才能够开发出来。基础功能也就是对进货、销售和库存的增删改查。其中对进货订单的添加和销售订单的添加,每个订单都含有一个或者多个商品,因此订单生成时做了跟购物车类似,我们可以把商品一个一个添加到这个购物车上,等我们商品添加完成,此时可以提交订单,这样就产生 了一个进货订单或者销售订单。跟数据库打交道肯定少不了连接数据库的技术,在本系统用到的是JPA,JPA本身有许多默认的增删改查的方法,并且不用写配置文件,而且可以自己个性化定制sql语句,只需要写一个接口继承JPARepository接口,然后在这个接口里写抽象方法,在方法上写注解就可以了,很方便。
首先是数据分析功能,因为我们本身数据库里存有大量的销售数据库,所以我们就不用去收集数据了,直接对数据库里的数据进行分析即可。第一阶段:探索性数据分析,因为数据库里的数据是杂乱无章的,因而看不出规律。因此我们需要通过作图、表格、用各种形式的方程拟合、计算某些特征量等手段来找出某些可能的关联或某些隐含在数据中的规律。第二阶段:选定模型进行分析,接下来我们通过前面的初步操作,在探索性分析的基础上提出一种或几种可能的模型,然后通过进一步分析从里面挑选最符合当前发展的几个模型。第三阶段:推断分析,使用数理统计方法对第二阶段所定的模型做出以下判断:估计的可靠程度,精确程度作出推断。选定最终的模型。
其次是数据备份功能,企业在运转中,系统难免会出现一些突发情况导致数据的丢失、损坏。因此当出现这些情况时,我们就需要把备份的数据恢复到数据库中去。备份数据时会占用较大的IO资源的,因此我们需要选择一个对系统影响尽可能地小的时段来进行数据的备份;对重要的数据,要保证在极端情况下的数据都可以正常恢复。在选择备份方案时要考虑到实施方案的可操作性和经济性,因此选择了逻辑备份,此方法不需要数据库运行在归档模式下,不但备份简单,而且可以不需要依赖外部存储设备。
系统前段页面采用jsp + JavaScript + css的组合技术开发,其中JavaScript使用了jQuery和bootstrap框架,这两个前段框架让我们能更友好的使用JavaScript。省去了许多步骤,简化了我们的使用。数据库使用的是MySQL数据库,MySQL 是现阶段最流行的关系型数据库之一,因为它的体积小、运行速度快、免费,尤其是开放源码这一特点,一般中小型网站的开发都会选择MySQL作为网站数据库。考虑到系统设计的用户群体以及MySQL数据库的这些优点,于是选择了MySQL数据库作为开发数据库。开发使用的IDE工具是:Spring tool suit,这个IDE工具是Spring官网推荐的开发工具,在使用Spring体系的框架开发应用是,这个IDE工具具有很多优势。Web服务器是使用的Spring boot内置的Tomcat服务器。根据以上选择的框架、工具,选择了JDK1.8作为开发、编译环境。
本章主要简单叙述了系统使用了的框架、用了哪些开发工具。重点介绍如何实现系统的核心功能,还有实现这些功能用到了哪些技术,对这些方面进行了阐述。
基于本项目用到的spring boot、JPA、mysql、jQuery等技术都已经是成熟的开发技术了,完全可以满足本项目的开发需求。项目主要功能所涉及的一些技术都能是能够实现的,因此在技术上是可行的。
企业在运转过程中信息的系统化管理,运用电脑对数据进行自动化的统计,为企业在制定经营决策时提供了大量的、权威的科学数据;强大的进销存数据统计功能,大大简化了员工的日常工作,工作效率提高了很多,大大降低了人工管理过程中数据易错所带来的一系列的不良反应,提高了企业的经济效益。可以节省大量的人力物力,并且现在不会存在之前人工操作产生的人工误差的情。可以说是大大提高了企业的经济效益。因此,本系统在经济上也是可行的。
系统需要具备以下功能:
⑴一般企业人员的计算机知识掌握的不多,因此要求有良好的人机交互界面,这样对操作这个系统的企业人员比较友好。
⑵对于本系统使用对象的不同,需要给予不同的权限。
⑶支持多条件语句查询,方便进销存数据的查询。
⑷基础信息管理与查询(包括商品信息、客户信息、供应商信息)。
⑸一键点击,能够直接查看仓库所有商品的库存信息。
⑹方便、健全的账单统计功能。
⑺图表分析年销售状况。
⑻商品销售排行统计。
⑼当停电、网络病毒的原因损坏本系统数据时,系统可以还原系统的数据。
⑽各种数据的统计计算自动完成,尽可能的减少人工干预。
⑾系统退出。
-
-
-
-
-
-
-
- 质量要求
-
-
-
-
-
-
主要质量属性 | 详细要求 |
正确性 | 按照需求正确执行任务,完成各个模块的相应要求。 |
健壮性 | 具有较高的容错能力和恢复能力。 |
性能效率 | 响应用户的请求的时间越短越好。 |
易用性 | 系统开发过程中应该有详细的文档,这样让别人能够更好的使用。 |
安全性 | 防止软件受到意外或蓄意的存取、使用、修改、毁坏或泄密导致系统的数据丢失。 |
可扩展性 | 能方便的进行二次开发,满足对功能的扩展或提高并能提高相应的安全机制。 |
兼容性 | 不易与其他软件起冲突。 |
图3-1系统管理用例图
系统管理用例有配置系统、管理部门、管理员工、管理权限,这里主要介绍一下管理权限,具体说明见表3-1:
表3-1管理权限
用例编号 | UC01 | |
用例名称 | 管理权限 | |
用例概述 | 系统管理员通过此用例管理系统中的用户的操作权限 | |
主参与者 | 管理员 | |
前置条件 | 管理员身份正确登录 | |
基本事件流 | 步骤 | 活动 |
A1 | 选择需要的操作,增加、修改、删除用户权限 | |
A2 | 输入用户权限信息 | |
A3 | 保存输入的信息 | |
扩展事件流 | 1a | 用户名不存在,返回提示信息 |
1b | 操作权限不存在,返回提示信息 |
图3-2财务用例图
财务用例有查询应收款项、记录应收应付款项、管理发票,这里主要介绍一下记录应收应付款项,具体说明见表3-2:
表3-2记录应收应付款项
用例编号 | UC02 | |
用例名称 | 记录应收应付款项 | |
用例概述 | 系统管理员通过此用例管理系统中的用户的操作权限 | |
主参与者 | 财务 | |
前置条件 | 无 | |
基本事件流 | 步骤 | 活动 |
A1 | 选择需要的操作,增加、修改、删除应收应付款项 | |
A2 | 输入应收应付款项信息 | |
A3 | 保存输入款项信息 |
图3-3 采购部分用例图
采购部分用例有两个角色采购员和采购经理。采购员用例有采购单、管理供应商、管理商品信息;采购经理用例有审批采购单、管理商品分类。具体说明见表3-3至表3-4:
表3-3采购单
用例编号 | UC03 | |
用例名称 | 采购单 | |
用例概述 | 采购员通过此用例来生成采购单 | |
主参与者 | 采购员 | |
前置条件 | 无 | |
基本事件流 | 步骤 | 活动 |
A1 | 选择需要的操作,增加、修改、删除采购单 | |
A2 | 输入需要采购的商品信息 | |
A3 | 保存输入的信息 | |
扩展事件流 | 1a | 输入的商品不存在,返回提示信息 |
1b | 输入商品信息错误,返回提示信息 |
表3-4审批采购单
用例编号 | UC04 | |
用例名称 | 审批采购单 | |
用例概述 | 采购经理通过此用例来对采购员生成的采购单审批 | |
主参与者 | 采购经理 | |
前置条件 | 采购经理身份正确登录 | |
基本事件流 | 步骤 | 活动 |
A1 | 选择需要审批采购单 | |
A2 | 审批采购单 | |
扩展事件流 | 1a | 采购单不存在,返回提示信息 |
图3-4库存部分用例图
库存部分总共有质检员、库存管理员、仓库经理三个角色,涉及到的用例比较多,这里具体介绍一下出入库单、确认入库单、开出库单、统计库存信息、出调拨单,具体说明见表3-5至表3-9:
表3-5出入库单
用例编号 | UC05 | |
用例名称 | 出入库单 | |
用例概述 | 质检员通过此用例管理仓库出库入库单 | |
主参与者 | 质检员 | |
前置条件 | 无 | |
基本事件流 | 步骤 | 活动 |
A1 | 选择需要的操作,增加、修改、删除出入库单 | |
A2 | 输入出库或入库单信息 | |
A3 | 保存出库或入库单信息 |
表3-6确认入库单
用例编号 | UC06 | |
用例名称 | 确认入库单 | |
用例概述 | 库存管理员通过此用例确认质检员开出的入库单 | |
主参与者 | 库存管理员 | |
前置条件 | 无 | |
基本事件流 | 步骤 | 活动 |
A1 | 选择入库单 | |
A2 | 确认入库单信息 |
表3-7开出库单
用例编号 | UC07 | |
用例名称 | 开出库单 | |
用例概述 | 库存管理员通过此用例生成出库单 | |
主参与者 | 库存管理员 | |
前置条件 | 无 | |
基本事件流 | 步骤 | 活动 |
A1 | 选择需要出库的物品信息 | |
A2 | 生成出库单 |
表3-8统计库存信息
用例编号 | UC08 | |
用例名称 | 统计库存信息 | |
用例概述 | 仓库经理通过此用例统计库存信息 | |
主参与者 | 仓库经理 | |
前置条件 | 仓库经理身份正确登录 | |
基本事件流 | 步骤 | 活动 |
A1 | 统计库存信息 |
表3-9出调拨单
用例编号 | UC09 | |
用例名称 | 出调拨单 | |
用例概述 | 仓库经理通过此用例生成调拨单 | |
主参与者 | 仓库经理 | |
前置条件 | 仓库经理身份正确登录 | |
基本事件流 | 步骤 | 活动 |
A1 | 根据需求生成调拨单 |
图3-5销售部分用例图
销售部分用例图包括销售经理和销售员两种角色,销售经理用例有统计销售信息;销售员用例有管理客户、查询商品库存、下订单、确认订单具体说明见表3-10至表3-12:
表3-10统计销售信息
用例编号 | UC10 | |
用例名称 | 统计销售信息 | |
用例概述 | 销售经理通过此用例统计销售信息 | |
主参与者 | 销售经理 | |
前置条件 | 销售经理身份正确登录 | |
基本事件流 | 步骤 | 活动 |
A1 | 统计销售信息 |
表3-11查询商品库存
用例编号 | UC11 | |
用例名称 | 查询商品库存 | |
用例概述 | 销售员通过此用例查询商品库存 | |
主参与者 | 销售员 | |
前置条件 | 无 | |
基本事件流 | 步骤 | 活动 |
A1 | 输入需要查询的商品名称 | |
A2 | 查询出商品库存信息 |
表3-12下订单
用例编号 | UC12 | |
用例名称 | 下订单 | |
用例概述 | 销售员通过此用例生成订单 | |
主参与者 | 销售员 | |
前置条件 | 无 | |
基本事件流 | 步骤 | 活动 |
A1 | 拿到客户的订单 | |
A2 | 生成订单信息 |
本章主要是进行了系统的分析,首先第一节是可行性分析,从技术可行性、经济可行性、操作可行性三个角度对系统分析是否是可行的,最终得出本系统是可行的。第二节是需求分析分析了系统所具备的一些的功能,然后重点介绍了一些特色功能。接着第二节是需求分析,第一小节阐述了系统的总需求,应该具备哪些功能;第二小节通过用例图对需求主要功能进行了具体分析。
经分析,该系统核心业务类见下图:
-
-
-
-
-
-
-
-
- 系统核心类
-
-
-
-
-
-
-
MANAGER类用于记录系统的用户信息,并完成登陆和注销的操作。
表4-1 MANAGER类功能表
类功能描述 | 处理和用户相关的业务操作 | ||||
所在包名称 | Com.xu.bean | ||||
继承对象 | 无 | ||||
实现对象 | |||||
类属性 | |||||
保护属性 | 类型 | 名称 | 描述 | 备注 | |
Private | Long | ID | 用户ID | 系统中用户的唯一标示,由系统自动生成 | |
Private | String | Name | 姓名 | 长度限制20位 | |
Private | String | Password | 密码 | 长度限制20位 | |
Private | String | Gender | 性别 | 只能为男或者女 | |
Private | Long | Age | 年龄 | ||
Private | String | Phonenumber | 手机号码 | ||
主要实现方法 | |||||
保护属性 | 方法名 | 输入参数 | 输出参数 | 方法功能描述 | |
Public | login | string id,string pwd | Manager" | 登陆系统,用户输入ID和PASSWORD后进行验证,验证通过返回用户,验证返回NULL。 | |
Public | Register | Manager manager | int | 员工注册,输入用户信息进行注册,注册成功返回注册成功消息 | |
GOODS类用于记录商品的信息,并且实现对商品的增删改查等功能。
表4-2 GOODS类功能表
类功能描述 | 处理和商品相关的业务操作 | |||
所在包名称 | Com.xu.bean | |||
继承对象 | 无 | |||
实现对象 | ||||
类属性 | ||||
保护属性 | 类型 | 名称 | 描述 | 备注 |
Private | Long | ID | 商品ID | 系统中商品的唯一标示,由系统自动生成 |
Private | String | Name | 商品名称 | |
Private | String | Unit | 单位 | |
Private | String | Space | 商品产地 | |
Private | Long | SupplierId | 供应商编号 | |
Private | String | ApproveId | 批准文号 | |
Private | String | BatchId | 生产批号 | |
主要实现方法 | ||||
保护属性 | 方法名 | 输入参数 | 输出参数 | 方法功能描述 |
Public | save | Goods goods | int | 商品添加,输入商品信息进行添加,添加成功返回1,失败返回0 |
Public | deleteGoodsByName | String name | int | 商品删除,输入商品名字进行删除,删除成功返回1,失败返回0 |
Public | findAllGoods | List<Goods> | 查找出所有的商品 | |
Public | findGoodsCountByName | String name | int | 查找某种商品的总数,输入某种商品的总数,返回该商品的库存数量 |
-
-
- SALEORDER类
-
SALEORDER类用于记录销售订单的信息,并且实现对销售订单的增删改查等功能。
表4-3 SALEORDER类功能表
类功能描述 | 处理和销售订单相关的业务操作 | |||
所在包名称 | Com.xu.bean | |||
继承对象 | 无 | |||
实现对象 | ||||
类属性 | ||||
保护属性 | 类型 | 名称 | 描述 | 备注 |
Private | Long | ID | 销售订单ID | 系统中销售订单的唯一标示,由系统自动生成 |
Private | Long | CustomerId | 客户ID | 引用自客户ID,是唯一的 |
Private | String | pay | 结算方式 | |
Private | Date | saleDate | 销售时间 | |
Private | Double | Total | 总金额 | |
主要实现方法 | ||||
保护属性 | 方法名 | 输入参数 | 输出参数 | 方法功能描述 |
Public | save | SaleOrder saleorder | int | 销售订单添加,输入订单信息进行添加,添加成功返回1,失败返回0 |
Public | delete | Long customerId | int | 销售订单删除,输入客户ID进行删除,删除成功返回1,失败返回0 |
Public | findAllSaleOrder | List<SaleOrder> | 查找出所有的销售订单 | |
Public | update | SaleOrder order | int | 更新订单信息,输入要更改的信息更新,更新成功返回1,失败返回0 |
-
-
- PURCHASEORDER类
-
PURCHASEORDER类用于记录采购订单的信息,并且实现对采购订单的增删改查等功能。
表4-4 PURCHASEORDER类功能表
类功能描述 | 处理和采购订单相关的业务操作 | |||
所在包名称 | Com.xu.bean | |||
继承对象 | 无 | |||
实现对象 | ||||
类属性 | ||||
保护属性 | 类型 | 名称 | 描述 | 备注 |
Private | Long | ID | 采购ID | 系统中采购订单的唯一标示,由系统自动生成 |
Private | Long | supplierId | 供应商ID | 引用自供应商ID |
Private | String | pay | 结算方式 | |
Private | Date | inDate | 采购时间 | |
Private | Double | total | 总金额 | |
主要实现方法 | ||||
保护属性 | 方法名 | 输入参数 | 输出参数 | 方法功能描述 |
Public | save | purchaseOrder purchaseorder | int | 采购订单添加,输入订单信息进行添加,添加成功返回1,失败返回0 |
Public | delete | Long supplierId | int | 采购订单删除,输入供应商ID进行删除,删除成功返回1,失败返回0 |
Public | findAllPurchaseOrder | List<PurchaseOrder> | 查找出所有的采购订单 | |
Public | update | PurchaseOrder order | int | 更新订单信息,输入要更改的信息更新,更新成功返回1,失败返回0 |
-
-
- STOCK类
-
STOCK类用于记录库存的信息,并且实现对库存的增删改查等功能。
表4-5 STOCK类功能表
类功能描述 | 处理和库存相关的业务操作 | |||
所在包名称 | Com.xu.bean | |||
继承对象 | 无 | |||
实现对象 | ||||
类属性 | ||||
保护属性 | 类型 | 名称 | 描述 | 备注 |
Private | Long | ID | 采购ID | 系统中采购订单的唯一标示,由系统自动生成 |
Private | Long | goodsId | 商品ID | 引用自商品ID |
Private | Long | count | 商品库存数量 | |
Private | String | area | 存放地方 | |
主要实现方法 | ||||
保护属性 | 方法名 | 输入参数 | 输出参数 | 方法功能描述 |
Public | save | Stock stock | int | 库存添加,输入库存信息进行添加,添加成功返回1,失败返回0 |
Public | delete | Long goodsId | int | 库存删除,输入商品ID进行删除,删除成功返回1,失败返回0 |
Public | findAllStock | List<Stock> | 查找出所有的商品库存 | |
Public | update | Long goodsId , Long count ,String area | int | 更新商品库存信息,输入要更改的信息更新,更新成功返回1,失败返回0 |
关键业务与用例图之间存在一定的对应关系,原则上用例图中所提出的用例应该在关键业务分析中体现,每一个用例对应一个时序图,每个时序图后面应当有一段简短的说明,时序图用WORD绘制比较难,可以借用其他工具,但复制过来时应尽量只有黑白颜色,下面以登录为例说明关键业务的说明方法。
-
-
- 添加商品
-
-
-
-
-
-
-
-
-
- 添加商品顺序图
-
-
-
-
-
-
-
采购业务员通过UI界面选择添加商品菜单,此时后台controller会判断该操作用户是否有权限;权限检查通过,操作员进入到商品添加表单,输入商品信息提交,后台controller会调用service的add方法,service中的方法add在调用database中的板寸方法。成功后返回成功提示。
-
-
- 查询商品
-
-
-
-
-
-
-
-
-
- 查询商品顺序图
-
-
-
-
-
-
-
采购业务员通过UI界面输入查询条件,此时后台controller会检查查询条件;controller会调用service里面的find方法,find方法会调用database中具体的查询方法;把查询到的结果显示到UI界面。
-
-
- 添加库存
-
-
-
-
-
-
-
-
-
- 添加库存顺序图
-
-
-
-
-
-
-
库存业务员通过UI界面选择商品菜单,输入该商品的库存信息,此时后台controller检查输入商品库存信息;controller会调用service中的add方法,add方法调用database中的具体添加方法处理,添加成功返回功能提示。
-
-
- 添加销售订单
-
-
-
-
-
-
-
-
-
- 添加销售订单顺序图
-
-
-
-
-
-
-
销售业务员通过UI界面选择添加订单菜单,输入订单信息,此时后台controller会检查订单信息;controller会调用service中的update方法,update方法会调用database中的具体更新方法,更新成功后会返回成功提示。
(一)总的E-R图
-
-
-
-
-
-
-
-
- 系统ER图
-
-
-
-
-
-
-
(二)分E-R图
-
-
-
-
-
-
-
-
- 商品ER图
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 顾客ER图
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 供应商ER图
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 管理员ER图
-
-
-
-
-
-
-
日志用于记录用户的日常行为,通过用户编号与用户实体之间存在一对多关系。
系统中使用到数据库基本如表4-1所示。
-
-
-
-
-
-
-
- 系统数据库表
-
-
-
-
-
-
编号 | 表名 | 描述 |
01 | customer | 顾客表 |
02 | dept | 部门表 |
03 | employee | 员工表 |
04 | goods | 商品表 |
05 | manager | 管理员表 |
06 | purchase_item | 采购单明细表 |
07 | purchase_order | 采购订单表 |
08 | return_item | 采购退货明细表 |
09 | return_order | 采购退货表 |
10 | sale_item | 销售订单明细表 |
11 | sale_order | 销售订单表 |
12 | sale_return_item | 退货销售明细表 |
13 | sale_return_order | 销售退货表 |
14 | stock | 库存表 |
15 | suppliers | 供应商表 |
- 顾客表
顾客表用于记录顾客信息,顾客表的具体字段如表4-2所示。
-
-
-
-
-
-
-
- 顾客表
-
-
-
-
-
-
字段名 | 字段描述 | 类型/长度 | 约束 | 备注 |
customer_id | 顾客编号 | Long | PK | |
customer_name | 顾客名称 | Varchar(20) | NOT NULL | |
address | 顾客地址 | Varchar(255) | ||
zip | 邮编 | Varchar(20) | ||
telPhone | 联系电话 | Varchar(20) | ||
linkMan | 联系人 | Varchar(20) | ||
linkTel | 联系人号码 | Varchar(20) | ||
bank | 开户银行 | Varchar(20) | ||
bankAccoount | 银行账号 | Long | ||
| 邮箱 | Varchar(20) |
字段顾客编号为本表的主键,用来标识一个顾客,字段顾客名称非空字段,字段顾客地址、邮编、联系电话、联系人、联系人号码、开户银行、银行账号、邮箱是顾客的一些详细信息。
部门表用于记录部门的信息,部门表的具体字段如表4-3所示。
-
-
-
-
-
-
-
- 部门表
-
-
-
-
-
-
字段名 | 字段描述 | 类型/长度 | 约束 | 备注 |
dept_id | 部门编号 | Long | PK | |
dept_name | 顾客名称 | Varchar(20) | NOT NULL |
字段部门编号为本表的主键,用来标识一个部门,字段部门名称为非空字段。
- 员工表
员工表用于记录员工的信息并且用于员工登录系统,员工表的具体字段如表4-4所示。
-
-
-
-
-
-
-
- 员工表
-
-
-
-
-
-
字段名 | 字段描述 | 类型/长度 | 约束 | 备注 |
employee_id | 员工编号 | Long | PK | |
employee_name | 员工姓名 | Varchar(20) | NOT NULL | |
employee_password | 密码 | Varchar(20) | NOT NULL | MD5加密 |
employee_gender | 性别 | Varchar(5) | ||
employee_age | 年龄 | Long | ||
employee_phonenumber | 手机号码 | Varchar(20) | ||
deptId | 部门ID | Long | FK |
字段员工编号为本表的主键,用来标识一个员工,员工名字和员工密码为非空字段,部门ID为外键,引用自部门表;字段性别、年龄和手机号码为员工的一些基本信息。
- 商品表
商品表用于记录商品的信息,商品表的具体字段如表4-5所示。
-
-
-
-
-
-
-
- 商品表
-
-
-
-
-
-
字段名 | 字段描述 | 类型/长度 | 约束 | 备注 |
goods_id | 商品编号 | Long | PK | |
goods_name | 商品名称 | Varchar(20) | NOT NULL | |
unit | 单位 | Varchar(20) | ||
space | 商品产地 | Varchar(255) | ||
supplierId | 供应商编号 | Varchar(20) | FK | |
approveId | 批准文号 | Varchar(20) | ||
batchId | 生产批号 | Varchar(20) |
字段商品编号为本表的主键,用来标识一个商品,字段商品名称不为空,字段供应商编号为外键,引用自供应商表,字段单位、商品产地、批准文号和生产批号为商品的一些属性。
- 管理员表
管理员表用于记录管理员的信息并且用于管理员登录系统,管理员表的具体字段如表4-6所示。
-
-
-
-
-
-
-
- 管理员表
-
-
-
-
-
-
字段名 | 字段描述 | 类型/长度 | 约束 | 备注 |
manager_id | 管理员编号 | Long | PK | |
manager_name | 管理员姓名 | Varchar(20) | NOT NULL | |
manager_password | 密码 | Varchar(20) | NOT NULL | MD5加密 |
manager_gender | 性别 | Varchar(5) | ||
manager_age | 年龄 | Long | ||
manager_phonenumber | 手机号码 | Varchar(20) | ||
dept_name | 部门名称 | Varchar(255) | FK |
字段管理员编号为管理员表的主键,用来标识一个管理员,字段管理员名字和密码是不能为空的,部门编号是一个外键,引用自部门表,字段性别、年龄和手机号码是管理员的一些个人信息。
- 采购单明细表
采购单明细表用于记录采购单信息,采购单明细表的具体字段如表4-7所示。
-
-
-
-
-
-
-
- 采购单明细表
-
-
-
-
-
-
字段名 | 字段描述 | 类型/长度 | 约束 | 备注 |
purchase_item_id | 采购单明细编号 | Long | PK | |
goods_name | 商品名称 | Varchar(20) | FK | |
purchase_order_id | 采购单编号 | Varchar(20) | FK | |
purchase_price | 单价 | Double | ||
purchase_count | 数量 | Long |
字段采购单明细编号为采购单明细表的主键,用来标识一个采购订单明细,其中字段采购单编号和商品名称是外键,分别引用自采购订单表和商品表,字段单价和数量是采购单明细表的属性。
- 采购订单表
采购订单表用于记录采购单信息,采购订单细表的具体字段如表4-8所示。
-
-
-
-
-
-
-
- 采购订单表
-
-
-
-
-
-
字段名 | 字段描述 | 类型/长度 | 约束 | 备注 |
purchase_order_id | 采购单编号 | Long | PK | |
suppliersId | 采购商编号 | Varchar(20) | FK | |
purchase_order_pay | 支付方式 | Varchar(20) | ||
inDate | 采购日期 | Date | ||
purchase_order__total | 总金额 | Double |
字段采购单编号为采购订单表的主键,用来标识一个采购订单,其中字段采购商编号为外键,引用自采购商表,字段支付方式、采购日期和总金额为采购订单的信息。
- 采购退货明细表
采购退货明细表用于记录采购退货单信息,采购退货明细表的具体字段如表4-9所示。
-
-
-
-
-
-
-
- 采购退货明细表
-
-
-
-
-
-
字段名 | 字段描述 | 类型/长度 | 约束 | 备注 |
return_item_id | 采购退货单明细编号 | Long | PK | |
returnOrderId | 采购退货单编号 | Long | FK | |
goodsName | 商品名称 | Varchar(20) | FK | |
return_item_price | 单价 | Double | ||
return_item_count | 数量 | Long |
字段采购退货单明细编号是采购退货明细表的主键,用来标识一个采购退货明细,其中采购退货单编号和商品名称是外键,分别引用自采购退货表和商品表。字段单价和数量为采购明细表的属性。
- 采购采购退货表
采购采购退货表用于记录采购采购退货信息,采购采购退货表的具体字段如表4-10所示。
-
-
-
-
-
-
-
- 采购采购退货表
-
-
-
-
-
-
字段名 | 字段描述 | 类型/长度 | 约束 | 备注 |
return_order_id | 采购单编号 | Long | PK | |
suppliersId | 采购商编号 | Varchar(20) | FK | |
return_order_pay | 支付方式 | Varchar(20) | ||
return_order_outDate | 退货日期 | Date | ||
return_order_total | 总金额 | Double |
字段采购退货单编号是采购退货表的主键,用来标识一个采购退货,其中字段采购商编号为外键,引用自采购商表,字段支付方式、退货日期和总金额为采购退货表的属性。
- 销售订单明细表
销售订单明细表用于记录销售订单明细信息,销售订单明细表的具体字段如表4-11所示。
-
-
-
-
-
-
-
- 销售订单明细表
-
-
-
-
-
-
字段名 | 字段描述 | 类型/长度 | 约束 | 备注 |
sale_item_id | 销售订单明细编号 | Long | PK | |
saleOrderId | 销售订单编号 | Long | FK | |
sale_item_name | 商品名称 | Varchar(20) | FK | |
sale_item_price | 单价 | Double | ||
sale_item_count | 数量 | Long |
字段销售订单明细编号是销售订单明细表的主键,用来标识一个销售明细,其中字段销售订单编号和商品名称是外键,分别引用自销售订单表和商品表,字段单价和数量是销售订单明细的属性。
- 销售订单表
销售订单表用于记录销售订单信息,销售订单表的具体字段如表4-12所示。
-
-
-
-
-
-
-
- 销售订单表
-
-
-
-
-
-
字段名 | 字段描述 | 类型/长度 | 约束 | 备注 |
sale_order_id | 销售单编号 | Long | PK | |
customerId | 顾客编号 | Varchar(20) | FK | |
sale_order_pay | 支付方式 | Varchar(20) | ||
sale_order_saleDate | 销售日期 | Date | ||
sale_order_total | 总金额 | Double |
字段销售单编号是销售订单表的主键,用来标识一个销售订单,字段顾客编号是外键,引用自顾客表,字段支付方式、销售日期和总金额是销售订单表的属性。
- 销售退货明细表
销售退货明细表用于记录销售退货明细信息,销售退货明细表的具体字段如表4-13所示。
-
-
-
-
-
-
-
- 销售退货明细表
-
-
-
-
-
-
字段名 | 字段描述 | 类型/长度 | 约束 | 备注 |
sale_return_item_id | 销售退货订单明细编号 | Long | PK | |
saleReturnOrderId | 销售退货订单编号 | Long | FK | |
goodsName | 商品名称 | Varchar(20) | FK | |
sale_return_item_price | 单价 | Double | ||
sale_return_item_count | 数量 | Long |
字段销售退货订单明细编号是销售退货明细表的主键,用哪个来标识一个销售退货明细,字段销售退货订单编号、商品名称为外键,分别引用自销售退货表和商品表,字段单价和数量为销售退货明细表的属性。
- 销售退货表
销售退货表用于记录销售退货信息,销售退货表的具体字段如表4-14所示。
-
-
-
-
-
-
-
- 销售退货表
-
-
-
-
-
-
字段名 | 字段描述 | 类型/长度 | 约束 | 备注 |
sale_return_order_id | 销售退货单编号 | Long | PK | |
customerId | 顾客ID | Varchar(20) | FK | |
sale_return_order_pay | 支付方式 | Varchar(20) | ||
sale_return_order_returnDate | 退货日期 | Date | ||
sale_return_order_total | 总金额 | Double |
- 库存表
库存表用于记录库存信息,库存表的具体字段如表4-15所示。
-
-
-
-
-
-
-
- 库存表
-
-
-
-
-
-
字段名 | 字段描述 | 类型/长度 | 约束 | 备注 |
stock_id | 库存编号 | Long | PK | |
goodsId | 商品编号 | Long | FK | |
stock_count | 商品库存数量 | Varchar(20) | NOT NULL | |
stock_area | 存放地方 | Varchar(255) |
字段库存编号是库存表的主键,用来标识一个库存,字段商品编号是外键,引用自商品表,字段商品库存数量不为空,字段存放地方为库存表的属性。
- 供应商表
供应商表用于记录供应商信息,供应商表的具体字段如表4-16所示:
-
-
-
-
-
-
-
- 供应商表
-
-
-
-
-
-
字段名 | 字段描述 | 类型/长度 | 约束 | 备注 |
suppliers_id | 供应商编号 | Long | PK | |
supplier_name | 供应商名称 | Varchar(20) | NOT NULL | |
address | 顾客地址 | Varchar(255) | ||
zip | 邮编 | Varchar(20) | ||
telPhone | 联系电话 | Varchar(20) | ||
linkMan | 联系人 | Varchar(20) | ||
linkTel | 联系人号码 | Varchar(20) | ||
bank | 开户银行 | Varchar(20) | ||
bankAccoount | 银行账号 | Long | ||
| 邮箱 | Varchar(20) |
字段供应商编号是供应商表的主键,用来标识一个供应商,字段供应商名称不为空,字段顾客地址、邮编、联系电话、联系人、联系人号码、开户银行、银行账号和邮箱是供应商表的属性。
本章主要分为三个小节来介绍系统设计。第一节是系统类分析,主要是通过类图的方式来介绍系统设计到的类,介绍类里的属性和设计到的方法。第二节是关键业务设计,主要是通过顺序图的方式来介绍核心业务的设计和处理过程。第三节是数据库设计,首先是通过ER图的方式介绍设计到的模块和模块的一些字段(分为总ER图和分ER图),其次是数据库表,介绍了所设计到的表,详细的介绍了表中的字段和字段对应的关系
- 功能描述
登录是对用户使用系统功能进行身份验证的过程,登录也是可以很好的控制用户的权限问题,登录界面要求简明易懂。每一用户都有自己的独有的账号和密码,用户在系统的每一个操作都有日志进行记载,可以有效保证数据可追溯性,做到责任到人,界面如下图。
-
-
-
-
-
-
-
-
- 用户登录
-
-
-
-
-
-
-
- 实现流程
在登陆按钮添加监听事件,在用户输入账号密码点击登录后,终端先判断是否满足JS中的验证方法,此方法是防止当账号密码为空时登录的提示,如果为空跳出一个对话框来提示用户账号和密码需要填。如果不为空,后台会把接受的用户名密码与数据库数据库中用户信息比较核对,如果是一致则顺利登录到用户权限所对应的界面中,否则出现账号密码错误的提示,登录失败。登录流程如图5-12所示。实现代码如下:
if("manager".equals(user)){
Managers managers = null;
try {
managers = managerService.login(name, password);
} catch (ServiceException e) {
e.printStackTrace();
}
if(managers!=null){
logger.info(name+"登录成功!!!");
ServletContext app = req.getSession().getServletContext();
app.setAttribute("user",managers);
req.getRequestDispatcher("/WEB-INF/jsp/index.jsp").forward(req, resp);
}else{
logger.info("登录失败,用户名或者密码错误");
HttpSession session = req.getSession();
session.setAttribute("msg","用户名或者密码错误");
resp.sendRedirect("login.html");
}
}else if("employee".equals(user)){
Employee employee = null;
try {
employee = managerService.employeelogin(name, password);
} catch (ServiceException e) {
e.printStackTrace();
}
if(employee!=null){
logger.info(name+"登录成功!!!");
ServletContext app = req.getSession().getServletContext();
app.setAttribute("user",employee);
req.getRequestDispatcher("/WEB-INF/jsp/index.jsp").forward(req, resp);
}else{
logger.info("登录失败,用户名或者密码错误");
HttpSession session = req.getSession();
session.setAttribute("msg","用户名或者密码错误");
resp.sendRedirect("login.html");
}
}
开始 |
输入用户名,密码 |
验证用户名密码 |
转主界面 |
提示错误 |
结束 |
-
-
-
-
-
-
-
-
- 用户登录
-
-
-
-
-
-
- 采购管理
-
- 功能描述
采购管理是对需要采购的订单的综合管理,在这个模块里包含采购订单、收货入库、采购退货三个子模块。其中采购订单是员工用来生成采购单的,还有对采购单的一些处理;收货入库是对已经提交的采购单进行入库操作;采购退货是把我们已经提交的采购单进行退货处理的操作。主要界面如下图:
-
-
-
-
-
-
-
-
- 采购管理
-
-
-
-
-
-
-
- 实现流程
点击采购订单按钮会跳转到采购订单首页,在首页可以看到所有已经提交的采购单信息;当我们想添加新的采购订单的时候,首先点击添加商品按钮,会跳转到商品添加页面,我们把商品信息输入进去之后点击提交,后台方法会把商品信息暂时存起来,当我们把所有商品添加完成,我们可以再点击添加订单按钮,此时会把我们添加的所有的商品都提交生成一个采购订单,并且把数据存进对应的数据库表中保存起来。对已经提交的订单当我们点击退货按钮时,后台会接收到要退货的订单ID,并且根据ID到数据库中订单表把数据删除,同时在退货表中把数据插进去。当我们点击入库按钮时,后台会接收到需要入库的订单的ID,并且把订单表中的flag字段的值修改为已入库,同时在库存表中会新加一条数据。主要实现代码如下:
Long suppliersId = Long.parseLong(request.getParameter("suppliersId"));
String name = request.getParameter("name");
Double price = Double.parseDouble(request.getParameter("price"));
Long count =Long.parseLong(request.getParameter("count"));
String unit = request.getParameter("unit");
String space = request.getParameter("space");
Long supplierId = Long.parseLong(request.getParameter("supplierId"));
String approveId = request.getParameter("approveId");
String batchId = request.getParameter("batchId");
purchaseItem = new PurchaseItem();
purchaseItem.setCount(count);
purchaseItem.setPrice(price);
purchaseItem.setName(name);
purchaseItem.setSupplierId(suppliersId);
list.add(purchaseItem);
model.addAttribute("list", list);
logger.info("成功添加商品");
logger.info("提交采购订单");
String pay = request.getParameter("pay");
purchaseOrder = new PurchaseOrder();
purchaseOrder.setPay(pay);
purchaseOrder.setInDate(new Date());
purchaseOrder.setFlag("未入库");
try {
int i = managerService.addPurchaseOrder(purchaseOrder, list);
if(i==1){
list.removeAll(list);
/*orderList.removeAll(orderList);*/
orderList = managerService.findPurchaseOrderByPage(0);
count = managerService.findPurchaseOrderCount();
currentPage = 1L;
totalPage = managerService.getTotalPage();
model.addAttribute("currentPage", currentPage);
model.addAttribute("totalPage", totalPage);
model.addAttribute("orderList", orderList);
model.addAttribute("count", count);
logger.info("提交采购订单成功");
}
- 功能描述
库存管理是对仓库里的商品的综合管理,包括商品入库、商品出库、某种商品的库存查询、商品移库和库存盘点。商品入库是对新的商品需要入库的管理;商品出库是根据销售订单到库存里拿出对应数量的商品并且库存进行相应的减少;库存查询是输入想查询的商品会返回该商品的库存数量;商品移库是输入商品ID和需要移动到的仓库号就可以更改商品的存放仓库;最后一个是库存盘点,该功能是返回仓库里所有商品的库存信息。主要界面如下图:
图5.31商品出库
图5.32库存查询
图5.33商品移库
- 实现流程
首先是商品入库,点击商品入库按钮跳转到对应商品添加页面,填入对应商品信息,后台首先会判断该商品在商品表里是否已经存在,如果存在,则更新该商品的库存即可,如果不存在,则先在商品表里添加一条商品的信息,再到库存表里添加一条库存信息。商品出库,首先是输入需要出库的商品ID和该商品出库的数量,后台根据接收的商品ID和数量到数据库库存表去更新该商品的库存数量。库存查询,输入需要查询库存的商品ID,后台会根据商品的ID去库存表里查询该商品的库存数量,并且返回到对应的前台页面。商品移库,输入商品ID和移动到的仓库号,后台会根据商品ID号到数据库库存表中更新该商品的库存地方。库存盘点,这个功能是会显示所有商品的库存信息。主要实现代码如下:
商品入库:
public int stockAdd(Stock stock, Goods goods) throws ServiceException {
Goods gods = goodsRepository.findGoodsByName(goods.getName());
if(gods==null){
gods = goodsRepository.save(goods);
}
stock.setGoodsId(gods.getId());
Stock stok = findStockByGoodsId(gods.getId());
if(stok==null){
stockRepository.save(stock);
}else{
stockRepository.updateStockCountByGoodsId(stok.getCounts()+stock.getCounts(),stock.getGoodsId());
}
return 1;
}
商品出库:
@RequestMapping("/update")
public String UpdateStock(HttpServletRequest request,Model model){
logger.info("库存信息更新开始");
Long goodsId = Long.parseLong(request.getParameter("goodsId"));
Long count = Long.parseLong(request.getParameter("count"));
try {
stockService.updateStock(goodsId,count);
outList = stockService.findStockByPage(0);
model.addAttribute("outList", outList);
logger.info("库存信息更新完成");
} catch (ServiceException e) {
e.printStackTrace();
}
return "outStock";
}
商品移库:
@RequestMapping("updateArea")
public String upDateArea(HttpServletRequest request,Model model){
logger.info("存放仓库信息更新开始");
Long goodsId = Long.parseLong(request.getParameter("goodsId"));
String area = request.getParameter("area");
try {
stockService.updateStockAreaByGoodsId(area,goodsId);
List<Stock> list = stockService.findAllStock();
model.addAttribute("outList", list);
logger.info("存放仓库信息更新完成");
} catch (ServiceException e) {
e.printStackTrace();
}
return "updateArea";
}
- 功能描述
销售管理对销售订单的综合管理,包含销售订单、发货出库和销售退货。销售订单,将销售的信息形成销售订单并且存入到数据库销售订单表中;发货出库,将提交的销售订单的flag状态改为已发货,并且对应的库存表中的库存数量也相应的减少;销售退货,对已经销售的订单进行退货处理。主要界面如下图:
图5.41 销售管理
- 实现流程
首先是销售订单,第一步是点击添加商品,然后输入对应的商品信息点击提交,后台接收到数据,会暂时将商品信息存储起来,当商品添加完毕,点击添加订单按钮,可以将刚才添加的所有订单信息提交到后台,后台在将这些订单信息持久化到数据库中去。发货出库,对提交销售的订单可以进行发货操作,后台会根据订单ID对订单表中的flag字段值修改为已发货,并且会到库存表中去,将该订单对应的商品的库存数作相应的改变。销售退货,对已经提交的订单可以进行退货操作,点击退货按钮,后台会根据订单ID到数据库销售订单表中把对应订单信息删除,并且在销售退货表中加入相应的退货记录,与此同时会根据flag字段,如果flag字段值是未发货,则不用去库存表跟新库存数据,如果flag字段的值为已发货,则需要到库存表中把订单对应的商品的库存数加回去。主要实现代码如下:
@RequestMapping("/addSaleOrder")
public String saveSaleOrder(HttpServletRequest request,Model model){
String pay = request.getParameter("pay");
SaleOrder saleOrder = new SaleOrder();
saleOrder.setFlag("未发货");
saleOrder.setPay(pay);
saleOrder.setSaleDate(new Date());
try {
int i = saleService.addSaleOrder(saleOrder,itemList);
if(i==1){
itemList.clear();
saleorderList = saleService.findSaleOrderByPage(0);
cunt = saleService.findSaleOrderCount();
crrentPage = 1L;
ttalPage = saleService.getTotalPage();
model.addAttribute("crrentPage", crrentPage);
model.addAttribute("ttalPage", ttalPage);
model.addAttribute("saleorderList", saleorderList);
model.addAttribute("cunt", cunt);
}
} catch (ServiceException e) {
e.printStackTrace();
}
return "sale";
}
- 功能描述
备份与恢复,顾名思义就是对系统的重要数据进行备份,以备不时之需,备份是可以设定每天在一个固定的时间自动进行备份;当系统数据损坏时我们可以自由选择恢复哪一天的数据。主要界面如下图:
图5.51 数据备份与恢复
- 实现流程
备份功能,首先当系统启动的时候已经设定了一个自动备份的时间点,每天到这个时间点都会自动把数据库的数据备份一次,但是我们也可以手动备份,我们只需要点击数据备份就可以了;数据恢复,当某个时候系统数据损坏或者丢失的时候,此时我们就可以用到数据恢复功能了,我们可以选择恢复到一个时间点的数据文件。主要实现代码如下:
public static void backup() {
try {
Runtime rt = Runtime.getRuntime();
// 调用 调用mysql的安装目录的命令
Process child = rt.exec(backuppath);
// 设置导出编码为utf-8。这里必须是utf-8
// 把进程执行中的控制台输出信息写入.sql文件,即生成了备份文件。注:如果不对控制台信息进行读出,则会导致进程堵塞无法运行
InputStream in = child.getInputStream();// 控制台的输出信息作为输入流
InputStreamReader xx = new InputStreamReader(in, "utf-8");
// 设置输出流编码为utf-8。这里必须是utf-8,否则从流中读入的是乱码
String inStr;
StringBuffer sb = new StringBuffer("");
String outStr;
// 组合控制台输出信息字符串
BufferedReader br = new BufferedReader(xx);
while ((inStr = br.readLine()) != null) {
sb.append(inStr + "\r\n");
}
outStr = sb.toString();
// 要用来做导入用的sql目标文件:
SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddhhmm");
FileOutputStream fout = new FileOutputStream("D:\\jxc\\backup\\"+sdf.format(new Date())+".sql");
OutputStreamWriter writer = new OutputStreamWriter(fout, "utf-8");
writer.write(outStr);
writer.flush();
in.close();
xx.close();
br.close();
writer.close();
fout.close();
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 备份数据恢复
* @param databaseName
*/
public static void restore(String fileName) {
try {
Runtime runtime = Runtime.getRuntime();
Process process = runtime .exec(restorepath);
OutputStream outputStream = process.getOutputStream();
BufferedReader br = new BufferedReader(new InputStreamReader(
new FileInputStream("D:\\jcx\\backup\\"+fileName), "utf-8"));
String str = null;
StringBuffer sb = new StringBuffer();
while ((str = br.readLine()) != null) {
sb.append(str + "\r\n");
}
str = sb.toString();
// System.out.println(str);
OutputStreamWriter writer = new OutputStreamWriter(outputStream,
"utf-8");
writer.write(str);
writer.flush();
outputStream.close();
br.close();
writer.close();
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
本章主要是介绍了系统实现,重点介绍了系统的用户登录、采购管理、库存管理、销售管理、备份与恢复五个模块。这五个模块首先分别介绍了他们的功能,并且附上界面图,然后再从实现流程上对这些功能进行详细的描述,最后附上实现这些功能的主要代码。
系统完成后,对系统的测试是非常重要的一环。首先在系统的每个模块完成后对这个模块做的单元测试,另外一个是在系统整体完成了后对整个系统做的综合测试。
用户登录模块,当用户输入正确的用户名和密码时,能正常登录;当用户输入错误的用户名或者错误的密码或者不存在的用户名的时候,系统应当输出响应用户名或者密码错误;当用户没有输入用户名或者没用输入密码或者两者都没有输入的时候,系统应当响应用户名、密码项是必填项。
采购管理模块,当天如对应的商品信息时,后台新系统能够接收到商品信息,并且在提交订单的时候能够顺利把这些信息都持久化到数据库中去,并且在出错的时候能正确返回对应的错误码;对采购订单入库时,能正常的把flag标志改为已入库,并且在库存表中更新响应的商品库存信息;销售退货,后台能根据订单ID将采购订单表中的数据删除,并且把数据插入到采购退货表中去。
库存管理模块,商品入库功能,当用户把商品信息输入正确的时候,后台能够真确的收到数据,并且正确的持久化到数据库中去;商品出库,当用户输入出库的商品和数量时,后台能够正确到数据库库存表把对应的商品的数量相应的减少;库存查询,当输入商品的ID时,后台能根据这个ID查出该商品的库存信息,并且能正确的返回到用户界面;商品移库,当输入商品ID和移库的信息后,后台能正确地更新数据库中对应商品的库存信息。
销售管理模块,销售模块,当前段把销售订单的信息都正确输入的时候,后台能正确的接收到订单信息,并且把订单信息正确持久化到数据库中去,在产生错误时,能够返回对应的错误码;发货出库,当销售订单的信息提交之后,我们可以对这些的订单做发货操作,点击发货后,后台要把相应商品的库存信息进行更新,并且把订单表中的flag字段的值改为已发货;销售退货,点击退货按钮,后台能正常的把销售订单表中的对应订单信息删除,并且在销售退货表中把退货信息存进去,并且要把商品的数量加回到库存表中去。
备份与恢复模块,首先是系统每天能够在固定时间产生一个备份数据库的文件,然后在我们手动点击备份按钮的时候也能够产生一个备份数据库的文件;当点击恢复按钮时,会把我们选择的数据库文件恢复到数据库中去。
功能测试 | ||||||
概述 | ||||||
测试编号 | XU001 | |||||
功能描述 | 用户登录 | |||||
功能URL | http://localhost:8989/login.html | |||||
用例目的 | 测试用户是否能登录成功 | |||||
前提条件 | ||||||
测试操作 | ||||||
编号 | 输入/动作 | 期望的输出响应 | 实际情况 | 是否正确 | 错误编号 | |
1 | 输入不存在的用户名,不填写密码 | 系统提示密码项必须填 | 系统提示密码项必须填 | 正确 | ||
2 | 输入正确的用户名输入错误的密码 | 系统提示用户名或密码错误 | 系统提示登录名或密码错误 | 正确 | ||
3 | 输入错误的用户名输入正确的密码 | 系统提示用户名或密码错误 | 系统提示登录名或密码错误 | 正确 | ||
4 | 不填写用户名及密码 | 系统提示用户名和密码项必须填 | 系统提示用户名和密码项必须填 | 正确 | ||
-
-
- 采购管理模块
-
-
-
-
- 采购管理
-
-
-
-
- 采购管理模块
-
功能测试 | ||||||
概述 | ||||||
测试编号 | XU002 | |||||
功能描述 | 采购管理 | |||||
功能URL | http://localhost:8989/purchase | |||||
用例目的 | 测试采购管理功能是否正常 | |||||
前提条件 | 进入采购管理界面 | |||||
测试操作 | ||||||
编号 | 输入/动作 | 期望的输出响应 | 实际情况 | 是否正确 | 错误编号 | |
1 | 输入正确的采购订单信息 | 成功将订单信息添加到采购订单表中 | 添加成功,在采购订单表中查到订单数据 | 正确 | ||
2 | 成功提交的采购订单点击入库按钮 | 在库存表能够查到入库的商品的信息,并且入库的数量是正确的 | 成功入库,在库存表查到了该商品的入库的数量信息 | 正确 | ||
3 | 成功提交的采购订单点击退货按钮 | 在采购订单表把该订单数据删除,并且在采购退货单里能查到退货信息 | 退货成功,在采购订单表已经查不到该订单信息,在退货表里可以查到该订单信息 | 正确 | ||
-
-
- 库存管理模块
-
-
-
-
- 库存管理
-
-
-
-
- 库存管理模块
-
功能测试 | ||||||
概述 | ||||||
测试编号 | XU003 | |||||
功能描述 | 库存管理 | |||||
功能URL | http://localhost:8989/stock | |||||
用例目的 | 测试库存管理是否正常 | |||||
前提条件 | 进入库存管理界面 | |||||
测试操作 | ||||||
编号 | 输入/动作 | 期望的输出响应 | 实际情况 | 是否正确 | 错误编号 | |
1 | 输入商品信息,点击入库 | 成功将商品信息添加到库存表中 | 入库成功,在库存表中能够查到该商品信息 | 正确 | ||
2 | 输入出库商品ID和出库的数量 | 出库表中增加一条数据,并且库存表中该商品的数量减少了出库数量 | 库存表中该商品的数量正确的减少了 | 正确 | ||
3 | 输入查询商品的ID | 将该商品的信息正确的显示在页面上 | 页面上成功显示出了该商品的库存信息 | 正确 | ||
4 | 输入要移库商品的ID和移库的地点 | 将库存表中该商品的存储位置修改为修改的地址 | 库存表中成功修改来了该商品的库存位置 | 正确 | ||
-
-
- 销售管理模块
-
-
-
-
- 销售管理
-
-
-
-
- 销售管理模块
-
功能测试 | ||||||
概述 | ||||||
测试编号 | XU004 | |||||
功能描述 | 销售管理 | |||||
功能URL | http://localhost:8989/sale | |||||
用例目的 | 测试销售管理是否正常 | |||||
前提条件 | 进入销售管理界面 | |||||
测试操作 | ||||||
编号 | 输入/动作 | 期望的输出响应 | 实际情况 | 是否正确 | 错误编号 | |
1 | 输入销售订单信息,点击提交 | 在销售订单表中有对应订单的信息, | 在销售订单表中查询到了该订单的信息 | 正确 | ||
2 | 已经提交成功的销售订单,点击发货按钮 | 在销售订单表中把flag字段的值改为已发货,库存表中该订单的商品的数量最相应的减少 | 销售订单表中flag字段修改正确,并且库存表中的商品库存数修改正确 | 正确 | ||
3 | 已经提交成功的销售订单,点击退货按钮 | 在销售订单表中把该订单信息删除,然后在退货表中把该订单信息加入,然后把退货订单的商品的数量信息重新归还到库存中去 | 销售订单表中该订单成功删除,并且在退货表中增加了该订单数据,然后这些商品在库存表中的数量修改正确。 | 正确 | ||
-
-
- 备份与数据恢复模块
-
-
-
-
- 备份与数据恢复
-
-
-
-
- 备份与数据恢复模块
-
功能测试 | ||||||
概述 | ||||||
测试编号 | XU005 | |||||
功能描述 | 备份与数据恢复 | |||||
功能URL | http://localhost:8989/ backups | |||||
用例目的 | 测试备份与数据恢复功能是否正常 | |||||
前提条件 | 进入备份与数据恢复界面 | |||||
测试操作 | ||||||
编号 | 输入/动作 | 期望的输出响应 | 实际情况 | 是否正确 | 错误编号 | |
1 | 点击备份按钮 | 在电脑的文件夹中能找到备份的数据库文件 | 可以找到备份的数据库文件 | 正确 | ||
2 | 点击数据恢复按钮 | 在数据库中可以看到已经恢复的数据库信息 | 在数据库中可以看到这些数据库信息 | 正确 | ||
-
- 测试分析
经过这些测试,整个系统的大部分功能都已经能够正常的运行,达到了我们预想的结果。对于采购管理、库存管理和销售管理三个模块先阶段的功能都能达到预期效果,但是还可以加入一些其他的支持(对Excel表格的支持),能够直接导入Excel表格的数据,并且可以直接导出为Excel表格,这个功能暂时还没达到预期效果,因此需要把这个功能加上;在一个就是对权限的控制方面做的不是特别完善,因此接下来,在权限方面还应该加强。对于备份和数据恢复功能,现在和预期的结果是一致的,比较符合。实力和时间的限制,在代码的编写上面,存在许多的冗余代码,因此这方面需要改进,把重复的代码封装成方法,减少冗余度。
本章主要是对已完成的功能做系统测试,分模块的进行测试,测试这些功能是否能达到预期的结果;为什么没有达到预期。对于每一个模块都写了相应的测试用例,通过这些测试用例的分析,整个系统的功能基本上达到了预期的效果,但是还有进一步改进的地方,让整个系统更完善。
历经四个月的时间,到现在为止,系统的开发工作已经全部完成。本系统采用的是Maven来搭建的项目,使用Spring boot、JPA来实现的。对采购、销售、库存的管理,对数据的备份等功能基本上都已经实现。
在设计本系统的初期,选择Spring boot和JPA作为本系统的开发技术是一个大胆的尝试,因为在此之前根本没有接触这两个框架,对他们也不了解。在确立了系统开发技术后,在开发初期先对这两个技术进行了初步的熟悉,然后就是边开发边学习。在系统开发的初期阶段可以说是走了很多弯路,因为对技术不熟悉的缘故。于是乎就是去多找资料、找书学习,认真学习编程思想,吸收它的编程技巧,最后运用到自己的系统上,最终顺利的把系统完成了。在完成整个毕业设计的过程,可以说对我来说学到了很多。之前只是接触到书本上的知识比较多,但是没怎么亲自动手实践,有点眼高手低的感觉。但是经过毕业设计,可以说对自己有了一个很好的磨炼。从题目的确立,系统的设计,系统的实现,到系统的完成,自己经历了一整个过程,让自己的见识有了提高,同时学会了很多的处理问题和解决问题的方法,为我们即将走入到工作岗位上打好了基础。
完成整个系统也是对我们大学四年所学的知识的一个综合运用,之前是理论学的多,实践的太少。通过实践,可以让自己快速的成长起来,还学到了Spring boot和JPA的知识。对于系统的权限控制问题,以后还有待于完善,还有对进销存对Excel的支持,这个在以后都是可以改进的部分。
参考文献
[1] 辛运帏等. java语言程序设计[M].北京:人民邮电出版社,2009
[2] (美)(Nicholas C.Zakas)扎卡斯. JavaScript高级程序设计[J].人民邮电出版社2006
[3] 姜承尧. MySQL技术内幕:InnoDB存储引擎[M].机械工业出版社 2011-1
[4] 张海藩;吕云翔.软件工程[M]. 人民邮电出版社 2013-09-01
[5] Roger S.Pressman, 郑人杰, 马素霞等. 软件工程:实践者的研究方法(原书第7版)[M]. 北京: 机械工业出版社, 2011
[6] 李兴华, 王月清. 名师讲坛:Java Web开发实战经典基础篇(JSP, Servlet, Struts, Ajax)[M].北京: 清华大学出版社, 2010
[7] 成先海.数据库基础与应用[M].北京:机械工业出版社,2008.
[8] 张艳.基于工作过程的物流信息系统与管理课程的重构[J].辽宁高职学报,2010, 12(2):45-47.
[9] 李小娜,董绍华.物流信息技术在现代物流中的应用[J].中国科技信息,2008,(21):140-143.
[10] 隋英琴.供应链管理环境下的物流管理创新[J].科技创业,2008,14(03):123-125.
[11] 陈雄华 Spring 企业级应用开发详解[M] 北京:电子工业出版社 2009
[12] 王寅田. 基于Hadoop的交通物流大数据处理系统设计与实现[D]. 上海交通大学 2014
[13] 李海峰. MVC模式架构的应用研究[J]. 自动化与仪器仪表. 2013(01)
[14] 陈凤琴.基于B/S模式的中小饲料企业进销存系统设计与实现[D].南昌大学2014
[15] 黄沙.企业物流成本管理存在问题及对策[J].物流技术与应用,2011,13(2):101-102.
参考资料:
基于jsp的进销存管理系统毕业设计(项目报告+答辩PPT+源代码+数据库+截图+部署视频)https://download.csdn.net/download/dwf1354046363/87813558Java毕业设计174例,包含部署视频_易小侠的博客-CSDN博客
https://cv2022.blog.csdn.net/article/details/124463185?spm=1001.2014.3001.5502