GridPanel.js 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543
  1. Ext.define('saas.view.make-intellpurc-Gridpanel', {
  2. extend: 'Ext.grid.Panel',
  3. xtype: 'make-intellpurc-gridpanel',
  4. requires: [
  5. 'Ext.grid.plugin.Exporter'
  6. ],
  7. cls: 'core-base-gridpanel',
  8. plugins: [{
  9. ptype: 'gridexporter',
  10. }, {
  11. ptype: 'menuclipboard'
  12. }, {
  13. ptype: 'cellediting',
  14. clicksToEdit: 1
  15. }],
  16. lastSelectedRecord:[],
  17. layout: 'fit',
  18. //基础属性
  19. border: 1,
  20. anchor: '100% 70%',
  21. loadMask: true,
  22. showIndex: true,
  23. columnWidth: 1.0,
  24. rootProperty: 'data.list',
  25. selModel: {
  26. checkOnly: true,
  27. type: 'checkboxmodel'
  28. },
  29. idField: 'id',
  30. turnQtyField: 'mr_thisqty',
  31. columns: [{
  32. text: '建议采购量',
  33. dataIndex: 'mr_thisqty',
  34. width: 110,
  35. xtype: 'widgetcolumn',
  36. widget: {
  37. xtype: "numberfield",
  38. cls:'widget-number',
  39. bind: '{record.mr_thisqty}',
  40. decimalPrecision: 8,
  41. minValue: 0
  42. }
  43. }/*,{
  44. text: '建议采购量',
  45. dataIndex: 'thisqty_filter',
  46. width: 0,
  47. }*/, {
  48. text: '采购价',
  49. dataIndex: 'mr_price',
  50. width: 100,
  51. //xtype: 'numbercolumn',
  52. renderer: function (v, m, r) {
  53. return saas.util.BaseUtil.numberFormat(v, 6, true);
  54. },
  55. xtype: 'widgetcolumn',
  56. widget: {
  57. xtype: "numberfield",
  58. cls:'widget-number',
  59. bind: '{record.mr_price}',
  60. decimalPrecision: 8,
  61. minValue: 0
  62. }
  63. /* editor: {
  64. xtype: "numberfield",
  65. decimalPrecision: 6,
  66. minValue: 0
  67. }*/
  68. }, {
  69. text: '供应商id',
  70. dataIndex: 'mr_vendid',
  71. hidden: true
  72. }, {
  73. text: '供应商编号',
  74. dataIndex: 'mr_vendcode',
  75. hidden: true
  76. }, {
  77. text: '供应商',
  78. dataIndex: 'mr_vendname',
  79. width: 150,
  80. xtype: 'widgetcolumn',
  81. widget: {
  82. displayField: "display",
  83. cls:'widget-number',
  84. bind: '{record.mr_vendname}',
  85. editable: true,
  86. format: "",
  87. hideTrigger: false,
  88. maxLength: 100.0,
  89. minValue: null,
  90. positiveNum: false,
  91. queryMode: "local",
  92. store: null,
  93. valueField: "value",
  94. xtype: "vendorDbfindTrigger",
  95. name:'mr_vendname',
  96. dbfinds:[{
  97. from:'id',to:'mr_vendid',ignore:true
  98. },{
  99. from:'ve_code',to:'mr_vendcode'
  100. },{
  101. from:'ve_name',to:'mr_vendname'
  102. }]
  103. }
  104. /*editor: {
  105. displayField: "display",
  106. editable: true,
  107. format: "",
  108. hideTrigger: false,
  109. maxLength: 100.0,
  110. minValue: null,
  111. positiveNum: false,
  112. queryMode: "local",
  113. store: null,
  114. valueField: "value",
  115. xtype: "vendorDbfindTrigger"
  116. }*/
  117. }, {
  118. text: '净需求',
  119. dataIndex: 'mr_netqty',
  120. width: 80,
  121. xtype: 'numbercolumn',
  122. renderer: function (v, m, r) {
  123. return saas.util.BaseUtil.numberFormat(v, 6, true);
  124. }
  125. }, {
  126. text: '物料id',
  127. dataIndex: 'mr_prodid',
  128. hidden: true
  129. }, {
  130. text: '物料编号',
  131. dataIndex: 'mr_prodcode',
  132. width: 150
  133. }, {
  134. text: '物料名称',
  135. dataIndex: 'mr_prdetail',
  136. width: 150
  137. }, {
  138. text: '型号',
  139. dataIndex: 'pr_orispeccode',
  140. width: 150
  141. }, {
  142. text: '厂家/品牌',
  143. dataIndex: 'pr_brand',
  144. width: 90
  145. }, {
  146. text: '规格',
  147. dataIndex: 'mr_spec',
  148. width: 150
  149. }, {
  150. text: '单位',
  151. dataIndex: 'mr_unit',
  152. width: 60
  153. }, {
  154. text: '毛需求数',
  155. dataIndex: 'mr_needqty',
  156. xtype: 'numbercolumn',
  157. width: 85,
  158. renderer: function (v, m, r) {
  159. return saas.util.BaseUtil.numberFormat(v, 6, true);
  160. }
  161. }, {
  162. text: '需求日期',
  163. dataIndex: 'mr_needdate',
  164. width: 110
  165. }, {
  166. text: '库存可用',
  167. dataIndex: 'mr_stock_dist',
  168. xtype: 'numbercolumn',
  169. width: 85,
  170. renderer: function (v, m, r) {
  171. return saas.util.BaseUtil.numberFormat(v, 6, true);
  172. }
  173. }, {
  174. text: '请购可用',
  175. dataIndex: 'mr_app_dist',
  176. xtype: 'numbercolumn',
  177. width: 85,
  178. renderer: function (v, m, r) {
  179. return saas.util.BaseUtil.numberFormat(v, 6, true);
  180. }
  181. }, {
  182. text: '在途可用',
  183. dataIndex: 'mr_purc_dist',
  184. xtype: 'numbercolumn',
  185. width: 85,
  186. renderer: function (v, m, r) {
  187. return saas.util.BaseUtil.numberFormat(v, 6, true);
  188. }
  189. }, {
  190. text: '在制可用',
  191. dataIndex: 'mr_make_dist',
  192. xtype: 'numbercolumn',
  193. width: 85,
  194. renderer: function (v, m, r) {
  195. return saas.util.BaseUtil.numberFormat(v, 6, true);
  196. }
  197. }, {
  198. text: '需求来源',
  199. dataIndex: 'mr_source',
  200. width: 400
  201. }, {
  202. text: '最小包装量',
  203. dataIndex: 'mr_mpq',
  204. xtype: 'numbercolumn',
  205. width: 100,
  206. renderer: function (v, m, r) {
  207. return saas.util.BaseUtil.numberFormat(v, 6, true);
  208. },
  209. }, {
  210. text: '总库存',
  211. dataIndex: 'mr_stock',
  212. xtype: 'numbercolumn',
  213. width: 100,
  214. renderer: function (v, m, r) {
  215. return saas.util.BaseUtil.numberFormat(v, 6, true);
  216. },
  217. }, {
  218. text: '请购数',
  219. dataIndex: 'mr_app',
  220. xtype: 'numbercolumn',
  221. width: 100,
  222. renderer: function (v, m, r) {
  223. return saas.util.BaseUtil.numberFormat(v, 6, true);
  224. },
  225. }, {
  226. text: '采购未交',
  227. dataIndex: 'mr_purc',
  228. xtype: 'numbercolumn',
  229. width: 100,
  230. renderer: function (v, m, r) {
  231. return saas.util.BaseUtil.numberFormat(v, 6, true);
  232. },
  233. }, {
  234. text: '订单未发货',
  235. dataIndex: 'mr_saleqty',
  236. xtype: 'numbercolumn',
  237. width: 100,
  238. renderer: function (v, m, r) {
  239. return saas.util.BaseUtil.numberFormat(v, 6, true);
  240. },
  241. },{
  242. text: '工单未领数',
  243. dataIndex: 'mr_maqty',
  244. xtype: 'numbercolumn',
  245. width: 100,
  246. renderer: function (v, m, r) {
  247. return saas.util.BaseUtil.numberFormat(v, 6, true);
  248. },
  249. },{
  250. text: '下达状态',
  251. dataIndex: 'mr_turnstatus',
  252. width: 100
  253. },],
  254. initComponent: function () {
  255. var me = this;
  256. var fields = me.columns.map(column => column.dataIndex);
  257. me.store = Ext.create('Ext.data.Store', {
  258. fields: fields,
  259. autoLoad: true,
  260. data: [],
  261. listeners: {
  262. beforeload: function (store, op) {
  263. var gridpanel=me;
  264. var params ={};
  265. params['mergePurc'] = 0;
  266. params['mergeDays'] = 0;
  267. params['safetystock'] = 0;
  268. params['mpq'] = 0;
  269. params['auto'] = 1;
  270. view.setLoading(true);
  271. saas.util.BaseUtil.request({
  272. url: '/api/purchase/makeIntell/list',
  273. method: 'POST',
  274. params: JSON.stringify(params)
  275. })
  276. .then(function(localJson) {
  277. view.setLoading(false);
  278. if(localJson.success){
  279. gridpanel.getStore().loadData(localJson.data.list);
  280. gridpanel.ownerCt.onQuery();
  281. }
  282. })
  283. .catch(function(e) {
  284. view.setLoading(false);
  285. saas.util.BaseUtil.showErrorToast('计算失败: ' + e.message);
  286. });
  287. }
  288. }
  289. });
  290. Ext.apply(me, {
  291. dockedItems: [{
  292. xtype: 'toolbar',
  293. dock: 'top',
  294. items: [{
  295. text: '计算需求',
  296. handler: function (b) {
  297. Ext.create({
  298. xtype: 'make-intellpurc-calsetting',
  299. autoShow: true,
  300. gridpanel:b.ownerCt.ownerCt,
  301. ownerBtn:b
  302. });
  303. },
  304. }, {
  305. xtype: 'checkbox',
  306. name: 'thisqty',
  307. columnWidth: 0.3,
  308. margin: '0 0 0 5',
  309. isFilter:true,
  310. boxLabel:'只显示[建议采购量]大于0的物料',
  311. checked:true,
  312. getFilter:function(){
  313. var me=this;
  314. let value=me.value,filter= {};
  315. if (value) {//已勾选
  316. filter= {
  317. filterFn: function (rec) {
  318. return rec.get('thisqty_filter') > 0;
  319. },
  320. anyMatch: true,
  321. caseSensitive: false
  322. };
  323. }
  324. return filter;
  325. },
  326. listeners: {
  327. change: function () {
  328. this.ownerCt.ownerCt.ownerCt.onQuery();
  329. }
  330. }
  331. }, {
  332. xtype: 'checkbox',
  333. name: 'turned',
  334. boxLabel:'只显示未下达的物料',
  335. checked:true,
  336. isFilter:true,
  337. margin: '0 0 0 5',
  338. columnWidth: 0.3,
  339. getFilter:function(){
  340. var me=this;
  341. let value=me.value;
  342. filter= {};
  343. if (value) {//已勾选
  344. filter= {
  345. filterFn: function (rec) {
  346. return rec.get('mr_turnstatus')=='未下达';
  347. },
  348. anyMatch: true,
  349. caseSensitive: false
  350. };
  351. }
  352. return filter;
  353. },
  354. listeners: {
  355. change: function () {
  356. this.ownerCt.ownerCt.ownerCt.onQuery();
  357. }
  358. }
  359. },{
  360. xtype: 'radiogroup',
  361. name: 'redio_vend',
  362. width: 330,
  363. labelWidth :110,
  364. isFilter:true,
  365. margin: '0 0 0 10',
  366. fieldLabel: "供应商获取状态",
  367. cls:'vendRadiogroup',
  368. simpleValue: true,
  369. items: [
  370. { boxLabel: '全部', inputValue: 'ALL' , checked: true },
  371. { boxLabel: '已获取', inputValue: 'HASVEND'},
  372. { boxLabel: '未获取', inputValue: 'NONE'}
  373. ],
  374. getFilter:function(){
  375. var me=this;
  376. let value=me.lastValue, filter= {};
  377. if (value == 'HASVEND') {//已获取
  378. filter= {
  379. filterFn: function (rec) {
  380. return rec.get('mr_vendid') > 0;
  381. },
  382. anyMatch: true,
  383. caseSensitive: false
  384. };
  385. }else if (value == 'NONE') {//未获取
  386. filter= {
  387. filterFn: function (rec) {
  388. return (!rec.get('mr_vendid') || rec.get('mr_vendid') == 0);
  389. },
  390. anyMatch: true,
  391. caseSensitive: false
  392. };
  393. }
  394. return filter;
  395. },
  396. listeners: {
  397. change: function (r, newValue) {
  398. this.ownerCt.ownerCt.ownerCt.onQuery();
  399. }
  400. }
  401. },'->', {
  402. iconCls: 'x-fa fa-question-circle',
  403. reference: 'qMark ',
  404. name:'qMark',
  405. ui: 'header',
  406. tooltip: {
  407. text: '<p>毛需求:销售订单、备货单、工单用料及安全库存的实际需求数量</p>'+
  408. '<p>净需求:毛需求-库存可用-请购可用-在途可用-在制可用计算出来的实际欠缺数量</p>'+
  409. '<p>建议采购量:在净需求的基础上考虑最小包装量及产品资料的单位对应数量小数位计算出来的建议下采购单数量</p>',
  410. anchor: 'top',
  411. autoHide:true,
  412. width:370,
  413. dismissDelay:7200000
  414. }
  415. }, {
  416. text: '生成采购订单',
  417. cls: 'x-formpanel-btn-blue',
  418. handler: function (btn) {
  419. me.turnPurc(btn);
  420. }
  421. }, {
  422. text: '导出',
  423. handler: me.onExport
  424. }]
  425. }]
  426. });
  427. me.callParent(arguments);
  428. },
  429. calu:function(params,win,ownerBtn){
  430. var gridpanel =this;
  431. gridpanel.setLoading(true);
  432. saas.util.BaseUtil.request({
  433. url: '/api/purchase/makeIntell/list',
  434. method: 'POST',
  435. params: JSON.stringify(params)
  436. })
  437. .then(function(localJson) {
  438. gridpanel.setLoading(false);
  439. if(localJson.success){
  440. gridpanel.getStore().loadData(localJson.data.list);
  441. gridpanel.ownerCt.onQuery();
  442. if(win){
  443. win.close();
  444. }
  445. //if(ownerBtn) ownerBtn.ownerCt.down('[name="tipWord"]').setHidden(false);
  446. // ownerBtn.ownerCt.down('[name="qMark"]').setHidden(false);
  447. }
  448. })
  449. .catch(function(e) {
  450. view.setLoading(false);
  451. saas.util.BaseUtil.showErrorToast('计算失败: ' + e.message);
  452. });
  453. },
  454. turnPurc: function (btn) {
  455. var me = this;
  456. var data = me.getGridSelected();
  457. if (data && data.length > 0) {
  458. me.setLoading(true);
  459. var params = JSON.stringify({ baseDTOs: data });
  460. saas.util.BaseUtil.request({
  461. url: '/api/purchase/makeIntell/turnPurc',
  462. params: params,
  463. method: 'POST',
  464. async: false
  465. })
  466. .then(function (res) {
  467. if (res.success) {
  468. me.setLoading(false);
  469. me.selModel.deselectAll();
  470. saas.util.BaseUtil.showSuccessToast('转单成功');
  471. var params ={};
  472. params['mergePurc'] = 0;
  473. params['mergeDays'] = 0;
  474. params['safetystock'] = 0;
  475. params['mpq'] = 0;
  476. params['auto'] = 1;
  477. me.calu(params,'',btn);
  478. var purcs=res.data;
  479. purcs.forEach(function(purc) {
  480. let intValue = purc.id, codeValue = purc.code, name = '采购订单';
  481. saas.util.BaseUtil.openTab('purchase-purchase-formpanel', name + "(" + codeValue + ")", codeValue + intValue, {
  482. initId: intValue
  483. });
  484. });
  485. }
  486. })
  487. .catch(function (res) {
  488. me.setLoading(false);
  489. saas.util.BaseUtil.showErrorToast(('操作失败: ') + res.message);
  490. if(res.code=='71020'){
  491. var params ={};
  492. params['mergePurc'] = 0;
  493. params['mergeDays'] = 0;
  494. params['safetystock'] = 0;
  495. params['mpq'] = 0;
  496. params['auto'] = 1;
  497. me.calu(params,'',btn);
  498. }
  499. });
  500. } else {
  501. saas.util.BaseUtil.showErrorToast('请勾选至少一条明细。');
  502. }
  503. },
  504. getGridSelected: function () {
  505. var me = this,
  506. items = me.selModel.getSelection(),
  507. data = new Array();
  508. var ids = [];
  509. Ext.each(items, function (item, index) {
  510. var o = new Object();
  511. if (!Ext.isEmpty(item.data[me.idField])) {
  512. o['id'] = item.data[me.idField];
  513. }
  514. if (me.turnQtyField) {
  515. o['qty'] = item.data[me.turnQtyField];
  516. }
  517. o['vendid'] = item.data['mr_vendid'] ? item.data['mr_vendid']:0;
  518. o['price'] = item.data['mr_price'];
  519. if (!Ext.Array.contains(ids, o['id'])) {
  520. ids.push(o['id']);
  521. data.push(o);
  522. }
  523. });
  524. return data;
  525. },
  526. onExport: function (me) {
  527. var grid = me.ownerCt.ownerCt;
  528. var cfg={
  529. type: 'xlsx',
  530. title:'智能采购',
  531. fileName: '智能采购'+ Ext.Date.format(new Date(),'Y-m-d_H-i-s') +'.xlsx'
  532. };
  533. grid.setLoading(true);
  534. grid.saveDocumentAs(cfg);
  535. Ext.defer(function () {
  536. grid.setLoading(false);
  537. }, 5000);
  538. }
  539. });