GridPanel.js 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468
  1. Ext.require([
  2. 'Ext.grid.*',
  3. 'Ext.data.*',
  4. 'Ext.grid.PagingScroller'
  5. ]);
  6. Ext.define('erp.view.common.query.GridPanel',{
  7. extend: 'Ext.grid.Panel',
  8. alias: 'widget.erpQueryGridPanel',
  9. requires: ['erp.view.core.grid.HeaderFilter', 'erp.view.core.plugin.CopyPasteMenu'],
  10. id: 'querygrid',
  11. emptyText : '无数据',
  12. columnLines : true,
  13. autoScroll : true,
  14. columns: [],
  15. GridUtil: Ext.create('erp.util.GridUtil'),
  16. BaseUtil: Ext.create('erp.util.BaseUtil'),
  17. RenderUtil: Ext.create('erp.util.RenderUtil'),
  18. features : [Ext.create('Ext.grid.feature.Grouping',{
  19. hideGroupedHeader: true,
  20. groupHeaderTpl: '{name} (Count:{rows.length})'
  21. })],
  22. constructor: function(cfg) {
  23. if(cfg) {
  24. cfg.headerCt = cfg.headerCt || Ext.create("Ext.grid.header.Container", {
  25. id: (cfg.id || this.id) + '-ct',
  26. forceFit: false,
  27. sortable: true,
  28. enableColumnMove:true,
  29. enableColumnResize:true,
  30. enableColumnHide: true
  31. });
  32. cfg.plugins = cfg.plugins || [Ext.create('erp.view.core.grid.HeaderFilter'), Ext.create('erp.view.core.plugin.CopyPasteMenu')];
  33. cfg.selModel = cfg.selModel || Ext.create('Ext.selection.CheckboxModel', {
  34. headerWidth: 0
  35. }),
  36. Ext.apply(this, cfg);
  37. }
  38. this.callParent(arguments);
  39. },
  40. initComponent : function(){
  41. condition = this.BaseUtil.getUrlParam('urlcondition');
  42. condition = (condition == null) ? "" : condition;
  43. condition = condition.replace(/@/,"'%").replace(/@/,"%'");
  44. this.defaultCondition = condition;
  45. var gridParam = {caller: this.caller || caller, condition: condition};
  46. this.GridUtil.getGridColumnsAndStore(this, 'common/singleGridPanel.action', gridParam, "");
  47. this.callParent(arguments);
  48. this.store.on('datachanged',this.summary,this);
  49. this.initRecords();
  50. },
  51. summary: function(){
  52. var me = this,
  53. store = this.store,
  54. items = store.buffered ? store.prefetchData.items : store.data.items,
  55. value;
  56. Ext.each(me.columns, function(c){
  57. if(c.summaryType == 'sum'){
  58. value = store.getSum(items, c.dataIndex);
  59. if(c.xtype == 'numbercolumn') {
  60. value = Ext.util.Format.number(value, (c.format || '0,000.000'));
  61. }
  62. me.down('tbtext[id=' + c.dataIndex + '_sum]').setText(c.text + '(sum):' + value);
  63. } else if(c.summaryType == 'count'){
  64. value = (store.filters && store.filters.length>0)?store.getCount():store.getTotalCount();
  65. me.down('tbtext[id=' + c.dataIndex + '_count]').setText(c.text + '(count):' + value);
  66. }else if(c.summaryType == 'results'){
  67. if(store.filters && store.filters.length>0 && store.filters.items[0].filterArr && store.filters.items[0].filterArr.length>0){
  68. value = store.getCount();
  69. }else{
  70. var grid = this, form = Ext.getCmp('queryform');
  71. var d = grid.defaultCondition || '', f = d;
  72. if(grid.filterCondition){
  73. if(d == null || d == ''){
  74. f = grid.filterCondition;
  75. } else {
  76. f += ' AND ' + grid.filterCondition;
  77. }
  78. }
  79. f = form.spellCondition(f);
  80. if(Ext.isEmpty(f)) {
  81. f = grid.emptyCondition || '1=1';
  82. }
  83. Ext.Ajax.request({
  84. url : basePath + 'common/getResultCount.action',
  85. async: false,
  86. params: {
  87. caller: caller,
  88. condition: f
  89. },
  90. method : 'post',
  91. callback : function(opt, s, res){
  92. var r = new Ext.decode(res.responseText);
  93. if(r.exceptionInfo){
  94. showError(r.exceptionInfo);return;
  95. } else if(r.success){
  96. value = r.count;
  97. }
  98. }
  99. });
  100. }
  101. /*value = (store.filters && store.filters.length>0)?store.getCount():store.getTotalCount();*/
  102. me.down('tbtext[id=' + c.dataIndex + '_results]').setText( '筛选结果:' + value+'条');
  103. } else if(c.summaryType == 'average'){
  104. value = store.getAverage(c.dataIndex);
  105. if(c.xtype == 'numbercolumn') {
  106. value = Ext.util.Format.number(value, (c.format || '0,000.000'));
  107. }
  108. me.down('tbtext[id=' + c.dataIndex + '_average]').setText(c.text + '(average):' + value);
  109. }
  110. });
  111. },
  112. //// loadMask: true,
  113. disableSelection: true,
  114. invalidateScrollerOnRefresh: false,
  115. viewConfig: {
  116. trackOver: false
  117. },
  118. buffered: true,
  119. sync: true,
  120. listeners: {
  121. scrollershow: function(scroller) {
  122. if (scroller && scroller.scrollEl) {
  123. scroller.clearManagedListeners();
  124. scroller.mon(scroller.scrollEl, 'scroll', scroller.onElScroll, scroller);
  125. }
  126. },
  127. /*storeloaded: function(grid, data) {
  128. grid.summary();
  129. },*/
  130. 'headerfilterchange': function(grid, filters) {
  131. console.log(111111);
  132. var bool = false;
  133. if(filters){
  134. var items = filters.items;
  135. for(var i = 0 ; i<items.length ; i++ ){
  136. if(!(items[i].value ==""||items[i].value==null)){
  137. bool = true;
  138. }
  139. }
  140. if(bool){
  141. grid.store.pageSize = grid.store.totalCount+1;
  142. }
  143. }
  144. return true;
  145. },
  146. 'headerfiltersapply': function(grid, filters) {
  147. console.log(2222);
  148. if(this.allowFilter){
  149. var condition = null;
  150. for(var fn in filters){
  151. var value = filters[fn], f = grid.getHeaderFilterField(fn);
  152. if(f.xtype == 'datefield')
  153. value = f.getRawValue();
  154. if(!Ext.isEmpty(value)) {
  155. if("null"!=value){
  156. if(f.filtertype) {
  157. if (f.filtertype == 'numberfield') {
  158. value = fn + "=" + value + " ";
  159. }
  160. } else {
  161. if(Ext.isDate(value)){
  162. value = Ext.Date.toString(value);
  163. value = "to_char(" + fn + ",'yyyy-MM-dd')='" + value + "' ";
  164. } else {
  165. var exp_t = /^(\d{4})\-(\d{2})\-(\d{2}) (\d{2}):(\d{2}):(\d{2})$/,
  166. exp_d = /^(\d{4})\-(\d{2})\-(\d{2})$/;
  167. if(exp_d.test(value)){
  168. value = "to_char(" + fn + ",'yyyy-MM-dd')='" + value + "' ";
  169. } else if(exp_t.test(value)){
  170. value = "to_char(" + fn + ",'yyyy-MM-dd')='" + value.substr(0, 10) + "' ";
  171. } else{
  172. if (f.xtype == 'combo' || f.xtype == 'combofield') {
  173. if (value == '-所有-') {
  174. continue;
  175. } else {
  176. if (f.column && f.column.xtype == 'yncolumn'){
  177. if (value == '-无-') {
  178. value = fn + ' is null';
  179. } else {
  180. value = fn + ((value == '是' || value == '-1' || value == '1') ? '<>0' : '=0');
  181. }
  182. } else {
  183. if (value == '-无-') {
  184. value = 'nvl(' + fn + ',\' \')=\' \'';
  185. } else {
  186. if(value)value=value.replace(/\'/g,"''");
  187. value = fn + " LIKE '" + value + "%' ";
  188. }
  189. }
  190. }
  191. } else if(f.xtype == 'datefield') {
  192. value = "to_char(" + fn + ",'yyyy-MM-dd') like '%" + value + "%' ";
  193. } else if(f.column && f.column.xtype == 'numbercolumn'){
  194. if(f.column.format) {
  195. var precision = f.column.format.substr(f.column.format.indexOf('.') + 1).length;
  196. //防止to_char去除小数点前面的0
  197. if(-1<value&&value<1){
  198. var number = value;
  199. value = "to_char(round(" + fn + "," + precision + "),";
  200. value += "'fm0.";
  201. for(var i=0;i<precision;i++){
  202. value += "0";
  203. }
  204. value += "') like '%" + number + "%' ";
  205. }else{
  206. value = "to_char(round(" + fn + "," + precision + ")) like '%" + value + "%' ";
  207. }
  208. } else
  209. value = "to_char(" + fn + ") like '%" + value + "%' ";
  210. } else {
  211. /**字符串转换下简体*/
  212. if(value)value=value.replace(/\'/g,"''");
  213. var SimplizedValue=this.BaseUtil.Simplized(value);
  214. //可能就是按繁体筛选
  215. if(f.ignoreCase) {// 忽略大小写
  216. fn = 'upper(' + fn + ')';
  217. value = value.toUpperCase();
  218. }
  219. if(!f.autoDim) {
  220. if(SimplizedValue!=value){
  221. value = "("+fn + " LIKE '" + value + "%' or "+fn+" LIKE '"+SimplizedValue+"%')";
  222. }else value = fn + " LIKE '" + value + "%' ";
  223. } else if(f.exactSearch){
  224. value=fn+"='"+value+"'";
  225. } else {
  226. if(SimplizedValue!=value){
  227. value = "("+fn + " LIKE '%" + value + "%' or "+fn+" LIKE '%"+SimplizedValue+"%')";
  228. }else value = fn + " LIKE '%" + value + "%' ";
  229. }
  230. }
  231. }
  232. }
  233. }
  234. }else value ="nvl("+fn+",' ')=' '";
  235. if(condition == null){
  236. condition = value;
  237. } else {
  238. condition = condition + " AND " + value;
  239. }
  240. }
  241. }
  242. this.defaultCondition = condition;
  243. } else {
  244. this.allowFilter = true;
  245. }
  246. return false;
  247. }
  248. },
  249. getGridData: function() {
  250. var grid = this, form = Ext.getCmp('queryform');
  251. var d = grid.defaultCondition || '', f = d;
  252. if(grid.filterCondition){
  253. if(d == null || d == ''){
  254. f = grid.filterCondition;
  255. } else {
  256. f += ' AND ' + grid.filterCondition;
  257. }
  258. }
  259. f = form.spellCondition(f);
  260. if(Ext.isEmpty(f)) {
  261. f = grid.emptyCondition || '1=1';
  262. }
  263. this.GridUtil.loadNewStore(this, {caller: caller, condition: f});
  264. },
  265. getGridColumnsAndStore: function(grid, url, param, no){
  266. var me = this;
  267. me.setLoading(true);//loading...
  268. Ext.Ajax.request({//拿到grid的columns
  269. url : basePath + url,
  270. params: param,
  271. method : 'post',
  272. async: false,
  273. callback : function(options,success,response){
  274. me.setLoading(false);
  275. var res = new Ext.decode(response.responseText);
  276. if(res.exceptionInfo){
  277. showError(res.exceptionInfo);return;
  278. }
  279. if(me.columns && me.columns.length > 2){
  280. var data = res.data != null ? Ext.decode(res.data.replace(/,}/g, '}').replace(/,]/g, ']')) : [];
  281. me.store.loadData(data);
  282. //解决固定列左右不对齐的情况
  283. var lockedView = me.view.lockedView;
  284. if(lockedView){
  285. var tableEl = lockedView.el.child('.x-grid-table');
  286. if(tableEl){
  287. tableEl.dom.style.marginBottom = '7px';
  288. }
  289. }
  290. me.initRecords();
  291. } else {
  292. if(res.columns){
  293. Ext.each(res.columns, function(column, y){
  294. me.setRenderer(column);
  295. var logic = column.logic;
  296. if(logic != null){
  297. me.setLogicType(column, logic, y);
  298. }
  299. });
  300. //store
  301. me.store = me.setDefaultStore(res.data, res.fields);
  302. //view
  303. if(me.selModel.views == null){
  304. me.selModel.views = [];
  305. }
  306. if(res.dbfinds.length > 0){
  307. me.dbfinds = res.dbfinds;
  308. }
  309. //toolbar
  310. me.setToolbar(res.columns);
  311. //reconfigure store&columns
  312. me.columns = res.columns;
  313. }
  314. }
  315. }
  316. });
  317. },
  318. setRenderer: function(column){
  319. var grid = this;
  320. if(!column.haveRendered && column.renderer != null && column.renderer != ""){
  321. var renderName = column.renderer;
  322. if(contains(column.renderer, ':', true)){
  323. var args = new Array();
  324. Ext.each(column.renderer.split(':'), function(a, index){
  325. if(index == 0){
  326. renderName = a;
  327. } else {
  328. args.push(a);
  329. }
  330. });
  331. if(!grid.RenderUtil.args[renderName]){
  332. grid.RenderUtil.args[renderName] = new Object();
  333. }
  334. grid.RenderUtil.args[renderName][column.dataIndex] = args;
  335. }
  336. column.renderer = grid.RenderUtil[renderName];
  337. column.haveRendered = true;
  338. }
  339. },
  340. setLogicType: function(column, logic, y){
  341. var grid = this;
  342. if(logic == 'detno'){
  343. grid.detno = column.dataIndex;
  344. } else if(logic == 'keyField'){
  345. grid.keyField = column.dataIndex;
  346. } else if(logic == 'mainField'){
  347. grid.mainField = column.dataIndex;
  348. } else if(logic == 'necessaryField'){
  349. grid.necessaryField = column.dataIndex;
  350. if(!grid.necessaryFields){
  351. grid.necessaryFields = new Array();
  352. }
  353. grid.necessaryFields.push(column.dataIndex);
  354. if(!column.haveRendered){
  355. column.renderer = function(val, meta, record, x, y, store, view){
  356. var c = this.columns[y];
  357. if(val != null && val.toString().trim() != ''){
  358. if(c.xtype == 'datecolumn'){
  359. val = Ext.Date.format(val, 'Y-m-d');
  360. }
  361. return val;
  362. } else {
  363. if(c.xtype == 'datecolumn'){
  364. val = '';
  365. }
  366. return '<img src="' + basePath + 'resource/images/icon/need.png" title="必填字段">' +
  367. '<span style="color:blue;padding-left:2px;" title="必填字段">' + val + '</span>';
  368. }
  369. };
  370. }
  371. } else if(logic == 'groupField'){
  372. grid.groupField = column.dataIndex;
  373. }
  374. },
  375. setToolbar: function(columns){
  376. var grid = this;
  377. var items = [];
  378. Ext.each(columns, function(column){
  379. if(column.summaryType == 'sum'){
  380. items.push('-',{
  381. id: column.dataIndex + '_sum',
  382. itemId: column.dataIndex,
  383. xtype: 'tbtext',
  384. text: column.text + '(sum):0'
  385. });
  386. } else if(column.summaryType == 'average') {
  387. items.push('-',{
  388. id: column.dataIndex + '_average',
  389. itemId: column.dataIndex,
  390. xtype: 'tbtext',
  391. text: column.text + '(average):0'
  392. });
  393. } else if(column.summaryType == 'count') {
  394. items.push('-',{
  395. id: column.dataIndex + '_count',
  396. itemId: column.dataIndex,
  397. xtype: 'tbtext',
  398. text: column.text + '(count):0'
  399. });
  400. }
  401. });
  402. grid.bbar = {
  403. xtype: 'toolbar',
  404. dock: 'bottom',
  405. items: items
  406. };
  407. },
  408. setDefaultStore: function(d, f){
  409. var me = this;
  410. var data = [];
  411. if(!d || d.length == 2){
  412. me.GridUtil.add10EmptyData(me.detno, data);
  413. me.GridUtil.add10EmptyData(me.detno, data);
  414. } else {
  415. data = Ext.decode(d.replace(/,}/g, '}').replace(/,]/g, ']'));
  416. }
  417. var store = Ext.create('Ext.data.Store', {
  418. fields: f,
  419. data: data,
  420. groupField: me.groupField,
  421. getSum: function(field) {
  422. var records = me.selModel.getSelection(),
  423. total = 0,
  424. i = 0,
  425. len = records.length;
  426. for (; i < len; ++i) {
  427. total += records[i].get(field);
  428. }
  429. return total;
  430. },
  431. getCount: function() {
  432. var records = me.selModel.getSelection(),
  433. count = 0;
  434. Ext.each(records, function(item){
  435. count++;
  436. });
  437. return count;
  438. },
  439. getAverage: function(field) {
  440. var records = me.selModel.getSelection(),
  441. count = 0,
  442. sum = 0;
  443. Ext.each(records, function(item){
  444. if(item.data[me.necessaryField] != null && item.data[me.necessaryField] != ''){
  445. count++;sum += item.data[field];
  446. }
  447. });
  448. return Ext.Number.format(sum/count, '0.00');
  449. }
  450. });
  451. return store;
  452. },
  453. initRecords: function(){
  454. var records = this.store.data.items;
  455. var count = 0;
  456. Ext.each(records, function(record){
  457. if(!record.index){
  458. record.index = count++;
  459. }
  460. });
  461. }
  462. });