goodscard.vue 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435
  1. <template>
  2. <div :style="{ backgroundColor: bgColor }">
  3. <q-dialog v-model="storage_dialog" transition-show="jump-down" transition-hide="jump-up" @show=prepareDialog()>
  4. <q-card style="min-width: 600px; ">
  5. <q-bar class="bg-light-blue-10 text-white rounded-borders" style="height: 50px">
  6. <div>
  7. {{ $t("stock.shelf.shelf_details") }} {{ rowIndex }}-{{ colIndex }}-{{layerIndex}}
  8. </div>
  9. <q-space></q-space>
  10. <q-btn dense flat icon="close" v-close-popup>
  11. <q-tooltip content-class="bg-amber text-black shadow-4" :offset="[20, 20]"
  12. content-style="font-size: 12px">
  13. {{ $t("index.close") }}</q-tooltip>
  14. </q-btn>
  15. </q-bar>
  16. <q-card-section class="q-pt-md ">
  17. <q-tabs v-model="activeTab">
  18. <q-tab name="tab1" label="货架属性" />
  19. <q-tab name="tab2" label="批次信息" />
  20. <q-tab name="tab3" label="库存明细" />
  21. </q-tabs>
  22. </q-card-section>
  23. <!-- 选项卡内容 -->
  24. <q-tab-panels v-model="activeTab" animated>
  25. <q-tab-panel name="tab1" style="height:300px">
  26. <div class="row q-gutter-x-md">
  27. <div class="col column q-gutter-y-md">
  28. <q-input dense outlined square v-model="storage_form.goods_code"
  29. :label="$t('stock.shelf.goods_code')" :readonly="onlyread"
  30. :rules="[val => val?.length > 0 || error1]" />
  31. </div>
  32. <div class="col column q-gutter-y-md">
  33. <q-input dense outlined square v-model="storage_form.goods_name"
  34. :label="$t('stock.shelf.goods_name')" :readonly="onlyread"
  35. :rules="[val => val?.length > 0 || error1]" />
  36. </div>
  37. </div>
  38. </q-tab-panel>
  39. <q-tab-panel name="tab2" style="height:300px">
  40. <div class="row q-gutter-x-md">
  41. <div class="col column q-gutter-y-md">
  42. <q-input dense outlined square v-model="storage_form.goods_code"
  43. :label="$t('stock.shelf.goods_code')" :readonly="onlyread"
  44. :rules="[val => val?.length > 0 || error1]" />
  45. <q-input dense outlined square v-model="storage_form.goods_batch"
  46. :label="$t('stock.shelf.goods_batch')" :readonly="onlyread"
  47. :rules="[val => val?.length > 0 || error1]" />
  48. <q-input dense outlined square v-model="storage_form.goods_qty"
  49. :label="'批次总数'" :readonly="onlyread"
  50. :rules="[val => val >= 0 || error1]" class="col" />
  51. <q-input dense outlined square v-model="storage_form.goods_desc"
  52. :label="$t('stock.shelf.goods_desc')" :readonly="onlyread"
  53. :rules="[val => val?.length > 0 || error1]" />
  54. </div>
  55. <div class="col column q-gutter-y-md">
  56. <q-input dense outlined square v-model="storage_form.goods_name"
  57. :label="$t('stock.shelf.goods_name')" :readonly="onlyread"
  58. :rules="[val => val?.length > 0 || error1]" />
  59. <q-input dense outlined square v-model="storage_form.goods_std"
  60. :label="$t('stock.shelf.goods_std')" :readonly="onlyread"
  61. :rules="[val => val?.length > 0 || error1]" />
  62. <q-input dense outlined square v-model="storage_form.goods_notes"
  63. :label="'库位容纳'" :readonly="onlyread"
  64. :rules="[val => val >= 0 || error1]" class="col" />
  65. <q-input dense outlined square v-model="storage_form.goods_unit"
  66. :label="$t('stock.shelf.goods_unit')" :readonly="onlyread"
  67. :rules="[val => val?.length > 0 || error1]" />
  68. </div>
  69. </div>
  70. </q-tab-panel>
  71. <q-tab-panel name="tab3" style="height:300px">
  72. <div class="row q-gutter-x-md">
  73. <div class="col column q-gutter-y-md">
  74. </div>
  75. <div class="col column q-gutter-y-md"></div>
  76. </div>
  77. </q-tab-panel>
  78. </q-tab-panels>
  79. <div style="position: absolute; right: 20px; bottom: 12px; z-index: 100">
  80. <q-btn-group push>
  81. <q-btn color="white" text-color="black" @click="shelfLocal = 'undefined'; handleclick()">
  82. {{ $t('stock.return') }}
  83. </q-btn>
  84. <q-btn color="white" text-color="black" @click="showInventoryDetails = !showInventoryDetails">
  85. {{ $t('stock.details') }}
  86. </q-btn>
  87. <q-btn color="primary" text-color="white" @click=handleEdit()>
  88. {{ onlyread ? $t('stock.shelf.shelf_edit') : $t("stock.shelf.shelf_confirm") }}
  89. </q-btn>
  90. </q-btn-group>
  91. </div>
  92. <div style="float: right; padding: 15px 15px 50px 15px ;min-width: 100%" flow="row wrap">
  93. <q-card class="q-mb-md" bordered v-if="showInventoryDetails">
  94. <q-card-actions class="q-px-none"
  95. style="position: absolute; right: 20px; top: 10px; z-index: 100">
  96. <q-btn v-if="!onlyread" @click=addInventoryDetail() icon="add" flat dense color="primary"
  97. :label="$t('stock.add')" />
  98. <q-btn v-if="!onlyread" @click=deleteInventoryDetail() icon="delete" flat dense
  99. color="primary" :label="$t('stock.delete')" />
  100. </q-card-actions>
  101. <q-card-section>
  102. <div class="text-h6 q-mb-md">{{ $t('stock.inventory_details') }}</div>
  103. <!-- 动态生成的输入行 -->
  104. <div v-for="(detail, index) in inventoryDetails" :key="index"
  105. class="row q-col-gutter-md q-mb-sm">
  106. <div class="col">
  107. <q-input v-model="detail.id" :label="$t('stock.batch')" :readonly="onlyread" dense
  108. outlined />
  109. </div>
  110. <div class="col">
  111. <q-input v-model="detail.quantity" :label="$t('stock.quantity')"
  112. :readonly="onlyread" type="number" dense outlined />
  113. </div>
  114. <div class="col">
  115. <q-input v-model="detail.location" :label="$t('stock.location')"
  116. :readonly="onlyread" dense standout outlined />
  117. </div>
  118. </div>
  119. </q-card-section>
  120. </q-card>
  121. </div>
  122. </q-card>
  123. </q-dialog>
  124. <q-dialog v-model="elevator_dialog" transition-show="jump-down" transition-hide="jump-up" @show=prepareDialog()>
  125. <q-card style="min-width: 350px;">
  126. <q-bar class="bg-light-blue-10 text-white rounded-borders" style="height: 50px">
  127. <div>
  128. {{ $t("stock.elevator.elevator") }}
  129. </div>
  130. <q-space></q-space>
  131. <q-btn dense flat icon="close" v-close-popup>
  132. <q-tooltip content-class="bg-amber text-black shadow-4" :offset="[20, 20]"
  133. content-style="font-size: 12px">
  134. {{ $t("index.close") }}</q-tooltip>
  135. </q-btn>
  136. </q-bar>
  137. <q-card-section class="q-pt-md">
  138. <q-input dense outlined square v-model="elevator_form.ip" :label="$t('stock.elevator.ip')"
  139. :readonly="onlyread" :rules="[val => val?.length > 0 || error1]" />
  140. <q-input dense outlined square v-model="elevator_form.port" :label="$t('stock.elevator.port')"
  141. type="number" :readonly="onlyread" :rules="[
  142. val => val !== null || error1,
  143. val => val >= 0 || error1,
  144. ]" />
  145. <q-input dense outlined square v-model="elevator_form.status" :label="$t('stock.conveyor.status')"
  146. :readonly="onlyread" :rules="[val => val?.length > 0 || error1]" />
  147. <!-- <q-input dense outlined square v-model="elevator_form.password"
  148. :label="$t('stock.elevator.password')" :readonly="onlyread"
  149. :rules="[val => val?.length > 0 || error1]" /> -->
  150. <!-- <q-input dense outlined square v-model="elevator_form.username"
  151. :label="$t('stock.elevator.username')" :readonly="onlyread"
  152. :rules="[val => val?.length > 0 || error1]" /> -->
  153. </q-card-section>
  154. <div style="float: right; padding: 15px 15px 15px 0">
  155. <q-btn color="white" text-color="black" style="margin-right: 25px"
  156. @click="shelfLocal = 'undefined'; handleclick()">
  157. {{ $t('stock.return') }}</q-btn>
  158. <q-btn color="primary" text-color="white" style="margin-right: 25px" @click=handleEdit()>
  159. {{ onlyread ? $t('stock.shelf.shelf_edit') : $t("stock.shelf.shelf_confirm") }}</q-btn>
  160. </div>
  161. </q-card>
  162. </q-dialog>
  163. <q-dialog v-model="conveyor_dialog" transition-show="jump-down" transition-hide="jump-up" @show=prepareDialog()>
  164. <q-card style="min-width: 350px;">
  165. <q-bar class="bg-light-blue-10 text-white rounded-borders" style="height: 50px">
  166. <div>
  167. {{ $t("stock.conveyor.conveyor") }}
  168. </div>
  169. <q-space></q-space>
  170. <q-btn dense flat icon="close" v-close-popup>
  171. <q-tooltip content-class="bg-amber text-black shadow-4" :offset="[20, 20]"
  172. content-style="font-size: 12px">
  173. {{ $t("index.close") }}</q-tooltip>
  174. </q-btn>
  175. </q-bar>
  176. <q-card-section class="q-pt-md">
  177. <q-input dense outlined square v-model="conveyor_form.ip" :label="$t('stock.conveyor.ip')"
  178. :readonly="onlyread" :rules="[val => val?.length > 0 || error1]" />
  179. <!-- <q-input dense outlined square v-model="conveyor_form.destination"
  180. :label="$t('stock.conveyor.destination')" :readonly="onlyread"
  181. :rules="[val => val?.length > 0 || error1]" /> -->
  182. <q-input dense outlined square v-model="conveyor_form.port" :label="$t('stock.elevator.port')"
  183. type="number" :readonly="onlyread" :rules="[
  184. val => val !== null || error1,
  185. val => val >= 0 || error1,
  186. ]" />
  187. <q-input dense outlined square v-model="conveyor_form.status" :label="$t('stock.conveyor.status')"
  188. :readonly="onlyread" :rules="[val => val?.length > 0 || error1]" />
  189. </q-card-section>
  190. <div style="float: right; padding: 15px 15px 15px 0">
  191. <q-btn color="white" text-color="black" style="margin-right: 25px"
  192. @click="shelfLocal = 'undefined'; handleclick()">
  193. {{ $t('stock.return') }}</q-btn>
  194. <q-btn color="primary" text-color="white" style="margin-right: 25px" @click=handleEdit()>
  195. {{ onlyread ? $t('stock.shelf.shelf_edit') : $t("stock.shelf.shelf_confirm") }}</q-btn>
  196. </div>
  197. </q-card>
  198. </q-dialog>
  199. </div>
  200. </template>
  201. <script>
  202. import { getauth } from 'boot/axios_request'
  203. export default {
  204. props: {
  205. rowIndex: Number,
  206. colIndex: Number,
  207. layerIndex: Number,
  208. selectedShelfType: String,
  209. goodsData: Object
  210. },
  211. data () {
  212. return {
  213. pathname: 'bin/',
  214. pathnamecontainer: 'container/detail/',
  215. container_id: 123456,
  216. results: [],
  217. storage_form: {
  218. shelf_name: '',
  219. shelf_department: '',
  220. shelf_warehouse: '',
  221. shelf_status: '',
  222. goods_code: '',
  223. goods_name: '',
  224. goods_std: '',
  225. goods_desc: '',
  226. goods_qty: '',
  227. goods_unit: '',
  228. goods_price: '',
  229. goods_batch: '',
  230. goods_notes: '',
  231. goods_in: '',
  232. goods_out: ''
  233. },
  234. elevator_form: {
  235. ip: '',
  236. port: 8080,
  237. // username: 'admin',
  238. // password: '123456',
  239. status: '未连接'
  240. },
  241. conveyor_form: {
  242. ip: '',
  243. port: 8080,
  244. // destination: 'A010203',
  245. status: '未连接'
  246. },
  247. showInventoryDetails: false,
  248. inventoryDetails: [
  249. {
  250. id: 1,
  251. batch: '',
  252. quantity: 0,
  253. location: ''
  254. },
  255. {
  256. id: 2,
  257. batch: '',
  258. quantity: 0,
  259. location: ''
  260. }
  261. ],
  262. inventoryColumns: [
  263. { name: 'batch', label: '批次', field: 'batch', align: 'left' },
  264. { name: 'quantity', label: '数量', field: 'quantity', align: 'right' },
  265. { name: 'location', label: '位置', field: 'location', align: 'left' }
  266. ],
  267. user_id: '',
  268. auth_id: '',
  269. onlyread: true,
  270. clickedinput: false,
  271. storage_dialog: false,
  272. elevator_dialog: false,
  273. conveyor_dialog: false,
  274. bgColor: 'transparent',
  275. shelf_type: { shelf_type: 'undefined' },
  276. ip_change: { ip_address: '192.168.1.100', port: 8080, status: 'offline' },
  277. goods_change: { shelf_status: '未满', goods_batch: '20230701-001', goods_code: 'A010203', goods_name: '存货货物', goods_std: '规格型号', goods_desc: '存货描述', goods_qty: 123456, goods_unit: 'kg', goods_price: 123456, goods_notes: '备注', goods_in: 123456, goods_out: 123456 },
  278. error1: this.$t('stock.shelf.error1'),
  279. shelfLocal: '',
  280. activeTab: 'tab2'
  281. }
  282. },
  283. created () {
  284. this.shelfLocal = this.selectedShelfType
  285. this.handleclick()
  286. },
  287. methods: {
  288. prepareDialog () {
  289. this.onlyread = true
  290. },
  291. handleclick () {
  292. this.shelfLocal = this.selectedShelfType
  293. if (this.shelfLocal === 'undefined') { this.clickedinput = true, this.storage_dialog = false, this.elevator_dialog = false, this.conveyor_dialog = false }
  294. if (this.shelfLocal === 'storage') { this.getList(), this.clickedinput = false, this.storage_dialog = true, this.elevator_dialog = false, this.conveyor_dialog = false }
  295. if (this.shelfLocal === 'elevator') { this.getList(), this.clickedinput = false, this.storage_dialog = false, this.elevator_dialog = true, this.conveyor_dialog = false }
  296. if (this.shelfLocal === 'conveyor') { this.getList(), this.clickedinput = false, this.storage_dialog = false, this.elevator_dialog = false, this.conveyor_dialog = true }
  297. },
  298. getList () {
  299. var _this = this
  300. _this.storage_form = {
  301. shelf_name: '',
  302. shelf_department: '',
  303. shelf_warehouse: '',
  304. shelf_status: '',
  305. goods_code: '',
  306. goods_name: '',
  307. goods_std: '',
  308. goods_desc: '',
  309. goods_qty: 0,
  310. goods_unit: '',
  311. goods_price: 0,
  312. goods_batch: '',
  313. goods_notes: 0,
  314. goods_in: 0,
  315. goods_out: 0
  316. }
  317. _this.inventoryDetails = [
  318. {
  319. id: 1,
  320. batch: '',
  321. quantity: 0,
  322. location: ''
  323. },
  324. {
  325. id: 2,
  326. batch: '',
  327. quantity: 0,
  328. location: ''
  329. }
  330. ]
  331. getauth(_this.pathname + _this.goodsData.id + '/')
  332. .then(res1 => {
  333. console.log(res1)
  334. console.log(res1.current_containers)
  335. if (res1.current_containers.length == 0) {
  336. console.log('当前托盘ID为空')
  337. _this.$q.notify({
  338. message: '当前库位为空',
  339. icon: 'info',
  340. color: 'info'
  341. })
  342. return
  343. }
  344. _this.container_id = res1.current_containers[0].id
  345. console.log('当前托盘ID', _this.container_id)
  346. console.log('当前托盘ID长度', res1.current_containers.length)
  347. getauth(_this.pathnamecontainer + '?container=' + _this.container_id)
  348. .then(res => {
  349. var results = res.results[0]
  350. this.storage_form.goods_batch = results.batch.bound_number
  351. this.storage_form.goods_code = results.batch.goods_code
  352. this.storage_form.goods_name = results.batch.goods_desc
  353. this.storage_form.goods_std = results.batch.goods_std
  354. this.storage_form.goods_desc = results.batch.goods_desc
  355. this.storage_form.goods_qty = results.batch.goods_qty
  356. this.storage_form.goods_unit = results.batch.goods_unit
  357. this.storage_form.goods_price = results.batch.goods_price
  358. this.storage_form.goods_notes = results.goods_qty
  359. this.storage_form.goods_in = results.batch.goods_in
  360. this.storage_form.goods_out = results.batch.goods_out
  361. this.storage_form.shelf_name = results.shelf_name
  362. this.storage_form.shelf_department = results.shelf_department
  363. this.storage_form.shelf_warehouse = results.warehouse_name
  364. this.storage_form.shelf_status = results.status
  365. }
  366. )
  367. }).catch(err => {
  368. _this.$q.notify({
  369. message: err.detail,
  370. icon: 'close',
  371. color: 'negative'
  372. })
  373. })
  374. }
  375. }
  376. }
  377. </script>
  378. <style scoped>
  379. :deep(.q-field__label) {
  380. margin-top: 8px;
  381. align-self: center;
  382. }
  383. :deep(.q-field__control-container) {
  384. padding-left: 50px;
  385. margin-top: -5px;
  386. }
  387. </style>