首页 > 代码库 > mbos之动态图表设计

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=http://www.mamicode.com/=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

 

mbos之动态图表设计