scanMaterials.vue 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929
  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="scanBatchNumber" :input-border="false"
  22. :clearable="false" type="text" focus @focus="handleInputFocus" placeholder="请扫描物料二维码"
  23. @confirm="confirmMaterial" />
  24. <text class="font-icons" @click="handleScanMaterial">&#xe6b7;</text>
  25. </view>
  26. </view>
  27. <view class="tabs">
  28. <div class="tabs-list">
  29. <text :class="!isBefore?'tabs-item-active':'tabs-item'" @click="handleCheckTabs(1)">备料需求</text>
  30. <text :class="isBefore?'tabs-item-active':'tabs-item'" @click="handleCheckTabs(0)">已备物料</text>
  31. </div>
  32. </view>
  33. <view v-if="!isBefore" class="custom-table flex-box">
  34. <div class="header-box">
  35. <uni-table border stripe empty-text="暂无更多数据">
  36. <!-- 表头行 -->
  37. <uni-tr class="custom-table-head">
  38. <uni-th align="center" width="180px">物料</uni-th>
  39. <uni-th align="center" width="80px">仓位</uni-th>
  40. <uni-th align="center" width="100px">需求数</uni-th>
  41. <uni-th align="center" width="100px">已备数</uni-th>
  42. <uni-th align="center" width="100px">已发数</uni-th>
  43. </uni-tr>
  44. <!-- 表格数据行 -->
  45. <uni-tr v-for="(item, key) in tableData" :key="key" @click="handleShowDetailsList(item)">
  46. <uni-td align="center">{{ item.materialNo }}({{ item.materialName }})</uni-td>
  47. <uni-td align="center">{{ item.location }}</uni-td>
  48. <uni-td align="center">{{ item.needQty }}</uni-td>
  49. <uni-td align="center"
  50. :style="['color: orange;', 'font-weight: bold;']">{{ item.preparedQty }}</uni-td>
  51. <uni-td align="center">{{ item.pickedQty }}</uni-td>
  52. </uni-tr>
  53. </uni-table>
  54. </div>
  55. <div class="footer-box">
  56. <uni-table border stripe empty-text="暂无更多数据">
  57. <!-- 表头行 -->
  58. <uni-tr class="custom-table-head">
  59. <uni-th align="center" width="180px">物料</uni-th>
  60. <uni-th align="center" width="80px">仓位</uni-th>
  61. <uni-th align="center" width="100px">需求数</uni-th>
  62. <uni-th align="center" width="100px">已备数</uni-th>
  63. <uni-th align="center" width="100px">已发数</uni-th>
  64. </uni-tr>
  65. <!-- 表格数据行 -->
  66. <uni-tr v-for="(item, key) in backFlushTableData" :key="key"
  67. @click="handleShowDetailsList(item)">
  68. <uni-td align="center">{{ item.materialNo }}({{ item.materialName }})</uni-td>
  69. <uni-td align="center">{{ item.location }}</uni-td>
  70. <uni-td align="center">{{ item.needQty }}</uni-td>
  71. <uni-td align="center"
  72. :style="['color: orange;', 'font-weight: bold;']">{{ item.preparedQty }}</uni-td>
  73. <uni-td align="center">{{ item.pickedQty }}</uni-td>
  74. </uni-tr>
  75. </uni-table>
  76. </div>
  77. </view>
  78. <view v-else class="custom-table">
  79. <uni-table border stripe empty-text="暂无更多数据">
  80. <!-- 表头行 -->
  81. <uni-tr class="custom-table-head">
  82. <uni-th align="center" width="180px">物料</uni-th>
  83. <uni-th align="center" width="80px">仓位</uni-th>
  84. <uni-th align="center" width="100px">需求数</uni-th>
  85. <uni-th align="center" width="100px">已备数</uni-th>
  86. <uni-th align="center" width="100px">已发数</uni-th>
  87. </uni-tr>
  88. <!-- 表格数据行 -->
  89. <uni-tr v-for="(item, key) in beforeTableData" :key="key" @click="handleShowDetailsList(item)">
  90. <uni-td align="center">{{ item.materialNo }}({{ item.materialName }})</uni-td>
  91. <uni-td align="center">{{ item.location }}</uni-td>
  92. <uni-td align="center">{{ item.needQty }}</uni-td>
  93. <uni-td align="center"
  94. style="color: orange;font-weight: bold;">{{ item.preparedQty }}</uni-td>
  95. <uni-td align="center">{{ item.pickedQty }}</uni-td>
  96. </uni-tr>
  97. </uni-table>
  98. </view>
  99. <view class="panel-row"
  100. style="margin: 12px 0;display: grid;grid-template-columns: 1fr;grid-template-rows: 1fr;">
  101. <!-- <button type="default" style="width: calc(100% - 8px);margin: 0 4px;">取消</button> -->
  102. <button type="primary" :disabled="disabled" style="width: calc(100% - 8px);margin: 0 4px;"
  103. @click="handleToNavigate">生成发料单</button>
  104. </view>
  105. </view>
  106. <uni-popup ref="popupMaterialList" background-color="#fff">
  107. <view class="popup-content">
  108. <view class="list-title" style="margin-bottom: 8px;">
  109. <span class="font-icons"
  110. style="font-size: 20px;color: #00a0e9;width: 40px;text-align: center;">&#xe6a3;</span>
  111. <span>请选择物料</span>
  112. </view>
  113. <view>
  114. <view class="grid-box">
  115. <view v-for="(item, key) in materialList" :key="key" class="box"
  116. @click="handleClickMaterials(item)">
  117. <text>{{ item.materialName }}</text>
  118. <text>{{ item.needQty }}</text>
  119. <text>{{ item.itemErpId }}</text>
  120. </view>
  121. </view>
  122. </view>
  123. </view>
  124. </uni-popup>
  125. <uni-popup ref="popup" background-color="#fff">
  126. <view class="popup-content">
  127. <view class="list-title" style="margin-bottom: 8px;">
  128. <span class="font-icons"
  129. style="font-size: 20px;color: #00a0e9;width: 40px;text-align: center;">&#xe6a3;</span>
  130. <span>已备明细</span>
  131. </view>
  132. <view class="list-panel">
  133. <view v-for="item in demandDetailsList" :key="item.id" class="panel">
  134. <uni-swipe-action>
  135. <!-- 基础用法 -->
  136. <uni-swipe-action-item :right-options="option" @click="handleRemoveRecord(item)">
  137. <view class="panel-row">
  138. <text>批号</text>
  139. <text>{{ item.batchNumber }}</text>
  140. </view>
  141. <view class="panel-row">
  142. <text>物料编码</text>
  143. <text>{{ item.materialNo }}</text>
  144. </view>
  145. <view class="panel-row">
  146. <text>物料名称</text>
  147. <text>{{ item.materialName }}</text>
  148. </view>
  149. <view class="panel-row">
  150. <text>物料数量</text>
  151. <text style="color: orange;font-weight: bold;">{{ item.receiptQty }}</text>
  152. </view>
  153. <view class="panel-row">
  154. <text>货位</text>
  155. <text>{{ item.wmsStoreName }}</text>
  156. </view>
  157. </uni-swipe-action-item>
  158. </uni-swipe-action>
  159. </view>
  160. </view>
  161. </view>
  162. </uni-popup>
  163. <gui-modal ref="modalForm" :custom-class="['gui-bg-white', 'gui-dark-bg-level-3', 'gui-border-radius']"
  164. title="提示">
  165. <template #content>
  166. <view class="gui-padding gui-bg-gray gui-dark-bg-level-2">
  167. <text class="gui-block gui-text-center gui-text gui-color-gray"
  168. style="line-height:100rpx; padding:10rpx;">备料超出,是否拆分?</text>
  169. </view>
  170. </template>
  171. <!-- 利用 flex 布局 可以放置多个自定义按钮哦 -->
  172. <template #btns>
  173. <view class="gui-flex gui-row gui-space-between operation-flex">
  174. <view hover-class="gui-tap" class="modal-btns gui-flex1" @tap="modalForm.close()">
  175. <text class="modal-btns gui-color-gray">取消</text>
  176. </view>
  177. <view class="line" />
  178. <view hover-class="gui-tap" class="modal-btns gui-flex1" @tap="handleSplitMaterial">
  179. <text class="modal-btns gui-primary-color">确认</text>
  180. </view>
  181. </view>
  182. </template>
  183. </gui-modal>
  184. <uni-popup ref="errorTip" type="dialog">
  185. <uni-popup-dialog type="error" cancel-text="关闭" confirm-text="确认" title="提示" :content="errorTipMessage"
  186. @confirm="handleCloseErrorTipsModal" @close="handleCloseErrorTipsModal" />
  187. </uni-popup>
  188. </template>
  189. </gui-page>
  190. </template>
  191. <script>
  192. import {
  193. onReachBottom
  194. } from '@dcloudio/uni-app'
  195. import {
  196. ref,
  197. onMounted,
  198. defineComponent,
  199. onBeforeMount
  200. } from 'vue'
  201. export default defineComponent({
  202. setup(options) {
  203. const popup = ref()
  204. const popupMaterialList = ref()
  205. const materialList = ref([])
  206. const modalForm = ref()
  207. const errorTip = ref()
  208. const errorState = ref(0)
  209. const easyinput = ref()
  210. // 错误弹窗提示信息
  211. const errorTipMessage = ref()
  212. const parentRow = uni.getStorageSync('workOrderId') ?? {}
  213. // 是否可生成发料单
  214. const disabled = ref(false)
  215. const isBefore = ref(false)
  216. const workId = ref('')
  217. const detailId = ref('')
  218. const scanMaterialObject = ref()
  219. const materialDetail = ref({})
  220. const scanBatchNumber = ref('')
  221. const tableData = ref([])
  222. // 倒冲发料列表
  223. const backFlushTableData = ref([])
  224. const beforeTableData = ref([])
  225. const demandDetailsList = ref([])
  226. onBeforeMount(() => {
  227. workId.value = JSON.parse(parentRow)?.id
  228. })
  229. const search = function() {
  230. uni.$reqGet('getPreparationMaterialList', {
  231. pageNo: 1,
  232. pageSize: 100,
  233. workOrderId: workId.value
  234. })
  235. .then(({
  236. code,
  237. data,
  238. msg
  239. }) => {
  240. if (code === 0) {
  241. uni.setStorageSync('ids', JSON.stringify(data?.list[0]))
  242. tableData.value.length = 0
  243. backFlushTableData.value.length = 0
  244. beforeTableData.value.length = 0
  245. data?.list?.forEach(item => {
  246. // 已备数 + 已发数 => 需求数
  247. if ((item.preparedQty + item.pickedQty) >= item.needQty) {
  248. beforeTableData.value.push(item)
  249. } else if (item?.sendType * 1 === 0) {
  250. tableData.value.push(item)
  251. } else {
  252. backFlushTableData.value.push(item)
  253. }
  254. })
  255. } else {
  256. disabled.value = true
  257. uni.showToast({
  258. title: msg,
  259. icon: 'none',
  260. duration: 2000
  261. })
  262. }
  263. })
  264. }
  265. onMounted(() => {
  266. search()
  267. })
  268. const goBack = function() {
  269. if (uni.getStorageSync('ids')) {
  270. uni.removeStorageSync('ids')
  271. }
  272. uni.$goBack('/pages/workbranch/warehouse/production/prepareMaterials')
  273. }
  274. const setInputFocus = function() {
  275. scanBatchNumber.value = ''
  276. easyinput.value.onBlur()
  277. easyinput.value.onFocus()
  278. }
  279. const handleScanMaterial = function() {
  280. // #ifdef APP-PLUS
  281. const mpaasScanModule = uni.requireNativePlugin('Mpaas-Scan-Module')
  282. mpaasScanModule.mpaasScan({
  283. // 扫码识别类型,参数可多选,qrCode、barCode,不设置,默认识别所有
  284. 'scanType': ['qrCode', 'barCode'],
  285. // 是否隐藏相册,默认false不隐藏
  286. 'hideAlbum': false
  287. },
  288. (ret) => {
  289. if (ret.resp_code === 1000) {
  290. uni.$reqGet('scanPrepareMaterial', {
  291. qrCode: ret.resp_result
  292. })
  293. .then(async ({
  294. code,
  295. data,
  296. msg
  297. }) => {
  298. if (code === 0) {
  299. scanBatchNumber.value = ret.resp_result
  300. scanMaterialObject.value = data
  301. if (Object.prototype.toString.call(data) ===
  302. '[object Array]') {
  303. materialList.value.length = 0
  304. tableData.value.forEach(item => {
  305. if (item?.materialNo === data[0]
  306. ?.materialNo) {
  307. materialList.value.push(item)
  308. }
  309. })
  310. backFlushTableData.value.forEach(item => {
  311. if (item?.materialNo === data[0]
  312. ?.materialNo) {
  313. materialList.value.push(item)
  314. }
  315. })
  316. if (materialList.value.length > 1) {
  317. if (popupMaterialList.value?.showPopup === false) {
  318. popupMaterialList.value.open('bottom')
  319. }
  320. } else if (materialList.value.length === -1) {
  321. // #ifdef APP-PLUS
  322. plus.device.beep(2)
  323. // #endif
  324. errorTipMessage.value = '请扫描所需物料的物料条码'
  325. errorTip.value.open()
  326. errorState.value = 0
  327. } else {
  328. uni.$reqPost('savePrepareMaterial', {
  329. id: materialList.value[0]?.id,
  330. split: 0,
  331. materials: data
  332. })
  333. .then(res => {
  334. if (res?.code === 0) {
  335. if (res?.data === 1) {
  336. detailId.value = materialList
  337. .value[0]?.id
  338. materialDetail.value = data
  339. modalForm.value.open()
  340. } else {
  341. search()
  342. }
  343. } else {
  344. // #ifdef APP-PLUS
  345. plus.device.beep(2)
  346. // #endif
  347. errorTipMessage.value = res?.msg
  348. errorTip.value.open()
  349. errorState.value = 0
  350. }
  351. })
  352. }
  353. }
  354. await setInputFocus()
  355. } else {
  356. // #ifdef APP-PLUS
  357. plus.device.beep(2)
  358. // #endif
  359. errorTipMessage.value = msg
  360. errorTip.value.open()
  361. errorState.value = 0
  362. }
  363. })
  364. }
  365. })
  366. // #endif
  367. }
  368. // 物料二维码输入框回车事件
  369. const confirmMaterial = function(e) {
  370. uni.$reqGet('scanPrepareMaterial', {
  371. qrCode: e
  372. })
  373. .then(async ({
  374. code,
  375. data,
  376. msg
  377. }) => {
  378. if (code === 0) {
  379. scanBatchNumber.value = e
  380. scanMaterialObject.value = data
  381. if (Object.prototype.toString.call(data) ===
  382. '[object Array]') {
  383. materialList.value.length = 0
  384. tableData.value.forEach(item => {
  385. if (item?.materialNo === data[0]?.materialNo) {
  386. materialList.value.push(item)
  387. }
  388. })
  389. backFlushTableData.value.forEach(item => {
  390. if (item?.materialNo === data[0]?.materialNo) {
  391. materialList.value.push(item)
  392. }
  393. })
  394. if (materialList.value.length > 1) {
  395. if (popupMaterialList.value?.showPopup === false) {
  396. popupMaterialList.value.open('bottom')
  397. }
  398. } else if (materialList.value.length === -1) {
  399. // #ifdef APP-PLUS
  400. plus.device.beep(2)
  401. // #endif
  402. errorTipMessage.value = '请扫描所需物料的物料条码'
  403. errorTip.value.open()
  404. errorState.value = 0
  405. } else {
  406. uni.$reqPost('savePrepareMaterial', {
  407. id: materialList.value[0]?.id,
  408. split: 0,
  409. materials: data
  410. })
  411. .then(async (res) => {
  412. if (res?.code === 0) {
  413. if (res?.data === 1) {
  414. detailId.value = materialList.value[0]?.id
  415. materialDetail.value = data
  416. modalForm.value.open()
  417. } else {
  418. // 上料成功
  419. await search()
  420. }
  421. } else {
  422. // #ifdef APP-PLUS
  423. plus.device.beep(2)
  424. // #endif
  425. errorTipMessage.value = res?.msg
  426. errorTip.value.open()
  427. errorState.value = 0
  428. }
  429. })
  430. }
  431. }
  432. await setInputFocus()
  433. } else {
  434. // #ifdef APP-PLUS
  435. plus.device.beep(2)
  436. // #endif
  437. errorTipMessage.value = msg
  438. errorTip.value.open()
  439. errorState.value = 0
  440. }
  441. })
  442. }
  443. // 存在多个物料,选择单个物料触发事件
  444. const handleClickMaterials = function(ret) {
  445. popupMaterialList.value.close()
  446. uni.$reqPost('savePrepareMaterial', {
  447. id: ret?.id,
  448. split: 0,
  449. materials: scanMaterialObject.value
  450. })
  451. .then(async (res) => {
  452. if (res?.code === 0) {
  453. if (res?.data === 1) {
  454. detailId.value = ret?.id
  455. materialDetail.value = ret
  456. modalForm.value.open()
  457. } else {
  458. await search()
  459. }
  460. } else {
  461. // #ifdef APP-PLUS
  462. plus.device.beep(2)
  463. // #endif
  464. errorTipMessage.value = res?.msg
  465. errorTip.value.open()
  466. errorState.value = 0
  467. }
  468. await setInputFocus()
  469. })
  470. }
  471. // 物料拆分
  472. const handleSplitMaterial = function() {
  473. modalForm.value.close()
  474. search()
  475. uni.$reqPost('savePrepareMaterial', {
  476. id: detailId.value,
  477. split: 1,
  478. materials: materialDetail.value
  479. })
  480. .then(res => {
  481. if (res.code === 0) {
  482. // 调取打印机拆分物料后打印标签
  483. uni.showToast({
  484. title: '拆分完毕',
  485. icon: 'none',
  486. duration: 2000
  487. })
  488. } else {
  489. // #ifdef APP-PLUS
  490. plus.device.beep(2)
  491. // #endif
  492. errorTipMessage.value = res?.msg
  493. errorTip.value.open()
  494. errorState.value = 0
  495. }
  496. })
  497. }
  498. const handleShowDetailsList = function(row) {
  499. uni.$reqGet('getPrepareMaterialList', {
  500. wmsProductionWorkOrderBomDetailId: row?.id
  501. })
  502. .then(({
  503. code,
  504. data,
  505. msg
  506. }) => {
  507. if (code === 0) {
  508. if (popup.value?.showPopup === false) {
  509. popup.value.open('bottom')
  510. }
  511. demandDetailsList.value = data ?? []
  512. } else {
  513. // #ifdef APP-PLUS
  514. plus.device.beep(2)
  515. // #endif
  516. errorTipMessage.value = msg
  517. errorTip.value.open()
  518. errorState.value = 0
  519. }
  520. })
  521. }
  522. const handleToNavigate = function() {
  523. uni.navigateTo({
  524. url: '/pages/workbranch/warehouse/production/materialIssuance'
  525. })
  526. }
  527. const handleRemoveRecord = function(row) {
  528. uni.$reqDelete('deletePrepareMaterial', {
  529. id: row?.id
  530. })
  531. .then(({
  532. code,
  533. data,
  534. msg
  535. }) => {
  536. if (code === 0) {
  537. uni.showToast({
  538. title: '删除成功',
  539. icon: 'none',
  540. duration: 2000
  541. })
  542. popup.value.close()
  543. search()
  544. } else {
  545. // #ifdef APP-PLUS
  546. plus.device.beep(2)
  547. // #endif
  548. errorTipMessage.value = msg
  549. errorTip.value.open()
  550. errorState.value = 0
  551. }
  552. })
  553. }
  554. // tabs切换事件
  555. const handleCheckTabs = function(state) {
  556. if (!state) {
  557. this.isBefore = true
  558. } else {
  559. this.isBefore = false
  560. }
  561. setInputFocus()
  562. }
  563. // 关闭错误信息弹窗
  564. const handleCloseErrorTipsModal = async function() {
  565. errorTip.value.close()
  566. if (errorState.value === 0) {
  567. await setInputFocus()
  568. }
  569. }
  570. // 禁用软键盘
  571. const handleInputFocus = function() {
  572. setTimeout(() => {
  573. uni.hideKeyboard()
  574. }, 100)
  575. }
  576. return {
  577. option: [{
  578. text: '删除',
  579. style: {
  580. backgroundColor: '#dd524d'
  581. }
  582. }],
  583. goBack,
  584. popup,
  585. tableData,
  586. backFlushTableData,
  587. modalForm,
  588. easyinput,
  589. errorTip,
  590. disabled,
  591. isBefore,
  592. handleCheckTabs,
  593. errorTipMessage,
  594. materialList,
  595. beforeTableData,
  596. scanBatchNumber,
  597. demandDetailsList,
  598. handleScanMaterial,
  599. handleShowDetailsList,
  600. handleInputFocus,
  601. handleToNavigate,
  602. confirmMaterial,
  603. popupMaterialList,
  604. handleRemoveRecord,
  605. handleSplitMaterial,
  606. handleClickMaterials,
  607. handleCloseErrorTipsModal
  608. }
  609. }
  610. })
  611. </script>
  612. <style lang="scss" scoped>
  613. .gui-header-leader-btns {
  614. color: black;
  615. font-size: 24px !important;
  616. margin-left: 24rpx;
  617. }
  618. .list-content {
  619. margin-top: 80px;
  620. background-color: #edeeee;
  621. }
  622. .card-list-flexbox {
  623. display: flex;
  624. flex-direction: row;
  625. align-items: center;
  626. flex-wrap: wrap;
  627. margin: 3px 2px;
  628. .panel-row {
  629. width: 750rpx;
  630. height: 40px;
  631. margin: 2rpx 0;
  632. display: flex;
  633. flex-direction: row;
  634. align-items: center;
  635. justify-content: space-between;
  636. background-color: #fff;
  637. uni-text {
  638. font-size: 14px;
  639. height: 50rpx;
  640. text-align: left;
  641. padding: 0 12px;
  642. display: flex;
  643. flex-direction: row;
  644. align-items: center;
  645. }
  646. .text-1 {
  647. flex: 1;
  648. height: 40px;
  649. justify-content: flex-start;
  650. }
  651. .text-2 {
  652. flex: 3;
  653. height: 40px;
  654. justify-content: flex-end;
  655. margin-right: 4px;
  656. padding: 2px 6px;
  657. }
  658. }
  659. }
  660. .card-list-flexbox:nth-of-type(2) {
  661. margin-top: 48px;
  662. }
  663. .fixedTop {
  664. bottom: 0 !important;
  665. top: 3.25rem !important;
  666. }
  667. .popup-content {
  668. height: 75vh;
  669. overflow-y: scroll;
  670. background-color: #edeeee;
  671. .grid-box {
  672. display: grid;
  673. grid-template-columns: 1fr 1fr;
  674. .box {
  675. height: 95px;
  676. padding: 8px 10px;
  677. border: 1px solid rgb(250, 250, 251);
  678. box-sizing: border-box;
  679. margin: 24px;
  680. display: flex;
  681. flex-direction: column;
  682. justify-content: center;
  683. align-items: center;
  684. font-size: 14px;
  685. font-weight: bold;
  686. border-radius: 6px;
  687. color: white;
  688. background-color: rgb(0, 160, 233);
  689. text:nth-of-type(2) {
  690. margin-top: 4px;
  691. }
  692. }
  693. }
  694. }
  695. .font-icons {
  696. width: 40px;
  697. font-size: 20px;
  698. }
  699. .scan {
  700. height: 45px;
  701. width: calc(100% - 48px);
  702. margin: 12px;
  703. padding: 0 12px;
  704. display: flex;
  705. justify-content: space-between;
  706. align-items: center;
  707. border-radius: 6px;
  708. background-color: white;
  709. .scan-card {
  710. width: 100%;
  711. display: grid;
  712. grid-template-rows: 1fr;
  713. grid-template-columns: 7fr 2fr;
  714. align-items: center;
  715. input {
  716. height: 35px;
  717. line-height: 35px;
  718. }
  719. text {
  720. width: 100%;
  721. text-align: right;
  722. }
  723. }
  724. }
  725. .list-title {
  726. position: fixed;
  727. top: 0;
  728. left: 0;
  729. z-index: 99999;
  730. height: 40px;
  731. line-height: 40px;
  732. width: calc(100% - 16px);
  733. padding: 0 8px;
  734. display: flex;
  735. align-items: center;
  736. font-size: 16px;
  737. font-weight: bold;
  738. background-color: white;
  739. border-top-left-radius: 16px;
  740. border-top-right-radius: 16px;
  741. .block {
  742. width: 4px;
  743. height: 22px;
  744. margin-right: 4px;
  745. display: inline-block;
  746. background-color: skyblue;
  747. line-height: 40px;
  748. }
  749. }
  750. .custom-table {
  751. height: calc(100vh - 265px);
  752. min-height: 230px;
  753. // min-height: 600px;
  754. overflow-y: hidden;
  755. }
  756. .flex-box {
  757. display: flex;
  758. flex-direction: column;
  759. .header-box {
  760. height: 64%;
  761. overflow-y: scroll;
  762. }
  763. .footer-box {
  764. height: 36%;
  765. overflow-y: scroll;
  766. }
  767. }
  768. .modal-btns {
  769. height: 100rpx;
  770. line-height: 100rpx;
  771. display: flex;
  772. justify-content: center;
  773. align-items: center;
  774. }
  775. .tabs {
  776. width: 100%;
  777. height: 45px;
  778. display: flex;
  779. align-items: flex-end;
  780. padding: 0 2px;
  781. background-color: white;
  782. .tabs-list {
  783. border-radius: 3px;
  784. overflow: hidden;
  785. }
  786. .tabs-item {
  787. display: inline-block;
  788. width: 72px;
  789. height: 30px;
  790. line-height: 30px;
  791. padding: 0 8px;
  792. font-size: 14px;
  793. font-weight: bold;
  794. text-align: center;
  795. color: black;
  796. border-bottom: 1.5px dashed #00a0e9;
  797. transition: all .5s ease-in-out;
  798. }
  799. .tabs-item-active {
  800. position: relative;
  801. display: inline-block;
  802. width: 72px;
  803. height: 30px;
  804. line-height: 30px;
  805. padding: 0 8px;
  806. font-size: 14px;
  807. font-weight: bold;
  808. text-align: center;
  809. color: white;
  810. border-left: 1px solid #00a0e9;
  811. border-top: 1px solid #00a0e9;
  812. border-right: 1px solid #00a0e9;
  813. border-bottom: 1.5px solid #00a0e9;
  814. border-radius: 5px 5px 0 0;
  815. animation: .3s linear show;
  816. background-color: #00a0e9;
  817. }
  818. .tabs-item-active::before {
  819. content: '';
  820. position: absolute;
  821. left: -10px;
  822. bottom: 0;
  823. width: 10px;
  824. height: 10px;
  825. background: radial-gradient(circle at 0% 25%, transparent 10px, #00a0e9 0)
  826. }
  827. .tabs-item-active::after {
  828. content: '';
  829. position: absolute;
  830. right: -10px;
  831. bottom: 0;
  832. width: 10px;
  833. height: 10px;
  834. background: radial-gradient(circle at 100% 25%, transparent 10px, #00a0e9 0)
  835. }
  836. }
  837. @keyframes show {
  838. from {
  839. transform: translateY(5%);
  840. }
  841. to {
  842. transform: translateY(0%);
  843. }
  844. }
  845. .list-panel {
  846. // height: calc(100vh - 225px);
  847. // min-height: 230px;
  848. padding: 5px 8px;
  849. margin-top: 50px;
  850. overflow-y: scroll;
  851. .panel {
  852. margin-bottom: 6px;
  853. border-radius: 4px;
  854. background-color: white;
  855. .panel-row {
  856. height: 32px;
  857. line-height: 32px;
  858. padding: 0 12px;
  859. display: flex;
  860. justify-content: space-between;
  861. background-color: #fbfbfb;
  862. }
  863. .panel-row:nth-of-type(1) {
  864. color: rgba(0, 160, 233, 1);
  865. font-weight: bold;
  866. border-top-left-radius: 4px;
  867. border-top-right-radius: 4px;
  868. border-bottom: 2px solid rgba(237, 238, 238, 1);
  869. background-color: white;
  870. }
  871. }
  872. }
  873. </style>