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

  • 相关阅读:
    11. Container With Most Water
    9. Palindrome Number
    375. 猜数字大小 II leetcode java
    leetcode 72 编辑距离 JAVA
    73. 矩阵置零 leetcode JAVA
    快速排序 JAVA实现
    63. 不同路径 II leetcode JAVA
    重写(override)与重载(overload)
    62 不同路径 leetcode JAVA
    leetcode 56 合并区间 JAVA
  • 原文地址:https://www.cnblogs.com/lyc-smile/p/7298467.html
Copyright © 2011-2022 走看看