model-dset.js 27 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761
  1. if($ == undefined){
  2. $ = jQuery;
  3. }
  4. var dataType = ["String", "Int", "Double", "Date", "Datetime"];
  5. function initdsetTable(){
  6. if($("#dsettable").size() > 0){
  7. $("#dsettable").datagrid("load", {t:Math.random()});
  8. return;
  9. }
  10. var ctx = "<table id=\"dsettable\" title=\"数据集管理\" ><thead><tr><th data-options=\"field:'ck',checkbox:true\"></th><th data-options=\"field:'name',width:120\">名称</th><th data-options=\"field:'priTable',width:200,align:'left'\">主表</th><th data-options=\"field:'dsname',width:120,align:'center'\">数据源</th><th data-options=\"field:'useType',width:120,align:'center'\">连接</th></tr></thead></table>";
  11. $("#optarea").html(ctx);
  12. $("#dsettable").datagrid({
  13. singleSelect:true,
  14. collapsible:false,
  15. pagination:false,
  16. border:false,
  17. fit:true,
  18. url:'listDataset.action',
  19. toolbar:[{
  20. text:'新增',
  21. iconCls:'icon-add',
  22. handler:function(){
  23. newdset(false);
  24. }
  25. },{
  26. text:'修改',
  27. iconCls:'icon-edit',
  28. handler:function(){
  29. var row = $("#dsettable").datagrid("getChecked");
  30. if(row == null || row.length == 0){
  31. $.messager.alert("出错了。","您还未勾选数据。", "error");
  32. return;
  33. }
  34. newdset(true, row[0].dsetId);
  35. }
  36. },{
  37. text:"刷新",
  38. iconCls:"icon-reload",
  39. handler:function(){
  40. var row = $("#dsettable").datagrid("getChecked");
  41. if(row == null || row.length == 0){
  42. $.messager.alert("出错了。","您还未勾选数据。", "error");
  43. return;
  44. }
  45. __showLoading();
  46. $.ajax({
  47. type:'get',
  48. url:'reloadDset.action',
  49. dataType:'json',
  50. data:{"dsetId":row[0].dsetId, "dsid":row[0].dsid},
  51. success: function(dt){
  52. __hideLoading();
  53. if(dt.result == 0){
  54. $.messager.alert("出错了。",dt.msg, "error");
  55. }else{
  56. $.messager.alert("成功了。","字段刷新成功。", "info");
  57. }
  58. },
  59. error:function(){
  60. __hideLoading();
  61. $.messager.alert("出错了。","系统异常。", "error");
  62. }
  63. });
  64. }
  65. },{
  66. text:'删除',
  67. iconCls:'icon-cancel',
  68. handler:function(){
  69. var row = $("#dsettable").datagrid("getChecked");
  70. if(row == null || row.length == 0){
  71. $.messager.alert("出错了。","您还未勾选数据。", "error");
  72. return;
  73. }
  74. delDset(row[0].dsetId);
  75. }
  76. }]
  77. });
  78. }
  79. function delDset(dsetId){
  80. if(confirm("是否确认删除?")){
  81. $.ajax({
  82. url:'deleteDset.action',
  83. data: {dsetId:dsetId},
  84. type:'POST',
  85. dataType:'json',
  86. success:function(){
  87. $("#dsettable").datagrid("reload", {t:Math.random});
  88. },
  89. error:function(){
  90. msginfo("系统出错,请查看后台日志。");
  91. }
  92. });
  93. }
  94. }
  95. function newdset(isupdate, dsetId){
  96. var transform = {};
  97. var treeStr = "";
  98. var tables = "";
  99. if(isupdate){
  100. $.ajax({
  101. type: "POST",
  102. async:false,
  103. url: "getDatasetCfg.action",
  104. dataType:"json",
  105. data: {"dsetId": dsetId},
  106. success: function(resp){
  107. transform = resp;
  108. }
  109. });
  110. treeStr = treeStr + "<li data-options=\"id:'"+transform.master+"',iconCls:'icon-table'\"><span>"+transform.master+"</span></li>"; //添加主表
  111. tables = tables + "<option value=\""+transform.master+"\" selected>"+transform.master+"</option>";
  112. var tbs = [];
  113. for(i=0; transform.joininfo&&i<transform.joininfo.length; i++){
  114. var t = transform.joininfo[i].ref;
  115. if(tbs.indexOf(t) == -1){
  116. tbs.push(t);
  117. treeStr = treeStr + "<li data-options=\"id:'"+t+"',iconCls:'icon-table'\"><span>"+t+"</span></li>"; //添加关联表
  118. }else{
  119. continue;
  120. }
  121. }
  122. }
  123. //数据源列表
  124. var dsls = "";
  125. $.ajax({
  126. type:'GET',
  127. url:'listDataSource.action',
  128. dataType:'JSON',
  129. data:{},
  130. async:false,
  131. success: function(resp){
  132. for(i=0; i<resp.length; i++){
  133. var t = resp[i];
  134. dsls = dsls + "<option value='"+t.dsid+"' "+(t.dsid == transform.dsid?"selected":"")+">"+t.dsname+"</option>";
  135. }
  136. }
  137. });
  138. var ctx = "<div id=\"crtdataset\"><div title=\"基本信息\"><div class=\"textpanel\"><span class=\"inputtext\">数据集名称:</span><input type=\"text\" id=\"name\" name=\"name\" value=\""+(transform.name?transform.name:"")+"\" class=\"inputform\"><br/><span class=\"inputtext\">数据源:</span><select id=\"dsid\" class=\"inputform\">"+dsls+"</select><br/><span class=\"inputtext\" style=\"width:120px;\">选择表:</span><br/><div class=\"tablesleft\"><div class=\"tabletitle\">待选表</div><div style='line-height: 20px;'><input id=\"tablesearch\" style=\"width:100%;\"></input></div><ul id=\"allTablesTree\" style=\"height:240px; width:100%; overflow:auto\"></ul></div><div class=\"tablescenter\"><input id=\"left2right\" type=\"button\" style=\"margin-top:120px;\" value=\">\" title=\"选择\" class=\"btn btn-primary btn-sm\"><br/><br/><input type=\"button\" id=\"right2left\" value=\"<\" title=\"移除\" class=\"btn btn-primary btn-sm\"></div><div class=\"tablesright\"><div class=\"tabletitle\">已选表</div><ul id=\"selTablesTree\" class=\"easyui-tree\" style=\"height:270px; width:100%; overflow:auto\">"+treeStr+"</ul></div></div></div><div title=\"表关联\"><div class=\"textpanel\"><div style=\"float:right\"><input type=\"button\" id=\"jointable\" value=\"关联\" class=\"btn btn-primary btn-xs\"> <br/> <input type=\"button\" id=\"unjointable\" value=\"取消\" class=\"btn btn-primary btn-xs\"></div><span class=\"inputtext\">主表: </span><select id=\"mastertable\" class=\"inputform\" style=\"width:300px;\" "+(isupdate?"disabled":"")+">"+tables+"</select>"+(isupdate?"<font color='#999'>(禁止更改)</font>":"")+"<br/><ul class=\"easyui-tree\" id=\"masterTableTree\" style=\"margin-left:100px;border:1px solid #999; width:300px; height:320px; overflow:auto\"></ul></div></div>"+(isupdate?"<div title=\"表字段\"></div><div title=\"动态字段\"></div>":"")+"</div>";
  139. $('#pdailog').dialog({
  140. title: isupdate?'编辑数据集':'创建数据集',
  141. width: 700,
  142. height: 470,
  143. closed: false,
  144. cache: false,
  145. modal: true,
  146. toolbar:null,
  147. onLoad:function(){
  148. },
  149. content: ctx,
  150. buttons:[{
  151. text:'确定',
  152. iconCls:"icon-ok",
  153. handler:function(){
  154. var name = $("#pdailog #name").val();
  155. if(name == ''){
  156. msginfo("请录入数据集名称。");
  157. $("#pdailog #crtdataset").tabs("select", 0);
  158. $("#pdailog #name").focus();
  159. return;
  160. }
  161. var cld = $("#selTablesTree").tree("getChildren");
  162. if(cld == null || cld.length == 0){
  163. msginfo("请选择表。");
  164. $("#pdailog #crtdataset").tabs("select", 0);
  165. return;
  166. }
  167. //判断是否关联
  168. if(cld.length > 1 && (!transform.joininfo || transform.joininfo.length != cld.length - 1)){
  169. msginfo("请建立表关联。");
  170. $("#pdailog #crtdataset").tabs("select", 1);
  171. return;
  172. }
  173. transform.name = name;
  174. transform.dsid = $("#pdailog #dsid").val();
  175. transform.dsetId = isupdate?transform.dsetId:newGuid();
  176. //新增需要获取字段
  177. if(!isupdate){
  178. $.ajax({
  179. type:'post',
  180. async: false,
  181. url:'queryDatasetMeta.action',
  182. dataType:'json',
  183. data:{"dsid":transform.dsid, "cfg":JSON.stringify(transform)},
  184. success: function(dt){
  185. transform.cols = dt;
  186. }
  187. });
  188. }
  189. __showLoading();
  190. $.ajax({
  191. type: "POST",
  192. async:false,
  193. url: isupdate?"updateDset.action":"saveDset.action",
  194. dataType:"HTML",
  195. data: {cfg:JSON.stringify(transform), priTable: transform.master, name:transform.name,dsid:transform.dsid, dsetId:transform.dsetId},
  196. success: function(resp){
  197. __hideLoading();
  198. $('#pdailog').dialog('close');
  199. $("#dsettable").datagrid("reload", {t:Math.random});
  200. },
  201. error:function(er){
  202. msginfo("系统出错,请查看后台日志。");
  203. __hideLoading();
  204. }
  205. });
  206. }
  207. },{
  208. text:'取消',
  209. iconCls:"icon-cancel",
  210. handler:function(){
  211. $('#pdailog').dialog('close');
  212. }
  213. }]
  214. });
  215. //加载tabs
  216. $("#pdailog #crtdataset").tabs({fit:true,border:false,tabPosition:'left',onSelect:function(a, b){
  217. if(b == 3){
  218. reloadDynamicCol(transform);
  219. }else if(b == 2){ //加载表字段
  220. var pp = $('#pdailog #crtdataset').tabs('getSelected');
  221. var str = "<table class=\"grid3\" id=\"T_report54\" cellpadding=\"0\" cellspacing=\"0\">";
  222. str = str + "<tr><th width='20%'>字段名</th><th width='17%'>显示名</th><th width='13%'>类型</th><th width='30%'>来源表</th><th width='10%'>操作</th></tr>";
  223. for(var i=0; i<transform.cols.length; i++){
  224. m = transform.cols[i];
  225. str = str + "<tr><td class='kpiData1 grid3-td'>"+m.name+"</td><td class='kpiData1 grid3-td'><div id=\""+m.tname+"_"+m.name+"_disp\">"+(m.dispName == '' ? "&nbsp;":m.dispName)+"</div></td><td class='kpiData1 grid3-td'><div id=\""+m.tname+"_"+m.name+"_tp\">"+m.type+"</div></td><td class='kpiData1 grid3-td'>"+m.tname+"</td><td class='kpiData1 grid3-td'><button class=\"btn btn-info btn-xs\" cname='"+m.name+"' tname='"+m.tname+"' >编辑</buttton></td></tr>";
  226. }
  227. str = str + "</table>";
  228. $(pp).html(str);
  229. $("#crtdataset table.grid3 td button").click(function(){
  230. var name = $(this).attr("cname");
  231. var tname = $(this).attr("tname");
  232. editDsColumn(name, transform, tname);
  233. });
  234. }
  235. }
  236. });
  237. $('#tablesearch').searchbox({
  238. searcher:function(value,name){
  239. __showLoading();
  240. $.ajax({
  241. type:'post',
  242. url:'listTables.action',
  243. dataType:'json',
  244. data:{dsid:$("#pdailog #dsid").val(), tname:value},
  245. success: function(dt){
  246. __hideLoading();
  247. $("#allTablesTree").tree({
  248. data: dt
  249. });
  250. //隐藏已经选择的表
  251. var cld = $("#selTablesTree").tree("getChildren");
  252. for(i=0; i<cld.length; i++){
  253. var id = cld[i].id;
  254. var o = $("#allTablesTree").tree("find", id);
  255. if(o){
  256. $(o.target).attr("hide", "y").hide();
  257. }
  258. }
  259. }
  260. });
  261. },
  262. prompt:'请输入表名.'
  263. });
  264. //加载目标表
  265. var initTablesFunc = function(dsid){
  266. //加载表列表树
  267. $.ajax({
  268. type:'post',
  269. url:'listTables.action',
  270. dataType:'json',
  271. data:{dsid:dsid},
  272. success: function(dt){
  273. $("#allTablesTree").tree({
  274. data: dt
  275. });
  276. if(isupdate){
  277. //隐藏已经选择的表
  278. $($("#allTablesTree").tree("find", transform.master).target).attr("hide", "y").hide();
  279. for(k=0; transform.joininfo&&k<transform.joininfo.length; k++){
  280. var j = transform.joininfo[k];
  281. $($("#allTablesTree").tree("find", j.ref).target).attr("hide", "y").hide();
  282. }
  283. }
  284. }
  285. });
  286. }
  287. initTablesFunc($("#pdailog #dsid").val());
  288. $("#pdailog #dsid").change(function(){
  289. initTablesFunc($(this).val());
  290. });
  291. //绑定选择事件
  292. $("#pdailog #left2right").bind("click", function(){
  293. var node = $("#allTablesTree").tree("getSelected");
  294. if(node == null || $(node.target).attr("hide") == 'y'){
  295. msginfo("请先从左边选择表。");
  296. return
  297. }
  298. $("#selTablesTree").tree("append", {parent:null, data:[{id:node.id, text:node.text, iconCls:node.iconCls}]});
  299. $(node.target).attr("hide", "y").hide();
  300. if(isupdate){
  301. //添加字段
  302. $.ajax({
  303. type:'GET',
  304. url:'listTableColumns.action',
  305. dataType:'json',
  306. data:{tname:node.id, dsid:$("#pdailog #dsid").val()},
  307. success: function(dt){
  308. //添加字段
  309. for(k=0; k<dt.length; k++){
  310. dt[k].tname = node.id; //tname
  311. transform.cols.push(dt[k]);
  312. }
  313. }
  314. });
  315. }else{
  316. //更新主表select的数据
  317. var sel = document.getElementById("mastertable");
  318. var sidx = sel.selectedIndex;
  319. sel.options.add(new Option(node.text, node.id));
  320. if(sidx == -1){ //说明是从无到有,更新表字段
  321. updateColsFunc(node.text);
  322. //并且设置为主表
  323. transform.master = node.id;
  324. }
  325. }
  326. });
  327. $("#pdailog #right2left").bind("click", function(){
  328. var node = $("#selTablesTree").tree("getSelected");
  329. if(node == null){
  330. msginfo("您还未选择需要移除的表。");
  331. return
  332. }
  333. if(isupdate && node.id == transform.master){
  334. msginfo("不能移除主表。");
  335. return;
  336. }
  337. var cld = $("#allTablesTree").tree("getChildren");
  338. for(i=0; i<cld.length; i++){
  339. if(cld[i].id == node.id){
  340. $(cld[i].target).attr("hide", "n").show();
  341. break;
  342. }
  343. }
  344. $("#selTablesTree").tree("remove", node.target);
  345. //更新主表select框中内容, 编辑状态下不要更新
  346. if(!isupdate){
  347. var sel = document.getElementById("mastertable");
  348. var sidx = sel.selectedIndex;
  349. var idx = 0;
  350. for(i=0; i<sel.options.length; i++){
  351. if(sel.options[i].value == node.id){
  352. idx = i;
  353. break;
  354. }
  355. }
  356. sel.options.remove(idx);
  357. if(sidx == idx){ //如果删除那个字段刚好是选择的字段,更新表字段
  358. updateColsFunc(sel.options[sel.selectedIndex].value);
  359. transform.master = sel.options[sel.selectedIndex].value;
  360. }
  361. }else{
  362. //编辑状态下移除字段
  363. var ret = [];
  364. for(i=0; i<transform.cols.length; i++){
  365. var t = transform.cols[i];
  366. if(t.tname != node.id){
  367. ret.push(t);
  368. }
  369. }
  370. transform.cols = ret;
  371. //移除关联
  372. var idx = -1;
  373. for(j=0; j<transform.joininfo.length; j++){
  374. if(transform.joininfo[j].ref == node.id){
  375. idx = j;
  376. }
  377. }
  378. if(idx != -1){
  379. transform.joininfo.splice(idx, 1);
  380. }
  381. }
  382. });
  383. //表关联 -- 取消关联按钮
  384. $("#unjointable").bind("click", function(){
  385. var node = $("#masterTableTree").tree("getSelected");
  386. if(node == null){
  387. msginfo("您还未从主表字段中选择需要删除关联的字段。");
  388. return;
  389. }
  390. delete node.attributes.ref;
  391. delete node.attributes.refKey;
  392. $("#masterTableTree").tree("update", {target:node.target, text:node.id, iconCls:"icon-dscol"});
  393. //从transform 移除关联
  394. var idx = -1;
  395. for(j=0; j<transform.joininfo.length; j++){
  396. if(transform.joininfo[j].col == node.id){
  397. idx = j;
  398. }
  399. }
  400. transform.joininfo.splice(idx, 1);
  401. });
  402. //表关联 -- 关联按钮
  403. $("#pdailog #jointable").click(function(){
  404. jointableFunc(transform);
  405. });
  406. //更新表关联表的字段
  407. var updateColsFunc = function(tname){
  408. $.ajax({
  409. type:'post',
  410. url:'listTableColumns.action',
  411. dataType:'json',
  412. data:{"tname": tname, dsid:$("#pdailog #dsid").val()},
  413. success: function(dt){
  414. var d = [];
  415. for(k=0; k<dt.length; k++){
  416. var obj = {id:dt[k].name, text:dt[k].name, iconCls:"icon-dscol", attributes:{}};
  417. if(isupdate){
  418. var joininfo = findJoinInfoById(transform, dt[k].name);
  419. if(joininfo != null){
  420. obj.iconCls = "icon-coljoin";
  421. obj.attributes.ref = joininfo.ref;
  422. obj.attributes.refKey = joininfo.refKey;
  423. obj.text = dt[k].name + " -> " + joininfo.ref + "." + joininfo.refKey;
  424. }
  425. }
  426. d.push(obj);
  427. }
  428. $("#masterTableTree").tree({
  429. data: d,
  430. onDblClick:function(node){
  431. jointableFunc(transform);
  432. }
  433. });
  434. }
  435. });
  436. }
  437. $("#mastertable").bind("change", function(){
  438. updateColsFunc($(this).val());
  439. transform.master = $(this).val(); //并且把选择表设置为主表
  440. });
  441. //如果是修改状态,获取主表的字段列表
  442. if(isupdate){
  443. updateColsFunc(transform.master);
  444. }
  445. }
  446. function editDsColumn(colId, dset, tname){
  447. if($("#dsColumn_div").size() == 0){
  448. $("<div id=\"dsColumn_div\" class=\"easyui-menu\"></div>").appendTo("body");
  449. }
  450. var tmp = null;
  451. for(var i=0; i<dset.cols.length; i++){
  452. if(dset.cols[i].name == colId && dset.cols[i].tname == tname){
  453. tmp = dset.cols[i];
  454. break;
  455. }
  456. }
  457. var tps = "";
  458. for(var i=0; i<dataType.length; i++){
  459. tps = tps + "<option value=\""+dataType[i]+"\" "+(tmp.type == dataType[i] ? "selected" : "")+">"+dataType[i]+"</option>";
  460. }
  461. var joinInfo = null;
  462. //查询表字段关联信息
  463. for(j=0; dset.joininfo && j<dset.joininfo.length; j++){
  464. //是主表,字段相同
  465. if( dset.master==tmp.tname && dset.joininfo[j].col == tmp.name){
  466. joinInfo = dset.joininfo[j];
  467. break;
  468. }else
  469. if(tmp.tname == dset.joininfo[j].ref && tmp.name == dset.joininfo[j].refKey ){
  470. joinInfo = dset.joininfo[j];
  471. break;
  472. }
  473. }
  474. var ctx = "<div class=\"textpanel\"><span class=\"inputtext\">字段名:</span>"+tmp.name+"<br/><span class=\"inputtext\">显示名:</span><input type=\"text\" name=\"coldispname\" id=\"coldispname\" value=\""+tmp.dispName+"\" class=\"inputform2\"><br/><span class=\"inputtext\">类型:</span><select id=\"coltype\" class=\"inputform2\">"+tps+"</select><br/><span class=\"inputtext\">来源表:</span>"+tmp.tname+"<br/><span class=\"inputtext\">字段关联:</span>"+(joinInfo==null?"字段无关联":dset.master+"."+joinInfo.col+" -> " + joinInfo.ref+"."+joinInfo.refKey)+(joinInfo!=null?"<br/><span class=\"inputtext\">关联类型:</span>"+(joinInfo.jtype=="all"?"全连接":(joinInfo.jtype=="left"?"左连接":"右连接")):"")+(joinInfo==null?"":"<br/><span class=\"inputtext\">强制连接:</span>"+(joinInfo.force=="y"?"是":"否"))+"</div>";
  475. $('#dsColumn_div').dialog({
  476. title: '编辑字段信息',
  477. width: joinInfo == null ? 350 : 450,
  478. height: joinInfo == null ? 240:300,
  479. closed: false,
  480. cache: false,
  481. modal: true,
  482. toolbar:null,
  483. content:ctx,
  484. onLoad:function(){},
  485. onClose:function(){
  486. $('#dsColumn_div').dialog('destroy');
  487. },
  488. buttons:[{
  489. text:'确定',
  490. iconCls:"icon-ok",
  491. handler:function(){
  492. tmp.dispName = $("#dsColumn_div #coldispname").val();
  493. tmp.type = $("#dsColumn_div #coltype").val();
  494. tmp.isupdate = 'y';
  495. //回写值
  496. $("#crtdataset #"+tmp.tname+"_"+tmp.name+"_disp").text(tmp.dispName);
  497. $("#crtdataset #"+tmp.tname+"_"+tmp.name+"_tp").text(tmp.type);
  498. $('#dsColumn_div').dialog('close');
  499. }
  500. },{
  501. text:'取消',
  502. iconCls:"icon-cancel",
  503. handler:function(){
  504. $('#dsColumn_div').dialog('close');
  505. }
  506. }]
  507. });
  508. }
  509. //动态字段
  510. function reloadDynamicCol(transform){
  511. var str = "<a href=\"javascript:;\" style=\"margin:3px;\" id=\"dynamiccol\">新增</a><table class=\"grid3\" id=\"T_report54\" cellpadding=\"0\" cellspacing=\"0\">";
  512. str = str + "<tr><th width=\"15%\">字段名</th><th width=\"40%\">表达式</th><th width=\"15%\">值类型</th><th width=\"15%\">操作</th></tr>";
  513. for(var i=0; transform.dynamic && i<transform.dynamic.length; i++){
  514. var o = transform.dynamic[i];
  515. str = str + "<tr><td class=\"kpiData1 grid3-td\">"+o.name+"</td><td class=\"kpiData1 grid3-td\">"+o.expression.replace(/@/g,"'")+"</td><td class=\"kpiData1 grid3-td\">"+o.type+"</td><td class=\"kpiData1 grid3-td\"><button class=\"btn btn-info btn-xs\" col=\""+o.name+"\" id=\"dynamiccolupdate\">编辑</button> <button col=\""+o.name+"\" id=\"dynamiccoldel\" class=\"btn btn-danger btn-xs\">删除</button></td></tr>";
  516. }
  517. if(!transform.dynamic || transform.dynamic.length==0){
  518. str = str + "<tr><td class=\"kpiData1 grid3-td\" align=\"center\" colspan=\"4\">无数据.</td></tr>";
  519. }
  520. str = str + "</table>";
  521. var pp = $('#pdailog #crtdataset').tabs('getSelected');
  522. $(pp).html(str);
  523. var dynamicfunc = function(ccol){
  524. //如果没有字段信息,不添加
  525. if(!transform.master){
  526. msginfo("还未选择表,请先选择表。");
  527. return;
  528. }
  529. var tps = "";
  530. for(var i=0; i<dataType.length; i++){
  531. tps = tps + "<option value=\""+dataType[i]+"\" "+( ccol && ccol.type == dataType[i] ? "selected" : "")+">"+dataType[i]+"</option>";
  532. }
  533. var cols = "";
  534. $.ajax({
  535. type:"post",
  536. async:false,
  537. url:"listTableColumns.action",
  538. dataType:"json",
  539. data:{tname:transform.master,dsid:$("#pdailog #dsid").val()},
  540. success:function(resp){
  541. for(k=0; k<resp.length; k++){
  542. cols = cols + "<button name=\""+resp[k].name+"\" class=\"btn btn-primary btn-xs\">"+resp[k].name+"</button> ";
  543. }
  544. }
  545. });
  546. var ctx = "<div class=\"textpanel\"><span class=\"inputtext\">字段名:</span><input type=\"text\" id=\"colname\" name=\"colname\" class=\"inputform2\" value=\""+(ccol?ccol.name:"")+"\">(英文字符)<br/><table cellspacing=\"0\" cellpadding=\"0\"><tbody><tr><td valign=\"top\"><span class=\"inputtext\">表 达 式:</span></td><td><textarea name=\"expression\" id=\"expression\" class=\"inputform2\" style=\"width:200px;height:60px;\">"+(ccol?ccol.expression.replace(/@/g,"'"):"")+"</textarea></td></tr></tbody></table><div class=\"actColumn\" style=\"margin-top:12px;\">"+cols+"</div><span class=\"inputtext\">值类型:</span><select class=\"inputform2\" id=\"valtype\" class=\"inputform\">"+tps+"</select></div>";
  547. if($("#dsColumn_div").size() == 0){
  548. $("<div id=\"dsColumn_div\" class=\"easyui-menu\"></div>").appendTo("body");
  549. }
  550. $('#dsColumn_div').dialog({
  551. title: ccol ? '编辑动态字段' : '添加动态字段',
  552. width: 380,
  553. height: 290,
  554. closed: false,
  555. cache: false,
  556. modal: true,
  557. toolbar:null,
  558. content:ctx,
  559. onLoad:function(){},
  560. onClose:function(){
  561. $('#dsColumn_div').dialog('destroy');
  562. },
  563. buttons:[{
  564. text:'确定',
  565. iconCls:"icon-ok",
  566. handler:function(){
  567. var name = $("#dsColumn_div #colname").val();
  568. var expression = $("#dsColumn_div #expression").val().replace(/'/g,"@");
  569. if(name == ''){
  570. msginfo("请录入字段名!", function(){
  571. $("#dsColumn_div #colname").focus();
  572. });
  573. return;
  574. }
  575. if(ischinese(name)){
  576. msginfo("字段名必须是英文字符。");
  577. $("#dsColumn_div #colname").focus();
  578. return;
  579. }
  580. if(expression == ''){
  581. msginfo("请录入表达式!", function(){
  582. $("#dsColumn_div #expression").focus();
  583. });
  584. return;
  585. }
  586. if(ccol){
  587. ccol.name = name
  588. ccol.type = $("#dsColumn_div #valtype").val();
  589. ccol.expression = expression
  590. }else{
  591. var obj = {name:name,tname:transform.master,type:$("#dsColumn_div #valtype").val(),expression:expression};
  592. if(!transform.dynamic){
  593. transform.dynamic = [];
  594. }
  595. transform.dynamic.push(obj);
  596. }
  597. $('#dsColumn_div').dialog('close');
  598. reloadDynamicCol(transform);
  599. }
  600. },{
  601. text:'取消',
  602. iconCls:"icon-cancel",
  603. handler:function(){
  604. $('#dsColumn_div').dialog('close');
  605. }
  606. }]
  607. });
  608. $("#dsColumn_div .actColumn button").bind("click", function(){
  609. var txt = $(this).attr("name");
  610. insertText2focus(document.getElementById("expression"), txt);
  611. });
  612. };
  613. $("#crtdataset #dynamiccoldel").bind("click", function(){
  614. if(!confirm("是否确认删除?")){
  615. return;
  616. }
  617. var idx = -1;
  618. var name = $(this).attr("col");
  619. for(i=0; i<transform.dynamic.length; i++){
  620. if(transform.dynamic[i].name == name){
  621. idx = i;
  622. break;
  623. }
  624. }
  625. transform.dynamic.splice(idx, 1);
  626. reloadDynamicCol(transform);
  627. });
  628. $("#crtdataset #dynamiccolupdate").bind("click", function(){
  629. var name = $(this).attr("col");
  630. var o = null;
  631. for(i=0; i<transform.dynamic.length; i++){
  632. if(transform.dynamic[i].name == name){
  633. o = transform.dynamic[i];
  634. break;
  635. }
  636. }
  637. dynamicfunc(o);
  638. });
  639. $("#crtdataset #dynamiccol").bind("click", function(){
  640. dynamicfunc();
  641. }).linkbutton({iconCls:"icon-add"});
  642. }
  643. function jointableFunc(transform){
  644. var node = $("#masterTableTree").tree("getSelected");
  645. if(node == null){
  646. msginfo("您还未从主表字段中选择需要关联的字段。");
  647. return;
  648. }
  649. //获取关联对象
  650. var joinInfo = findJoinInfoById(transform, node.id);
  651. if(joinInfo == null){
  652. joinInfo = undefined;
  653. }
  654. //建立关联
  655. if($("#dsColumn_div").size() == 0){
  656. $("<div id=\"dsColumn_div\"></div>").appendTo("body");
  657. }
  658. var tbs = "";
  659. var tname = null;
  660. var cld = $("#selTablesTree").tree("getChildren");
  661. for(i=0; i<cld.length; i++){
  662. if(cld[i].id != $("#mastertable").val()){
  663. tbs = tbs + "<option value=\""+cld[i].id+"\" "+(joinInfo&&joinInfo.ref==cld[i].id?"selected":"")+">"+cld[i].text+"</option>";
  664. if(tname == null){
  665. tname = cld[i].id;
  666. }
  667. }
  668. }
  669. var getSlaveColumns = function(tn){
  670. var slavecols = "";
  671. //获取选取从表的表字段
  672. if(tname != null){
  673. $.ajax({
  674. type:'post',
  675. async:false,
  676. url:'listTableColumns.action',
  677. dataType:'json',
  678. data:{"tname": tn,dsid:$("#pdailog #dsid").val()},
  679. success: function(dt){
  680. for(k=0; k<dt.length; k++){
  681. slavecols = slavecols + "<option value=\""+ dt[k].name+"\" "+(joinInfo&&joinInfo.refKey == dt[k].name?"selected":"")+">" + dt[k].name + "</option>";
  682. }
  683. }
  684. });
  685. }
  686. return slavecols;
  687. };
  688. var ctx = "<div class=\"textpanel\">主表 <b>"+$("#mastertable").val()+"</b> 字段 <b>"+node.id+"</b> <br/> &nbsp; &nbsp; &nbsp; =>关联到=> <br/>从表:<select id=\"slavetable\" class=\"inputform\" style=\"width:150px;\">"+tbs+"</select><br/>字段:<select id=\"slavetablecol\" class=\"inputform\" style=\"width:150px;\">"+getSlaveColumns(tname)+"</select><br/> 方式:<select id=\"jtype\" style=\"width:160px;\" class=\"inputform\"><option value=\"all\" "+(joinInfo&&joinInfo.jtype=="all"?"selected":"")+">全连接</option><option value=\"left\" "+(joinInfo&&joinInfo.jtype=="left"?"selected":"")+">左连接</option><option value=\"right\" "+(joinInfo&&joinInfo.jtype=="right"?"selected":"")+">右连接</option></select> </div>";
  689. $('#dsColumn_div').dialog({
  690. title: "关联维度表",
  691. width: 350,
  692. height: 240,
  693. closed: false,
  694. cache: false,
  695. modal: true,
  696. toolbar:null,
  697. content:ctx,
  698. onLoad:function(){},
  699. onClose:function(){
  700. $('#dsColumn_div').dialog('destroy');
  701. },
  702. buttons:[{
  703. text:'确定',
  704. iconCls:"icon-ok",
  705. handler:function(){
  706. //建立关联关系
  707. node.attributes.ref = $("#dsColumn_div #slavetable").val();
  708. node.attributes.refKey = $("#dsColumn_div #slavetablecol").val();
  709. node.attributes.jtype = $("#dsColumn_div #jtype").val();
  710. $("#masterTableTree").tree("update", {target:node.target, text:node.id + " -> " + node.attributes.ref + "." + node.attributes.refKey, iconCls:"icon-coljoin"});
  711. //给transform添加关联
  712. if(!transform.joininfo){
  713. transform.joininfo = [];
  714. }
  715. if(joinInfo){
  716. joinInfo.col = node.id;
  717. joinInfo.ref = node.attributes.ref;
  718. joinInfo.refKey = node.attributes.refKey;
  719. joinInfo.jtype = node.attributes.jtype;
  720. }else{
  721. transform.joininfo.push({col:node.id, ref:node.attributes.ref, refKey: node.attributes.refKey, jtype:node.attributes.jtype});
  722. }
  723. $('#dsColumn_div').dialog('close');
  724. }
  725. },{
  726. text:'取消',
  727. iconCls:"icon-cancel",
  728. handler:function(){
  729. $('#dsColumn_div').dialog('close');
  730. }
  731. }]
  732. });
  733. $("#slavetable").bind("change", function(){
  734. var s = getSlaveColumns($(this).val());
  735. $("#slavetablecol").html(s);
  736. });
  737. }
  738. function findJoinInfoById(transform, col){
  739. var ret = null;
  740. for(i=0; transform.joininfo&&i<transform.joininfo.length; i++){
  741. if(transform.joininfo[i].col == col){
  742. ret = transform.joininfo[i];
  743. break;
  744. }
  745. }
  746. return ret;
  747. }