还剩36页未读,继续阅读
本资源只提供10页预览,全部文档请下载后查看!喜欢就下载吧,查找使用更方便
文本内容:
课程设计报告指导教师孙踢姓名黄志浩学院计算机科学与工程学班级150407仓库管理系蜕1-基础数据设定-2-仓库入库-3-仓库出库4-仓库退库5-仓库库存查询6-统计分析7-提醒预警信息8-仓库台怅9-产品存储成本查询—0-退出系统41-原材料退库2-成品退库3-销售退库1质检部门确认合格?y填写退库单输入货物型号19t5输入货物数量3填写退库原因(不多于15字)bad-1UAA一一一一_一一~一一一一~仓库管理系坡一一一一一一一一一一_一一1-基础数据设定-2-仓库入库3-仓库出库-4-仓库退库5-仓库库存查询-6-统计分析7-提醒预警信息―一8-仓库台[长-9-产品存储成本查询0-退出系统5功能描述根据输入的段时间亘询仓府发生的入出渥总数,/金颗输入要查询的时间段(单位天)3以下是该时间段内仓用的入库信息产品型号入库的数是总金4r553072019t5301350以下是该时间段内仓岸的出摩信息产品型号出库的数量总金IK4r5510240以下是该时间段内仓府的退库信息产品型号退库的数S总金融19t5331485已返回主菜单一一™————一__一一仓库管理系筑—一™—一1-基础数据设定2-仓库入库3-仓库出库4-仓库退库5-仓库库存查询6-统计分析7-提醒预警信息8-仓摩台怅9-产品存储成本查询--退出系统6功能描述由产品型号搜索出产品分布情况(仓序名称/货位)包括成品仓座和原材料仓专输入待查询产品型号4r55成品仓库查询结果如下产品型号所在仓库所在仓库货位存储数量4r55xkck410原材料仓库查询结果如下没有在原材料仓库中找到该型号产品已返回主菜单仓库管理系统1-基础数据设定-2一仓库入库-3-仓库出库-4-仓库退库-5-仓库库存查询一6一统计分析-7-提醒预警信息8-仓库台怅-9-产品存储成本查询0-退出系统7功能描述根据基本数据设定输出仓青高储/低储/存储期限成品仓库没有达到存储期限的货物成品仓库库存已低于低储目前仓库储货■为1原材料仓库没有达到存储期限的货物原材料仓声库存已低于低储目前仓库储货■为33已返回主菜单一一一一一一一-^~_一一一一一仓座管理系蜕一一一一一一一一一一一一-1-基础数据设定2-仓库入库3-仓库出库--4-仓库退库~5-仓库库存查询~6-统计分析7-提醒预警信息8-仓库台怅9-产品存储成本电询0-退出系统错误处理一一一一-一—一—-一一仓库管理系垸—一—-————-一一1-基础效据设定-2-仓库入库-3-仓库出库-4-仓库退库-5-仓库库存查询-6-统计分析-7-提醒预警信息-8-仓库台怅-9-产品存储成本查询-0-退出系统8功能描述根据产品型号输出仓库产品的入、出、返明她昨输入待查询产品型号345没有在成品仓库中找到该产品,正在原材料仓库中搜索没有在原材料仓库中搜索到该产品已返回主菜单1-基础数据设定2-仓库入库3-仓库出库4-仓库退库5-仓库库存查询6-统计分析7-提程预警信息8-仓库台怅9-产品存储成本查询0-退出系统9功能说明根据产品里号计算该产品存储成本输入待电询产品型号4r55以下是该产品在成品仓库的搜索结果该货物今天入店,数时不计存储成本以下是该产品在原材料仓库的搜索结果没有在原材料仓库中找到4r55已返回主菜单由16996修改为16990后(入库时间修改为前六天),测试结果如下仓库管理系统-1-基础数据设定2-仓库入库-3-仓库出库4-仓库退库-5-仓库库存直询-6-统计分析-7-提醒预警信息-8-仓库台怅-9-产品存储成本直询—0-退出系统9功能说明根据产品里号计算该产品存储成本输入待查询产品型号4r55以下是该产品在成品仓库的搜索结果4r55的存储成本为720以下是该产品在原材料仓库的搜索结果没有在原材料仓库中找到4r55已返回主菜单附录////main.cpp〃仓库管理系统////Createdbyxiaokaon16/7/
4.//Copyright©2016年黄志浩.Allrightsreserved.//#includetools.hppr#includeiostreamusingnamespacestd;voidprintToScreenQ{cout«endl«endl;cout«n仓库管理系统n«endl«n-1-基础数据设定wendl«-2-仓库入库“vvendl«n-3■仓库出库“wendl«n-4-仓库退库vvendl«l-5-仓库库存查询“wendl«r-6-统计分析vvendl«n-
7.提醒预警信息“vvendl«-8•仓库台帐“wendl«n-9-产品存储成本查询“vvendl«-0-退出系统vvendl;cout«endl«endl;}intmainfintargcconstchar*argv[]]{printToScreenQ;intmenu=0;while⑴{cin»menu;tools*t=newtoolsQ;switchmenu{〃基本数据设定t-baseSettingLogsToTheFile;break;〃仓库入库t-addProductQ;break;〃仓库出库t-outProductQ;break;〃仓库退库t-againProductO;break;〃仓库库存查询t-wareStockAskQ;break;〃统计分析t-allAnalyseQ;break;〃提醒预警t-remindWarningO;break;〃仓库台账t-wareAccountQ;break;〃仓库存储成本查询t-productForCostQ;break;case0:deletet;exit0;break;default:coutvv”请正确输入菜单对应序号vvendl;break;deletet;coutvv”已返回主菜单vvendl;printToScreenQ;return0;////tools.hpp//仓库管理系统////Createdbyxiaokaon16/7/
4.//Copyright©2016年黄志浩.Allrightsreserved.//#includefstream#includestringusingnamespacestd;classlinkList;classproduct;classWareLogs;conststringnoQuilityProdCFileName=noQuilityProdCFile.txt;conststringQuilityProdCFileName=nQuilityProdCFile.txtH;conststringnoQuilityProdYFileName=noQuilityProdYFile.txtn;conststringQuilityProdYFileName=nQuilityProdYFile.txt;conststringLogsToTheFile=nlogsFile.txtn;conststringProductLogFileName=productLog.txt1;classtools{public:〃设置基本信息voidbaseSettingfstringfileName;〃质检部门检验合格stringisQuilifiedQ;〃填写入库单确认入库voidaddProdToFilestringfileOKNamestringfileNOName;〃仓库入库入口函数voidaddProductQ;〃填写领料单/销售出库单voidoutProdFromFilefproduct*prodListstringfileNamestringtype;〃仓库出库入口函数voidoutProductQ;〃将退库的货物按合格与否分类voidOKOrNofstringfileOKNamestringfileNoOKName;〃退库入口函数voidagainProductQ;〃仓库库存查询入口voidwareStockAskQ;〃统计分析入口voidallAnalyseQ;〃提醒预警voidremindWarningO;〃仓库台账voidwareAccountQ;〃产品存储成本查询voidproductForCostQ;};////tools.cpp//仓库管理系统////Createdbyxiaokaon16/7/
4.//Copyright©2016年黄志浩.Allrightsreserved.//#includetools.hpp#includenlinkList.hppH#includeHproduct.hppH/**仓库基础信息设定将设定的信息写入文件7voidtools::baseSettingstringfileName]{doublemaxStockminStockmaxAbilitymaxDatecostFactor;coutv“输入仓库高存储量”;cinmaxStock;COUtVV”输入仓库低存储量”;cin»minStock;coutv”输入货位存储能力”;cin»maxAbility;COUtVV”输入仓库最大存储期限”;cin»maxDate;coutv”输入仓库存储总体成本系数”;cincostFactor;fstreamfoutfileNamejos::out;if!fout{coutvv”打开“vvfileNamevv失败vvendl;return;fout«maxStockH\n«minStock«\n«maxAbility«\nH«maxDate«n\n«costFactor«H\nn;fout.closeQ;质检部门确认合格与否*@return”y/Y合格n/N不合格”/stringtools::isQuilifiedQ{stringis;while1{coutv”质检部门确认合格吗cin»is;ifis==y||is==nYn{returny;}elseifis==nH||is==HN{returnn;}coutvv”合格输入y/YH«endlvv”不合格输入n/Nn«endl;填写入库单将入库单数据产品详尽信息写入文件*@paramfileOKName原材料/成品合格库区@paramfileNOName原材料/成品不合格库区/voidtools::addProdToFilestringfileOKNamestringfiIeNOName{stringis=isQuilifiedQ;ifis={product*q=newproductQ;intiss=q-setInWareListQ;〃填写入库单ifiss==2{return;q-inToFilefileOKName;〃根据入库单确认入库WareLogs*log=newWareLogsQ;log-wirteChangeToTheFileq.ProductLogFileNameH1H;deleteq;}elseifis==n{product*q=newproductQ;intiss=q-setInWareList;〃填写入库单ifiss==2]{return;q-inToFilefileNOName;〃根据入库单放到不合格成品仓库WareLogs*log=newWareLogsQ;log-wirteChangeToTheFileqProductLogFileName1;deleteq;仓库入库入口函数/voidtools::addProductQ{stringt;while1{coutvvl■成品入库”vvendlvv”
2.原材料入库”vvendl;cin»t;ift==nl{addProdToFileQuilityProdCFileNamenoQuilityProdCFileName;break;}elseift==2n{addProdToFile[QuilityProdYFileNamenoQuilityProdYFileName;break;coutvv”请输入正确序号vvendl;/**提取文件中数据为链表根据出库单或领料单修改链表数据并将数据重新写入文件*@paramprodList出库单或领料单数据@paramfileName文件名@paramtype2二出库3二原材料退库/成品退库7voidtools::outProdFromFileproduct*prodListstringfileNamestringtype{linkList*link=newlinkListQ;link-getlinkListFromTheFilefileName];iflink-head-next==NULL{coutvv”提取数据失败“vvendl;return;link^forlnLinkListForlnAndOutCprodListtype];〃遍历链表对链表相应节点进行修改link-writeNodeToTheFilefileName];〃将链表数据写入文件deletelink;return;*仓库出库入口函数7voidtools::outProductQ{stringis;while1{coutvv”l-原材料出库vvendlvv”2-销售出库”vvendl;cin»is;ifis==T{product*p=newproductQ;p-setReceiveListQ;outProdFromFilefpQuilityProdYFileName/2J;需求分析仓库管理系统应完成以下功能
(1)基础数据设定主要包括仓库类型定义、仓库定义、仓库产品低储、高储、存储限量及存储期限、货位定义、货位存储能力、定义成本统计参数(包括总体系数、每种产品成本系数)、预警机制时间系数定义
(2)仓库入库包括原材料入库和成品入库.原材料入库一种是本地的采购首先由采购处编写请检单,经过质检部门质检合格后(质检部门记录质检结果,合格数、不合格数),仓库保管员将质检合格的原料入库(记录采购部门定义的当时单价)系统自动产生入库单号(相当于入库批次号形式为年月日)此时为仓库的假入库状态办理入库后,由仓库管理员对入库单明细确认是否真入库入库需要记录项目有仓库、仓库货位、库管员、图号、型号、颜色、数量若质检不合格,则对不合格原料进行挑选,把合格原料入库另一种是外地的采购首先由库管员办理入库(放入待检区)向采购部门和质检部门发消息经过质检部门质检合格后方可入库(入库的操作同上)不合格原料由仓库管理员办理手续进入相应的仓库,入库时应分货位存储•(相应的仓库如待检区的不合格区),系统自动产生入库单号(相当于批次号)o.成品入库由生产车间经过质检部门质检合格后,由生产车间填写成品入库单提交到仓库管理员,不合格的入到待处理库房
(3)仓库出库包括原材料出库、销售出库
1.原材料出库由生产车间填写领料单(标注班组),仓库管理员办理出库确认约束条件按照批次号先进先出的原则车间填写领料单时可以是成品提交仓库时,由仓库通过质部门提供的物资配料清单分解需要的零部件数量,根据现库存办理出库确认2•销售出库销售出库由生产部门填写的销售出库单,办理出库销售退库经质检部门合格后的成品入到成品库
(4)仓库退库包括原材料退库、成品退库、销售退库
1.原材料退库生产车间将零部件或成品退回仓库首先有生产车间填写退库单(相当于出库为负),由质检部门确认后方可由仓库确认生产车间退库时,需要知道哪个批次的货物2•成品退库成品退库,首先由质检部门同意将产品从生产车间退回库中由车间填写退库单经过仓库管理员确定后办理退库
3.销售退库由厂商将产品退回仓库,首先由质检部门质检,质检合格由仓库管理员办理退库单不合格的存放待处理成品区中
(5)仓库库存查询根据仓库一段时间内发生的入、出、退汇总数量、金额
(6)统计分析查询仓库产品数量分布情况
(7)自动提醒预警信息根据产品入出退库时间和系统参数定义,统计仓库目前的超量及库存已低于低储,存储期限超出查询
(8)仓库台帐及时反映仓库产品的入、出、退明细帐(9]仓库存储成本统计根据产品成本系数和存储时间计算存储成本公式产品在仓库存储时间差*数量*单价*相应的总体系数*该产品自定义系数计算仓库存储成本break;}elseifis==2{product*p=newproductQ;p-setSaleWareList;outProdFromFilefpQuilityProdCFileName/2H;break;coutvv输入正确序号vvendl;将退库的货物按合格与否分类*@paramfileOKName合格产品存放文件名@paramfileNoOKName不合格产品存放文件名7voidtools::OKOrNostringfileOKNamestringfileNoOKName{stringisOK;isOK=isQuilifiedQ;product*p=newproductQ;ifisOK==nyn{p-setOutWareList;〃填写退库单outProdFromFilefpfileOKName/^];〃提取文件中数据为链表根据出库单或领料单修改链表数据并将数据重新写入文件}else{coutvv填写入库单存入原材料仓库不合格区vvendl;p-setInWareListQ;〃填写入库单p-inToFile[fileNoOKName;退库入口函数/voidtools::againProductO{stringisisOKfileName;while1{0戊”1-原材料退库”61111v”2•成品退库vvendlv“3-销售退库”vvendl;cin»is;ifis==U{〃原材料退库需要知道哪个批次的货物OKOrNofQuilityProdYFileNamenoQuilityProdYFileName;}elseifis==H2H{〃成品退库需要输入仓库名称、图号、型号、数量、车间、发生日期、仓库管理员、原因OKOrNofQuilityProdCFileNamenoQuilityProdCFileName];}elseif[is==n3n{〃销售退库OKOrNo[QuilityProdCFileName/noQuilityProdCFileName;}else{COUtVV”请输入正确序号”;break;仓库库存分析查询入口/voidtools::wareStockAskQ{intday;coutvv”功能描述:根据输入的段时间查询仓库发生的入出退总数量/金额”vven祖vvendl;coutv”输入要查询的时间段单位:天广;cin»day;WareLogs*log=newWareLogsQ;log-readDateFromFiledayProductLogFileName1;deletelog;log=newWareLogsQ;log-readDateFromFiledayProductLogFileName2;deletelog;log=newWareLogsQ;log-readDateFromFiledayProductLogFileName3];deletelog;统计分析入口由产品型号搜索出产品分布情况(仓库名称/货位)包括成品仓库和原材料仓库voidtools::allAnalyseO{COUtVV”功能描述油产品型号搜索出产品分布情况仓库名称/货位包括成品仓库和原材料仓库vvendlvvendl;linkList*link=newlinkListQ;product*prod=newproductQ;prod-setProdModel;link-getlinkListFromTheFileQuilityProdCFileName];〃将文件中的数据提取为链表link-forInLinkListForLocationprod/4n];〃查询成品仓库deletelink;link=newlinkListQ;link-getlinkListFromTheFile[QuilityProdYFileName];〃将文件中的数据提取为链表link・forInLinkListForLocationprodJ5;deleteprod;提醒预警信息入口根据基本数据设定输出仓库高储/低储/存储期限voidtools::remindWarningOcoutvv”功能描述:根据泉本数据设定输出仓库高储/低储/存储期限vvendkvendl;WareLogs*w=newWareLogsQ;intisOK=w-readBaseSettingFromTheFileLogsToTheFile;ifisOK=2{return;linkList*link=newlinkListQ;link-getlinkListFromTheFileQuilityProdCFileName;link-forInLinkListForRemindw/14n;deletelink;link=newlinkListQ;link-getlinkListFromTheFile[QuilityProdYFileName;link-forInLinkListForRemind[wn5n;deletelink;}仓库台账入口/voidtools::wareAccount]{coutvv”功能描述:根静产品型号输出仓库产品的入、出、退明细帐vvendlvvendl;stringmodel=COUtVV”输入待查询产品型号”;cinmodel;WareLogs*w=newWareLogsQ;w^readFromFileToScreenfProductLogFileNamemodel1;//I入库2出库需要填写原因deletew;w=newWareLogsQ;w-readFromFileToScreenProductLogFileNamemodel2;deletew;w=newWareLogsQ;w-readFromFileToScreenProductLogFileNamemodel3;deletew;产品存储成本查询/voidtools::productForCostQ{coutvv”功能说明:根据产品型号计算该产品存储成本vvendlvvendl;product*p=newproductQ;WareLogs*logs=newWareLogsQ;logs-readBaseSettingFromTheFileLogsToTheFile;p-setProdModelQ;linkList*link=newlinkListQ;link-getlinkListFromTheFile[QuilityProdCFileName;link-forInLinkListForCost[plogs/4n;deletelink;link=newlinkListQ;link-getlinkListFromTheFileQuilityProdYFileName;link-forInLinkListForCostplogs/5”;deletelink;deletep;deletelogs;////product.hpp//仓库管理系统////Createdbyxiaokaon16/7/
4.//Copyright©2016年黄志浩.Allrightsreserved.//#ifndefproduct.hpp#defineproduct.hppstringreason;voidinitSomeValueWithProd[product*prod];public:WareLogsQ;friendclasslinkList;friendclassproduct;〃从文件中读取基本数据设定intreadBaseSettingFromTheFilefstringfileName];〃入出退库前调用将数据保存到对象模型中并在该方法中将数据写入文件注意该方法要在prod的时间戳设置完毕后调用voidwirteChangeToTheFilefproduct*prodstringfileName^stringtype];〃仓库台账根据产品型号输出入出退明细账使用之前可以不用对数据成员设置voidreadFromFileToScreenfstringfileNamestringmodetintinOutAgainType];〃输出段时间内仓库发生的入出退明细账voidreadDateFromFilefintdaystringfileNamejntinOutAgainType;};////product.cpp//仓库管理系统////Createdbyxiaokaon16/7/
4.//Copyright©2016年黄志浩.Allrightsreserved.//#includeproduct.hpp1#includechrono#includeratio#includecstdlibproduct::productQ{prodModel=prodNum=
0.00;location=price=
0.00;costNum=
0.00;prodColor=peopleName=wareName=intoWareDay=0;outFromWareDay=0;againToWareDay=0;/****/product::productconstproduct*p{prodModel=p-prodModel;prodNum=p-prodNum;location=p-location;price=p-price;costNum=p-costNum;prodColor=p-prodColor;peopleName=p-peopleName;wareName=p-wareName;intoWareDay=p-intoWareDay;outFromWareDay=p-outFromWareDay;againToWareDay=p-againToWareDay;}doubleproduct::getProdNumQ{returnprodNum;doubleproduct::getProdPriceQ{returnprice;}stringproduct::getProdModelOreturnprodModel;intproduct::setInWareListQ{coutn填写入库单n«endl;COUtVV”输入货物型号”;cin»prodModel;COUtVV”输入存储数量”;cin»prodNum;prodNum=doubleprodNum;〃存储数量不能大于货位的存储能力WareLogs*log=newWareLogsQ;log-readBaseSettingFromTheFileHlogsFile.txtH;iflog-maxAbilityprodNum{coutvv”该产品在货位“vvlocationvv”的数量超过您设置的货位存储能力«log-maxAbility«endl;coutvv”文件写入失败vvendl;deletelog;return2;COUtVV”输入货位序列号”;cin»location;COUtVV”输入产品单价”;cin»price;price=doublefprice;COUtVV”输入成本系数”;cin»costNum;〃成本系数不能大于基本数据设定中的总体成本系数ifcostNumlog-costFactor{coutv”该产品成本系数不能大于您在基础数据设定中设置的总体成本系数H«log-costFactor«endl;deletelog;return2;costNum=doublecostNum;COUtVV”输入货物颜色”;cinprodColor;COUtVV”输入库管员姓名”;cin»peopleName;COUtVV”输入仓库名称”;cin»wareName;intoWareDay=getDayByChronoQ;deletelog;return0;}voidproduct::printQ{coutvv”输入货物型号”;cin»prodModel;COUtVV”输入货物数量”;cinprodNum;填写产品型号供查询使用*/voidproduct::setProdModel]{COUtVV”输入待查询产品型号cin»prodModel;/****/voidproduct::setSaleWareListQ{print;againToWareDay=getDayByChronoQ;确认入库将对象所有属性写入文件*@paramfileName文件名/intproduct::inToFilestringfileName{fstreamfoutfileNamejos::app|ios::out];if!fout{coutvv打开vvfileNamevv失败vvendl;return2;fout«prodModel«\n«prodNum«n\nn«location«H\n«price«\nH«costNum«\nprodColor«\nn«peopleName«n\n«wareName\n«intoWareDay«n\nnoutFromWareDay«n\nH«againToWareDay«H\nn;coutvv文件写入完毕vvendl;fout.closeQ;return0;计算调用该函数时的时间戳@return返回整形数单位:天intproduct::getDayByChronoQ{usingnamespacestd::chrono;typedefdurationintstd::ratio60*60*24»days_type;time_pointsystem_clockdays_typetoday=time_point_castdays_typesystem_clock::nowQ;returntoday.time_since_epochQ.countO;WareLogs::WareLogsQ{maxStock=minStock=maxAbility=maxDate=costFactor=0;type=n0;changeModel=changeNum=0;changeToatolMoney=0;reason=nohave;intoWareDay=0;outFromWareDay=0;againToWareDay=0;〃从文件中读取基本数据设定intWareLogs::readBaseSettingFromTheFile[stringfileName{fstreamfinfileNameios::beg|ios::in];if!fin{coutvv”打开“vvfileNamevv”失败,请确认已在主菜单完成基础数据设定vvendl;return2;fin»maxStock»minStockmaxAbilitymaxDate»costFactor;ifmaxStock==0minStock==0{〃说明没有设置基本数据coutvv”请首先返回主菜单设宣菱础信息”vvendl;return2;fin.closeQ;return0;〃根据prod初始化自己的changeModelchangeNumchangeToatolMoneyvoidWareLogs::initSomeValueWithProd[product*prod{changeModel=prod-getProdModelQ;changeNum=prod-getProdNumQ;changeToatolMoney=prod-getProdNumQ*prod-getProdPriceO;intoWareDay=prod-intoWareDay;outFromWareDay=prod-outFromWareDay;againToWareDay=prod-againToWareDay;〃入出退库前调用的方法记录仓库的变化的货物型号/数量/金额//I入库2出库3表示退库需要填写原因voidWareLogs::wirteChangeToTheFileproduct*prodstringfileNamestringtype]{initSomeValueWithProdprod;iftype==n3n]{coutvv填写退库原因不多于15字vvendl;cin»reason;fstreamfoutfileNamejos::app|ios::out];if!fout{coutvv”打开文件vvfileNamevv失败vvendl;fout«type«\nH«changeModel«\nu«changeNum«H\nn«changeToatolMoney«u\nH«intoWareDay«n\nH«outFromWareDay«H\nH«againToWareDay«\n«reason«n\nn;fout.closeQ;}因为不需要在日志文件中修改数据,为简便起见没有做链表直接将文件中数据提取输出*@paramfileName文件名@parammodel产品型号7voidWareLogs::readFromFileToScreenstringfileNamestringmodeljntinOutAgainType{fstreamfinfileNameios::beg|ios::in;if!fin{coutvv”打开文件“vvfileNamevv失败vvendl;return;}stringtemp=nisHave=No;intt=0;whileIfin.eofQ{fin»temp;iftemp==H|||temp==J{break;type=temp;fin»changeModel»changeNum»changeToatolMoney»intoWareDay»outFromWareDay»againToWareDay»reason;t=atoitype.c_strQ;ifchangeModel==modelt==inOutAgainType{ifisHave二二No{isHave=Yes;switchinOutAgainType{cout«n以下是入库信息”vvendl;coutvv”产品型号“vv”入库的数量总金额n«endl;概要设计源程序有7个文件main.cpp程序入口,显示主菜单并跳转到工具类相应成员函数部分tools.cpptools.hpp工具类,程序由main.cpp跳转到工具类,有工具类具体跳转到相应部分product.cppproduct.hpp产品类,主要负责保存产品信息,即对象模型,同时还负责将对象保存的数据写入文件,或将文件中的数据经过链表类保存到对象中该文件中还有一个日志类WareLogs继承自product负责每次入、出、退库时需要记录的信息,如日期、产品型号、数量,还负责将对象保存的数据写入另外的日志文件,或将日志文件中的数据读取到对象中同时日志类对象还有另外一个功能将基础数据设定的数据写入单独的文件中linkListcpplinkListhpp链表类,保存的是节点类对象,节点类对象的数据域为产品类对象链表类的主要功能是将某文件中所有数据读取为链表,或在链表对象中搜索出某产品并对该产品进行相应更改之后再次将链表对象的数据域写入文件用来保存数据的文件有6个conststringnoQuilityProdCFileName=noQuilityProdCFile.txt;conststringQuilityProdCFileName=nQuilityProdCFile.txtn;conststringnoQuilityProdYFileName=HnoQuilityProdYFile.txt;conststringQuilityProdYFileName=QuilityProdYFile.txt;conststringLogsToTheFile=nlogsFile.txt;信息设定配置文件conststringProductLogFileName=productLog.txt”;志信息break;coutvv”以下是出库信息vvendl;coutvv”产品型号”vv“出库的数量”vv“总金额n«endl;break;coutvv”以下是退库信息vvendl;coutvv”产品型号“vv退库的数量“vv”总金额“vv”退库原因vvendl;break;default:break;}cout«changeModeln«changeNum«n«changeToatolMoney«niftype=3{cout«reason«endl;}else{cout«endl;}temp=ifisHave==nNo]{coutvv”没有找到该产品”;if[inOutAgainType==l]{coutvv”入库相关信息“vvendl;}elseifinOutAgainType==2{coutvv”出库相关信息“vvendl;}else{coutvv”退库相关信息“vvendl;fin.closeQ;/**输出段时间内仓库发生的入出退明细账*@paramday段时间@paramfileName文件名@paraminOutAgainType入出退标识符*/voidWareLogs::readDateFromFileintday.stringfileNameintinOutAgainType{fstreamfinfileNameios::beg|ios::in;if!fin{coutvv”打开文件vvfileNamevv失败vvendl;return;stringtempisInHave=nNonisOutHave=nNoisAgainHave=No;intt=0today=0;product*p=newproductQ;today=p-getDayByChronoO;〃调用此方法时的时间戳while[Ifin.eofQ]{fin»temp;iftemp==nn||temp==n{break;type=temp;fin»changeModel»changeNum»changeToatolMoney»intoWareDay»outFromWareDay»againToWareDay»reason;t=atoitemp.c_strO;〃将入出库标识符转换为int类型ift==inOutAgainTypet==l{〃入库信息ifisInHave二二No{isInHave=Yes;coutv”以下是该时间段内仓库的入库信息“vvendl;coutvv”产品型号“vv”入库的数量总金额M«endl;}iftoday-intoWareDay=day{cout«changeModel«n«changeNum«nH«changeToatolMoney«endl;ift==inOutAgainTypet==2{〃出库信息ifisOutHave==No{isOutHave=Yes;coutvv”以下是该时间段内仓库的出库信息Zvendl;coutv〈”产品型号“vv”出库的数量“vv”总金额H«endl;}iftoday-outFromWareDay]=day]{cout«changeModel«n«changeNum«n«changeToatolMoney«endl;}ift==inOutAgainTypet==3{〃退库信息if[isAgainHave==nNon]{isAgainHave=Yes”;coutvv”以下是该时间段内仓库的退库信息“vvendl;coutvv”产品型号“vv”退库的数量“vv”总金额n«endl;iftoday-againToWareDay=day{coutchangeModel«nchangeNum««changeToatolMoney«endl;}temp=}ifisInHave==nNoinOutAgainType==l{coutv”没有找到该时间段内的入库信息”vvendl;}ifisOutHave==nNoinOutAgainType==2]{coutv”没有找到该时间段内的出库信息“vvendl;}ifisAgainHave==nNoinOutAgainType==3]{coutvv”没有找到该时间段内的退库信息”vvendl;}fin.closeQ;////linkList.hpp//仓库管理系统////Createdbyxiaokaon16/7/
5.//Copyright©2016年黄志浩.Allrightsreserved.//#includeiostreamusingnamespacestd;classproduct;classWareLogs;classnode{private:product*data;public:node*next;nodeQ;nodefproduct*tempData;friendvoidoutProdFromFilefproduct*prodListstringfileNamestringtype;friendclasslinkList;};classlinkList{private:voidaddNodeFromProdproduct*tempData;public:node*head;linkListQ;〜linkList;friendvoidoutProdFromFilefproduct*prodListstringfileNamestringtype;〃提取数据为链表voidgetlinkListFromTheFilefstringfileName];〃遍历链表找到节点voidforlnLinkListForlnAndOutfproduct*prodstringtype];〃根据产品型号搜索出仓库名称/产品分布型号voidforInLinkListForLocationproduct*prodstringtype;〃根据基本数据设定信息查询高储低储以及超出存储期限的产品voidforlnLinkListForRemindfWareLogs*logsstringtype;〃根据产品对象的型号和该产品成本系数以及日志文件中的基本数据设定信息计算该产品的存储成本voidforlnLinkListForCostfproduct*prodWareLogs*logsstringtype;〃将链表数据重新写入文件voidwriteNodeToTheFilefstringfileName;};////linkList.cpp//仓库管理系统////Createdbyxiaokaon16/7/
5.//Copyright©2016年黄志浩.Allrightsreserved.//#includeHlinkList.hppH#includenproduct.hppHnode::nodeQ{data=NULL;next=NULL;}node::nodeproduct*tempData{data=tempData;next=NULL;linkList::linkListQ{head=newnode;linkList::-linkListQ{ifhead-next==NULL]{deletehead;}else{node*p=head/q;while[p-next!=NULL]{q=p-next;deletep;P=q;}/**给链表增加节点*@paramtempData节点数据/voidlinkList::addNodeFromProd[product*tempData]{node*p=newnodetempData;ifhead-next==NULL{head-next=p;}else{node*q=head;whileq-next!=NULL{q=q-next;q-next=p;提取文件中的数据存储到模型对象中作为链表节点的数据域*@paramfileName文件名/voidlinkList::getlinkListFromTheFilestringfileName{fstreamfinfileNameios::beg|ios::in;coutvv”文件vvfileNamevv打开失败vvendl;return;stringtemp;whileIfin.eofQ{fin»temp;iftemp==H|||temp==n{break;product*n=newproductQ;n-prodModel=temp;fin»n-prodNum»n-location»n-price»n-costNum»n-prodColor»n-peopleName»n-wareName»n-intoWareDay»n-outFromWareDay»n-againToWareDay;this-addNodeFromProdn;temp=}fin.closeQ;return;}遍历链表找到节点并对该节点修改*@paramprod出库单领料单/销售出库单/voidlinkList::forInLinkListForInAndOutproduct*prodstringtype{node*p;p=head;if[p-next==NULL]{coutvv链表为空vvendl;return;}stringisHaveORNo二No;whilep-next!=NULL{ifp-next-data-prodModel==prod-prodModel{isHaveORNo=”Yes”;iftype==2{〃出库ifp-next-data-prodNumprod-prodNum{coutvv1销售出库单的货物数量大于库存数量”vvendl;return;p-next-data-prodNum=p-next-data-prodNum-prod-prodNum;p-next-data-outFromWareDay=prod-outFromWareDay;〃修改时间戳〃出库前将数据写入日志文件WareLogs*w=newWareLogsQ;w-wirteChangeToTheFilep-next-dataHproductLog.txtnU2H;deletew;}elseiftype=3{〃退库p-next-data-prodNum=p-next-data-prodNum+prod-prodNum;p-next-data-againToWareDay=prod-againToWareDay;//修改时间戳〃退库前将数据写入日志文件WareLogs*w=newWareLogsQ;w-wirteChangeToTheFilep-next-dataproductLog.txtS1;deletew;p=p-next;}ifisHaveORNo==HNoH]{coutvv没有找至『vvprod-prodModelvv请确认该型号和该产品入库单填写型号符合«endl;}根据产品型号搜索出仓库名称/产品分布情况*@paramprod产品对象@paramfileName文件名/voidlinkList::forInLinkListForLocation[product*prodstringtype{iftype==n4H{coutvv”成品仓库查询结果如下”vvendl;}else{coutvv原材料仓库查询结果如下“vvendl;node*p;p=head;ifp-next==NULL{coutvv”链表为空“vvendl;return;stringisHaveORNo=No;while[p-next!=NULL]{ifp-next-data-prodModel==prod-prodModel{ifisHaveORNo==No{isHaveORNo=“Yes”;coutvv”产品型号所在仓库所在仓库货位存储数量“vvendl;cout«prod-prodModel«Hn«p-next-data-wareName«H«p-next-data-location«nn«p-next-data-prodNum«endl;p=p-next;}ifisHaveORNo二=No{iftype=二4{coutvv”没有在成品仓库中找到该型号产品“vvendl;}else{coutvv”没有在原材料仓库中找到该型号产品vvendl;/**将链表数据写入文件*@paramfileName文件名/voidlinkList::writeNodeToTheFilestringfileName{fstreamfoutfileName;node*p=head;ifp-next==NULL{coutvv”链表为空“vven祖;return;whilep-next!=NULL{fout«p-next-data-prodModel«n\n«p-next-data-prodNum«n\nn«p-next-data-location«\nH«p-next-data-pricen\n«p-next-data-costNum«H\n«p-next-data-prodColor«\nH«p-next-data-peopleName«u\nH«p-next-data-wareName«\n«p-next-data-intoWareDay«\n«p-next-data-outFromWareDay«H\nH«p-next-data-againToWareDay«H\nH;p=p-next;}fout.closeQ;根据系统参数定义时间,提示仓库是否高储/低储搜索出存储期限超出限定的产品*@paramtype符号标志4二成品仓库5二原材料仓库*/voidlinkList::forInLinkListForRemindWareLogs*logsstringtype]{node*p;doubletotoalNum=0;〃仓库总储货量p=head;if[p-next==NULL]{coutvv”链表为空“vvendl;return;}product*prod=newproductQ;intday=prod-getDayByChronoQ;〃获取当前时间戳stringdateOver=No”;whilep-next!二NULL{totoalNum+=p-next-data-prodNum;ifday-p-next-data-intoWareDay=logs-maxDate]{dateOver=Yes;coutvvp-next-data-prodModekv”的存储时间超出最大存储期限«endl;}p=p-next;ifdateOver==No{type=二4coutvv成品仓库”coutvv”原材料仓库”;coutvv”没有达到存储期限的货物“vvendl;}iftotoalNum=Iogs-maxStock]{type=二4coutvv成品仓库”coutvv”原材料仓库”;coutvv库存已达高储vv目前储货量为n«totoalNum«endl;}elseif[totoalNumlogs-minStock{type==n4ncoutv成品仓库”coutvv”原材料仓库”;coutvv”库存已低于低储“vv”目前仓库储货量为n«totoalNum«endl;}/***根据产品对象的型号和该产品成本系数以及日志文件中的基本数据设定信息计算该产品的存储成本*@paramprod产品类对象取该产品成本系数@paramlogs日志类对象取总体成本系数7voidlinkList::forInLinkListForCostproduct*prodWareLogs*logsstringtype{COUtVV”以下是该产品在“;type==4Hcoutvv”成品仓库”:coutvv”原材料仓库”;coutvv”的搜索结果”vvendl;node*p;p=head;ifp-next==NULL{coutvv链表为空vvendl;return;stringisHaveORNo=No;whilep-next!=NULL{ifp-next-data-prodModel==prod-prodModel{isHaveORNo=“Yes”;intday=prod-getDayByChronoQ;ifday==p-next-data-intoWareDay{coutvv”该货物今天入库,暂时不出存储成本vvendl;break;coutvvprod・getProdModelvv”的存储成本为“;cout«p-next-data-costNum*logs-costFactor*p-next-data-getProdPriceQ*p-next-data-getProdNumQ*double[day-p-next-data-intoWareDay«endl;p=p-next;}ifisHaveORNo二=No{coutvv”没有在”;type=二4coutvv成品仓库”coutvv”原材料仓库”;coutvv中找至『vvprod-prodModelvvendl;详细设计产品类数据成员部分货物型号/货物数量/货位号/单价/该产品的自定义成本系数/颜色/库管员/仓库名称/入出退库时间戳成员方法:〃填写入库单,将数据保存在对象模型中〃填写销售出库单,将数据保存在对象模型中〃填写领料单,将数据保存在对象模型中〃填写退库单,将数据保存在对象模型中〃根据入库单确认入库〃填写产品型号供查询使用〃计算时间戳时间戳的计算通过库函数来实现,需要包含头文件chrono和ratio每入出退库是都需要调用该函数记录时间日期,供查询使用intproduct::getDayByChronoQ{usingnamespacestd::chrono;typedefdurationintstd::ratio60*60*24»days_type;time_pointsystem_clockdays_typetoday=time_point_castdays_typesystem_clock::nowO;returntoday.time_since_epochQ.countQ;链表类将链表的头节点放在链表类中,节点类对象中含有数据域和指向下一个节点的指针域链表类的成员方法负责将链表的节点存储的产品类对象数据写入文件或将文件中的数据提取为链表链表类的成员方法〃提取数据为链表voidgetlinkListFromTheFilefstringfileName;〃遍历链表找到节点voidforlnLinkListForlnAndOutfproduct*prodstringtype;〃根据产品型号搜索出仓库名称/产品分布型号voidforlnLinkListForLocationfproduct*prodstringtype];〃根据基本数据设定信息查询高储低储以及超出存储期限的产品voidforlnLinkListForRemindfWareLogs*logsstringtype];〃根据产品对象的型号和该产品成本系数以及日志文件中的基本数据设定信息计算该产品的存储成本voidforlnLinkListForCostfproduct*prodWareLogs*logsstringtype;〃将链表数据重新写入文件voidwriteNodeToTheFilefstringfileName];调试分析遇到过的问题
1.计算仓库存储成本和预警存储期限时,需要知道产品入出退库的时间,这里采用库函数实现,可以获取当前的时间戳,产品每次入出退库时都需要将这个时间戳保存用途如通过当前的时间戳减去产品入库的时间戳就是产品在仓库的保存时间2•至于文件数据提取及修改,是通过链表实现的对于链表的处理,C++和C是有些不同的,在C++里,可以把节点类和链表类分别声明,将头节点作为链表类对象的成员属性,而每个节点的数据域保存了产品类对象,指针域指向下一个节点3入库退库功能之外的查询工作,需要产品入出退库时间、基础数据设定等信息,这些信息保存在产品对象中不合适,而且这样使得产品对象过于庞大,但是又和产品对象的数据有密切关系,所以这里采用继承的方式,日志类继承产品类,需要完成的功能是将基础数据设定的数据和产品每次入出退库的时间写入文件写入的时间需要和对应产品进行联系,所以需要获取对应产品的型号、数量、单价来计算总金额
4.C++当自定义的头文件过多时,会有文件重复包含,即文件重复编译的情况出现这里采用宏的方式处理#ifndefidentifier#defineidentifier#endif5入库时需要判断入库产品数量是否大于自定义的货位存储能力,同样出库时需要判断出库产品的数量是否大于仓库存储产品数量为此在入库或出库时通过链表类对象提取文件中保存的对应型号产品的数量与将要入库或出库的产品数量做比较,不符合就要终止入库或退库用户使用说明.第一次使用时需要到基础数据设定模块中设定数据,这些数据在以后入出退库时都会默认调用.入库时填写的入库单中产品的成本系数不能大于基本数据设定中自定义的总体成本系数.当天入库的产品暂时不计存储成本(该产品存储天数为0).牢记产品型号,仓库的查询功能除了“仓库库存分析查询〃是通过时间段查询数据,其余都是通过产品型号来查询测试结果
1.基础数据设定测试一一一一一---仓库管理系蜕-一一一-一一1-基册数据设定2-仓库入库3-仓库出库4-仓库退库5-仓库库存笠询6-统计分析7-提涯预警信息8-仓库台怅9-产品存储成本笠询-退出系统1输入仓库高存储量200输入仓库低存储量50轴入货位存储能力50输入仓库最大存储期限3输入仓库存储总体成本系数1已返回主菜单仓座管理系筑-1-基础数据设定-2-仓库入库-3-仓库出库4-仓库退库5-仓库库存查询6-统计分析-7-提醒预警信息-8-仓库台怅9-产品存储成本查询-退出系统1-成品入库2-原材料入芹1质检部门确认合格?y一一一一一——一一一一一一1H写入轴入货物型号4r55殖入存储数量30输入货位序列号4轴入产品单价24压入成本系数
0.5轴入货物颜色red输入库管员姓名zhangsan输入仓库名称xkck文件写入完毕已返回主菜单-1-基础数据设定2-仓库入库3-仓库出库-4-仓库退库5-仓库库存查询6-统计分析7-提醒预警信息8-仓库台怅9-产品存储成本查询—0-退出系统21-成品入库2-原材料入库2送检部门确认合格?y填写入库单输入货物型号19t5输入存储数量30输入货位序列号2输入产品单价45输入成本系数
0.4编入货物^色yellow输入库管员姓名Usi输入仓库名称kkck文件写入完毕已返回主菜单1-成品入库2-原材料入店1质检部门确认合格7y填写入寄单输入货物型号3e4输入存储数量51该产品在货位的数・超过您设置的货位存储能力5文件写入失败已返叵1主菜单
3.出库测试_仓育管理系统一-一一一_-一———-1-基础数据设定―2-仓库入库3-仓库出库-4-仓库退库5-仓库库存查询-6-统计分析-7-提醒预警信息-8-仓库台粮9-产品存储成本查询—-退出系统31-原材料出库2-销售出库2填写销售出库单输入货物型号4r55输入货物数量20已返回主菜单1-原材料出席2-销售出库2输入货物型号4r55输入货物数量31提取的货物数量大于库存数量已返回主菜单。