1. 供货商药品目录删除
1.1 需求
供货商对不再供应的药品从供货商的药品目录删除。
约束条件:
此药品在供货商药品目录存在方可删除
数据库操作:
从供货商药品目录删除记录
1.2 实现
1.2.1 dao
根据药品信息id和供货商id删除供货商药品目录表记录。
单表操作使用逆向工程生成的代码。
1.2.2 service
接口功能:药品信息id和供货商id删除供货商药品目录表记录
接口参数:药品信息id、供货商id
接口实现:
校验删除的药品是否在供货商药品目录存在
调用mapper执行数据库操作
1.2.3 action
从页面接收到提交的批量参数:
包括:
供货商id:单个参数(从session取出)
药品信息id:多个参数(从页面提交)
1.2.4 页面
修改供货商药品目录维护列表页面:querygysypml.jsp
批量参数的定义:
药品信息id:在datagrid中定义hidden。
Datagrid的json主键定义:
Js方法:
1.2.5 调试
使用datagrid的getSelections获取当前所有选中的行,要求Datagrid定义时指定json结果集的唯一约束:
2. 供货商药品目录控制
2.1 需求
监管单位对所有的供货商供应药品进行控制,允许供货商供货,或不允许供货商供货。
约束条件:
药品id和供货商id在供货商药品目录控制表存在。
如何保证更新的记录存在?
供货商药品目录插入记录的同时向供货商药品目录控制表也插入一条记录,且不再删除。
数据库操作:
根据药品id和供货商id更新供货商药品目录控制表中控制状态(1:正常 ,2:暂停)
操作流程:
监管单位登陆系统
查询要控制的供货商供应的药品信息(从供货商药品目录控制表查询)
选择控制状态,输入意见,提交控制状态和意见
2.2 查询控制记录
2.2.1 dao
自定义mapper查询控制记录(所有的供货商药品记录)
Sql:
主查询表:供货商药品目录控制表
关联查询表:药品信息表,供货商信息表,数据字典表
select 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
mapper定义:
2.2.2 service
接口功能:监管单位查询控制记录(所有的供货商药品记录)
接口参数:查询条件
2.2.3 action
方法1:查询页面
方法2:查询列表结果集
2.2.4 页面
2.3 提交控制状态
2.3.1 需求
监管单位选择供货商,填写意见,提交。
约束条件:
确定供货商和药品信息进行控制
数据库操作:
根据供货商和药品信息更新控制状态及意见
2.3.2 dao
根据供货商id和药品信息id更新供货商药品目录控制表的控制状态及意见
2.3.3 service
接口功能:根据供货商id和药品信息id更新供货商药品目录控制表的控制状态及意见
接口参数:供货商id、药品信息id、控制状态、意见
注释:可以控制状态、意见封装到单独的控制信息pojo类中。
2.3.4 action
调用updateGysypmlConrol()方法,提交控制状态及意见:
提交参数:
供货商id:多个参数(从页传递)
药品信息id:多个参数(从页传递)
控制状态:多个参数(从页传递)
意见:多个参数(从页传递)
确定 使用private List gysypmlControls接收上边批量参数。
2.3.5 页面
修改供货商控制列表页面,queryGysypmlContro.jsp
在datagrid的列定义中定义以下参数:
供货商id:多个参数(从页传递)
药品信息id:多个参数(从页传递)
控制状态:多个参数(从页传递)
意见:多个参数(从页传递)
提交事件:
3. 药品名称查询
考虑用户群,实现功能开发。
对药品查询,输入药品中文名称很不方便的,采用让用户输入药品通用名拼音的首字母进行搜索。
实现方法:
在向ypxx表中导入数据/添加数据/更新数据时,通过Pinyin4j组件将通用名(汉字)转成拼音(多音字组合),
将拼音存储到ypxx表中pinyin字段,用户输入拼音根据此字段进行模糊查询。
4. 采购药品明细保存
4.1 需求
用户将药品添加到采购单中,首先确定药品的采购量。
操作方法:
进入采购单修改页面
输入药品的采购量
点击“ ”
约束条件:
指定采购单下的药品设置采购量
设置采购量必须是大于0的数
数据库操作:
采购量:页面录入
采购金额:交易价格*采购量
根据采购单id和药品id更新采购单明细表中采购量、采购金额。
4.2 dao
根据采购单id和药品id更新采购单明细表中采购量、采购金额
4.3 service
接口功能:根据采购单id和药品id更新采购单明细表中采购量、采购金额
接口参数:采购单id、药品id、采购量(将此字段封装到pojo对象中)
4.4 action
批量提交参数:
采购单id:单个(在form中定义hidden)
药品id:多个参数(datagird中定义hidden)
采购量:多个参数(datagird中定义hidden)
使用List yycgdmxCustoms接收批量参数
4.5 页面
修改editcgd.jsp
在采购单明细的form中添加:
药品id参数定义:
保存js方法:
对采购单明细表单进行提交。
5. 采购药品明细删除
5.1 需求
在提交采购单之间,医院如果不对某药品进行采购需要从采购单中删除此药品。
约束条件:
此药品必须在采购单明细中存在方可删除。
数据库操作:
根据采购单id和药品id从采购单明细表中删除记录。
5.2 分析
5.2.1 dao
根据采购单id和药品id从采购单明细表删除记录。
5.2.2 service
接口功能:删除采购药品明细
接口参数:采购单id、药品id
接口实现:
校验:此药品必须在采购单明细中存在方可删除
操作:调用 mapper删除采购单明细记录。
5.2.3 action
批量提交参数:
采购单id:单个参数(在form中定义hidden)
药品id:多个参数(在datagrid中定义hidden)
5.2.4 页面
需要修改:editcgd.jsp页面
6. 采购单另存为
6.1 需求
为了方便用户创建采购单,依据之前做的采购单另存一个新的采购单,实现目的:采购药品明细就是原始采购单药品明细。
6.2 分析
实现步骤:
先查询出原始采购单内容(为了得到采购明细信息)
用户点击“采购单另存为”按钮
新创建一个采购单:
向采购单基本信息表插入记录(一条记录)
将上边查询出来的原始采购单的明细信息,依次作为新采购单明细插入采购单明细表。
6.2.1 dao
1、 采购单的id查询采购明细列表
2、 向采购单基本信息表插入一条记录
3、 向采购单明细信息表插入一条记录
6.2.2 service
接口功能:采购单另存为
接口参数:采购单id
接口实现:
实现步骤:
先查询出原始采购单内容(为了得到采购明细信息)
用户点击“采购单另存为”按钮
新创建一个采购单:
向采购单基本信息表插入记录(一条记录)
将上边查询出来的原始采购单的明细信息,依次作为新采购单明细插入采购单明细表。
7. 医院常用药品目录维护
7.1 需求
为了方便医院创建采购单,医院将自己的常用药(来源于本区域供货商药品目录中)添加到自己药品目录中。
医院在创建采购单时就直接从自己的药品目录找药品信息。
7.2 分析
创建医院药品目录表。
操作步骤:
查询本区域供货 商药品目录信息
从中挑选常用药品
将挑选的常用药品添加到医院药品目录。
如果要删除常用就从医院药品目录删除记录。
8. 采购单维护列表
8.1 需求
医院通过采购单维护列表,对自己创建的采购单进行维护(增、删、改、查)。
约束条件:
确定查询年份
确定医院
8.2 实现
8.2.1 dao
自定义条件查询采购单列表。
Sql:
主查询表:采购单基本信息表
关联查询表:医院,数据字典
select
useryy.mc useryymc,
yycgd.*,
(select info from dictinfo where typecode='010' and dictcode=yycgd.zt)yycgdztmc
from yycgd2014 yycgd,useryy where yycgd.useryyid = useryy.id
and useryy.mc like '%卫生室%'
--限制只查询某个医院的采购单
and yycgd.useryyid = '1f8b098b-067e-11e3-8a3c-0019d2ce5116'
8.2.2 service
接口功能:医院查询采购单列表
接口参数:查询条件
8.2.3 action
8.2.4 页面
日期控制使用:
详细参见:My97DatePicker使用说明文档.doc
8.2.5 调试
8.2.5.1 查询条件中年份下拉框:
下拉框内容是动态的,根据用户需求显示近几年的年份。
明天使用DWR的ajax框架实现。
8.2.5.2 Springmvc中对日期类型的属性转换问题
springmvc属性编辑器:
对于日期类型的属性转换通过注入属性编辑器。
可以在action类中通过@Binder注解注册属性编辑器。
通过自定义属性编辑类方法,定义属性编辑器。
定义方法:
需要实现implements Converter<String, java.util.Date>
String就是原始类型
java.util.Date就是目标类型
目标:
将页面输入的开始采购时间cjtime_start(原始类型),向YycgdCustom类中java.util.Datecjtime_start属性(目标类型)赋值,需要将原始类型字符类型转成日期java.util.Date。
注意 :属性编辑器中目标类型和对象中属性类型一致。
接口方法:
public Date convert(String source) {
如果原始类型转换目标类型成功,通过return 向对象的属性赋值。
如果原始类型转换目标类型不成功,通过return 向对象的属性赋值为null.
日期类型转换的属性编辑器:
public class DateConverter implements Converter<String, Date> {
public Date convert(String source) {
if(source != null){//如果从浏览器传入字符串不等于开始转换
source = source.trim();//去除前后空格
if(source.equals("")){
source = null;
}
if(source!=null){//去除空格后不为空则开始转换
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
try {
return simpleDateFormat.parse(source);
} catch (ParseException e) {
// TODO Auto-generated catch block
e.printStackTrace();
return null;
}
}
}
return null;
}
}
配置属性编辑器:
在springmvc.xml中配置:
<!-- 注解驱动 -->
<mvc:annotation-driven conversion-service="conversionService">
</mvc:annotation-driven>
<!-- 自定义注册属性编辑器 -->
<bean id="conversionService"
class="org.springframework.format.support.FormattingConversionServiceFactoryBean">
<property name="converters">
<list>
<bean class="yycg.base.action.converters.StringTrimConverter" />
<bean class="yycg.base.action.converters.DateConverter" />
<bean class="yycg.base.action.converters.DatetimeConverter" />
</list>
</property>
</bean>
8.2.6 自定义的参数解析器
Springmvc调用action方法过程,通过参数解析器:
Springmvc自带了很多的参数解析器,一般能满足需求。
可以自定义参数解析器:
需求:
从session中取当前用户身份信息。
实现:
通过形参定义ActiveUser activeUser,需要由参数解析器来解析这个值,
解析过程:从session取出activeUser给形参赋值。
自定义参数解析器方法:
实现:implements WebArgumentResolver
public class UserArgumentResolver implements WebArgumentResolver {
//methodParameter存储action方法的参数信息
//webRequest是springmvc封装对象,通过此对象获取request和session等域的值
@Override
public Object resolveArgument(MethodParameter methodParameter,
NativeWebRequest webRequest) throws Exception {
//如果参数的类型是activeUser从session中取当前用户信息设置到action方法形参上
if(methodParameter.getParameterType().equals(ActiveUser.class)){
//从session中取当前用户信息
ActiveUser activeUser = (ActiveUser) webRequest.getAttribute(Config.ACTIVEUSER_KEY, WebRequest.SCOPE_SESSION);
return activeUser;//将参数值向action的方法形参赋值
}
return UNRESOLVED;
}
}
配置自定义的参数解析器:
在springmvc.xml中配置:
<mvc:annotation-driven conversion-service="conversionService">
<mvc:argument-resolvers>
<bean class="yycg.base.action.converters.UserArgumentResolver"/>
</mvc:argument-resolvers>
</mvc:annotation-driven>
8.2.7 修改链接
由于修改窗口较大,新开的标签窗口。
function yycgdedit(bm){
var sendUrl = "${baseurl}cgd/editcgd.action?id="+bm;
parent.opentabwindow(bm+'采购单修改',sendUrl);//打开一个新标签
}
8.2.8 维护功能和查询功能区别
维护功能:增、删、改、查
查询功能:仅查询
采购单维护功能:给医院使用的,医院对自己创建的采购单进行维护。
通常实现时,让用户通过维护可以查询所有信息。
采购单查询功能:给监管单位和医院用户使用,卫生局可以查询所有医院下的采购单,卫生院可以查询本区域医院创建的采购单,医院只查询自己创建 采购单
通常实现时,让用户通过查询功能仅查询有权限看见的内容。
通常将查询功能和维护功能分别开发。
9. 采购单提交
9.1 需求
用户创建完成采购单,不再修改,执行提交操作,提交后由监管单位审核。
约束条件:
采购单已添加采购药品,且采购量等信息已填写。方可提交采购单。
采购单在未提交或审核不通过时方可执行提交操作。
数据库操作:
根据采购单号更新采购单状态,更新为2:已提交未审核
9.2 实现
9.2.1 dao
根据采购单号更新采购单状态,更新为2:已提交未审核
9.2.2 service
接口功能:采购单提交
接口参数:采购单id
接口实现:
校验:
采购单已添加采购药品,且采购量等信息已填写。方可提交采购单。
方法:根据采购单id查询采购单明细,进行信息判断校验。
采购单在未提交或审核不通过时方可执行提交操作。
方法:得到采购单状态,进行校验。
操作:
根据采购单号更新采购单状态,更新为2:已提交未审核
9.2.3 Action:
修改editcgd.jsp页面,增加“提交”js方法。
执行form提交,将采购单id传入action方法。
调用service提交 采购单。
9.2.4 页面
提交成功后,刷新 本页面。
在“提交”按钮显示处添加if判断(如果采购单状态为未提交或审核不通过显示提交按钮)
采购单明细操作按钮:
添加if判断(如果采购单状态为未提交或审核不通过显示操作按钮)