1. 药品目录 导入功能开发
监督单位,卫生局,进行药品目录 导入。
从省级平台导入的药品中标目录为什么进行修改、添加?
因为省平台的药品目录 数据量很大,市平台不需要这么多数据,进行调整。
1.1 需求
用户线下按照导入文件模版编写excel文件(03 版本),将药品目录 导入系统中。
第一步:进入导入页面
内容包括:导入说明
提供导入模版:
包括导入说明、导入工作表模版(列顺序固定)
第二步:下载导入模版
用户按照模版的导入说明,直接在模版中填写要导入的数据。
第三步:选择导入文件,执行导入操作
1.2 实现
1.2.1 dao
向药品目录 插入记录。
Ypxx表中,bm值通过触发器实现(使用序列,在插入之前通过触发器得一个序列值,实现自增主键)
create or replace trigger generator_ypxxbm
before insert on ypxx
for each row
declare
-- local variables here
begin
select ypxxbm.nextval into :new.bm from dual;
end generator_ypxxbm;
1.2.2 service
接口功能:药品目录导入
接口参数:要实现HxlsOptRowsInterface
实现:
校验导入的数据
校验通过调用dao插入操作。
在applicationContext-business-service.xml配置
1.2.3 action
包括两个方法:
导入页面显示方法
导入提交方法:
将文件上传到服务器(实现文件上传)
调用HSSF事件驱动封装类,导入药品目录
要通过springmvc进行文件上传,需要在springmvc.xml配置文件上传的参数解析器。
1.2.4 页面
导入页面:
导入模版下载、
导入说明文字
导入文件上传选择组件
1.2.5 药品导入调试
导入结果中有导入成功数量、导入失败数量,导入失败原因 。
导入失败原因如何展示给用户:
包括失败原因和具体失败记录。
为了方便用户对失败的记录重新修改后提交,在导入结果中,提示“导出失败记录的链接”,用户点击此链接导出失败记录(excel文件,符合excel导入模版),在失败记录文件最后一列为“失败原因”,显示具体失败原因。
对于失败记录处理:
第一步:用户下载失败记录文件(excel文件,符合excel导入模版),内容都是失败记录
第二步:用户参数此文件中失败原因列的内容,修改记录
第三步:将修改后失败记录文件,重新导入。
实现:
在导入action中,获取导入失败记录及导入失败原因。
在导入action中,将失败记录及失败原因导出一个excel,将链接提供给用户下载。
2. 供货商药品目录模块
2.1 需求
供货商需要将自己供应的药品信息添加到供货商药品目录中,药品目录中存在药品说明供货商要供应这些药品,医院按照供货商供应药品去采购。
监督单位可以对供货商供应的药品进行控制,允许供货商供货,或不允许供货商供货。
操作流程:
第一步:使用供货商登陆系统,点击“供货商药品目录维护”
显示了供货商药品目录 信息。
第二步:向供货商药品目录 添加药品,添加的药品表示供货商要供应的药品
供货商查询药品目录 ,从里边选择要供应的药品
第三步:供货商对不再供应的药品,从供货商药品目录 删除
供货商药品目录 控制:
第一步:卫生局进入供货目录 控制页面
列出所有供货商供应的药品
第二步:对供货药品进行控制
修改供货状态,提交(批量)供货状态。
2.2 分析供货商药品目录数据模型
数据库表结构、及表与表的关系。
2.2.1 供货商药品目录维护(增、删、改、查)
供货商需要将自己供应的药品信息添加到供货商药品目录中,药品目录中存在药品说明供货商要供应这些药品,医院按照供货商供应药品去采购。
功能分析:
供货商添加药品目录
说明供货商要供应这些药品
向供货商药品目录表插入一条数据
供货商修改药品目录
供货商删除药品目录
供货商不再供货从供货商药品目录表删除记录,根据供货商id和药品信息id删除记录
供货商药品目录表:
Id:主键
供货商id:外键,引用供货商单位表的主键
药品信息id: 外键,药品信息表的主键
唯一约束:(供货商id+药品信息id)
2.2.2 供货商药品目录控制
监督单位可以对供货商供应的药品进行控制,允许供货商供货,或不允许供货商供货。
原则:对于不同的业务分析时,优先考虑单独创建表。
功能分析;
将供货商供应药品信息添加到供货商药品目录控制表
表示:监督单位要对供货商供应的药品进行控制
根据供货商和药品修改供货状态(允许供货商供货,或不允许供货商供货)
表示:监督单位执行控制
将供货商供应药品信息从供货商药品目录控制表删除:
表示:监督单位不再对供货商供应的药品进行控制
供货商药品目录控制表:
Id:主键
供货商id:外键,引用供货商单位表的主键
药品信息id: 外键,药品信息表的主键
供货状态:(1、正常、2、暂停供货)
2.2.3 数据模型优化
2.2.3.1 设想:将供货状态添加到供货商药品目录表:
结构如下:
Id:主键
供货商id:外键,引用供货商单位表的主键
药品信息id: 外键,药品信息表的主键
唯一约束:(供货商id+药品信息id)
供货状态:(1、正常、2、暂停供货)
是否可行?需要再将上边业务功能进行论证。
供货商药品目录维护功能分析:
供货商添加药品目录
说明供货商要供应这些药品
向供货商药品目录表插入一条数据
供货商修改药品目录
供货商删除药品目录
供货商不再供货从供货商药品目录表删除记录,根据供货商id和药品信息id删除记录
问题:业务冲突,供货商操作影响了监督单位的操作
供货商药品目录控制功能分析;
将供货商供应药品信息添加到供货商药品目录表
表示:监督单位要对供货商供应的药品进行控制
问题:业务冲突,供货商不想供应此药品,结果记录也存在了
总结:
将供货商药品目录信息和供货商药品目录控制信息存在业务冲突。
供货商药品目录维护和供货商药品目录控制是两个不同的业务。
2.2.3.2 进行如下优化:
监督单位对供货商进行控制,不受供货商药品目录的影响,监督单位可以在任何时候对供货商的药品进行控制。
这种控制业务在功能分析流程上没有问题,但是没有多大意义,因为供货商不供应此药品,医院也就不能采购。
在供货商向自己药品目录添加药品的同时,向供货商药品目录控制表添加一条记录。
供货商药品目录维护功能分析:
供货商添加药品目录
说明供货商要供应这些药品
向供货商药品目录表插入一条数据
同时,供货商药品目录控制表添加一条记录
供货商删除药品目录
供货商不再供货从供货商药品目录表删除记录,根据供货商id和药品信息id删除记录
供货商药品目录控制功能分析;
将供货商供应药品信息添加到供货商药品目录控制表
表示:监督单位要对供货商供应的药品进行控制
通过优化,此添加功能可以不要
根据供货商和药品修改供货状态(允许供货商供货,或不允许供货商供货)
表示:监督单位执行控制
将供货商供应药品信息从供货商药品目录控制表删除:
表示:监督单位不再对供货商供应的药品进行控制
此功能去掉,不管是否对供货商药品进行控制,都在数据库保留。
数据量是否很大?数据量不大,数据量=药品目录的总数*供货商数量
优化图解:
2.2.3.3 表结构
供货商药品目录表:GYSYPML
供货商药品目录控制表:GYSYPML_control
2.2.3.4 表之间的关系
两个表之间没有数据级别的关系,存在业务关系。
存在业务关系:
供货商要查询目录中药品的供货状态?查询方法:通过关联供货商药品目录控制表查询,通过内链接查询供货商药品目录控制状态。
--gysypml表中的数据在gysypml_control表中都存在
--通过唯一约束关联查询(只能查询到一条)
--查询记录的条数等于gysypml表的查询记录条数
--因为gysypml表主查询表
select *
from gysypml, gysypml_control
where gysypml.ypxxid = gysypml_control.ypxxid
and gysypml.usergysid = gysypml_control.usergysid
--通过子查询
select gysypml.*,
(select control
from gysypml_control
where gysypml.ypxxid = gysypml_control.ypxxid
and gysypml.usergysid = gysypml_control.usergysid) control
from gysypml
2.2.4 数据库操作小结
两张表:
供货商药品目录表:gysypml:
记录了供货商供应的药品信息,如果表中存在药品是供货商要供应的药品,如果表中不存在药品,供货商不供应的药品
医院采购药品时从此表找供货商供应药品找到说明供货商要供应此药品,还需要满足监督单位允许供货商供货。(如何查询是否允许供货?通过供货商id和药品id查询gysypml_control,查出供货状态)
医院能采购的药品:在gysypml存在且gysypml_control表中状态为允许供货。
供货商药品目录控制表:gysypml_control
记录了监督单位对供货商供货的控制状态。
两张表操作应该互不影响(因为两张表属于不同的业务);
两张表进行优化:在向gysypml插入记录的同时,向gysypml_control表插入一条记录。
供货商药品目录维护:
对gysypml操作:
添加记录,说明供货商要供应药品。
向gysypml_control表插入一条记录
删除记录,说明供货商不再供应此药品。
从gysypml_control表删除一条记录??不需要删除
供货商药品目录控制:
对gysypml_control操作:
根据供货商id和药品id更新供货状态(1:正常、2:暂停)
3. 常用Sql查询
表A和表B要做关联查询:
表A当成主查询表:查询记录主体从主查询表出
表B关联 表
3.1 内链接关联查询:
如果表A和表B有一个外键关联 ,可以通过外键进行内链接查询
select dictinfo.*, dicttype.typename
from dictinfo, dicttype
where dictinfo.typecode = dicttype.typecode
–不通过外键,通过groupid查询 用户类型的代码结果集,只能查询出一条记录,可以使用内链接
select sysuser.*, dictinfo.info
from sysuser,
(select dictcode, typecode, info from dictinfo where typecode = ‘s01’) dictinfo
where sysuser.groupid = dictinfo.dictcode
小结:如果主查询表字段从关联表只查询出一条记录,这个字段就可以作为内链接关联字段
–内链接的错误的例子,通过关联查询出重复记录
–使用groupid从select dictcode, typecode, info from dictinfo可以找到多个记录,不能使用内链接,可能会出现重复记录
select sysuser.*
from sysuser, (select dictcode, typecode, info from dictinfo) dictinfo
where sysuser.groupid = dictinfo.dictcode
注意:如果使用内链接查询出现重复记录,首先去思考是否是sql写错了,不能直接去使用distinct去除重复记录。
有一些特殊情况下还是需要使用distinct去除重复记录,比如复杂的统计分析sql。
3.2 外链接关联查询:
表A,表B中只有一部分数据和表A匹配,不能使用内链接。
主查询是表A,只能使用外链接。
–查询用户所属单位,sysid对应三张表的id
select sysuser.*,useryy.mc from sysuser left join useryy on sysuser.sysid = useryy.id
select * from useryy right join sysuser on sysuser.sysid = useryy.id
–以上的需要不能使用内链接
select sysuser.*,useryy.mc from sysuser, useryy where sysuser.sysid = useryy.id
小结:
表A中从表B中只能关联查询一部分数据,只能使用外链接
3.3 子查询
select sysuser.*,
(select * from useryy where id = sysuser.sysid)
from sysuser
子查询只能返回一列,否则 :
子查询只允许返回一行,否则 :
正确的sql:
--子查询
--根据sysid取出单位名称
--根据groupid查询用户类型代码对应的名称
select sysuser.*,
(select mc from useryy where id = sysuser.sysid)sysmc,
(select info from dictinfo where dictcode = sysuser.groupid and typecode = 's01')groupname
from sysuser
3.4 嵌套表
可以将一个sql查询结果组成一个虚表,查询方式和查询一个实体表相同的。
组成的虚拟表字段是不允许重复的,否则 :
4. 供货商药品目录维护查询
4.1 需求:
使用供货商登陆系统,点击“供货商药品目录维护”
显示了供货商药品目录 信息。
4.2 实现
4.2.1 Dao
自定义查询条件,查询供货商药品目录,供货商只允许查询到本供货商供应的药品信息
自定义mapper:
Sql:
主查询表:gysypml(供货商药品目录表),查询结果数量根据主查询表来定。
关联查询表:供货商名称(usergys)、供货状态(gysypml_control),药品信息(ypxx)
select gysypml.ypxxid,
gysypml.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 gysypml, usergys, gysypml_control, ypxx
where gysypml.usergysid = usergys.id
and gysypml.ypxxid = gysypml_control.ypxxid
and gysypml.usergysid = gysypml_control.usergysid
and gysypml.ypxxid = ypxx.id
--数据范围权限
and gysypml.usergysid = '5197cdd2-08cf-11e3-8a4f-60a44cea4388'
4.2.2 Service
接口功能:供货商查询供货商自己药品目录信息
接口参数:供货商id(数据范围权限),查询条件
4.2.3 Action:
4.2.4 调试
错误:
Caused by: org.apache.ibatis.reflection.ReflectionException: There is no getter for property named ‘ypxxCustom’ in ‘class yycg.business.pojo.vo.GysypmlQueryVo’
at org.apache.ibatis.reflection.Reflector.getGetInvoker(Reflector.java:377)
执行mapper查询时,查询条件需要从’ypxxCustom’获取属性值 ,调用parameterType指定对象的getter方法。
解决,向包装对象中添加ypxxcustom属性。
5. 供货商药品目录添加查询
5.1 需求 :
供货商查询药品目录(ypxx) ,从里边选择要供应的药品.
查询列表中将供货商药品目录 中的药品过虑掉。
5.2 实现
5.2.1 dao
供货商药品添加目录查询,查询药品目录表,查询列表中将供货商药品目录已经存在药品过虑掉。
Sql:
主查询表:ypxx表
关联查询表:在where条件 中,过虑掉供货商药品目录 表的记录
select 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
--子查询,关联查询到说明此药品id在供货商药品目录存在
--(select id from gysypml where usergysid='5197cdd2-08cf-11e3-8a4f-60a44cea4388' and ypxx.id = gysypml.ypxxid) gysypmlid
from ypxx
--查询子查询不为空的值
where not exists(select id from gysypml where usergysid='5197cdd2-08cf-11e3-8a4f-60a44cea4388' and ypxx.id = gysypml.ypxxid)
5.2.2 service
接口功能:供货商药品添加目录查询
接口参数:查询条件,供货商id
5.2.3 action
5.2.4 调试