首页 > 代码库 > 042医疗项目-模块四:采购单模块—采购单明细添加查询,并且把数据添加到数据库中

042医疗项目-模块四:采购单模块—采购单明细添加查询,并且把数据添加到数据库中

我们要实现的功能是:

技术分享

我们上一篇文章中我们看到如上所示:这个列表里面都是空的。我们本文要做的就是往里面添加数据。

 

 

先演示一下流程:

技术分享

按一下“采购药品添加”按钮执行如下代码:

 

@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);
                },
        //将加载成功后执行:清除选中的行
        onl oadSuccess: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}。这样就实现了分表。




调试结果:

技术分享

 


 

042医疗项目-模块四:采购单模块—采购单明细添加查询,并且把数据添加到数据库中