中南财经政法大学2011届本科生毕业论文(设计)
fileB.saveAs(getServletContext().getRealPath(\fileB.getFileExt()); image=\??
}
首先声明并创建一个smartupload类,利用该类的initialize方法进行初始化,传入pageContext内置变量。通过upload()方法进行上传操作后,利用getFiles()方法将上传的图片文件存放到Files类当中。定义一个整形变量count,赋值内容为files.getCount(),用于计算上传的文件数量。当图片上传成功后,声明一个File类,指向files.getFile(0),即指向上传文件中的第一个文件。利用SaveAs()方法将文件存放到服务器中的指定路径中,并可以修改文件名。上述代码是利用系统时间作为文件名,这样做主要是为了避免文件重名而引发图片上传错误。处理完图片文件上传后,还需要利用smartupload中的getRequest().getParameter()方法获取与图片一起提交的图片信息。这样一个enctype=\的表单就能够完成同时上传文件和文件信息的任务。
会员在店铺中添加产品后,点击商品管理会显示店铺当前的商品列表,在每一行商品信息中都设置了删除和修改的操作链接。点击删除按钮将商品编号传送到servlet,servlet利用doGet()方法获取传进来的商品ID,再调用商品类中的删除方法进行删除操作,这里的删除操作并不是将数据库中的商品记录进行删除,而是将该商品记录的G_Owner字段设置为空。这是为了避免其他引用到G_ID字段的数据在现实的时候出错。点击修改操作链接后,会跳转到商品修改页面,页面布局与商品添加的页面相似,系统先根据传来的商品编号查询到相关的商品信息,然后显示在各项文本框当中,用户可在原来数据的基础上进行信息的修改,修改完成后点击提交按钮,进行修改操作。
(三) 订单管理模块
订单管理模块主要包含订单添加和订单处理两大块功能。
由于订单分为线上订单和线下订单,为了方便处理,订单数据的存放都在同一个表中,并利用标识字段Ord_Flag来进行区分,由于两种订单存在一定的差异,因此,在某些字段或者处理当中,会根据不同的类型来进行不同的操作。
-17-
中南财经政法大学2011届本科生毕业论文(设计)
具体流程图如图13所示:
进入订单生成页面 输入订单信息 否 是否线上订单? 是 Ord_Flag=1; Ord_Flag=0; 是否采购订单? 是 选择关联材料ID id Mat_ID=id; 否 添加成功? 是 返回订单管理页面 否 输出“添加失败” 结束
图12 添加订单信息流程
输入的订单信息是会员浏览商品的,根据输入信息生成订单记录文件,记录文件包括订单编号、购买商品、购买日期、购买数量、应付价格、订金金额、订单属性、购买者、订单状态、采购标识等内容。这里的购买数量是以商品批量为单位的,即如果某商品的批量为100,购买批数为2,那么该商品的实际购买数量为200。应付价格与订金金额的初始值是根据商品的购买数量、单价以及订金比率得到的。然而,系统为卖家提供了对于这两项内容的修改权限,卖家可与买家议价后进行修改。订单属性指的是线上订单和线下订单,线上订单是买家提交订单后形成的,存放这种订单记录的Ord_Flag字段值为1,而线下订单是由卖家自行输入的,Ord_Flag字段值为0。订单属性的判断依据是传进执行添加操作的servlet的地址参数,由于两种订单的添加页面不同,所以在提交数据的时候传送不同的订单属性。采购标识是判断该订单是否属于采购订单,在数据表中用Mat_ID字段进行描述,当用户创建的订单是为了对某种材料的采购,订单记录中的将记录采购的材料ID。
对于订单的处理,两种订单的处理方法是相同的,都是通过修改订单状态标识订单当前所处的处理环节。
-18-
中南财经政法大学2011届本科生毕业论文(设计)
订单形成 买家交付订金 卖家提出终止 卖家发货 买家收到货物 买家付清余款 交易完成 买家提出终止 双方同意? 是 交易终止
图13 订单状态示意图
订单的状态有等待买家交付订金、买家已付订金,商品配送在途、等待买家支付余款、买家已付清余款(交易成功)、买家提出终止申请、卖家提出终止申请交易终止八种,在数据库中分别使用1、2、3、4、5、6、7、8进行区分,并存放于Ord_State字段中。每完成一个环节,订单的状态会进行相应的修改。刚建立订单后,订单的状态默认值为1,由于本网站没有在线支付的功能,因此,对于切换到2、3、5的状态都是由卖家自行切换,第4种状态则由买家收到货物后切换。而对于终止交易状态,双方都有单方面提出交易终止处理,只有双方都同意终止,交易得到终止。
订单状态切换的关键代码如下:
public boolean updateStore(int ID,int content) { boolean updated=false; int state = 0; int cur_state = getState(ID);//获取当前订单状态 if(content==0){ state = cur_state + 1; }else if (cur_state + content == 13) { state = 8; }else { state = content; } String sql = \
-19-
中南财经政法大学2011届本科生毕业论文(设计)
}
int re = update(sql); if (re != -1){ updated=true; }
return updated;
(四) 库存管理模块
本模块中主要包含库存信息查看与缺货提醒两大功能。企业的库存分为商品库存与材料库存两种。商品与原材料在数据库中都存放于Material表中。库存信息的展示就是通过对该表进行查询而得到的。
销售订单交易成功 生产计划审批开始 生产计划完成 采购订单交易完成 产品数量减少 材料数量减少 产品数量增加 材料数量增加 物料库存数据改变 结束
图14 物料库存增减流程图
物料库存增减情况如图15所示,当销售订单交易成功,产品数量会进行相应的减少;当生产计划得到审批开始生产后,所需的物料会被占用,其他生产计划不能够使用这一块物料,因此物料数量在数据库中会减少;当生产计划完成后,产品的数量会进行相应的增加;当原材料的采购订单完成后,材料库存也会进行增加操作。
除了查看库存信息外,库存管理还存在一个比较重要的功能——缺货提醒。缺货提醒主要是在库存信息中显示当前货物的供求信息,并进行判断和提示。其分为商品缺货提醒和材料缺货提醒。
显示商品库存信息时,调用的是由Material表和Orders表连接后的视图G_Stock,包含商品的当前订货数量和当前生产计划数量。当前订货数量是在数据库中以商品编号分组执行sum()方法来统计商品每张订单的订货数量而得到的。获得订货数量后,系统会与该商品的库存数量进行比较,如果库存数量小于订货数量,则提醒缺货。当前生产计划数量是给用户是否追加生产的一个判断依据。
与商品库存信息相类似,材料库存信息调用的是由Material和Mat_Need连接后的视图Mat_Stock,包含该材料的当前需求数量和当前计划采购数量。当前需求数量是根据在材料需求表当中的材料ID进行需求统计得到的。获得需求数量后,系统会与该材料的库存数量进行比较,如果库存数量小于订货数量,则提
①
①
程国卿 企业资源计划ERP教程 清华大学出版社,2008
-20-
中南财经政法大学2011届本科生毕业论文(设计)
醒缺货。当前计划采购数量是给用户是否追加采购数量的判断依据。
(五) 生产计划模块
生产计划模块功能包括添加计划、计划查看、计划删除、计划修改、计划开始、计划完成。
达到系统规定的生产计划周期 获取商品订货数量以及商品库存信息、预测生产量 输入修改信息 是 否 是否修改? 否 形成生产计划 审批通过? 是 生产计划执行 结束
图15 添加生产计划①
如图15所示,系统中,默认的生产周期为一个星期,规定每个星期一系统自动根据商品的订货信息、商品库存信息以及预测生产量,形成生产计划,供用户参考,用户可对计划进行审核,并进行修改,直到计划通过审核或者放弃计划为止。对于产品计划生产数量公式为:净需求量=毛需求量(预测生产量与合同需求量中较大者)-现有库存+安全库存②。这里将建立一个java应用,调用java.util.Timer和java.util.Calendar,实现定期执行程序的效果。
获取计划周期内,销售订单数量:
Select sum(Order_Num) sumNum where Order_RDate between getdate() and DateAdd(“d”,6,getdate()) and Mat_ID = search_id
进入生产计划操作的路径有两种,一种是在查看商品库存信息时有缺货提醒,在缺货提醒的旁边就会自动生成一个到添加生产计划页面的链接,并把该商品ID通过地址参数传递过去。另一种是,在生产计划管理的主页面中也提供了到添加页面的链接,该链接也传递与前者名字一样的地址参数,不过值为空,这样是为了使两种方式进入同一个页面时保持一致性,避免直接进入时获取不到参数而发生异常。进入计划添加页面后,用户需要填写计划编号、生产产品、计划生产数量以及所需材料数量。计划刚生成时,生产开始日期与结束日期都为空。
①②
陈焕林.集成客户ERP系统的B2B销售网站研究.华东师范大学硕士学位论文,2010. 程国卿 企业资源计划ERP教程 清华大学出版社,2008
-21-