bidrill.js 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533
  1. if($ == undefined){
  2. $ = jQuery;
  3. }
  4. function drill(dimId, compId, pos, val, vdesc, oldDimId, islink){
  5. var comp = findCompById(compId);
  6. var dodrill = function(){
  7. var dims = null;
  8. if(pos == 'row'){
  9. dims = comp.rows;
  10. }else{
  11. dims = comp.cols;
  12. }
  13. //判断是否有联动
  14. if(comp.complink && islink){
  15. //联动图形
  16. var chartComp = findCompById(comp.complink);
  17. if(chartComp != null && isSameDimsInDrill(comp, chartComp)){
  18. drillingChart(dimId, chartComp.id, pos, val, vdesc, oldDimId, false); //存在相同维度才能联动
  19. }
  20. }
  21. //设置当前维度值为过滤条件
  22. var oldDim = null;
  23. var oldDimIndex = 0;
  24. for(i=0; i<dims.length;i++){
  25. if(dims[i].id == oldDimId){
  26. oldDimIndex = i;
  27. dims[i].vals = val; //只展开当前,设置值筛选
  28. if(dims[i].type == 'month'){
  29. dims[i].filtertype = 1; //按区间筛选
  30. dims[i].startmt = val;
  31. dims[i].endmt = val;
  32. delete dims[i].vals;
  33. oldDim = dims[i];
  34. }
  35. if(dims[i].type == 'day'){
  36. var dateformat = dims[i].dateformat;
  37. var tmpval = val;;
  38. //if(dateformat.length == 8){
  39. // tmpval = val.substring(0, 4) + "-" + val.substring(4, 6) + "-" + val.substring(6, 8);
  40. //}else{
  41. //}
  42. dims[i].filtertype = 1; //按区间筛选
  43. dims[i].startdt = tmpval;
  44. dims[i].enddt = dims[i].startdt;
  45. delete dims[i].vals;
  46. oldDim = dims[i];
  47. }
  48. }
  49. }
  50. var json = null;
  51. for(j=0;j<comp.dims.length; j++){
  52. if(comp.dims[j].dim_id == dimId){
  53. json = comp.dims[j];
  54. break;
  55. }
  56. }
  57. var ooo = {"id":json.dim_id, "dimdesc" : json.dim_desc, "type":json.dim_type, "colname":json.col_name,"alias":json.alias,"cubeId":json.cubeId,"iscas":'', tname:json.tname, "tableName":(json.dim_tname == null ? "" : json.dim_tname), "tableColKey":(json.tableColKey == null ? "" : json.tableColKey),"tableColName":(json.tableColName == null ? "" : json.tableColName), "dimord":(json.dim_ord==null?"":json.dim_ord), "dim_name":json.dim_name, "iscas":(json.iscas == null ? "" : json.iscas), "grouptype":json.grouptype, "valType":json.valType,calc:json.calc, "ordcol":(json.ordcol == null ? "": json.ordcol), "dateformat":(json.dateformat==null?"":json.dateformat)};
  58. dims.splice(oldDimIndex + 1, 0, ooo);
  59. curTmpInfo.isupdate = true;
  60. tableView(comp, comp.id);
  61. }
  62. //判断是否缓存有维度
  63. if(!comp.dims){
  64. $.ajax({
  65. async:false,
  66. type:"POST",
  67. url: curTmpInfo.qdimUrl ? curTmpInfo.qdimUrl :"queryDims.action",
  68. data:{"cubeId": comp.cubeId},
  69. dataType:"json",
  70. success:function(resp){
  71. comp.dims = resp;
  72. dodrill();
  73. }
  74. });
  75. }else{
  76. dodrill();
  77. }
  78. }
  79. /**
  80. 展开维度,把维度从上级层次展开到下级层次
  81. **/
  82. function openTheDim(compId, pos, val, vdesc, oldDimId){
  83. var comp = findCompById(compId);
  84. var oldDim = findDimById(oldDimId, pos=="row"?comp.rows:comp.cols);
  85. if(oldDim.grouptype == null){
  86. msginfo("维度无下级层次。", "error");
  87. return;
  88. }
  89. var opts = function(resp){
  90. var deal = 0;
  91. for(i=0; i<resp.length; i++){
  92. if(resp[i].dim_id == oldDimId){
  93. //取当前维的下一级
  94. if(i < resp.length - 1 && resp[i + 1].grouptype == resp[i].grouptype){
  95. var t = resp[i + 1];
  96. //判断下级维是否存在
  97. if(dimExist(t.dim_id, comp.cols) || dimExist(t.dim_id, comp.rows)){
  98. deal = 2;
  99. break
  100. }
  101. drill(t.dim_id, compId, pos, val, vdesc, oldDimId, true);
  102. deal = 1;
  103. break;
  104. }
  105. }
  106. }
  107. if(deal == 0){
  108. msginfo("维度无下级层次。", "error");
  109. }else if(deal == 2){
  110. msginfo("维度下级层次已经展开。", "error");
  111. }
  112. };
  113. if(!comp.dims){ //获取组件的维度
  114. $.ajax({
  115. async:false,
  116. type:"POST",
  117. url: curTmpInfo.qdimUrl ? curTmpInfo.qdimUrl :"queryDims.action",
  118. data:{"cubeId": comp.cubeId},
  119. dataType:"json",
  120. success:function(resp){
  121. comp.dims = resp;
  122. opts(comp.dims);
  123. }
  124. });
  125. }else{
  126. opts(comp.dims);
  127. }
  128. }
  129. function drillDim(compId, ts, pos, val, vdesc, oldDimId){
  130. //查询度量已有维
  131. var comp = findCompById(compId);
  132. var offset = $(ts).offset();
  133. var oldDim = findDimById(oldDimId, pos=="row"?comp.rows:comp.cols);
  134. var opts = function(resp){
  135. $("#drillmenu").menu("destroy");
  136. var str = "<div id=\"drillmenu\" style=\"width:150px\">";
  137. var cnt = 0;
  138. var ignoreGroup = [];
  139. var groupExist = function(ignoreGroup, group){
  140. var r = false;
  141. for(k=0; k<ignoreGroup.length; k++){
  142. if(ignoreGroup[k] == group){
  143. r = true;
  144. }
  145. }
  146. return r;
  147. };
  148. var findGroupChild = function(grouptype){
  149. var dimret = [];
  150. for(j=0; j<resp.length; j++){
  151. if(resp[j].grouptype == grouptype){
  152. dimret.push(resp[j]);
  153. }
  154. }
  155. return dimret;
  156. };
  157. for(i=0; i<resp.length; i++){
  158. //忽略已存在的维
  159. if(dimExist(resp[i].dim_id, comp.cols) || dimExist(resp[i].dim_id, comp.rows)){
  160. continue;
  161. }
  162. if(resp[i].grouptype == '' || resp[i].grouptype == null){ //无分组的,直接显示维度
  163. var dim_id = resp[i].dim_id;
  164. str = str + "<div onclick=\"drill("+dim_id+", "+comp.id+", '"+pos+"', '"+val+"', '"+vdesc+"', '"+oldDimId+"', true)\"><span style=\"color:#ccc\">下钻</span>" + resp[i].dim_desc+"</div>"
  165. cnt = cnt + 1;
  166. }else{ //有分组,显示分组, 对于分组,如果下级分组已选择,不能再选择上级分组
  167. if(!groupExist(ignoreGroup, resp[i].grouptype)){
  168. var groups = "<div><span style=\"color:#ccc\">下钻</span><span>" + resp[i].groupname+"</span><div style=\"width:150px;\">"
  169. ignoreGroup.push(resp[i].grouptype);
  170. //查询分组的内容
  171. var lsdim = findGroupChild(resp[i].grouptype);
  172. var ss = "";
  173. var ccnt = 0;
  174. for(kl = 0; kl<lsdim.length; kl++){
  175. var tmp = lsdim[kl];
  176. var bcz = !dimExist(tmp.dim_id, comp.cols) && !dimExist(tmp.dim_id, comp.rows);
  177. if(bcz){
  178. ss = ss + "<div onclick=\"drill("+tmp.dim_id+", "+comp.id+", '"+pos+"', '"+val+"', '"+vdesc+"', '"+oldDimId+"', true)\"><span style=\"color:#ccc\">下钻</span>" + tmp.dim_desc+"</div>"
  179. ccnt = ccnt + 1;
  180. }else{
  181. ss = "";
  182. ccnt = 0;
  183. }
  184. }
  185. groups = groups + ss + "</div></div>";
  186. if(ccnt == 0){
  187. groups = "";
  188. }
  189. str = str + groups;
  190. cnt = cnt + ccnt;
  191. }
  192. }
  193. }
  194. str = str + "</div>";
  195. if(cnt == 0){
  196. msginfo("数据已钻透。", "error");
  197. return;
  198. }
  199. $(str).appendTo("body");
  200. $("#drillmenu").menu({});
  201. $("#drillmenu").menu("show", {left:offset.left, top:offset.top + 20});
  202. }
  203. if(comp.dims){
  204. opts(comp.dims);
  205. }else{
  206. $.ajax({
  207. async:false,
  208. type:"POST",
  209. url: curTmpInfo.qdimUrl ? curTmpInfo.qdimUrl :"queryDims.action",
  210. data:{"cubeId": comp.cubeId},
  211. dataType:"json",
  212. success:function(resp){
  213. comp.dims = resp;
  214. opts(comp.dims);
  215. }
  216. });
  217. }
  218. }
  219. //上卷维度
  220. function goupDim(compId, ts, pos, dimId, islink){
  221. var dims = null;
  222. var comp = findCompById(compId);
  223. if(pos == 'row'){
  224. dims = comp.rows;
  225. }else{
  226. dims = comp.cols;
  227. }
  228. //判断是否有组件联动
  229. if(comp.complink && islink){
  230. var chartComp = findCompById(comp.complink);
  231. if(chartComp != null && isSameDimsInDrill(comp, chartComp)){ //必须维度相同才能联动。
  232. chartGoupDim(chartComp.id, dimId, pos, false);
  233. }
  234. }
  235. //清除过滤条件
  236. //删除该维度以后的维度
  237. var idx = 0;
  238. for(i=0; i<dims.length;i++){
  239. if(dims[i].id == dimId){
  240. dims[i].vals = "";
  241. if(dims[i].type == 'day'){
  242. delete dims[i].startdt;
  243. delete dims[i].enddt;
  244. }
  245. if(dims[i].type == 'month'){
  246. delete dims[i].startmt;
  247. delete dims[i].endmt;
  248. }
  249. idx = i;
  250. break;
  251. }
  252. }
  253. dims.splice(idx + 1, dims.length - 1);
  254. //如果删除维度后无时间维度,并且度量中含有计算度量,需要清除计算度量内容
  255. if(!isExistDateDim(comp, 'table')){
  256. for(var j=0; comp.kpiJson&&j<comp.kpiJson.length; j++){
  257. delete comp.kpiJson[j].compute;
  258. }
  259. }
  260. //如果有参数,并且参数是时间维度,如果参数时间类型表格中没有,移除计算度量
  261. if(!paramsamedimdate(comp)){
  262. for(var j=0; comp.kpiJson&&j<comp.kpiJson.length; j++){
  263. delete comp.kpiJson[j].compute;
  264. }
  265. }
  266. curTmpInfo.isupdate = true;
  267. tableView(comp, comp.id);
  268. }
  269. //图形钻取
  270. function drillChart(xvalue, xvalueDesc,yvalue, svalue, pos, compId, oldDimId){
  271. //查询度量已有维
  272. var comp = findCompById(compId);
  273. var offset = pos;
  274. var deployDim = function(resp){
  275. var oldDim = comp.chartJson.xcol;
  276. if(oldDim.grouptype == null){
  277. msginfo("维度无下级层次。", "error");
  278. return;
  279. }
  280. var deal = 0;
  281. for(i=0; i<resp.length; i++){
  282. if(resp[i].dim_id == oldDimId){
  283. //取当前维的下一级
  284. if(i < resp.length - 1 && resp[i + 1].grouptype == resp[i].grouptype){
  285. var t = resp[i + 1];
  286. drillingChart(t.dim_id, compId, 'row', xvalue, xvalueDesc, oldDimId, true);
  287. deal = 1;
  288. break;
  289. }
  290. }
  291. }
  292. if(deal == 0){
  293. msginfo("维度无下级层次。", "error");
  294. }else if(deal == 2){
  295. msginfo("维度下级层次已经展开。", "error");
  296. }
  297. }
  298. var opts = function(resp){
  299. $("#drillmenu").menu("destroy");
  300. var str = "<div id=\"drillmenu\" style=\"width:150px\">";
  301. var cnt = 0;
  302. var ignoreGroup = [];
  303. var groupExist = function(ignoreGroup, group){
  304. var r = false;
  305. for(k=0; k<ignoreGroup.length; k++){
  306. if(ignoreGroup[k] == group){
  307. r = true;
  308. }
  309. }
  310. return r;
  311. };
  312. var findGroupChild = function(grouptype){
  313. var dimret = [];
  314. for(j=0; j<resp.length; j++){
  315. if(resp[j].grouptype == grouptype){
  316. dimret.push(resp[j]);
  317. }
  318. }
  319. return dimret;
  320. };
  321. for(i=0; i<resp.length; i++){
  322. //忽略用户已经选择的维度
  323. if(dimExist(resp[i].dim_id, comp.chartJson.params) || (comp.chartJson.xcol && resp[i].dim_id == comp.chartJson.xcol.id) || (comp.chartJson.scol && resp[i].dim_id == comp.chartJson.scol.id)){
  324. continue;
  325. }
  326. if(resp[i].grouptype == '' || resp[i].grouptype == null){ //无分组的,直接显示维度
  327. var dim_id = resp[i].dim_id;
  328. str = str + "<div onclick=\"drillingChart("+dim_id+", "+comp.id+", 'row', '"+xvalue+"', '"+xvalueDesc+"', '"+oldDimId+"', true)\"><span style=\"color:#ccc\">下钻</span>" + resp[i].dim_desc+"</div>"
  329. cnt = cnt + 1;
  330. }else{ //有分组,显示分组, 对于分组,如果下级分组已选择,不能再选择上级分组
  331. if(!groupExist(ignoreGroup, resp[i].grouptype)){
  332. var groups = "<div><span style=\"color:#ccc\">下钻</span><span>" + resp[i].groupname+"</span><div style=\"width:150px;\">"
  333. ignoreGroup.push(resp[i].grouptype);
  334. //查询分组的内容
  335. var lsdim = findGroupChild(resp[i].grouptype);
  336. var ss = "";
  337. var ccnt = 0;
  338. for(kl = 0; kl<lsdim.length; kl++){
  339. var tmp = lsdim[kl];
  340. var cz = dimExist(tmp.dim_id, comp.chartJson.params) || (comp.chartJson.xcol && tmp.dim_id == comp.chartJson.xcol.id) || (comp.chartJson.scol && tmp.dim_id == comp.chartJson.scol.id);
  341. if(!cz){
  342. ss = ss + "<div onclick=\"drillingChart("+tmp.dim_id+", "+comp.id+", 'row', '"+xvalue+"', '"+xvalueDesc+"', '"+oldDimId+"', true)\"><span style=\"color:#ccc\">下钻</span>" + tmp.dim_desc+"</div>"
  343. ccnt = ccnt + 1;
  344. }else{
  345. ss = "";
  346. ccnt = 0;
  347. }
  348. }
  349. groups = groups + ss + "</div></div>";
  350. if(ccnt == 0){
  351. groups = "";
  352. }
  353. str = str + groups;
  354. cnt = cnt + ccnt;
  355. }
  356. }
  357. }
  358. str = str + "</div>";
  359. if(cnt == 0){
  360. msginfo("数据已钻透。", "error");
  361. return;
  362. }
  363. $(str).appendTo("body");
  364. $("#drillmenu").menu({});
  365. $("#drillmenu").menu("show", {left:offset.left, top:offset.top + 20});
  366. }
  367. if(comp.dims){
  368. opts(comp.dims);
  369. }else{
  370. $.ajax({
  371. async:false,
  372. type:"POST",
  373. url: curTmpInfo.qdimUrl ? curTmpInfo.qdimUrl :"queryDims.action",
  374. data:{"cubeId": comp.cubeId},
  375. dataType:"json",
  376. success:function(resp){
  377. comp.dims = resp;
  378. opts(comp.dims);
  379. }
  380. });
  381. }
  382. }
  383. //开始钻取图形
  384. function drillingChart(id, compId, pos, xvalue, xvalueDesc, oldDimId, islink){
  385. var comp = findCompById(compId);
  386. //判断是否有组件的dims,如果没有就去获取
  387. if(!comp.dims){
  388. $.ajax({
  389. async:false,
  390. type:"POST",
  391. url:curTmpInfo.qdimUrl ? curTmpInfo.qdimUrl :"queryDims.action",
  392. data:{"cubeId": comp.cubeId},
  393. dataType:"json",
  394. success:function(resp){
  395. comp.dims = resp;
  396. }
  397. });
  398. }
  399. //设置当前维度值为过滤条件
  400. if(pos == "row"){
  401. comp.chartJson.xcol.vals = xvalue + "";
  402. comp.chartJson.xcol.valDesc = xvalueDesc;
  403. comp.chartJson.xcol.pos = "row";
  404. }else{
  405. comp.chartJson.scol.vals = xvalue + "";
  406. comp.chartJson.scol.valDesc = xvalueDesc;
  407. comp.chartJson.scol.pos = "col";
  408. }
  409. //判断是否联动表格
  410. if(comp.complink && islink){
  411. var tableComp = findCompById(comp.complink);
  412. if(tableComp != null && isSameDimsInDrill(tableComp, comp)){ //必须维度相同才能联动。
  413. drill(id, tableComp.id, 'row', xvalue, xvalueDesc, oldDimId, false);
  414. }
  415. }
  416. var dim = pos == "row" ? comp.chartJson.xcol : comp.chartJson.scol;
  417. dim.filtertype = 2; // 按值钻取
  418. if(dim.type == 'month'){
  419. delete dim.startmt;
  420. delete dim.endmt;
  421. }
  422. if(dim.type == 'day'){
  423. delete dim.startdt;
  424. delete dim.enddt;
  425. }
  426. //把当前维放入params
  427. //如果当前维度是合计,不用加入
  428. if(xvalue == '合计' && xvalueDesc == '合计'){
  429. }else{
  430. comp.chartJson.params.push(pos=="row"?comp.chartJson.xcol:comp.chartJson.scol);
  431. }
  432. //更新x轴
  433. var json = null;
  434. for(j=0;j<comp.dims.length; j++){
  435. if(comp.dims[j].dim_id == id){
  436. json = comp.dims[j];
  437. break;
  438. }
  439. }
  440. var nxcol = {"id":json.dim_id, "dimdesc" : json.dim_desc, "type":json.dim_type, "colname":json.col_name,"alias":json.alias,"cubeId":json.cubeId,tname:json.tname,"iscas":'', "tableName":(json.dim_tname == null ? "" : json.dim_tname), "tableColKey":(json.tableColKey == null ? "" : json.tableColKey),"tableColName":(json.tableColName == null ? "" : json.tableColName), "dimord":json.dim_ord, "dim_name":json.dim_name, "iscas":(json.iscas == null ? "" : json.iscas),"grouptype":json.grouptype,"valType":json.valType, "ordcol":(json.ordcol==null?"":json.ordcol), "dateformat":(json.dateformat==null?"":json.dateformat),calc:json.calc};
  441. if(pos == "row"){
  442. comp.chartJson.xcol = nxcol;
  443. }else{
  444. comp.chartJson.scol = nxcol;
  445. }
  446. //回写X轴的值
  447. var node = nxcol;
  448. $("#T" + comp.id + (pos=="row"?" #xcol":" #scol")).html("<span class=\"charttxt\">" + node.dimdesc + "</span><span class=\"charticon\" title=\"配置\" onclick=\"chartmenu(this, "+node.id+","+(pos=="row"?"'xcol'":"'scol'")+", '"+node.dimdesc+"')\"></span>");
  449. curTmpInfo.isupdate = true;
  450. chartview(comp, comp.id);
  451. }
  452. //图形上卷
  453. function chartGoupDim(compId,dimId, pos, islink){
  454. var comp = findCompById(compId);
  455. var dims = comp.chartJson.params;
  456. //判断是否有组件联动
  457. if(comp.complink && islink){
  458. var tableComp = findCompById(comp.complink);
  459. if(tableComp != null && isSameDimsInDrill(tableComp, comp)){ //必须维度相同才能联动。
  460. goupDim(tableComp.id, null, pos, dimId, false);
  461. }
  462. }
  463. //清除过滤条件
  464. //删除该维度以后的维度
  465. var idx = 0;
  466. var xcol = null;
  467. for(i=0; i<dims.length;i++){
  468. if(dims[i].id == dimId){
  469. dims[i].vals = "";
  470. dims[i].valDesc = "";
  471. delete dims[i].filtertype;
  472. idx = i;
  473. xcol = dims[i];
  474. break;
  475. }
  476. }
  477. if(pos == "row"){
  478. comp.chartJson.xcol = xcol;
  479. }else{
  480. comp.chartJson.scol = xcol;
  481. }
  482. dims.splice(idx, dims.length);
  483. //回写X轴的值
  484. var node = xcol;
  485. $("#T" + comp.id + (pos=="row"?" #xcol":" #scol")).html("<span class=\"charttxt\">" + node.dimdesc + "</span><span class=\"charticon\" title=\"配置\" onclick=\"chartmenu(this, "+node.id+","+(pos=="row"?"'xcol'":"'scol'")+", '"+node.dimdesc+"')\"></span>");
  486. curTmpInfo.isupdate = true;
  487. chartview(comp, comp.id);
  488. }
  489. /**
  490. 判断图形和表格是否有相同的维度,如果维度不同,不能联动
  491. **/
  492. function isSameDimsInDrill(table, chart){
  493. var tj = table;
  494. var cj = chart.chartJson;
  495. var tcnt = tj.cols.length + tj.rows.length;
  496. var ccnt = (cj.params?cj.params.length:0) + ($.isEmptyObject(cj.xcol)?0:1) + ($.isEmptyObject(cj.scol)?0:1);
  497. if(tcnt != ccnt){
  498. return false;
  499. }
  500. var ret = true;
  501. for(i=0; cj.params && i<cj.params.length; i++){
  502. if(!dimExist(cj.params[i].id, tj.cols) && !dimExist(cj.params[i].id, tj.rows)){
  503. return false;
  504. }
  505. }
  506. if(!$.isEmptyObject(cj.xcol)){
  507. if(!dimExist(cj.xcol.id, tj.cols) && !dimExist(cj.xcol.id, tj.rows)){
  508. return false;
  509. }
  510. }
  511. if(!$.isEmptyObject(cj.scol)){
  512. if(!dimExist(cj.scol.id, tj.cols) && !dimExist(cj.scol.id, tj.rows)){
  513. return false;
  514. }
  515. }
  516. return ret;
  517. }