Voucher.js 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353
  1. Ext.define('erp.view.fa.ars.Voucher',{
  2. extend: 'Ext.Viewport',
  3. layout: 'anchor',
  4. hideBorders: true,
  5. initComponent : function(){
  6. var me = this;
  7. Ext.apply(me, {
  8. items: [{
  9. anchor: '100% 26%',
  10. xtype: 'erpFormPanel',
  11. saveUrl: 'fa/ars/saveVoucher.action',
  12. deleteUrl: 'fa/ars/deleteVoucher.action',
  13. updateUrl: 'fa/ars/updateVoucher.action',
  14. submitUrl: 'fa/ars/submitVoucher.action',
  15. auditUrl: 'fa/ars/auditVoucher.action',
  16. printUrl: 'fa/ars/printVoucher.action',
  17. resAuditUrl: 'fa/ars/resAuditVoucher.action',
  18. resSubmitUrl: 'fa/ars/resSubmitVoucher.action',
  19. getIdUrl: 'common/getId.action?seq=VOUCHER_SEQ',
  20. keyField: 'vo_id',
  21. statusField: 'vo_statuscode',
  22. codeField: 'vo_code'
  23. },{
  24. anchor: '100% 13%',
  25. xtype: 'erpFormPanel',
  26. id: 'form_disable',
  27. caller: 'Voucher!Disable',
  28. _noc: 1,
  29. enableTools: false,
  30. enableKeyEvents: false
  31. }]
  32. });
  33. me.callParent(arguments);
  34. me.createGrid();
  35. me.getAssKind();
  36. },
  37. createGrid: function() {
  38. var me = this;
  39. me.getGridSet(function(config){
  40. var data = config.data ? Ext.decode(config.data.replace(/,}/g, '}').replace(/,]/g, ']')) : [];
  41. if(data.length == 0) {
  42. for(var i = 0;i < 40;i++ ){
  43. var o = new Object();
  44. o.vd_detno = i + 1;
  45. data.push(o);
  46. }
  47. } else {
  48. config.fields.push({name: 'ass'});
  49. }
  50. var gridConfig = {}, cols = me.renderColumns(gridConfig, config.columns);
  51. var grid = Ext.create('erp.view.core.grid.Panel2', Ext.apply(gridConfig, {
  52. anchor: '100% 61%',
  53. columns: cols,
  54. store: new Ext.data.Store({
  55. fields: config.fields,
  56. data: data
  57. }),
  58. boxready: true,
  59. plugins: [Ext.create('Ext.grid.plugin.CellEditing', {
  60. clicksToEdit: 1
  61. }), Ext.create('erp.view.core.plugin.CopyPasteMenu'), {
  62. ptype: 'rowexpander',
  63. expandOnDblClick: false,
  64. startExpand: true,
  65. rowBodyTpl : new Ext.XTemplate(
  66. '<tpl if="ass">',
  67. '<tpl for="ass">',
  68. '<div style="margin-left: 39px;">',
  69. '<table class="u-table">',
  70. '<tr><td width="200" class="text-right">{vds_asstype}</td>',
  71. '<td width="140">{vds_asscode}<a id="{[this.onQueryClick()]}" class="u-icon x-button-icon-query" title="{vds_asstype}" rel="{vds_vdid}"></a></td><td width="300">{vds_assname}</td></tr>',
  72. '</table>',
  73. '</div>',
  74. '</tpl>',
  75. '</tpl>', {
  76. onQueryClick: function() {
  77. var id = Ext.id();
  78. Ext.defer(this.onQuery, 1, this, [id]);
  79. return id;
  80. },
  81. onQuery: function(id) {
  82. var elm = Ext.get(id);
  83. if(elm) {
  84. var grid = this.owner;
  85. Ext.EventManager.on(elm, {
  86. click: function(event, el) {
  87. if(!grid.readOnly) {
  88. me.queryAss(el.getAttribute('title'), el.getAttribute('rel'));
  89. }
  90. Ext.EventManager.stopEvent(event);
  91. },
  92. buffer: 100
  93. });
  94. }
  95. }
  96. }),
  97. renderer: function(value, metadata, record) {
  98. if(metadata)
  99. metadata.tdCls = Ext.baseCSSPrefix + 'grid-cell-special';
  100. var ass = record.get('ass') || [];
  101. return ass.length > 0 ? '<div class="' + Ext.baseCSSPrefix + 'grid-row-expander">&#160;</div>' : '';
  102. }
  103. }],
  104. listeners: {
  105. storeloaded: function(grid, data) {
  106. me.getAssData(grid);
  107. }
  108. },
  109. onExport: function() {
  110. this.BaseUtil.exportGrid(this);
  111. }
  112. }));
  113. me.insert(1, grid);
  114. grid.fireEvent('storeloaded', grid);
  115. grid.generateSummaryData();
  116. if(config.dbfinds && config.dbfinds.length > 0){
  117. grid.dbfinds = config.dbfinds;
  118. }
  119. Ext.defer(function(){
  120. var status = Ext.getCmp('vo_statuscode');
  121. if(status && status.getValue() != 'ENTERING' && status.getValue() != 'UNPOST') {
  122. grid.readOnly = true;
  123. Ext.util.CSS.createStyleSheet('.u-icon{display: none !important}', 'icon_readonly');
  124. }
  125. }, 300);
  126. });
  127. },
  128. /**
  129. * Grid配置及数据
  130. */
  131. getGridSet: function(callback) {
  132. var condition = getUrlParam('gridCondition');
  133. condition = ((!condition || "null" == condition) ? "" : condition).replace(/IS/g, "=");
  134. Ext.Ajax.request({
  135. url : basePath + 'common/singleGridPanel.action',
  136. params: {
  137. caller: caller,
  138. condition: condition
  139. },
  140. method : 'post',
  141. callback : function(opt, s, res){
  142. if (res) {
  143. var r = new Ext.decode(res.responseText);
  144. if(r.exceptionInfo){
  145. showError(res.exceptionInfo);
  146. } else {
  147. callback.call(null, r);
  148. }
  149. }
  150. }
  151. });
  152. },
  153. renderColumns: function(gridConfig, cols) {
  154. Ext.Array.each(cols, function(col){
  155. var logic = col.logic;
  156. delete col.locked;
  157. if(!Ext.isEmpty(logic)) {
  158. if(logic == 'detno'){
  159. gridConfig.detno = col.dataIndex;
  160. col.width = 40;
  161. col.align = 'center';
  162. col.renderer = function(val, meta) {
  163. meta.tdCls = Ext.baseCSSPrefix + 'grid-cell-special';
  164. return val;
  165. };
  166. } else if(logic == 'keyField'){
  167. gridConfig.keyField = col.dataIndex;
  168. } else if(logic == 'mainField'){
  169. gridConfig.mainField = col.dataIndex;
  170. } else if(logic == 'orNecessField'){
  171. if(!gridConfig.orNecessField){
  172. gridConfig.orNecessField = new Array();
  173. }
  174. gridConfig.orNecessField.push(col.dataIndex);
  175. } else if(logic == 'necessaryField'){
  176. gridConfig.necessaryField = col.dataIndex;
  177. if(!gridConfig.necessaryFields){
  178. gridConfig.necessaryFields = new Array();
  179. }
  180. gridConfig.necessaryFields.push(col.dataIndex);
  181. if(!col.haveRendered){
  182. col.renderer = function(val, meta, record, x, y, store, view){
  183. var c = this.columns[y];
  184. if(val != null && val.toString().trim() != ''){
  185. if(c.xtype == 'datecolumn' && typeof val === 'object'){
  186. val = Ext.Date.format(val, 'Y-m-d');
  187. } else if(c.xtype == 'numbercolumn') {
  188. val = Ext.util.Format.number(val, c.format || '0,000.00');
  189. }
  190. return val;
  191. } else {
  192. if(c.xtype == 'datecolumn'){
  193. val = '';
  194. }
  195. return '<img src="' + basePath + 'resource/images/icon/need.png" title="必填字段">' +
  196. '<span style="color:blue;padding-left:2px;" title="必填字段">' + val + '</span>';
  197. }
  198. };
  199. }
  200. } else if(logic == 'groupField'){
  201. gridConfig.groupField = col.dataIndex;
  202. }
  203. }
  204. });
  205. return cols;
  206. },
  207. /**
  208. * 所有核算类型
  209. */
  210. getAssKind: function() {
  211. var me = this;
  212. Ext.Ajax.request({
  213. url: basePath + 'fa/ars/assKind.action',
  214. method: 'GET',
  215. callback: function(opt, s, r) {
  216. if(s) {
  217. var data = Ext.decode(r.responseText), ks = {};
  218. Ext.Array.each(data, function(d){
  219. ks[d.AK_NAME] = d;
  220. });
  221. me.asskind = ks;
  222. }
  223. }
  224. });
  225. },
  226. /**
  227. * 辅助核算
  228. */
  229. getAssData: function(grid) {
  230. var data = {}, has = false;
  231. grid.store.each(function(item, idx){
  232. if(!Ext.isEmpty(item.get('ca_asstype'))){
  233. has = true;
  234. data[item.get('vd_id')] = item;
  235. }
  236. });
  237. if(has) {
  238. Ext.Ajax.request({
  239. url: basePath + 'common/getFieldsDatas.action',
  240. params: {
  241. caller: 'VoucherDetailAss',
  242. fields: 'vds_id,vds_vdid,vds_asstype,vds_asscode,vds_assname',
  243. condition: 'vds_vdid in (' +Ext.Object.getKeys(data).join(',') + ') order by vds_vdid,vds_detno'
  244. },
  245. callback: function(opt, s, r) {
  246. if(s) {
  247. var rs = Ext.decode(r.responseText);
  248. if(rs.success){
  249. var ds = Ext.decode(rs.data), x, d;
  250. for(var i in ds) {
  251. x = ds[i];
  252. d = data[x.VDS_VDID];
  253. var ass = d.get('ass') || [];
  254. ass.push({
  255. vds_id: x.VDS_ID,
  256. vds_vdid: x.VDS_VDID,
  257. vds_asstype: x.VDS_ASSTYPE,
  258. vds_asscode: x.VDS_ASSCODE,
  259. vds_assname: x.VDS_ASSNAME
  260. });
  261. d.set('ass', ass);
  262. d.modified = {};
  263. d.dirty = false;
  264. }
  265. }
  266. grid.store.each(function(item, idx){
  267. if(!Ext.isEmpty(item.get('ca_asstype'))){
  268. var ass = item.get('ass') || [], names = item.get('ca_assname').split('#'), len = names.length,
  269. id = item.get('vd_id');
  270. if(ass.length < len) {
  271. for(var i in names) {
  272. var d = Ext.Array.findBy(ass, function(t){
  273. return t.vds_asstype == names[i];
  274. });
  275. if(!d) {
  276. ass.push({vds_vdid: id, vds_asstype: names[i]});
  277. if(ass.length == len)
  278. break;
  279. }
  280. }
  281. item.set('ass', ass);
  282. }
  283. }
  284. });
  285. }
  286. }
  287. });
  288. }
  289. },
  290. /**
  291. * 查找辅助核算
  292. */
  293. queryAss: function(type, vdId) {
  294. var me = this, kind = me.asskind[type];
  295. if(kind) {
  296. var search = kind.AK_DBFIND + '|' + kind.AK_ASSCODE, con = kind.AK_DBFIND == 'AssKindDetail' ? ('akd_akid=' + kind.AK_ID) : '';
  297. var win = new Ext.window.Window({
  298. id: 'dbwin',
  299. title: '查找',
  300. height: '80%',
  301. width: '95%',
  302. maximizable: true,
  303. buttonAlign: 'center',
  304. layout: 'anchor',
  305. items: [{
  306. tag: 'iframe',
  307. frame: true,
  308. anchor: '100% 100%',
  309. layout: 'fit',
  310. html: '<iframe id="iframe_dbfind" src="' + basePath + 'jsps/common/dbfind.jsp?dbfind=' + search + '&trigger=dbfind-ass-hidden&dbCondition=' + con + '" height="100%" width="100%" frameborder="0" scrolling="no"></iframe>'
  311. },{
  312. xtype: 'hidden',
  313. hidden: true,
  314. id: 'dbfind-ass-hidden',
  315. listeners: {
  316. aftertrigger: function(trigger, findRecord) {
  317. var grid = Ext.getCmp('grid'), index = grid.store.findBy(function(t){
  318. return t.get('vd_id') == vdId;
  319. }), record = grid.store.getAt(index), ass = record.get('ass') || [];
  320. for(var i in ass) {
  321. if(ass[i].vds_asstype == type) {
  322. ass[i].vds_asscode = findRecord.get(kind.AK_ASSCODE);
  323. ass[i].vds_assname = findRecord.get(kind.AK_ASSNAME);
  324. break;
  325. }
  326. }
  327. record.set('ass', ass);
  328. }
  329. }
  330. }],
  331. buttons: [{
  332. text: '关 闭',
  333. iconCls: 'x-button-icon-close',
  334. cls: 'x-btn-gray',
  335. handler: function(btn) {
  336. btn.ownerCt.ownerCt.close();
  337. }
  338. },
  339. {
  340. text: '重置条件',
  341. id: 'reset',
  342. cls: 'x-btn-gray',
  343. handler: function(btn) {
  344. var dbGrid = btn.ownerCt.ownerCt.el.dom.getElementsByTagName('iframe')[0].contentWindow.document.defaultView.Ext.getCmp('dbfindGridPanel');
  345. dbGrid.resetCondition();
  346. dbGrid.getCount();
  347. }
  348. }]
  349. });
  350. win.show();
  351. }
  352. }
  353. });