SNimport.js 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478
  1. /*
  2. * 序列号导入按钮
  3. */
  4. Ext.define('erp.view.core.button.SNimport',{
  5. extend : 'Ext.form.Panel',
  6. alias : 'widget.erpSNimportButton',
  7. initComponent : function() {
  8. if (this.iconCls) {
  9. this.items[0].buttonConfig.iconCls = this.iconCls;
  10. }
  11. if (this.cls) {
  12. this.items[0].buttonConfig.cls = this.cls;
  13. }
  14. if (this.itemCls) {
  15. this.items[0].buttonConfig.cls = this.itemCls;
  16. }
  17. if (this.iconCls) {
  18. this.items[0].buttonConfig.text = this.text;
  19. }
  20. this.callParent(arguments);
  21. },
  22. bodyStyle : 'background: transparent no-repeat 0 0;border: none;',
  23. items : [ {
  24. xtype : 'filefield',
  25. name : 'file',
  26. buttonOnly : true,
  27. hideLabel : true,
  28. width : 62,
  29. height : 17,
  30. buttonConfig : {
  31. iconCls : 'x-button-icon-excel',
  32. cls : 'x-btn-gray',
  33. text : $I18N.common.button.erpUpExcelButton,
  34. handler:function(btn,e){
  35. var grid = Ext.getCmp('grid1');
  36. if(grid&&grid.deleteBeforeImport){
  37. for(var i=0;i<grid.getStore().getCount();i++){
  38. var record = grid.getStore().getAt(i);
  39. var keyValue = record.get('rd_id');
  40. if(keyValue!=0 || keyValue!='' || keyValue!=null){
  41. Ext.Msg.show({
  42. title : '提示',
  43. msg : '请先清除序列号,才可以进行导入操作!',
  44. buttons: Ext.Msg.OK
  45. });
  46. e.preventDefault();
  47. }
  48. }
  49. return;
  50. }
  51. }
  52. },
  53. listeners : {
  54. change : function(field) {
  55. field.ownerCt.upexcel(field);
  56. }
  57. }
  58. } ],
  59. upexcel : function(field) {
  60. var bool = this.fireEvent('beforeimport', this);
  61. if (bool != false) {
  62. this.getForm().submit({
  63. url : basePath + 'common/upexcel.action',
  64. waitMsg : "正在解析Excel",
  65. success : function(fp,o) {
  66. field.reset();
  67. var data = Ext.decode(Ext.String.htmlDecode(o.result.grid.dataString.replace(/,}/g, '}').replace(/,]/g, ']').replace(/&lt/g,'<').replace(/&gt/g,'>')));
  68. field.ownerCt.createWin(o.result.grid.gridColumns, o.result.grid.gridFields, data);
  69. },
  70. failure : function(fp, o) {
  71. if (o.result.size) {
  72. showError(o.result.error + "&nbsp;" + Ext.util.Format.fileSize(o.result.size));
  73. field.reset();
  74. } else {
  75. showError(o.result.error);
  76. field.reset();
  77. }
  78. }
  79. });
  80. }
  81. },
  82. createWin : function(columns, fields, data) {
  83. var me = this;
  84. var form = me.createExcelForm(columns);
  85. var grid = me.createExcelGrid(columns, fields, data);
  86. Ext.create('Ext.window.Window', {
  87. id : 'excelwin',
  88. height : '100%',
  89. width : '90%',
  90. title : '请选择要导入的列和数据',
  91. layout : 'anchor',
  92. items : [ form, {
  93. xtype : 'radiogroup',
  94. columns : 2,
  95. margin : '0 0 0 10',
  96. anchor : '50% 3%',
  97. fieldLabel : '导入模式',
  98. vertical : true,
  99. items : [ {
  100. boxLabel : '追加',
  101. name : 'import_mode',
  102. inputValue : '+'
  103. }, {
  104. boxLabel : '替换',
  105. name : 'import_mode',
  106. inputValue : '-',
  107. checked : true
  108. } ]
  109. }, grid ],
  110. buttonAlign : 'center',
  111. buttons : [ {
  112. text : $I18N.common.button.erpConfirmButton,
  113. iconCls : 'x-button-icon-save',
  114. cls : 'x-btn-gray',
  115. id:'confirmimport',
  116. handler : function(btn) {
  117. me.exportGridToGrid(grid, me.grid || me.ownerCt.ownerCt || me.ownerCt.floatParent.ownerCt.ownerCt, function(){
  118. Ext.getCmp('excelwin').close();
  119. btn.fireEvent('afterimport',btn,grid);
  120. });
  121. }
  122. }, {
  123. text : $I18N.common.button.erpCloseButton,
  124. iconCls : 'x-button-icon-close',
  125. cls : 'x-btn-gray',
  126. handler : function() {
  127. Ext.getCmp('excelwin').close();
  128. }
  129. } ]
  130. }).show();
  131. grid.selModel.selectAll();
  132. Ext.each(form.items.items, function(item, index) {
  133. item.on('change', function() {
  134. Ext.each(grid.columns, function(c) {
  135. if (c.dataIndex == item.name) {
  136. if (item.checked) {
  137. c.show();
  138. } else {
  139. c.hide();
  140. }
  141. }
  142. });
  143. });
  144. });
  145. },
  146. createExcelForm : function(columns) {
  147. var l = Math.floor(columns.length / 5);
  148. var h = 2 + l * 5;
  149. var items = new Array();
  150. var item = null;
  151. var tGrid = this.grid || this.ownerCt.ownerCt || this.ownerCt.floatParent.ownerCt.ownerCt;
  152. var texts = this.getGridText(tGrid);
  153. Ext.each(columns, function(c, index) {
  154. item = new Object();
  155. item.id = c.dataIndex;
  156. item.name = c.dataIndex;
  157. item.xtype = 'checkbox';
  158. var label = c.header || c.text;
  159. if (!Ext.Array.contains(texts, label)) {// 将tGrid里面没有的列,加特殊的样式
  160. label = "<s>" + label + "</s>";
  161. item.style = 'color:#B6B7F9';
  162. }
  163. item.boxLabel = label;
  164. item.checked = true;
  165. item.labelAlign = 'right';
  166. item.columnWidth = .2;
  167. items.push(item);
  168. });
  169. return Ext.create('Ext.form.Panel', {
  170. anchor : '100% ' + h + '%',
  171. layout : 'column',
  172. bodyStyle : 'background: #f1f1f1;padding: 10px;',
  173. items : items
  174. });
  175. },
  176. createExcelGrid : function(columns, fields, data) {
  177. var me = this;
  178. var cols = new Array();
  179. Ext.each(columns, function(c) {
  180. c = me.removeKeys(c, [ 'locked', 'summaryType', 'logic', 'renderer' ]);
  181. cols.push(c);
  182. });
  183. var l = Math.floor(cols.length / 5);
  184. var h = 95 - l * 5;
  185. return Ext.create('Ext.grid.Panel', {
  186. id : 'excelgrid',
  187. anchor : '100% ' + h + '%',
  188. columns : cols,
  189. store : Ext.create('Ext.data.Store', {
  190. fields : fields,
  191. data : data
  192. }),
  193. columnLines : true,
  194. multiselected : new Array(),
  195. selModel : Ext.create('Ext.selection.CheckboxModel', {
  196. ignoreRightMouseSelection : false,
  197. listeners : {
  198. selectionchange : function(selectionModel, selected, options) {
  199. }
  200. },
  201. onRowMouseDown : function(view, record, item, index, e) {
  202. var me = Ext.getCmp('excelgrid');
  203. var bool = true;
  204. var items = me.selModel.getSelection();
  205. Ext.each(items, function(item, index) {
  206. if (this.index == record.index) {
  207. bool = false;
  208. me.selModel.deselect(record);
  209. Ext.Array.remove(items, item);
  210. Ext.Array.remove(me.multiselected, record);
  211. }
  212. });
  213. Ext.each(me.multiselected, function(item, index) {
  214. items.push(item);
  215. });
  216. me.selModel.select(items);
  217. if (bool) {
  218. view.el.focus();
  219. var checkbox = item.childNodes[0].childNodes[0].childNodes[0];
  220. if (checkbox.getAttribute('class') == 'x-grid-row-checker') {
  221. me.multiselected.push(record);
  222. items.push(record);
  223. me.selModel.select(items);
  224. } else {
  225. me.selModel.deselect(record);
  226. Ext.Array.remove(me.multiselected, record);
  227. }
  228. }
  229. },
  230. onHeaderClick : function(headerCt, header, e) {
  231. if (header.isCheckerHd) {
  232. e.stopEvent();
  233. var isChecked = header.el.hasCls(Ext.baseCSSPrefix + 'grid-hd-checker-on');
  234. if (isChecked) {
  235. this.deselectAll(true);
  236. var grid = Ext.getCmp('excelgrid');
  237. this.deselect(grid.multiselected);
  238. grid.multiselected = new Array();
  239. var els = Ext.select('div[@class=x-grid-row-checker-checked]').elements;
  240. Ext.each(els, function(el, index) {
  241. el.setAttribute('class', 'x-grid-row-checker');
  242. });
  243. header.el.removeCls(Ext.baseCSSPrefix + 'grid-hd-checker-on');// 添加这个
  244. } else {
  245. var grid = Ext.getCmp('excelgrid');
  246. this.deselect(grid.multiselected);
  247. grid.multiselected = new Array();
  248. var els = Ext.select('div[@class=x-grid-row-checker-checked]').elements;
  249. Ext.each(els, function(el, index) {
  250. el.setAttribute('class', 'x-grid-row-checker');
  251. });
  252. this.selectAll(true);
  253. header.el.addCls(Ext.baseCSSPrefix + 'grid-hd-checker-on');// 添加这个
  254. }
  255. }
  256. }
  257. })
  258. });
  259. },
  260. getGridText : function(grid) {
  261. var texts = [];
  262. Ext.Array.each(grid.columns, function(c) {
  263. if (!c.hidden && (c.width > 0 || c.flex > 0) && !c.isCheckerHd) {
  264. var text = c.text || c.header;
  265. if (text) {
  266. if ((c.items && c.items.length > 0) || (c.columns && c.columns.length > 0)) {
  267. var items = (c.items && c.items.items) || c.columns;
  268. Ext.Array.each(items, function(i) {
  269. texts.push(text + '(' + (i.text || i.header) + ')');
  270. });
  271. } else
  272. texts.push(text);
  273. }
  274. }
  275. });
  276. return texts;
  277. },
  278. getGridHeaders : function(grid) {
  279. var cols = {};
  280. Ext.Array.each(grid.columns, function(c) {
  281. if (!c.hidden && (c.width > 0 || c.flex > 0) && !c.isCheckerHd) {
  282. var text = c.text || c.header;
  283. if (text) {
  284. if ((c.items && c.items.length > 0) || (c.columns && c.columns.length > 0)) {
  285. var items = (c.items && c.items.items) || c.columns;
  286. Ext.Array.each(items, function(i) {
  287. cols[text + '(' + (i.text || i.header) + ')'] = i;
  288. });
  289. } else
  290. cols[text] = c;
  291. }
  292. }
  293. });
  294. return cols;
  295. },
  296. /**
  297. * excel没有grid列的dataIndex,只能根据grid列的header来匹配 From fGrid To tGrid
  298. */
  299. exportGridToGrid : function(fGrid, tGrid, callback) {
  300. var me = this, cols = me.getGridHeaders(tGrid);
  301. var f = new Array();
  302. var rel = new Object();
  303. Ext.each(fGrid.columns, function(c) {
  304. if (!c.hidden && cols[c.text]) {
  305. f.push(c);
  306. rel[c.dataIndex] = cols[c.text];
  307. }
  308. });
  309. var fields = Ext.Array.pluck(f, 'dataIndex');
  310. var data = new Array();
  311. var o = null, errs = [];
  312. var r = fGrid.ownerCt.down('radiogroup'), m = r.getValue().import_mode;
  313. var detno = 1, len = tGrid.store.data.items.length;
  314. if (m == '+' && tGrid.detno) {
  315. detno = (tGrid.store.max(tGrid.detno) || 0) + 1;
  316. }
  317. Ext.each(fGrid.selModel.getSelection(), function(item, index) {
  318. o = new Object();
  319. if (m == '-') {
  320. if (index + 1 <= len) {
  321. o = tGrid.store.getAt(index).data; // 可以保留覆盖的原数据的其它值不变
  322. if(tGrid.detno && o[tGrid.detno]) detno++;
  323. }
  324. }
  325. var keys = Ext.Object.getKeys(item.data);
  326. Ext.each(keys, function(key) {
  327. if (Ext.Array.contains(fields, key)) {
  328. var toCol = rel[key], val = item.data[key];
  329. if(!me.isValid(val, toCol)) {
  330. errs.push('行' + (index + 1) + '(' + toCol.text + ')');
  331. } else {
  332. if(toCol.xtype == 'combocolumn' && toCol.editor)
  333. val = me.getComboValue(val, toCol.editor.store);
  334. else if(toCol.xtype == 'yncolumn')
  335. val = me.getYnValue(val);
  336. else if(toCol.xtype == 'datecolumn')
  337. val = me.getDateValue(val);
  338. }
  339. o[toCol.dataIndex] = val;
  340. }
  341. });
  342. if (tGrid.detno) {
  343. if (!o[tGrid.detno]) {
  344. o[tGrid.detno] = detno++;
  345. }
  346. }
  347. data.push(o);
  348. });
  349. if(errs.length > 0) {
  350. showError('数据未通过校验:<hr>' + errs.join('<br>'));
  351. return;
  352. }
  353. var mfields=(tGrid.necessaryFields || tGrid.necessaryField),detnofield=tGrid.detno;
  354. if (m == '+') {
  355. var start = tGrid.store.indexOf(tGrid.store.last());
  356. tGrid.store.add(data);
  357. tGrid.store.each(function(item, index) {
  358. if (index > start) {
  359. item.dirty = true;// 标记为已修改
  360. var m = {};
  361. if (mfields !== undefined) {
  362. if (mfields instanceof String) {
  363. m[mfields] = item.data[mfields];
  364. } else {
  365. Ext.each(mfields, function(f) {
  366. m[f] = item.data[f];
  367. });
  368. }
  369. }else m=Ext.clone(item.data);
  370. item.modified = m;
  371. }
  372. });
  373. } else if (m == '-') {
  374. tGrid.store.loadData(data);
  375. Ext.each(tGrid.store.data.items, function(item,index) {
  376. var m = {};
  377. item.dirty = true;// 标记为已修改
  378. if (mfields !== undefined) {
  379. if (mfields instanceof String) {
  380. m[mfields] = item.data[mfields];
  381. } else {
  382. Ext.each(mfields, function(f) {
  383. m[f] = item.data[f];
  384. });
  385. }
  386. }else m=Ext.clone(item.data);
  387. item.modified=m;
  388. });
  389. }
  390. callback.call(me);
  391. },
  392. removeKeys : function(obj, keys) {
  393. var o = new Object();
  394. var key = Ext.Object.getKeys(obj);
  395. Ext.each(key, function(k) {
  396. if (!Ext.Array.contains(keys, k)) {
  397. o[k] = obj[k];
  398. }
  399. });
  400. return o;
  401. },
  402. isValid: function(v, toColumn) {
  403. if(v && toColumn) {
  404. var me = this;
  405. if(toColumn.xtype == 'numbercolumn')
  406. return me.isNumber(v);
  407. else if(toColumn.xtype == 'datecolumn')
  408. return me.isDate(v);
  409. else if(toColumn.xtype == 'combocolumn' && toColumn.editor)
  410. return me.isCombo(v, toColumn.editor.store);
  411. else if(toColumn.xtype == 'yncolumn')
  412. return me.isYn(v);
  413. }
  414. return true;
  415. },
  416. isNumber: function(v) {
  417. return !isNaN(parseFloat(v)) && isFinite(v);
  418. },
  419. isDate: function(v) {
  420. var dx1 = /\d{2,4}(-|\/)\d{1,2}(-|\/)\d{1,2}/,
  421. dx2 = /\d{1,2}(-|\/)\d{1,2}(-|\/)\d{4}/;
  422. return dx1.test(v) || dx2.test(v);
  423. },
  424. isCombo: function(v, store) {
  425. if(typeof store.each == 'undefined') {
  426. for(var i in store.data) {
  427. if(store.data[i].display == v || store.data[i].value == v)
  428. return true;
  429. }
  430. } else {
  431. var r;
  432. for(var i in store.data.items) {
  433. r = store.data.items[i];
  434. if(r.get('display') == v || r.get('value') == v)
  435. return true;
  436. }
  437. }
  438. return false;
  439. },
  440. isYn: function(v) {
  441. return [-1, '-1', 1, '1', 0, '0', '是', '否'].indexOf(v) > -1;
  442. },
  443. getComboValue: function(v, store) {
  444. var actual = v;
  445. if(typeof store.each == 'undefined') {
  446. Ext.Array.each(store.data, function(d){
  447. if(d.display == v)
  448. actual = d.value;
  449. });
  450. } else {
  451. store.each(function(r){
  452. if(r.get('display') == v)
  453. actual = r.get('value');
  454. });
  455. }
  456. return actual;
  457. },
  458. getYnValue: function(v) {
  459. return [-1, '-1', 1, '1', '是'].indexOf(v) > -1 ? -1 : 0;
  460. },
  461. getDateValue: function(v) {
  462. var dx1 = /\d{2,4}-\d{1,2}-\d{1,2}/,
  463. dx2 = /\d{2,4}\/\d{1,2}\/\d{1,2}/,
  464. dx3 = /\d{1,2}-\d{1,2}-\d{4}/;
  465. dx4 = /\d{1,2}\/\d{1,2}\/\d{4}/;
  466. if(dx1.test(v))
  467. return Ext.Date.parse(v, 'Y-m-d');
  468. else if(dx2.test(v))
  469. return Ext.Date.parse(v, 'Y/m/d');
  470. else if(dx3.test(v))
  471. return Ext.Date.parse(v, 'm-d-Y');
  472. else if(dx4.test(v))
  473. return Ext.Date.parse(v, 'm/d/Y');
  474. else
  475. return null;
  476. }
  477. });