AssetsDialog.vue 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577
  1. <template>
  2. <el-dialog
  3. :visible.sync="visible1"
  4. :close-on-click-modal="true"
  5. :close-on-press-escape="false"
  6. append-to-body
  7. width="80vw"
  8. >
  9. <el-form :model="searchForm" label-width="100px">
  10. <el-row>
  11. <el-col :span="6">
  12. <el-form-item label="仓库名称:">
  13. <el-select v-model="searchForm.warehouseId" style="width: 100%">
  14. <el-option
  15. v-for="item in warehouseList"
  16. :key="item.id"
  17. :value="item.id"
  18. :label="item.name"
  19. ></el-option> </el-select
  20. ></el-form-item>
  21. </el-col>
  22. <el-col :span="6" style="height: 43px">
  23. <el-form-item label="列表维度:" prop="dimension">
  24. <template>
  25. <el-select
  26. style="width: 100%"
  27. @change="changeDimensionHandler"
  28. v-model="dimension"
  29. placeholder="请选择"
  30. >
  31. <el-option label="物料维度" value="4"> </el-option>
  32. <el-option label="包装维度" value="3"> </el-option>
  33. <el-option label="批次维度" value="2"> </el-option>
  34. <el-option label="物品维度" value="1"> </el-option>
  35. </el-select>
  36. </template>
  37. </el-form-item>
  38. </el-col>
  39. <el-col :span="6">
  40. <el-form-item label="物品编码:">
  41. <el-input
  42. style="width: 100%"
  43. type="text"
  44. placeholder="搜索物品编码"
  45. v-model="searchForm.categoryCode"
  46. ></el-input>
  47. </el-form-item>
  48. </el-col>
  49. <el-col :span="6">
  50. <el-form-item label="物品名称:">
  51. <el-input
  52. style="width: 100%"
  53. type="text"
  54. placeholder="搜索物品名称"
  55. v-model="searchForm.categoryName"
  56. ></el-input>
  57. </el-form-item>
  58. </el-col>
  59. <el-col :span="6">
  60. <el-form-item label="批次号:">
  61. <el-input
  62. type="text"
  63. placeholder="搜索批次号"
  64. v-model="searchForm.batchNo"
  65. ></el-input>
  66. </el-form-item>
  67. </el-col>
  68. <el-col :span="6">
  69. <el-form-item label="刻码">
  70. <el-input
  71. type="text"
  72. placeholder="搜索物品刻码"
  73. v-model="searchForm.engrave"
  74. ></el-input>
  75. </el-form-item>
  76. </el-col>
  77. <el-col :span="6">
  78. <el-form-item label="发货码">
  79. <el-input
  80. type="text"
  81. placeholder="搜索发货码"
  82. v-model="searchForm.barcodes"
  83. ></el-input>
  84. </el-form-item>
  85. </el-col>
  86. <el-col :span="6">
  87. <el-form-item label="牌号">
  88. <el-input
  89. type="text"
  90. placeholder="搜索牌号"
  91. v-model="searchForm.brandNum"
  92. ></el-input>
  93. </el-form-item>
  94. </el-col>
  95. <el-col style="text-align: right">
  96. <el-button type="primary" @click="doSearch">搜索</el-button>
  97. <el-button icon="el-icon-refresh-left" @click="reset">重置</el-button>
  98. </el-col>
  99. </el-row>
  100. </el-form>
  101. <el-container class="assets-dialog">
  102. <el-aside width="200px" class="wrapper-assets">
  103. <AssetTree
  104. ref="treeList"
  105. :treeIds="[6]"
  106. @handleNodeClick="handleNodeClick"
  107. />
  108. </el-aside>
  109. <el-main>
  110. <el-table
  111. ref="multipleTable"
  112. :data="tableData"
  113. tooltip-effect="dark"
  114. height="50vh"
  115. border
  116. row-key="id"
  117. style="width: 100%"
  118. :header-cell-style="{ background: '#F0F3F3', border: 'none' }"
  119. @selection-change="handleSelectionChange"
  120. >
  121. <el-table-column
  122. type="selection"
  123. :reserve-selection="true"
  124. width="55"
  125. align="center"
  126. >
  127. </el-table-column>
  128. <el-table-column label="序号" type="index" width="50">
  129. </el-table-column>
  130. <el-table-column
  131. prop="categoryCode"
  132. label="物品编码"
  133. min-width="120"
  134. :show-overflow-tooltip="true"
  135. ></el-table-column>
  136. <el-table-column
  137. prop="categoryName"
  138. width="200"
  139. label="物品名称"
  140. :show-overflow-tooltip="true"
  141. ></el-table-column>
  142. <el-table-column
  143. prop="brandNum"
  144. label="牌号"
  145. :show-overflow-tooltip="true"
  146. ></el-table-column>
  147. <el-table-column
  148. prop="categoryModel"
  149. label="型号"
  150. :show-overflow-tooltip="true"
  151. ></el-table-column>
  152. <el-table-column
  153. prop="specification"
  154. label="规格"
  155. :show-overflow-tooltip="true"
  156. ></el-table-column>
  157. <!-- <el-table-column
  158. label="出库数量"
  159. type="index"
  160. width="100"
  161. >
  162. <template slot-scope="{ row }">
  163. <el-input
  164. type="text"
  165. placeholder="请输入"
  166. v-model="row.outboundNum"
  167. @input="handleInput(row, $event)"
  168. ></el-input>
  169. </template>
  170. </el-table-column> -->
  171. <el-table-column
  172. v-if="dimension == 3"
  173. prop="batchNo"
  174. label="批次号"
  175. key="batchNo"
  176. min-width="80"
  177. ></el-table-column>
  178. <el-table-column prop="level" label="级别"></el-table-column>
  179. <el-table-column
  180. prop="measureQuantity"
  181. label="计量数量"
  182. width="120"
  183. ></el-table-column>
  184. <el-table-column
  185. prop="measureUnit"
  186. label="计量单位"
  187. width="90"
  188. ></el-table-column>
  189. <el-table-column
  190. prop="weight"
  191. label="重量"
  192. min-width="120"
  193. ></el-table-column>
  194. <el-table-column
  195. prop="weightUnit"
  196. label="重量单位"
  197. min-width="120"
  198. ></el-table-column>
  199. <el-table-column
  200. v-if="dimension == 3"
  201. prop="packageNo"
  202. label="包装编码"
  203. min-width="120"
  204. :show-overflow-tooltip="true"
  205. ></el-table-column>
  206. <el-table-column
  207. v-if="dimension == 3"
  208. prop="packingQuantity"
  209. label="包装数量"
  210. min-width="120"
  211. :show-overflow-tooltip="true"
  212. ></el-table-column>
  213. <el-table-column
  214. v-if="dimension == 3"
  215. prop="packingUnit"
  216. label="单位"
  217. min-width="120"
  218. :show-overflow-tooltip="true"
  219. ></el-table-column>
  220. <el-table-column
  221. v-if="dimension == 3 || dimension == 4"
  222. label="发货条码"
  223. prop="barcodes"
  224. width="80"
  225. :show-overflow-tooltip="true"
  226. ></el-table-column>
  227. <el-table-column
  228. v-if="dimension == 4"
  229. prop="no"
  230. label="物料编码"
  231. min-width="120"
  232. :show-overflow-tooltip="true"
  233. ></el-table-column>
  234. <el-table-column
  235. v-if="dimension == 3 || dimension == 4"
  236. prop="materielDesignation"
  237. label="物料代号"
  238. min-width="100"
  239. ></el-table-column>
  240. <el-table-column
  241. v-if="dimension == 3 || dimension == 4"
  242. prop="clientCode"
  243. label="客户代号"
  244. min-width="100"
  245. ></el-table-column>
  246. <el-table-column
  247. v-if="dimension == 3 || dimension == 4"
  248. prop="engrave"
  249. label="刻码"
  250. min-width="120"
  251. ></el-table-column>
  252. <el-table-column
  253. v-if="dimension == 3 || dimension == 4"
  254. prop="warehouseName"
  255. label="仓库"
  256. min-width="200"
  257. :show-overflow-tooltip="true"
  258. ></el-table-column>
  259. </el-table>
  260. <ele-pro-table
  261. ref="table"
  262. :columns="columns"
  263. :datasource="tableList"
  264. :selection.sync="selection"
  265. row-key="id"
  266. height="20vh"
  267. :needPage="false"
  268. >
  269. <template v-slot:toolbar>
  270. <el-button type="primary" size="small" @click="add">添加</el-button>
  271. <el-button size="small" @click="del">移除</el-button></template
  272. >
  273. </ele-pro-table>
  274. <div style="text-align: right; padding: 10px">
  275. <el-pagination
  276. background
  277. layout="total, sizes, prev, pager, next, jumper"
  278. :total="total"
  279. :page-sizes="[5, 10, 20, 50]"
  280. :page-size.sync="searchForm.size"
  281. :current-page.sync="searchForm.pageNum"
  282. @current-change="handleCurrentChange"
  283. @size-change="handleSizeChange"
  284. >
  285. </el-pagination>
  286. </div>
  287. </el-main>
  288. </el-container>
  289. <div slot="footer">
  290. <el-button type="primary" @click="confirm">确定</el-button>
  291. <el-button @click="cancel">关闭</el-button>
  292. </div>
  293. </el-dialog>
  294. </template>
  295. <script>
  296. import storageApi from '@/api/warehouseManagement';
  297. import AssetTree from './assetTree.vue';
  298. import warehouseDefinition from '@/api/warehouseManagement/warehouseDefinition';
  299. export default {
  300. components: { AssetTree },
  301. props: {
  302. treeIds: { type: Array, default: () => [] }
  303. },
  304. data() {
  305. return {
  306. isShowTable: true,
  307. qualityResultOption: [
  308. {
  309. value: 0,
  310. label: '合格'
  311. },
  312. {
  313. value: 1,
  314. label: '不合格'
  315. }
  316. ],
  317. qualityStatusOption: [
  318. {
  319. value: 1,
  320. label: '已质检'
  321. },
  322. {
  323. value: 0,
  324. label: '未质检'
  325. }
  326. ],
  327. visible1: false,
  328. tableData: [],
  329. total: 0,
  330. categoryLevelId: '',
  331. warehouseList: [],
  332. searchForm: {
  333. categoryCode: '',
  334. categoryName: '',
  335. batchNo: '',
  336. brandNum: '',
  337. engrave: '',
  338. barcodes: '',
  339. categoryLevelId: '',
  340. warehouseId: '',
  341. pageNum: 1,
  342. size: 20
  343. },
  344. selectionList: [],
  345. materialType: '',
  346. warehouseList: [],
  347. dimension: '1',
  348. selection: [],
  349. tableList: [],
  350. columns: [
  351. {
  352. columnKey: 'selection',
  353. type: 'selection',
  354. width: 45,
  355. align: 'center',
  356. fixed: 'left'
  357. },
  358. {
  359. columnKey: 'index',
  360. label: '序号',
  361. type: 'index',
  362. width: 55,
  363. align: 'center',
  364. showOverflowTooltip: true,
  365. fixed: 'left'
  366. },
  367. {
  368. prop: 'categoryCode',
  369. label: '物品编码',
  370. align: 'center'
  371. },
  372. {
  373. prop: 'categoryName',
  374. label: '物品名称',
  375. align: 'center'
  376. },
  377. {
  378. prop: 'categoryModel',
  379. label: '型号',
  380. align: 'center'
  381. },
  382. {
  383. prop: 'specification',
  384. label: '规格',
  385. align: 'center'
  386. },
  387. {
  388. prop: 'level',
  389. label: '级别',
  390. align: 'center'
  391. },
  392. {
  393. prop: 'measureQuantity',
  394. label: '库存',
  395. align: 'center'
  396. },
  397. {
  398. prop: 'measureUnit',
  399. label: '计量单位',
  400. align: 'center'
  401. },
  402. {
  403. prop: 'warehouseName',
  404. label: '仓库',
  405. align: 'center'
  406. }
  407. ]
  408. };
  409. },
  410. created() {
  411. warehouseDefinition.list({}).then((res) => {
  412. this.warehouseList = res;
  413. });
  414. },
  415. methods: {
  416. getRowKeys(row) {
  417. return row.id;
  418. },
  419. // 切换维度
  420. changeDimensionHandler(e) {
  421. this.searchForm.pageNum = 1;
  422. this.selectionList = [];
  423. this.$refs.multipleTable.clearSelection();
  424. this.changeDimension(e);
  425. },
  426. async changeDimension(e) {
  427. this.dimension = e;
  428. if (this.dimension == 1) {
  429. // 物品维度
  430. const data = await storageApi.getProductList(this.searchForm);
  431. this.tableData = data.list;
  432. this.total = data.count;
  433. } else if (this.dimension == 2) {
  434. // 批次维度
  435. const data = await storageApi.getBatchList(this.searchForm);
  436. this.tableData = data.list;
  437. this.total = data.count;
  438. } else if (this.dimension == 4) {
  439. // 物料维度
  440. const data = await storageApi.getMaterialList(this.searchForm);
  441. this.tableData = data.list;
  442. this.total = data.count;
  443. } else {
  444. // 包装维度
  445. const data = await storageApi.getPackingList(this.searchForm);
  446. this.tableData = data.list;
  447. this.total = data.count;
  448. }
  449. console.log(this.tableData);
  450. },
  451. open(tableList) {
  452. this.visible1 = true;
  453. this.tableList = JSON.parse(JSON.stringify(tableList));
  454. this.$nextTick(() => {
  455. console.log(this.$refs, 'this.$refs.treeList');
  456. this.$refs.treeList.getTreeData().then((data) => {
  457. this.handleNodeClick(data);
  458. });
  459. });
  460. },
  461. async confirm() {
  462. this.$emit('choose', this.tableList, this.dimension);
  463. this.cancel();
  464. },
  465. async add() {
  466. if (!this.selectionList.length) {
  467. this.$message.error('请至少选择一条数据!');
  468. return;
  469. }
  470. // if (this.dimension == 1) {
  471. // let boolen = this.selectionList.every((item) => item.outboundNum > 0);
  472. // if (!boolen) {
  473. // this.$message.error('请输入出库数量!');
  474. // return;
  475. // }
  476. // }
  477. // let data = null;
  478. // if (this.dimension != 1) {
  479. // data = await storageApi.getHierarchyList({
  480. // ids: this.selectionList.map((item) => item.id).join(','),
  481. // type: this.dimension
  482. // });
  483. // } else {
  484. // data = await storageApi.getHierarchyFifo({
  485. // type: this.dimension,
  486. // builders: this.selectionList.map((item) => {
  487. // return {
  488. // categoryId: item.categoryId,
  489. // num: item.outboundNum || item.measureQuantity
  490. // };
  491. // })
  492. // });
  493. // }
  494. this.selectionList = this.selectionList.filter((item) => {
  495. if (item.warehouseList.length > 0) {
  496. item['warehouseId'] = item.warehouseList[0].warehouse_id;
  497. item['warehouseName'] = item.warehouseList[0].warehouse_name;
  498. }
  499. return !this.tableList
  500. .map((item) => item.categoryCode)
  501. .includes(item.categoryCode);
  502. });
  503. this.tableList.push(...this.selectionList);
  504. },
  505. del() {
  506. let ids = this.selection.map((item) => item.id);
  507. this.tableList = this.tableList.filter(
  508. (item) => !ids.includes(item.id)
  509. );
  510. },
  511. cancel() {
  512. this.selectionList = [];
  513. this.$refs.multipleTable.clearSelection();
  514. this.visible1 = false;
  515. },
  516. handleSelectionChange(val) {
  517. this.selectionList = val;
  518. },
  519. handleNodeClick(data) {
  520. console.log(data);
  521. this.categoryLevelId = data.id;
  522. this.searchForm.categoryLevelId = data.id;
  523. this.doSearch();
  524. },
  525. handleCurrentChange() {
  526. this.changeDimension(this.dimension);
  527. },
  528. reset() {
  529. this.searchForm = {
  530. categoryCode: '',
  531. categoryName: '',
  532. batchNo: '',
  533. brandNum: '',
  534. engrave: '',
  535. barcodes: '',
  536. categoryLevelId: this.categoryLevelId,
  537. pageNum: 1,
  538. warehouseId: '',
  539. size: 20
  540. };
  541. this.doSearch();
  542. },
  543. doSearch() {
  544. this.searchForm.pageNum = 1;
  545. this.changeDimension(this.dimension);
  546. },
  547. handleSizeChange() {
  548. this.searchForm.pageNum = 1;
  549. this.changeDimension(this.dimension, 'page');
  550. }
  551. }
  552. };
  553. </script>
  554. <style lang="scss" scoped>
  555. .el-dialog__wrapper {
  556. ::v-deep .el-aside {
  557. background-color: #fff !important;
  558. border: 1px solid #ccc;
  559. }
  560. }
  561. .wrapper-assets {
  562. max-height: 53vh;
  563. overflow: auto;
  564. }
  565. </style>