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

    
    


    调试结果:

    
    
    
  • 相关阅读:
    Sql Server 2012 数据库同步方式 (发布、订阅)
    博客搬家通知
    无聊而又劳累的一天
    有没有大神知道国产加密算法SM2的详细介绍
    Android开发环境搭建helloworld程序创建(新手)
    debian下安装东西,遇到两个东西,记录下
    算法:扑克牌相关的一个简单功能示意(纯C实现)
    [51单片机学习笔记FIVE]----独立按键
    [51单片机学习笔记FOUR]----16*16LED点阵
    [51单片机学习笔记THREE]----继电器
  • 原文地址:https://www.cnblogs.com/shenxiaoquan/p/6181729.html
Copyright © 2020-2023  润新知