摘 要
系统主要包括系统管理、基础资料、业务管理、查询中心等功能。系统用于维护企业的基本信息,如菜单、角色、权限等,用户可以通过系统的系统管理模块根据企业和业务需要设置系统的基本信息,方便在其他模块中使用。通过用户自行设置基础资料从而实现系统的根据不同用户的需求灵活定制的特点,也有助于系统在企业信息结构发生变化时能够及时响应。
软件主要服务鲜花销售店铺采购、出库各个环节,是企业完善内部管理、理顺工作流程各个环节的强有力的管理工具。系统的设计采用大量的接口,方便以后的升级或者与其他系统的整合。系统的运行基础是企业内部局域网,采用基于WinForm的C/S结构,操作界面容易使用和掌握,基本上会Windows基本操作就能很快了解并且掌握系统的使用方法。
关键词: 花店;企业;采购;管理
目 录
第1章 绪 论
1.1 课题背景、目的及意义
1.1.1 花店进销存管理系统
1.1.2 背景
1.1.3 研究目的及意义
1.2 国内外研究现状
1.3 研究内容
第2章 相关技术介绍
2.1 开发环境
2.1.1 硬件环境
2.1.2 软件环境
2.2 开发工具
2.2.1 Microsoft Visual Studio 2019
2.2.2 SQL Server 2022
2.3 相关技术基础
2.3.1 C/S结构
2.3.2 WinForm技术
2.4 本章小结
第3章 系统需求与可行性分析
3.1 可行性分析
3.1.1 技术可行性
3.1.2 操作可行性
3.1.3 社会可行性
3.2 系统需求
3.3 本章小结
第4章 系统设计
4.1 概要设计
4.2 详细设计
4.2.1系统管理详细设计
4.2.2 基础资料详细设计
4.2.3 业务管理详细设计
4.2.4 查询中心详细设计
4.3 数据库设计
4.4 界面设计
4.4.1 界面设计采用WinForm
4.4.2 主页面设计
4.4.3 选项卡设计
4.4.4 数据表格设计
4.5 本章小结
第5章 系统技术方案
5.1 业务流程管理
5.2 重要数据加密
5.4 初始化功能列表
5.5 本章小结
第6章 系统实现
6.1 基础数据模块实现
6.2 采购管理管理模块实现
6.3 库存管理模块实现
6.4 生产管理模块实现
6.5 配方管理模块实现
6.6 本章小结
第7章 系统测试
7.1 系统测试的目的
7.2 功能测试
7.3 本章小结
第8章 结论与展望
8.1 结论
8.2 展望
第1章 绪 论
1.1 课题背景、目的及意义
1.1.1 花店进销存管理系统
随着互联网技术的飞速发展和个人计算机的普及,网上购物已成为一种日益流行的消费方式。消费者可以通过互联网获取更多的商品选择,实现便利购物。网上鲜花销售突破了时间和地域的限制,使消费者足不出户即可购买到心仪的鲜花。由此,网上鲜花销售管理系统成为连接销售商与消费者的重要桥梁。
通过这一系统,消费者不仅能够节省大量时间,还可以随时随地完成鲜花的选购,而商家也能够高效管理鲜花库存、用户信息和订单数据。该系统以消费者为主要用户群体,功能设计涵盖用户端和管理员端两大模块。
用户端功能主要包括鲜花的浏览、搜索、详细查询和在线购买;管理员端功能则聚焦于鲜花的库存管理、用户信息维护和订单处理。系统开发过程中,本论文重点介绍了数据库的设计原理及各模块的功能实现。
该系统基于C/S(客户端/服务器)架构,采用C#,WinFrom技术进行开发,并通过SQL Server数据库提供稳定的数据存储与交互支持。研究不仅优化了系统架构和功能实现,还对用户体验和操作效率进行了持续改进。
1.1.2 背景
随着社会经济的快速发展,鲜花作为文化生活和商务活动中的重要商品,市场需求不断增长。然而,由于鲜花的保质期短且存储要求高,如何高效管理鲜花的进销存流程成为行业的一大挑战。传统的手工管理方式效率低下且容易出错,因此开发一套基于C#语言的鲜花进销存管理系统,可实现数字化、信息化的管理,具有现实意义。
1.1.3 研究目的及意义
花店进销存管理系统的研究旨在解决鲜花行业在采购、库存及销售管理中面临的诸多实际问题,提升行业的运营效率和管理水平。通过系统的开发和应用,可以实现鲜花商品从进货到销售的全过程数字化管理,减少人为操作的失误,并为决策提供可靠的数据支持。
具体而言,本研究目标如下:
优化业务流程:设计高效的进销存管理机制,简化鲜花采购、库存调配及销售记录的操作流程,提升整体管理效率。
提高数据精准性:通过系统化的数据录入与统计功能,确保库存信息、销售数据的实时准确性,减少鲜花浪费和库存积压。
实现信息透明化:建立统一的信息管理平台,为管理者提供全面的数据视图,支持进货趋势分析、库存预警及销售情况评估,助力科学决策。
降低管理成本:通过信息化手段替代传统的手工记录方式,减少人力和时间成本,提升企业盈利能力。
提升客户满意度:通过系统支持快速响应市场需求和订单管理,为客户提供更及时、准确的服务体验。
本研究不仅关注花店内部的业务优化,还着眼于通过技术手段推动鲜花行业向信息化、智能化方向发展,为中小型花店提供一个易于部署和使用的管理工具。
1.2 国内外研究现状
国内现状:
普及率不足:虽然进销存管理系统在零售、制造等领域已经较为成熟,但鲜花行业的管理系统开发还处于起步阶段,许多小型企业仍依赖传统方式。
技术应用:国内的进销存管理系统多基于Web端和移动端,结合数据库技术(如MySQL、SQL Server)和开发框架(如ASP.NET)。
市场需求:近年来鲜花电商快速发展(如花点时间、野兽派等),对后台管理系统提出了更高的要求。
国外现状:
技术成熟:国外企业在ERP和进销存系统开发方面起步较早,技术较为完善,许多系统具备人工智能和大数据分析功能。
鲜花管理领域:一些发达国家的鲜花管理系统已经整合供应链管理、客户管理(CRM)和物流系统,如Floranext等。
技术方向:国外更倾向于基于云平台的SaaS化管理系统,支持跨平台操作和远程控制。
1.3 研究内容
(1) 系统管理模块,包括角色管理、权限分配、菜单管理。
(2) 采购入库模块,包括采购商品管理、供应商管理、金额合计,采购入库,单据审核。
(3) 销售管理,包括采购相对应的销售出库操作。
(4) 库存管理模块,包括产品销售出库、产品入库、移库管理、产品库存、仓库状态。
(5) 基础资料,包括商品信息、商品分类、仓库类别、往来单位、计量单位。
(6) 查询中心,包括单据查询,采购查询,销售查询,库存查询。
第2章 相关技术介绍
2.1 开发环境
2.1.1 硬件环境
本管理系统使用PC机进行开发,其硬件配置如下:
(1) 中央处理器:AMD Ryzen 7 5800H with Radeon Graphics 3.20 GHz;
(2) 内存:16.0GB;
(3) 主硬盘:SAMSUNG MZVL2512HCJQ-00B00(512G);
(4) 显卡:NVIDIA GeForce RTX 3050 Laptop GPU。
2.1.2 软件环境
在硬件开发环境之上搭建的软件开发环境包括以下部分:
(1) 操作系统:64位Windows10;
(2) 开发工具:Microsoft Visual Studio 2019、Microsoft SQL Server 2022;
2.2 开发工具
2.2.1 Microsoft Visual Studio 2019
(1) Microsoft Visual Studio 2019简介:
本系统使用的开发环境是微软的 Visual Studio 2008,Microsoft Visual Studio 2019 是 Microsoft 开发的一款集成开发环境(IDE),适用于各种软件开发项目,涵盖桌面、移动、Web 和云端应用程序开发。Visual Studio 2019 是开发 Microsoft 生态系统中应用程序的首选工具,也因其强大的调试能力和生态系统支持在开发者社区中备受欢迎。
(2) Microsoft Visual Studio 2008的特点:
① .NET Core提供了对 .NET Core 3.0 的支持。 跨平台、开源代码 - 且由 Microsoft 提供全面的支持。
② 更新了测试资源管理器,改进了大型测试集的处理,简化了筛选,增加了可发现的命令和选项卡式播放列表视图,并增加了允许微调所显示测试信息的可自定义列。
2.2.2 SQL Server 2022
(1) Microsoft SQL Server 2022简介:
SQL Server 2022是微软公司最新推出的关系型数据库管理系统,旨在满足现代企业在数据管理和分析方面的需求。作为SQL Server系列的最新版本,SQL Server 2022在性能、安全性、可靠性和开发效率方面实现了显著提升,成为企业数字化转型的核心引擎
(2) SQL Server 2022的特点及功能:
① 数据虚拟化与集成:
支持 Azure Synapse Link 和 Azure Purview 的深度集成,便于数据湖与数据仓库的连接和管理。
增强的跨数据平台查询能力(如访问 Oracle、MongoDB)。
② 高可用性:
多写入节点复制(Distributed Availability Groups):提高高可用性的灵活性。
灾难恢复增强:更高效的数据备份和还原策略。
2.3 相关技术基础
2.3.1 C/S结构
C/S 结构,即Client和Server结构。C/S结构减少了系统之间的通讯。Client/Server形式的结构被经常使用着,尽管现在主流采用B/S结构[8]。内部的和外部的用户可以访问新的和现有的软件系统,通过现有的系统中的逻辑迁移到新的应用系统[9]。然而,C/S结构相比较更安全。
2.3.2 WinForm技术
WinForm是使用.NET开发平台中的Windows 窗体[10]。新的数据连接方式如ODBC。Windows窗体是基于微软公共语言运行库的。开发起来较其他平台方便快捷许多。
2.4 本章小结
本章主要介绍了本系统的开发环境与开发过程中使用的工具,设计之初决定创建窗体应用,所以采用了..NET平台的WinForm技术,这样开发效率比较高而且开发比较方便简单。
第3章 系统需求与可行性分析
3.1 可行性分析
可行性分析(Feasibility Analysis)是在系统开启之前系统分析的基础上,针对新系统的开发的难度是否合理以及开发系统的必要性,从经济条件,技术难度,社会发展对系统进行的研究。可行性分析可以帮助分析人员提高新系统的认识,这在一定程度上保证了新工程朝着正确反向发展。一旦发现问题并且暂时没有可行的解决方案,项目将被搁置。
3.1.1 技术可行性
(1) 硬件环境:
本系统采用Microsoft Visual Studio 2019和SQL Server 2022进行开发,内存要求最低为384M,5400 RPM 硬盘 。而开发机内存16G、500G硬盘满足了这点要求。SQL Server 2022其处理器要求最低x64 处理器:AMD Opteron、AMD Athlon 64、支持 Intel EM64T 的 Intel Xeon,以及支持 EM64T 的 Intel Pentium IV,内存要求最低为512M,硬盘空间至少需要500MB的程序空间和1GB的数据空间,开发机AMD R7处理器满足了这点要求。
(2) 系统软件:
采用的64位的Windows 10操作系统都是可以满足以上开发要求的。
(3) 开发工具:
Microsoft Visual Studio允许开发人员使用不同的编程语言,作者选用C#完全可行。SQL Server在本系统中用于对基础信息的存储。
最后,开发者对编译原理知识的储备,以及对于开发工具Microsoft Visual Studio和SQL Server 2022的熟悉,都使得程序的开发在技术上是完全可行的。
3.1.2 操作可行性
由系统分析可知系统用户多为店铺经营者,能够熟练使用计算机,能够使用本系统。程序界面充分考虑了用户的操作习惯,操作简单。同时程序的操作选项都有相应的提示。所以从整体来讲,该系统应具有易用性、灵活性和可视性。熟悉Windows操作系统的人都能很快地掌握该系统的使用。
3.1.3 社会可行性
1. 社会背景
鲜花行业的市场需求:随着经济水平的提高,鲜花的消费场景从传统的婚庆、节庆扩展到日常装饰、个人消费等多个领域,市场规模不断扩大。
信息化趋势:数字化管理成为现代企业管理的主流趋势,中小型花店也逐渐意识到信息化系统对提高效率和降低成本的重要性。
2. 社会效益
提升经营效率:系统化的进销存管理能够帮助花店精准掌握库存状态,避免因库存不足或积压而导致的经济损失。
降低运营成本:通过合理规划进货和销售,减少人工记录和管理的工作量,同时优化资源配置。
提升服务质量:系统支持订单快速处理和数据实时更新,能够提高客户满意度和花店信誉。
3. 用户接受度
花店经营者:系统设计简单易用,符合中小企业用户的操作习惯,能够快速上手。
消费者:系统间接影响服务体验,使花店能够提供更高效的购买服务和售后支持。
3.2 系统需求
该系统设计的主要目的是帮助鲜花销售产业充分将此套软件应用在日常商店管理中,提高生产效率,减少人为数据,提升店铺的销售额,系统具有以下几点需求:
(1) 首先与各个供销商进行联系,然后记录这些供销商的信息,接着确定要购买的货物,然后再进行采购开单。采购部门根据制定并通过的采购单进行采购。
(2) 采购的原料以及生产部门的产品需要入库,生产领料和销售产品时需要进行出库。还有基本的库存查询、设置等操作。
(3) 对操作员等用户信息的编辑管理,包括基础信息、权限控制等。
(4) 基础数据用来维护日常所需要的信息,如商品类别、往来单位、部门。
3.3 本章小结
本章主要描述了本套系统的需求可实现的可行性,描述了系统的实现可能性与相关工具。讲述了系统所要涵盖的主要功能,以及用户使用本套系统可以获得的便利和系统设计的主要目的以及应用环境。
第4章 系统设计
4.1 概要设计
一个系统的功能框架和人机交互的感官框架的形成,其目的主要反映在人机交互的界面。系统界面的功能分组、页面布局和整体样式格局,这是用户习惯和系统设计之间的纽带。系统研究和用户的目标和需求的无缝集成的设计是转化为具体的界面设计的一个重要阶段。
概要设计的主要目的是根据需求分析将系统的整体功能体系架构和各个模块的联系进行规划。设计出软件的整体结构有助于系统的框架功能的开发并在前期给客户展示一些系统涵盖的功能范围。数据结构的设计包括数据的分享,设计出数据结构,数据库的生成与优化。
花店进销存管理系统采购管理系统包含如下几大模块:系统管理、基础资料管理、业务管理、查询中心。各个模块相互协作共同完成企业的业务流程。系统框架如图4-1所示。
图4-1系统框架图
各个模块功能介绍:
- 系统管理
用户管理:管理系统用户,包括添加、删除、修改用户信息,以及分配用户权限。
菜单管理:管理系统的菜单项,包括添加、删除、修改菜单,以及设置菜单的显示顺序。
数据备份:定期备份系统数据,确保数据安全,防止数据丢失。
权限分配:根据用户角色分配不同的系统操作权限。
2. 基础资料管理
商品信息:管理花店销售的商品信息,包括商品名称、价格、描述等。
仓库信息:管理仓库的基本信息,包括仓库位置、容量等。
往来单位:管理与花店有业务往来的供应商和客户信息。
计量单位:定义商品的计量单位,如件、束、千克等。
3. 业务管理
采购入库:管理商品的采购流程,包括采购订单、入库登记等。
销售出库:管理商品的销售流程,包括销售订单、出库登记等。
库存上下限:设置商品库存的上下限,当库存达到设定值时,系统会发出预警。
4. 查询中心
单据查询:查询系统中的各类单据,如采购单、销售单等。
采购查询:查询采购记录,包括采购时间、供应商、商品等信息。
销售查询:查询销售记录,包括销售时间、客户、商品等信息。
库存查询:查询当前库存情况,包括商品数量、存放位置等。
4.2 详细设计
详细设计主要是对算法和数据结构和特定的计算机语言实现各模块的实现初步描述。定义各个模块直接通信的接口,与数据库连接的统一接口和实现,为正式开发制定规范。
更改详细设计方案,不能对概要设计方案造成影响;详细设计阶段要出几篇文档,包括详细设计文档和模块设计方案。每个模块的详细设计文档都应该形成规范并以文档的形式公布。
详细设计的任务包括:
(1) 确定每个模块的算法的使用,一个合适的工具来表达算法的过程中选择,掌握每个算法的优缺点;
(2) 为模块内的数据结构进行设计。将需求分析、概要设计阶段确定的概念性的数据类型进行确切的定义;
(3)这个阶段我们将设计出系统开发中使用的大量的接口,接口的规范有助于开发人员程序书写的条理性和一致性的约束。采用接口还有助于我们本套系统与其他遗留系统的整合与集成。对于后期的维护和功能修改,采用统一的接口的方式将会使后期的开发方便快捷。
4.2.1系统管理详细设计
采购部门内勤根据库存量或者上级通知开采购单,上级领导对采购单进行查阅并批准,采购单返回给内勤,如果采购单批准通过,内勤将执行采购,然后采购单流向下一个模块(库存管理)。采购管理同时也维护着原料、供应商信息,也支持采购退货功能。
4.2.2 基础资料详细设计
采购环节的采购入库、退货出库、生产环节的领料、退料以及销售环节的相应操作都由库存管理模块负责。根据相应的单据,库管人员实施出库入库操作并将信息记录下来。仓库信息状态给用户提供直观的库存数量等信息,物品的库存数量一方面由业务流程自动进行更新维护,另一方面也支持操作人员手动进行修改,但每一次手动操作都会被记录下来。
4.2.3 业务管理详细设计
生产环节包括上级填写生产计划,生产部门根据生产计划单选择合适的配方,系统根据配方按照比例自动生成相应的领取原料的数量等信息,在领料结束后,生产部门进行生产,并提交实际的生产数量。根据原料的批次价格,系统计算出总成本以及产品的实际单成本。生产完成后,生产部门提交入库申请,库管部门进行入库操作并完成相应的入库信息。
4.2.4 查询中心详细设计
配方管理主要涉及到配方编码、配方名称、相应原料数量、总计等信息的增加、删除、修改等操作。
4.3 数据库设计
GoodsInfos(商品信息表):存储商品的基本信息,如名称、编号、价格等。如表4-1所示。
表4-1 GoodsInfos(商品信息表)
字段名 |
中文含义 |
数据类型 |
允许空 |
约束条件 |
GoodsId |
商品ID |
INT |
否 |
主键,自增 |
GoodsNo |
商品编号 |
VARCHAR |
否 |
唯一 |
GoodsName |
商品名称 |
VARCHAR |
否 |
|
GoodsPYNo |
商品拼音码 |
VARCHAR |
是 |
|
GoodsSName |
商品简称 |
VARCHAR |
是 |
|
GoodsTXNo |
商品条形码 |
VARCHAR |
是 |
唯一 |
GUnit |
商品单位 |
VARCHAR |
否 |
|
GTypeId |
商品类型ID |
INT |
否 |
外键,关联商品类型表 |
GProperties |
商品属性 |
VARCHAR |
是 |
|
IsStopped |
是否停用 |
TINYINT |
否 |
默认值 0 |
RetailPrice |
零售价 |
DECIMAL |
否 |
|
LowPrice |
最低价 |
DECIMAL |
是 |
|
PrePrice |
预售价 |
DECIMAL |
是 |
|
Discount |
折扣 |
DECIMAL |
是 |
|
BidPrice |
进货价 |
DECIMAL |
是 |
|
Remark |
备注 |
TEXT |
是 |
|
IsDeleted |
是否已删除 |
TINYINT |
否 |
默认值 0 |
Creator |
创建人 |
VARCHAR |
否 |
|
CreateTime |
创建时间 |
DATETIME |
否 |
自动生成 |
GoodsPic |
商品图片 |
BLOB |
是 |
|
GoodsTypeInfos(商品类型信息表):存储商品类型的相关信息,用于分类商品。如表4-2所示。
表4-2 GoodsTypeInfos(商品类型信息表)
字段名 |
中文含义 |
数据类型 |
允许空 |
约束条件 |
GTypeId |
商品类型ID |
INT |
否 |
主键,自增 |
GTypeName |
商品类型名称 |
VARCHAR |
否 |
唯一 |
ParentId |
父类型ID |
INT |
否 |
根类型为 0 |
ParentName |
父类型名称 |
VARCHAR |
是 |
|
GTypeNo |
商品类型编号 |
VARCHAR |
否 |
唯一 |
GTPYNo |
商品类型拼音码 |
VARCHAR |
是 |
|
GTOrder |
商品类型排序 |
INT |
否 |
默认从 1 开始 |
Creator |
创建人 |
VARCHAR |
否 |
|
CreateTime |
创建时间 |
DATETIME |
否 |
自动生成 |
IsDeleted |
是否已删除 |
TINYINT |
否 |
默认值 0 |
UnitInfos(单位信息表):存储单位的基本信息,如单位名称、地址、联系人等。如表4-3所示。
表4-3 UnitInfos(单位信息表)
字段名 |
中文含义 |
数据类型 |
允许空 |
约束条件 |
GUnitId |
单位ID |
INT |
否 |
主键,自增 |
GUnitName |
单位名称 |
VARCHAR |
否 |
唯一 |
GUnitPYNo |
单位拼音码 |
VARCHAR |
是 |
|
GUnitOrder |
单位排序 |
INT |
否 |
默认从 1 开始 |
IsDeleted |
是否已删除 |
TINYINT |
否 |
默认值 0 |
Creator |
创建人 |
VARCHAR |
否 |
|
CreateTime |
创建时间 |
DATETIME |
否 |
自动生成 |
MenuInfos(菜单信息表):记录系统所有菜单相关信息。如表4-4所示。
表4-4 MenuInfos(菜单信息表)
字段名 |
中文含义 |
数据类型 |
允许空 |
约束条件 |
MId |
菜单ID |
INT |
否 |
主键,自增 |
MName |
菜单名称 |
VARCHAR |
否 |
唯一 |
ParentId |
父菜单ID |
INT |
否 |
根菜单为 0 |
ParentName |
父菜单名称 |
VARCHAR |
是 |
|
MKey |
菜单快捷键 |
VARCHAR |
是 |
|
MUrl |
菜单链接 |
VARCHAR |
是 |
|
IsTop |
是否顶级菜单 |
TINYINT |
否 |
默认值 0 |
MOrder |
菜单排序 |
INT |
否 |
默认从 1 开始 |
IsDeleted |
是否已删除 |
TINYINT |
否 |
默认值 0 |
Creator |
创建人 |
VARCHAR |
否 |
|
CreateTime |
创建时间 |
DATETIME |
否 |
自动生成 |
MDesp |
菜单描述 |
TEXT |
是 |
|
PerchaseGoodsInfos(采购商品信息表):记录采购商品的详细信息,包括采购单价和数量。如表4-5所示。
表4-5 PerchaseGoodsInfos(采购商品信息表)
字段名 |
中文含义 |
数据类型 |
允许空 |
约束条件 |
PerId |
采购入库ID |
INT |
否 |
主键,自增 |
PerchaseNo |
采购单号 |
VARCHAR |
否 |
唯一 |
UnitId |
单位ID |
INT |
否 |
外键,关联单位表 |
StoreId |
仓库ID |
INT |
否 |
外键,关联仓库表 |
DealPerson |
处理人 |
VARCHAR |
否 |
|
PayDesp |
付款方式描述 |
VARCHAR |
否 |
|
ThisAmount |
本次金额 |
DECIMAL |
否 |
|
Remark |
备注 |
TEXT |
是 |
|
TotalAmount |
总金额 |
DECIMAL |
否 |
|
YHAmount |
优惠金额 |
DECIMAL |
否 |
|
Creator |
创建人 |
VARCHAR |
否 |
|
CreateTime |
创建时间 |
DATETIME |
否 |
自动生成 |
IsChecked |
是否已审核 |
TINYINT |
否 |
默认值 0 |
IsPayed |
是否已付款 |
TINYINT |
否 |
默认值 0 |
IsPayFull |
是否全额付款 |
TINYINT |
否 |
默认值 0 |
CheckTime |
审核时间 |
DATETIME |
是 |
|
CheckPerson |
审核人 |
VARCHAR |
是 |
|
PayTime |
付款时间 |
DATETIME |
是 |
|
IsDeleted |
是否已删除 |
TINYINT |
否 |
默认值 0 |
PerchaseInStoreInfos(采购入库信息表):记录采购商品的入库信息,包括付款情况和入库数量。如表4-6所示。
表4-6 PerchaseInStoreInfos(采购入库信息表)
字段名 |
中文含义 |
数据类型 |
允许空 |
约束条件 |
PerId |
采购入库ID |
INT |
否 |
主键,自增 |
PerchaseNo |
采购单号 |
VARCHAR |
否 |
唯一 |
UnitId |
单位ID |
INT |
否 |
外键,关联单位表 |
StoreId |
仓库ID |
INT |
否 |
外键,关联仓库表 |
DealPerson |
处理人 |
VARCHAR |
否 |
|
PayDesp |
付款方式描述 |
VARCHAR |
否 |
|
ThisAmount |
本次金额 |
DECIMAL |
否 |
|
Remark |
备注 |
TEXT |
是 |
|
TotalAmount |
总金额 |
DECIMAL |
否 |
|
YHAmount |
优惠金额 |
DECIMAL |
否 |
|
Creator |
创建人 |
VARCHAR |
否 |
|
CreateTime |
创建时间 |
DATETIME |
否 |
自动生成 |
IsChecked |
是否已审核 |
TINYINT |
否 |
默认值 0 |
IsPayed |
是否已付款 |
TINYINT |
否 |
默认值 0 |
IsPayFull |
是否全额付款 |
TINYINT |
否 |
默认值 0 |
CheckTime |
审核时间 |
DATETIME |
是 |
|
CheckPerson |
审核人 |
VARCHAR |
是 |
|
PayTime |
付款时间 |
DATETIME |
是 |
|
IsDeleted |
是否已删除 |
TINYINT |
否 |
默认值 0 |
RegionInfos(区域信息表):定义区域信息,如省市区等,支持区域划分。如表4-7所示。
表4-7 RegionInfos(区域信息表)
字段名 |
中文含义 |
数据类型 |
允许空 |
约束条件 |
RegionId |
区域ID |
INT |
否 |
主键,自增 |
RegionName |
区域名称 |
VARCHAR |
否 |
唯一 |
ParentId |
父区域ID |
INT |
否 |
根区域为 0 |
ParentName |
父区域名称 |
VARCHAR |
是 |
|
RegionPYNo |
区域拼音码 |
VARCHAR |
是 |
|
RegionLevel |
区域级别 |
INT |
否 |
默认值 0 |
RoleInfos(角色信息表):定义系统中的不同角色,如管理员、普通用户等。如表4-8所示。
表4-8 RoleInfos(角色信息表)
字段名 |
中文含义 |
数据类型 |
允许空 |
约束条件 |
RoleId |
角色ID |
INT |
否 |
主键,自增 |
RoleName |
角色名称 |
VARCHAR |
否 |
唯一 |
Remark |
备注 |
TEXT |
是 |
|
IsAdmin |
是否是管理员 |
TINYINT |
否 |
默认值 0 |
IsDeleted |
是否已删除 |
TINYINT |
否 |
默认值 0 |
Creator |
创建人 |
VARCHAR |
否 |
|
CreateTime |
创建时间 |
DATETIME |
否 |
自动生成 |
RoleMenuInfos(角色菜单信息表):关联角色和菜单,管理用户的菜单访问权限。如表4-9所示。
表4-9 RoleMenuInfos(角色菜单信息表)
字段名 |
中文含义 |
数据类型 |
允许空 |
约束条件 |
RMId |
角色菜单ID |
INT |
否 |
主键,自增 |
RoleId |
角色ID |
INT |
否 |
外键,关联角色表 |
MId |
菜单ID |
INT |
否 |
外键,关联菜单表 |
Creator |
创建人 |
VARCHAR |
否 |
|
CreateTime |
创建时间 |
DATETIME |
否 |
自动生成 |
IsDeleted |
是否已删除 |
TINYINT |
否 |
默认值 0 |
RoleMenuInfos(角色菜单信息表):关联角色和菜单,管理用户的菜单访问权限。如表4-10所示。
表4-10 RoleTMenuInfos(角色工具菜单信息表)
字段名 |
中文含义 |
数据类型 |
允许空 |
约束条件 |
RTMenuId |
角色工具菜单ID |
INT |
否 |
主键,自增 |
RoleId |
角色ID |
INT |
否 |
外键,关联角色表 |
TMenuId |
工具菜单ID |
INT |
否 |
外键,关联工具菜单表 |
Creator |
创建人 |
VARCHAR |
否 |
|
CreateTime |
创建时间 |
DATETIME |
否 |
自动生成 |
IsDeleted |
是否已删除 |
TINYINT |
否 |
默认值 0 |
SaleGoodsInfos(销售商品信息表):记录销售的商品信息,包括数量、销售价格等。如表4-11所示。
表4-11 SaleGoodsInfos(销售商品信息表)
字段名 |
中文含义 |
数据类型 |
允许空 |
约束条件 |
SaleGoodsId |
销售商品ID |
INT |
否 |
主键,自增 |
SaleId |
销售单号 |
INT |
否 |
外键,关联销售表 |
GoodsId |
商品ID |
INT |
否 |
外键,关联商品表 |
GUnit |
商品单位 |
VARCHAR |
否 |
|
Count |
销售数量 |
INT |
否 |
|
SalePrice |
销售价 |
DECIMAL |
否 |
|
Amount |
销售金额 |
DECIMAL |
否 |
|
Remark |
备注 |
TEXT |
是 |
|
IsDeleted |
是否已删除 |
TINYINT |
否 |
默认值 0 |
SaleOutStoreInfos(销售出库信息表):记录销售出库的详细信息,包括销售订单、支付信息等。如表4-12所示。
表4-12 SaleOutStoreInfos(销售出库信息表)
字段名 |
中文含义 |
数据类型 |
允许空 |
约束条件 |
SaleId |
销售ID |
INT |
否 |
外键,关联销售表 |
SaleOutNo |
销售出库单号 |
VARCHAR |
否 |
唯一 |
UnitId |
单位ID |
INT |
否 |
外键,关联单位表 |
StoreId |
仓库ID |
INT |
否 |
外键,关联仓库表 |
DealPerson |
处理人 |
VARCHAR |
否 |
|
PayDesp |
付款方式描述 |
VARCHAR |
否 |
|
ThisAmount |
本次金额 |
DECIMAL |
否 |
|
Remark |
备注 |
TEXT |
是 |
|
TotalAmount |
总金额 |
DECIMAL |
否 |
|
YHAmount |
优惠金额 |
DECIMAL |
否 |
|
Creator |
创建人 |
VARCHAR |
否 |
|
CreateTime |
创建时间 |
DATETIME |
否 |
自动生成 |
IsChecked |
是否已审核 |
TINYINT |
否 |
默认值 0 |
IsPayed |
是否已付款 |
TINYINT |
否 |
默认值 0 |
IsPayFull |
是否全额付款 |
TINYINT |
否 |
默认值 0 |
CheckTime |
审核时间 |
DATETIME |
是 |
|
CheckPerson |
审核人 |
VARCHAR |
是 |
|
IsDeleted |
是否已删除 |
TINYINT |
否 |
默认值 0 |
PayTime |
付款时间 |
DATETIME |
是 |
|
StockChangeInfos(库存变更信息表):记录库存的增减变动情况,如入库或出库。如表4-13所示。
表4-13 StockChangeInfos(库存变更信息表)
字段名 |
中文含义 |
数据类型 |
允许空 |
约束条件 |
StockChangeId |
库存变更ID |
INT |
否 |
主键,自增 |
CheckShId |
检查单ID |
INT |
否 |
外键,关联检查单表 |
ShType |
库存变更类型 |
INT |
否 |
|
StoreId |
仓库ID |
INT |
否 |
外键,关联仓库表 |
GoodsId |
商品ID |
INT |
否 |
外键,关联商品表 |
InCount |
入库数量 |
INT |
否 |
|
OutCount |
出库数量 |
INT |
否 |
|
CurCount |
当前库存量 |
INT |
否 |
|
StoreInfos(仓库信息表):存储仓库的基本信息,包括仓库编号、名称、类型等。如表4-14所示。
表4-14 StockStoreInfos(库存信息表)
字段名 |
中文含义 |
数据类型 |
允许空 |
约束条件 |
StockId |
库存ID |
INT |
否 |
主键,自增 |
StockNo |
库存单号 |
VARCHAR |
否 |
唯一 |
StoreId |
仓库ID |
INT |
否 |
外键,关联仓库表 |
DealPerson |
处理人 |
VARCHAR |
否 |
|
Remark |
备注 |
TEXT |
是 |
|
Creator |
创建人 |
VARCHAR |
否 |
|
CreateTime |
创建时间 |
DATETIME |
否 |
自动生成 |
IsChecked |
是否已审核 |
TINYINT |
否 |
默认值 0 |
CheckPerson |
审核人 |
VARCHAR |
是 |
|
CheckTime |
审核时间 |
DATETIME |
是 |
|
IsDeleted |
是否已删除 |
TINYINT |
否 |
默认值 0 |
StoreGoodsStockInfos(仓库商品库存信息表):记录仓库中每种商品的库存数量及金额。如表4-15所示。
表4-15 StoreGoodsStockInfos(仓库商品库存信息表)
字段名 |
中文含义 |
数据类型 |
允许空 |
约束条件 |
StoreGoodsId |
仓库商品库存ID |
INT |
否 |
主键,自增 |
StoreId |
仓库ID |
INT |
否 |
外键,关联仓库表 |
GoodsId |
商品ID |
INT |
否 |
外键,关联商品表 |
StCount |
库存数量 |
INT |
否 |
|
StAmount |
库存金额 |
DECIMAL |
否 |
|
StPrice |
商品单价 |
DECIMAL |
否 |
|
CurCount |
当前库存量 |
INT |
否 |
|
StockAmount |
库存总金额 |
DECIMAL |
否 |
|
StockUp |
入库数量 |
INT |
是 |
|
StockDown |
出库数量 |
INT |
是 |
|
Creator |
创建人 |
VARCHAR |
否 |
|
Createtime |
创建时间 |
DATETIME |
否 |
自动生成 |
IsDeleted |
是否已删除 |
TINYINT |
否 |
默认值 0 |
StoreInfos(仓库信息表):存储仓库的基本信息,包括仓库编号、名称、类型等。如表4-16所示。
表4-16 StoreInfos(仓库信息表)
字段名 |
中文含义 |
数据类型 |
允许空 |
约束条件 |
StoreId |
仓库ID |
INT |
否 |
主键,自增 |
StoreNo |
仓库编号 |
VARCHAR |
否 |
唯一 |
StoreName |
仓库名称 |
VARCHAR |
否 |
唯一 |
STypeId |
仓库类型ID |
INT |
否 |
外键,关联仓库类型表 |
StorePYNo |
仓库拼音码 |
VARCHAR |
是 |
|
StoreOrder |
仓库排序 |
INT |
否 |
默认值 1 |
StoreRemark |
仓库备注 |
TEXT |
是 |
|
IsDeleted |
是否已删除 |
TINYINT |
否 |
默认值 0 |
Creator |
创建人 |
VARCHAR |
否 |
|
CreateTime |
创建时间 |
DATETIME |
否 |
自动生成 |
StoreTypeInfos(仓库类型信息表):定义仓库的类型信息,如总仓库、分仓库等。如表4-17所示。
表4-17 StoreTypeInfos(仓库类型信息表)
字段名 |
中文含义 |
数据类型 |
允许空 |
约束条件 |
STypeId |
仓库类型ID |
INT |
否 |
主键,自增 |
STypeName |
仓库类型名称 |
VARCHAR |
否 |
唯一 |
STPYNo |
仓库类型拼音码 |
VARCHAR |
是 |
|
STypeOrder |
仓库类型排序 |
INT |
否 |
默认值 1 |
IsDeleted |
是否已删除 |
TINYINT |
否 |
默认值 0 |
Creator |
创建人 |
VARCHAR |
否 |
|
CreateTime |
创建时间 |
DATETIME |
否 |
自动生成 |
StStockGoodsInfos(库存商品信息表):定义库存商品的信息,如仓库、数量、金额等。如表4-18所示。
表4-18 StStockGoodsInfos(库存商品信息表)
字段名 |
中文含义 |
数据类型 |
允许空 |
约束条件 |
StStockId |
库存商品ID |
INT |
否 |
主键,自增 |
StockId |
仓库ID |
INT |
否 |
外键,关联仓库表 |
GoodsId |
商品ID |
INT |
否 |
外键,关联商品表 |
StCount |
库存数量 |
INT |
否 |
|
StPrice |
商品单价 |
DECIMAL |
否 |
|
StAmount |
库存总金额 |
DECIMAL |
否 |
|
IsDeleted |
是否已删除 |
TINYINT |
否 |
默认值 0 |
Remark |
备注 |
TEXT |
是 |
|
SysInfos(系统信息表):记录系统相关信息,如系统名称、是否开启等。如表4-19所示。
表4-19 SysInfos(系统信息表)
字段名 |
中文含义 |
数据类型 |
允许空 |
约束条件 |
SysId |
系统ID |
INT |
否 |
主键,自增 |
SysName |
系统名称 |
VARCHAR |
否 |
唯一 |
IsOpened |
是否开启 |
TINYINT |
否 |
默认值 1 |
OpenTime |
开启时间 |
DATETIME |
否 |
自动生成 |
ToolGroupInfos(工具组信息表):存储工具组的基本信息,管理系统工具分类。如表4-10所示。
表4-20 ToolGroupInfos(工具组信息表)
字段名 |
中文含义 |
数据类型 |
允许空 |
约束条件 |
TGroupId |
工具组ID |
INT |
否 |
主键,自增 |
TGroupName |
工具组名称 |
VARCHAR |
否 |
唯一 |
Creator |
创建人 |
VARCHAR |
否 |
|
CreateTime |
创建时间 |
DATETIME |
否 |
自动生成 |
IsDeleted |
是否已删除 |
TINYINT |
否 |
默认值 0 |
ToolMenuInfos(工具菜单信息表):定义工具菜单的信息,包括菜单名称、图标、排序等。如表4-21所示。
表4-21 ToolMenuInfos(工具菜单信息表)
字段名 |
中文含义 |
数据类型 |
允许空 |
约束条件 |
TMenuId |
工具菜单ID |
INT |
否 |
主键,自增 |
TMenuName |
工具菜单名称 |
VARCHAR |
否 |
唯一 |
TMPic |
工具菜单图片 |
VARCHAR |
是 |
|
TMOrder |
工具菜单排序 |
INT |
否 |
默认值 1 |
TGroupId |
工具组ID |
INT |
否 |
外键,关联工具组表 |
TMUrl |
工具菜单URL |
VARCHAR |
是 |
|
IsTop |
是否置顶 |
TINYINT |
否 |
默认值 0 |
Creator |
创建人 |
VARCHAR |
否 |
|
CreateTime |
创建时间 |
DATETIME |
否 |
自动生成 |
TMDesp |
工具菜单描述 |
TEXT |
是 |
|
IsDeleted |
是否已删除 |
TINYINT |
否 |
默认值 0 |
UnitInfos(单位信息表):存储单位的基本信息,如单位名称、地址、联系人等。如表4-22所示。
表4-22 UnitInfos(单位信息表)
字段名 |
中文含义 |
数据类型 |
允许空 |
约束条件 |
UnitId |
单位ID |
INT |
否 |
主键,自增 |
UnitName |
单位名称 |
VARCHAR |
否 |
唯一 |
UnitPYNo |
单位拼音码 |
VARCHAR |
是 |
|
UTypeId |
单位类型ID |
INT |
否 |
外键,关联单位类型表 |
UnitProperties |
单位性质 |
VARCHAR |
否 |
|
RegionId |
区域ID |
INT |
否 |
外键,关联区域表 |
Address |
地址 |
VARCHAR |
否 |
|
FullAddress |
完整地址 |
VARCHAR |
否 |
|
UnitNo |
单位编号 |
VARCHAR |
否 |
唯一 |
ContactPerson |
联系人 |
VARCHAR |
否 |
|
PhoneNumber |
手机号码 |
VARCHAR |
是 |
|
Telephone |
固定电话 |
VARCHAR |
是 |
|
Fax |
传真 |
VARCHAR |
是 |
|
|
邮箱 |
VARCHAR |
是 |
|
PostalCode |
邮政编码 |
VARCHAR |
是 |
|
Remark |
备注 |
TEXT |
是 |
|
IsNoVail |
是否有效 |
TINYINT |
否 |
默认值 0 |
IsDeleted |
是否已删除 |
TINYINT |
否 |
默认值 0 |
Creator |
创建人 |
VARCHAR |
否 |
|
CreateTime |
创建时间 |
DATETIME |
否 |
自动生成 |
UnitTypeInfos(单位类型信息表):存储单位类型信息,如供应商、客户等。如表4-23所示。
表4-23 UnitTypeInfos(单位类型信息表)
字段名 |
中文含义 |
数据类型 |
允许空 |
约束条件 |
UTypeId |
单位类型ID |
INT |
否 |
主键,自增 |
UTypeName |
单位类型名称 |
VARCHAR |
否 |
唯一 |
ParentId |
父级单位类型ID |
INT |
是 |
外键,关联自身 |
ParentName |
父级单位类型名称 |
VARCHAR |
是 |
|
UTypeNo |
单位类型编号 |
VARCHAR |
否 |
唯一 |
UTPYNo |
单位类型拼音码 |
VARCHAR |
是 |
|
UTOrder |
单位类型排序 |
INT |
否 |
默认值 1 |
IsDeleted |
是否已删除 |
TINYINT |
否 |
默认值 0 |
Creator |
创建人 |
VARCHAR |
否 |
|
CreateTime |
创建时间 |
DATETIME |
否 |
自动生成 |
UserInfos(用户信息表):记录系统用户的基本信息,如用户名、密码、状态等。如表4-24所示。
表4-24 UserInfos(用户信息表)
字段名 |
中文含义 |
数据类型 |
允许空 |
约束条件 |
UserId |
用户ID |
INT |
否 |
主键,自增 |
UserName |
用户名 |
VARCHAR |
否 |
唯一 |
UserPwd |
用户密码 |
VARCHAR |
否 |
|
UserState |
用户状态 |
TINYINT |
否 |
默认值 1 |
Creator |
创建人 |
VARCHAR |
否 |
|
CreateTime |
创建时间 |
DATETIME |
否 |
自动生成 |
IsDeleted |
是否已删除 |
TINYINT |
否 |
默认值 0 |
UserRoleInfos(用户角色信息表):关联用户和角色,管理用户的权限。如表4-25所示。
表4-25 UserRoleInfos(用户角色信息表)
字段名 |
中文含义 |
数据类型 |
允许空 |
约束条件 |
URId |
用户角色ID |
INT |
否 |
主键,自增 |
UserId |
用户ID |
INT |
否 |
外键,关联用户表 |
RoleId |
角色ID |
INT |
否 |
外键,关联角色表 |
Creator |
创建人 |
VARCHAR |
否 |
|
CreateTime |
创建时间 |
DATETIME |
否 |
自动生成 |
IsDeleted |
是否已删除 |
TINYINT |
否 |
默认值 0 |
4.4 界面设计
4.4.1 界面设计采用WinForm
WinForm自身包含了大量的窗体控件,当然,设计者也可以通过给定的接口来设计自己的窗体控件。本着简洁方便的原则,通过使用微软提供的窗体控件使得程序风格统一并且与用户日常接触的习惯一致。通过为按钮等控件赋予一些声音和颜色特性,给用户更好的反馈效果。
4.4.2 主页面设计
系统主页面分为三个部分,最上面是下拉式菜单栏(MenuStrip),菜单栏有系统管理、基础资料、业务管理、查询中心、退出等菜单选项。菜单栏下侧是常用工具菜单(ToolStrip),用户登录进来后所拥有的功能都在这里显示。中间最大的区域是业务操作区,单击工具菜单项之后弹出的窗口都将在此显示。系统主页面如图4-1所示。
图4-1系统主页面图
4.4.3 选项卡设计
为了方便用户的操作,打开新的页面时系统会以选项卡的方式在中间部分显示。系统允许用户同时打开多个选项卡且支持刷新和关闭操作。如果用户要打开的页面已经存在,那么不会打开相同的页面,而是选中选项卡。选项卡如图4-2所示。
图4-2 选项卡图
4.4.4 数据表格设计
系统为数据表格设计了统一的表现形式。数据表格提供按条件查询的功能,用户可以根据条件查询所需数据。用户可以自定义页面显示数据的数量、刷新数据表格。用户可以选中整条数据进行相应的业务处理,比如批准某条记录。数据表格同时提供拖拽功能,用户可以根据自己的需要或者爱好调整各数据列的显示大小,双击进入详细信息查看并且可以导出数据。当数据过多时,自动生成滚动条。提供的下拉框和查询功能能够让用户快速定位到需要的数据。数据表格支持立刻刷新,当用户完成操作时,数据表格也马上进行更新,这样就保证用户能够及时方便地看到操作后的结果。数据表格如图4-3所示。
图4-3 数据表格图
4.5 本章小结
本章描述了系统的整体功能设计,每个模块流程的详细设计,还有数据库设计。展示了几个主要界面的设计效果,还有为了方便用户或者提升用户体验而设计的一些解决方案与一些主流的设计。
第5章 系统技术方案
5.1 业务流程管理
基于公司的管理制度,业务流程一般分为采购、批准、入库、库存四个环节。
比如采购管理,由采购部门内勤先开采购单,然后上级领导进行批准,如果批准通过则内勤根据采购单进行购买,购买完成后交给库管进行入库,并填写真正的入库数量。
销售流程,填写销售单后由上级领导进行批准,如果批准通过则通过库管进行商品销售出库。采购流程如图5-1所示。
图5-1 采购流程图
5.2 重要数据加密
为了方便软件分发并使软件更具有可读性,连接数据库等信息使用ini文件进行配置。其中用户名和密码进行了MD5加密。加密算法如下:
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Security.Cryptography;
using System.Text;
using System.Threading.Tasks;
namespace PSI.Common.Encrypt
{
/// <summary>
/// 不可逆加密,限于字母和数字
/// </summary>
public class MD5Encrypt
{
#region MD5
/// <summary>
/// MD5加密,和动网上的16/32位MD5加密结果相同
/// </summary>
/// <param name="strSource">待加密字串</param>
/// <param name="length">16或32值之一,其它则采用.net默认MD5加密算法</param>
/// <returns>加密后的字串</returns>
public static string Encrypt(string source, int length = 32)
{
HashAlgorithm provider = CryptoConfig.CreateFromName("MD5") as HashAlgorithm;
if (string.IsNullOrEmpty(source)) return string.Empty;
byte[] bytes = Encoding.ASCII.GetBytes(source);
byte[] hashValue = provider.ComputeHash(bytes);
StringBuilder sb = new StringBuilder();
switch (length)
{
case 16://16位密文是32位密文的9到24位字符
for (int i = 4; i < 12; i++)
sb.Append(hashValue[i].ToString("x2"));
break;
case 32:
for (int i = 0; i < 16; i++)
{
sb.Append(hashValue[i].ToString("x2"));
}
break;
default:
for (int i = 0; i < hashValue.Length; i++)
{
sb.Append(hashValue[i].ToString("x2"));
}
break;
}
return sb.ToString();
}
#endregion MD5
}
}
此外还有DES加密和RSA加密算法:
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Security.Cryptography;
using System.Text;
using System.Threading.Tasks;
namespace PSI.Common.Encrypt
{
/// <summary>
/// 可逆对称加密 密钥长度8
/// </summary>
public class DesEncrypt
{
//8位长度
private static string KEY = "huadianjinxiaocun";
private static byte[] key = ASCIIEncoding.ASCII.GetBytes(KEY.Substring(0, 8));
private static byte[] iv = ASCIIEncoding.ASCII.GetBytes(KEY.Insert(0, "w").Substring(0, 8));
/// <summary>
/// DES 加密
/// </summary>
/// <param name="strValue"></param>
/// <returns></returns>
public static string Encrypt(string strValue)
{
DESCryptoServiceProvider dsp = new DESCryptoServiceProvider();
MemoryStream memStream = new MemoryStream();
using (memStream)
{
CryptoStream crypStream = new CryptoStream(memStream, dsp.CreateEncryptor(key, iv), CryptoStreamMode.Write);
StreamWriter sWriter = new StreamWriter(crypStream);
sWriter.Write(strValue);
sWriter.Flush();
crypStream.FlushFinalBlock();
memStream.Flush();
return Convert.ToBase64String(memStream.GetBuffer(), 0, (int)memStream.Length);
}
}
/// <summary>
/// DES解密
/// </summary>
/// <param name="EncValue"></param>
/// <returns></returns>
public static string Decrypt(string EncValue)
{
DESCryptoServiceProvider dsp = new DESCryptoServiceProvider();
byte[] buffer = Convert.FromBase64String(EncValue);
MemoryStream memStream = new MemoryStream();
using (memStream)
{
CryptoStream crypStream = new CryptoStream(memStream, dsp.CreateDecryptor(key, iv), CryptoStreamMode.Write);
crypStream.Write(buffer, 0, buffer.Length);
crypStream.FlushFinalBlock();
return ASCIIEncoding.UTF8.GetString(memStream.ToArray());
}
}
}
}
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Security.Cryptography;
using System.Text;
using System.Threading.Tasks;
namespace PSI.Common.Encrypt
{
public class RsaEncrypt
{
private static string PublicKey = @"BgIAAACkAABSU0ExAAQAAAEAAQDlrlvIesvhOZxK8dVyVMC+HUoB7FchNRkrUgJSK6FlfPpnoEPGq7bbO2FxebuFE331gNugopwq+82cylsQycSwFBBFbQTh+X9hmW2fOReRoCxDsGdlscm06BX/26fHqO09RoCpbTE+NDpe6PmNMoIopcvrLU5WeLD/EIsjFyvNvg==";
private static string PrivateKey = @"BwIAAACkAABSU0EyAAQAAAEAAQDlrlvIesvhOZxK8dVyVMC+HUoB7FchNRkrUgJSK6FlfPpnoEPGq7bbO2FxebuFE331gNugopwq+82cylsQycSwFBBFbQTh+X9hmW2fOReRoCxDsGdlscm06BX/26fHqO09RoCpbTE+NDpe6PmNMoIopcvrLU5WeLD/EIsjFyvNvv28ikuyuQa95UBe5VNy/1HDrTo7BZYClfLULVVS/tAt/tqVMXS6p9JlFWR6SbrJUeR0PGFmLOdpj1NvkCVNrOMJUlrrFcGTnf+G8dKFxsqWZ9cmKffYMfIHVt1xqK6fkou4l1nA5z0gs/IAFvvmWyT3QQV1kQhWl21b7sCfdIrWZWlyB92wtMbGGbwJiwRDnCJ7gdt37wW3XSjSMDQqyGuNfnTM1XgCWzMTHNnFUqT35OUj5twmSSrqkbaZLxfElbm8TjBwudQDpgivvil396QH4dzo6r6NTU+/LDqzjtIv1DN31bhZhq9+Yezoxd8BSKiKMDwUZYFN/ztmtNDnO7gisZPy1ZGvltWuVCkpavWB6fNrZmqg5LcFH46vGmE4GR5CXg5PLMrlC0+97lpGLlU9XaB3kbXOQ1n9XfPkvJh+gdyXXcfymN3DAHRk352VlyexKkN+CBHzGEmzvVLqPG3DAvJnmHx0D+leLlxg8xp04CjkAL+rPk1+yhB6WMlU9I4sTyBPkmpOv188NC52JO/fSLd/ZuIf1NsceO4vLywbPskoQiVKn6PDzX0R6ztPvYvCON45GZ+NykzATXnczgM=";
/// <summary>
/// 获取密钥对 key公钥 value私鈅
/// </summary>
/// <returns></returns>
public static KeyValuePair<string, string> GetKeyPair()
{
RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();
string publicKey = Convert.ToBase64String(rsa.ExportCspBlob(false));
string privateKey = Convert.ToBase64String(rsa.ExportCspBlob(true));
return new KeyValuePair<string, string>(publicKey, privateKey);
}
/// <summary>
/// 加密
/// </summary>
/// <param name="content"></param>
/// <param name="publicKey">为空使用默认公钥</param>
/// <returns></returns>
public static string Encrypt(string content, string publicKey = "")
{
UnicodeEncoding ByteConverter = new UnicodeEncoding();
byte[] DataToEncrypt = ByteConverter.GetBytes(content);
RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();
publicKey = string.IsNullOrEmpty(publicKey) ? PublicKey : publicKey;
byte[] publicKeyBytes = Convert.FromBase64String(publicKey);
rsa.ImportCspBlob(publicKeyBytes);//公钥加密
byte[] resultBytes = rsa.Encrypt(DataToEncrypt, false);
return Convert.ToBase64String(resultBytes);
}
/// <summary>
/// 解密
/// </summary>
/// <param name="content"></param>
/// <param name="privateKey">为空使用默认私鈅</param>
/// <returns></returns>
public static string Decrypt(string content, string privateKey = "")
{
byte[] dataToDecrypt = Convert.FromBase64String(content);
RSACryptoServiceProvider RSA = new RSACryptoServiceProvider();
privateKey = string.IsNullOrEmpty(privateKey) ? PrivateKey : privateKey;
byte[] privateKeyBytes = Convert.FromBase64String(privateKey);
RSA.ImportCspBlob(privateKeyBytes);
byte[] resultBytes = RSA.Decrypt(dataToDecrypt, false);
UnicodeEncoding ByteConverter = new UnicodeEncoding();
return ByteConverter.GetString(resultBytes);
}
}
}
5.3 初始化功能列表
系统通过用户表、角色表、功能表3张表实现了权限管理。其中用户表中有角色字段,一个用户可以有多个角色,角色表中有功能字段,一个角色可以包含多个功能。3张表连接起来可以得到用户的功能列表。
用户登录系统后,根据用户的角色信息,查询数据库得到用户拥有的功能项,然后利用用户拥有的功能实例化系统的工具菜单列表。
5.4 本章小结
本章主要描述了本套系统的实现方案,包括使用的第三发工具,系统开发中使用到的一些算法,系统的主要工作流程分析。对于权限管理也进行了详细的介绍和方案可行性分析。
第6章 系统实现
6.1 基础数据模块实现
拥有权限的用户可以对系统的角色、部门、职务、规格、单位、仓库等信息进行管理。用户根据公司的管理结构设定职务与部门,基于业务流程与物品信息维护物品规格与单位。通过设定角色并将角色赋予用户,从而实现权限管理。
用户可以通过勾选右侧的复选框为该角色赋予相应的功能。管理角色信息页面如图6-1所示。
图6-1角色管理图
企业的职务反应了一个公司的组织机构和管理方式,设置职务使系统更具有适应性和灵活性,用户根据实际情况维护自己企业的职务类型,职务管理如图6-2所示。
图6-2职务管理图
6.2 采购管理管理模块实现
采购管理首先包括最基本的信息维护。采购商品拥有编码、名称、规格、单位属性,为了库存管理,商品还具有库存上限与库存下限。用户可以查询、添加、删除和修改商品信息。商品管理如图6-3所示。
图6-3商品管理图
供应商拥有编码、名称、邮编、联系人等属性。用户可以查询、添加、删除和修改供应商信息。供应商管理如图6-4所示。
图6-4供应商管理图
选中某一行数据,然后点击修改按钮即可弹出修改供应商信息的对话框。修改供应商信息如图6-5所示。
图6-5修改供应商图
采购部门采购前需要先开采购单。采购编码由系统自动生成,编码方式根据时间生成,如果同一天开多个采购单,则采购编码字串的最后一个标识依次增长。录入时间由用户通过时间控件选择录入。选择供应商的时候点击右侧的查询按钮,系统会弹出对话框,该对话框列出所有供应商的信息。采购开单如图6-6所示。
图6-6采购开单图
其中采购编码由系统自动生成,供应商和原料都是通过点击查询按钮进行选择。让用户通过选择供应商可以方便用户进行录入数据同时可以保证用户录入数据的有效性,采购物品的录入同样也提供一个查询按钮,点击后弹出物品的列表对话框。供应商列表如图6-7所示。
图6-7供应商列表图
采购单开完之后需要上级领导批准采购单。只有采购单被批准以后才能进行后续操作。选中某一行记录,然后点击批准按钮,系统会弹出一个确认批准的对话框,点击确定,批准完成,被批准的记录会从此页面消失,通过下拉框选择已批准选项,可以查看所有被批准了的采购记录。批准后的采购单可以被执行,否则需要重新开单。采购批准如图6-8所示。
图6-8采购批准图
采购批准通过的记录会出现在执行窗口,内勤人员在采购完成后可以选中相应的记录进行操作。采购执行完成意味着采购部门的工作完成,接下来物品交给库存管理人员进行入库。采购执行如图6-9所示。
图6-9采购执行图
采购退货的流程跟上述采购环节类似。采购退货也是先要开采购退货单,在开采购退货单时,系统会自动生成采购退货编码,然后通过点击查询按钮选择相应的采购编码,之后系统会根据原采购自动填充一些采购信息,用户填写退货数量并注明退货原因。
6.3 库存管理模块实现
库存管理模块主要是协助采购、生产、销售等模块进行业务最终的入库操作。并负责各物品库存信息维护和仓库状态查询。库存管理模块交由库存管理人员进行使用,因为库存管理在业务流程中比较重要,而且通常是整个业务流的终点,所以库存管理模块经常需要与其他模块合作。采购入库如图6-10所示。
图6-10采购入库图
原料库存的设置需要记录设置人员。原料库存设置如图6-11所示。
图6-11原料库存设置图
选中某一条记录然后点击修改按钮,系统弹出修改界面,因为库存数据比较重要而且一般情况下由系统自行维护,比如采购入库完成的时候系统会将对应原料的库存数量增加入库的数量,出库时则减少库存数量,所以每次人为更改都会有记录。原料库存的修改界面如图6-12所示。
图6-12原料库存设置图
生产领料需要根据采购单进行领料,并且根据不同批次的原料价格核算出生产成本。领料和退料是相反的两个过程,生产领料完成并且确定退料的数量之后就可以计算出成本。领料管理如图6-13所示。
图6-13领料图
6.4 生产管理模块实现
生产流程有上级领导开生产计划单、生产部门进行执行并选取相应的配方,在领料成功之后进行生产,生产完成后提交入库申请。计划数量是上级领导在下发计划时制定的,这里从数据库中读取显示。生产配料如图6-14所示。
图6-14配料图
点击配方按钮后,显示配方列表,配方由系统的另一个模块进行维护设置,这里只显示配方的编码和名称,生产人员选择适当的配方进行生产领料,系统在领料时会根据配方计算出各种原料的数量,生产人员无法查看配方详情,这样也就保证了配方的保密性,配方的种类可以比较多,生产人员可以通过查询的功能迅速定位到需要的配方。配方列表如图6-15所示。
图6-15配方列表图
6.5 配方管理模块实现
主要用于维护配方的数据信息,包括配方编码、名称、相应的原料的数量和总计,配方一方面用于生产配料,另一方面结合采购记录核算出生产成本供用户参考。配方管理如图6-16所示。
图6-16配方管理图
6.6 本章小结
本章主要通过截图的方式展现了系统的主要功能架构,通过演示一个流程的步骤给用户简单讲解了系统的使用方法和效果。针对有特色的几个功能模块都进行了截图描述。
第7章 系统测试
7.1 系统测试的目的
软件测试是其生命周期的一部分,用来保证软件质量。一般来说,软件测试通常是在系统上线之前,通过进一步分析系统的需求,把系统的设计方案和实现进行最终测试和审查。测试的软件工程术语提出了在软件的解释:通过手动或着软件来运行一个软件系统,其目的是测试它是否在制定的需求范围内开发的或检验实际结果与目标的区别。
在G.J.Myers经典的《软件测试技术》,给出了测试的定义:测试程序和进程是一个程序错误发现的执行。测试的目的是在程序中发现的错误,测试初衷是要证明程序是错误的。在软件开发过程中测试是一个具有破坏性的系统开发阶段,最后审查的设计和编码在软件质量的保证中显得格外重要和必不可少。为了确保软件的质量,应该在软件的开发过程中,按照软件工程的结果形成的各个阶段,分别进行严格的阶段测试和模块测试。
7.2 功能测试
采购管理是系统的主要功能,其他业务流程基本类似于此类流程。采购流程主要是各个部门协调合作的结构,主要是基础信息设置、采购批准、采购入库三个流程。采购流程如图7-1所示。
图7-1采购流程图
系统自动生成采购编码,然后用户选择相应的入库商品、供应商、仓库与付款账户,系统填充金额的一些基本信息,然后由用户录入采购数量与单价,并且系统提供了计算总金额的功能。点击确定按钮后,采购开单完成,系统在数据显示区会立刻更新记录,最近一条采购记录显示出来。采购开单如图7-2所示。
图7-2采购开单图
采购开单提交后,上级领导在登录系统后可以查询所有待批准的采购单。查询记录如图7-3所示。
图7-3查询结果图
选择某一条记录后点击批准,然后确认批准,则该记录被批准。被批准的采购单会从当前页消失,通过选择下拉框的属性,可以在批准的记录中查看到。如果不批准,则记录会出现在不批准的选择界面里。用户可以选择某一条记录后点击备注按钮,用户可以再弹出的对话框中填写备注信息。采购批准如图7-4所示。
图7-4采购批准图
被批准的采购单会将商品库存信息进行修改。采购执行的时候可以查看上级领导审批时候添加的备注,通过备注信息,采购执行人员能够有效、及时地按照上级领导的意思进行采购,这样一来库存管理人员也能够了解这批物品入库时应该注意的事项。采购执行完成后,商品会交给库管人员,库管人员清点好数量执行填写入库的有关信息如时间、数量、仓库、入库备注。采购入库如图7-5所示。
图7-5采购入库图
7.3 本章小结
本章主要描述了本套系统的测试方案,通过功能测试,我们对系统的稳定性和功能有了深入的理解和漏洞发现,这是最直观有效的测试。通过测试有助于系统的进一步开发和发现问题。
第8章 结论与展望
8.1 结论
本系统服务的对象是鲜花销售店铺,主要包含的模块有系统管理、基础资料、业务管理和查询中心。采购、销售两大流程贯穿各个模块,并且经过缜密的设计后符合企业的实际业务流程。在系统的过程中我学到了并使用到了很多技术,包括WinForm、SQLServer、C#,最重要的是学习能力得到了很大提高。
从系统功能来讲,基于WinForm的花店进销存管理系统的功能达到了预期的效果,程序界面设计的水平也得到了很大提高。
8.2 展望
虽然目前花店进销存管理系统已经能正常使用,但是因为个人的能力以及开发周期等原因仍然存在许多不完善的地方,系统有待于进一步改正。目前正朝着几个方向努力。
(1) 销售数据分析:通过数据挖掘技术,对销售数据进行深度分析,生成动态报表,帮助管理者了解畅销产品、淡旺季和客户偏好等信息。
(2) 移动端支持:开发移动端应用或小程序,方便管理者随时随地查看库存、处理订单和分析数据。
(3) 自动提醒与预警:实现库存预警功能,当某种鲜花库存低于阈值时,自动提示补货需求;对于临近保质期的鲜花,也可以提供处理建议。
(4) 引入智能化的思想,利用人工智能预测鲜花的销售趋势、最佳补货时间和最优库存量,减少库存积压和鲜花浪费。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)