如果想要获取相关的源码,笔记,和相关工具,对项目需求的二次开发,可以关注我并私信!!!
项目第九天课程安排
1.采购单提交开发(参考昨天的内容)
2.采购单审核
3.采购单受理
4.采购入库
5.采购单模块的集成测试(重视,掌握集成测试方法)
6.讨论:退货单和结算单模块的业务流程(了解)
7.Dwr的使用方法介绍(了解)
8.讨论系统业务流程:
更加清楚系统的业务流程.
结合实际分析系统业务(主要了解实际使用方法,面试时可能会问到发挥的问题).
分组讨论(企业中对业务需求、开发方法等都通过讨论确定).
同学在老师的电脑上进行功能演示,一边演示一边说每个功能如何实现的?
一 监管单位对采购单的审核
1 需求
1.1 操作流程
原型系统中的操作流程如下:
第1步:必须使用监督单位(这里使用的是崔庙镇卫生院cmzcmc身份)来登录系统后,查询待审核的采购单子,如下图:
第2步:采购单审核的提交。确定审核结果,进行提交,如图
因此,对于采购单的审核功能的实现,包括两个功能:
- 查询待审核列表。
- 审核结果的提交。
1.2 数据范围的约束条件
1.只查询采购单状态是“审核中”的采购单。
2.卫生局可以审核所有医院创建的采购单,卫生院只审核本辖区下的医院所创建的采购单.
2 查询待审核列表
2.1 dao
因为页面中要查询的字段与昨天的“医院采购单维护列表”一节中的sql语句相似,所以,参考:昨天的文档中的“医院采购单维护列表”一节中所编写sql语句
Sql语句如下:
select useryy.mc useryymc, yycgd.*, (select info from dictinfo where typecode = '010' and dictcode = yycgd.zt) yycgdztmc from yycgd2018 yycgd, useryy where yycgd.useryyid = useryy.id
--约束条件1:只查询审核中的采购单.2表示采购单已提交但是未审核。 and yycgd.zt = '2'
--约束条件2:卫生院只审核本辖区医院创建的采购单,1.1.是监管单位卫生院所管理的地区 and useryy.id in ( select id from useryy where dq like '1.1.%' ) |
因为与昨天文档中的“医院采购单维护列表”一节中所编写的sql语句相似,不同的只是添加了上面的两个约束条件。所以,不需要创建新的自定义mapper映射文件,也不需要创建新的mapper接口了!而只需在YycgdMapperCustom.xml文件扩展该两个查询条件即可!
针对第一个约束条件,直接在YycgdMapperCustom.xml文件中id="findYycgdList"的statement中添加查询条件,即添加如下:
扩展采购单的查询条件:
针对第二个约束条件,在SysuserMapperCustom.xml文件中扩展医院的查询条件,如下:
红框内是添加的语句。
2.2 service
接口功能:查询待审核的采购单列表.
接口参数:页面中的年份、监管单位id、查询条件yycgdQueryVo。
接口实现:调用采购单列表mapper,需要设置两个参数:
参数1:监管单位的管理地区,根据监管单位id可以查询到管理地区。
参数2:采购单的审核状态,固定设置为2(审核中)。
CgdService接口中添加两个方法,如下:
CgdServiceImpl实现类中添加的两个方法,如下:
2.3 action和页面
在CgdAction中添加两个方法,参考昨天的“医院采购单维护列表”一节中的action方法的实现,如下
审核页面checkyycgdlist.jsp所在目录如下
需要注意请求的url路径,如下:
2.4 调试(注意)
menu.json中添加如下:
测试时:分别以卫生院身份和卫生局身份登陆进行审核。
以卫生院(崔庙镇cmz)身份登录系统,如下:
密码:111111
查看采购单审核列表.
退出系统,再以荥阳市卫生局身份登录系统,如下:
查看采购单审核列表.
注意:要保证使用卫生局身份登录系统所查看的“采购单审核列表”中所要审核的采购单中包含了卫生院所提交的采购单,测试才是正确的!
但是,这还不够!!还需要再以其它卫生院所管理的医院进行登陆,然后来创建采购单,我们的测试目标是:
卫生院审核本区域的医院。
卫生局审核全部的医院.
例如:
第1步:以广武镇插闫村卫生室身份登录系统,如下:
然后创建采购单,然后在创建的采购单中添加药品信息,最后提交采购单!(此过程省略......)
第2步:以广武镇卫生院身份登录系统来进行审核,如下:
这时查看“采购单审核”,会显示之前刚刚创建的采购单,然后进行审核,如下:
第3步:再以荥阳市卫生局登录系统,如下:
查看“采购单审核”,应该显示两条记录,包括之前刚刚创建的两条记录。如下:
因为在底层的sql中的数据约束条件进行了限制,所以以卫生局登录系统会显示所有的已提交但未审核的采购单!
3 审核结果的提交
3.1需求
监管单位(卫生局或者卫生院)选择审核结果、填写审核意见进行提交 。如下图
注意:上面页面中的“查看”链接就是用来查看该采购单下的明细信息的页面。该功能需要自己实现!而查看采购
单明细的页面的布局同采购单修改页面editcgd.jsp相同!
约束条件:
- 采购单的状态为“审核中”时方可执行提交审核。
- 审核的结果必须选择(如:页面中的下拉列表框),审核结果包括:审核通过、审核不通过,如图:
3. 审核意见是否必填根据用户需求来定,本系统采用不必填 。
数据库操作:
更新采购单状态为审核通过或审核不通过
3.2 dao
更新采购单状态为审核通过或审核不通过.
使用逆向工程生成的代码即可!
3.3 servie
接口功能:采购单审核.
接口参数:采购单id、审核状态(审核结果)、审核意见 (可以使用封装对象YycgdCustomer将审核结果和审核意见进行封装封装)。
接口实现:两个校验:
1.采购单状态为审核中方可提交审核。
2.审核结果(审核通过、审核不通过)必须选择
在CgdService接口中添加如下方法:
CgdServiceImpl实现类中的方法如下:
/** * 审核提交结果 */ @Override public void saveYycgdCheckStatus(String yycgdid, YycgdCustom yycgdCustom) throws Exception { /* * 第1步: 校验采购单状态为审核中方可提交审核 */ Yycgd yycgd = this.findYycgdById(yycgdid); if (yycgd == null) { // 抛出异常,提交的采购单在系统中不存在 // .... } // 获取采购单状态 String zt = yycgd.getZt(); //如果采购单状态为2(2表示审核中) if (!zt.equals("2")) { // 采购单只允许在审核中方可提交 审核 ResultUtil.throwExcepion(ResultUtil.createFail(Config.MESSAGE, 514, null)); } /* * 第2步:校验审核结果(审核通过、审核不通过),必须选择 */ if (yycgdCustom == null || yycgdCustom.getZt() == null || (!yycgdCustom.getZt().equals("3") && !yycgdCustom.getZt().equals("4"))) { // 抛出异常,审核结果选择的不正确 // ..... } /* * 第3步: 更新采购单状态 */ // 获取年份 String businessyear = yycgdid.substring(0, 4); Yycgd yycgd_update = new Yycgd(); yycgd_update.setId(yycgdid); // 更新状态 yycgd_update.setZt(yycgdCustom.getZt()); // 更新审核时间 yycgd_update.setShtime(MyUtil.getNowDate()); // 更新审核意见 yycgd_update.setShyj(yycgdCustom.getShyj()); //设置年份 yycgd_update.setBusinessyear(businessyear); yycgdMapper.updateByPrimaryKeySelective(yycgd_update); } |
注意:该方法在讲完后面的“数据聚合”的内容后,还需要添加代码进行修改的!
3.4 action
因为在checkyycgdlist.jsp页面中批量提交的参数中包括如下几个参数:
采购单id:多个采购单id的参数,因为审核功能是监管单位来使用的(在datagrid中定义).
审核结果:多个参数(在datagrid中定义).
审核意见:多个参数(在datagrid中定义).
审核结果和审核意见被封装到yycgdCustom对象中了。
那么,需要使用 List<YycgdCustom> yycgdCustoms来接收页面中的参数,因此,需要在YycgdQueryVo包装类中添加如下属性:
在CgdAction中定义如下方法:
3.5 checkyycgdlist.jsp页面
在checkyycgdlist.jsp页面中,注意批量参数的定义,如下:
批量提交的JS方法:参考统一批量提交方法模版。
3.6 调试(难点)
第1步:以监督单位崔庙镇卫生院身份来登录系统,如下:
选择“审核通过”下拉列表框后,选择“提交审核结果”链接,再点击“确定”按钮后,如下:
列表会自动刷新,刚才的采购单会自动消失了!也就是说:审核提交后,在审核列表查询不到!
第2步:退出后,以崔庙镇崔庙村卫生室的医院身份(cmzcmc)来登录系统
点击“采购单维护”链接,如下:
查看采购状态,已经变为“审核通过”!
在上面的“采购单列表”中,对审核通过的采购单点击“修改”链接,可以在修改采购单页面查看审 核结果,如下:
注意:采购单状态和审核时间的变化!
而审核意见栏之所以为空,是因为在第1步中的审核中没有输入!
第3步:假如某个采购单的审核不通过,那么,就可以修改后重新提交 ,如下步骤:
点击上图中的“修改”链接可以进入到修改页面,如下:
注意:其实上面的测试有一个问题,对于审核通过的采购单的审核意见的内容显示的问题,如下图所示:
对于此类问题的解决,建议:针对审核意见的历史记录的保存,建议单独创建审核表,记录审核意见的历史信息。
二 供货商受理采购单和发货的实现
1 需求
1.1 操作流程
第1步:必须以供应商身份来登录系统后
第2步:点击“采购单受理”链接后,会查询出待发货的采购单明细列表的清单,也称为“医院采购单明细的受理列表的显示”!
(注意:查询出来的是采购单明细信息,而不是订单表)!
这样做对于供货商来说更直观,因为会有很多不同的医院来下订单!直接显示采购单的明细信息会让供货商很清楚的 看到!
原型中的页面如下:
第3步:执行发货操作,即点击“确认发货”链接!
注意:发货操作可以分为两种方式:
(1)手动确认发货的方式:
操作员需要在页面中手动的一个个选择要发货的药品(如上图),然后点击“确认发货”链接来执行发货操作(页面如上)。
此方式比较繁琐,适用于发货量少的记录。也是本系统中所使用的方式.!
(2)批量发货的方式:本系统中并没有实现,需要自己实现导入和导出的功能。但是在原型系统中实现了批量发货的方式!该方式适用于发货量大的记录。批量发货的步骤如下:
a. 系统需要提供一个导出功能:
用户(供货商)导出一个excel文件格式的待发货的采购单明细清单(清单包括:药品流水号、通用名.............采购量等等信息)。
然后,操作员(供应商)会根据清单中的采购量来查看库存是否满足发货要求,从而执行发货操作!
(参考药品目录的导入和导出的内容)!
b. 通常对于一个比较大的代理商(供货商),它会将到处的发货清单excel文件导入到企业中所使用的库存系统(通常对于供应商来说,
平台会包含很多的系统:例如医药采购系统、库存系统...........等等),目的是为了执行批量出库操作。该库存系统执行完成后,
供货商会从库存系统中导出一个出库清单的excel文件,企业需要修改出库清单,生成一份发货清单文件”excel文件(该清单文件符合本系统导入规则)!
然后,使用本系统提供的导入功能来导入该发货清单
c. 如果企业没有库存系统,那么,就需要供货商企业依据发货清单的excel文件手动的编写一个“发货清单文件”的 exce l文件,
当然,该“发货清单文件”必须符合本系统的导入规则!然后,使用本系统提供的导入功能来导入该发货清单!
d. 总而言之,该发货清单的excel文件无论是库存系统生成的,亦或是企业自己手动编写的,都可以使用本系 统提供批量发货功能!用户导入批量发货清单文件后,本 系统就可以导入该清单,从而执行批量发货操作。
那么,供货商需要实现两个功能:
1. 医药采购单明细的受理列表的显示。
2. 针对采购单药品的发货操作。
1.2 数据约束
约束条件:当前采购药品明细动态表yycgdmx的采购状态(CGZT字段)为“未确认送货”时方可执行发货操作。
数据库的操作:
根据采购单id(yycgdid字段)和药品id(ypxxid字段)将采购药品明细表yycgdmx的采购状态更新为2(已发货)!
因为,这两个字段组成了唯一约束条件!
2 采购单明细受理列表的显示
2.1 需求
根据上面的需求分析可知,由供货商来查询待发货的清单。
约束条件:
- 供货商只允许查询自己供应的采购药品信息!
- 当前的采购单的审核状态为3,表示:“审核通过”!
- 采购药品明细的采购状态为1,表示:“未确认送货”!
注意:在约束条件中的采购单的审核状态和采购单的采购状态的两个字段的区别,可以参考yycgd表和yycgdmx表!
2.2 dao
查询待发货列表页面,如下图:
上面页面中列表的字段可以参考:“采购单明细的查询列表实现”一节中的需求中的字段相似,如下图:
因为,对于DAO中的内容都是公用的!因此,我们不再重新自定义maper了,直接使用之前定义过的YycgdMapperCustomer.xml文件中定义的”采购单药品明细查询列表”下的
id="findYycgdmxList"的statement中来扩展字段!
经过分析可知,需要扩展4个字段(查看下面的映射文件),
还有添加3个约束的查询条件(即上面的3个约束条件 )的sql语句,sql语句中3个约束条件如下:
最终,YycgdMapperCustomer.xml映射文件中的内容定义如下:
<!--红框内是添加的2个约束条件:采购单的采购状态的约束条件、还有供货商id的约束条件 --> ................................................ Select ................................ <!--这是添加的4个扩展字段 --> yycgd.bm yycgdbm, --采购单流水号 yycgd.mc yycgdmc, --采购单名称 yycgd.cjtime, --采购单的建单时间 (select info from dictinfo where typecode = '010' and dictcode = yycgd.zt) yycgdztmc, --采购单的状态名称 ....................................................... <!--下面是添加的1个约束条件:采购单的审核状态的约束条件。该约束条件引用了query_yycgd_where的sql片段,在该sql片段了就已经包含了审核状态字段zt的约束条件了,因此这里只需要引入即可 --> |
注意:在约束条件中的采购单的审核状态和采购单的采购状态的两个字段的区别,可以参考yycgd表和yycgdmx表!
在YycgdmxCustom扩展类中扩展4个属性,如下图:
因为采购单明细的受理列表肯定也要支持分页的,所以还需要在映射文件YycgdMapperCustomer.xml中的id=”findYycgdmxCount”中添加采购单的查询条件,如下:
............................................................................. <!--这是只需要引入扩展条件即可 --> |
2.3 service
接口功能:采购单受理列表.
接口参数:usergysid供货商id、year年份、yycgdQueryVo查询条件.
CgdService接口中添加两个方法,如下:
CgdServiceImpl实现类中干的两个方法,如下:
2.4 action
参考查询页面通用模版方法。
在CgdAction类中添加如下两个方法:
2.5 页面
供应商所受理的采购单明细列表的页面所在目录如下:
页面中需要注意几个地方:
2.6 测试
在menu.json中添加如下:
以供货商九州通身份来登录系统,如下:
呈现的页面如下:
3 采购单药品的发货操作
3.1 需求
可以提供两种方式:(参考上面的需求,这里再复习一下)
1. 手动确认发货的方式:需要用户(供货商)在页面挑选要发货的药品,点击“确认发货”,
适用于发货量少的药品。
也是本系统所实现的方式
2. 批量发货的方式:需要用户(供货商)线下整理一个要发货的excel格式的明细文件,通过 批量发货功能,将要发货的清单导入本系统中,
系统会自动解析导入的excel文件中要发货的药品信息,然后,系统会自动执行发货操作。而不需要用户一个个去勾选的操作了!
为了方便用户(供货商)线下整理发货的明细文件,系统提供了“导出待发货清单”的功能,用户(供货商)在待发货清单文件基础上去整理一个发货清单。
本系统的文档中不提供批量发货的功能,只能手动一个个选择来确认发货的方式!
无论是手动选择还是批量发货的方式,约束条件和数据库的操作都是相同的!
约束条件:
当前采购药品状态为1:“未确认送货”,方可执行发货操作
数据库操作:
更新采购单的采购药品状态为2:“已发货”。
3.2 dao
根据采购单id更新采购药品状态为“已发货”。使用逆向工程即可!
3.3 service
接口功能:发货操作.
接口参数:采购单id、药品id。因为这两个字段唯一决定了数据库中采购单基本信息动态表的唯一一条记录!
接口实现:
校验当前采购药品状态为“未确认送货”,方可执行发货操作!
根据采购单id、药品id来更新采购药品状态为“已发货”!
CgdService接口中的如下一个方法:
CgdServiceImpl实现类的如下一个方法:
3.4 action
创建一个批量提交的方法,参考批量提交的方法模版。
分析页面中批量提交的参数:
1. 采购单id:多个参数(在datagrid中定义),因为页面中是由多家医院创建的采购单,所
以id是不同的。如下图:
2. 药品id:多个参数(在datagrid中定义)
使用List<YycgdmxCustom>YycgdmxCustoms接收提交的参数。
CgdAction中添加如下方法:
3.5 页面
在该页面中需要注意一下几个地方:
在datagrid中定义的供货商id和药品id参数的批量参数的定义:
注意:
在datagrid的列定义中,列的标识 field一般情况下不要和其他的field中定义的相同!
因为,首次注册的列定义将作为datagrid中最终的列定义, 后边定义的列信息会无效!
该field的定义是错误的,因为第一个field定义的yycgdbm会覆盖掉下面定义的!
提交的 js方法,如下图:
该js方法所对应的表单为id=yycgddisposeForm,要确保该表单的action编写正确,如下:
3.6 测试
以供货商身份(河南九州通医药有限公司)登录系统:
点击“采购单受理”链接,选择要发货的药品,然后点击“确认发货”,如下:
同时,需要查看数据库中的医药采购单明细动态表yycgdmx中的cgzt字段是否显示为2,显示为2表示状态修改成功!
三 医院采购药品后的入库实现
1 需求
1.1 操作步骤
医院主要完成两个功能:
1. 查询待入库的药品信息!
2.在页面中填写完入库信息并提交!
原型系统中的操作流程如下:
第1步:使用崔庙镇崔庙村医院(cmzcmc)的身份来登录系统
点击“采购入库”链接后,在采购单列表下会查询出所有的待入库的药品信息,如下图:
该页面的字段(例如:医院名称、)中查询的是本医院所采购的药品明细,并且药品的采购状态为“已发货”!如下图:
第2步:填写入库信息,执行入库操作。填写的入库信息包括:
- 入库量:医院收到药品的数量,填写的入库量不能大于采购量!
- 发票号或入库单号:一般情况下是没有发票号(因为通常的做法是后结算,由供货商先发货,在结算时再统一的给如票号)。
同时,为了方便医院管理已入库的药品,医院会将每次入库药品设置一个入库单号。
3. 药品批号:本次发货的药品的批号,在发货箱上可以找到。
4. 药品有效期(年);本药品在本批次的有效期。
要以yycgdrk表中的非空字段来作为参考!
如下图:
1.2 创建采购单入库动态表YYCGDRK
问题:上面的页面中所填写的入库信息该存储问题?
设想:将入库信息存储到采购单明细表yycgdmx中,是否可行?
并且,通过查看yycgdmx表中cgzt采购状态的字段可知,如下:
貌似可以把入库信息存入到yycgdmx采购单明细表中。但是仔细分析的话,有如下问题:
如果在采购单明细表yycgdmx中添加入库信息的字段(例如入库量,药品批号,药品有效期...........),那么这些入库信息的字段是可为空还是不为空呢?
如果这些入库信息的字段不可为null,那么,从数据库完整性上考虑,这样做不合适,
因为,如果你此时在yygcgmx表中执行了一条入库操作,那么入库的信息在该表中的记录就会被保存。将来,如果在该系统中再次执行了创建或者修改采购单明细表的操 作,那么就会导致入库操作的字段被覆盖了!数据的安全就会出现问题!
因为之前的创建采购单的过程中都需要执行入库的操作还没有入库的操作。
因为,那么,如果你在yycgdmx表中又新添加了这些入库信息
的字段,并且把入库信息的字段设置为不为空。那么,在之前创建的采购单的代码中都是有问题的!因为你还要
考虑在创建采购单的过程中哪些不为空的只读。那么,就势必要修改之前的关于采购单的所有代码!很麻烦!
如果把入库信息的字段都设置为可以为空
那么,之前入库操作填写的信息是业务操作的重要信息,将重要信息设置为空,存在数据完全问题。
并且,从业务模块上考虑,入库业务和采购单维护业务就是两个业务,对于不同的业务应该创建不同的表。
根据以上分析的结果可知:需要单独创建一张采购单入库信息表YYCGDRK,该表中的重要字段如下:
1. Id:主键。
2.YYCGDID:采购单id,外键。关联yycgd的主键id。
3.YPXXID:药品id,外键。关联ypxx的主键id。并且,YYCGDID和YPXXID组成了唯一约束.
4. CGZT:采购状态!此字段为统计分析时数据聚合使用(明天的课程会使用该字段).
数据库中的表结构如下:
该表的约束如下:
注意:采购单入库表YYCGDRK也是一张动态表,因此需要遵循创建动态表的规则来进行创建的!
因为数据库中新创建了一张医院采购单的入库信息表YYCGDRK,那么就需要使用逆向工程来来生成针对该表的mapper接口和mapper映射文件!如下:
然后把逆向工程所生成的文件拷贝到相对应的工程中!(不再赘述)
注意:
因为YYCGDRK表也是动态表,因此,依照动态表的创建规则(参考“采购单模块”动态表的创建),把逆向工程生成的YycgdrkMapper.xml文件中的中的所有的表名修改为YYCGDRK${businessyear}。(参考“采购单模块”动态表的 创建).
YYCGDRK表生成动态表的具体步骤如下:
第1步:使如下两个PO类都继承自BusinessBasePo类。
第2步:修改mapper映射文件,批量替换,如下:
要把该映射文件中所有跟yycgdrk表有关的字段都替换成yycgdrk${businessyear}。
2 业务流程小结(重点)
案例:
卫生室A采购了药品Y01的数量是100-------》采购单明细表中采购单001 药品Y01 数量100
供货商(G01) 按医院采购量进行供货,最多发货100,供货商是否可以分多次发货?
如果 要多次发货,采购单明细表和发货信息是一对多关系,需要单独 创建一张发货信息表。
为了降低复杂度,不允许针对一个采购单执行多次发货。
卫生室A按照采购单明细进行入库,医院入库量表示收到的货物数量。
为了降低复杂度,不允许医院针对一个采购单多次入库。
至此,一个流程转完了。但是,如果供货商供货的药品数量只有20个,而医院采购的是100个,那么,对不起,流程转完,只能发20个数量给医院来入库。如果医院还想采购剩下的80个数量的药品,那么就必须重新下采购单,即:流程重新开始!
那么,采购单明细表yycgdmx和入库信息表yycgdrk就是一对一关系(通过唯一约束(采购单id和药品id)) 。
根据采购单信息最终会统计出:采购金额、入库金额(入库金额就是最终的成交金额)。
3 查询待入库的药品信息
查询待入库信息, 查询本医院采购的药品明细,并且,药品的采购状态为“已发货”!
当然,在后面的“统计分析”模块中,会提供一个“交易明细”的功能:该功能会查询出所有已入库,未入库,已发货和未发货的明细信息!
3.1 dao
因为页面中的字段与上节中的“采购单受理和发货的实现”相似,因此可以参考“采购单受理和发货”一节的实现!
Sql语句的约束:
1.医院只查询本医院的采购信息.
2.药品的采购状态为“已发货”.
Sql语句如下(仅供参考):只需要在“采购单受理和发货”需求中的sql语句中添加两个约束条件
select yycgdmx.id yycgdmxid, useryy.id useryyid, useryy.mc useryymc, yycgd.bm yycgdbm, yycgd.mc yycgdmc, yycgd.cjtime, (select info from dictinfo where typecode = '010' and dictcode = yycgd.zt) yycgdztmc, ypxx.id, ypxx.bm, ypxx.mc, ypxx.jx, ypxx.gg, ypxx.zhxs, ypxx.scqymc, ypxx.spmc,
ypxx.jyzt,
(select info from dictinfo where ypxx.jyzt = dictcode and typecode = '003') jyztmc, yycgdmx.zbjg, yycgdmx.jyjg, yycgdmx.cgl, yycgdmx.cgje, yycgdmx.cgzt, (select info from dictinfo where typecode = '011' and dictcode = yycgdmx.cgzt) cgztmc, usergys.mc usergysmc, usergys.id usergysid from yycgdmx2018 yycgdmx, yycgd2014 yycgd, useryy, ypxx, usergys where yycgdmx.yycgdid = yycgd.id and yycgd.useryyid = useryy.id and yycgdmx.ypxxid = ypxx.id and yycgdmx.usergysid = usergys.id
--约束条件1:医院只查询本医院采购信息 and yycgd.useryyid = '1f8b098b-067e-11e3-8a3c-0019d2ce5116'
--约束条件2:药品的采购状态为“已发货” and yycgdmx.cgzt = '2' |
YycgdMapperCustom.xml映射文件中的id="findYycgdmxList"的statement中的两个约束条件都已经存在了,所以不用修改了!
也就是说,不用自定义mapper映射文件,也不需要自定义mapper接口了!
3.2 service
接口功能:查询待入库列表.
接口参数:
- useryyid医院id
- year年份.
- yycgdQueryVo查询条件.
接口实现:需要校验两个约束条件:
1.医院只查询本医院的采购信息.
2.药品的采购状态为“已发货”.
CgdService接口中的两个方法:
CgdServiceImpl实现类中的两个方法
3.3 action
CgdAction中的方法也都是模板方法,参考同上!
CgdAction中添加的两个方法:
3.4 receiveyycgd.jsp页面
该页面注意几个地方:
4 入库的提交
4.1 需求
同上!医院填写入完库信息后,提交入库信息。
约束条件:
1)采购单药品明细状态为“已发货”,方可入库.
2)入库量应该小于等于采购量方可入库。换句话说:采购的药品不一定全部入库!(理解这句话对后面的数据聚 合有很大的帮助)
数据库操作:
1)向入库信息表yycgdrk中插入记录:
注意:入库金额需要自己手动计算,入库金额= 入库量*交易价.
2)更新采购单明细表yycgdmx状态为“已入库”.
4.2 dao
1. 向入库信息表YYCGDRK中插入记录.
2. 根据采购单id和药品id来更新采购单明细表YYCGDMX的采购状态为“已入库”
使用逆向工程
4.3 service
接口功能:入库提交.
接口参数:
- 采购单id
- 药品id
- 入库信息(使用扩展对象yycgdCustom来封装入库信息接收)。
因此,需要提前创建该扩展类,如 下:
CgdService接口中添加的一个如下方法:
CgdServiceImpl实现类的方法如下:
4.4 action
receiveyycgd.jsp页面中提交批量的参数如下:
采购单id:多个参数(在datagrid中定义).
药品id:多个参数(在datagrid中定义).
入库信息:多个参数(在datagrid中定义).
因为使用YycgdrkCustom扩展类中包含了所有的入库信息,那么就在方法中使用List<YycgdrkCustom> yycgdrkCustoms接收页面中批量提交的参数!
因此,就需要在action方法中的包装类YycgdQueryVo中添加该属性,如下图
CgdAction中的方法是模板方法,参考同上!添加的方法如下图
4.5 receiveyycgd.jsp页面
该页面中需要注意几个地方:
1)datagrid中所定义的批量提交的参数,红框内的部分就是需要注意的地方:
2)该页面中form表单提交的action的路径,如下:
该url要与后台的action方法中的url相一致!
3)年份信息的定义
这里暂时硬编码,在讲完dwr的内容后,这里会改动,如下
同时还要注释掉dwr的相关代码,如下
4.6 调试
在menu.json中添加入库菜单,如下
以医院身份登录系统,如下:
四 医院结算和退货流程
1 结算需求
用户(医院)在采购药品结束后,会定期向供货商进行结算。结算流程,类似采购流程。因为只有采购完成后才会结算。
同样的,也需要创建基于动态表的结算单基本信息表和结算单明细表,如下图:
结算流程如下:
第1步:医院创建结算单:
结算单中包括要结算的药品信息,药品信息中要包括:采购单id和药品id,并且这两个字段组成唯一约束。
简单说,就是对哪个采购单所下的哪个药品进行结算。
第2步:用户(医院)提交结算单!监管单位为了省事也不再进行结算监管了!
第3步:供货商处理结算单:
供货商收到货款后就结束了结算流程!
2 退货需求
用户(医院)采购药品结束,用户(医院)对药品可以进行退货操作。
退货流程,类似结算流程。
同样的,也需要创建基于动态表的退货单基本信息表和退货单明细表,如下图
退货步骤如下:
第1步:医院创建退货单:
包括要退货的药品信息(采购单id+药品id),理解为对哪个采购单下哪个药品进行退货。
第2步:医院提交退货单 :
第3步:供货商处理退货单:
供货商收到退的货后结束退货流程
3 结算表和退货表结构
根据结算需求和退货需求,因此需要创建两张表来存储这两个需求中的内容!
3.1 医院结算单表
结算单表分为两张表:YYJSD表和YYJSDMX表(都是动态表)
结算单基本信息表YYJSD:
结算单明细表YYJSDMX:
结算单明细表中有唯一约束如下:
并且,结算单明细表中的YYJSDID是外键,该外键关联与YYJSD结算单基本信息表中的ID主键字段!属于数据库级别的关联关系!
3.2 医院退货单表
同理,退货单表也分为两张表:YYTHD和YYTHDMX(都是动态表)
基本信息表YYTHD
明细表YYTHDMX:
唯 一约束:
该表中的YYTHDID是外键,关联YYTHD的主键id字段!
五 采购单模块的集成测试
之所以很重要,是因为:此集成测试会把流程走一遍,明白了流程之后,既可以测试功能的正确与否,也可以加深业务的理解!
1 什么是集成测试
集成测试: 包括功能的集成测试--->是指页面上的条件是否成立,如下图:
模块功能的集成测试,
系统的集成测试,
通常所说的集成测试一般是系统的集成测试。
集成测试的目标:将系统或模块的业务流程测试通过即可。
下面要进行的集成测试指的是“模块的集成测试”,即完成的是:从创建采购单一直到入库操作,这之间的一系列功能实现!!
2 集成测试的环境准备
准备集成测试环境:该测试环境和生产环境一样的。
注意:为了完全测试出功能的问题,需要将集成测试的数据环境达到安装系统后的初始环境。
如果测试环境内已经有测试数据,就需要将测试数据全部的清空,也就是说需要删除数据库中的所有的测试数据。
准确的说,需要删除如下表中的数据:
delete from gysypml --删除供应商药品目录表中的测试数据
delete from gysypml_control --删除供应商药品目录控制表中的测试数据
delete from yycgdmx2018 --先删除医药采购单明细动态表中的测试数据,因为该表的父表是yycgd,因此必须先删除子表yycgdmx。
delete from yycgd2018 --删除医药采购单动态表中的测试数据
delete from yycgdrk2018 t --删除医药采购入库动态表中的测试数据
注意:因为动态表是由存储过程来调用的,所以动态表的表名会有变化,具体根据实际的数据库中的表名而定!
当使用PL/SQL图形界面操作oracle数据库执行删除操作时,一定不要忘记点击提交事务,如下图所示:
3 制定测试用例
就是要确定测试哪个流程。这里确定测试的是“采购流程”!!
4 准备测试数据
准备的测试数据:测试数据指的是“上边要测试的流程所需要的测试数据”!!
因此,需要使用不同的用户分不同的区域来测试!!!
在开始测试之前,需要使用供货商的身份来登录系统,然后在“供货商药品目录维护”模块中进行药品信息的添加!
这两组用户都需要如此!(因为测试数据都已经被删除了)
1) 第一组用户:
医院用户:cmzcmc(崔庙镇崔庙村卫生室)。
监管单位(卫生院):cmz(崔庙镇卫生院)。
监管单位(卫生局):xyswsj(荥阳市卫生局,对于本系统来说就只有一个)。
供货商:ghsjzt(河南九州通医药有限公司)。
采购单号: 2018100014。
2) 第二组用户:
医院用户:gwzczc (广武镇车庄村卫生室)。
监管单位(卫生院):gwz(广武镇卫生院)。
监管单位(卫生局):xyswsj(因为监管单位只有一个,所以都是相同的)。
供货商:ghsxy (荥阳市医药公司)。
采购单号:2018100015。
5 测试步骤
6 编写集成测试报告文档
集成测试完成后,开发人员需要编写“集成测试报告文档”,开发人员还需要编写“系统部署配置文档”!!
开发人员集成测试通过后,将系统代码及相关文档,提交给测试人员,由测试人员进行测试。
上面的集成测试的相关内容,也可以参考“医药采购系统问题总汇.docx”文档!