GridPanel.js 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527
  1. Ext.define('trade.view.make-intellpurc-Gridpanel', {
  2. extend: 'Ext.grid.Panel',
  3. xtype: 'purchase-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_source',
  192. width: 400
  193. }, {
  194. text: '最小包装量',
  195. dataIndex: 'mr_mpq',
  196. xtype: 'numbercolumn',
  197. width: 100,
  198. renderer: function (v, m, r) {
  199. return saas.util.BaseUtil.numberFormat(v, 6, true);
  200. },
  201. }, {
  202. text: '总库存',
  203. dataIndex: 'mr_stock',
  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_app',
  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_purc',
  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_saleqty',
  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_turnstatus',
  236. width: 100
  237. },],
  238. initComponent: function () {
  239. var me = this;
  240. var fields = me.columns.map(column => column.dataIndex);
  241. me.store = Ext.create('Ext.data.Store', {
  242. fields: fields,
  243. autoLoad: true,
  244. data: [],
  245. listeners: {
  246. beforeload: function (store, op) {
  247. var gridpanel=me;
  248. var params ={};
  249. params['mergePurc'] = 0;
  250. params['mergeDays'] = 0;
  251. params['safetystock'] = 0;
  252. params['mpq'] = 0;
  253. params['auto'] = 1;
  254. view.setLoading(true);
  255. saas.util.BaseUtil.request({
  256. url: '/api/purchase/makeIntell/list',
  257. method: 'POST',
  258. params: JSON.stringify(params)
  259. })
  260. .then(function(localJson) {
  261. view.setLoading(false);
  262. if(localJson.success){
  263. gridpanel.getStore().loadData(localJson.data.list);
  264. gridpanel.ownerCt.onQuery();
  265. }
  266. })
  267. .catch(function(e) {
  268. view.setLoading(false);
  269. saas.util.BaseUtil.showErrorToast('计算失败: ' + e.message);
  270. });
  271. }
  272. }
  273. });
  274. Ext.apply(me, {
  275. dockedItems: [{
  276. xtype: 'toolbar',
  277. dock: 'top',
  278. items: [{
  279. text: '计算需求',
  280. handler: function (b) {
  281. Ext.create({
  282. xtype: 'purchase-intellpurc-calsetting',
  283. autoShow: true,
  284. gridpanel:b.ownerCt.ownerCt,
  285. ownerBtn:b
  286. });
  287. },
  288. }, {
  289. xtype: 'checkbox',
  290. name: 'thisqty',
  291. columnWidth: 0.3,
  292. margin: '0 0 0 5',
  293. isFilter:true,
  294. boxLabel:'只显示[建议采购量]大于0的物料',
  295. checked:true,
  296. getFilter:function(){
  297. var me=this;
  298. let value=me.value,filter= {};
  299. if (value) {//已勾选
  300. filter= {
  301. filterFn: function (rec) {
  302. return rec.get('thisqty_filter') > 0;
  303. },
  304. anyMatch: true,
  305. caseSensitive: false
  306. };
  307. }
  308. return filter;
  309. },
  310. listeners: {
  311. change: function () {
  312. this.ownerCt.ownerCt.ownerCt.onQuery();
  313. }
  314. }
  315. }, {
  316. xtype: 'checkbox',
  317. name: 'turned',
  318. boxLabel:'只显示未下达的物料',
  319. checked:true,
  320. isFilter:true,
  321. margin: '0 0 0 5',
  322. columnWidth: 0.3,
  323. getFilter:function(){
  324. var me=this;
  325. let value=me.value;
  326. filter= {};
  327. if (value) {//已勾选
  328. filter= {
  329. filterFn: function (rec) {
  330. return rec.get('mr_turnstatus')=='未下达';
  331. },
  332. anyMatch: true,
  333. caseSensitive: false
  334. };
  335. }
  336. return filter;
  337. },
  338. listeners: {
  339. change: function () {
  340. this.ownerCt.ownerCt.ownerCt.onQuery();
  341. }
  342. }
  343. },{
  344. xtype: 'radiogroup',
  345. name: 'redio_vend',
  346. width: 330,
  347. labelWidth :110,
  348. isFilter:true,
  349. margin: '0 0 0 10',
  350. fieldLabel: "供应商获取状态",
  351. cls:'vendRadiogroup',
  352. simpleValue: true,
  353. items: [
  354. { boxLabel: '全部', inputValue: 'ALL' , checked: true },
  355. { boxLabel: '已获取', inputValue: 'HASVEND'},
  356. { boxLabel: '未获取', inputValue: 'NONE'}
  357. ],
  358. getFilter:function(){
  359. var me=this;
  360. let value=me.lastValue, filter= {};
  361. if (value == 'HASVEND') {//已获取
  362. filter= {
  363. filterFn: function (rec) {
  364. return rec.get('mr_vendid') > 0;
  365. },
  366. anyMatch: true,
  367. caseSensitive: false
  368. };
  369. }else if (value == 'NONE') {//未获取
  370. filter= {
  371. filterFn: function (rec) {
  372. return (!rec.get('mr_vendid') || rec.get('mr_vendid') == 0);
  373. },
  374. anyMatch: true,
  375. caseSensitive: false
  376. };
  377. }
  378. return filter;
  379. },
  380. listeners: {
  381. change: function (r, newValue) {
  382. this.ownerCt.ownerCt.ownerCt.onQuery();
  383. }
  384. }
  385. },'->',{
  386. iconCls: 'x-fa fa-question-circle',
  387. reference: 'qMark ',
  388. name:'qMark',
  389. ui: 'header',
  390. tooltip: {
  391. text: '<p>毛需求:销售订单、备货单、工单用料及安全库存的实际需求数量</p>'+
  392. '<p>净需求:毛需求-库存可用-请购可用-在途可用-在制可用计算出来的实际欠缺数量</p>'+
  393. '<p>建议采购量:在净需求的基础上考虑最小包装量及产品资料的单位对应数量小数位计算出来的建议下采购单数量</p>',
  394. anchor: 'top',
  395. autoHide:true,
  396. width:370,
  397. dismissDelay:7200000
  398. }
  399. }, {
  400. text: '生成采购订单',
  401. cls: 'x-formpanel-btn-blue',
  402. handler: function (btn) {
  403. me.turnPurc(btn);
  404. }
  405. }, {
  406. text: '导出',
  407. handler: me.onExport
  408. }]
  409. }]
  410. });
  411. me.callParent(arguments);
  412. },
  413. calu:function(params,win,ownerBtn){
  414. var gridpanel =this;
  415. gridpanel.setLoading(true);
  416. saas.util.BaseUtil.request({
  417. url: '/api/purchase/makeIntell/list',
  418. method: 'POST',
  419. params: JSON.stringify(params)
  420. })
  421. .then(function(localJson) {
  422. gridpanel.setLoading(false);
  423. if(localJson.success){
  424. gridpanel.getStore().loadData(localJson.data.list);
  425. gridpanel.ownerCt.onQuery();
  426. if(win){
  427. win.close();
  428. }
  429. //if(ownerBtn) ownerBtn.ownerCt.down('[name="tipWord"]').setHidden(false);
  430. // ownerBtn.ownerCt.down('[name="qMark"]').setHidden(false);
  431. }
  432. })
  433. .catch(function(e) {
  434. view.setLoading(false);
  435. saas.util.BaseUtil.showErrorToast('计算失败: ' + e.message);
  436. });
  437. },
  438. turnPurc: function (btn) {
  439. var me = this;
  440. var data = me.getGridSelected();
  441. if (data && data.length > 0) {
  442. me.setLoading(true);
  443. var params = JSON.stringify({ baseDTOs: data });
  444. saas.util.BaseUtil.request({
  445. url: '/api/purchase/makeIntell/turnPurc',
  446. params: params,
  447. method: 'POST',
  448. async: false
  449. })
  450. .then(function (res) {
  451. if (res.success) {
  452. me.setLoading(false);
  453. me.selModel.deselectAll();
  454. saas.util.BaseUtil.showSuccessToast('转单成功');
  455. var params ={};
  456. params['mergePurc'] = 0;
  457. params['mergeDays'] = 0;
  458. params['safetystock'] = 0;
  459. params['mpq'] = 0;
  460. params['auto'] = 1;
  461. me.calu(params,'',btn);
  462. var purcs=res.data;
  463. purcs.forEach(function(purc) {
  464. let intValue = purc.id, codeValue = purc.code, name = '采购订单';
  465. saas.util.BaseUtil.openTab('purchase-purchase-formpanel', name + "(" + codeValue + ")", codeValue + intValue, {
  466. initId: intValue
  467. });
  468. });
  469. }
  470. })
  471. .catch(function (res) {
  472. me.setLoading(false);
  473. saas.util.BaseUtil.showErrorToast(('操作失败: ') + res.message);
  474. if(res.code=='71020'){
  475. var params ={};
  476. params['mergePurc'] = 0;
  477. params['mergeDays'] = 0;
  478. params['safetystock'] = 0;
  479. params['mpq'] = 0;
  480. params['auto'] = 1;
  481. me.calu(params,'',btn);
  482. }
  483. });
  484. } else {
  485. saas.util.BaseUtil.showErrorToast('请勾选至少一条明细。');
  486. }
  487. },
  488. getGridSelected: function () {
  489. var me = this,
  490. items = me.selModel.getSelection(),
  491. data = new Array();
  492. var ids = [];
  493. Ext.each(items, function (item, index) {
  494. var o = new Object();
  495. if (!Ext.isEmpty(item.data[me.idField])) {
  496. o['id'] = item.data[me.idField];
  497. }
  498. if (me.turnQtyField) {
  499. o['qty'] = item.data[me.turnQtyField];
  500. }
  501. o['vendid'] = item.data['mr_vendid'] ? item.data['mr_vendid']:0;
  502. o['price'] = item.data['mr_price'];
  503. if (!Ext.Array.contains(ids, o['id'])) {
  504. ids.push(o['id']);
  505. data.push(o);
  506. }
  507. });
  508. return data;
  509. },
  510. onExport: function (me) {
  511. var grid = me.ownerCt.ownerCt;
  512. var cfg={
  513. type: 'xlsx',
  514. title:'智能采购',
  515. fileName: '智能采购'+ Ext.Date.format(new Date(),'Y-m-d_H-i-s') +'.xlsx'
  516. };
  517. grid.setLoading(true);
  518. grid.saveDocumentAs(cfg);
  519. Ext.defer(function () {
  520. grid.setLoading(false);
  521. }, 5000);
  522. }
  523. });