VoucherNumber.js 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186
  1. Ext.QuickTips.init();
  2. Ext.define('erp.controller.fa.ars.VoucherNumber', {
  3. extend: 'Ext.app.Controller',
  4. FormUtil: Ext.create('erp.util.FormUtil'),
  5. BaseUtil: Ext.create('erp.util.BaseUtil'),
  6. GridUtil: Ext.create('erp.util.GridUtil'),
  7. views:[
  8. 'fa.ars.VoucherNumber', 'core.form.MonthDateField', 'common.editorColumn.GridPanel'
  9. ],
  10. init:function(){
  11. var me = this;
  12. this.control({
  13. 'button[id=query]': {
  14. click: function(btn) {
  15. var grid = btn.up('form').ownerCt.down('gridpanel');
  16. me.query(grid);
  17. }
  18. },
  19. 'button[id=number]': {
  20. click: function(btn) {
  21. var grid = btn.up('form').ownerCt.down('gridpanel');
  22. me.insertBreakNumber(grid);
  23. Ext.getCmp('vo_breaks').setValue('');
  24. grid.store.sort([{
  25. property : 'vo_lead',
  26. direction: 'ASC'
  27. },{
  28. property : 'vo_number',
  29. direction: 'ASC'
  30. },{
  31. property : 'vo_date',
  32. direction: 'ASC'
  33. }]);
  34. }
  35. },
  36. 'button[id=save]': {
  37. click: function(btn) {
  38. var grid = btn.up('form').ownerCt.down('gridpanel');
  39. me.save(grid);
  40. }
  41. },
  42. 'monthdatefield': {
  43. afterrender:function(f){
  44. me.getCurrentMonth(function(data){
  45. var ym = data ? data.PD_DETNO : Ext.Date.format(new Date(), 'Ym');
  46. f.setValue(ym);
  47. });
  48. },
  49. change: function(f) {
  50. if(f.hasValid()) {
  51. var grid = f.up('form').ownerCt.down('gridpanel');
  52. me.query(grid);
  53. }
  54. }
  55. },
  56. 'erpEditorColumnGridPanel': {
  57. storeloaded: function(grid, data) {
  58. grid.difference = {};
  59. if(data) {
  60. var leads = [];
  61. if(data instanceof Array) {
  62. leads = Ext.Array.pluck(data, 'vo_lead');
  63. } else if(data.data){
  64. data.each(function(d){
  65. leads.push(d.get('vo_lead'));
  66. });
  67. }
  68. leads = Ext.Array.unique(leads), s = '';
  69. Ext.Array.each(leads, function(l){
  70. var breaks = me.getBreakNumber(grid, l);
  71. grid.difference[l] = breaks;
  72. if(breaks && breaks.length > 0) {
  73. if(leads.length > 0 && l == '') {
  74. s += ' (无): ' + breaks.join(',');
  75. } else {
  76. s += ' (' + l + '): ' + breaks.join(',');
  77. }
  78. }
  79. });
  80. Ext.getCmp('vo_breaks').setValue(s);
  81. } else {
  82. Ext.getCmp('vo_breaks').setValue(null);
  83. }
  84. }
  85. }
  86. });
  87. },
  88. getCurrentMonth: function(callback) {
  89. Ext.Ajax.request({
  90. url: basePath + 'fa/getMonth.action',
  91. params: {
  92. type: 'MONTH-A'
  93. },
  94. callback: function(opt, s, r) {
  95. var rs = Ext.decode(r.responseText);
  96. if(rs.data) {
  97. callback.call(null, rs.data);
  98. }
  99. }
  100. });
  101. },
  102. getForm: function(btn){
  103. return btn.ownerCt.ownerCt;
  104. },
  105. query: function(grid){
  106. grid.GridUtil.loadNewStore(grid, {
  107. caller: caller,
  108. condition: 'vo_yearmonth=' + Ext.getCmp('vo_yearmonth').value +
  109. ' order by vo_lead,vo_number'
  110. });
  111. },
  112. getBreakNumber: function(grid, lead){
  113. var max = 0, nums = [], diff = [];
  114. grid.store.each(function(r){
  115. var l = r.get('vo_lead') || '', v = r.get('vo_number');
  116. if(l == lead) {
  117. max = Math.max(max, v);
  118. nums.push(Number(v));
  119. }
  120. });
  121. if(max > 0) {
  122. var numbers = [];
  123. for(var i = 1;i <= max;i++) {
  124. numbers.push(i);
  125. }
  126. return Ext.Array.difference(numbers, nums);
  127. }
  128. return null;
  129. },
  130. insertBreakNumber: function(grid){
  131. var items = grid.store.data.items, len = items.length;
  132. for(var i = len-1;i>=0;i--) {
  133. var item = items[i], breaks = grid.difference[item.get('vo_lead')];
  134. if(breaks) {
  135. if(breaks.length > 0) {
  136. if(breaks[0] < Number(item.get('vo_number'))) {
  137. item.set('vo_number', breaks[0]);
  138. Ext.Array.remove(breaks, breaks[0]);
  139. }
  140. } else
  141. delete grid.difference[item.get('vo_lead')]
  142. }
  143. }
  144. },
  145. save: function(grid){
  146. var dir = new Array(), numbers = [], lead, num, bool = true, i = 0;
  147. grid.store.each(function(item){
  148. i++;
  149. lead = item.get('vo_lead') || '(无)';
  150. num = item.get('vo_number');
  151. if(!Ext.Array.contains(numbers, lead + num)) {
  152. numbers.push(lead + num);
  153. } else {
  154. showError('有重号,位于第' + i + '行,凭证字:' + lead + ',凭证号:' + num);
  155. bool = false;return;
  156. }
  157. if(item.dirty) {
  158. dir.push({
  159. vo_id: item.get('vo_id'),
  160. vo_number: num
  161. });
  162. }
  163. });
  164. if(bool && dir.length > 0) {
  165. grid.setLoading(true);
  166. Ext.Ajax.request({
  167. url: basePath + 'fa/ars/insertBreakVoNumber.action',
  168. params: {
  169. data: Ext.encode(dir)
  170. },
  171. async: false,
  172. callback: function(opt, s, r) {
  173. grid.setLoading(false);
  174. var res = Ext.decode(r.responseText);
  175. if(res.success) {
  176. alert('保存成功');
  177. }
  178. }
  179. });
  180. this.query(grid);
  181. }
  182. }
  183. });