课程设计报告指导教师:孙暘姓名:黄志浩学院:计算机科学与工程学院班级:150407需求分析仓库管理系统应完成以下功能:(1)基础数据设定主要包括仓库类型定义、仓库定义、仓库产品低储、高储、存储限量及存储期限、货位定义、货位存储能力、定义成本统计参数(包括总体系数、每种产品成本系数)、预警机制时间系数定义。(2)仓库入库包括原材料入库和成品入库1.原材料入库:一种是本地的采购:首先由采购处编写请检单,经过质检部门质检合格后(质检部门记录质检结果,合格数、不合格数),仓库保管员将质检合格的原料入库(记录采购部门定义的当时单价)。系统自动产生入库单号(相当于入库批次号形式为年月日)。此时为仓库的假入库状态。办理入库后,由仓库管理员对入库单明细确认是否真入库。入库需要记录项目有:仓库、仓库货位、库管员、图号、型号、颜色、数量。若质检不合格,则对不合格原料进行挑选,把合格原料入库。另一种是外地的采购:首先由库管员办理入库(放入待检区)。向采购部门和质检部门发消息。经过质检部门质检合格后方可入库(入库的操作同上)。不合格原料由仓库管理员办理手续进入相应的仓库,入库时应分货位存储(相应的仓库:如待检区的不合格区),系统自动产生入库单号(相当于批次号)。2.成品入库:由生产车间经过质检部门质检合格后,由生产车间填写成品入库单提交到仓库管理员,不合格的入到待处理库房。(3)仓库出库包括原材料出库、销售出库1.原材料出库:由生产车间填写领料单(标注班组),仓库管理员办理出库确认约束条件:按照批次号先进先出的原则。车间填写领料单时可以是成品。提交仓库时,由仓库通过质部门提供的物资配料清单分解需要的零部件数量,根据现库存办理出库确认。2.销售出库:销售出库由生产部门填写的销售出库单,办理出库。销售退库经质检部门合格后的成品入到成品库。(4)仓库退库包括原材料退库、成品退库、销售退库1.原材料退库:生产车间将零部件或成品退回仓库。首先有生产车间填写退库单(相当于出库为负),由质检部门确认后方可由仓库确认。生产车间退库时,需要知道哪个批次的货物。2.成品退库:成品退库,首先由质检部门同意将产品从生产车间退回库中。由车间填写退库单。经过仓库管理员确定后办理退库。3.销售退库:由厂商将产品退回仓库,首先由质检部门质检,质检合格由仓库管理员办理退库单。不合格的存放待处理成品区中。(5)仓库库存查询:根据仓库一段时间内发生的入、出、退汇总数量、金额。(6)统计分析:查询仓库产品数量分布情况。(7)自动提醒预警信息:根据产品入出退库时间和系统参数定义,统计仓库目前的超量及库存已低于低储,存储期限超出查询。(8)仓库台帐:及时反映仓库产品的入、出、退明细帐。(9)仓库存储成本统计:根据产品成本系数和存储时间计算存储成本公式:产品在仓库存储时间差*数量*单价*相应的总体系数*该产品自定义系数计算仓库存储成本概要设计源程序有7个文件:main.cpp程序入口,显示主菜单并跳转到工具类相应成员函数部分。tools.cpptools.hpp工具类,程序由main.cpp跳转到工具类,有工具类具体跳转到相应部分。product.cppproduct.hpp产品类,主要负责保存产品信息,即对象模型,同时还负责将对象保存的数据写入文件,或将文件中的数据经过链表类保存到对象中。该文件中还有一个日志类WareLogs,继承自product,负责每次入、出、退库时需要记录的信息,如日期、产品型号、数量,还负责将对象保存的数据写入另外的日志文件,或将日志文件中的数据读取到对象中。同时日志类对象还有另外一个功能:将基础数据设定的数据写入单独的文件中。linkList.cpplinkList.hpp链表类,保存的是节点类对象,节点类对象的数据域为产品类对象。链表类的主要功能是将某文件中所有数据读取为链表,或在链表对象中搜索出某产品并对该产品进行相应更改之后再次将链表对象的数据域写入文件。用来保存数据的文件有6个:conststringnoQuilityProdCFileName=noQuilityProdCFile.txt;//成品不合格文件名conststringQuilityProdCFileName=QuilityProdCFile.txt;//成品合格文件名conststringnoQuilityProdYFileName=noQuilityProdYFile.txt;//原材料不合格文件名conststringQuilityProdYFileName=QuilityProdYFile.txt;//原材料合格文件名conststringLogsToTheFile=logsFile.txt;//基础信息设定配置文件conststringProductLogFileName=productLog.txt;//保存入出退日志信息详细设计产品类数据成员部分:货物型号/货物数量/货位号/单价/该产品的自定义成本系数/颜色/库管员/仓库名称/入出退库时间戳成员方法:intsetInWareList();//填写入库单,将数据保存在对象模型中voidsetSaleWareList();//填写销售出库单,将数据保存在对象模型中voidsetReceiveList();//填写领料单,将数据保存在对象模型中voidsetOutWareList();//填写退库单,将数据保存在对象模型中intinToFile(stringfileName);//根据入库单确认入库voidsetProdModel();//填写产品型号供查询使用intgetDayByChrono();//计算时间戳时间戳的计算通过库函数来实现,需要包含头文件chrono和ratio,每入出退库是都需要调用该函数记录时间日期,供查询使用。intproduct::getDayByChrono(){usingnamespacestd::chrono;typedefdurationint,std::ratio60*60*24days_type;time_pointsystem_clock,days_typetoday=time_point_castdays_type(system_clock::now());returntoday.time_since_epoch().count();}链表类:将链表的头节点放在链表类中,节点类对象中含有数据域和指向下一个节点的指针域。链表类的成员方法负责将链表的节点存储的产品类对象数据写入文件或将文件中的数据提取为链表。链表类的成员方法//提取数据为链表voidgetlinkListFromTheFile(stringfileName);//遍历链表找到节点voidforInLinkListForInAndOut(product*prod,stringtype);//根据产品型号搜索出仓库名称/产品分布型号voidforInLinkListForLocation(product*prod,stringtype);//根据基本数据设定信息查询高储低储以及超出存储期限的产品voidforInLinkListForRemind(WareLogs*logs,stringtype);//根据产品对象的型号和该产品成本系数以及日志文件中的基本数据设定信息计算该产品的存储成本voidforInLinkListForCost(product*prod,WareLogs*logs,stringtype);//将链表数据重新写入文件voidwriteNodeToTheFile(stringfileName);调试分析遇到过的问题:1.计算仓库存储成本和预警存储期限时,需要知道产品入出退库的时间,这里采用库函数实现,可以获取当前的时间戳,产品每次入出退库时都需要将这个时间戳保存。用途如:通过当前的时间戳减去产品入库的时间戳就是产品在仓库的保存时间。2.至于文件数据提取及修改,是通过链表实现的。对于链表的处理,C++和C是有些不同的,在C++里,可以把节点类和链表类分别声明,将头节点作为链表类对象的成员属性,而每个节点的数据域保存了产品类对象,指针域指向下一个节点。3.入库退库功能之外的查询工作,需要产品入出退库时间、基础数据设定等信息,这些信息保存在产品对象中不合适,而且这样使得产品对象过于庞大,但是又和产品对象的数据有密切关系,所以这里采用继承的方式,日志类继承产品类,需要完成的功能是将基础数据设定的数据和产品每次入出退库的时间写入文件。写入的时间需要和对应产品进行联系,所以需要获取对应产品的型号、数量、单价来计算总金额。4.C++当自定义的头文件过多时,会有文件重复包含,即文件重复编译的情况出现。这里采用宏的方式处理:#ifndefidentifier#defineidentifier#endif5.入库时需要判断入库产品数量是否大于自定义的货位存储能力,同样出库时需要判断出库产品的数量是否大于仓库存储产品数量。为此在入库或出库时通过链表类对象提取文件中保存的对应型号产品的数量与将要入库或出库的产品数量做比较,不符合就要终止入库或退库。用户使用说明1.第一次使用时需要到基础数据设定模块中设定数据,这些数据在以后入出退库时都会默认调用。2.入库时填写的入库单中产品的成本系数不能大于基本数据设定中自定义的总体成本系数。3.当天入库的产品暂时不计存储成本(该产品存储天数为0)。4.牢记产品型号,仓库的查询功能除了“仓库库存分析查询”是通过时间段查询数据,其余都是通过产品型号来查询。测试结果1.基础数据设定测试2.入库测试错误处理3.出库测试错误处理4.退库测试5.仓库库存查询测试6.统计分析测试7.提醒预警信息测试8.仓库台账测试错误处理9.产品存储成本查询当天入库的产品由于存储天数为0,无法计算存储成本。为了测试改功能,将文件中该产品的入库时间戳由16996修改为16990后(入库时间修改为前六天),测试结果如下附录////main.cpp//仓库管理系统////Createdbyxiaokaon16/7/4.//Copyright©2016年黄志浩.Allrightsreserved.//#includetools.hpp#includeiostreamusingnamespacestd;voidprintToScreen(){coutendlendl;cout---------------仓库管理系统---------------endl--1-基础数据设定endl--2-仓库入库endl--3-仓库出库endl--4-仓库退库endl--5-仓库库存查询endl--6-统计分析endl--7-提醒预警信息endl--8-仓库台帐endl--9-产品存储成本查询endl--0-退出系统endl;coutendlendl;}intmain(intargc,constchar*argv[]){printToScreen();intmenu=0;while(1){cinmenu;tools*t=newtools();switch(menu){case1://基本数据设定t-baseSetting(LogsToTheFile);break;case2://仓库入库t-addProduct();break;case3://仓库出库t-outProduct();break;case4://仓库退库t-againProduct();break;case5://仓库库存查询t-wareStockAsk();break;case6://统计分析t-allAnalyse();break;case7://提醒预警t-remindWarning();break;case8://仓库台账t-wareAccount();break;case9://仓库存储成本查询t-productForCos