SaleForecast.js 35 KB

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