Chart.vue 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310
  1. <!-- 图形数据设置 -->
  2. <script>
  3. import {baseUrl} from '@/common/biConfig'
  4. import $ from 'jquery'
  5. import * as utils from '@/view/portal/Utils'
  6. import * as chartUtils from '@/view/bireport/chartUtils'
  7. import * as tools from '@/view/bireport/bireportUtils'
  8. export default {
  9. components:{
  10. },
  11. props:{
  12. comp:{
  13. type:Object,
  14. required:true
  15. }
  16. },
  17. data(){
  18. return {
  19. }
  20. },
  21. render(h){
  22. let leftCols = [];
  23. let comp = this.comp;
  24. let tp = comp.chartJson.type;
  25. let isscatter = tp === 'scatter' || tp === 'bubble';
  26. let isbubble = tp === 'bubble';
  27. if(isscatter){
  28. let xcol = null;
  29. if(comp.kpiJson && comp.kpiJson.length >0 && comp.kpiJson[0]){
  30. let o = comp.kpiJson[0];
  31. xcol = [h('span', {class:"charttxt",attrs:{title:o.kpi_name}}, o.kpi_name), h('a', {attrs:{class:"charticon"},domProps:{innerHTML:`<i class="fa fa-gear"></i>`},on:{click:()=>this.chartmenu(o, 'ycol')}})]
  32. }else{
  33. xcol = [h('span', {class:"charttip"}, '将度量拖到这里')]
  34. }
  35. //横轴 
  36. let xcolobj = h('div', {class:"ts_h"}, [h('div', '横轴:'), h('div', {attrs:{class:"h_ctx", id:"ycol"}}, xcol)]);
  37. leftCols.push(xcolobj);
  38. let ycol = null;
  39. if(comp.kpiJson && comp.kpiJson.length >0 && comp.kpiJson[1]){
  40. let o = comp.kpiJson[1];
  41. ycol = [h('span', {class:"charttxt",attrs:{ title:o.kpi_name}}, o.kpi_name), h('a', {attrs:{class:"charticon"},domProps:{innerHTML:`<i class="fa fa-gear"></i>`},on:{click:()=>this.chartmenu(o, 'y2col')}})]
  42. }else{
  43. ycol = [h('span', {class:"charttip"}, '将度量拖到这里')]
  44. }
  45. let ycolobj = h('div', {class:"ts_h"}, [h('div', '纵轴'), h('div', {attrs:{class:"h_ctx", id:"y2col"}}, ycol)]);
  46. leftCols.push(ycolobj);
  47. //气泡大小
  48. if(isbubble){
  49. let qp = null;
  50. if(comp.kpiJson && comp.kpiJson.length >0 && comp.kpiJson[2]){
  51. let o = comp.kpiJson[2];
  52. qp = [h('span', {class:"charttxt", attrs:{ title:o.kpi_name}}, o.kpi_name), h('a', {attrs:{class:"charticon"},domProps:{innerHTML:`<i class="fa fa-gear"></i>`},on:{click:()=>this.chartmenu(o, 'ycol')}})]
  53. }else{
  54. qp = [h('span', {class:"charttip"}, '将度量拖到这里')]
  55. }
  56. let qpobj = h('div', {class:"ts_h"}, [h('div', '气泡大小'), h('div', {attrs:{class:"h_ctx", id:"y3col"}}, qp)]);
  57. leftCols.push(qpobj);
  58. }
  59. }
  60. let xcol = null;
  61. if(!$.isEmptyObject(comp.chartJson.xcol)){
  62. let o = comp.chartJson.xcol;
  63. xcol = [h('span', {class:"charttxt",attrs:{title:o.dimdesc}}, o.dimdesc), h('a', {attrs:{class:"charticon"},domProps:{innerHTML:`<i class="fa fa-gear"></i>`},on:{click:()=>this.chartmenu(o, 'xcol')}})]
  64. }else{
  65. xcol = [h('span', {class:"charttip"}, '将维度拖到这里')]
  66. }
  67. //横轴 
  68. let xcolobj = h('div', {class:"ts_h"}, [h('div', isscatter?'观察维度:':'横轴:'), h('div', {attrs:{class:"h_ctx", id:"xcol"}}, xcol)]);
  69. leftCols.push(xcolobj);
  70. if(!isscatter){
  71. let ycol = null;
  72. if(comp.kpiJson && comp.kpiJson.length > 0 && comp.kpiJson[0] != null){
  73. let o = comp.kpiJson[0];
  74. ycol = [h('span', {class:"charttxt", attrs:{ title:o.kpi_name}}, o.kpi_name), h('a', {attrs:{class:"charticon"},domProps:{innerHTML:`<i class="fa fa-gear"></i>`},on:{click:()=>this.chartmenu(o, 'ycol')}})]
  75. }else{
  76. ycol = [h('span', {class:"charttip"}, '将度量拖到这里')];
  77. }
  78. //纵轴
  79. let ycolobj = h('div', {class:"ts_h"}, [h('div', '纵轴:'), h('div', {attrs:{class:"h_ctx", id:"ycol"}}, ycol)]);
  80. leftCols.push(ycolobj);
  81. }
  82. if(tp !== 'map'){ //地图没有图例 
  83. let scol = null;
  84. if(!$.isEmptyObject(comp.chartJson.scol)){
  85. let o = comp.chartJson.scol;
  86. scol = [h('span', {class:"charttxt", attrs:{ title:o.dimdesc}}, o.dimdesc), h('a', {attrs:{class:"charticon"},domProps:{innerHTML:`<i class="fa fa-gear"></i>`},on:{click:()=>this.chartmenu(o, 'scol')}})]
  87. }else{
  88. scol = [h('span', {class:"charttip"}, '将维度拖到这里')]
  89. }
  90. //图例 Ser
  91. let scolobj = h('div', {class:"ts_h"}, [h('div', '图例'), h('div', {attrs:{class:"h_ctx", id:"scol"}},scol)]);
  92. leftCols.push(scolobj);
  93. }
  94. return h('div', {class:"tsbd", attrs:{id:"chartData"}}, leftCols);
  95. },
  96. mounted(){
  97. this.initChartKpiDrop();
  98. },
  99. computed: {
  100. },
  101. methods: {
  102. setUpdate(){
  103. this.$parent.$parent.isupdate = true;
  104. this.$forceUpdate();
  105. },
  106. chartView(){
  107. this.$parent.$parent.$refs['optarea'].$refs['mv_'+this.comp.id].chartView();
  108. },
  109. chartmenu(o, pos){
  110. const ts = this;
  111. $.contextMenu( 'destroy');
  112. $.contextMenu({
  113. selector: 'a.charticon',
  114. className: "chartDimOpt",
  115. trigger: 'left',
  116. delay: 500,
  117. autoHide:true,
  118. callback: function(key, opt) {
  119. var comp = ts.comp;
  120. if(key == 'asc' || key == 'desc'){
  121. chartUtils.chartsort(key, pos, comp, ()=>{
  122. ts.setUpdate();
  123. ts.chartView();
  124. });
  125. }else if(key == "remove"){
  126. chartUtils.delChartKpiOrDim(pos, comp, ()=>{
  127. ts.setUpdate();
  128. ts.chartView();
  129. });
  130. }
  131. },
  132. items: {
  133. "asc": {name: "升序", icon: "fa-sort-amount-asc"},
  134. "desc": {name: "降序", icon: 'fa-sort-amount-desc'},
  135. "remove": {name: "清除",icon:"fa-remove"}
  136. }
  137. });
  138. },
  139. initChartKpiDrop(){
  140. const ts = this;
  141. let comp = this.comp;
  142. $("#chartData #xcol, #chartData #ycol, #chartData #y2col, #chartData #y3col, #chartData #ycols, #chartData #scol").droppable({
  143. accept:"#datasettree .jstree-node",
  144. tolerance:"pointer",
  145. over:function(e, ui){
  146. var ref = $("#datasettree").jstree(true);
  147. var node = ref.get_node(ui.draggable[0]);
  148. var tp = node.li_attr.col_type;
  149. var nodeId = $(this).attr("id");
  150. if(tp == 1 && (nodeId == 'xcol' || nodeId == 'scol')){
  151. $(ui.helper[0]).find("span").removeClass("glyphicon-remove").addClass("glyphicon-ok");
  152. $(this).css("border", "1px solid #ff0000");
  153. }
  154. if(tp == 2 && (nodeId == "ycol" || nodeId ==='y2col' || nodeId==='y3col')){
  155. $(ui.helper[0]).find("span").removeClass("glyphicon-remove").addClass("glyphicon-ok");
  156. $(this).css("border", "1px solid #ff0000");
  157. }
  158. },
  159. out:function(e, ui){
  160. $(ui.helper[0]).find("span").removeClass("glyphicon-ok").addClass("glyphicon-remove");
  161. $(this).css("border-color", "#7F9DB9");
  162. },
  163. drop:function(e, ui){
  164. var id = ts.chartId;
  165. var json = comp;
  166. //清除边框样式
  167. $("#chartData #"+$(this).attr("id")).css("border-color", "#7F9DB9");
  168. //获取TREE
  169. var ref = $("#datasettree").jstree(true);
  170. var node = ref.get_node(ui.draggable[0]);
  171. //判断拖入的维度及度量是否和以前维度及度量在同一个表。
  172. if(json.cubeId != undefined){
  173. if(json.cubeId != node.li_attr.cubeId){
  174. utils.msginfo("您拖入的"+ (node.li_attr.col_type == 2 ? "度量" : "维度") +"与组件已有的内容不在同一个数据表中,拖放失败。");
  175. return;
  176. }
  177. }
  178. json.cubeId = node.li_attr.cubeId;
  179. json.dsid = node.li_attr.dsid;
  180. json.dsetId = node.li_attr.dsetId;
  181. json.chartJson.label = "PIC";
  182. if(json.kpiJson == undefined){
  183. json.kpiJson = [];
  184. };
  185. //拖放度量后,判断维度是否在params中
  186. if(node.li_attr.col_type == 1){
  187. var dimId = node.li_attr.col_id;
  188. if(chartUtils.findDimById(dimId, json.chartJson.params) != null){
  189. utils.msginfo("您拖放的维度已存在于钻取维中,不能拖放。")
  190. return;
  191. }
  192. }
  193. let dropId = $(this).attr("id");
  194. if(node.li_attr.col_type == 2 && (dropId == "ycol" || dropId == 'y2col' || dropId == 'y3col')){
  195. let o = {"kpi_id":node.li_attr.col_id, "kpi_name" : node.text, "ydispName":node.text, "col_name":node.li_attr.col_name, "aggre":node.li_attr.aggre, "fmt":node.li_attr.fmt, "alias":node.li_attr.alias,"tname":node.li_attr.tname,"unit":node.li_attr.unit,"rate":node.li_attr.rate,"calc":node.li_attr.calc};
  196. if(dropId === 'ycol'){
  197. json.kpiJson[0] = o;
  198. }else if(dropId === 'y2col'){
  199. json.kpiJson[1] = o;
  200. }else if(dropId === 'y3col'){
  201. json.kpiJson[2] = o;
  202. }
  203. json.chartJson.ycol = {"type":"kpi"};
  204. ts.setUpdate();
  205. ts.chartView();
  206. }
  207. if(node.li_attr.col_type == 1 && dropId == "xcol"){
  208. //判断是否在xcol中已经存在
  209. if(json.chartJson.scol != undefined && json.chartJson.scol.id == node.li_attr.col_id){
  210. utils.msginfo("您拖放的维度已存在于图例项中,不能拖放。")
  211. return;
  212. }
  213. //判断xcol 和 scol 是否属于一个分组,如果是,不让拖动
  214. var gt = node.li_attr.grouptype;
  215. if(gt != null && gt != ''){
  216. if(json.chartJson.scol != undefined && json.chartJson.scol.grouptype == gt){
  217. utils.msginfo("您拖放的维度与此图表中已有维度分组相同,不能拖放。")
  218. return;
  219. }
  220. }
  221. json.chartJson.xcol = {"id":node.li_attr.col_id, "dimdesc" : node.text, "type":node.li_attr.dim_type, "colname":node.li_attr.col_name,"alias":node.li_attr.alias,"tname":node.li_attr.tname,"iscas":node.li_attr.iscas, "tableName":node.li_attr.tableName, "tableColKey":node.li_attr.tableColKey,"tableColName":node.li_attr.tableColName, "dimord":node.li_attr.dimord, "dim_name":node.li_attr.dim_name, "grouptype":node.li_attr.grouptype,"valType":node.li_attr.valType, "ordcol":node.li_attr.ordcol,dateformat:node.li_attr.dateformat,"calc":node.li_attr.calc};
  222. ts.setUpdate();
  223. ts.chartView();
  224. }
  225. if(node.li_attr.col_type == 1 && dropId == "scol"){
  226. //判断是否在xcol中已经存在
  227. if(json.chartJson.xcol != undefined && json.chartJson.xcol.id == node.li_attr.col_id){
  228. utils.msginfo("您拖放的维度已存在于横轴中,不能拖放。")
  229. return;
  230. }
  231. //判断xcol 和 scol 是否属于一个分组,如果是,不让拖动
  232. var gt = node.li_attr.grouptype;
  233. if(gt != null && gt != ''){
  234. if(json.chartJson.xcol != undefined && json.chartJson.xcol.grouptype == gt){
  235. utils.msginfo("您拖放的维度与此图表中已有维度分组相同,不能拖放。")
  236. return;
  237. }
  238. }
  239. json.chartJson.scol = {"id":node.li_attr.col_id, "dimdesc" : node.text, "type":node.li_attr.dim_type, "colname":node.li_attr.col_name,"alias":node.li_attr.alias,"tname":node.li_attr.tname,"iscas":node.li_attr.iscas, "tableName":node.li_attr.tableName, "tableColKey":node.li_attr.tableColKey,"tableColName":node.li_attr.tableColName, "dimord":node.li_attr.dimord, "dim_name":node.li_attr.dim_name, "grouptype":node.li_attr.grouptype,"valType":node.li_attr.valType, "ordcol":node.li_attr.ordcol,"calc":node.li_attr.calc};
  240. ts.setUpdate();
  241. ts.chartView();
  242. }
  243. }
  244. });
  245. },
  246. },
  247. watch: {
  248. }
  249. }
  250. </script>
  251. <style lang="less" scoped>
  252. .tsbd {
  253. .ts_h{
  254. font-size:13px;
  255. margin:5px 20px 5px 5px;
  256. width:125px;
  257. float:left;
  258. }
  259. .h_ctx{
  260. border:1px solid #7F9DB9;
  261. height:28px;
  262. overflow:hidden;
  263. border-radius:5px;
  264. padding:2px;
  265. }
  266. }
  267. span.charttip {
  268. color:#999999;
  269. padding:3px;
  270. display:block;
  271. }
  272. span.charttxt {
  273. display:inline-block;
  274. width:99px;
  275. white-space:nowrap;
  276. overflow:hidden;
  277. margin-left:3px;
  278. }
  279. a.charticon {
  280. display:inline-block;
  281. width:16px;
  282. height:16px;
  283. cursor:pointer;
  284. font-size: 14px;
  285. }
  286. </style>