DataDictionary.js 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565
  1. Ext.QuickTips.init();
  2. Ext.define('erp.controller.ma.DataDictionary', {
  3. extend: 'Ext.app.Controller',
  4. FormUtil: Ext.create('erp.util.FormUtil'),
  5. GridUtil: Ext.create('erp.util.GridUtil'),
  6. BaseUtil: Ext.create('erp.util.BaseUtil'),
  7. views:[
  8. 'ma.DataDictionary','core.form.Panel','core.grid.Panel2','core.button.Sync','ma.DataDictionaryGrid',
  9. 'core.button.Add','core.button.Submit','core.button.Audit','core.button.Save','core.button.Close','core.button.Print',
  10. 'core.button.Upload','core.button.Update','core.button.Delete','core.button.DeleteDetail','core.button.ResAudit',
  11. 'core.trigger.TextAreaTrigger','core.trigger.DbfindTrigger','core.toolbar.Toolbar'
  12. ],
  13. init:function(){
  14. var me = this;
  15. this.control({
  16. 'form':{
  17. afterrender:function(form){
  18. if(!currentRecord && tablename){
  19. me.getTable(form,tablename);
  20. me.getRelations(tablename);
  21. }
  22. }
  23. },
  24. 'button[itemId=save]':{
  25. click:function(btn){
  26. var params=me.getColumnChanges();
  27. Ext.apply(params,me.getIndexChanges());
  28. params.tablename=tablename;
  29. var form=btn.ownerCt.ownerCt,values=form.getForm().getValues();
  30. params.formStore=Ext.JSON.encode(values);
  31. me.FormUtil.setLoading(true);
  32. Ext.Ajax.request({
  33. method:'post',
  34. url:basePath+'ma/dataDictionary/alter.action',
  35. params:params,
  36. callback : function(options, success, response){
  37. me.FormUtil.setLoading(false);
  38. if (!response) return;
  39. var res = new Ext.decode(response.responseText);
  40. if(res.success){
  41. window.location.reload();
  42. }
  43. else if(res.exceptionInfo != null){
  44. showError(res.exceptionInfo);return;
  45. }
  46. }
  47. });
  48. }
  49. },
  50. 'button[itemId=add]':{
  51. click:function(btn){
  52. me.FormUtil.onAdd('addDic', '系统数据字典', 'jsps/ma/dataDictionary.jsp');
  53. }
  54. },
  55. 'button[itemId=close]':{
  56. click:function(btn){
  57. var main = parent.Ext.getCmp("content-panel");
  58. main.getActiveTab().close();
  59. }
  60. },
  61. 'radiogroup':{
  62. change: function(group ,newvalue,oldvalue){
  63. if(Ext.isString(newvalue.uniqueness)){
  64. me.isDirtyChange(newvalue.uniqueness, group.name);
  65. }
  66. }
  67. },
  68. 'gridpanel[id=grid]':{
  69. afterrender:function(grid){
  70. grid.plugins[1].on('beforeedit',function(e,Opts){
  71. if(e.column.dataIndex == 'data_length'){
  72. var record = e.record,column = e.column;
  73. var f = record.data['data_type'];
  74. if(f=='DATE' || f=='CLOB' || f=='TIMESTAMP'){
  75. return false;
  76. }
  77. }
  78. });
  79. grid.plugins[1].on('edit',function(editor,e){
  80. if(e.field=='column_name'){
  81. var record = e.record,value=e.value;
  82. Ext.Array.each(record.store.data.items,function(item,index){
  83. if(item.get('column_name')==value && index!=e.rowIdx){
  84. Ext.Msg.alert('提示','列 '+value+' 已存在!');
  85. e.record.reject();
  86. }
  87. });
  88. }
  89. });
  90. }
  91. },
  92. 'gridpanel[id=index_column_grid]':{
  93. afterrender:function(grid){
  94. grid.plugins[0].on('edit',function(editor,e,Opts){
  95. /*if()
  96. e.originalValue!=e.value
  97. e.record.reject();*/
  98. var msg=me._checkIndex_col(e.value,e.record,e.rowIdx);
  99. if(msg){
  100. e.record.reject();
  101. Ext.Msg.alert('提示',msg);
  102. }
  103. });
  104. }
  105. },
  106. 'button[itemId=column_add]':{
  107. click:function(btn){
  108. var g=btn.ownerCt.ownerCt;
  109. g.getStore().insert(0,{data_type:'VARCHAR2',data_length:20,nullable:'Y'});
  110. }
  111. },
  112. 'button[itemId=add_index]':{
  113. click:function(btn){
  114. var list=btn.ownerCt.ownerCt.down('boundlist[name=tab_indexs]'),_s=list.store,maxNum=0,_index;
  115. Ext.Array.each(_s.data.items,function(record){
  116. _index=record.get('index_name');
  117. if(_index.indexOf(tablename+'_INDEX')>-1){
  118. var s=_index.split(tablename+'_INDEX')[1];
  119. if(s.length>0){
  120. if(Ext.isNumeric(s)){
  121. if(s>maxNum) maxNum=s;
  122. }
  123. }
  124. }
  125. });
  126. maxNum=parseInt(maxNum)+1;
  127. var data={
  128. index_name:tablename+'_INDEX'+maxNum,
  129. uniqueness:'NONUNIQUE',
  130. ind_columns:[]
  131. };
  132. _s.insert(_s.data.items.length,data);
  133. var _bound=Ext.ComponentQuery.query('boundlist')[0];
  134. _bound.select(_s.data.items.length-1);
  135. me.setIndexDisp(data);
  136. }
  137. },
  138. 'button[itemId=delete_index]':{
  139. click:function(btn){
  140. var list=btn.ownerCt.ownerCt.down('boundlist[name=tab_indexs]'),_s=list.store;
  141. _s.remove(list.getSelectionModel().getSelection());
  142. if(_s.data.items.length>0){
  143. list.select(0);
  144. me.setIndexDisp(_s.data.items[0].data);
  145. }
  146. }
  147. },
  148. 'button[itemId=add_ind_column]':{
  149. click:function(btn){
  150. var _g=Ext.getCmp('index_column_grid'),store=_g.getStore();
  151. var _col=me.getInd_column(store.collect('COLUMN_NAME'));
  152. store.insert(store.data.items.length,{
  153. COLUMN_NAME:_col,
  154. DESCEND:'ASC'
  155. });
  156. var arr=new Array();
  157. Ext.Array.each(store.data.items,function(item){
  158. arr.push(item.data);
  159. });
  160. me.isDirtyChange(arr, "ind_columns");
  161. }
  162. },
  163. 'button[itemId=delete_ind_column]':{
  164. click:function(btn){
  165. var _g=Ext.getCmp('index_column_grid'),store=_g.getStore();
  166. var selected=_g.getSelectionModel().getLastSelected();
  167. var arr=new Array();
  168. if(selected) store.remove(selected);
  169. Ext.Array.each(store.data.items,function(item){
  170. arr.push(item.data);
  171. });
  172. me.isDirtyChange(arr, "ind_columns");
  173. }
  174. },
  175. 'boundlist[name=tab_indexs]':{
  176. itemclick:function(view,record){
  177. me.setIndexDisp(record.data);
  178. },
  179. beforrender:function(list){
  180. list.multiSelect=false;
  181. },
  182. afterrender:function(c){
  183. Ext.defer(function(){
  184. var _bound=Ext.ComponentQuery.query('boundlist')[0],_store=_bound.getStore();
  185. if(_store.data.items.length>0 && _bound.getSelectedNodes().length==0){
  186. _bound.select(0);
  187. me.setIndexDisp(_store.data.items[0].data);
  188. }
  189. },200);
  190. }
  191. },
  192. 'erpSaveButton': {
  193. afterrender: function(){
  194. me.getDetail();
  195. },
  196. click: function(btn){
  197. me.save(btn);
  198. }
  199. },
  200. 'erpUpdateButton': {
  201. click: function(btn){
  202. var form = btn.up('form'),
  203. grid = form.ownerCt.down('grid'),
  204. table = form.down('#dd_tablename').value,
  205. key = form.down('#dd_primekey').value;
  206. grid.store.each(function(){
  207. if(this.get('ddd_id') == 0) {
  208. this.set('ddd_tablename', table);
  209. this.set('ddd_primekey', key);
  210. }
  211. });
  212. me.FormUtil.onUpdate(this);
  213. }
  214. },
  215. 'erpAddButton': {
  216. click: function(){
  217. me.FormUtil.onAdd('addDataDictionary', '新增数据字典', 'jsps/ma/dataDictionary.jsp');
  218. }
  219. },
  220. 'erpCloseButton': {
  221. click: function(btn){
  222. me.FormUtil.beforeClose(me);
  223. }
  224. },
  225. 'erpGridPanel2': {
  226. afterrender: function(g) {
  227. g.plugins[0].on('beforeedit', function(args){
  228. if(g.readOnly || (args.record.get('ddd_id') > 0 && args.field != 'ddd_description')) {// 已存在的,不允许直接界面修改
  229. return false;
  230. }
  231. });
  232. },
  233. itemclick: function(selModel, record) {
  234. if(record)
  235. selModel.ownerCt.down('erpAddDetailButton').setDisabled(false);// 可新增字段
  236. }
  237. },
  238. 'erpFormPanel textfield[name=dd_tablename]': {
  239. change: function(field){
  240. field.setValue(field.value.toUpperCase());
  241. var grid = Ext.getCmp('grid');
  242. Ext.each(grid.store.data.items, function(item){
  243. if(item.dirty == true){
  244. item.set('ddd_tablename', Ext.getCmp('dd_tablename').value);
  245. item.set('ddd_updatetime', Ext.getCmp('dd_updatetime').value);
  246. item.set('ddd_updateuser', Ext.getCmp('dd_updateuser').value);
  247. item.set('ddd_primekey', Ext.getCmp('dd_primekey').value);
  248. }
  249. });
  250. }
  251. },
  252. 'erpFormPanel textfield[name=dd_updatetime]': {
  253. change: function(){
  254. var grid = Ext.getCmp('grid');
  255. Ext.each(grid.store.data.items, function(item){
  256. if(item.dirty == true){
  257. item.set('ddd_tablename', Ext.getCmp('dd_tablename').value);
  258. item.set('ddd_updatetime', Ext.getCmp('dd_updatetime').value);
  259. item.set('ddd_updateuser', Ext.getCmp('dd_updateuser').value);
  260. item.set('ddd_primekey', Ext.getCmp('dd_primekey').value);
  261. }
  262. });
  263. }
  264. },
  265. 'erpFormPanel textfield[name=dd_updateuser]': {
  266. change: function(){
  267. var grid = Ext.getCmp('grid');
  268. Ext.each(grid.store.data.items, function(item){
  269. if(item.dirty == true){
  270. item.set('ddd_tablename', Ext.getCmp('dd_tablename').value);
  271. item.set('ddd_updatetime', Ext.getCmp('dd_updatetime').value);
  272. item.set('ddd_updateuser', Ext.getCmp('dd_updateuser').value);
  273. item.set('ddd_primekey', Ext.getCmp('dd_primekey').value);
  274. }
  275. });
  276. }
  277. }
  278. });
  279. },
  280. _checkIndex_col:function(value,record,rowIndex){
  281. var msg=null;
  282. Ext.Array.each(record.store.data.items,function(item,index){
  283. if(item.get('COLUMN_NAME')==value && index!=rowIndex){
  284. msg='列 '+value+' 在索引 '+Ext.getCmp('index_name').value+' 中只能使用一次';
  285. return false;
  286. }
  287. });
  288. return msg;
  289. },
  290. getForm: function(btn){
  291. return btn.ownerCt.ownerCt;
  292. },
  293. getTable:function(form,tablename){
  294. if(tablename){
  295. Ext.Ajax.request({
  296. url : basePath + '/common/getFieldsData.action',
  297. async: false,
  298. params: {
  299. caller: 'USER_OBJECTS LEFT JOIN User_Tab_Comments ON OBJECT_NAME=User_Tab_Comments.Table_Name',
  300. fields: 'object_name,object_id,comments',
  301. condition: "OBJECT_NAME='"+tablename+"' and OBJECT_TYPE='TABLE'"
  302. },
  303. method : 'post',
  304. callback : function(opt, s, res){
  305. var r = new Ext.decode(res.responseText);
  306. if(r.exceptionInfo){
  307. showError(r.exceptionInfo);return;
  308. } else if(r.success && r.data){
  309. form.getForm().setValues(r.data);
  310. }
  311. }
  312. });
  313. }
  314. },
  315. setIndexDisp:function(data){
  316. Ext.getCmp('uniqueness').setValue({uniqueness:data['uniqueness']});
  317. Ext.getCmp('index_name').setValue(data['index_name']);
  318. Ext.getCmp('index_column_grid').getStore().loadData(data['ind_columns']);
  319. },
  320. getSelectNode:function(_bound){
  321. if(!_bound) _bound=Ext.ComponentQuery.query('boundlist')[0];
  322. var selects=_bound.getSelectionModel().getSelection();
  323. if(selects.length>0) return selects[0];
  324. else return null;
  325. },
  326. isDirtyChange:function(newvalue,name,record){
  327. if(!record) record=this.getSelectNode();
  328. if(newvalue != record.get(name)){
  329. record.set(name,newvalue);
  330. }
  331. },
  332. getInd_column:function(arr){
  333. var store=Ext.getCmp('grid').getStore(),_column=null;
  334. Ext.Array.each(store.data.items,function(item){
  335. if(!Ext.Array.contains(arr,item.get('column_name'))){
  336. _column=item.get('column_name');
  337. return false;
  338. }
  339. });
  340. return _column;
  341. },
  342. checkTab_columns:function(){
  343. // var grid=Ext.getCmp('grid');
  344. },
  345. getColumnChanges:function(){
  346. var grid=Ext.getCmp('grid'),store=grid.getStore(),
  347. toUpdated=store.getUpdatedRecords();
  348. toCreated=store.getNewRecords();
  349. toRemoved=store.getRemovedRecords();
  350. var columparam=new Object();
  351. if(toUpdated.length>0){
  352. var updated=new Array();
  353. Ext.Array.each(toUpdated,function(item){
  354. if(item.get('column_name')!=null && item.get('column_name')!='' && item.get('data_type')!=null && item.get('comments')!=null && item.get('comments')!=''){
  355. updated.push(item.data);
  356. }
  357. });
  358. columparam['Col_update']=Ext.JSON.encode(updated);
  359. }
  360. if(toCreated.length>0){
  361. var created=new Array();
  362. Ext.Array.each(toCreated,function(item){
  363. if(item.get('column_name')!=null && item.get('column_name').trim()!="" && item.get('data_type')!=null && item.get('data_type').trim()!="" && item.get('comments')!=null && item.get('comments')!=''){
  364. created.push(item.data);
  365. }
  366. });
  367. columparam['Col_create']=Ext.JSON.encode(created);
  368. }
  369. if(toRemoved.length>0){
  370. var removed=new Array();
  371. Ext.Array.each(toCreated,function(item){
  372. if(item.get('column_name')!=null && item.get('column_name')!=' ' && item.get('data_type')!=null){
  373. removed.push(item.data);
  374. }
  375. });
  376. columparam['Col_remove']=Ext.JSON.encode(removed);
  377. }
  378. return columparam;
  379. },
  380. getIndexChanges:function(){
  381. var _bound=Ext.ComponentQuery.query('boundlist[name=tab_indexs]')[0],store=_bound.getStore();
  382. toUpdated=store.getUpdatedRecords();
  383. toCreated=store.getNewRecords();
  384. toRemoved=store.getRemovedRecords();
  385. var indexparam=new Object();
  386. if(toUpdated.length>0){
  387. indexparam['Ind_update']=Ext.JSON.encode(toUpdated);
  388. }
  389. if(toCreated.length>0){
  390. var created=new Array();
  391. Ext.Array.each(toCreated,function(item){
  392. if(item.get('ind_columns').length>0){
  393. created.push(item.data);
  394. }
  395. });
  396. indexparam['Ind_create']=Ext.JSON.encode(created);
  397. }
  398. if(toRemoved.length>0){
  399. var remove=new Array();
  400. Ext.Array.each(toRemoved,function(item){
  401. remove.push(item.data);
  402. });
  403. indexparam['Ind_remove']=Ext.JSON.encode(remove);
  404. }
  405. return indexparam;
  406. },
  407. getRelations:function(tablename){
  408. var me=this;
  409. Ext.Ajax.request({
  410. url:basePath+'ma/getDatarelations.action',
  411. method:'get',
  412. params:{tablename:tablename},
  413. callback : function(opt, s, res){
  414. var r = new Ext.decode(res.responseText);
  415. if(r.exceptionInfo){
  416. showError(r.exceptionInfo);return;
  417. } else if(r.success && r.relations && r.relations.length>0 ){
  418. me.showRelTab(me.formatRelations(r));
  419. }
  420. }
  421. })
  422. },
  423. formatRelations:function(r){
  424. var arr=new Array(),o,groupname,relations=r.relations,col_comments=r.relations_col_comments,tab_comments=r.relations_tab_comments;
  425. Ext.Array.each(relations,function(item){
  426. Ext.Array.each(tab_comments,function(tab){
  427. if(tab.TABLE_NAME==item.table_name_y){
  428. groupname=item.table_name_y+'('+tab.COMMENTS+')';
  429. return false;
  430. }
  431. });
  432. if(item.col_x_1){
  433. o=new Object();
  434. o.col_x=item.col_x_1;
  435. o.col_y=item.col_y_1;
  436. Ext.Array.each(r.relations_col_comments,function(col){
  437. if(col.COLUMN_NAME==item.col_x_1 && col.TABLE_NAME==item.table_name_x){
  438. o.desc_x=col.COMMENTS;
  439. o.type_x=col.DATA_TYPE;
  440. }
  441. if(col.COLUMN_NAME==item.col_y_1 && col.TABLE_NAME==item.table_name_y){
  442. o.desc_y=col.COMMENTS;
  443. o.type_y=col.DATA_TYPE;
  444. }
  445. });
  446. o.tab_y=groupname;
  447. arr.push(o);
  448. }
  449. if(item.col_x_2){
  450. o=new Object();
  451. o.col_x=item.col_x_2;
  452. o.col_y=item.col_y_2;
  453. Ext.Array.each(r.relations_col_comments,function(col){
  454. if(col.COLUMN_NAME==item.col_x_2 && col.TABLE_NAME==item.table_name_x){
  455. o.desc_x=col.COMMENTS;
  456. o.type_x=col.DATA_TYPE;
  457. }
  458. if(col.COLUMN_NAME==item.col_y_2 && col.TABLE_NAME==item.table_name_y){
  459. o.desc_y=col.COMMENTS;
  460. o.type_y=col.DATA_TYPE;
  461. }
  462. });
  463. o.tab_y=groupname;
  464. arr.push(o);
  465. }
  466. });
  467. return arr;
  468. },
  469. showRelTab:function(data){
  470. var tabP=Ext.getCmp('dictab'),_m=this;
  471. tabP.insert(2,{
  472. title:'关联表',
  473. xtype:'gridpanel',
  474. id:'relationgrid',
  475. columnLines:true,
  476. columns:[{
  477. text:'基础表',
  478. cls: "x-grid-header-1",
  479. columns:[{
  480. text:'列名',
  481. dataIndex:'col_x',
  482. cls: "x-grid-header-2",
  483. width:150,
  484. fixed :true
  485. },{
  486. text:'类型',
  487. dataIndex:'type_x',
  488. //cls: "x-grid-header-1",
  489. width:80,
  490. fixed :true
  491. },{
  492. text:'注释',
  493. dataIndex:'desc_x',
  494. // cls: "x-grid-header-1",
  495. width:200,
  496. fixed :true
  497. }]
  498. },{
  499. text:'关联表',
  500. cls: "x-grid-header-1",
  501. columns:[{
  502. text:'字段',
  503. dataIndex:'col_y',
  504. // cls: "x-grid-header-1",
  505. width:150,
  506. fixed :true
  507. },{
  508. text:'类型',
  509. dataIndex:'type_y',
  510. //cls: "x-grid-header-1",
  511. width:80,
  512. fixed :true
  513. },{
  514. text:'注释',
  515. dataIndex:'desc_y',
  516. // cls: "x-grid-header-1",
  517. width:200,
  518. fixed :true
  519. }]
  520. },{
  521. dataIndex:'tab_y',
  522. cls: "x-grid-header-1",
  523. width:0
  524. }
  525. ],
  526. store:Ext.create('Ext.data.Store', {
  527. fields: [ {name: 'col_x'},{name:'desc_x'},{name:'type_x'},
  528. {name:'col_y'},{name:'desc_y'},{name:'type_y'},{name:'tablerelation'},{name:'tab_x'},{name:'tab_y'}],
  529. data:data,
  530. groupers:['tab_y']
  531. }),
  532. features: [{
  533. //id: 'group',
  534. ftype: 'grouping',
  535. groupHeaderTpl: '关联表:<a href="#">{name}</a>',
  536. getFeatureTpl: function(values, parent, x, xcount) {
  537. var me = this;
  538. return [
  539. '<tpl if="typeof rows !== \'undefined\'">',
  540. // group row tpl
  541. '<tr class="' + Ext.baseCSSPrefix + 'grid-group-hd ' + (me.startCollapsed ? me.hdCollapsedCls : '') + ' {hdCollapsedCls}"><td class="' + Ext.baseCSSPrefix + 'grid-cell" align=center colspan="' + parent.columns.length + '" ><div class="' + Ext.baseCSSPrefix + 'grid-cell-inner"><div class="' + Ext.baseCSSPrefix + 'grid-group-title">{collapsed}' + me.groupHeaderTpl + '</div></div></td></tr>',
  542. // this is the rowbody
  543. '<tr id="{viewId}-gp-{name}" class="' + Ext.baseCSSPrefix + 'grid-group-body ' + (me.startCollapsed ? me.collapsedCls : '') + ' {collapsedCls}"><td colspan="' + parent.columns.length + '">{[this.recurse(values)]}</td></tr>',
  544. '</tpl>'
  545. ].join('');
  546. },
  547. onGroupClick: function(view, group, idx, foo, e) {
  548. var _table=idx.substring(0,idx.indexOf('('));
  549. _m.FormUtil.onAdd(_table,'系统数据字典',basePath+'jsps/ma/dataDictionary.jsp?formCondition=object_nameIS'+_table);
  550. },
  551. enableGroupingMenu: false
  552. }]
  553. });
  554. }
  555. });