warehousingSign.vue 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828
  1. <template>
  2. <gui-page :custom-header="true" :header-class="['gui-theme-background-color']">
  3. <template #gHeader>
  4. <view style="height:44px;" class="gui-flex gui-nowrap gui-rows gui-align-items-center">
  5. <!-- 使用组件实现返回按钮及返回首页按钮 -->
  6. <text style="font-size:44rpx;" class="gui-header-leader-btns gui-color-white font-icons"
  7. @tap="goBack">&#xe6c5;</text>
  8. <!-- 导航文本此处也可以是其他自定义内容 -->
  9. <text
  10. class="gui-h4 gui-blod gui-flex1 gui-text-center gui-ellipsis gui-color-white gui-primary-text">入库签收</text>
  11. <!-- 此处加一个右侧展位元素与左侧同宽,实现标题居中 -->
  12. <!-- 实际宽度请根据自己情况设置 -->
  13. <view style="width:40px;" />
  14. <!-- 如果右侧有其他内容可以利用条件编译和定位来实现-->
  15. </view>
  16. </template>
  17. <template #gBody>
  18. <view class="list-content">
  19. <view class="scan">
  20. <view class="scan-card">
  21. <uni-easyinput ref="easyinput" v-model="scanNumber" :input-border="false" :clearable="false"
  22. type="text" focus @focus="handleInputFocus" placeholder="扫描完成品标签"
  23. @confirm="handleKeydown" />
  24. <text class="font-icons" @click="handleMapass">&#xe6b7;</text>
  25. </view>
  26. </view>
  27. <view class="scan">
  28. <view class="scan-card">
  29. <uni-easyinput ref="easyinput" v-model="employeeNum" :input-border="false" :clearable="false"
  30. type="text" focus @focus="handleInputFocus" placeholder="扫描/输入员工号签收"
  31. @confirm="handleInputPerson" />
  32. <text class="font-icons" @click="handleScanPerson">&#xe6b7;</text>
  33. </view>
  34. </view>
  35. <view class="scan">
  36. <view class="scan-card">
  37. <uni-easyinput ref="easyinput" v-model="storeNum" :input-border="false" :clearable="false"
  38. type="text" focus @focus="handleInputFocus" placeholder="请扫描库位信息" @confirm="handleInputStore" />
  39. <view style="display: flex; flex-direction: row;">
  40. <text class="font-icons" @click="selectModal.open('center')">&#xe6a8;</text>
  41. <text class="font-icons" @click="handleScanStore">&#xe6b7;</text>
  42. </view>
  43. </view>
  44. </view>
  45. <view class="store-list">
  46. <uni-row>
  47. <uni-col :span='3'>仓库:</uni-col>
  48. <uni-col :span='9'>{{ stockName }}</uni-col>
  49. <uni-col :span='3'>区域:</uni-col>
  50. <uni-col :span='9'>{{ areaName }}</uni-col>
  51. </uni-row>
  52. <uni-row>
  53. <uni-col :span='3'>货位:</uni-col>
  54. <uni-col :span='9'>{{ locationName }}</uni-col>
  55. </uni-row>
  56. </view>
  57. <view class="table-title">
  58. <span>入库需求清单</span>
  59. </view>
  60. <view class="custom-table">
  61. <view v-if="submitList?.length > 0" class="list-panel">
  62. <div v-for="(item, key) in submitList" :key="key" class="panel"
  63. @click="handleCheckedCard(item)">
  64. <div class="panel-row">
  65. <span>{{ item.workOrderNo }}</span>
  66. </div>
  67. <div class="panel-row">
  68. <span>产品</span>
  69. <span>{{ item.productCode }}({{ item.productName }})</span>
  70. </div>
  71. <div class="panel-row">
  72. <span>数量</span>
  73. <span>{{ item.inQty }}</span>
  74. </div>
  75. <div class="tag-icon" v-if="item.checked">
  76. <div>✓️️</div>
  77. </div>
  78. </div>
  79. </view>
  80. <view v-else>
  81. <view class="bg-image">
  82. <image src="@/static/empty.png" mode="heightFix" />
  83. <text>这里什么都没有...</text>
  84. </view>
  85. </view>
  86. </view>
  87. <view v-if="submitList?.length > 0" class="card-list-item"
  88. style="margin: 12px 0;display: grid;grid-template-columns: 1fr;grid-template-rows: 1fr;"
  89. @click="handleBtnLight">
  90. <view class="sign-btn">
  91. <text
  92. :style="['font-size: 14px;font-weight: bold;', isLightText?'color: rgba(0, 160, 233, 1)':'']">PDA签收</text>
  93. <view style="width: 0px;">
  94. <uni-easyinput ref="signInput" v-model="signText" @focus="handleInputFocus"
  95. :input-border="false" :clearable="false" type="text" @confirm="handleComplete" />
  96. </view>
  97. </view>
  98. </view>
  99. <view v-if="submitList?.length === 0" class="card-list-item"
  100. style="margin: 12px 0;display: grid;grid-template-columns: 1fr;grid-template-rows: 1fr;">
  101. <view class="sign-btn">
  102. <text style="font-size: 14px;font-weight: bold;color: gray;">PDA签收</text>
  103. <view style="width: 0px;">
  104. <uni-easyinput ref="signInput" @focus="handleInputFocus" :input-border="false"
  105. :clearable="false" type="text" />
  106. </view>
  107. </view>
  108. </view>
  109. </view>
  110. <uni-popup ref="selectModal" type="dialog">
  111. <uni-popup-dialog type="warn" cancel-text="取消" confirm-text="确认" title="手动分配货位" content="提示"
  112. @confirm="selectModal.close()" @close="selectModal.close()">
  113. <!-- eslint-disable-next-line -->
  114. <template #default="custom">
  115. <view class="select-group">
  116. <view class="select-item">
  117. <text class="store-text">仓库</text>
  118. <view class="custom-select">
  119. <uni-data-select v-model="stockCode" :localdata="warehouseList"
  120. @change="handleSelectWareHouse" />
  121. </view>
  122. </view>
  123. <view class="select-item">
  124. <text class="store-text">区域</text>
  125. <view class="custom-select">
  126. <uni-data-select v-model="areaCode" :localdata="regionList"
  127. @change="handleSelectRegion" />
  128. </view>
  129. </view>
  130. <view class="select-item">
  131. <text class="store-text">货位</text>
  132. <view class="custom-select">
  133. <uni-data-select v-model="locationCode" :localdata="locationList"
  134. @change="handleSelectLocation" />
  135. </view>
  136. </view>
  137. </view>
  138. </template>
  139. </uni-popup-dialog>
  140. </uni-popup>
  141. <uni-popup ref="errorTip" type="dialog">
  142. <uni-popup-dialog type="error" cancel-text="关闭" confirm-text="确认" title="提示" :content="errorTipMessage"
  143. @confirm="handleCloseErrorTipsModal" @close="handleCloseErrorTipsModal" />
  144. </uni-popup>
  145. </template>
  146. </gui-page>
  147. </template>
  148. <script>
  149. import {
  150. defineComponent,
  151. onMounted,
  152. reactive,
  153. ref,
  154. computed,
  155. toRefs,
  156. onBeforeMount
  157. } from 'vue'
  158. import {
  159. storeToRefs
  160. } from 'pinia';
  161. import {
  162. useSetWareHouseStore
  163. } from '@/stores/useSetWareHouseStore.js';
  164. export default defineComponent({
  165. setup() {
  166. const selectModal = ref('')
  167. const modalForm = ref('')
  168. const easyinput = ref()
  169. const errorState = ref(0)
  170. const errorTip = ref('')
  171. const errorTipMessage = ref('')
  172. const submitList = ref([])
  173. const scanNumber = ref('')
  174. const signInput = ref()
  175. const signText = ref('')
  176. // 员工号
  177. const employeeNum = ref('')
  178. const isLightText = ref('')
  179. const checkedList = ref([])
  180. // 货位
  181. const storeNum = ref('')
  182. const storeValues = reactive({
  183. stockCode: '',
  184. stockName: '',
  185. areaCode: '',
  186. areaName: '',
  187. locationCode: '',
  188. locationName: ''
  189. })
  190. const regionList = ref([])
  191. const warehouseList = ref([])
  192. const locationList = ref([])
  193. const store = useSetWareHouseStore();
  194. const computedStock = computed(() => {
  195. return item => warehouseList.value.find(opt => opt.id === item)?.text
  196. })
  197. const computedStore = computed(() => {
  198. return item => {
  199. return locationList.value.find(opt => opt.id === item)?.text
  200. }
  201. })
  202. const computedStoreArea = computed(() => {
  203. return item => regionList.value.find(opt => opt.id === item)?.text
  204. })
  205. onBeforeMount(() => {
  206. warehouseList.value = store.$state.warehouseList
  207. })
  208. // 仓库选择事件
  209. const handleSelectWareHouse = function(e) {
  210. const stock = warehouseList.value.find(item => item.value === e)
  211. storeValues.areaCode = ''
  212. storeValues.areaName = ''
  213. storeValues.stockName = stock?.text
  214. locationList.value = []
  215. store.handleGetRegionList(e).then(ret => {
  216. regionList.value = ret
  217. })
  218. }
  219. // 区域选择事件
  220. const handleSelectRegion = function(e) {
  221. const area = regionList.value.find(item => item.value === e)
  222. storeValues.locationCode = ''
  223. storeValues.locationName = ''
  224. storeValues.areaName = area?.text
  225. store.handleGetLocationList(e).then(ret => {
  226. locationList.value = ret
  227. })
  228. }
  229. // 货位选择事件
  230. const handleSelectLocation = function(e) {
  231. const location = locationList.value.find(item => item.value === e)
  232. storeValues.locationName = location?.text
  233. }
  234. // 输入员工工号签收
  235. const handleInputPerson = function() {
  236. const {
  237. stockCode,
  238. areaCode,
  239. locationCode
  240. } = storeValues
  241. uni.$reqPost('signIncomingProduceDetail', {
  242. detail: checkedList.value.length === 0 ? submitList.value : checkedList.value,
  243. encodedEmployeeId: employeeNum.value,
  244. stockCode,
  245. areaCode,
  246. locationCode
  247. })
  248. .then(({
  249. code,
  250. data,
  251. msg
  252. }) => {
  253. easyinput.value.onBlur()
  254. easyinput.value.onFocus()
  255. isLightText.value = false
  256. signText.value = ''
  257. if (code === 0) {
  258. if (data?.status * 1 === -1) {
  259. // #ifdef APP-PLUS
  260. plus.device.beep(2)
  261. // #endif
  262. errorTipMessage.value = "请先提交入库申请!"
  263. errorTip.value.open()
  264. errorState.value = 0
  265. } else {
  266. submitList.value.length = 0
  267. uni.showToast({
  268. title: '签收成功',
  269. icon: 'none',
  270. duration: 2000
  271. })
  272. }
  273. } else {
  274. // #ifdef APP-PLUS
  275. plus.device.beep(2)
  276. // #endif
  277. errorTipMessage.value = msg
  278. errorTip.value.open()
  279. errorState.value = -1
  280. }
  281. })
  282. }
  283. const handleInputStore = function() {
  284. console.log(storeNum.value);
  285. // uni.$reqGet('getStockLocaltionByCode', {
  286. // code: storeNum.value
  287. // })
  288. // .then(({
  289. // code,
  290. // data,
  291. // msg
  292. // }) => {
  293. // if (code === 0) {
  294. // console.log(data);
  295. // // submitParams.value.storeName = data?.name // 库位名称
  296. // // submitParams.value.erpStockId = data?.erpStockId // 入库仓库
  297. // // submitParams.value.wmsStoreAreaId = data
  298. // // ?.wmsStoreAreaId // 入库区域
  299. // // submitParams.value.wmsStoreId = data?.wmsStoreId // 入库货位
  300. // } else {
  301. // uni.showToast({
  302. // title: msg,
  303. // icon: 'none',
  304. // duration: 2000
  305. // })
  306. // }
  307. // })
  308. }
  309. const handleScanStore = function() {
  310. return
  311. // #ifdef APP-PLUS
  312. const mpaasScanModule = uni.requireNativePlugin('Mpaas-Scan-Module')
  313. mpaasScanModule.mpaasScan({
  314. // 扫码识别类型,参数可多选,qrCode、barCode,不设置,默认识别所有
  315. 'scanType': ['qrCode', 'barCode'],
  316. // 是否隐藏相册,默认false不隐藏
  317. 'hideAlbum': false
  318. },
  319. (ret) => {
  320. if (ret.resp_code === 1000) {
  321. uni.$reqGet('getStockLocaltionByCode', {
  322. code: ret.resp_result
  323. })
  324. .then(({
  325. code,
  326. data,
  327. msg
  328. }) => {
  329. if (code === 0) {
  330. console.log(data);
  331. // submitParams.value.storeName = data?.name // 库位名称
  332. // submitParams.value.erpStockId = data?.erpStockId // 入库仓库
  333. // submitParams.value.wmsStoreAreaId = data
  334. // ?.wmsStoreAreaId // 入库区域
  335. // submitParams.value.wmsStoreId = data?.wmsStoreId // 入库货位
  336. } else {
  337. uni.showToast({
  338. title: msg,
  339. icon: 'none',
  340. duration: 2000
  341. })
  342. }
  343. })
  344. }
  345. // 返回值中,resp_code 表示返回结果值,10:用户取消,11:其他错误,1000:成功
  346. // 返回值中,resp_message 表示返回结果信息
  347. // 返回值中,resp_result 表示扫码结果,只有成功才会有返回
  348. })
  349. // #endif
  350. }
  351. // 扫描员工工号签收
  352. const handleScanPerson = function() {
  353. // #ifdef APP-PLUS
  354. const mpaasScanModule = uni.requireNativePlugin('Mpaas-Scan-Module')
  355. mpaasScanModule.mpaasScan({
  356. // 扫码识别类型,参数可多选,qrCode、barCode,不设置,默认识别所有
  357. 'scanType': ['qrCode', 'barCode'],
  358. // 是否隐藏相册,默认false不隐藏
  359. 'hideAlbum': false
  360. },
  361. (ret) => {
  362. if (ret.resp_code === 1000) {
  363. const {
  364. stockCode,
  365. areaCode,
  366. locationCode
  367. } = storeValues
  368. uni.$reqPost('signIncomingProduceDetail', {
  369. detail: checkedList.value.length === 0 ? submitList.value :
  370. checkedList.value,
  371. encodedEmployeeId: ret.resp_result,
  372. stockCode,
  373. areaCode,
  374. locationCode
  375. })
  376. .then(({
  377. code,
  378. data,
  379. msg
  380. }) => {
  381. easyinput.value.onBlur()
  382. easyinput.value.onFocus()
  383. isLightText.value = false
  384. signText.value = ''
  385. if (code === 0) {
  386. if (data?.status * 1 === -1) {
  387. // #ifdef APP-PLUS
  388. plus.device.beep(2)
  389. // #endif
  390. errorTipMessage.value = "请先提交入库申请!"
  391. errorTip.value.open()
  392. errorState.value = 0
  393. } else {
  394. submitList.value.length = 0
  395. uni.showToast({
  396. title: '签收成功',
  397. icon: 'none',
  398. duration: 2000
  399. })
  400. }
  401. } else {
  402. // #ifdef APP-PLUS
  403. plus.device.beep(2)
  404. // #endif
  405. errorTipMessage.value = msg
  406. errorTip.value.open()
  407. errorState.value = -1
  408. }
  409. })
  410. }
  411. })
  412. // #endif
  413. }
  414. const handleMapass = function() {
  415. // #ifdef APP-PLUS
  416. const mpaasScanModule = uni.requireNativePlugin('Mpaas-Scan-Module')
  417. mpaasScanModule.mpaasScan({
  418. // 扫码识别类型,参数可多选,qrCode、barCode,不设置,默认识别所有
  419. 'scanType': ['qrCode', 'barCode'],
  420. // 是否隐藏相册,默认false不隐藏
  421. 'hideAlbum': false
  422. },
  423. (ret) => {
  424. if (ret.resp_code === 1000) {
  425. uni.$reqGet('scanProductInDetailTemp', {
  426. id: ret.resp_result
  427. })
  428. .then(({
  429. code,
  430. data,
  431. msg
  432. }) => {
  433. if (code === 0) {
  434. if (data.status !== -1) {
  435. uni.$reqGet('getIncomingProduceDetailPage', {
  436. pageNo: 1,
  437. pageSize: 100,
  438. warehousingOrderNo: data.warehousingOrderNo
  439. })
  440. .then(({
  441. code,
  442. data,
  443. msg
  444. }) => {
  445. if (code === 0) {
  446. submitList.value = data?.list ?? []
  447. submitList.value.forEach(item => item
  448. .checked = false)
  449. } else {
  450. // #ifdef APP-PLUS
  451. plus.device.beep(2)
  452. // #endif
  453. errorTipMessage.value = msg
  454. errorTip.value.open()
  455. errorState.value = 0
  456. }
  457. })
  458. }
  459. } else {
  460. // #ifdef APP-PLUS
  461. plus.device.beep(2)
  462. // #endif
  463. errorTipMessage.value = msg
  464. errorTip.value.open()
  465. errorState.value = 0
  466. }
  467. })
  468. }
  469. })
  470. // #endif
  471. }
  472. // 扫描完成品标签输入框回车事件
  473. const handleKeydown = function(e) {
  474. uni.$reqGet('scanProductInDetailTemp', {
  475. id: e
  476. })
  477. .then(({
  478. code,
  479. data,
  480. msg
  481. }) => {
  482. scanNumber.value = ''
  483. easyinput.value.onBlur()
  484. easyinput.value.onFocus()
  485. if (code === 0) {
  486. if (data.status !== -1) {
  487. uni.$reqGet('getIncomingProduceDetailPage', {
  488. pageNo: 1,
  489. pageSize: 100,
  490. warehousingOrderNo: data.warehousingOrderNo
  491. })
  492. .then(({
  493. code,
  494. data,
  495. msg
  496. }) => {
  497. if (code === 0) {
  498. submitList.value = data?.list ?? []
  499. submitList.value.forEach(item => item.checked = false)
  500. } else {
  501. // #ifdef APP-PLUS
  502. plus.device.beep(2)
  503. // #endif
  504. errorTipMessage.value = msg
  505. errorTip.value.open()
  506. errorState.value = 0
  507. }
  508. })
  509. }
  510. } else {
  511. // #ifdef APP-PLUS
  512. plus.device.beep(2)
  513. // #endif
  514. errorTipMessage.value = msg
  515. errorTip.value.open()
  516. errorState.value = 0
  517. }
  518. })
  519. }
  520. const goBack = function() {
  521. uni.$goBack('/pages/workbranch/warehouse/warehousing/warehousingType')
  522. }
  523. // 设置高亮
  524. const handleBtnLight = function() {
  525. // #ifdef APP-PLUS
  526. signInput.value.onBlur()
  527. isLightText.value = true
  528. signInput.value.onFocus()
  529. // #endif
  530. }
  531. const handleComplete = function(e) {
  532. // #ifdef APP-PLUS
  533. // 扫描员工工号
  534. const {
  535. stockCode,
  536. areaCode,
  537. locationCode
  538. } = storeValues
  539. uni.$reqPost('signIncomingProduceDetail', {
  540. detail: checkedList.value.length === 0 ? submitList.value : checkedList.value,
  541. encodedEmployeeId: e,
  542. stockCode,
  543. areaCode,
  544. locationCode
  545. })
  546. .then(({
  547. code,
  548. data,
  549. msg
  550. }) => {
  551. easyinput.value.onBlur()
  552. easyinput.value.onFocus()
  553. isLightText.value = false
  554. signText.value = ''
  555. if (code === 0) {
  556. if (data?.status * 1 === -1) {
  557. // #ifdef APP-PLUS
  558. plus.device.beep(2)
  559. // #endif
  560. errorTipMessage.value = "请先提交入库申请!"
  561. errorTip.value.open()
  562. errorState.value = 0
  563. } else {
  564. submitList.value.length = 0
  565. uni.showToast({
  566. title: '签收成功',
  567. icon: 'none',
  568. duration: 2000
  569. })
  570. }
  571. } else {
  572. // #ifdef APP-PLUS
  573. plus.device.beep(2)
  574. // #endif
  575. errorTipMessage.value = msg
  576. errorTip.value.open()
  577. errorState.value = -1
  578. }
  579. })
  580. // #endif
  581. }
  582. const setInputFocus = function() {
  583. scanNumber.value = ''
  584. easyinput.value.onBlur()
  585. easyinput.value.onFocus()
  586. }
  587. // 关闭错误信息弹窗
  588. const handleCloseErrorTipsModal = async function() {
  589. errorTip.value.close()
  590. if (errorState.value === 0) {
  591. await setInputFocus()
  592. }
  593. }
  594. // 卡片面板选择事件
  595. const handleCheckedCard = function(ret) {
  596. const fdIndex = submitList.value.findIndex(item => item.id === ret.id);
  597. const findChecked = checkedList.value.findIndex(item => item.id === ret.id);
  598. if (fdIndex !== -1) submitList.value[fdIndex].checked = !submitList.value[fdIndex]
  599. .checked;
  600. if (findChecked === -1) {
  601. checkedList.value.push(ret);
  602. } else {
  603. checkedList.value.splice(findChecked, 1);
  604. }
  605. }
  606. // 禁用软键盘
  607. const handleInputFocus = function() {
  608. // // #ifdef APP-PLUS
  609. // setTimeout(() => {
  610. // uni.hideKeyboard()
  611. // }, 100)
  612. // // #endif
  613. }
  614. return {
  615. selectModal,
  616. goBack,
  617. errorTip,
  618. errorTipMessage,
  619. ...toRefs(storeValues),
  620. handleSelectRegion,
  621. handleSelectWareHouse,
  622. handleSelectLocation,
  623. handleScanStore,
  624. handleInputStore,
  625. easyinput,
  626. modalForm,
  627. storeNum,
  628. employeeNum,
  629. scanNumber,
  630. signInput,
  631. signText,
  632. regionList,
  633. warehouseList,
  634. locationList,
  635. computedStock,
  636. computedStore,
  637. computedStoreArea,
  638. isLightText,
  639. handleMapass,
  640. handleKeydown,
  641. submitList,
  642. handleBtnLight,
  643. handleComplete,
  644. handleScanPerson,
  645. handleInputPerson,
  646. handleCheckedCard,
  647. handleInputFocus,
  648. handleCloseErrorTipsModal
  649. }
  650. }
  651. })
  652. </script>
  653. <style lang="scss" scoped>
  654. .gui-header-leader-btns {
  655. color: black;
  656. font-size: 24px !important;
  657. }
  658. .list-content {
  659. margin-top: 80px;
  660. background-color: #edeeee;
  661. }
  662. .input-200 {
  663. width: 200px;
  664. padding-left: 10px;
  665. }
  666. .font-icons {
  667. width: 40px;
  668. font-size: 20px;
  669. text-align: right;
  670. }
  671. .scan {
  672. height: 45px;
  673. width: calc(100% - 48px);
  674. margin: 12px;
  675. padding: 0 12px;
  676. display: flex;
  677. justify-content: space-between;
  678. align-items: center;
  679. border-radius: 6px;
  680. background-color: white;
  681. .scan-card {
  682. width: 100%;
  683. display: grid;
  684. grid-template-rows: 1fr;
  685. grid-template-columns: 7fr 2fr;
  686. align-items: center;
  687. input {
  688. height: 35px;
  689. line-height: 35px;
  690. }
  691. text {
  692. width: 100%;
  693. text-align: right;
  694. }
  695. }
  696. }
  697. .card-list-item {
  698. width: 750rpx;
  699. height: 40px;
  700. margin: 2rpx 0;
  701. display: flex;
  702. flex-direction: row;
  703. align-items: center;
  704. justify-content: space-between;
  705. background-color: #fff;
  706. uni-text {
  707. font-size: 14px;
  708. height: 50rpx;
  709. text-align: left;
  710. padding: 0 12px;
  711. display: flex;
  712. flex-direction: row;
  713. align-items: center;
  714. }
  715. .text-1 {
  716. flex: 1;
  717. height: 40px;
  718. justify-content: flex-start;
  719. }
  720. .text-2 {
  721. flex: 3;
  722. height: 40px;
  723. justify-content: flex-end;
  724. margin-right: 4px;
  725. padding: 2px 6px;
  726. }
  727. }
  728. .table-title {
  729. height: 40px;
  730. line-height: 40px;
  731. margin: 0 0 -3px 0;
  732. padding: 0 12px;
  733. font-size: 16px;
  734. font-weight: bold;
  735. background-color: white;
  736. }
  737. .custom-table {
  738. height: calc(100vh - (8vh + 365px));
  739. min-height: 230px;
  740. margin: 5px 0;
  741. overflow-y: scroll;
  742. }
  743. .sign-btn {
  744. display: flex;
  745. align-items: center;
  746. justify-content: center;
  747. margin: 0 8px;
  748. border: 1px solid #999999;
  749. background-color: white;
  750. border-radius: 6px;
  751. }
  752. span,
  753. text {
  754. font-size: 12px;
  755. }
  756. .tag-icon {
  757. position: absolute;
  758. top: 0;
  759. right: 0;
  760. width: 32px;
  761. height: 32px;
  762. display: flex;
  763. justify-content: end;
  764. align-items: flex-start;
  765. background-color: #00a0e9;
  766. clip-path: polygon(0 0, 100% 0%, 100% 100%);
  767. }
  768. .tag-icon div {
  769. display: flex;
  770. justify-content: center;
  771. align-items: center;
  772. width: 16px;
  773. font-weight: bold;
  774. font-size: 16px;
  775. color: white;
  776. }
  777. .store-list {
  778. min-height: 60px;
  779. height: 8vh;
  780. margin-bottom: 2px;
  781. display: flex;
  782. justify-content: space-around;
  783. flex-direction: column;
  784. padding: 0 8px;
  785. font-size: 12px;
  786. background-color: white;
  787. }
  788. </style>