goodscard.vue 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680
  1. <template>
  2. <div :style="{ backgroundColor: bgColor }">
  3. <q-dialog
  4. v-model="storage_dialog"
  5. transition-show="jump-down"
  6. transition-hide="jump-up"
  7. @show="prepareDialog()"
  8. >
  9. <q-card style="min-width: 600px">
  10. <q-bar
  11. class="bg-light-blue-10 text-white rounded-borders"
  12. style="height: 50px"
  13. >
  14. <div>
  15. {{ $t("stock.shelf.shelf_details") }} {{ rowIndex }}-{{
  16. colIndex
  17. }}-{{ layerIndex }}
  18. </div>
  19. <q-space></q-space>
  20. <q-btn dense flat icon="close" v-close-popup>
  21. <q-tooltip
  22. content-class="bg-amber text-black shadow-4"
  23. :offset="[20, 20]"
  24. content-style="font-size: 12px"
  25. >
  26. {{ $t("index.close") }}</q-tooltip
  27. >
  28. </q-btn>
  29. </q-bar>
  30. <q-card-section class="q-pt-md">
  31. <q-tabs v-model="activeTab">
  32. <q-tab name="tab1" label="货架属性" />
  33. <q-tab name="tab2" label="批次信息" />
  34. <q-tab name="tab3" label="库存明细" />
  35. </q-tabs>
  36. </q-card-section>
  37. <!-- 选项卡内容 -->
  38. <q-tab-panels v-model="activeTab" animated>
  39. <q-tab-panel name="tab1" style="height: 300px">
  40. <div class="row q-gutter-x-md">
  41. <div class="col column q-gutter-y-md">
  42. <q-input
  43. dense
  44. outlined
  45. square
  46. v-model="storage_form.goods_code"
  47. :label="$t('stock.shelf.goods_code')"
  48. :readonly="onlyread"
  49. :rules="[(val) => val?.length > 0 || error1]"
  50. />
  51. </div>
  52. <div class="col column q-gutter-y-md">
  53. <q-input
  54. dense
  55. outlined
  56. square
  57. v-model="storage_form.goods_name"
  58. :label="$t('stock.shelf.goods_name')"
  59. :readonly="onlyread"
  60. :rules="[(val) => val?.length > 0 || error1]"
  61. />
  62. </div>
  63. </div>
  64. </q-tab-panel>
  65. <q-tab-panel name="tab2" style="height: 300px">
  66. <div class="row q-gutter-x-md">
  67. <div class="col column q-gutter-y-md">
  68. <q-input
  69. dense
  70. outlined
  71. square
  72. v-model="storage_form.goods_code"
  73. :label="$t('stock.shelf.goods_code')"
  74. :readonly="onlyread"
  75. :rules="[(val) => val?.length > 0 || error1]"
  76. />
  77. <q-input
  78. dense
  79. outlined
  80. square
  81. v-model="storage_form.goods_batch"
  82. :label="$t('stock.shelf.goods_batch')"
  83. :readonly="onlyread"
  84. :rules="[(val) => val?.length > 0 || error1]"
  85. />
  86. <q-input
  87. dense
  88. outlined
  89. square
  90. v-model="storage_form.goods_qty"
  91. :label="'批次总数'"
  92. :readonly="onlyread"
  93. :rules="[(val) => val >= 0 || error1]"
  94. class="col"
  95. />
  96. <q-input
  97. dense
  98. outlined
  99. square
  100. v-model="storage_form.goods_desc"
  101. :label="$t('stock.shelf.goods_desc')"
  102. :readonly="onlyread"
  103. :rules="[(val) => val?.length > 0 || error1]"
  104. />
  105. </div>
  106. <div class="col column q-gutter-y-md">
  107. <q-input
  108. dense
  109. outlined
  110. square
  111. v-model="storage_form.goods_name"
  112. :label="$t('stock.shelf.goods_name')"
  113. :readonly="onlyread"
  114. :rules="[(val) => val?.length > 0 || error1]"
  115. />
  116. <q-input
  117. dense
  118. outlined
  119. square
  120. v-model="storage_form.goods_std"
  121. :label="$t('stock.shelf.goods_std')"
  122. :readonly="onlyread"
  123. :rules="[(val) => val?.length > 0 || error1]"
  124. />
  125. <q-input
  126. dense
  127. outlined
  128. square
  129. v-model="storage_form.goods_notes"
  130. :label="'库位容纳'"
  131. :readonly="onlyread"
  132. :rules="[(val) => val >= 0 || error1]"
  133. class="col"
  134. />
  135. <q-input
  136. dense
  137. outlined
  138. square
  139. v-model="storage_form.goods_unit"
  140. :label="$t('stock.shelf.goods_unit')"
  141. :readonly="onlyread"
  142. :rules="[(val) => val?.length > 0 || error1]"
  143. />
  144. </div>
  145. </div>
  146. </q-tab-panel>
  147. <q-tab-panel name="tab3" style="height: 300px">
  148. <div class="row q-gutter-x-md">
  149. <div class="col column q-gutter-y-md"></div>
  150. <div class="col column q-gutter-y-md"></div>
  151. </div>
  152. </q-tab-panel>
  153. </q-tab-panels>
  154. <div
  155. style="position: absolute; right: 20px; bottom: 12px; z-index: 100"
  156. >
  157. <q-btn-group push>
  158. <q-btn
  159. color="white"
  160. text-color="black"
  161. @click="
  162. shelfLocal = 'undefined';
  163. handleclick();
  164. "
  165. >
  166. {{ $t("stock.return") }}
  167. </q-btn>
  168. <q-btn
  169. color="white"
  170. text-color="black"
  171. @click="showInventoryDetails = !showInventoryDetails"
  172. >
  173. {{ $t("stock.details") }}
  174. </q-btn>
  175. <q-btn color="primary" text-color="white" @click="handleEdit()">
  176. {{
  177. onlyread
  178. ? $t("stock.shelf.shelf_edit")
  179. : $t("stock.shelf.shelf_confirm")
  180. }}
  181. </q-btn>
  182. </q-btn-group>
  183. </div>
  184. <div
  185. style="float: right; padding: 15px 15px 50px 15px; min-width: 100%"
  186. flow="row wrap"
  187. >
  188. <q-card class="q-mb-md" bordered v-if="showInventoryDetails">
  189. <q-card-actions
  190. class="q-px-none"
  191. style="position: absolute; right: 20px; top: 10px; z-index: 100"
  192. >
  193. <q-btn
  194. v-if="!onlyread"
  195. @click="addInventoryDetail()"
  196. icon="add"
  197. flat
  198. dense
  199. color="primary"
  200. :label="$t('stock.add')"
  201. />
  202. <q-btn
  203. v-if="!onlyread"
  204. @click="deleteInventoryDetail()"
  205. icon="delete"
  206. flat
  207. dense
  208. color="primary"
  209. :label="$t('stock.delete')"
  210. />
  211. </q-card-actions>
  212. <q-card-section>
  213. <div class="text-h6 q-mb-md">
  214. {{ $t("stock.inventory_details") }}
  215. </div>
  216. <!-- 动态生成的输入行 -->
  217. <div
  218. v-for="(detail, index) in inventoryDetails"
  219. :key="index"
  220. class="row q-col-gutter-md q-mb-sm"
  221. >
  222. <div class="col">
  223. <q-input
  224. v-model="detail.id"
  225. :label="$t('stock.batch')"
  226. :readonly="onlyread"
  227. dense
  228. outlined
  229. />
  230. </div>
  231. <div class="col">
  232. <q-input
  233. v-model="detail.quantity"
  234. :label="$t('stock.quantity')"
  235. :readonly="onlyread"
  236. type="number"
  237. dense
  238. outlined
  239. />
  240. </div>
  241. <div class="col">
  242. <q-input
  243. v-model="detail.location"
  244. :label="$t('stock.location')"
  245. :readonly="onlyread"
  246. dense
  247. standout
  248. outlined
  249. />
  250. </div>
  251. </div>
  252. </q-card-section>
  253. </q-card>
  254. </div>
  255. </q-card>
  256. </q-dialog>
  257. <q-dialog
  258. v-model="elevator_dialog"
  259. transition-show="jump-down"
  260. transition-hide="jump-up"
  261. @show="prepareDialog()"
  262. >
  263. <q-card style="min-width: 350px">
  264. <q-bar
  265. class="bg-light-blue-10 text-white rounded-borders"
  266. style="height: 50px"
  267. >
  268. <div>
  269. {{ $t("stock.elevator.elevator") }}
  270. </div>
  271. <q-space></q-space>
  272. <q-btn dense flat icon="close" v-close-popup>
  273. <q-tooltip
  274. content-class="bg-amber text-black shadow-4"
  275. :offset="[20, 20]"
  276. content-style="font-size: 12px"
  277. >
  278. {{ $t("index.close") }}</q-tooltip
  279. >
  280. </q-btn>
  281. </q-bar>
  282. <q-card-section class="q-pt-md">
  283. <q-input
  284. dense
  285. outlined
  286. square
  287. v-model="elevator_form.ip"
  288. :label="$t('stock.elevator.ip')"
  289. :readonly="onlyread"
  290. :rules="[(val) => val?.length > 0 || error1]"
  291. />
  292. <q-input
  293. dense
  294. outlined
  295. square
  296. v-model="elevator_form.port"
  297. :label="$t('stock.elevator.port')"
  298. type="number"
  299. :readonly="onlyread"
  300. :rules="[
  301. (val) => val !== null || error1,
  302. (val) => val >= 0 || error1,
  303. ]"
  304. />
  305. <q-input
  306. dense
  307. outlined
  308. square
  309. v-model="elevator_form.status"
  310. :label="$t('stock.conveyor.status')"
  311. :readonly="onlyread"
  312. :rules="[(val) => val?.length > 0 || error1]"
  313. />
  314. <!-- <q-input dense outlined square v-model="elevator_form.password"
  315. :label="$t('stock.elevator.password')" :readonly="onlyread"
  316. :rules="[val => val?.length > 0 || error1]" /> -->
  317. <!-- <q-input dense outlined square v-model="elevator_form.username"
  318. :label="$t('stock.elevator.username')" :readonly="onlyread"
  319. :rules="[val => val?.length > 0 || error1]" /> -->
  320. </q-card-section>
  321. <div style="float: right; padding: 15px 15px 15px 0">
  322. <q-btn
  323. color="white"
  324. text-color="black"
  325. style="margin-right: 25px"
  326. @click="
  327. shelfLocal = 'undefined';
  328. handleclick();
  329. "
  330. >
  331. {{ $t("stock.return") }}</q-btn
  332. >
  333. <q-btn
  334. color="primary"
  335. text-color="white"
  336. style="margin-right: 25px"
  337. @click="handleEdit()"
  338. >
  339. {{
  340. onlyread
  341. ? $t("stock.shelf.shelf_edit")
  342. : $t("stock.shelf.shelf_confirm")
  343. }}</q-btn
  344. >
  345. </div>
  346. </q-card>
  347. </q-dialog>
  348. <q-dialog
  349. v-model="conveyor_dialog"
  350. transition-show="jump-down"
  351. transition-hide="jump-up"
  352. @show="prepareDialog()"
  353. >
  354. <q-card style="min-width: 350px">
  355. <q-bar
  356. class="bg-light-blue-10 text-white rounded-borders"
  357. style="height: 50px"
  358. >
  359. <div>
  360. {{ $t("stock.conveyor.conveyor") }}
  361. </div>
  362. <q-space></q-space>
  363. <q-btn dense flat icon="close" v-close-popup>
  364. <q-tooltip
  365. content-class="bg-amber text-black shadow-4"
  366. :offset="[20, 20]"
  367. content-style="font-size: 12px"
  368. >
  369. {{ $t("index.close") }}</q-tooltip
  370. >
  371. </q-btn>
  372. </q-bar>
  373. <q-card-section class="q-pt-md">
  374. <q-input
  375. dense
  376. outlined
  377. square
  378. v-model="conveyor_form.ip"
  379. :label="$t('stock.conveyor.ip')"
  380. :readonly="onlyread"
  381. :rules="[(val) => val?.length > 0 || error1]"
  382. />
  383. <!-- <q-input dense outlined square v-model="conveyor_form.destination"
  384. :label="$t('stock.conveyor.destination')" :readonly="onlyread"
  385. :rules="[val => val?.length > 0 || error1]" /> -->
  386. <q-input
  387. dense
  388. outlined
  389. square
  390. v-model="conveyor_form.port"
  391. :label="$t('stock.elevator.port')"
  392. type="number"
  393. :readonly="onlyread"
  394. :rules="[
  395. (val) => val !== null || error1,
  396. (val) => val >= 0 || error1,
  397. ]"
  398. />
  399. <q-input
  400. dense
  401. outlined
  402. square
  403. v-model="conveyor_form.status"
  404. :label="$t('stock.conveyor.status')"
  405. :readonly="onlyread"
  406. :rules="[(val) => val?.length > 0 || error1]"
  407. />
  408. </q-card-section>
  409. <div style="float: right; padding: 15px 15px 15px 0">
  410. <q-btn
  411. color="white"
  412. text-color="black"
  413. style="margin-right: 25px"
  414. @click="
  415. shelfLocal = 'undefined';
  416. handleclick();
  417. "
  418. >
  419. {{ $t("stock.return") }}</q-btn
  420. >
  421. <q-btn
  422. color="primary"
  423. text-color="white"
  424. style="margin-right: 25px"
  425. @click="handleEdit()"
  426. >
  427. {{
  428. onlyread
  429. ? $t("stock.shelf.shelf_edit")
  430. : $t("stock.shelf.shelf_confirm")
  431. }}</q-btn
  432. >
  433. </div>
  434. </q-card>
  435. </q-dialog>
  436. </div>
  437. </template>
  438. <script>
  439. import { getauth } from 'boot/axios_request'
  440. export default {
  441. props: {
  442. rowIndex: Number,
  443. colIndex: Number,
  444. layerIndex: Number,
  445. selectedShelfType: String,
  446. goodsData: Object
  447. },
  448. data () {
  449. return {
  450. pathname: 'bin/',
  451. pathnamecontainer: 'container/detail/',
  452. container_id: 123456,
  453. results: [],
  454. storage_form: {
  455. shelf_name: '',
  456. shelf_department: '',
  457. shelf_warehouse: '',
  458. shelf_status: '',
  459. goods_code: '',
  460. goods_name: '',
  461. goods_std: '',
  462. goods_desc: '',
  463. goods_qty: '',
  464. goods_unit: '',
  465. goods_price: '',
  466. goods_batch: '',
  467. goods_notes: '',
  468. goods_in: '',
  469. goods_out: ''
  470. },
  471. elevator_form: {
  472. ip: '',
  473. port: 8080,
  474. // username: 'admin',
  475. // password: '123456',
  476. status: '未连接'
  477. },
  478. conveyor_form: {
  479. ip: '',
  480. port: 8080,
  481. // destination: 'A010203',
  482. status: '未连接'
  483. },
  484. showInventoryDetails: false,
  485. inventoryDetails: [
  486. {
  487. id: 1,
  488. batch: '',
  489. quantity: 0,
  490. location: ''
  491. },
  492. {
  493. id: 2,
  494. batch: '',
  495. quantity: 0,
  496. location: ''
  497. }
  498. ],
  499. inventoryColumns: [
  500. { name: 'batch', label: '批次', field: 'batch', align: 'left' },
  501. { name: 'quantity', label: '数量', field: 'quantity', align: 'right' },
  502. { name: 'location', label: '位置', field: 'location', align: 'left' }
  503. ],
  504. user_id: '',
  505. auth_id: '',
  506. onlyread: true,
  507. clickedinput: false,
  508. storage_dialog: false,
  509. elevator_dialog: false,
  510. conveyor_dialog: false,
  511. bgColor: 'transparent',
  512. shelf_type: { shelf_type: 'undefined' },
  513. ip_change: { ip_address: '192.168.1.100', port: 8080, status: 'offline' },
  514. goods_change: {
  515. shelf_status: '未满',
  516. goods_batch: '20230701-001',
  517. goods_code: 'A010203',
  518. goods_name: '存货货物',
  519. goods_std: '规格型号',
  520. goods_desc: '存货描述',
  521. goods_qty: 123456,
  522. goods_unit: 'kg',
  523. goods_price: 123456,
  524. goods_notes: '备注',
  525. goods_in: 123456,
  526. goods_out: 123456
  527. },
  528. error1: this.$t('stock.shelf.error1'),
  529. shelfLocal: '',
  530. activeTab: 'tab2'
  531. }
  532. },
  533. created () {
  534. this.shelfLocal = this.selectedShelfType
  535. this.handleclick()
  536. },
  537. methods: {
  538. prepareDialog () {
  539. this.onlyread = true
  540. },
  541. handleclick () {
  542. this.shelfLocal = this.selectedShelfType
  543. if (this.shelfLocal === 'undefined') {
  544. (this.clickedinput = true),
  545. (this.storage_dialog = false),
  546. (this.elevator_dialog = false),
  547. (this.conveyor_dialog = false)
  548. }
  549. if (this.shelfLocal === 'storage') {
  550. this.getList(),
  551. (this.clickedinput = false),
  552. (this.storage_dialog = true),
  553. (this.elevator_dialog = false),
  554. (this.conveyor_dialog = false)
  555. }
  556. if (this.shelfLocal === 'elevator') {
  557. this.getList(),
  558. (this.clickedinput = false),
  559. (this.storage_dialog = false),
  560. (this.elevator_dialog = true),
  561. (this.conveyor_dialog = false)
  562. }
  563. if (this.shelfLocal === 'conveyor') {
  564. this.getList(),
  565. (this.clickedinput = false),
  566. (this.storage_dialog = false),
  567. (this.elevator_dialog = false),
  568. (this.conveyor_dialog = true)
  569. }
  570. },
  571. getList () {
  572. var _this = this
  573. _this.storage_form = {
  574. shelf_name: '',
  575. shelf_department: '',
  576. shelf_warehouse: '',
  577. shelf_status: '',
  578. goods_code: '',
  579. goods_name: '',
  580. goods_std: '',
  581. goods_desc: '',
  582. goods_qty: 0,
  583. goods_unit: '',
  584. goods_price: 0,
  585. goods_batch: '',
  586. goods_notes: 0,
  587. goods_in: 0,
  588. goods_out: 0
  589. }
  590. _this.inventoryDetails = [
  591. {
  592. id: 1,
  593. batch: '',
  594. quantity: 0,
  595. location: ''
  596. },
  597. {
  598. id: 2,
  599. batch: '',
  600. quantity: 0,
  601. location: ''
  602. }
  603. ]
  604. getauth(_this.pathname + _this.goodsData.id + '/')
  605. .then((res1) => {
  606. console.log(res1)
  607. console.log(res1.current_containers)
  608. if (res1.current_containers.length === 0) {
  609. console.log('当前托盘ID为空')
  610. _this.$q.notify({
  611. message: '当前库位为空',
  612. icon: 'info',
  613. color: 'info'
  614. })
  615. return
  616. }
  617. _this.container_id = res1.current_containers[0].id
  618. console.log('当前托盘ID', _this.container_id)
  619. console.log('当前托盘ID长度', res1.current_containers.length)
  620. getauth(
  621. _this.pathnamecontainer + '?container=' + _this.container_id
  622. ).then((res) => {
  623. var results = res.results[0]
  624. this.storage_form.goods_batch = results.batch.bound_number
  625. this.storage_form.goods_code = results.batch.goods_code
  626. this.storage_form.goods_name = results.batch.goods_desc
  627. this.storage_form.goods_std = results.batch.goods_std
  628. this.storage_form.goods_desc = results.batch.goods_desc
  629. this.storage_form.goods_qty = results.batch.goods_qty
  630. this.storage_form.goods_unit = results.batch.goods_unit
  631. this.storage_form.goods_price = results.batch.goods_price
  632. this.storage_form.goods_notes = results.goods_qty
  633. this.storage_form.goods_in = results.batch.goods_in
  634. this.storage_form.goods_out = results.batch.goods_out
  635. this.storage_form.shelf_name = results.shelf_name
  636. this.storage_form.shelf_department = results.shelf_department
  637. this.storage_form.shelf_warehouse = results.warehouse_name
  638. this.storage_form.shelf_status = results.status
  639. })
  640. })
  641. .catch((err) => {
  642. _this.$q.notify({
  643. message: err.detail,
  644. icon: 'close',
  645. color: 'negative'
  646. })
  647. })
  648. }
  649. }
  650. }
  651. </script>
  652. <style scoped>
  653. :deep(.q-field__label) {
  654. margin-top: 8px;
  655. align-self: center;
  656. }
  657. :deep(.q-field__control-container) {
  658. padding-left: 50px;
  659. margin-top: -5px;
  660. }
  661. </style>