ResultGrid.js 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442
  1. Ext.define('erp.view.hr.kpi.ResultGrid',{
  2. extend: 'Ext.grid.Panel',
  3. alias: 'widget.erpResultGrid',
  4. id: 'resultGrid',
  5. columnLines : true,
  6. autoScroll : true,
  7. store: [],
  8. region: 'south',
  9. layout : 'fit',
  10. caller:'KpiResultDetd',
  11. columns: new Array(),
  12. //height:height,
  13. GridUtil: Ext.create('erp.util.GridUtil'),
  14. bodyStyle:'background-color:#f1f1f1;',
  15. selModel: Ext.create('Ext.selection.CheckboxModel',{
  16. headerWidth: 0
  17. }),
  18. GridUtil: Ext.create('erp.util.GridUtil'),
  19. BaseUtil: Ext.create('erp.util.BaseUtil'),
  20. plugins: [Ext.create('Ext.grid.plugin.CellEditing', {
  21. clicksToEdit: 1,
  22. listeners:{
  23. 'edit':function(editor,e,Opts){
  24. var record=e.record,data=null,qty=0;
  25. if(record){
  26. data=record.data;
  27. for(var property in data){
  28. if(!/^[a-zA-Z]/.test(property)){
  29. qty+=data[property];
  30. }
  31. }
  32. }
  33. }
  34. }
  35. })],
  36. initComponent : function(){
  37. var gridParam = {caller: this.caller || caller, condition: "krd_kdid=0"};
  38. this.getGridColumnsAndStore(this, 'common/singleGridPanel.action', gridParam, "");//从后台拿到gridpanel的配置及数据
  39. this.callParent(arguments);
  40. },
  41. loadNewStore:function(grid, url, param, no){
  42. Ext.Ajax.request({//拿到grid的columns
  43. url : basePath + url,
  44. params: param,
  45. method : 'post',
  46. callback : function(options,success,response){
  47. var res = new Ext.decode(response.responseText);
  48. if(res.exceptionInfo){
  49. showError(res.exceptionInfo);return;
  50. }
  51. var data = Ext.decode(res.data.replace(/,}/g, '}').replace(/,]/g, ']'));
  52. grid.store.loadData(data);
  53. }
  54. });
  55. },
  56. getGridColumnsAndStore: function(grid, url, param, no){
  57. var me = this;
  58. patchurl=basePath+url;
  59. grid.setLoading(true);
  60. Ext.Ajax.request({//拿到grid的columns
  61. url : basePath + url,
  62. params: param,
  63. async:false,
  64. method : 'post',
  65. callback : function(options,success,response){
  66. grid.setLoading(false);
  67. var res = new Ext.decode(response.responseText);
  68. if(res.exceptionInfo){
  69. showError(res.exceptionInfo);return;
  70. }
  71. if(res.columns){
  72. var limits = res.limits, limitArr = new Array();
  73. if(limits != null && limits.length > 0) {//权限外字段
  74. limitArr = Ext.Array.pluck(limits, 'lf_field');
  75. }
  76. var data = [];
  77. var gridfields=res.fields;
  78. var gridcolumns=res.columns;
  79. var hasadd=false,basecode=null;
  80. if(!res.data || res.data.length == 2){
  81. me.add10EmptyData(grid.detno, data);
  82. me.add10EmptyData(grid.detno, data);//添加20条空白数据
  83. } else {
  84. data = Ext.decode(res.data.replace(/,}/g, '}').replace(/,]/g, ']'));
  85. Ext.each(res.columns, function(column, y){
  86. //power
  87. if(limitArr.length > 0 && Ext.Array.contains(limitArr, column.dataIndex)) {
  88. column.hidden = true;
  89. }
  90. //renderer
  91. me.setRenderer(grid, column);
  92. //logictype
  93. me.setLogicType(grid, column);
  94. });
  95. }
  96. //store
  97. //view
  98. if(grid.selModel.views == null){
  99. grid.selModel.views = [];
  100. }
  101. //dbfind
  102. if(res.dbfinds&&res.dbfinds.length > 0){
  103. grid.dbfinds = res.dbfinds;
  104. }
  105. //toolbar
  106. me.setToolbar(grid, res.columns, res.necessaryField, limitArr);
  107. var store = me.setStore(res.fields, data, grid.groupField, grid.necessaryField);
  108. grid.store=store;
  109. grid.columns=res.columns;
  110. var form = Ext.ComponentQuery.query('form')[0];
  111. if(form){
  112. if(form.readOnly){
  113. grid.readOnly = true;//grid不可编辑
  114. }
  115. }
  116. } else {
  117. grid.hide();
  118. var form = Ext.ComponentQuery.query('form')[0];
  119. me.updateFormPosition(form);//字段较少时,修改form布局
  120. }
  121. }
  122. });
  123. },
  124. setRenderer: function(grid, column){
  125. if(!column.haveRendered && column.renderer != null && column.renderer != ""){
  126. if(!grid.RenderUtil){
  127. grid.RenderUtil = Ext.create('erp.util.RenderUtil');
  128. }
  129. var renderName = column.renderer;
  130. if(contains(column.renderer, ':', true)){
  131. var args = new Array();
  132. Ext.each(column.renderer.split(':'), function(a, index){
  133. if(index == 0){
  134. renderName = a;
  135. } else {
  136. args.push(a);
  137. }
  138. });
  139. if(!grid.RenderUtil.args[renderName]){
  140. grid.RenderUtil.args[renderName] = new Object();
  141. }
  142. grid.RenderUtil.args[renderName][column.dataIndex] = args;
  143. }
  144. column.renderer = grid.RenderUtil[renderName];
  145. column.haveRendered = true;
  146. }
  147. },
  148. setLogicType: function(grid, column){
  149. var logic = column.logic;
  150. if(logic != null){
  151. if(logic == 'detno'){
  152. grid.detno = column.dataIndex;
  153. column.width = 40;
  154. column.renderer = function(val, meta) {
  155. meta.tdCls = Ext.baseCSSPrefix + 'grid-cell-special';
  156. return val;
  157. };
  158. } else if(logic == 'keyField'){
  159. grid.keyField = column.dataIndex;
  160. } else if(logic == 'mainField'){
  161. grid.mainField = column.dataIndex;
  162. } else if(logic == 'necessaryField'){
  163. grid.necessaryField = column.dataIndex;
  164. if(!grid.necessaryFields){
  165. grid.necessaryFields = new Array();
  166. }
  167. grid.necessaryFields.push(column.dataIndex);
  168. if(!column.haveRendered){
  169. column.renderer = function(val, meta, record, x, y, store, view){
  170. var c = this.columns[y];
  171. if(val != null && val.toString().trim() != ''){
  172. if(c.xtype == 'datecolumn'){
  173. val = Ext.Date.format(val, 'Y-m-d');
  174. }
  175. return val;
  176. } else {
  177. if(c.xtype == 'datecolumn'){
  178. val = '';
  179. }
  180. return '<img src="' + basePath + 'resource/images/icon/need.png" title="必填字段">' +
  181. '<span style="color:blue;padding-left:2px;" title="必填字段">' + val + '</span>';
  182. }
  183. };
  184. }
  185. } else if(logic == 'groupField'){
  186. grid.groupField = column.dataIndex;
  187. }
  188. }
  189. },
  190. setStore: function(fields, data, groupField, necessaryField){
  191. griddata=data;
  192. if(!Ext.isChrome){
  193. Ext.each(fields, function(f){
  194. if(f.type == 'date'){
  195. f.dateFormat = 'Y-m-d H:m:s';
  196. }
  197. });
  198. }
  199. return Ext.create('Ext.data.Store', {
  200. fields: fields,
  201. data: data,
  202. groupField: groupField,
  203. getSum: function(records, field) {
  204. if (arguments.length < 2) {
  205. return 0;
  206. }
  207. var total = 0,
  208. i = 0,
  209. len = records.length;
  210. if(necessaryField) {
  211. for (; i < len; ++i) {//重写getSum,grid在合计时,只合计填写了必要信息的行
  212. var necessary = records[i].get(necessaryField);
  213. if(necessary != null && necessary != ''){
  214. total += records[i].get(field);
  215. }
  216. }
  217. } else {
  218. for (; i < len; ++i) {
  219. total += records[i].get(field);
  220. }
  221. }
  222. return total;
  223. },
  224. getCount: function() {
  225. if(necessaryField) {
  226. var count = 0;
  227. Ext.each(this.data.items, function(item){//重写getCount,grid在合计时,只合计填写了必要信息的行
  228. if(item.data[necessaryField] != null && item.data[necessaryField] != ''){
  229. count++;
  230. }
  231. });
  232. return count;
  233. }
  234. return this.data.items.length;
  235. }
  236. });
  237. },
  238. setToolbar: function(grid, columns, necessaryField, limitArr){
  239. var items = [];
  240. var bool = true;
  241. if(!grid.dockedItems)
  242. return;
  243. Ext.each(grid.dockedItems.items, function(item){
  244. if(item.dock == 'bottom' && item.items){//bbar已存在
  245. bool = false;
  246. }
  247. });
  248. if(bool){
  249. Ext.each(columns, function(column){
  250. if(limitArr.length == 0 || !Ext.Array.contains(limitArr, column.dataIndex)) {
  251. if(column.summaryType == 'sum'){
  252. items.push('-',{
  253. id: column.dataIndex + '_sum',
  254. itemId: column.dataIndex,
  255. xtype: 'tbtext',
  256. text: column.header + '(sum):0'
  257. });
  258. } else if(column.summaryType == 'average') {
  259. items.push('-',{
  260. id: column.dataIndex + '_average',
  261. itemId: column.dataIndex,
  262. xtype: 'tbtext',
  263. text: column.header + '(average):0'
  264. });
  265. } else if(column.summaryType == 'count') {
  266. items.push('-',{
  267. id: column.dataIndex + '_count',
  268. itemId: column.dataIndex,
  269. xtype: 'tbtext',
  270. text: column.header + '(count):0'
  271. });
  272. }
  273. }
  274. if(column.dataIndex == necessaryField){
  275. column.renderer = function(val){
  276. if(val != null && val.toString().trim() != ''){
  277. return val;
  278. } else {
  279. return '<img src="' + basePath + 'resource/images/icon/need.png" title="必填字段">' +
  280. '<span style="color:blue;padding-left:2px;" title="必填字段">' + val + '</span>';
  281. }
  282. };
  283. }
  284. });
  285. grid.addDocked({
  286. xtype: 'toolbar',
  287. dock: 'bottom',
  288. items: items
  289. });
  290. } else {
  291. var bars = Ext.ComponentQuery.query('erpToolbar');
  292. if(bars.length > 0){
  293. Ext.each(columns, function(column){
  294. if(column.summaryType == 'sum'){
  295. bars[0].add('-');
  296. bars[0].add({
  297. id: column.dataIndex + '_sum',
  298. itemId: column.dataIndex,
  299. xtype: 'tbtext',
  300. text: column.header + '(sum):0'
  301. });
  302. } else if(column.summaryType == 'average') {
  303. bars[0].add('-');
  304. bars[0].add({
  305. id: column.dataIndex + '_average',
  306. itemId: column.dataIndex,
  307. xtype: 'tbtext',
  308. text: column.header + '(average):0'
  309. });
  310. } else if(column.summaryType == 'count') {
  311. bars[0].add('-');
  312. bars[0].add({
  313. id: column.dataIndex + '_count',
  314. itemId: column.dataIndex,
  315. xtype: 'tbtext',
  316. text: column.header + '(count):0'
  317. });
  318. }
  319. });
  320. }
  321. }
  322. },
  323. add10EmptyData: function(detno, data){
  324. if(detno){
  325. var index = data.length == 0 ? 0 : Number(data[data.length-1][detno]);
  326. for(var i=0;i<10;i++){
  327. var o = new Object();
  328. o[detno] = index + i + 1;
  329. data.push(o);
  330. }
  331. } else {
  332. for(var i=0;i<10;i++){
  333. var o = new Object();
  334. data.push(o);
  335. }
  336. }
  337. },
  338. checkGridDirty: function(grid){
  339. var s = grid.getStore().data.items;//获取store里面的数据
  340. var msg = '';
  341. for(var i=0;i<s.length;i++){
  342. if(s[i].dirty){//明细行被修改过哦
  343. msg = msg + '第' + (i+1) + '行:';
  344. var changed = Ext.Object.getKeys(s[i].modified);//拿到被修改了的字段
  345. for(var j = 0;j < changed.length;j++){
  346. Ext.each(grid.columns, function(c, index){
  347. if(index == 0){
  348. return;
  349. }
  350. if(c.dataIndex == changed[j] && c.logic != 'ignore'){//由字段dataindex匹配其text
  351. msg = msg + '<font color=blue>' + c.text + '</font>&nbsp;';
  352. }
  353. });
  354. }
  355. msg = msg + ";";
  356. }
  357. }
  358. if(msg != '' && msg != ';'){//明细行被修改过哦
  359. msg = "明细行<font color=green>" + msg.substring(0, msg.length-1) + "</font>已编辑过";
  360. }
  361. return msg;
  362. },
  363. getGridStore: function(grid){
  364. if(grid == null){
  365. grid = Ext.getCmp('grid');
  366. }
  367. var me = this,
  368. jsonGridData = new Array();
  369. var form = Ext.getCmp('form');
  370. var s = grid.getStore().data.items;//获取store里面的数据
  371. var dd;
  372. for(var i=0;i<s.length;i++){//将grid里面各行的数据获取并拼成jsonGridData
  373. var data = s[i].data;
  374. dd = new Object();
  375. if(s[i].dirty && !me.isBlank(grid, data)){
  376. Ext.each(gridcolumns, function(c){
  377. if(c.logic != 'ignore'){//只需显示,无需后台操作的字段,自动略去
  378. if(c.dataIndex=='wd_date'){
  379. Ext.Array.each(c.columns,function(column){
  380. dd[column.dataIndex]=data[column.dataIndex];
  381. });
  382. }else {
  383. if(c.xtype == 'datecolumn'){
  384. c.format = c.format || 'Y-m-d';
  385. if(Ext.isDate(data[c.dataIndex])){
  386. dd[c.dataIndex] = Ext.Date.format(data[c.dataIndex], c.format);
  387. } else {
  388. if(c.editor){
  389. dd[c.dataIndex] = Ext.Date.format(new Date(), c.format);//如果用户没输入日期,或输入有误,就给个默认日期,
  390. }
  391. }
  392. } else if(c.xtype == 'datetimecolumn'){
  393. if(Ext.isDate(data[c.dataIndex])){
  394. dd[c.dataIndex] = Ext.Date.format(data[c.dataIndex], 'Y-m-d H:i:s');//在这里把GMT日期转化成Y-m-d H:i:s格式日期
  395. } else {
  396. if(c.editor){
  397. dd[c.dataIndex] = Ext.Date.format(new Date(), 'Y-m-d H:i:s');//默认日期,
  398. }
  399. }
  400. } else if(c.xtype == 'numbercolumn'){//赋个默认值0吧,不然不好保存
  401. if(data[c.dataIndex] == null || data[c.dataIndex] == ''){
  402. dd[c.dataIndex] = '0';//也可以从data里面去掉这些字段
  403. } else {
  404. dd[c.dataIndex] = s[i].data[c.dataIndex];
  405. }
  406. } else {
  407. dd[c.dataIndex] = s[i].data[c.dataIndex];
  408. }
  409. }
  410. }
  411. });
  412. if(grid.mainField && form && form.keyField){//例如,将pu_id的值赋给pd_puid
  413. dd[grid.mainField] = Ext.getCmp(form.keyField).value;
  414. }
  415. jsonGridData.push(Ext.JSON.encode(dd));
  416. }
  417. }
  418. return jsonGridData;
  419. },
  420. isBlank: function(grid, data) {
  421. var ff = grid.necessaryFields,bool = true;
  422. if(ff) {
  423. Ext.each(ff, function(f) {
  424. if(!Ext.isEmpty(data[f]) && data[f] != 0) {
  425. bool = false;
  426. }else {
  427. bool=true;
  428. return
  429. }
  430. });
  431. } else {
  432. if(!grid.necessaryField || !Ext.isEmpty(data[grid.necessaryField])) {
  433. bool = false;
  434. }
  435. }
  436. return bool;
  437. },
  438. });