zoukankan      html  css  js  c++  java
  • mbos之动态图表设计

    前言

    所谓,一图胜千言。人脑有80%的部分专门用于视觉处理。而随着数据时代的全面来临,我们自然有必要将数据转化为图形与图表。

    Mbos是一个快速,稳定的云端轻应用开发平台。帮助企业快速开发移动应用,加快企业工作效率,为企业创造更多的效益。mbos移动设计器,可以在线进行界面设计,发布成移动云之家轻应用,方便开发,快捷交付!

    其中,移动设计器还包含表单、列表、图表、控件等功能,支持在线js、css、服务端函数编辑。可以根据企业需要,快速定制开发轻应用。言归正传,下面介绍一下,在项目中,使用mbos图表功能做的财务预警轻应用中的一个图表化模块。

    下面先上一个效果图:

    动态参数-枚举控件

    这里的每个枚举控件,都在属性中进行设置,绑定枚举数据源。这里因为选项都较为固定,因此可采用自定义枚举数据源,进行手动维护。

    枚举控件设计的逻辑思维

      例如上面的枚举控件中,企业与国资委对标值进行比对,企业状态分为三种:正常、关注、重点关注,而且状态相对固定,因此这块可以使用自定义枚举数据源。年份以及起始月,结束月还有预警指标(固定)同样的可以采用自定义枚举数据源进行维护。而公司这块,因为需要跟随 选择的状态的不同,需要在公司这个枚举控件的下拉框中显示 该状态对应的公司。因此需要写服务端函数进行 传递状态值 获取公司,然后将获得的公司列表赋值给公司这个枚举控件。

    控件-数据源

    选着好数据源,例如函数数据源,定义好数据源,然后编写服务端函数,绑定到该数据源上即可。

    下面给出服务端函数 getComByStatus code:

    传递参数: 通过JS的页面加载事件中参数赋值,传递给该服务端函数。 然后服务端函数及西宁获取传递的参数,进行条件查询。

       var newStatus = "关注";
       var newYear = "2017";
       var newMon = "4";
      // newStatus,newYear,newMon
       // mbos('selCompany').open();
       mbos("dsScript1").refresh();
       mbos('dsScriptCom').setParam({newStatus,newYear,newMon});
     1 // var adc;
     2 // var status = @{varStatus};
     3 var status = context.getParamAsString(0); 
     4 var year = context.getParamAsString(1); 
     5 var month = context.getParamAsString(2); 
     6 // adc = "123";
     7 var sbSQL =  new java.lang.StringBuffer();
     8 sbSQL.append("select cfcompanyName from CT_FIN_RiskItem where 1=1");
     9 sbSQL.append(" and cfflag = 1");
    10 sbSQL.append(" and cfyear = " + year);
    11 sbSQL.append(" and cfmonth = " + month);
    12 sbSQL.append(" and cfstatus = " + "'"+status+"'");
    13 sbSQL.append(" order by cfsortnum");
    14 var list = context.getDBUtil().executeQueryAsList(sbSQL.toString());
    15 var list2 = new java.util.ArrayList();
    16 for(var  i = 0; i < list.size(); i++){
    17     var ob = new java.util.HashMap();
    18     var bb;
    19     var companyName = list.get(i).toString();
    20         bb= companyName.substring(15,companyName.length()-1);
    21          ob.put("alias",bb);
    22      // ob.put("isenum",true);
    23         ob.put("value",bb);
    24          list2.add(ob);
    25 }
    26 // throw list2;
    27 // throw companyName;
    28 context.setResult(list2);

    图表-折线图

    在控件中选择折线图,然后给折线图绑定函数数据源,在给函数数据源绑定服务端函数,只需要编辑服务端函数即可。图表的一般都需要结合服务端变量,根据服务端变量值的改变,实现图表动态刷新。

    折线图所有的函数数据源绑定的服务端函数 getData code:

     1 /*Codeing**/
     2 // var ctx = context.getBosContext();
     3 var list22;
     4 var obj1;
     5 var obj2;
     6 var obj3;
     7 var obj4;
     8 //获取服务端变量值
     9 var year = @{varYear};
    10 
    11 list22 = new java.util.ArrayList();
    12 var monStart = @{varMonStart};
    13 obj1 = new java.util.HashMap();
    14 
    15 var monEnd =@{varMonEnd};
    16 obj2 = new java.util.HashMap();
    17 var companyName = @{varCompanyName};
    18 obj3 = new java.util.HashMap();
    19 var item =@{varItem};
    20 
    21 obj4 = new java.util.HashMap();
    22 //组装主查询sql
    23 var sb =  new java.lang.StringBuffer();
    24 sb.append(" select ");
    25 sb.append(" cfmonth as 月份, ");
    26 if(item == "营业利润"){
    27    sb.append(" CT_FIN_SasacEntry.cfpoor as 平均值, ");
    28    sb.append(" CT_FIN_SasacEntry.cfaverage as 较差值, ");
    29    }else{
    30     sb.append(" CT_FIN_SasacEntry.cfpoor/100 as 平均值, ");
    31    sb.append(" CT_FIN_SasacEntry.cfaverage/100 as 较差值, ");
    32    }
    33 
    34 if(item == "资产负债率"){
    35     sb.append(" round(cftotalLiabilites/cftotalAssets,4) as  企业数据 ");
    36 }else if(item == "营业利润"){
    37     sb.append(" round(cftrafficProfit/10000,4) as  企业数据 ");
    38 }else if(item == "己获利息倍数"){
    39     sb.append(" round((cftotalProfit+cfinterestExpense)/cfinterestExpense,4) as  企业数据 ");
    40 }else if(item == "流动比率"){
    41     sb.append(" round(cfcurrentAssets/cfcurrentLiabilities,4) as  企业数据 ");
    42 }else if(item == "两金占流动资产比重"){
    43     sb.append(" round((cfaccountReceivable+cfstock)/cfcurrentAssets,4) as  企业数据 ");
    44 }else if(item == "速动比率"){
    45     sb.append(" round((cfcurrentAssets-cfstock)/cfcurrentLiabilities,4)  as  企业数据 ");
    46 }else if(item == "现金流动负债比率"){
    47     sb.append(" round(cfoperaCashFlow/cfcurrentLiabilities,4) as  企业数据 ");
    48 }else if(item == "带息负债比率"){
    49     sb.append(" round((cfshortLoan+CFOneYearLongLiabilities+cflongLoan+CFBondsPayable+CFInterestPayable)/cftotalLiabilites,4) as  企业数据 ");
    50 }else if(item == "或有负债比率"){
    51     sb.append(" round((CFDraft+CFBalance+CFAmountOfmatter+CFContingentLiabilities)/cfownerRights,4) as  企业数据 ");
    52 }else if(item == "平均融资成本率"){
    53     sb.append(" round(CFTotalCosts/CFFinancingCost,4) as  企业数据 ");
    54 }
    55 //组装表 条件查询
    56 sb.append(" from CT_FIN_RiskItem as CT_FIN_RiskItem ");
    57 sb.append(" INNER join CT_FIN_Sasac as CT_FIN_Sasac on CT_FIN_RiskItem.cfyear = CT_FIN_Sasac.cfyear ");
    58 sb.append(" INNER join CT_FIN_SasacEntry as CT_FIN_SasacEntry on CT_FIN_Sasac.fid = CT_FIN_SasacEntry.fparentid ");
    59 sb.append(" where CT_FIN_RiskItem.cfyear = " + year);
    60 sb.append(" and CT_FIN_RiskItem.cfcompanyName = " +"'"+ companyName+"'");
    61 sb.append(" and CT_FIN_SasacEntry.cfname = " + "'" + item + "'");
    62 sb.append(" and CT_FIN_RiskItem.cfmonth >= " + monStart);
    63 sb.append(" and CT_FIN_RiskItem.cfmonth <= " + monEnd);
    64 sb.append(" order by cfmonth");
    65 
    66 //执行查询企业数据
    67 var list = context.getDBUtil().executeQueryAsList(sb.toString()); 
    68 if(list.toString().length()>0){
    69   context.setResult(list);
    70 }
    71 // context.setResult(list);
    72 // throw list;

    控件-变量


    在控件中选择变量,定义服务端变量。服务端变量 需要通过 值改变事件 进行赋值 以及初始化。(服务端变量一定在JS中进行初始化)

    为每个枚举控件绑定 值改变事件。

    JS端

      包含 每个控件的值改变事件,将对应控件选中的值 赋值给对应的 服务端变量,并进行刷新取数数据源。借助服务端变量进行图标数据源的属性,动态图表根据选择参数的不同,取数后的数据改变,导致图表的动态刷新!控件的初始化赋值(必须要做的操作,虽然会有点影响加载性能)  在用page 绑定 afterOnload 事件(页面加载后进行)进行初始化的赋值。

      1 _this.changeSelYear = function(event){
      2     mbos.variable.setValue("varYear",event.new_value.alias);
      3     mbos("dsScript1").refresh();
      4 }
      5 _this.changeSelectItem = function(event){
      6     mbos.variable.setValue("varItem",event.new_value.alias);
      7     mbos("dsScript1").refresh();
      8 }
      9 
     10 _this.changeStartMonth = function(event){
     11     mbos.variable.setValue("varMonStart",event.new_value.alias);
     12     mbos("dsScript1").refresh();
     13 }
     14 _this.changeEndMonth = function(event){
     15       var endMon = event.new_value.alias;
     16     var startMon =  mbos("selectMonthStart").value().alias;
     17         // if(endMon < startMon){
     18         // var param = {title:"错误",msg:"请正确选择月份",timeOutFn:function(data){if(data==0){alert("确定按钮")}}};
     19         // mbos.ui.showError(param);
     20         // }
     21     mbos.variable.setValue("varMonEnd",endMon);
     22     mbos("dsScript1").refresh();
     23 }
     24 //预警状态 值改变
     25 _this.changeStatus = function(event){
     26     mbos.variable.setValue("varStatus",event.new_value.alias);
     27   var newStatus = event.new_value.alias;
     28   var newYear = mbos("selYear").value().alias;
     29   var newMon = mbos("selectMonthStart").value().alias;
     30 
     31   //刷新 获取公司函数源
     32     mbos("dsScript1").refresh();
     33     mbos('dsScriptCom').setParam({newStatus,newYear,newMon});
     34 }
     35 //selCompany
     36 _this.changeCompany = function(event){
     37     mbos.variable.setValue("varCompanyName",event.new_value.alias);
     38    mbos("dsScript1").refresh();
     39 }
     40 
     41 //页面加载后初始化
     42 mbos('page').bind("afterOnload",function(){
     43   //设置初始值 每个都要有初始值..顺便给控件赋初始值
     44   mbos.variable.setValue("varYear",'2017');
     45   mbos.variable.setValue("varItem",'资产负债率');
     46    mbos.variable.setValue("varMonStart",'4');
     47    mbos.variable.setValue("varMonEnd",'5');
     48    mbos.variable.setValue("varStatus",'关注');
     49    // mbos.variable.setValue("varCompanyName",'百利装备');
     50   // debugger;
     51   //组织隔离
     52      var company = easContext[0].name;
     53   if(company =="天津百利机械装备集团有限公司"){
     54          mbos.variable.setValue("varCompanyName",'百利装备');
     55          mbos('selCompany').value({
     56           alias: "百利装备", 
     57           isenum: true, 
     58           value: "百利装备"
     59         });
     60      }else{
     61        //禁用枚举 公司 和状态控件
     62         mbos('selCompany').disable();
     63         mbos('selStatus').disable();
     64        // mbos('selStatus').remove();
     65         // 赋值公司值为 当前组织公司
     66          mbos.variable.setValue("varCompanyName",company);
     67            mbos('selCompany').value({
     68             alias:company, 
     69             isenum: true, 
     70             value: company
     71             });
     72      }
     73   
     74   
     75   mbos('selYear').value({
     76     alias: "2017", 
     77     isenum: true, 
     78     value: "2017"
     79 });
     80   
     81   mbos('selectItem').value({
     82     alias: "资产负债率", 
     83     isenum: true, 
     84     value: "资产负债率"
     85 });
     86  
     87     mbos('selectMonthStart').value({
     88     alias: "4", 
     89     isenum: true, 
     90     value: "4"
     91 });
     92  
     93     mbos('selectMonthEnd').value({
     94     alias: "5", 
     95     isenum: true, 
     96     value: "5"
     97 });
     98 //    mbos('selStatus').value({
     99 //       alias: "关注", 
    100 //       isenum: true, 
    101 //       value: "关注"
    102 // });
    103   
    104 //     mbos('selCompany').value({
    105 //     alias: "百利装备", 
    106 //     isenum: true, 
    107 //     value: "百利装备"
    108 // });
    109    var newStatus = "关注";
    110    var newYear = "2017";
    111    var newMon = "4";
    112   // newStatus,newYear,newMon
    113    // mbos('selCompany').open();
    114    mbos("dsScript1").refresh();
    115    mbos('dsScriptCom').setParam({newStatus,newYear,newMon});
    116   
    117 })
    118             

    至此,图表制作的步骤就介绍完毕了,多参考开发文档:https://mbos.kingdee.com/doc/index.html

  • 相关阅读:
    hdu1010 Tempter of the Bone(深搜+剪枝问题)
    08-Objective-C特有语法:@property、@synthesize
    Servlet的Response.setContentLength无效
    Java Future
    android一些若干回调测试
    那些有趣的Webview细节
    androidlog日志之 Klog (StackTraceElement)
    曾几何时遇到的bug(viewpager+fragment)
    Android acache读后感
    11-8 定时器this
  • 原文地址:https://www.cnblogs.com/lyc-smile/p/7298467.html
Copyright © 2011-2022 走看看