实现动态统计报表,表头是调用数据库中的字段显示出来的。

来源:互联网 发布:mac安装jdk后如何配置 编辑:程序博客网 时间:2024/05/23 01:15

最近在项目中有这个需求,因此做了出来,分享给大家。


一、目的:实现动态统计报表,表头是调用数据库中的字段显示出来的。


二、实现效果:

其中:收入类、虚列收入、转移收入、多列收入、少列收入这些都是数据库中的字段。且收入类是上级分类,虚列收入、转移收入、多列收入的上级分类。

左边的审计类型是也是从数据库中调出来的。


三、实现思路:

1显示TABLE中的表头:表头分类两层,第一层:收入类,第二层:虚列收入、转移收入、多列收入、少列收入...调用数据实现。

2循环TR:通过显示审计分类列出循环。

3显示一行TR:审计类型+具体对应数据。

4合计:单独处理,利用SUM函数显示出来。


四、具体代码

     /*
     * 显示总体数据:审计项目汇总
     * 查询条件:时间
     *
     */
    
    /*
     * 思路:
     * 1 获取参数
     * 2编写时间查询语句
     * 3画TABLE
     * 4显示TABALE内数据
     */
    @RequestMapping(value="/allTotalStandard", method=RequestMethod.GET)
    public ModelAndView allTotalStandard(HttpServletRequest request,HttpServletResponse response) {
        ModelAndView view =  new ModelAndView("allTotalStandard", "message", "");
        
        /*
         * 0
         * 获取par,组合成查询条件所需信息
         * par:time
         */
        
        
        

        
        //0.1time
        String yearSelect = request.getParameter("yearSelect");
        String stageSelect = request.getParameter("stageSelect");
        String monthSelect = request.getParameter("monthSelect");
        String startDateString = request.getParameter("startDate");
        String endDateString = request.getParameter("endDate");
        
        String startDate=null;
        String endDate=null;
        
        if(!("").equals(startDateString) && null!=startDateString)
        {
            startDate=startDateString;
        }
        else
        {
            startDate="";
        }
        
        if(!("").equals(endDateString) && null!=endDateString)
        {
            endDate=endDateString;
        }
        else
        {
            endDate="";
        }
        
        String firstPar,secondPar,datePar=null;//firstPar= year/startDate;  secondPar=month/stage/endDate
        
        if(!("").equals(yearSelect) && null!=yearSelect)
        {
            
            
            
            //month,stage,null
            if(!("").equals(monthSelect) && null!=monthSelect)
            {
                //month
                datePar=" and Month([adate]) ="+monthSelect+" and year([adate])="+yearSelect;
            }
            else if(!("").equals(stageSelect) && null!=stageSelect)
            {
                //stage
                secondPar=stageSelect;
                if(secondPar.equals("1"))
                {
                    datePar=" and year([adate])="+yearSelect+" and  ( Month([adate])=1 or month([adate])=2 or month([adate])=3 )" ;
                }
                
                if(secondPar.equals("2"))
                {
                    datePar=" and year([adate])="+yearSelect+" and  ( month([adate])=4 or month([adate])=5 or month([adate])=6 )" ;
                }
                
                if(secondPar.equals("3"))
                {
                    datePar=" and year([adate])="+yearSelect+" and  ( month([adate])=7 or month([adate])=8 or month([adate])=9 )" ;
                }
                
                if(secondPar.equals("4"))
                {
                    datePar=" and year([adate])="+yearSelect+" and  ( month([adate])=10 or month([adate])=11 or month([adate])=12 )" ;
                }
            }
            else
            {
                //year
                datePar=" and Year([adate]) ="+yearSelect;
                
            }
            
        }
        else if(!("").equals(startDate) && !("").equals(endDate) )
        {
            //have startDate and endDate
            firstPar=startDate;
            secondPar=endDate;
            datePar=" and main.adate between '"+startDate+"' and  '"+ endDate+"'";
        }
        else
        {
            firstPar="";
            secondPar="";
            datePar="";

        }
       

        //画TABLE   显示表头


        //1获取第一层的分类   收入类、成本类
        List<BreakType> l = breakTypeService.getFirstLevel();
        request.setAttribute("breakTypeFirstLists", l);//赋值第一层分类
        
            //获取第一层下级分类的数值
        for(BreakType breakType:l)
        {
            breakType.setNextTypeNum(  Long.valueOf(breakTypeDao.getFirstLevelNumber(breakType.getBid()))*2  );
            
        }
            
        
        //2获取第二层的分类 

虚列收入、转移收入、多列收入

        List<BreakType> sl = breakTypeService.getSecondLevel();
        request.setAttribute("breakTypeSecondLists", sl);//赋值第一层分类
        request.setAttribute("breakTypeSecondListsSize", sl.size());//赋值第一层分类数字;目的是为了表格中的“审计发现问题”的项colspan符合要求
        
        
        //3获取某层所属下级列表
        
        List<Object> secondTypeList =   new ArrayList();//secondTypeList数据格式[1,2,3,4,5,6]
        
        
        
        //定义第二层的个数
        int sumSecond=0;
        
        
        for(int i=0;i<l.size();i++)
        {
            if(null!=l.get(i))
            {
                Long t=l.get(i).getBid();
                
                //获取某一个的下级分类数组
                secondTypeList.add(breakTypeDao.queryByHql("select name from BreakType where type=?",t+""));                

                if(sumSecond+secondTypeList.size()>0)
                {
                    sumSecond=sumSecond+secondTypeList.size();
                }
                else
                {
                    sumSecond=sumSecond;
                }
            }
            else
            {
                sumSecond=sumSecond;
            }
            
        }
        

        
        request.setAttribute("secondTypeList", secondTypeList);
        
        
        //4获取 审计发现问题 中的总列数
        int sum=sumSecond*2;
        request.setAttribute("sum", sum);//赋值第一层分类数字;目的是为了表格中的“审计发现问题”的项colspan符合要求
        
        //画TABLE   显示具体数据
        //5显示具体数据
        //具体思路:tr中的TD内容通过LIST封装显示出来。
            //(1)遍历审计分类
            //(2)显示审计分类
            //(3)获取对应审计分类的具体 金额和项数
            //(4)用<td></td>组装数据
        //5.1显示tr中的循环
        //具体思路:tr中的TD内容通过LIST封装显示出来。
        //(1)遍历审计分类
        //(2)显示审计分类
        //(3)获取对应审计分类的具体 金额和项数
        //(4)用<td></td>组装数据
        
        //5.1显示tr中的循环
        
        List<Object[]> audit=dictViewService.getDictByType("audit.type");//you xian de
        
        
        List<Object> secondTypeListId =   new ArrayList();//第一层问题分类所属下级分类
        List<Object> allList = new ArrayList();//最终组合数据
        //用signString 代替
        List<Object> lineList = new ArrayList();//数据格式:【金额,项数】【金额,项数】【金额,项数】【金额,项数】【金额,项数】
        
        
        
        //生成表格
        for(int b=0;b<audit.size();b++)//遍历发现问题类型
        {
            StringBuilder lineArray= new StringBuilder("");
            
            
            for(int i=0;i<l.size();i++)//遍历第一层分类
            {
                
                
                if(null!=l.get(i))
                {
                    Long t=l.get(i).getBid();
                    
                    
                    //获得所有的breaktype  遍历第一层分类所属下级分类
                    secondTypeListId.add(breakTypeDao.queryByHql("select bid from BreakType where type=?",t+""));
                    
                    //获取单个【金额,项数】,合并成:【金额,项数】【金额,项数】【金额,项数】【金额,项数】
                    for(int j=0;j<((List)(secondTypeListId.get(i))).size();j++)
                    {    
                        //获取参数
                        String tempAudit= ((audit.get(b)))[1].toString() ;
                        StringBuilder tempType=new StringBuilder(((List)secondTypeListId.get(i)).get(j)+"");                
                        
                        // 获取【项数】【金额】,赋值给signString
                        StringBuilder signString=new StringBuilder( projectDetailService.numberDetailByAudit( tempAudit,tempType.toString(),  datePar )  + projectDetailService.moneyDetailByAudit( tempAudit,tempType.toString(),  datePar));
                        
                        //这是用另一个方法调用,目前不能成功,等待调试
                        //StringBuilder signString = new StringBuilder(projectDetailService.sumDetailByDepart(tempDepart, tempType.toString()));
                        
                        
                        //组合数据,组合后的格式为:格式【金额,项数】【金额,项数】【金额,项数】【金额,项数】【金额,项数】    
                        lineArray=lineArray.append(signString);
                
                    }
                    
                    
                    
                }
                
            }
            
            //将一列数据赋值给lineList
            lineList.add(lineArray);
            
            //组合最终列数据allList,格式为:虚列+部门+lineList
            //把<td>&nbsp;</td>  <td>departname</td>             +              <td>项数</td>  <td>金额</td>=allList
            //部门+   项数、金额
            allList.add("<td>"+((audit.get(b)))[1]+"</td>"+lineList.get(b));
            
        }
        request.setAttribute("allList", allList);
        
        
        //6显示合计tr
        //(1)遍历第一层
        //(2)遍历第二层
        //(3)填充<td></td>
    List<Object> secondTypeListId2 =   new ArrayList();//第一层所属第二层分类
    StringBuilder lineArrayTotal= new StringBuilder("");//统计列
    List<Object> allTotalList = new ArrayList();//最终组合数据
    
    for(int i=0;i<l.size();i++)//遍历第一层分类
    {
        
        
        if(null!=l.get(i))
        {
            Long t=l.get(i).getBid();
            
            
            //获得所有的breaktype  遍历第一层分类所属下级分类
            secondTypeListId2.add(breakTypeDao.queryByHql("select bid from BreakType where type=?",t+""));
            //拆开数组,赋值给numberList numberList格式【金额,项数】
            for(int j=0;j<((List)(secondTypeListId2.get(i))).size();j++)
            {    
                StringBuilder tempType=new StringBuilder(((List)secondTypeListId.get(i)).get(j)+"");    
                StringBuilder signString=new StringBuilder( projectDetailService.numberTotalDetailByDepart( tempType.toString(),"",datePar )  + projectDetailService.moneyTotalDetailByDepart(  tempType.toString(),"",datePar ));
                
                            
                //组合数据,组合后的格式为:格式【金额,项数】【金额,项数】【金额,项数】【金额,项数】【金额,项数】    
                lineArrayTotal=lineArrayTotal.append(signString);
                
        
            }
            
            
            
        }
    
    }
    
    allTotalList.add("<td>合计</td>"+lineArrayTotal);
    
    request.setAttribute("allTotalList", allTotalList);
        
                
        return view;
    }
   


原创粉丝点击