ProjectItemAdjust.vue 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505
  1. <template>
  2. <a-layout class="container">
  3. <Navbar title="调拨单" :is-go-back="true" />
  4. <a-card :bordered="false" class="form-card">
  5. <a-form layout="inline">
  6. <a-form-item label="原项目事件">
  7. <a-select
  8. v-model:value="projectItemId"
  9. :options="projectOptions"
  10. show-search
  11. :filter-option="false"
  12. placeholder="请选择原项目事件"
  13. @search="handleSearchProject"
  14. @change="handleProjectChange"
  15. />
  16. </a-form-item>
  17. <a-button type="primary" @click="addition">提交</a-button>
  18. </a-form>
  19. <a-table
  20. :data-source="pageProjectItemAdjusts"
  21. :columns="columns"
  22. :pagination="pagination"
  23. row-key="inventoryId"
  24. class="data-table"
  25. >
  26. <template #bodyCell="{ column, record }">
  27. <template v-if="column.dataIndex === 'selection'">
  28. <a-checkbox
  29. v-model:checked="record.checked"
  30. @change="handleCheckChange(record)"
  31. />
  32. </template>
  33. <template v-else-if="column.dataIndex === 'quantity'">
  34. <a-input-number
  35. v-model:value="record.quantity"
  36. :min="0"
  37. :max="record.projectItemCanAdjustQuantity"
  38. @change="handleQuantityChange(record)"
  39. />
  40. </template>
  41. <template v-else>
  42. {{ record[column.dataIndex] }}
  43. </template>
  44. </template>
  45. </a-table>
  46. <a-modal
  47. v-model:visible="modal"
  48. title="提交调拨单"
  49. :footer="null"
  50. >
  51. <a-form layout="vertical">
  52. <a-form-item label="目标项目事件">
  53. <a-select
  54. v-model:value="targetProjectItemId"
  55. :options="projectOptions"
  56. show-search
  57. :filter-option="false"
  58. placeholder="请选择目标项目事件"
  59. @search="handleSearchProject"
  60. @change="handleTargetChange"
  61. />
  62. </a-form-item>
  63. <a-table
  64. :data-source="editProjectItemAdjusts"
  65. :columns="editColumns"
  66. row-key="id"
  67. >
  68. <template #bodyCell="{ column, record }">
  69. <template v-if="column.dataIndex === 'selection'">
  70. <a-radio
  71. :checked="projectItemAdjustId === record.id"
  72. @change="handleSelectAdjust(record)"
  73. />
  74. </template>
  75. </template>
  76. </a-table>
  77. <div class="modal-footer">
  78. <a-button @click="cancel">取消</a-button>
  79. <a-button type="primary" @click="picking">确定</a-button>
  80. </div>
  81. </a-form>
  82. </a-modal>
  83. </a-card>
  84. <Loading v-if="loading" />
  85. </a-layout>
  86. </template>
  87. <script>
  88. import Common from '../common/Common.js';
  89. import ProjectItemAdjustResource from '../api/wms/ProjectItemAdjustResource.js';
  90. export default {
  91. components: {
  92. },
  93. data: function () {
  94. return {
  95. columns: [
  96. { title: '选择', dataIndex: 'selection' },
  97. { title: '物料编码', dataIndex: 'inventoryNo' },
  98. { title: '物料名称', dataIndex: 'inventoryName' },
  99. { title: '规格型号', dataIndex: 'inventoryType' },
  100. { title: '物料数量', dataIndex: 'projectItemQuantity' },
  101. { title: '待调拨数量', dataIndex: 'projectItemAdjustQuantity' },
  102. { title: '可调拨数量', dataIndex: 'projectItemCanAdjustQuantity' },
  103. { title: '数量', dataIndex: 'quantity' },
  104. ],
  105. projectItemAdjusts: [],
  106. pageProjectItemAdjusts: [], //每页显示的数据
  107. projectItemId: undefined, //原项目事件
  108. projectItemAdjustId: undefined, //选择的调拨单
  109. targetProjectItemId: undefined, //目标项目事件
  110. pagination: {
  111. total: 0,
  112. per_page: Common.pageSize, // required
  113. current_page: 1, // required
  114. last_page: 0, // required
  115. },
  116. //调拨主单分页情况
  117. pagination2: {
  118. total: 0,
  119. per_page: Common.pageSize, // required
  120. current_page: 1, // required
  121. last_page: 0, // required
  122. },
  123. checked: false,
  124. editProjectItemAdjusts: [], //还在编辑状态下的调拨单
  125. projectItemAdjustNo: undefined, //选择的调拨单的单据号
  126. loading: false,
  127. modal: false,
  128. projectOptions: [], //项目事件下拉框
  129. };
  130. },
  131. mounted: function () {
  132. },
  133. methods: {
  134. /**
  135. * 全选和反选
  136. */
  137. selectAll: function () {
  138. var _self = this;
  139. if (_self.checked) {
  140. for (var i = 0; i < _self.pageProjectItemAdjusts.length; i++) {
  141. _self.pageProjectItemAdjusts[i].checked = true;
  142. }
  143. } else {
  144. for (var j = 0; j < _self.pageProjectItemAdjusts.length; j++) {
  145. _self.pageProjectItemAdjusts[j].checked = false;
  146. }
  147. }
  148. },
  149. /**
  150. * 点击选择调拨单事件
  151. */
  152. setProjectItemAdjust: function (index) {
  153. var _self = this;
  154. _self.projectItemAdjustId = _self.editProjectItemAdjusts[index].id;
  155. _self.projectItemAdjustNo = _self.editProjectItemAdjusts[index].documentNo;
  156. for (var i = 0; i < _self.editProjectItemAdjusts.length; i++) {
  157. if (i == index) {
  158. _self.editProjectItemAdjusts[index].isChecked = true;
  159. } else {
  160. _self.editProjectItemAdjusts[i].isChecked = false;
  161. }
  162. }
  163. },
  164. handleSearchProject: async function(value) {
  165. try {
  166. const response = await $.ajax({
  167. url: Common.getApiURL('ProjectItemResource/queryByCondition'),
  168. data: { name: value },
  169. beforeSend: request => Common.addTokenToRequest(request),
  170. });
  171. this.projectOptions = response.datas.map(item => ({
  172. label: item.name,
  173. value: item.id,
  174. }));
  175. } catch (error) {
  176. Common.processException(error);
  177. }
  178. },
  179. // 修改项目选择处理
  180. handleProjectChange(value) {
  181. this.projectItemId = value;
  182. this.pageProjectItemAdjusts = [];
  183. this.pagination.current_page = 1;
  184. this.getProjectItemAdjusts();
  185. this.getEditProjectItemAdjusts();
  186. },
  187. // 修改目标项目选择处理
  188. handleTargetChange(value) {
  189. this.targetProjectItemId = value;
  190. this.getEditProjectItemAdjusts();
  191. },
  192. /**
  193. * 查询还在编辑状态下的调拨单
  194. *
  195. */
  196. getEditProjectItemAdjusts: function () {
  197. var _self = this;
  198. var param = {
  199. start: (_self.pagination2.current_page - 1) * _self.pagination2.per_page,
  200. length: _self.pagination2.per_page,
  201. sourceProjectItemId: _self.projectItemId,
  202. targetProjectItemId: _self.targetProjectItemId,
  203. };
  204. ProjectItemAdjustResource.list(param).then(successData => {
  205. _self.pagination2.total = successData.totalSize;
  206. _self.editProjectItemAdjusts.splice(0, _self.editProjectItemAdjusts.length);
  207. var obj = {
  208. id: null,
  209. documentNo: '新建调拨单单',
  210. isChecked: false,
  211. };
  212. _self.editProjectItemAdjusts.push(obj);
  213. for (var i = 0; i < successData.dataList.length; i++) {
  214. successData.dataList[i].isChecked = false;
  215. _self.editProjectItemAdjusts.push(successData.dataList[i]);
  216. }
  217. _self.pagination2.last_page = Math.ceil(successData.totalSize / successData.range.length);
  218. }, errorData => {
  219. Common.processException(errorData);
  220. });
  221. },
  222. //查询项目事件下的物料详情
  223. getProjectItemAdjusts: function () {
  224. var _self = this;
  225. if (_self.projectItemId == undefined) {
  226. Common.showDialog('提示', '请选择原项目事件', 'error');
  227. return;
  228. }
  229. var param = {
  230. start: (_self.pagination.current_page - 1) * _self.pagination.per_page,
  231. length: 1,
  232. sourceProjectItemId: _self.projectItemId,
  233. };
  234. _self.loading=true;
  235. ProjectItemAdjustResource.list(param).then(successData => {
  236. _self.pagination.total = successData.totalSize;
  237. if (successData.dataList != null && successData.dataList.length > 0) {
  238. _self.projectItemAdjusts = successData.dataList[0].projectItemAdjustLineDtos;
  239. }
  240. _self.pagination.last_page = Math.ceil(successData.totalSize / _self.pagination.per_page);
  241. _self.getDatas();
  242. _self.loading=false;
  243. }, errorData => {
  244. _self.loading=false;
  245. Common.processException(errorData);
  246. });
  247. },
  248. getDatas: function () {
  249. var _self = this;
  250. var start = (_self.pagination.current_page - 1) * _self.pagination.per_page;
  251. var end = start + _self.pagination.per_page;
  252. console.log(start + '___' + end);
  253. //将录入的数据导过来
  254. if (_self.pageProjectItemAdjusts != null && _self.pageProjectItemAdjusts.length > 0) {
  255. for (var j = 0; j < _self.pageProjectItemAdjusts.length; j++) {
  256. var index = _self.pageProjectItemAdjusts[j].index;
  257. if (_self.pageProjectItemAdjusts[j].quantity != null) {
  258. _self.projectItemAdjusts[index].quantity = _self.pageProjectItemAdjusts[j].quantity;
  259. }
  260. }
  261. }
  262. //清空这样显示数据
  263. _self.pageProjectItemAdjusts.splice(0, _self.pageProjectItemAdjusts.length);
  264. //重新生成另一页的数据
  265. for (var i = 0; i < _self.projectItemAdjusts.length; i++) {
  266. if (i >= start && i < end) {
  267. var checked = false;
  268. if (_self.projectItemAdjusts[i].quantity != null && _self.projectItemAdjusts[i].quantity > 0) {
  269. checked = true;
  270. }
  271. var obj = {
  272. checked: checked,
  273. inventoryName: _self.projectItemAdjusts[i].inventoryName,
  274. inventoryNo: _self.projectItemAdjusts[i].inventoryNo,
  275. inventoryType: _self.projectItemAdjusts[i].inventoryType,
  276. projectItemQuantity: _self.projectItemAdjusts[i].projectItemQuantity,
  277. projectItemAdjustQuantity: _self.projectItemAdjusts[i].projectItemAdjustQuantity,
  278. projectItemCanAdjustQuantity: _self.projectItemAdjusts[i].projectItemCanAdjustQuantity,
  279. quantity: _self.projectItemAdjusts[i].quantity,
  280. index: i,
  281. };
  282. _self.pageProjectItemAdjusts.push(obj);
  283. }
  284. }
  285. },
  286. /**
  287. * [addition 领料]
  288. * @return {[type]} [description]
  289. */
  290. addition: function () {
  291. var _self = this;
  292. _self.modal = true;
  293. },
  294. /**
  295. * 取消领料操作
  296. */
  297. cancel: function () {
  298. var _self = this;
  299. _self.modal = false;
  300. _self.targetProjectItemId = undefined; //选择目标项目事件
  301. _self.projectItemAdjustNo = undefined; //选择目标项目事件的单据号
  302. for (var i = 0; i < _self.editProjectItemAdjusts.length; i++) {
  303. _self.editProjectItemAdjusts[i].isChecked = false;
  304. }
  305. },
  306. /**
  307. * 提交前进行判断,是否在已选择的领料单中继续添加
  308. */
  309. picking: function () {
  310. var _self = this;
  311. _self.modal = false;
  312. if (_self.projectItemId == undefined) {
  313. Common.showDialog('提示', '请选择原项目事件', 'error');
  314. return;
  315. }
  316. if (_self.targetProjectItemId == undefined) {
  317. Common.showDialog('提示', '请选择目标项目事件', 'error');
  318. return;
  319. }
  320. if (_self.projectItemAdjustId != null) {
  321. Notify.show({
  322. title: '确认在原有的调拨单中继续添加',
  323. message: '您确定要将选择的物料添加到调拨单(单据号)' + _self.projectItemAdjustNo + '中吗?如果\\"是\\"的话,请点击\\"确定\\"按钮,否则点击\\"取消\\"按钮',
  324. buttons: [
  325. {
  326. label: '确定',
  327. cssClass: 'btn-primary',
  328. action: function (dialogItself) {
  329. dialogItself.close();
  330. //判断选择原项目事件与目标项目事件是否相同
  331. if (_self.projectItemId == _self.targetProjectItemId) {
  332. Common.showDialog('提示', '选择的原项目事件与目标项目事件相同', 'error');
  333. return;
  334. } else {
  335. _self.submitStock();
  336. }
  337. },
  338. }, {
  339. label: '取消',
  340. action: function (dialogItself) {
  341. dialogItself.close();
  342. },
  343. }],
  344. });
  345. } else {
  346. _self.submitStock();
  347. }
  348. },
  349. //提交
  350. submitStock: function () {
  351. var currentStock = [];
  352. var num = 0;
  353. var num3 = 0;
  354. var num5 = 0;
  355. var _self = this;
  356. _self.getDatas();
  357. this.projectItemAdjusts.forEach(function (item) {
  358. if (item.quantity != undefined && item.quantity != '' && item.quantity > 0 && item.quantity <= item.projectItemCanAdjustQuantity) {
  359. currentStock.push(item);
  360. }
  361. });
  362. if (_self.projectItemId == _self.targetProjectItemId) {
  363. Common.showDialog('提示', '目标项目事件不能与原项目事件相同', 'error');
  364. return;
  365. }
  366. if (currentStock == null || currentStock.length == 0) {
  367. Common.showDialog('提示', '物料数量不能全部空或者全部小于等于0.同时填写的数量不能大于可调拨的数量。', 'error');
  368. return;
  369. }
  370. _self.loading=true;
  371. if (currentStock.length > 0) {
  372. var param = {
  373. sourceProjectItemId: _self.projectItemId,
  374. targetProjectItemId: _self.targetProjectItemId,
  375. id: _self.projectItemAdjustId,
  376. projectItemAdjustLineDtos: currentStock,
  377. };
  378. ProjectItemAdjustResource.create(param).then(successData => {
  379. _self.stockOutPrepareSaveResult = successData;
  380. Notify.success('成功', '调拨成功', 4000);
  381. _self.getProjectItemAdjusts();
  382. _self.clear();
  383. _self.loading=false;
  384. }, errorData => {
  385. _self.loading=false;
  386. Common.processException(errorData);
  387. });
  388. } else {
  389. _self.loading=false;
  390. Common.showDialog('提示', '请选择要提交的内容', 'error');
  391. }
  392. },
  393. /**
  394. * 清空赋值的参数
  395. */
  396. clear: function () {
  397. var _self = this;
  398. _self.targetProjectItemId = undefined; //选择的调拨单
  399. _self.pageProjectItemAdjusts.splice(0, _self.pageProjectItemAdjusts.length); //清空显示页面数据
  400. _self.getProjectItemAdjusts();
  401. _self.getEditProjectItemAdjusts();
  402. // _self.stockOutPrepareDocumentNo = undefined; //选择领料单的单据号
  403. for (var i = 0; i < _self.editProjectItemAdjusts.length; i++) {
  404. _self.editProjectItemAdjusts[i].isChecked = false;
  405. }
  406. //_self.getDatas();
  407. },
  408. formatDate: function (date) {
  409. if (date != '' && date != null) {
  410. var dateStr = date + '';
  411. return dateStr.substr(0, 10);
  412. } else {
  413. return '';
  414. }
  415. },
  416. /**
  417. * 根据文本中是否有内容判断是否选中
  418. * @param {Object} item
  419. */
  420. checkBoxChange: function (item) {
  421. if (item.quantity == undefined || item.quantity == '') {
  422. item.checked = false;
  423. }
  424. if (item.quantity > item.projectItemCanAdjustQuantity) {
  425. Common.showDialog('提示', '物料编码:' + item.inventoryNo + ',物料名称:' + item.inventoryName + '。填写的数量大于可调拨数量。提交时会自动过滤掉此物料。', 'error');
  426. item.checked = false;
  427. } else {
  428. item.checked = true;
  429. }
  430. },
  431. },
  432. };
  433. </script>
  434. <style scoped>
  435. .form-card {
  436. margin-top: 24px;
  437. padding: 16px;
  438. }
  439. .data-table {
  440. margin-top: 24px;
  441. }
  442. .modal-footer {
  443. margin-top: 24px;
  444. text-align: right;
  445. }
  446. .ant-form-item {
  447. margin-right: 24px;
  448. }
  449. </style>