SweepCodeOutbound.vue 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650
  1. <template>
  2. <view>
  3. <view class="sweep_code_top">
  4. <view class="sweep_code_top_cont">
  5. <view class="clearfix">
  6. <view class="input-view float_left"><input type="number" placeholder="请输入商品条形码" placeholder-class="input-pl" v-model="bar_code" /></view>
  7. <view class="btn float_left" @click="getDetailByGoodsCode(bar_code)">确定</view>
  8. <view @click="scanCode" class="btn float_left"><text class="custom-icon custom-icon-scan"></text></view>
  9. </view>
  10. </view>
  11. </view>
  12. <view class="inventory">
  13. <view class="float_left">商品清单({{ out_detail.materielNum || 0 }})</view>
  14. </view>
  15. <view class="sweep_code-ul">
  16. <view class="sweep_code-li clearfix" v-for="(item, index) in goods_list" :key="index">
  17. <view class="clearfix logs-goods">
  18. <view class="float_left goods-img">
  19. <image :src="item.images[0]" mode="aspectFill"></image>
  20. <view class="all-tag" v-if="Number(item.notOutNum) === 0">全部出库</view>
  21. </view>
  22. <view class="float_left goods-info">
  23. <view class="goods-name ellipsis">{{ item.materielName }}</view>
  24. <view class="goods-sku" v-if="item.skuName">{{ item.skuName }}</view>
  25. <view class="goods-sku clearfix" @click="openwarehouse(index, item)">
  26. <text class="float_left">仓库</text>
  27. <view class="float_right ellipsis">
  28. <text style="margin-right: 20rpx;">{{ item.warehouseName || '请选择' }}</text>
  29. <u-icon name="arrow-down" size="24" color="#879BBA"></u-icon>
  30. </view>
  31. </view>
  32. <view class="goods-sku" v-if="enableLocationManagement === 5">
  33. <text class="float_left">库区库位</text>
  34. <view class="float_right" @click="openLocation(index, item, 'tip')">
  35. <text style="margin-right: 20rpx;" v-if="item.storageLocationName">{{ item.areaName }}-{{ item.storageLocationName }}</text>
  36. <text style="margin-right: 20rpx;" v-else>请选择</text>
  37. <u-icon name="arrow-down" size="24" color="#879BBA"></u-icon>
  38. </view>
  39. </view>
  40. </view>
  41. </view>
  42. <view class="bottom clearfix">
  43. <view class="float_left" :style="{ lineHeight: item.isPreSale === 5 ? '80rpx' : '36rpx' }">
  44. 待出库:
  45. <text class="num">{{ $utils.formatNub(item.total) }}</text>
  46. {{ item.unitName }}
  47. <view v-if="item.isPreSale !== 5" style="padding-top: 8rpx;">可售:{{ item.warehouseName ? $utils.formatNub(item.locationNum) : '请选择仓库' }}</view>
  48. </view>
  49. <view class="float_right">
  50. <text style="margin-right: 24rpx;">本次出库</text>
  51. <u-number-box :index="index" :min="0" :max="Number(item.maxOutNum)" :value="item.num" @change="numchange"></u-number-box>
  52. <!-- <u-number-box v-else :index="index" :min="0" :max="Number(item.total)" :value="item.num" @change="numchange"></u-number-box> -->
  53. </view>
  54. </view>
  55. </view>
  56. </view>
  57. <view class="submit-btn clearfix">
  58. <view class="submit-btn-left float_left" v-if="outMaterielNum > 0">
  59. <view class="other-info">商品:{{ outMaterielNum }}</view>
  60. <view class="other-info">数量:{{ outGoodsTotal }}</view>
  61. </view>
  62. <view class="submit-btn-left float_left" style="line-height: 98rpx;" v-else>出库商品为0</view>
  63. <view class="btn-right float_right" :class="[outMaterielNum < 1 ? 'btn-min-no' : '']" @click="nextPage">下一步</view>
  64. </view>
  65. <u-popup mode="center" width="680" border-radius="16" :height="popheight" v-model="warehouse_show">
  66. <view class="pop-view">
  67. <view class="title">选择仓库</view>
  68. <view class="goods-name">{{ goods_name }}</view>
  69. <scroll-view scroll-y class="warehouse-ul" :style="{ height: popheight - 230 + 'rpx' }">
  70. <view class="warehouse-li" v-for="(item, index) in warehouse_list" :key="index" @click="selWarehouse(item)">
  71. <view class="name">{{ item.warehouseName }}</view>
  72. <view class="num" v-if="item.unitName">可售库存:{{ $utils.formatNub(item.inventoryNum) }}{{ item.unitName }}</view>
  73. <view class="sel-icon" v-if="Number(item.inventoryNum) > 0 || !item.unitName">
  74. <u-icon
  75. :name="warehouse_arr.find(ware => ware.warehouseId === item.warehouseId) ? 'checkmark-circle-fill' : 'checkmark-circle'"
  76. :color="warehouse_arr.find(ware => ware.warehouseId === item.warehouseId) ? '#4076D6' : '#879bba'"
  77. size="38"
  78. ></u-icon>
  79. </view>
  80. </view>
  81. <u-empty v-if="!warehouse_list.length" text="暂无可选仓库" mode="list"></u-empty>
  82. </scroll-view>
  83. <view class="submit-btn"><u-button size="medium" type="primary" @click="selWarehouseConfirm">确定</u-button></view>
  84. </view>
  85. </u-popup>
  86. <u-popup mode="center" width="680" border-radius="16" :height="popheight" v-model="location_show">
  87. <view class="pop-view">
  88. <view class="pop-title">选择库区库位</view>
  89. <scroll-view scroll-y class="warehouse-ul" :style="{ height: popheight - 80 + 'rpx' }">
  90. <view class="warehouse-li" v-for="(item, index) in location_list" :key="index" @click="selLocation(item)">
  91. <view class="name">
  92. <text class="label">库区</text>
  93. {{ item.areaName }}
  94. </view>
  95. <view class="name">
  96. <text class="label">库位</text>
  97. {{ item.storageLocationName }}
  98. </view>
  99. <view class="num">可售库存:{{ $utils.formatNub(item.num) }}{{ item.unitName }}</view>
  100. <view class="sel-icon"><u-icon name="arrow-down" color="#879bba" size="28"></u-icon></view>
  101. </view>
  102. </scroll-view>
  103. <!-- <view class="submit-btn"><u-button size="medium" type="primary">确定</u-button></view> -->
  104. </view>
  105. </u-popup>
  106. <u-popup mode="center" width="680" border-radius="16" :height="popheight" v-model="goods_show">
  107. <view class="pop-view">
  108. <view class="pop-title">选择出库商品</view>
  109. <scroll-view scroll-y class="goods-ul" :style="{ height: popheight - 80 + 'rpx' }">
  110. <view class="goods-li clearfix" v-for="(item, index) in scan_goods_list" :key="index" @click="selGoods(item)">
  111. <view class="float_left goods-img"><image :src="item.images[0]" mode="aspectFill"></image></view>
  112. <view class="float_right goods-info">
  113. <view class="name-view ellipsis">{{ item.materielName }}</view>
  114. <view class="goods-sku">{{ item.unitName }};{{ item.skuName }}</view>
  115. </view>
  116. <view class="sel-icon"><u-icon name="checkmark-circle" color="#4076D6" size="38"></u-icon></view>
  117. </view>
  118. <u-empty v-if="!scan_goods_list.length" text="暂无可选仓库" mode="list"></u-empty>
  119. </scroll-view>
  120. <!-- <view class="submit-btn"><u-button size="medium" type="primary">确定</u-button></view> -->
  121. </view>
  122. </u-popup>
  123. </view>
  124. </template>
  125. <script>
  126. export default {
  127. data() {
  128. return {
  129. goods_show: false,
  130. warehouse_show: false,
  131. warehouse_list: [],
  132. location_list: [],
  133. location_show: false,
  134. bar_code: '',
  135. out_detail: {},
  136. bill_id: '',
  137. goods_list: [],
  138. popheight: '',
  139. skuId: '',
  140. goods_index: 0,
  141. warehouse_arr: [],
  142. goods_name: '',
  143. scan_goods_list: [],
  144. shop_warehouse_list: []
  145. };
  146. },
  147. computed: {
  148. enableLocationManagement() {
  149. return parseInt(this.$store.state.basicSet.enableLocationManagement);
  150. },
  151. // 出库商品种类
  152. outMaterielNum() {
  153. const list = this.goods_list.filter(item => item.num > 0).map(item => item.skuId);
  154. // [...new Set(list)] 用来去重
  155. return [...new Set(list)].length;
  156. },
  157. // 出库合计数量
  158. outGoodsTotal() {
  159. let num = 0;
  160. this.goods_list.forEach(item => {
  161. num = this.$NP.plus(Number(item.num), num);
  162. });
  163. return num;
  164. }
  165. },
  166. async onLoad(options) {
  167. // 设置弹窗的高度
  168. const systemInfo = uni.getSystemInfoSync();
  169. this.popheight = (systemInfo.screenHeight - systemInfo.statusBarHeight - 344) * systemInfo.pixelRatio + '';
  170. this.bill_id = options.id;
  171. await this.getInventoryOutInfo();
  172. await this.getShopBindWarehouse();
  173. },
  174. methods: {
  175. numchange(e) {
  176. const target = this.$u.deepClone(this.goods_list);
  177. target[e.index].num = e.value;
  178. // 统计当前已经出库的数量
  179. let otherOutnum = 0;
  180. let outnum = 0;
  181. target.forEach(item => {
  182. if (item.skuId === target[e.index].skuId) {
  183. outnum += item.num;
  184. if (item.warehouseId !== target[e.index].warehouseId) {
  185. otherOutnum += item.num;
  186. }
  187. }
  188. });
  189. if (target[e.index].isPreSale !== 5) {
  190. // 设置最大值
  191. let maxOutNum = 0;
  192. if (Number(target[e.index].locationNum) && Number(target[e.index].locationNum) > Number(target[e.index].total)) {
  193. maxOutNum = this.$NP.minus(target[e.index].total, otherOutnum);
  194. } else {
  195. // 如果剩余数量小于可售数量,则最大值为剩余数量
  196. if (this.$NP.minus(target[e.index].total, otherOutnum) <= target[e.index].locationNum) {
  197. maxOutNum = this.$NP.minus(target[e.index].total, otherOutnum);
  198. } else {
  199. maxOutNum = target[e.index].locationNum;
  200. }
  201. }
  202. target[e.index].maxOutNum = maxOutNum;
  203. } else {
  204. target[e.index].maxOutNum = this.$NP.minus(target[e.index].total, otherOutnum);
  205. }
  206. // 设置未出库数量
  207. target.forEach(item => {
  208. if (item.skuId === target[e.index].skuId) {
  209. item.notOutNum = this.$NP.minus(item.total, outnum) <= 0 ? 0 : this.$NP.minus(item.total, outnum);
  210. }
  211. });
  212. this.goods_list = target;
  213. },
  214. // 仓库确认按钮
  215. selWarehouseConfirm() {
  216. if (!this.warehouse_arr.length) {
  217. this.warehouse_show = false;
  218. return;
  219. }
  220. const arr = this.$u.deepClone(this.warehouse_arr).map(item => {
  221. let obj = {
  222. ...this.$u.deepClone(this.goods_list[this.goods_index]),
  223. warehouseName: item.warehouseName,
  224. warehouseId: item.warehouseId
  225. };
  226. if (this.goods_list[this.goods_index].isPreSale !== 5) {
  227. obj.locationNum = item.inventoryNum;
  228. obj.maxOutNum = item.inventoryNum;
  229. obj.notOutNum = item.inventoryNum;
  230. }
  231. return obj;
  232. });
  233. this.goods_list.splice(this.goods_index, 1, ...arr);
  234. this.warehouse_arr = [];
  235. this.warehouse_show = false;
  236. // 如果只选择了一个仓库,直接打开库区库位
  237. if (arr.length === 1) {
  238. this.getAreaDateBySkuId(arr[0].warehouseId);
  239. }
  240. },
  241. // 库存分布
  242. openwarehouse(index, item) {
  243. if (item.isPreSale === 5 || item.isDistribution === 5) {
  244. this.warehouse_list = this.$u.deepClone(this.shop_warehouse_list);
  245. this.warehouse_show = true;
  246. } else {
  247. this.goods_index = index;
  248. this.goods_name = item.materielName;
  249. this.skuId = item.skuId;
  250. this.$u.api.getWarehouseInventory(item.skuId).then(res => {
  251. this.warehouse_list = res.data;
  252. this.warehouse_show = true;
  253. });
  254. }
  255. },
  256. // 获取指定店铺绑定的所有仓库数据
  257. async getShopBindWarehouse() {
  258. await this.$u.api.getShopBindWarehouse(this.out_detail.shopId).then(res => {
  259. this.shop_warehouse_list = Object.values(res.data.warehouseData).map(item => {
  260. return {
  261. ...item,
  262. warehouseId: item.id
  263. };
  264. });
  265. // this.warehouse_show = true;
  266. });
  267. },
  268. // 仓库点击
  269. selWarehouse(item) {
  270. if (item.unitName && item.inventoryNum <= 0) {
  271. this.$u.toast('抱歉,当前仓库可售库存为0');
  272. return;
  273. }
  274. const index = this.warehouse_arr.findIndex(ware => ware.warehouseId === item.warehouseId);
  275. if (index > -1) {
  276. this.warehouse_arr.splice(index, 1);
  277. } else {
  278. this.warehouse_arr.push(item);
  279. }
  280. },
  281. // 打开库区库位弹窗
  282. openLocation(index, item, istip) {
  283. this.goods_index = index;
  284. this.skuId = item.skuId;
  285. this.getAreaDateBySkuId(item.warehouseId, istip);
  286. },
  287. // 可选的库位
  288. getAreaDateBySkuId(warehouseId, istip) {
  289. if (this.enableLocationManagement !== 5) {
  290. return;
  291. }
  292. this.$u.api
  293. .getAreaDateBySkuId({
  294. skuId: this.skuId,
  295. warehouseId: warehouseId
  296. })
  297. .then(res => {
  298. if (res.data.length) {
  299. this.location_list = res.data[0].areaDate;
  300. this.location_show = true;
  301. } else {
  302. if (istip) {
  303. this.$u.toast('该商品没有可选择的库位');
  304. }
  305. }
  306. });
  307. },
  308. // 选择库区库位
  309. selLocation(item) {
  310. this.location_show = false;
  311. const target = this.$u.deepClone(this.goods_list);
  312. let obj = {
  313. ...target[this.goods_index],
  314. areaCode: item.areaCode,
  315. areaId: item.areaId,
  316. areaName: item.areaName,
  317. storageLocationCode: item.storageLocationCode,
  318. storageLocationId: item.storageLocationId,
  319. storageLocationName: item.storageLocationName
  320. };
  321. if (target[this.goods_index].isPreSale !== 5) {
  322. obj.locationNum = item.num;
  323. obj.maxOutNum = item.num;
  324. obj.notOutNum = item.num;
  325. }
  326. this.goods_list[this.goods_index] = obj;
  327. },
  328. // 扫码
  329. scanCode() {
  330. uni.showLoading();
  331. uni.scanCode({
  332. success: res => {
  333. uni.hideLoading();
  334. console.log('条码内容:' + res.result);
  335. this.getDetailByGoodsCode(res.result);
  336. },
  337. fail: () => {
  338. uni.hideLoading();
  339. }
  340. });
  341. },
  342. getDetailByGoodsCode(barCode) {
  343. this.$u.api
  344. .getDetailByGoodsCode({
  345. id: this.bill_id,
  346. barCode: barCode
  347. })
  348. .then(res => {
  349. if (!Array.isArray(res.data) || !res.data.length) {
  350. this.$u.toast('此条码无对应商品或非本次出库商品');
  351. return;
  352. }
  353. if (res.data.length === 1) {
  354. const row = res.data[0];
  355. const index = this.goods_list.findIndex(item => item.skuId === row.skuId);
  356. this.openwarehouse(index, row);
  357. } else {
  358. this.scan_goods_list = res.data;
  359. // 打开选择商品弹窗
  360. this.goods_show = true;
  361. }
  362. });
  363. },
  364. // 选择商品
  365. selGoods(row) {
  366. const index = this.goods_list.findIndex(item => item.skuId === row.skuId);
  367. this.openwarehouse(index, row);
  368. this.goods_show = false;
  369. },
  370. // 出库单详情
  371. async getInventoryOutInfo() {
  372. await this.$u.api.getInventoryOutInfo(this.bill_id).then(res => {
  373. this.out_detail = res.data;
  374. this.goods_list = res.data.details.map(item => {
  375. return {
  376. ...item,
  377. num: 0,
  378. maxOutNum: item.total, //最大出库量
  379. notOutNum: item.total
  380. };
  381. });
  382. });
  383. },
  384. // 下一步
  385. nextPage() {
  386. // d当前出库数量为0,不允许点击下一步
  387. if (this.outMaterielNum < 1) {
  388. return;
  389. }
  390. const isNum = this.goods_list.some(item => {
  391. return item.warehouseId && !item.num;
  392. });
  393. if (isNum) {
  394. this.$u.toast('选择仓库后请输入本次出库数量');
  395. return;
  396. }
  397. // 存储数据跳到下一个页面
  398. this.out_detail.details = this.goods_list;
  399. uni.setStorageSync('outDetail', this.out_detail);
  400. this.goPage('/pagesT/stock/OutgoingGoodsInventory');
  401. }
  402. }
  403. };
  404. </script>
  405. <style lang="scss" scoped>
  406. .sweep_code_top {
  407. width: 100%;
  408. height: 400rpx;
  409. background-color: rgb(50, 57, 63);
  410. color: #fff;
  411. position: relative;
  412. .sweep_code_top_cont {
  413. position: absolute;
  414. top: 50%;
  415. left: 50%;
  416. transform: translate(-50%, -50%);
  417. text-align: center;
  418. width: 600rpx;
  419. .input-view {
  420. padding-left: 20rpx;
  421. width: 340rpx;
  422. height: 60rpx;
  423. background-color: rgb(106, 111, 115);
  424. input {
  425. color: #ffffff;
  426. height: 60rpx;
  427. line-height: 60rpx;
  428. text-align: left;
  429. }
  430. }
  431. .btn {
  432. border-right: 1px solid #cccccc;
  433. width: 130rpx;
  434. height: 60rpx;
  435. line-height: 60rpx;
  436. text-align: center;
  437. background-color: rgb(64, 118, 214);
  438. &:last-child {
  439. border-right: 0 none;
  440. }
  441. .custom-icon-scan {
  442. font-size: 40rpx;
  443. color: #ffffff;
  444. }
  445. }
  446. }
  447. }
  448. .inventory {
  449. width: 100%;
  450. height: 80rpx;
  451. line-height: 80rpx;
  452. background-color: #fff;
  453. padding: 0 30rpx;
  454. }
  455. .sweep_code-ul {
  456. padding-bottom: 130rpx;
  457. .sweep_code-li {
  458. margin-top: 20rpx;
  459. width: 100%;
  460. background-color: #ffffff;
  461. padding-top: 24rpx;
  462. .logs-goods {
  463. position: relative;
  464. }
  465. .goods-img {
  466. position: relative;
  467. width: 150rpx;
  468. height: 150rpx;
  469. margin-right: 20rpx;
  470. margin-left: 24rpx;
  471. border-radius: 10rpx;
  472. overflow: hidden;
  473. .all-tag {
  474. line-height: 36rpx;
  475. height: 36rpx;
  476. background-color: #2dc584;
  477. text-align: center;
  478. width: 100%;
  479. color: #ffffff;
  480. font-size: 22rpx;
  481. position: absolute;
  482. left: 0;
  483. bottom: 0;
  484. }
  485. image {
  486. width: 100%;
  487. height: 100%;
  488. display: block;
  489. }
  490. }
  491. .goods-info {
  492. width: 520rpx;
  493. .goods-name {
  494. height: 40rpx;
  495. line-height: 40rpx;
  496. }
  497. .goods-sku {
  498. padding-top: 10rpx;
  499. color: #879bba;
  500. font-size: 24rpx;
  501. .float_right {
  502. text-align: right;
  503. width: 400rpx;
  504. border-bottom: 1px solid $uni-color-primary;
  505. }
  506. }
  507. }
  508. }
  509. .bottom {
  510. margin-top: 20rpx;
  511. border-top: 1px solid #eeeeee;
  512. height: 80rpx;
  513. line-height: 80rpx;
  514. padding: 0 24rpx;
  515. .float_left {
  516. color: #879bba;
  517. width: 320rpx;
  518. font-size: 22rpx;
  519. .num {
  520. font-size: 26rpx;
  521. color: #2d405e;
  522. }
  523. }
  524. .float_right {
  525. font-size: 26rpx;
  526. }
  527. }
  528. }
  529. .submit-btn {
  530. padding: 0;
  531. .submit-btn-left {
  532. padding-left: 24rpx;
  533. color: #879bba;
  534. .other-info {
  535. font-size: 24rpx;
  536. line-height: 46rpx;
  537. }
  538. }
  539. .btn-right {
  540. text-align: center;
  541. width: 300rpx;
  542. color: #ffffff;
  543. background-color: $uni-color-primary;
  544. line-height: 98rpx;
  545. border-radius: 0;
  546. &.btn-min-no {
  547. background-color: #879bba;
  548. }
  549. }
  550. }
  551. .pop-view {
  552. position: relative;
  553. height: 100%;
  554. .pop-title {
  555. text-align: center;
  556. line-height: 80rpx;
  557. border-bottom: 1px solid #ecf0f7;
  558. }
  559. .title {
  560. text-align: center;
  561. line-height: 36rpx;
  562. padding-top: 20rpx;
  563. }
  564. .goods-name {
  565. font-size: 22rpx;
  566. color: #879bba;
  567. line-height: 36rpx;
  568. text-align: center;
  569. padding-bottom: 20rpx;
  570. border-bottom: 1px solid #ecf0f7;
  571. }
  572. .warehouse-ul {
  573. .warehouse-li {
  574. padding: 20rpx;
  575. border-bottom: 1px solid #ecf0f7;
  576. line-height: 40rpx;
  577. position: relative;
  578. .name {
  579. .label {
  580. color: #879bba;
  581. margin-right: 20rpx;
  582. }
  583. }
  584. .num {
  585. color: #879bba;
  586. }
  587. .sel-icon {
  588. position: absolute;
  589. top: 50%;
  590. right: 20rpx;
  591. transform: translateY(-50%);
  592. }
  593. }
  594. }
  595. .submit-btn {
  596. position: absolute;
  597. width: 100%;
  598. bottom: 0;
  599. left: 0;
  600. text-align: center;
  601. padding: 20rpx 0;
  602. }
  603. .goods-ul {
  604. .goods-li {
  605. border-bottom: 1px solid #ecf0f7;
  606. padding: 20rpx;
  607. position: relative;
  608. .goods-img {
  609. margin-right: 20rpx;
  610. image {
  611. width: 120rpx;
  612. height: 120rpx;
  613. border-radius: 10rpx;
  614. background-color: #f5f5f5;
  615. }
  616. }
  617. .goods-info {
  618. width: 490rpx;
  619. .name-view {
  620. margin-bottom: 10rpx;
  621. }
  622. .goods-sku {
  623. color: #879bba;
  624. }
  625. }
  626. .sel-icon {
  627. position: absolute;
  628. top: 50%;
  629. right: 20rpx;
  630. transform: translateY(-50%);
  631. }
  632. }
  633. }
  634. }
  635. </style>