AssetsDialog.vue 14 KB

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