SaleForecast.js 38 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004
  1. Ext.QuickTips.init();
  2. Ext.define('erp.controller.scm.sale.SaleForecast', {
  3. extend: 'Ext.app.Controller',
  4. FormUtil: Ext.create('erp.util.FormUtil'),
  5. GridUtil: Ext.create('erp.util.GridUtil'),
  6. BaseUtil: Ext.create('erp.util.BaseUtil'),
  7. views:[
  8. 'core.form.Panel','scm.sale.SaleForecast','core.grid.Panel2','core.toolbar.Toolbar','core.form.MultiField','core.button.UpdateForecastQty',
  9. 'core.button.Save','core.button.Add','core.button.Submit','core.button.Print','core.button.Upload','core.button.ChangeDate','core.form.MultiField',
  10. 'core.button.ResAudit','core.button.Scan','core.button.DeleteDetail','core.button.ResSubmit','core.button.FeatureDefinition',
  11. 'core.button.Audit','core.button.Close','core.button.Delete','core.button.Update','core.button.End','core.button.ResEnd','core.button.Print',
  12. 'core.trigger.DbfindTrigger','core.trigger.TextAreaTrigger','core.form.YnField','core.grid.YnColumn','core.button.FeatureView','core.button.AttendDataCom',
  13. 'core.button.MrpOpen','core.button.MrpClose','core.button.SaleForecastChange'
  14. ],
  15. init:function(){
  16. var me = this;
  17. this.control({
  18. 'erpGridPanel2': {
  19. itemclick: function(selModel, record){
  20. //Ext.getCmp('featuredefinition').setDisabled(false);
  21. //Ext.getCmp('featureview').setDisabled(false);
  22. var btn = Ext.getCmp('MrpOpen');
  23. btn && btn.setDisabled(false);
  24. btn = Ext.getCmp('MrpClose');
  25. btn && btn.setDisabled(false);
  26. btn = Ext.getCmp('bomopen');
  27. btn && btn.setDisabled(false);
  28. btn = Ext.getCmp('splitSaleButton');
  29. btn && btn.setDisabled(false);
  30. this.onGridItemClick(selModel, record);
  31. }
  32. },
  33. 'erpChangeDateButton':{
  34. afterrender: function(btn){
  35. var status = Ext.getCmp('sf_statuscode');
  36. if(status && status.value != 'AUDITED'){
  37. btn.hide();
  38. }
  39. },
  40. click:function(btn){
  41. var keyvalue=Ext.getCmp('sf_id').value;
  42. var condition='sd_sfid='+keyvalue;
  43. var win = new Ext.window.Window({
  44. id : 'win',
  45. height: "100%",
  46. width: "80%",
  47. maximizable : true,
  48. buttonAlign : 'center',
  49. layout : 'anchor',
  50. items: [{
  51. tag : 'iframe',
  52. frame : true,
  53. anchor : '100% 100%',
  54. layout : 'fit',
  55. html : '<iframe id="iframe_' + caller + '" src="' + basePath + 'jsps/common/editorColumn.jsp?caller=SaleForecast!Change'
  56. +"&condition=" + condition +'" height="100%" width="100%" frameborder="0" scrolling="no"></iframe>'
  57. }],
  58. buttons : [{
  59. text : $I18N.common.button.erpConfirmButton,
  60. iconCls: 'x-button-icon-confirm',
  61. cls: 'x-btn-gray',
  62. handler : function(){
  63. var grid = Ext.getCmp('win').items.items[0].body.dom.getElementsByTagName('iframe')[0].contentWindow.Ext.getCmp("editorColumnGridPanel");
  64. var data = grid.getEffectData();
  65. if(data != null){
  66. grid.setLoading(true);
  67. Ext.Ajax.request({
  68. url : basePath + 'scm/sale/SaleForecastChangedate.action',
  69. params: {
  70. caller: caller,
  71. data: Ext.encode(data)
  72. },
  73. method : 'post',
  74. callback : function(options,success,response){
  75. grid.setLoading(false);
  76. var localJson = new Ext.decode(response.responseText);
  77. if(localJson.exceptionInfo){
  78. showError(localJson.exceptionInfo);
  79. return "";
  80. }
  81. if(localJson.success){
  82. if(localJson.log){
  83. showMessage("提示", localJson.log);
  84. }
  85. Ext.Msg.alert("提示", "处理成功!", function(){
  86. win.close();
  87. var detailgrid= Ext.getCmp('grid');
  88. gridParam = {caller: 'SaleForecast', condition: condition};
  89. me.GridUtil.getGridColumnsAndStore(detailgrid, 'common/singleGridPanel.action', gridParam, "");
  90. });
  91. }
  92. }
  93. });
  94. }
  95. }
  96. }, {
  97. text : $I18N.common.button.erpCloseButton,
  98. iconCls: 'x-button-icon-close',
  99. cls: 'x-btn-gray',
  100. handler : function(){
  101. Ext.getCmp('win').close();
  102. }
  103. }]
  104. });
  105. win.show();
  106. }
  107. },
  108. /**
  109. * 订单分拆
  110. */
  111. '#splitSaleButton': {
  112. click: function(btn) {
  113. var record=btn.ownerCt.ownerCt.getSelectionModel().getLastSelected();
  114. me.SaleSplit(record);
  115. }
  116. },
  117. 'erpSaleForecastChangeButton':{
  118. afterrender:function(btn){
  119. btn.setDisabled(false);
  120. }
  121. },
  122. 'field[name=sf_currency]': {
  123. beforetrigger: function(field) {
  124. var t = field.up('form').down('field[name=sf_tilldate]'),
  125. value = t.getValue();
  126. if(value) {
  127. field.findConfig = 'cm_yearmonth=' + Ext.Date.format(value, 'Ym');
  128. }
  129. }
  130. },
  131. 'erpSaveButton': {
  132. click: function(btn){
  133. var form = me.getForm(btn), codeField = Ext.getCmp(form.codeField);
  134. if(codeField.value == null || codeField.value == ''){
  135. me.BaseUtil.getRandomNumber(caller);//自动添加编号
  136. var res = me.getLeadCode(Ext.getCmp('sf_kind').value);
  137. if(res != null && res != ''){
  138. codeField.setValue(res + codeField.getValue());
  139. }
  140. }
  141. this.beforeSaveSaleForecast(this);
  142. }
  143. },
  144. /* 'erpDeleteDetailButton': {
  145. afterrender: function(btn){
  146. btn.ownerCt.add({
  147. xtype: 'erpFeatureDefinitionButton'
  148. });
  149. btn.ownerCt.add({
  150. xtype: 'erpFeatureViewButton'
  151. });
  152. }
  153. },*/
  154. 'erpDeleteButton' : {
  155. click: function(btn){
  156. me.FormUtil.onDelete(Ext.getCmp('sf_id').value);
  157. }
  158. },
  159. 'erpUpdateButton': {
  160. click: function(btn){
  161. this.beforeUpdate(this);
  162. }
  163. },
  164. 'erpAttendDataComButton':{
  165. beforerender:function(btn){
  166. btn.setText("计 算");
  167. btn.setWidth(65);
  168. },
  169. click: function(btn){
  170. grid = Ext.getCmp('grid');
  171. var id=Ext.getCmp('sf_id').value;
  172. Ext.Ajax.request({
  173. url : basePath + "scm/sale/saleforecastdataupdate.action",
  174. params: {
  175. id:id
  176. },
  177. method : 'post',
  178. async: false,
  179. callback : function(options,success,response){
  180. var res = new Ext.decode(response.responseText);
  181. if(res.exceptionInfo){
  182. showError(res.exceptionInfo);
  183. return;
  184. }
  185. grid.GridUtil.loadNewStore(grid,{
  186. caller:'SaleForecast',
  187. condition:gridCondition,
  188. _noc:1
  189. });
  190. showError("计算成功!");
  191. }
  192. });
  193. }
  194. },
  195. 'erpMrpOpenButton':{
  196. click: function(btn){
  197. var grid = Ext.getCmp('grid');
  198. var record = grid.selModel.lastSelected;
  199. var id = record.data.sd_id;
  200. Ext.Ajax.request({
  201. url : basePath + "scm/sale/openMrp.action",
  202. params: {
  203. id:id
  204. },
  205. method : 'post',
  206. async: false,
  207. callback : function(options,success,response){
  208. var res = new Ext.decode(response.responseText);
  209. if(res.exceptionInfo){
  210. showError(res.exceptionInfo);
  211. return;
  212. }
  213. showError("打开Mrp成功!");
  214. }
  215. });
  216. }
  217. },
  218. 'erpMrpCloseButton': {
  219. click: function(btn){
  220. var grid = Ext.getCmp('grid');
  221. var record = grid.selModel.lastSelected;
  222. var id = record.data.sd_id;
  223. Ext.Ajax.request({
  224. url : basePath + "scm/sale/CloseMrp.action",
  225. params: {
  226. id:id
  227. },
  228. method : 'post',
  229. async: false,
  230. callback : function(options,success,response){
  231. var res = new Ext.decode(response.responseText);
  232. if(res.exceptionInfo){
  233. showError(res.exceptionInfo);
  234. return;
  235. }
  236. showError("关闭Mrp成功!");
  237. }
  238. });
  239. }
  240. },
  241. /**
  242. * BOM多级展开
  243. */
  244. '#bomopen': {
  245. click: function(btn) {
  246. var record=btn.ownerCt.ownerCt.getSelectionModel().getLastSelected();
  247. var pr_code=record.data.sd_prodcode;
  248. var url="jsps/pm/bom/BOMStructQuery.jsp?whoami=BOMStruct!Struct!Query";
  249. var condition="";
  250. //母件编号带出展开的料号不对 参照万利达配置
  251. if(pr_code){
  252. condition+="pr_codeIS'"+pr_code+"'";
  253. }
  254. me.FormUtil.onAdd('BOMStruct'+ pr_code, 'BOM多级展开', url+"&condition="+condition);
  255. }
  256. },
  257. 'erpAddButton': {
  258. click: function(){
  259. me.FormUtil.onAdd('addSaleForecast', '新增销售预测单', 'jsps/scm/sale/saleForecast.jsp');
  260. }
  261. },
  262. 'erpCloseButton': {
  263. click: function(btn){
  264. me.FormUtil.beforeClose(me);
  265. }
  266. },
  267. 'erpSubmitButton': {
  268. afterrender: function(btn){
  269. var status = Ext.getCmp('sf_statuscode');
  270. if(status && status.value != 'ENTERING'){
  271. btn.hide();
  272. }
  273. },
  274. click: function(btn){
  275. var grid = Ext.getCmp('grid'), items = grid.store.data.items, bool=true;
  276. Ext.Array.each(items, function(item){
  277. if(!Ext.isEmpty(item.data['sd_prodcode'])){
  278. if(!Ext.isEmpty(item.data['sd_needdate'])){
  279. if (Ext.Date.format(item.data['sd_needdate'], 'Y-m-d') < Ext.Date.format(new Date(), 'Y-m-d')) {
  280. bool = false;
  281. showError('明细表第' + item.data['sd_detno'] + '行的出货日期小于当前日期');
  282. return;
  283. }
  284. }
  285. if(!Ext.isEmpty(item.data['sd_enddate'])){
  286. if (Ext.Date.format(item.data['sd_enddate'], 'Y-m-d') < Ext.Date.format(new Date(), 'Y-m-d')) {
  287. bool = false;
  288. showError('明细表第' + item.data['sd_detno'] + '行的截止日期小于当前日期');
  289. return;
  290. }
  291. if (item.data['sd_enddate'] < item.data['sd_startdate']) {
  292. bool = false;
  293. showError('明细表第' + item.data['sd_detno'] + '行的截止日期小于起始日期');
  294. return;
  295. }
  296. }
  297. }
  298. });
  299. if(bool){
  300. me.FormUtil.onSubmit(Ext.getCmp('sf_id').value);
  301. }
  302. }
  303. },
  304. 'erpResSubmitButton': {
  305. afterrender: function(btn){
  306. var status = Ext.getCmp('sf_statuscode');
  307. if(status && status.value != 'COMMITED'){
  308. btn.hide();
  309. }
  310. },
  311. click: function(btn){
  312. me.FormUtil.onResSubmit(Ext.getCmp('sf_id').value);
  313. }
  314. },
  315. 'erpAuditButton': {
  316. afterrender: function(btn){
  317. var status = Ext.getCmp('sf_statuscode');
  318. if(status && status.value != 'COMMITED'){
  319. btn.hide();
  320. }
  321. },
  322. click: function(btn){
  323. me.FormUtil.onAudit(Ext.getCmp('sf_id').value);
  324. }
  325. },
  326. 'erpResAuditButton': {
  327. afterrender: function(btn){
  328. var status = Ext.getCmp('sf_statuscode');
  329. if(status && status.value != 'AUDITED'){
  330. btn.hide();
  331. }
  332. },
  333. click: function(btn){
  334. me.FormUtil.onResAudit(Ext.getCmp('sf_id').value);
  335. }
  336. },
  337. 'erpPrintButton': {
  338. click:function(btn){
  339. var reportName="SaleForecastAudit1";
  340. var condition='{SaleForeCast.sf_id}='+Ext.getCmp('sf_id').value+'';
  341. var id=Ext.getCmp('sf_id').value;
  342. me.FormUtil.onwindowsPrint(id,reportName,condition);
  343. }
  344. },
  345. 'erpEndButton': {
  346. afterrender: function(btn){
  347. var status = Ext.getCmp('sf_statuscode');
  348. if(status && status.value != 'AUDITED'){
  349. btn.hide();
  350. }
  351. },
  352. click: function(btn){
  353. me.FormUtil.onEnd(Ext.getCmp('sf_id').value);
  354. }
  355. },
  356. 'erpResEndButton': {
  357. afterrender: function(btn){
  358. var status = Ext.getCmp('sf_statuscode');
  359. if(status && status.value != 'FINISH'){
  360. btn.hide();
  361. }
  362. },
  363. click: function(btn){
  364. me.FormUtil.onResEnd(Ext.getCmp('sf_id').value);
  365. }
  366. },
  367. 'erpFeatureDefinitionButton':{
  368. click: function(btn){
  369. var grid = Ext.getCmp('grid');
  370. var record = grid.selModel.lastSelected;
  371. if(record.data.sd_prodcode != null){
  372. Ext.Ajax.request({//拿到grid的columns
  373. url : basePath + "pm/bom/getDescription.action",
  374. params: {
  375. tablename: 'Product',
  376. field: 'pr_specvalue',
  377. condition: "pr_code='" + record.data.sd_prodcode + "'"
  378. },
  379. method : 'post',
  380. async: false,
  381. callback : function(options,success,response){
  382. var res = new Ext.decode(response.responseText);
  383. if(res.exceptionInfo){
  384. showError(res.exceptionInfo);return;
  385. }
  386. if(res.success){
  387. if(res.description != '' && res.description != null && res.description == 'NOTSPECIFIC'){
  388. var win = new Ext.window.Window({
  389. id : 'win',
  390. title: '生成特征料号',
  391. height: "90%",
  392. width: "70%",
  393. maximizable : true,
  394. buttonAlign : 'center',
  395. layout : 'anchor',
  396. items: [{
  397. tag : 'iframe',
  398. frame : true,
  399. anchor : '100% 100%',
  400. layout : 'fit',
  401. html : '<iframe id="iframe_' + record.data.sd_id + '" src="' + basePath +
  402. "jsps/pm/bom/FeatureValueSet.jsp?fromwhere=SaleForecastDetail&condition=formidIS" + record.data.sd_id + ' AND pr_codeIS' + record.data.sd_prodcode + ' AND pr_nameIS' + record.data.pr_detail +'" height="100%" width="100%" frameborder="0" scrolling="yes"></iframe>'
  403. }]
  404. });
  405. win.show();
  406. } else {
  407. showError('物料特征必须为 虚拟特征件');return;
  408. }
  409. }
  410. }
  411. });
  412. }
  413. }
  414. },
  415. 'erpFeatureViewButton':{
  416. click: function(btn){
  417. var grid = Ext.getCmp('grid');
  418. var record = grid.selModel.lastSelected;
  419. if(record.data.sd_prodcode != null){
  420. Ext.Ajax.request({//拿到grid的columns
  421. url : basePath + "pm/bom/getDescription.action",
  422. params: {
  423. tablename: 'Product',
  424. field: 'pr_specvalue',
  425. condition: "pr_code='" + record.data.sd_prodcode + "'"
  426. },
  427. method : 'post',
  428. async: false,
  429. callback : function(options,success,response){
  430. var res = new Ext.decode(response.responseText);
  431. if(res.exceptionInfo){
  432. showError(res.exceptionInfo);return;
  433. }
  434. if(res.success){
  435. if(res.description != '' && res.description != null && res.description == 'SPECIFIC'){
  436. var win = new Ext.window.Window({
  437. id : 'win' + record.data.sd_id,
  438. title: '特征查看',
  439. height: "90%",
  440. width: "70%",
  441. maximizable : true,
  442. buttonAlign : 'center',
  443. layout : 'anchor',
  444. items: [{
  445. tag : 'iframe',
  446. frame : true,
  447. anchor : '100% 100%',
  448. layout : 'fit',
  449. html : '<iframe id="iframe_' + record.data.sd_id + '" src="' + basePath +
  450. "jsps/pm/bom/FeatureValueView.jsp?fromwhere=SaleForecastDetail&condition=formidIS" + record.data.sd_id + ' AND pr_codeIS' + record.data.sd_prodcode + ' AND pr_nameIS' + record.data.pr_detail +'" height="100%" width="100%" frameborder="0" scrolling="yes"></iframe>'
  451. }]
  452. });
  453. win.show();
  454. } else {
  455. showError('物料特征必须为 虚拟特征件');return;
  456. }
  457. }
  458. }
  459. });
  460. }
  461. }
  462. },
  463. 'erpUpdateForecastQtyButton':{
  464. click:function(){
  465. //更改预测数量
  466. var id=Ext.getCmp('sf_id').value;
  467. var condition="sd_sfid="+id;
  468. var linkCaller='SaleForecast!UpdateQty';
  469. var win = new Ext.window.Window(
  470. {
  471. id : 'win',
  472. height : 300,
  473. width : 500,
  474. maximizable : true,
  475. title:'更改预测数量',
  476. buttonAlign : 'center',
  477. layout : 'anchor',
  478. items : [ {
  479. tag : 'iframe',
  480. frame : true,
  481. anchor : '100% 100%',
  482. layout : 'fit',
  483. html : '<iframe id="iframe_'+linkCaller+'" src="'+basePath+'jsps/common/editorColumn.jsp?_noc=1&caller='+linkCaller+'&condition='+condition+'" height="100%" width="100%" frameborder="0" scrolling="auto"></iframe>'
  484. } ],
  485. buttons:[{
  486. text:'保存',
  487. iconCls: 'x-button-icon-save',
  488. cls: 'x-btn-gray',
  489. handler:function(btn){
  490. var grid = Ext.getCmp('win').items.items[0].body.dom.getElementsByTagName('iframe')[0].contentWindow.Ext.getCmp("editorColumnGridPanel");
  491. var data = grid.getEffectData();
  492. if(data != null){
  493. grid.setLoading(true);
  494. Ext.Ajax.request({
  495. url : basePath + 'scm/sale/UpdateForecastQty.action',
  496. params: {
  497. data: Ext.encode(data)
  498. },
  499. method : 'post',
  500. callback : function(options,success,response){
  501. grid.setLoading(false);
  502. var localJson = new Ext.decode(response.responseText);
  503. if(localJson.exceptionInfo){
  504. showError(localJson.exceptionInfo);
  505. return "";
  506. }
  507. if(localJson.success){
  508. if(localJson.log){
  509. showMessage("提示", localJson.log);
  510. }
  511. Ext.Msg.alert("提示", "处理成功!", function(){
  512. win.close();
  513. var grid=Ext.getCmp('grid');
  514. grid.GridUtil.loadNewStore(grid,{
  515. caller:'SaleForecast',
  516. condition:gridCondition,
  517. _noc:1
  518. });
  519. });
  520. }
  521. }
  522. });
  523. }
  524. }
  525. },{
  526. text:'关闭',
  527. iconCls: 'x-button-icon-close',
  528. cls: 'x-btn-gray',
  529. handler:function(btn){
  530. win.close();
  531. }
  532. }]
  533. });
  534. win.show();
  535. }
  536. },
  537. 'textfield[name=sf_fromdate]': {
  538. change: function(field){
  539. if(field.value != null && field.value != ''){
  540. var grid = Ext.getCmp('grid');
  541. var date = field.value;
  542. Ext.Array.each(grid.getStore().data.items,function(item){
  543. item.set('sd_startdate',date);
  544. });
  545. }
  546. }
  547. },
  548. 'textfield[name=sf_todate]': {
  549. change: function(field){
  550. if(field.value != null && field.value != ''){
  551. var grid = Ext.getCmp('grid');
  552. var date = field.value;
  553. Ext.Array.each(grid.getStore().data.items,function(item){
  554. item.set('sd_enddate',date);
  555. });
  556. }
  557. }
  558. },
  559. 'textfield[name=sf_custcode]': {
  560. change: function(field){
  561. if(field.value != null && field.value != ''){
  562. var grid = Ext.getCmp('grid');
  563. var date = field.value;
  564. var name = Ext.getCmp('sf_custname').value;
  565. Ext.Array.each(grid.getStore().data.items,function(item){
  566. item.set('sd_custcode',date);
  567. item.set('sd_custname',name);
  568. });
  569. }
  570. }
  571. }
  572. });
  573. },
  574. onGridItemClick: function(selModel, record){//grid行选择
  575. this.GridUtil.onGridItemClick(selModel, record);
  576. },
  577. getForm: function(btn){
  578. return btn.ownerCt.ownerCt;
  579. },
  580. beforeSaveSaleForecast: function(){
  581. var grid = Ext.getCmp('grid'), items = grid.store.data.items,
  582. c = Ext.getCmp('sf_code').value, bool = true;
  583. Ext.Array.each(items, function(item){
  584. if(!Ext.isEmpty(item.data['sd_prodcode'])){
  585. item.set('sd_code', c);
  586. item.set('sd_sourceqty', Number(item.data['sd_qty']));
  587. if(!Ext.isEmpty(item.data['sd_needdate'])){
  588. if (Ext.Date.format(item.data['sd_needdate'], 'Y-m-d') < Ext.Date.format(new Date(), 'Y-m-d')) {
  589. bool = false;
  590. showError('明细表第' + item.data['sd_detno'] + '行的出货日期小于当前日期');
  591. return;
  592. }
  593. }
  594. if(!Ext.isEmpty(item.data['sd_enddate'])){
  595. if (Ext.Date.format(item.data['sd_enddate'], 'Y-m-d') < Ext.Date.format(new Date(), 'Y-m-d')) {
  596. bool = false;
  597. showError('明细表第' + item.data['sd_detno'] + '行的截止日期小于当前日期');
  598. return;
  599. }
  600. if (item.data['sd_enddate'] < item.data['sd_startdate']) {
  601. bool = false;
  602. showError('明细表第' + item.data['sd_detno'] + '行的截止日期小于起始日期');
  603. return;
  604. }
  605. }
  606. }
  607. });
  608. if(bool)
  609. //保存
  610. this.FormUtil.beforeSave(this);
  611. },
  612. beforeUpdate: function(){
  613. var grid = Ext.getCmp('grid'), items = grid.store.data.items, c = Ext.getCmp('sf_code').value, bool = true;;
  614. Ext.Array.each(items, function(item){
  615. if(!Ext.isEmpty(item.data['sd_prodcode'])){
  616. item.set('sd_code', c);
  617. item.set('sd_sourceqty', Number(item.data['sd_qty']));
  618. if(!Ext.isEmpty(item.data['sd_needdate'])){
  619. if (Ext.Date.format(item.data['sd_needdate'], 'Y-m-d') < Ext.Date.format(new Date(), 'Y-m-d')) {
  620. bool = false;
  621. showError('明细表第' + item.data['sd_detno'] + '行的出货日期小于当前日期');
  622. return;
  623. }
  624. }
  625. if(!Ext.isEmpty(item.data['sd_enddate'])){
  626. if (Ext.Date.format(item.data['sd_enddate'], 'Y-m-d') < Ext.Date.format(new Date(), 'Y-m-d')) {
  627. bool = false;
  628. showError('明细表第' + item.data['sd_detno'] + '行的截止日期小于当前日期');
  629. return;
  630. } else if (item.data['sd_enddate'] < item.data['sd_startdate']) {
  631. bool = false;
  632. showError('明细表第' + item.data['sd_detno'] + '行的截止日期小于起始日期');
  633. return;
  634. }
  635. }
  636. }
  637. });
  638. if(bool)
  639. //更新
  640. this.FormUtil.onUpdate(this);
  641. },
  642. getLeadCode: function(type) {
  643. var result = null;
  644. Ext.Ajax.request({
  645. url : basePath + 'common/getFieldData.action',
  646. async: false,
  647. params: {
  648. caller: 'SaleForecastKind',
  649. field: 'sf_excode',
  650. condition: 'sf_name=\'' + type + '\''
  651. },
  652. method : 'post',
  653. callback : function(opt, s, res){
  654. var r = new Ext.decode(res.responseText);
  655. if(r.exceptionInfo){
  656. showError(r.exceptionInfo);return;
  657. } else if(r.success){
  658. result = r.data;
  659. }
  660. }
  661. });
  662. return result;
  663. },
  664. /**
  665. *销售预测单拆分
  666. * */
  667. SaleSplit:function(record){
  668. var me=this,originaldetno=Number(record.data.sd_detno);
  669. var sfid=record.data.sd_sfid;
  670. var sdid=record.data.sd_id;
  671. Ext.create('Ext.window.Window',{
  672. width:850,
  673. height:'80%',
  674. iconCls:'x-grid-icon-partition',
  675. title:'<h1>销售预测单拆分</h1>',
  676. id:'win',
  677. items:[{
  678. xtype:'form',
  679. layout:'column',
  680. region:'north',
  681. frame:true,
  682. defaults:{
  683. xtype:'textfield',
  684. columnWidth:0.5,
  685. readOnly:true,
  686. fieldStyle:'background:#f0f0f0;border: 0px solid #8B8970;color:blue;'
  687. },
  688. items:[{
  689. fieldLabel:'行号',
  690. value:record.data.sd_detno,
  691. id:'sfdetno'
  692. },{
  693. fieldLabel:'产品编号' ,
  694. value:record.data.sd_prodcode
  695. },{
  696. fieldLabel:'产品名称',
  697. value:record.data.pr_detail
  698. },{
  699. fieldLabel:'公司型号',
  700. value:record.data.sd_companytype
  701. },{
  702. fieldLabel:'原序号' ,
  703. value:record.data.sd_detno
  704. },{
  705. fieldLabel:'原数量',
  706. value:record.data.sd_qty,
  707. id:'sdqty'
  708. }],
  709. buttonAlign:'center',
  710. buttons:[{
  711. xtype:'button',
  712. columnWidth:0.12,
  713. text:'保存',
  714. width:60,
  715. iconCls: 'x-button-icon-save',
  716. margin:'0 0 0 30',
  717. handler:function(btn){
  718. var store=Ext.getCmp('smallgrid').getStore();
  719. var count=0;
  720. var jsonData=new Array();
  721. var dd;
  722. var remainqty;
  723. Ext.Array.each(store.data.items,function(item){
  724. if(item.data.sd_qty!=0&&item.data.sd_needdate!=null&&item.data.sd_qty>0){
  725. if(item.dirty){
  726. dd=new Object();
  727. //说明是新增批次
  728. if(item.data.sd_needdate)
  729. dd['sd_needdate']=Ext.Date.format(item.data.sd_needdate, 'Y-m-d');
  730. if(item.data.sd_enddate)
  731. dd['sd_enddate']=Ext.Date.format(item.data.sd_enddate, 'Y-m-d');
  732. dd['sd_qty']=item.data.sd_qty;
  733. dd['sd_id']=item.data.sd_id;
  734. dd['sd_detno']=item.data.sd_detno;
  735. jsonData.push(Ext.JSON.encode(dd));
  736. if(item.data.sd_enddate){
  737. if(Ext.Date.format(item.data.sd_enddate, 'Y-m-d') <Ext.Date.format(new Date(), 'Y-m-d') ){
  738. showError('截止日期必须大于等于系统当前日期!') ;
  739. return;
  740. }
  741. }
  742. if(item.data.sd_id!=0&&item.data.sd_id!=null&&item.data.sd_id>0){
  743. remainqty=item.data.sd_qty;
  744. }
  745. }
  746. count+=Number(item.data.sd_qty);
  747. }
  748. });
  749. var assqty=Ext.getCmp('sdqty').value;
  750. if(count!=assqty){
  751. showError('分拆数量必须等于原数量!') ;
  752. return;
  753. }else{
  754. var r=new Object();
  755. r['sd_id']=record.data.sd_id;
  756. r['sd_sfid']=record.data.sd_sfid;
  757. r['sd_detno']=record.data.sd_detno;
  758. if(record.data.sd_enddate)
  759. r['sd_enddate']=Ext.Date.format(record.data.sd_enddate,'Y-m-d');
  760. if(record.data.sd_needdate)
  761. r['sd_needdate']=Ext.Date.format(record.data.sd_needdate,'Y-m-d');
  762. var params=new Object();
  763. params.formdata = unescape(Ext.JSON.encode(r).replace(/\\/g,"%"));
  764. params.data = unescape(jsonData.toString().replace(/\\/g,"%"));
  765. Ext.Ajax.request({
  766. url : basePath +'scm/sale/splitSaleForecast.action',
  767. params : params,
  768. waitMsg:'拆分中...',
  769. method : 'post',
  770. callback : function(options,success,response){
  771. var localJson = new Ext.decode(response.responseText);
  772. if(localJson.success){
  773. saveSuccess(function(){
  774. Ext.getCmp('sdqty').setValue(remainqty);
  775. //add成功后刷新页面进入可编辑的页面
  776. me.loadSplitData(originaldetno,sfid,record);
  777. });
  778. } else if(localJson.exceptionInfo){
  779. var str = localJson.exceptionInfo;
  780. if(str.trim().substr(0, 12) == 'AFTERSUCCESS'){//特殊情况:操作成功,但是出现警告,允许刷新页面
  781. str = str.replace('AFTERSUCCESS', '');
  782. saveSuccess(function(){
  783. //add成功后刷新页面进入可编辑的页面
  784. me.loadSplitData(originaldetno,sfid,record);
  785. });
  786. showError(str);
  787. } else {
  788. showError(str);
  789. return;
  790. }
  791. } else{
  792. saveFailure();
  793. }
  794. }
  795. });
  796. }
  797. }
  798. },{
  799. xtype:'button',
  800. columnWidth:0.1,
  801. text:'关闭',
  802. width:60,
  803. iconCls: 'x-button-icon-close',
  804. margin:'0 0 0 10',
  805. handler:function(btn){
  806. Ext.getCmp('win').close();
  807. }
  808. }]
  809. },{
  810. xtype:'gridpanel',
  811. region:'south',
  812. id:'smallgrid',
  813. layout:'fit',
  814. height:'80%',
  815. columnLines:true,
  816. store:Ext.create('Ext.data.Store',{
  817. fields:[{name:'sd_needdate',type:'date'},{name:'sd_qty',type:'int'},{name:'sd_clashsaleqty',type:'int'},{name:'sd_yqty',type:'int'},{name:'sd_id',type:'int'},{name:'sd_enddate',type:'date'}],
  818. data:[]
  819. }),
  820. plugins: [Ext.create('Ext.grid.plugin.CellEditing', {
  821. clicksToEdit: 1,
  822. listeners:{
  823. 'edit':function(editor,e,Opts){
  824. var record=e.record;
  825. var version=record.data.ma_version;
  826. if(version){
  827. e.record.reject();
  828. Ext.Msg.alert('提示','不能修改已拆分明细!');
  829. }
  830. }
  831. }
  832. })],
  833. tbar: [{
  834. tooltip: '添加批次',
  835. iconCls: 'x-button-icon-add',
  836. width:25,
  837. handler : function() {
  838. var store = Ext.getCmp('smallgrid').getStore();
  839. var r = new Object();
  840. r.sd_needdate=record.get('sd_needdate');
  841. r.sd_enddate=record.get('sd_enddate');
  842. r.sd_qty=0;
  843. r.sd_id=0;
  844. r.sd_detno=store.getCount()+1;
  845. store.insert(store.getCount(), r);
  846. }
  847. }, {
  848. tooltip: '删除批次',
  849. width:25,
  850. itemId: 'delete',
  851. iconCls: 'x-button-icon-delete',
  852. handler: function(btn) {
  853. var sm = Ext.getCmp('smallgrid').getSelectionModel();
  854. var record=sm.getSelection();
  855. var sd_id=record[0].data.sd_id;
  856. if(sd_id&&sd_id!=0){
  857. Ext.Msg.alert('提示','不能删除已拆批次或原始行号!');
  858. return;
  859. }
  860. var store=Ext.getCmp('smallgrid').getStore();
  861. store.remove(record);
  862. if (store.getCount() > 0) {
  863. sm.select(0);
  864. }
  865. },
  866. disabled: true
  867. }],
  868. listeners:{
  869. itemmousedown:function(selmodel, record){
  870. selmodel.ownerCt.down('#delete').setDisabled(false);
  871. },
  872. afterrender : function(grid) {
  873. me.BaseUtil.getSetting('SaleForecast', 'sd_needdate', function(bool) {
  874. if(bool) {
  875. grid.down('gridcolumn[dataIndex=sd_needdate]').hide();
  876. }
  877. });
  878. me.BaseUtil.getSetting('SaleForecast', 'sd_enddate', function(bool) {
  879. if(bool) {
  880. grid.down('gridcolumn[dataIndex=sd_enddate]').hide();
  881. }
  882. });
  883. }
  884. },
  885. columns:[{
  886. dataIndex:'sd_detno',
  887. header:'序号',
  888. format:'0',
  889. xtype:'numbercolumn'
  890. },{
  891. dataIndex:'sd_needdate',
  892. header:'出货日期',
  893. xtype:'datecolumn',
  894. width:120,
  895. editable:true,
  896. renderer:function(val,meta,record){
  897. if(record.data.ma_version){
  898. meta.tdCls = "x-grid-cell-renderer-cl";
  899. }
  900. if(val)
  901. return Ext.Date.format(val, 'Y-m-d');
  902. else return null;
  903. },
  904. editor:{
  905. xtype: 'datefield',
  906. format:'Y-m-d'
  907. }
  908. },{
  909. dataIndex:'sd_enddate',
  910. header:'截止日期',
  911. xtype:'datecolumn',
  912. width:120,
  913. editable:true,
  914. renderer:function(val,meta,record){
  915. if(record.data.ma_version){
  916. meta.tdCls = "x-grid-cell-renderer-cl";
  917. }
  918. if(val)
  919. return Ext.Date.format(val, 'Y-m-d');
  920. else return null;
  921. },
  922. editor:{
  923. xtype: 'datefield',
  924. format:'Y-m-d'
  925. }
  926. },{
  927. dataIndex:'sd_qty',
  928. header:'数量',
  929. width:120,
  930. xtype:'numbercolumn',
  931. editable:true,
  932. renderer:function(val,meta,record){
  933. if(record.data.ma_version){
  934. meta.tdCls = "x-grid-cell-renderer-cl";
  935. }
  936. return val;
  937. },
  938. editor:{
  939. xtype:'numberfield',
  940. format:'0',
  941. hideTrigger: true
  942. }
  943. },{
  944. dataIndex:'sd_yqty',
  945. header:'已转订单数',
  946. xtype:'numbercolumn',
  947. width:100,
  948. editable:false
  949. },{
  950. dataIndex:'sd_id',
  951. header:'sdid',
  952. width:0,
  953. xtype:'numbercolumn',
  954. editable:true,
  955. editor:{
  956. xtype:'numberfield',
  957. format:'0',
  958. hideTrigger: true
  959. }
  960. }]
  961. }]
  962. }).show();
  963. this.loadSplitData(originaldetno,sfid,record);
  964. },
  965. loadSplitData:function(detno,sfid,record){
  966. var grid=Ext.getCmp('smallgrid');
  967. grid.setLoading(true);//loading...
  968. Ext.Ajax.request({//拿到grid的columns
  969. url : basePath + "common/loadNewGridStore.action",
  970. params:{
  971. caller:'SaleForecastSplit',
  972. condition:"sd_detno="+detno+" AND sd_sfid="+sfid+" order by sd_id asc"
  973. },
  974. method : 'post',
  975. callback : function(options,success,response){
  976. grid.setLoading(false);
  977. var res = new Ext.decode(response.responseText);
  978. if(res.exceptionInfo){
  979. showError(res.exceptionInfo);return;
  980. }
  981. var data = res.data;
  982. if(!data || data.length == 0){
  983. grid.store.removeAll();
  984. var o=new Object();
  985. o.sd_detno=detno;
  986. o.sd_needdate=record.data.sd_needdate;
  987. o.sd_enddate=record.data.sd_enddate;
  988. o.sd_qty=record.data.sd_qty;
  989. o.sd_yqty=record.data.sd_yqty;
  990. o.sd_clashsaleqty=record.data.sd_clashsaleqty;
  991. o.sd_id=record.data.sd_id;
  992. data.push(o);
  993. }
  994. grid.store.loadData(data);
  995. }
  996. });
  997. }
  998. });