Form.js 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639
  1. Ext.define('erp.view.scm.purchase.VerifyApplyDetail.Form',{
  2. extend: 'Ext.form.Panel',
  3. alias: 'widget.erpVerifyApplyDetailFormPanel',
  4. id: 'verifyApplyDetailForm',
  5. region: 'north',
  6. frame : true,
  7. layout : 'column',
  8. autoScroll : true,
  9. defaultType : 'textfield',
  10. labelSeparator : ':',
  11. buttonAlign : 'center',
  12. cls: 'u-form-default',
  13. fieldDefaults : {
  14. fieldStyle : "background:#FFFAFA;color:#515151;",
  15. focusCls: 'x-form-field-cir-focus',
  16. labelAlign : "right",
  17. msgTarget: 'side',
  18. blankText : $I18N.common.form.blankText
  19. },
  20. requires: ['erp.view.common.JProcess.SetNodeGridPanel'],
  21. FormUtil: Ext.create('erp.util.FormUtil'),
  22. BaseUtil: Ext.create('erp.util.BaseUtil'),
  23. saveUrl: '',
  24. updateUrl: '',
  25. deleteUrl: '',
  26. auditUrl: '',
  27. resAuditUrl: '',
  28. submitUrl: '',
  29. resSubmitUrl: '',
  30. bannedUrl: '',
  31. resBannedUrl: '',
  32. postUrl:'',
  33. printUrl: '',
  34. getIdUrl: '',
  35. keyField: '',
  36. codeField: '',
  37. statusField: '',
  38. params: null,
  39. caller: null,
  40. formCondition:null,
  41. Contextvalue:null,
  42. LastValue:null,
  43. enableTools: true,
  44. enableKeyEvents: true,
  45. _noc: 0,
  46. initComponent : function(){
  47. formCondition = getUrlParam('formCondition');//从url解析参数
  48. formCondition = (formCondition == null) ? "" : formCondition.replace(/IS/g,"=");
  49. //集团版
  50. var master=getUrlParam('newMaster');
  51. var param = {caller: this.caller || caller, condition: this.formCondition || formCondition, _noc: (getUrlParam('_noc') || this._noc)};
  52. if(master){
  53. param.master=master;
  54. }
  55. this.FormUtil.getItemsAndButtons(this, 'common/singleFormItems.action', this.params || param);//从后台拿到formpanel的items
  56. this.callParent(arguments);
  57. //加prev、next、refresh等tool
  58. if(this.enableTools) {
  59. this.setTools();
  60. }
  61. //给页面加上ctrl+alt+s键盘事件,自动跳转form配置界面
  62. if(this.enableKeyEvents) {
  63. this.addKeyBoardEvents();
  64. }
  65. },
  66. /**
  67. * FormHeader Tools
  68. * 包括:查看日志、查看流程、查看列表、最大化、最小化、刷新、关闭、上一条、下一条
  69. */
  70. setTools: function(){
  71. this.tools = [{
  72. type: 'search',
  73. tooltip: '查看单据日志',
  74. listeners:{
  75. click: function(btn){
  76. var form = Ext.getCmp('verifyApplyDetailForm');
  77. var id = Ext.getCmp(form.keyField).value;
  78. if(id != null && id != 0){
  79. form.getLogs(id);
  80. }
  81. }
  82. }
  83. },{
  84. type: 'save',
  85. tooltip: '导出Excel',
  86. listeners:{
  87. click: function(btn){
  88. var form = Ext.getCmp('verifyApplyDetailForm');
  89. var id = Ext.getCmp(form.keyField).value;
  90. form.saveAsExcel(id,caller);
  91. }
  92. }
  93. },{
  94. type: 'collapse',
  95. tooltip: '查看列表',
  96. listeners:{
  97. click: function(btn){
  98. if(parent.Ext) {
  99. var datalist = parent.Ext.getCmp(datalistId);
  100. if(!datalist){
  101. var form = btn.ownerCt.ownerCt;
  102. var url = 'jsps/common/datalist.jsp?whoami=' + caller;
  103. if(btn.urlcondition){
  104. url += '&urlcondition=' + btn.urlcondition;
  105. }
  106. form.FormUtil.onAdd(caller + '_scan', parent.Ext.getCmp('content-panel').getActiveTab().title + 'DataList', url);
  107. } else {
  108. datalist.ownerCt.setActiveTab(datalist);
  109. }
  110. }
  111. }
  112. }
  113. },{
  114. type: 'maximize',
  115. tooltip: '最大化',
  116. listeners:{
  117. click: function(btn){
  118. var height = window.screen.height*0.87;
  119. var width = window.screen.width;
  120. //弹出框显示,可以锁定住地址栏和工具栏,防止用户不合理操作
  121. window.open(window.location.href, '', 'width=' + width + ',height=' + height + ',top=0,left=0,toolbar=no, menubar=no, scrollbars=no, resizable=no,location=no, status=no');
  122. }
  123. }
  124. },{
  125. type: 'minus',
  126. tooltip: '最小化',
  127. listeners:{
  128. click: function(btn){
  129. var p = parent.Ext.getCmp('content-panel');
  130. if(p){
  131. var t = p.getActiveTab();
  132. var b = parent.Ext.getCmp('bottom');
  133. if(b){
  134. b.insert(4, {
  135. text: t.title,
  136. tooltip: t.tabConfig.tooltip,
  137. tab: t,
  138. handler: function(btn){
  139. var a = p.add(btn.tab);
  140. p.setActiveTab(a);
  141. btn.destroy();
  142. }
  143. });
  144. p.remove(t, false);//并不销毁
  145. }
  146. }
  147. }
  148. }
  149. },{
  150. type: 'refresh',
  151. tooltip: '刷新',
  152. listeners:{
  153. click: function(btn){
  154. var form = btn.up('form');
  155. if(typeof form.refresh === 'function')
  156. form.refresh.call(null, form);
  157. else
  158. window.location.reload();
  159. }
  160. }
  161. },{
  162. type: 'close',
  163. tooltip: '关闭',
  164. listeners:{
  165. click: function(btn){
  166. var p = parent.Ext.getCmp('content-panel');
  167. if(p){
  168. p.getActiveTab().close();
  169. } else {
  170. window.close();
  171. }
  172. }
  173. }
  174. },{
  175. type:'prev',
  176. id: 'prev',
  177. tooltip: '上一条',
  178. listeners:{
  179. render: function(btn){
  180. setTimeout(function(){
  181. if(parent.Ext) {
  182. var vad_id = Ext.getCmp("vad_id").value;
  183. var form = Ext.getCmp('verifyApplyDetailForm');
  184. var datalistStore = form.getCurrentStore(vad_id);
  185. Ext.each(datalistStore, function(){
  186. if(this.selected == true){
  187. if(this.prev == null){
  188. btn.disable(true);
  189. }
  190. }
  191. });
  192. } else {
  193. btn.disable(true);
  194. }
  195. },100);
  196. },
  197. click: function(btn){
  198. var vad_id = Ext.getCmp("vad_id").value;
  199. var form = Ext.getCmp('verifyApplyDetailForm');
  200. var datalistStore = form.getCurrentStore(vad_id);
  201. var newId = 0;
  202. var idx = 0;
  203. Ext.each(datalistStore, function(s, index){
  204. if(this.selected == true){
  205. if(this.prev != null){
  206. newId = this.prev;
  207. idx = index;
  208. }
  209. }
  210. });
  211. var va_code = Ext.getCmp("vad_code").value;
  212. var formCondition = "vad_id=" + newId+" and vad_code='"+va_code+"'";
  213. var gridCondition = "vadp_vadid=" + newId +" and vadp_vacode='"+va_code+"'";
  214. window.location.href = basePath+'jsps/scm/purchase/verifyApplyDetail.jsp?_noc=1&whoami='+caller+'&formCondition='+formCondition+'&gridCondition='+gridCondition;
  215. }
  216. }
  217. },{
  218. type: 'next',
  219. id: 'next',
  220. tooltip: '下一条',
  221. listeners:{
  222. render: function(btn){
  223. setTimeout(function(){
  224. if(parent.Ext) {
  225. var vad_id = Ext.getCmp("vad_id").value;
  226. var form = Ext.getCmp('verifyApplyDetailForm');
  227. var datalistStore = form.getCurrentStore(vad_id);
  228. Ext.each(datalistStore, function(){
  229. if(this.selected == true){
  230. if(this.next == null){
  231. btn.disable(true);
  232. }
  233. }
  234. });
  235. } else {
  236. btn.disable(true);
  237. }
  238. },100);
  239. },
  240. click: function(btn){
  241. var vad_id = Ext.getCmp("vad_id").value;
  242. var form = Ext.getCmp('verifyApplyDetailForm');
  243. var datalistStore = form.getCurrentStore(vad_id);
  244. var newId = 0;
  245. var idx = 0;
  246. Ext.each(datalistStore, function(s, index){
  247. if(s.selected == true){
  248. if(s.next != null){
  249. newId = s.next;
  250. idx = index;
  251. }
  252. }
  253. });
  254. var va_code = Ext.getCmp("vad_code").value;
  255. var formCondition = "vad_id=" + newId+" and vad_code='"+va_code+"'";
  256. var gridCondition = "vadp_vadid=" + newId +" and vadp_vacode='"+va_code+"'";
  257. window.location.href = basePath+'jsps/scm/purchase/verifyApplyDetail.jsp?_noc=1&whoami='+caller+'&formCondition='+formCondition+'&gridCondition='+gridCondition;
  258. }
  259. }
  260. },{
  261. type: 'help',
  262. tooltip: '帮助文档',
  263. listeners:{
  264. click: function(t){
  265. var form = t.ownerCt.ownerCt;
  266. form.showHelpWindow();
  267. }
  268. }
  269. }];
  270. },
  271. /**
  272. * 监听一些事件
  273. * <br>
  274. * Ctrl+Alt+S 单据配置维护
  275. * Ctrl+Alt+P 参数、逻辑配置维护
  276. */
  277. addKeyBoardEvents: function(){
  278. var me = this;
  279. Ext.EventManager.addListener(document.body, 'keydown', function(e){
  280. if(e.altKey && e.ctrlKey) {
  281. if(e.keyCode == Ext.EventObject.S) {
  282. var url = "jsps/ma/form.jsp?formCondition=fo_idIS" + me.fo_id + "&gridCondition=fd_foidIS" + me.fo_id,
  283. forms = Ext.ComponentQuery.query('form'),
  284. grids = Ext.ComponentQuery.query('gridpanel'),
  285. formSet = [], gridSet = [];
  286. if(forms.length > 0) {
  287. Ext.Array.each(forms, function(f){
  288. f.fo_id && (formSet.push(f.fo_id));
  289. });
  290. }
  291. if(grids.length > 0) {
  292. Ext.Array.each(grids, function(g){
  293. if(g.xtype.indexOf('erpVerifyApplyDetailGridPanel') > -1)
  294. gridSet.push(window.caller);
  295. else if(g.caller)
  296. gridSet.push(g.caller);
  297. });
  298. }
  299. if(formSet.length > 0 || gridSet.length > 0) {
  300. url = "jsps/ma/multiform.jsp?formParam=" + formSet.join(',') + '&gridParam=' + gridSet.join(',');
  301. }
  302. me.FormUtil.onAdd('form' + caller, 'Form配置维护(' + caller + ')', url);
  303. } else if(e.keyCode == Ext.EventObject.P) {
  304. me.FormUtil.onAdd('configs-' + caller, '逻辑配置维护(' + caller + ')', "jsps/ma/logic/config.jsp?whoami=" + caller);
  305. }
  306. }
  307. });
  308. },
  309. /**
  310. * 拿到操作日志
  311. */
  312. getLogs: function(id){
  313. if(Ext.getCmp('win' + id)){
  314. Ext.getCmp('win' + id).show();
  315. } else {
  316. Ext.Ajax.request({//拿到grid的columns
  317. url : basePath + 'common/getMessageLogs.action',
  318. async: false,
  319. params: {
  320. caller: caller,
  321. id: id
  322. },
  323. method : 'post',
  324. callback : function(options,success,response){
  325. var res = new Ext.decode(response.responseText);
  326. if(res.exception || res.exceptionInfo){
  327. showError(res.exceptionInfo);
  328. return;
  329. }
  330. var logs = res.logs;
  331. logs = logs.length == 0 ? [{ml_date: $I18N.common.grid.emptyText, ml_man: $I18N.common.grid.emptyText,
  332. ml_content: $I18N.common.grid.emptyText, ml_result: $I18N.common.grid.emptyText}] : logs;
  333. Ext.create('Ext.window.Window', {
  334. id : 'win' + id,
  335. title: '<span style="color:#CD6839;">操作日志</span>',
  336. iconCls: 'x-button-icon-set',
  337. closeAction: 'hide',
  338. height: "100%",
  339. width: "80%",
  340. maximizable : true,
  341. buttonAlign : 'center',
  342. layout : 'anchor',
  343. items: [{
  344. anchor: '100% 100%',
  345. xtype: 'gridpanel',
  346. ignore: true,
  347. bodyStyle: 'background:#f1f1f1;',
  348. autoScroll: true,
  349. store: Ext.create('Ext.data.Store', {
  350. fields: ['ml_date', 'ml_man', 'ml_content', 'ml_result'],
  351. data: logs
  352. }),
  353. columnLines: true,
  354. columns: [
  355. { header: '时间', dataIndex: 'ml_date', flex: 1.5 , renderer: function(val){
  356. if(val != '无数据'){
  357. return Ext.Date.format(new Date(val), 'Y-m-d H:i:s');
  358. }
  359. }},
  360. { header: '操作人员', dataIndex: 'ml_man', flex: 1 ,renderer: function(val){
  361. if(val == em_name){
  362. return '<font color=red>' + val + '</font>';
  363. } else {
  364. return val;
  365. }
  366. }},
  367. { header: '操作', dataIndex: 'ml_content', flex: 1.5},
  368. { header: '结果', dataIndex: 'ml_result', flex: 3}
  369. ]
  370. }],
  371. buttons : [{
  372. text : '关 闭',
  373. iconCls: 'x-button-icon-close',
  374. cls: 'x-btn-gray',
  375. handler : function(){
  376. Ext.getCmp('win' + id).close();
  377. }
  378. }]
  379. }).show();
  380. }
  381. });
  382. }
  383. },
  384. saveAsExcel:function(id,caller){
  385. if(id==null || id =='') showMessage('提示','无法导出空数据单据',1000);
  386. else window.location.href=basePath+'excel/savePanelAsExcel.action?id='+id+"&caller="+caller+"&_noc=1";
  387. },
  388. showHelpWindow:function(){
  389. var me = this,
  390. win = Ext.getCmp('ext-help'),path;
  391. Ext.Ajax.request({
  392. url : basePath + 'common/form/getHelpDoc.action',
  393. params: {
  394. caller:caller
  395. },
  396. method : 'post',
  397. async:false,
  398. callback : function(opt, s, res){
  399. var r = new Ext.decode(res.responseText);
  400. if(r.exceptionInfo){
  401. showError(r.exceptionInfo);
  402. } else if(r.success){
  403. path=r.path;
  404. }
  405. }
  406. });
  407. if(!win) {
  408. win = Ext.create('Ext.Window', {
  409. id: 'ext-help',
  410. width: '90%',
  411. height: '100%',
  412. closeAction: 'hide',
  413. title: '帮助文档',
  414. layout: 'border',
  415. items: [{
  416. region:'center',
  417. tag : 'iframe',
  418. layout : 'fit',
  419. html : '<iframe src="' + basePath + path + '" height="100%" width="100%" frameborder="0" scrolling="auto"></iframe>'
  420. },{
  421. region: 'south',
  422. height: 100,
  423. split: true,
  424. collapsible: true,
  425. title: '相关信息',
  426. minHeight:60,
  427. collapsed: true,
  428. html: '相关信息'
  429. }]
  430. });
  431. }
  432. win.show();
  433. },
  434. parseVoucherConfig : function(config) {
  435. var form = this, keys = Ext.Object.getKeys(config), args = {};
  436. Ext.each(keys, function(k){
  437. if (typeof config[k] === 'function') {
  438. args[k] = config[k].call(null, form);
  439. } else if (k == 'yearmonth') {
  440. args[k] = form.getYearmonthByField(config[k]);
  441. } else if (k == 'datas') {
  442. args[k] = form.getDataByField(config[k]);
  443. } else {
  444. args[k] = config[k];
  445. }
  446. });
  447. return args;
  448. },
  449. createVoucher: function(config) {
  450. var me = this, args = this.parseVoucherConfig(config);
  451. if('unneed' == args.kind) {
  452. showMessage('提示', '该类型单据无需制作凭证!');
  453. return;
  454. }
  455. me.getVoucher(function(data){
  456. var vf = me.voucherConfig.voucherField;
  457. if (!Ext.isEmpty(data[vf])) {
  458. if(data[vf] != 'UNNEED') {
  459. var box = Ext.create('Ext.window.MessageBox', {
  460. buttonAlign : 'center',
  461. buttons: [{
  462. text: '查看凭证',
  463. handler: function(b) {
  464. me.linkVoucher(data);
  465. b.ownerCt.ownerCt.close();
  466. }
  467. },{
  468. text: '取消凭证',
  469. handler: function(b) {
  470. me.onVoucherUnCreate(args);
  471. b.ownerCt.ownerCt.close();
  472. }
  473. },{
  474. text: '关闭',
  475. handler : function(b) {
  476. b.ownerCt.ownerCt.close();
  477. }
  478. }]
  479. });
  480. box.show({
  481. title : "提示",
  482. msg : "当前单据已制作过凭证:" + data[vf],
  483. icon : Ext.MessageBox.QUESTION
  484. });
  485. } else
  486. showMessage('提示', '该类型单据无需制作凭证!');
  487. } else {
  488. warnMsg('现在制作凭证?', function(b){
  489. if (b == 'ok' || b == 'yes') {
  490. me.beforeVoucherCreate(args);
  491. }
  492. });
  493. }
  494. });
  495. },
  496. beforeVoucherCreate : function(args) {
  497. var me = this;
  498. if(me.keyField && me.statusField) {
  499. var val = me.down('#' + me.keyField).getValue(),
  500. params = {
  501. caller: me.tablename,
  502. field: me.voucherConfig.status || me.statusField,
  503. condition: me.keyField + '=' + val
  504. };
  505. Ext.Ajax.request({
  506. url : basePath + 'common/getFieldData.action',
  507. params: params,
  508. method : 'post',
  509. callback : function(opt, s, res){
  510. var r = new Ext.decode(res.responseText);
  511. if(r.exceptionInfo){
  512. showError(r.exceptionInfo);
  513. } else if(r.success && (args.statusValue || 'POSTED') == r.data){
  514. me.onVoucherCreate(args);
  515. } else {
  516. showError('单据还未过账!');
  517. }
  518. }
  519. });
  520. }
  521. },
  522. onVoucherCreate : function(args) {
  523. var me = this;
  524. me.setLoading(true);
  525. Ext.Ajax.request({
  526. url: basePath + 'fa/vc/createVoucher.action',
  527. params: args,
  528. callback: function(opt, s, r) {
  529. me.setLoading(false);
  530. var rs = Ext.decode(r.responseText);
  531. if(rs.exceptionInfo) {
  532. showError(rs.exceptionInfo);
  533. } else if(rs.error) {
  534. showMessage('提示', rs.error);
  535. return;
  536. } else {
  537. alert('制作成功');
  538. }
  539. me.getVoucher(function(data){
  540. var vf = me.voucherConfig.voucherField, v = me.down('#' + vf);
  541. v && v.setValue(data[vf]);
  542. me.linkVoucher(data);
  543. });
  544. }
  545. });
  546. },
  547. onVoucherUnCreate : function(args) {
  548. var me = this;
  549. me.setLoading(true);
  550. Ext.Ajax.request({
  551. url: basePath + 'fa/vc/unCreateVoucher.action',
  552. params: args,
  553. callback: function(opt, s, r) {
  554. me.setLoading(false);
  555. var rs = Ext.decode(r.responseText);
  556. if(rs.exceptionInfo) {
  557. showError(rs.exceptionInfo);
  558. } else if(rs.error) {
  559. showMessage('提示', rs.error);
  560. } else {
  561. alert('取消成功');
  562. var vf = me.voucherConfig.voucherField, v = me.down('#' + vf);
  563. v && v.setValue(null);
  564. }
  565. }
  566. });
  567. },
  568. getDataByField : function(field) {
  569. var form = this, f = form.child('#' + field);
  570. return f ? "'" + f.getValue() + "'" : '';
  571. },
  572. getYearmonthByField : function(field) {
  573. var form = this;
  574. var f = form.child('#' + field),
  575. v = f ? (Ext.isDate(f.value) ? f.value : Ext.Date.parse(f.value, 'Y-m-d')) : new Date();
  576. return Ext.Date.format(v, 'Ym');
  577. },
  578. getVoucher : function(callback) {
  579. var me = this, vf = me.voucherConfig.voucherField;
  580. Ext.Ajax.request({
  581. url : basePath + 'common/getFieldsData.action',
  582. params: {
  583. caller : me.tablename + ' left join voucher on vo_code=' + vf,
  584. fields : 'vo_id,' + vf,
  585. condition : me.keyField + '=' + me.down('#' + me.keyField).value
  586. },
  587. method : 'post',
  588. callback : function(opt, s, res){
  589. var r = new Ext.decode(res.responseText);
  590. if(r.exceptionInfo){
  591. showError(r.exceptionInfo);return;
  592. }
  593. if(r.success){
  594. callback.call(null, r.data || {});
  595. }
  596. }
  597. });
  598. },
  599. linkVoucher : function(data) {
  600. this.FormUtil.onAdd(null, '凭证', 'jsps/fa/ars/voucher.jsp?formCondition=vo_idIS' +
  601. data.vo_id + '&gridCondition=vd_voidIS' + data.vo_id);
  602. },
  603. addTask : function() {
  604. var me = this, taskWin = me.taskWin;
  605. if(!taskWin) {
  606. me.taskWin = taskWin = Ext.create('erp.view.core.window.Task', {
  607. sourceform : me
  608. });
  609. }
  610. taskWin.show();
  611. },
  612. getCurrentStore: function(value){
  613. var grid = parent.Ext.getCmp('grid');
  614. var items = grid.store.data.items;
  615. var array = new Array();
  616. var o = null;
  617. Ext.each(items, function(item, index){
  618. o = new Object();
  619. o.selected = false;
  620. if(index == 0){
  621. o.prev = null;
  622. } else {
  623. o.prev = items[index-1].data["vad_id"];
  624. }
  625. if(index == items.length - 1){
  626. o.next = null;
  627. } else {
  628. o.next = items[index+1].data["vad_id"];
  629. }
  630. var v = item.data["vad_id"];
  631. o.value = v;
  632. if(v == value)
  633. o.selected = true;
  634. array.push(o);
  635. });
  636. return array;
  637. }
  638. });