如果想要获取相关的源码,笔记,和相关工具,对项目需求的二次开发,可以关注我并私信!!!
四 供货商药品目录的控制功能实现
1 需求
1.1 原型系统操作流程
第1步:必须要以监管单位(卫生局)的身份登陆系统
第2步:监管单位(卫生局)查询所有要控制的供货商药品目录(后台其实要从供货商药品目录控制表gysypml_control中查询)
第3步:选择控制状态,并输入意见,然后提交控制状态和意见,如下
根据昨天文档中的“供应商药品目录的数据模型的优化”一节中的内容可知:
控制表的添加已经被屏蔽,删除也没必要操作!因此,对于控制表的操作只需要更新即可,更新的字段就是control的提交状态!
根据供货商id(usergysid)和药品id(ypxxid)来更新供货商药品供货状态(1:正常,2:暂停)。
数据库中供货商药品目录控制表ghsypml_control的这两个字段如下图:
监管单位(卫生局)对所有的供货商供应药品进行控制,控制其允许供货商供货,或不允许供货商供货!
监管单位(卫生局)查询所有要控制的供货商药品目录信息,然后选择控制状态,最后提交控制状态。
因此,对于供货商药品目录的控制分为两个功能:
- 对于控制记录的查询.
- 提交控制状态.
本系统对于这两个功能是在一个模块中来实现的,即:都是在供货商药品目录模块中来完成的!!
当然,对于控制的功能也可以单独提取出为一个模块!
1.2 约束条件
约束条件:
根据药品id(ypxxid)和供货商id(usergysid)这两个字段来确定的唯一的一条记录必须在供货商药品目录控制表gysypml_control中存在,才可以进行更新操作!
因为这两个参数确定了唯一约束,如下图
如何保证更新的记录存在?
经过需求分析(参考day06的需求分析)可知:在向供货商药品目录表gysypml中插入记录的同时向供货商药品目录控制表gysypml_control中也插入一条记录,且不再删 除。
数据库操作:
插入和删除都不需要操作了(根据之前的分析所得出的结论),那么就剩下更新操作了。
根据药品id和供货商id更新供货商药品目录控制表gysypml_control中的控制状态字段control(1:正常 ,2:暂停).
2 查询所有供货商所供应的药品目录的信息
2.1 dao
2.1.1 sql语句
监管单位卫生局要查询出所有供货商所供应的药品目录的信息。
需要自定义mapper查询所有的供货商药品目录的控制记录.
主查询表:供货商药品目录控制表gysypml_control.
关联查询表:药品信息表ypxx,供货商信息表usergys,数据字典表dictinfo。注意一定不要和gysypml进行关联,因为如果 gysypml中没有数据,监管单位将无法控制,
这是不允许的!
根据上面原型系统页面中的需求,需要查询如下的字段: select gysypml_control.id gysypmlid, --结果集的唯一约束 usergys.id usergysid, usergys.mc usergysmc, gysypml_control.control, --控制状态 (select info from dictinfo where typecode = '008' and dictcode = gysypml_control.control) controlmc, --控制状态名称 gysypml_control.advice, --意见 ypxx.id, ypxx.bm, ypxx.mc, ypxx.jx, ypxx.gg, ypxx.zhxs, ypxx.scqymc, ypxx.spmc, ypxx.zbjg, ypxx.jyzt,
(select info from dictinfo where ypxx.jyzt = dictcode and typecode = '003') jyztmc from gysypml_control, ypxx, usergys where ypxx.id = gysypml_control.ypxxid and gysypml_control.usergysid = usergys.id --没有数据范围的约束条件 |
2.1.2 自定义mapper映射文件
该自定义mapper映射文件的编写比较复杂,一定要参考视频:3供货商药品目录控制查询mapper.flv
该映射文件所在目录如下:
注意,在自定义mapper的GysypmlMapperCustom.xml映射文件中的数据结果集的输出映射类型resultType中所对应的扩展类GysypmlCustom中需要添加advice属性,因为映射文件中有该字段
对于自定查询条件中的“供货商名称”的查询(因为在需求的页面中包含供货商的查询输入框),如下图红框内的部分
建议在“用户模块”中的自定义mapper映射文件SysuserMapperCustom.xml中来定义sql片段(因为sql片段按
照单表定义的可重用性高),那么,需要在SysuserMapperCustom.xml中添加如下定义的sql片段:
同时,还要在在自定义mapper的GysypmlMapperCustom.xml映射文件中的数据结果集的输入映射类型parameterType中所对应的包装类GysypmlQueryVo中需要添加usergys属性,因为映射文件中有该字段,如下定义
2.1.3 自定义mapper接口
2.2 service
接口功能:监管单位卫生局查询出所有供货商药品目录的信息.
接口参数:查询条件(GysypmlQueryVo)。
接口实现:调用mapper查询数据
2.3 action
两个方法中有大量的模板方法,参考“供应商药品目录模块的维护”中action中的供应商添加药品目录查询方法!
方法1:查询页面
方法2:查询列表结果集
2.4 querygysypmlcontrol.jsp页面
老师并没有提供现成的页面,因此需要自己手动编写该页面,在querygysypmlcontrol.jsp页面中充满了大量的模板代码!!!
因此,该页面的编写可以参考:供货商药品目录添加页面queryaddgysypml.jsp和querygysypml.jsp页面的编写。
querygysypmlcontrol.jsp所在目录如下:
2.5 调试
使用监管单位荥阳市卫生局登录,如下:
密码:111111
2.6 分配权限
1.admin登录系统
2.修改“供货目录控制”的url,如下:
3.修改“供货目录控制”下的“供货目录查询”和“供货目录查询结果集”两个链接的url,如下
4.为卫生局角色分配权限,如下:
3 提交控制状态
3.1 需求
监管单位选择供货商,填写意见,选择供货状态,进行提交。参考上节中的“需求”中的“操作流程”一节!
约束条件:确定供货商和药品信息进行控制.
数据库操作:根据供货商和药品信息更新供货商药品目录控制表gysypml_control中的控制字段及意见字段 (1:正常,2:暂停)
3.2 Dao
根据供货商id和药品信息id更新供货商药品目录控制表gysypml_contro的控制状态及意见!
因为是单表操作,所以可以使用逆向工程生成的代码!不必自定义mapper接口了!
3.3 Service
提交控制状态(只处理单个记录).
接口功能:根据供货商id和药品id更新控制状态.
接口参数:
供货商id、
药品id、
控制状态、
意见(1:正常,2:暂停).
接口实现:
校验1:供货商id和药品id在供货商药品目录控制表存在,不存在是无法更新的。
校验2:控制状态值合法性,不是1就是2(1:正常,2:暂停).
执行更新:根据供货商id和药品id更新控制状态.
YpmlService接口中添加方法:
YpmlServiceImpl实现类的方法:
3.4 Action
接收页面中批量提交的控制状态及意见,然后调用updateGysypmlConrol()方法.
方法中的提交参数:
供货商id:从页面接收多个参数(因为需求中的页面中会有多个供货商).
药品信息id:从页面接收多个参数.
控制状态:从页面接收多个参数.
意见:从页面接收多个参数.
因为action方法中的参数需要使用 List<GysypmlControl> gysypmlControls接收上边批量提交的参数,因此需要在包装类GysypmlQueryVo中定义该属性,如下定义:
在YpmlAction中添加如下方法:(该方法是模板方法,参考上一节中的内容)
3.5 页面
修改供货商控制列表页面querygysypmlcontrol.jsp.该页面可以参考:供货商药品目录添加页面queryaddgysypml.jsp。
在datagrid的列定义中定义以下参数:
供货商id:多个参数(从页传递)
药品信息id:多个参数(从页传递)
控制状态:多个参数(从页传递)
意见:多个参数(从页传递)
3.6 调试
如果操作成功,那么“供货状态”会由暂停显示为正常,那么调试算是成功!
3.7 分配权限
第1步:修改“供货目录控制提交”的链接
第2步:为卫生局角色分配权限。
这一步在上面的“查询控制记录”的“分配权限”一节中已经完成了。
五 供货商药品目录模块中开发问题总结
1 不同的功能必须要以对应的用户身份登陆
因为目前为止还没有实现权限管理的功能,所以,针对不同的功能必须要以对应的用户身份登陆.否则,逻辑就会混乱!
例如:如果是供货商的身份登录,那么会显示出供货商的药品目录。
如果是监督单位(卫生局)的身份登录,那么一定要会显示控制表中的药品目录
2 供货商药品目录维护的查询条件实现
需求如下
以查询条件中的“价格范围”为例!
第1步:页面传入起始价格--结束价格--->action—>serviceàdao。
虽然后台的action中使用的GysypmlQueryVo.java包装类来接收起始价格、结束价格的参数,但是建议在包装类中定义的属性ypxxCustom所对应的YpxxCustom扩展类中来定义 起始价格、结束价格。(建议使用Float包装类型), 定义如下
第2步:在页面中采用对象. 属性的方式命名,在querygysypml.jsp页面中的定义如图
第3步:在GysypmlMapperCustom.xml中的添加查询条件,查找到如下语句:
可知:该语句引用的是YpxxMapperCustom.xml文件中的sql片段的定义!所以真正需要修改的是 YpxxMapperCustom.xml 文件中的sql片段的定义,定义如下:
3 供货商药品目录控制功能开发
监管单位查询所有供货商药品目录控制列表:
该功能已经在上面实现了,这里再强调一点:
Sql:
主查询表:gysypml_control(注意一定不要和gysypml进行链接,因为如果 gysypml中没有数据,监管单位将无法控制,这是不允许的!!!!)
主要的sql语句如下:
select
gysypml_control.id gysypmlid,
gysypml_control.ypxxid,
gysypml_control.usergysid,
usergys.mc usergysmc,
gysypml_control.control,
(select info
from dictinfo
where typecode = '008'
and dictcode = gysypml_control.control) controlmc,
ypxx.id,
ypxx.bm,
ypxx.mc,
ypxx.jx,
ypxx.gg,
ypxx.zhxs,
ypxx.scqymc,
ypxx.spmc,
ypxx.zbjg,
ypxx.jyzt,
(select info
from dictinfo
where ypxx.jyzt = dictcode
and typecode = '003') jyztmc
from usergys, gysypml_control, ypxx
where gysypml_control.usergysid = usergys.id
and gysypml_control.ypxxid = ypxx.id
4 供货商药品目录模块的业务流程
第一步:供货商查询自己的药品目录内容
第二步:从药品目录总表中选择药品添加到自己的目录(正常使用时,供应商会将药品目录总表的内容全部添加到自己的目录)
第三步:如果供货商不再供货商就从供货商药品目录中删除(供货商平常使用不多)
第四步:监管单位登陆对供货商药品目录进行控制,其对药品的控制状态不受供货商对药品目录操作影响。
就是说,如果供货商删除了该药品的供货状态,不影响监管单位对该药品的控制!