我们要实现的功能是:
我们上一篇文章中我们看到如上所示:这个列表里面都是空的。我们本文要做的就是往里面添加数据。
先演示一下流程:
按一下“采购药品添加”按钮执行如下代码:
@RequestMapping("/queryaddyycgdmx") public String queryaddyycgdmx(Model model,String yycgdid)throws Exception { List<Dictinfo> yplblis=systemConfigService.findDictinfoByType("001"); model.addAttribute("yycgdid", yycgdid);//将采购单id传到页面上 model.addAttribute("yplblis", yplblis); return "/business/cgd/queryaddyycgdmx"; }
进入到:"/business/cgd/queryaddyycgdmx";页面:
在queryaddyycgdmx.jsp页面看到
上面就是流程。显示的数据就是我们能添加到采购单里面的数据。
下面看具体的实现。
----------------------------------------------------------------------------------------------------------------------------------------------
我们先写sql语句:
我们可以看到上面的显示包括了:
医院,流水号,通用名,剂型,规格,转换系数,中标价,交易状态,交易价.......等我们要做的就是把这些数据从各自的表里面查找出来。
和之前的在药品控制表里面的思路一样。
1:我们要添加的数据必须是在我们的明细表里面是不存在的。也就是将采购单中已经存在的药品过虑掉,我们可以向 sql中传入采购单id,来实现这个效果
2:只查询医院本区域供货商的药品目录,做法是:向sql中传入医院的区域id。
我们要关联的表是:gysypml(供货商的药品目录),gysypml_control(供货商药品目录控制表),ypxx(药品信息表),usergys(供货商表)
因为医院是采购方,采购方要采购的药品是供货商提供的。所以查询的主表是供货商的药品表。
如下:
select gysypml.id gysypmlid, usergys.mc, usergys.id usergysid, ypxx.bm ypxxbm, ypxx.scqymc ypxxscqmc, ypxx.spmc ypxxspmc from gysypml,gysypml_control,ypxx,usergys where gysypml.ypxxid=ypxx.id and gysypml_control.usergysid=usergys.id and gysypml.ypxxid=gysypml_control.ypxxid and gysypml.usergysid=gysypml_control.usergysid--在写这个语句的时候没有意识到为什么要gysypml.ypxxid=gysypml_control.
--ypxxid和gysypml.usergysid=gysypml_control.usergysid --因为ypxxid和usergysid两个一起才是唯一的主键
-- 这边还要再加两个条件。一个是gysypml.usergysid(供货商)是要在本地区的。二是想要添加的供货商的药品id(ypxxid)不存在采购单里面。
and gysypml.usergysid in( select usergysarea.usergysid from usergysarea where '1.1.16.' like usergysarea.areaid || '%') --将采购单中药品过虑掉 --2014101040就是采购单id and gysypml.ypxxid not in( select yycgdmx.ypxxid from yycgdmx2014 yycgdmx where yycgdmx.yycgdid = '2014101040' )
上面语句的查询结果:
接下里我们可以写Mapper.xml了。
代码如下:
<select id="findAddYycgdmxList" parameterType="yycg.business.pojo.vo.YycgdQueryVo" resultType="yycg.business.pojo.vo.YycgdmxCustom"> <!-- 分页头 --> <if test="pageQuery!=null"> select page_2.* from (select page_1.*, rownum page_num from ( </if> select gysypml.id gysypmlid, 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,gysypml_control,ypxx,usergys where gysypml.ypxxid=ypxx.id and gysypml_control.usergysid=usergys.id and gysypml.ypxxid=gysypml_control.ypxxid and gysypml.usergysid=gysypml_control.usergysid <include refid="yycg.business.dao.mapper.YpxxMapperCustom.query_ypxx_where" /> <!-- 传入供应商的id,供应商只能看到自己供应的药品,所以需要传入供应商的id --> <include refid="yycg.business.dao.mapper.GysypmlMapperCustom.query_gysympl_where"></include> <!-- 根据 --> <include refid="yycg.business.dao.mapper.GysypmlMapperCustom.query_gysypmlcontrol_where" /> and gysypml.usergysid in( select usergysarea.usergysid from usergysarea where #{useryy.dq} like usergysarea.areaid || '%') and gysypml.ypxxid not in( select yycgdmx.ypxxid from yycgdmx${businessyear} yycgdmx where yycgdmx.yycgdid = #{yycgdCustom.id} ) <!-- 分页尾 --> <if test="pageQuery!=null"> ) page_1 <![CDATA[ where rownum <= ${pageQuery.PageQuery_end}) page_2 where page_2.page_num >= ${pageQuery.PageQuery_start} ]]> </if> </select>
这样子就相当于把Dao层写好了。我们接下来就是写Service层,这一层的话我们就要根据Dao层的参数而传入参数。
我们的参数传递永远是先写Dao层,然后从Dao层知道需要的参数,然后在Servce得到那些参数,最后在Acion层中根据Service传入参数。
很明显我们在iDao层是需要医院的id的。因为我们只查询医院本区域供货商的药品目录。
我们还要传入年份,这样才能查找分表。
也就是把这个参数全部封转在封装类中。
Service层:
:
查找采购单详细表的函数
@Override public List<YycgdmxCustom> findAddYycgdmxList(String useryyid, String yycgdid, YycgdQueryVo yycgdQueryVo) throws Exception { Useryy useryy=useryyMapper.selectByPrimaryKey(useryyid);//根据医院的id得到医院的对象 String dq=useryy.getDq();//根据医院的对象得到医院的区域id Useryy useryy2=yycgdQueryVo.getUseryy(); if(useryy2==null) { useryy2=new Useryy(); } useryy2.setDq(dq); yycgdQueryVo.setUseryy(useryy2); YycgdCustom yycgdCustom=yycgdQueryVo.getYycgdCustom(); if(yycgdCustom==null) { yycgdCustom=new YycgdCustom(); } yycgdCustom.setId(yycgdid); String year=yycgdid.substring(0,4); yycgdQueryVo.setBusinessyear(year);//设置年份 yycgdQueryVo.setYycgdCustom(yycgdCustom); List<YycgdmxCustom> YycgdmxCustoms=yycgdMapperCustom.findAddYycgdmxList(yycgdQueryVo); return YycgdmxCustoms; }
查找采购单详细表的数量的函数(用来分页用的)
@Override public int findAddYycgdmxCount(String useryyid, String yycgdid, YycgdQueryVo yycgdQueryVo) throws Exception { Useryy useryy=useryyMapper.selectByPrimaryKey(useryyid);//根据医院的id得到医院的对象 String dq=useryy.getDq();//根据医院的对象得到医院的区域id Useryy useryy2=yycgdQueryVo.getUseryy(); if(useryy2==null) { useryy2=new Useryy(); } useryy2.setDq(dq); yycgdQueryVo.setUseryy(useryy2); YycgdCustom yycgdCustom=yycgdQueryVo.getYycgdCustom(); if(yycgdCustom==null) { yycgdCustom=new YycgdCustom(); } yycgdCustom.setId(yycgdid); String year=yycgdid.substring(0,4); yycgdQueryVo.setBusinessyear(year);//设置年份 yycgdQueryVo.setYycgdCustom(yycgdCustom); return yycgdMapperCustom.findAddYycgdmxCount(yycgdQueryVo); }
Action层:
// 采购药品添加查询列表结果集,json @RequestMapping("/queryaddyycgdmx_result") public @ResponseBody DataGridResultInfo queryaddyycgdmx_result(HttpSession session, String yycgdid,// 采购单id YycgdQueryVo yycgdQueryVo,// 查询条件 int page, int rows) throws Exception { // 当前用户 ActiveUser activeUser = (ActiveUser) session .getAttribute(Config.ACTIVEUSER_KEY); // 用户所属的单位(医院单位id) String useryyid = activeUser.getSysid();// 单位id // 列表的总数 int total = yycdgService.findAddYycgdmxCount(useryyid, yycgdid,yycgdQueryVo); // 分页参数 PageQuery pageQuery = new PageQuery(); pageQuery.setPageParams(total, rows, page); yycgdQueryVo.setPageQuery(pageQuery);// 设置分页参数 // 分页查询列表 List<YycgdmxCustom> list = yycdgService.findAddYycgdmxList(useryyid,yycgdid, yycgdQueryVo); DataGridResultInfo dataGridResultInfo = new DataGridResultInfo(); dataGridResultInfo.setTotal(total); dataGridResultInfo.setRows(list); return dataGridResultInfo; }
为什么会出现上面的查询结果呢:
因为在queryaddyycgdmx.jsp页面里面有这么一段代码:
//datagrid加载
function initGrid(){
$('#gysypmllist').datagrid({
title : '供应药品列表',
//nowrap : false,
striped : true,
//collapsible : true,
url : '${baseurl}cgd/queryaddyycgdmx_result.action',
queryParams:{//url的参数,初始加载datagrid时使用的参数
yycgdid:'${yycgdid}'//yycgdid是参数名称,如果参数名称中间有点,将参数用单引号括起来
},
//sortName : 'code',
//sortOrder : 'desc',
//remoteSort : false,
idField : 'gysypmlid',//json数据集的主键
//frozenColumns : frozenColumns,
columns : columns,
pagination : true,
rownumbers : true,
toolbar : toolbar,
loadMsg:"",
pageList:[15,30,50,100]/* ,//设置每页显示个数
onClickRow : function(index, field, value) {
$('#gysypmllist').datagrid('unselectRow', index);
},
//将加载成功后执行:清除选中的行
onLoadSuccess:function(){
$('#gysypmllist').datagrid('clearSelections');
} */
});
${baseurl}cgd/queryaddyycgdmx_result.action',就会调用上面的Action.查到结果后在页面上显示。
------------------------------------------------------------------------------------------------------------
接下来我们实现把数据插入到数据中:点击”确认添加”。
我们选中几个要添加的数据,然后点击确认添加,就可以把数据加入到数据了:
var toolbar = [ {
id : 'addyycgdmx',
text : '确认添加',
iconCls : 'icon-add',
handler : addyycgdmx
}];
这句话的意思是当点击‘确认添加’时执行“addyycgdmx”javascript代码。
如下:
var addyycgdmx = function(){ _confirm('您确定要执行添加选中的药品吗?',null, function(){ var indexs = [];//定义一个数组准备存放删除记录的序号 //通过jquery easyui的datagrid的getSelections函数,得到当前所有选中的行(对象数组) var rows = $('#gysypmllist').datagrid('getSelections'); //循环遍历选中行 for(var i=0;i<rows.length;i++){ //通过jquery easyui的datagrid的getRowIndex方法得行的序号 var index=$('#gysypmllist').datagrid('getRowIndex',rows[i]); //将选中行的序号放入indexs数组 indexs.push(index); } //如果存在选中的行 if(rows.length>0){ //将选中的行通过indexs.join(','),将选中行的序号中间以逗号分隔组成一个字符串,调用$("#indexs").val方法,将这个字符串放入indexs对象 $("#indexs").val(indexs.join(',')); //执行ajax的form提交 jquerySubByFId('gysypmlForm', addyycgdmx_callback, null); }else{ alert_warn("请选择要添加的药品"); } } ) };
jquerySubByFId('gysypmlForm', addyycgdmx_callback, null);这句话就是把名为“gysypmlForm”的表单提交。
执行的提交网址是:
<form id="gysypmlForm" name="gysypmlForm" action="${baseurl}cgd/addyycgdmxsubmit.action" method="post">
在Action 层查找addyycgdmxsubmit:
// 采购单药品添加提交 @RequestMapping("/addyycgdmxsubmit") public @ResponseBody SubmitResultInfo addyycgdmxsubmit( String yycgdid,//采购单id YycgdQueryVo yycgdQueryVo, int[] indexs // 页面选择序号 ) throws Exception { // 页面提交的业务数据(多个),要处理的业务数据,页面中传入的参数 List<YycgdmxCustom> list = yycgdQueryVo.getYycgdmxCustoms(); // 处理数据的总数 int count = indexs.length; // 处理成功的数量 int count_success = 0; // 处理失败的数量 int count_error = 0; // 处理失败的原因 List<ResultInfo> msgs_error = new ArrayList<ResultInfo>(); for (int i = 0; i < count; i++) { ResultInfo resultInfo = null; // 根据选中行的序号获取要处理的业务数据(单个) YycgdmxCustom yycgdmxCustom = list.get(indexs[i]); String ypxxid = yycgdmxCustom.getYpxxid();//药品信息id String usergysid = yycgdmxCustom.getUsergysid();//供货商id try { cgdService.insertYycgdmx(yycgdid, ypxxid, usergysid); } catch (Exception e) { e.printStackTrace(); // 进行异常解析 if (e instanceof ExceptionResultInfo) { resultInfo = ((ExceptionResultInfo) e).getResultInfo(); } else { // 构造未知错误异常 resultInfo = ResultUtil.createFail(Config.MESSAGE, 900, null); } } if (resultInfo == null) { // 说明成功 count_success++; } else { count_error++; // 记录失败原因 msgs_error.add(resultInfo); } } // 提示用户成功数量、失败数量、失败原因 // 改成返回详细信息 return ResultUtil.createSubmitResult( ResultUtil.createSuccess(Config.MESSAGE, 907, new Object[] { count_success, count_error }), msgs_error); }
List<YycgdmxCustom> list = yycgdQueryVo.getYycgdmxCustoms();是从页面上传入了多个YycgmxCustom.我们在yycgdQueryVo中需要设一个属性:
public class YycgdQueryVo { // 接收页面批量参数 private List<YycgdmxCustom> yycgdmxCustoms;
我们看一下 cgdService.insertYycgdmx(yycgdid, ypxxid, usergysid):
@Override public void insertYycgdmx(String yycgdid, String ypxxid, String usergysid) throws Exception { //根据药品id得到药品信息 Ypxx ypxx = ypxxMapper.selectByPrimaryKey(ypxxid); if(ypxx == null){ //抛出异常,药品在系统中不存在 //... } //校验采购单明细表唯 一约束 Yycgdmx yycgdmx_l = this.findYycgdmxByYycgdidAndYpxxid(yycgdid, ypxxid); if(yycgdmx_l!=null){ //该药品在采购单中已存在 ResultUtil.throwExcepion(ResultUtil.createFail(Config.MESSAGE, 508, null)); } String businessyear = yycgdid.substring(0, 4); //对比数据表准备、处理数据 Yycgdmx yycgdmx = new Yycgdmx(); //设置年份 yycgdmx.setBusinessyear(businessyear); yycgdmx.setId(UUIDBuild.getUUID());//主键 yycgdmx.setYycgdid(yycgdid); yycgdmx.setYpxxid(ypxxid); yycgdmx.setUsergysid(usergysid); yycgdmx.setZbjg(ypxx.getZbjg());//中标价格 yycgdmx.setJyjg(ypxx.getZbjg());//本系统交易价格和中标价格相等 yycgdmx.setCgzt("1");//默认1、未确认送货 yycgdmxMapper.insert(yycgdmx);//调用逆向工程自动生成的Mapper去插入数据 }
这样就好了。但是不要忘记把yycgdmxMapper.xml中的YYCGDMX改为YYCGDMX${businessyear}。这样就实现了分表。
调试结果: