AssPanel.js 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485
  1. /**
  2. * 辅助核算gridPanel
  3. */
  4. Ext.define('erp.view.core.grid.AssPanel',{
  5. extend: 'Ext.grid.Panel',
  6. alias: 'widget.assgrid',
  7. layout : 'fit',
  8. id: 'assgrid',
  9. emptyText : $I18N.common.grid.emptyText,
  10. columnLines : true,
  11. autoScroll : true,
  12. store: [],
  13. features: [Ext.create('Ext.grid.feature.Grouping',{
  14. startCollapsed: true,
  15. groupHeaderTpl: 'VoucherDetail:{name} (count:{rows.length})'
  16. })],
  17. columns: [],
  18. bodyStyle:'background-color:#f1f1f1;',
  19. plugins: Ext.create('Ext.grid.plugin.CellEditing', {
  20. clicksToEdit: 1
  21. }),
  22. GridUtil: Ext.create('erp.util.GridUtil'),
  23. BaseUtil: Ext.create('erp.util.BaseUtil'),
  24. detno: '',
  25. keyField: '',
  26. necessaryField: '',
  27. mainField: '',
  28. condition:'',
  29. listeners : {
  30. itemclick : {
  31. fn : function(){
  32. this.onGridItemClick(arguments[0],arguments[1]);
  33. }
  34. }
  35. },
  36. initComponent : function(){
  37. this.callParent();
  38. var formCondition1 = this.BaseUtil.getUrlParam('formCondition');
  39. gridCondition = this.BaseUtil.getUrlParam('gridCondition');
  40. gridCondition = (gridCondition == null) ? "" : gridCondition.replace(/IS/g,"=");
  41. var formconfig = (formCondition1 == null) ? ['',''] : formCondition1.replace(/IS/g,"=").split('=');
  42. var gridParam = {caller: this.condition, condition: " mta_caller ='"+caller+"' and mta_keyid='"+formconfig[1]+"'"};
  43. this.getMyData(this, 'common/singleGridPanel.action?', gridParam, "");
  44. },
  45. beforeDelete : function(btn,grid){
  46. var records = grid.selModel.getSelection();
  47. if(records.length > 0){
  48. if(grid.keyField){
  49. if(records[0].data[grid.keyField] != null && records[0].data[grid.keyField] > 0){
  50. warnMsg($I18N.common.msg.ask_del, function(btn){
  51. if(btn == 'yes'){
  52. grid.BaseUtil.getActiveTab().setLoading(true);//loading...
  53. Ext.Ajax.request({
  54. url : basePath + "common/deleteDetail.action",
  55. params: {
  56. caller: caller+'_main',
  57. condition: grid.keyField + "=" + records[0].data[grid.keyField]
  58. },
  59. method : 'post',
  60. callback : function(options,success,response){
  61. grid.BaseUtil.getActiveTab().setLoading(false);
  62. var localJson = new Ext.decode(response.responseText);
  63. if(localJson.exceptionInfo){
  64. showError(localJson.exceptionInfo);return;
  65. }
  66. if(localJson.success){
  67. grid.store.remove(records[0]);
  68. delSuccess(function(){
  69. });//@i18n/i18n.js
  70. } else {
  71. delFailure();
  72. }
  73. }
  74. });
  75. }
  76. });
  77. } else {
  78. grid.store.remove(records[0]);
  79. }
  80. } else {
  81. if(records[0].data[grid.keyField] != null && records[0].data[grid.keyField] > 0){
  82. showError("grid未配置keyField,无法删除该行数据!");
  83. } else {
  84. grid.store.remove(records[0]);
  85. }
  86. }
  87. }
  88. },
  89. onGridItemClick: function(selModel, record){//grid行选择
  90. this.gridLastSelected = record;
  91. var grid = Ext.getCmp('windowgrid');
  92. if(record.data[grid.necessaryField] == null || record.data[grid.necessaryField] == ''){
  93. this.gridLastSelected.findable = true;//空数据可以在输入完code,并移开光标后,自动调出该条数据
  94. } else {
  95. this.gridLastSelected.findable = false;
  96. }
  97. this.onGridItemClick1(selModel, record);
  98. },
  99. onGridItemClick1: function(selModel, record, id){
  100. var me = this;
  101. var grid = id == null ? Ext.getCmp('windowgrid') : (Ext.getCmp(id) || Ext.getCmp('windowgrid'));
  102. if(grid && !grid.readOnly){
  103. var index = null;
  104. if(grid.detno){
  105. index = record.data[grid.detno];
  106. index = index == null ? (record.index + 1) : index;
  107. if(index.toString() == 'NaN'){
  108. index = '';
  109. }
  110. if(index == grid.store.data.items[grid.store.data.items.length-1].data[grid.detno]){//如果选择了最后一行
  111. me.add10EmptyItems(grid);//就再加10行
  112. }
  113. } else {
  114. index = record.index + 1;
  115. if(index.toString() == 'NaN'){
  116. index = '';
  117. }
  118. if(index == grid.store.data.items[grid.store.data.items.length-1].index + 1){//如果选择了最后一行
  119. me.add10EmptyItems(grid);//就再加10行
  120. }
  121. }
  122. }
  123. },
  124. beforeUpdate: function(){
  125. var mm = this;
  126. var s2 = '';
  127. var datalist = this.store.data.items;
  128. var updateDetno = new Array();
  129. var index=0;
  130. var jsonGridData = new Array();
  131. // var haveDate = false;
  132. if(datalist[0].data[this.necessaryField].length<=0||null==datalist[0].data[this.necessaryField]||''==datalist[0].data[this.necessaryField]){
  133. warnMsg('辅助核算表中还没有添加数据');
  134. }else{
  135. Ext.Array.each(datalist,function(item){
  136. if(item.dirty){
  137. updateDetno[index++]=item.index;
  138. // updateDetno.push(item.index);
  139. }
  140. });
  141. var alertMsg = '';
  142. if(updateDetno.length <= 0 ){
  143. alertMsg='辅助核算表中没有修改数据';
  144. }else{
  145. alertMsg='已经修改第';
  146. for(var i=0;i<updateDetno.length;i++){
  147. alertMsg=alertMsg+(updateDetno[i]+1);
  148. if(i!=(updateDetno.length-1)){
  149. alertMsg=alertMsg+',';
  150. }
  151. }
  152. alertMsg=alertMsg+'行数据';
  153. }
  154. warnMsg(alertMsg,function(btn){
  155. if(btn =='yes'){
  156. for(var i=0;i<datalist.length;i++){//将grid里面各行的数据获取并拼成jsonGridData
  157. var data = datalist[i].data;
  158. if(datalist[i].dirty && data[mm.necessaryField] != null && data[mm.necessaryField] != ""){
  159. jsonGridData.push(Ext.JSON.encode(data));
  160. }
  161. }
  162. var params = [];
  163. params = unescape("[" + jsonGridData.toString().replace(/\\/g,"%") + "]");
  164. mm.update(params);
  165. }
  166. });
  167. }
  168. },
  169. update:function(param){
  170. Ext.Ajax.request({
  171. url : basePath+'fa/ars/saveAss.action',
  172. params: {
  173. param: param,
  174. caller:caller
  175. },
  176. method : 'post',
  177. callback : function(options,success,response){
  178. var localJson = new Ext.decode(response.responseText);
  179. if(localJson.success){
  180. updateSuccess(function(btn){
  181. // //update成功后刷新页面进入可编辑的页面
  182. var main = Ext.getCmp('erpasswin_'+caller);
  183. main.close();
  184. });
  185. } else if(localJson.exceptionInfo){
  186. } else {
  187. updateFailure();
  188. }
  189. }
  190. });
  191. },
  192. /**
  193. * string:原始字符串
  194. * substr:子字符串
  195. * isIgnoreCase:忽略大小写
  196. */
  197. contains: function(string,substr,isIgnoreCase){
  198. if(isIgnoreCase){
  199. string=string.toLowerCase();
  200. substr=substr.toLowerCase();
  201. }
  202. var startChar=substr.substring(0,1);
  203. var strLen=substr.length;
  204. for(var j=0;j<string.length-strLen+1;j++){
  205. if(string.charAt(j)==startChar){//如果匹配起始字符,开始查找
  206. if(string.substring(j,j+strLen)==substr){//如果从j开始的字符与str匹配,那ok
  207. return true;
  208. }
  209. }
  210. }
  211. return false;
  212. },
  213. getMyData: function(grid, url, param, no){
  214. var me = this;
  215. var main = parent.Ext.getCmp("content-panel");
  216. if(!main)
  217. main = parent.parent.Ext.getCmp("content-panel");
  218. if(main){
  219. main.getActiveTab().setLoading(true);//loading...
  220. }
  221. Ext.Ajax.request({//拿到grid的columns
  222. url : basePath + url,
  223. params: param,
  224. method : 'post',
  225. async: true,
  226. callback : function(options,success,response){
  227. if(main){
  228. main.getActiveTab().setLoading(false);
  229. }
  230. var res = new Ext.decode(response.responseText);
  231. if(res.exceptionInfo){
  232. showError(res.exceptionInfo);return;
  233. }
  234. if(res.columns){
  235. Ext.each(res.columns, function(column, y){
  236. //render
  237. if(!column.haveRendered && column.renderer != null && column.renderer != ""){
  238. if(!grid.RenderUtil){
  239. grid.RenderUtil = Ext.create('erp.util.RenderUtil');
  240. }
  241. var renderName = column.renderer;
  242. if(contains(column.renderer, ':', true)){
  243. var args = new Array();
  244. Ext.each(column.renderer.split(':'), function(a, index){
  245. if(index == 0){
  246. renderName = a;
  247. } else {
  248. args.push(a);
  249. }
  250. });
  251. if(!grid.RenderUtil.args[renderName]){
  252. grid.RenderUtil.args[renderName] = new Object();
  253. }
  254. grid.RenderUtil.args[renderName][column.dataIndex] = args;
  255. }
  256. column.renderer = grid.RenderUtil[renderName];
  257. column.haveRendered = true;
  258. }
  259. //logictype
  260. var logic = column.logic;
  261. if(logic != null){
  262. if(logic == 'detno'){
  263. grid.detno = column.dataIndex;
  264. } else if(logic == 'keyField'){
  265. grid.keyField = column.dataIndex;
  266. } else if(logic == 'mainField'){
  267. grid.mainField = column.dataIndex;
  268. } else if(logic == 'necessaryField'){
  269. grid.necessaryField = column.dataIndex;
  270. if(!grid.necessaryFields){
  271. grid.necessaryFields = new Array();
  272. }
  273. grid.necessaryFields.push(column.dataIndex);
  274. if(!column.haveRendered){
  275. column.renderer = function(val){
  276. return '<img src="' + basePath + 'resource/images/icon/need.png" title="必填字段">' +
  277. '<span style="color:blue;padding-left:2px;" title="必填字段">' + val + '</span>';
  278. };
  279. }
  280. } else if(logic == 'groupField'){
  281. grid.groupField = column.dataIndex;
  282. }
  283. }
  284. });
  285. var data = [];
  286. if(!res.data || res.data.length == 2){
  287. me.add10EmptyData(grid.detno, data);
  288. } else {
  289. data = Ext.decode(res.data.replace(/,}/g, '}').replace(/,]/g, ']'));
  290. //me.add10EmptyData(grid.detno, data);
  291. }
  292. var store = Ext.create('Ext.data.Store', {
  293. storeId: 'gridStore',
  294. fields: res.fields,
  295. data: data,
  296. groupField: grid.groupField,
  297. getSum: function(records, field) {
  298. var total = 0,
  299. i = 0,
  300. len = records.length;
  301. for (; i < len; ++i) {
  302. //重写getSum,grid在合计时,只合计填写了必要信息的行
  303. var necessary = records[i].get(grid.necessaryField);
  304. if(necessary != null && necessary != ''){
  305. total += records[i].get(field);
  306. }
  307. }
  308. return total;
  309. },
  310. getCount: function() {
  311. var count = 0;
  312. Ext.each(this.data.items, function(item){//重写getCount,grid在合计时,只合计填写了必要信息的行
  313. if(item.data[grid.necessaryField] != null && item.data[grid.necessaryField] != ''){
  314. count++;
  315. }
  316. });
  317. return count;//this.data.length || 0;
  318. }
  319. });
  320. if(grid.selModel.views == null){
  321. grid.selModel.views = [];
  322. }
  323. if(res.dbfinds.length > 0){
  324. grid.dbfinds = res.dbfinds;
  325. }
  326. //toolbar
  327. var items = [];
  328. var bool = true;
  329. Ext.each(grid.dockedItems.items, function(item){
  330. if(item.dock == 'bottom' && item.items){//bbar已存在
  331. bool = false;
  332. }
  333. });
  334. if(bool){
  335. Ext.each(res.columns, function(column){
  336. if(column.summaryType == 'sum'){
  337. items.push('-',{
  338. id: column.dataIndex + '_sum',
  339. itemId: column.dataIndex,
  340. xtype: 'tbtext',
  341. text: column.header + '(sum):0'
  342. });
  343. } else if(column.summaryType == 'average') {
  344. items.push('-',{
  345. id: column.dataIndex + '_average',
  346. itemId: column.dataIndex,
  347. xtype: 'tbtext',
  348. text: column.header + '(average):0'
  349. });
  350. } else if(column.summaryType == 'count') {
  351. items.push('-',{
  352. id: column.dataIndex + '_count',
  353. itemId: column.dataIndex,
  354. xtype: 'tbtext',
  355. text: column.header + '(count):0'
  356. });
  357. }
  358. if(column.dataIndex == res.necessaryField){
  359. column.renderer = function(val){
  360. return '<img src="' + basePath + 'resource/images/renderer/necessary.png" title="必填字段">' +
  361. '<span style="color:blue;padding-left:2px" title="必填字段">' + val + '</span>';
  362. };
  363. }
  364. });
  365. grid.addDocked({
  366. xtype: 'toolbar',
  367. dock: 'bottom',
  368. items: items
  369. });
  370. } else {
  371. var bars = Ext.ComponentQuery.query('erpToolbar');
  372. if(bars.length > 0){
  373. Ext.each(res.columns, function(column){
  374. if(column.summaryType == 'sum'){
  375. bars[0].add('-');
  376. bars[0].add({
  377. id: column.dataIndex + '_sum',
  378. itemId: column.dataIndex,
  379. xtype: 'tbtext',
  380. text: column.header + '(sum):0'
  381. });
  382. } else if(column.summaryType == 'average') {
  383. bars[0].add('-');
  384. bars[0].add({
  385. id: column.dataIndex + '_average',
  386. itemId: column.dataIndex,
  387. xtype: 'tbtext',
  388. text: column.header + '(average):0'
  389. });
  390. } else if(column.summaryType == 'count') {
  391. bars[0].add('-');
  392. bars[0].add({
  393. id: column.dataIndex + '_count',
  394. itemId: column.dataIndex,
  395. xtype: 'tbtext',
  396. text: column.header + '(count):0'
  397. });
  398. }
  399. });
  400. }
  401. }
  402. grid.reconfigure(store, res.columns);
  403. var form = Ext.ComponentQuery.query('form')[0];
  404. if(form && form.readOnly){
  405. grid.readOnly = true;//grid不可编辑
  406. }
  407. } else {
  408. grid.hide();
  409. var height = window.innerHeight;
  410. if(Ext.isIE){
  411. height = screen.height*0.75;
  412. }
  413. var form = Ext.ComponentQuery.query('form')[0];
  414. if(form){
  415. form.setHeight(height);
  416. }
  417. }
  418. }
  419. });
  420. },
  421. add10EmptyData: function(detno, data){
  422. var formCondition1 = this.BaseUtil.getUrlParam('formCondition');
  423. var formconfig = (formCondition1 == null) ? ['',''] : formCondition1.replace(/IS/g,"=").split('=');
  424. var mta_keyid = formconfig[1]=='' ? 0 :formconfig[1];
  425. if(detno){
  426. var index = data.length == 0 ? 0 : Number(data[data.length-1].raw[detno]);
  427. for(var i=0;i<7;i++){
  428. var o = new Object();
  429. o[detno] = index + i + 1;
  430. o['mta_caller']=caller;
  431. o['mta_keyid']=mta_keyid;
  432. data.push(o);
  433. }
  434. } else {
  435. for(var i=0;i<7;i++){
  436. var o = new Object();
  437. o['mta_caller']=caller;
  438. o['mta_keyid']=mta_keyid;
  439. data.push(o);
  440. }
  441. }
  442. },
  443. add10EmptyItems: function(grid){
  444. var items = grid.store.data.items;
  445. var detno = grid.detno;
  446. var formCondition1 = this.BaseUtil.getUrlParam('formCondition');
  447. var formconfig = (formCondition1 == null) ? ['',''] : formCondition1.replace(/IS/g,"=").split('=');
  448. var mta_keyid = formconfig[1]=='' ? 0 :formconfig[1];
  449. if(detno){
  450. var index = items.length == 0 ? 0 : Number(items[items.length-1].data[detno]);
  451. for(var i=0;i<10;i++){
  452. var o = new Object();
  453. o[detno] = index + i + 1;
  454. o['mta_caller']=caller;
  455. o['mta_keyid']=mta_keyid;
  456. grid.store.insert(items.length, o);
  457. items[items.length-1]['index'] = items.length-1;
  458. }
  459. } else {
  460. for(var i=0;i<10;i++){
  461. var o = new Object();
  462. grid.store.insert(items.length, o);
  463. o['mta_caller']=caller;
  464. o['mta_keyid']=mta_keyid;
  465. items[items.length-1]['index'] = items.length-1;
  466. }
  467. }
  468. }
  469. });