materialScanRegister.vue 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690
  1. <template>
  2. <gui-page :custom-header="true" :is-header-sized="false"
  3. :header-class="['gui-theme-background-color', isLandscapeScreen?'width: 100vmax;':'']"
  4. :style="[isLandscapeScreen?'width: 100vmax':'']">
  5. <template #gHeader>
  6. <view :style="[isLandscapeScreen?'height:44px;width: 100vmax':'height:44px;']"
  7. class="gui-flex gui-nowrap gui-rows gui-align-items-center">
  8. <!-- 使用组件实现返回按钮及返回首页按钮 -->
  9. <text style="font-size:44rpx;" class="gui-header-leader-btns gui-color-white font-icons"
  10. @tap="goBack">&#xe6c5;</text>
  11. <!-- 导航文本此处也可以是其他自定义内容 -->
  12. <text
  13. class="gui-h4 gui-blod gui-flex1 gui-text-center gui-color-white gui-ellipsis gui-primary-text">来料登记</text>
  14. <!-- 此处加一个右侧展位元素与左侧同宽,实现标题居中 -->
  15. <!-- 实际宽度请根据自己情况设置 -->
  16. <view style="width:40px;" />
  17. </view>
  18. </template>
  19. <template #gBody>
  20. <view class="form">
  21. <view class="card-list-flexbox">
  22. <text class="card-list-title" :style="[isPad?'font-size: 18px':'font-size: 14px']">单据信息</text>
  23. <view class="card-list-item">
  24. <text>送货单号</text>
  25. <text>{{ scanParams.deliveryOrderNo }}</text>
  26. </view>
  27. <view class="card-list-item">
  28. <text>供应商编码</text>
  29. <text>{{ scanParams.supplierCode }}</text>
  30. </view>
  31. <view class="card-list-item">
  32. <text>供应商名称</text>
  33. <text>{{ scanParams.supplierName }}</text>
  34. </view>
  35. <view class="card-list-item">
  36. <text>备注</text>
  37. <text>{{ scanParams.remark }}</text>
  38. </view>
  39. <view class="card-list-item">
  40. <text>扫码类型</text>
  41. <text>{{ scanTypeLabel }}</text>
  42. </view>
  43. </view>
  44. <view class="row">
  45. <view class="row-card">
  46. <uni-data-select v-model="scanParams.scanType" :localdata="scanTypeList" placeholder="请选择扫码类型" />
  47. </view>
  48. </view>
  49. <view class="row">
  50. <view class="row-card">
  51. <uni-easyinput ref="easyinput" v-model="scanParams.deliveryOrderNo" :input-border="false"
  52. :clearable="false" type="text" focus @focus="handleInputFocus" placeholder="扫描送货单条码"
  53. @confirm="confirmDeliverOrderNo" />
  54. <text class="font-icons" @click="handleMapass"></text>
  55. </view>
  56. </view>
  57. <!-- <view v-if="scanParams.deliveryOrderNo" class="row">
  58. <view class="row-card">
  59. <uni-easyinput ref="easyinput2" v-model="scanParams.deliverBatch" :input-border="false"
  60. :clearable="false" type="text" @focus="handleInputFocus" placeholder="扫描物料条码"
  61. @confirm="confirmMaterial" />
  62. <text class="font-icons" @click="handleScanMaterial"></text>
  63. </view>
  64. </view> -->
  65. <view class="table-title">
  66. <span>需求清单</span>
  67. </view>
  68. <view class="custom-table">
  69. <uni-table border stripe empty-text="暂无更多数据">
  70. <!-- 表头行 -->
  71. <uni-tr class="custom-table-head">
  72. <uni-th align="center" width="80px">箱数</uni-th>
  73. <uni-th align="center" width="80px">每箱数量</uni-th>
  74. <uni-th align="center" width="80px">总数量</uni-th>
  75. <uni-th align="center" width="140px">采购单号</uni-th>
  76. <uni-th align="center" width="140px">物料编码</uni-th>
  77. <uni-th align="center" width="140px">物料名称</uni-th>
  78. <uni-th align="center" width="140px">送货批次</uni-th>
  79. <uni-th align="center" width="180px">生产日期</uni-th>
  80. </uni-tr>
  81. <!-- 表格数据行 -->
  82. <uni-tr v-for="(item, key) in scanParams.detail" :key="key">
  83. <uni-td align="center"
  84. :style="item.state? 'background-color: rgba(109, 205, 50, 1);color: white;': ''">
  85. <!-- 不可修改:disabled="true" -->
  86. <uni-easyinput v-model="item.bagQty" type="number" :input-border="false" placeholder="请输入箱数" @input="handleBagQtyChange" :disabled="true" />
  87. </uni-td>
  88. <uni-td align="center"
  89. :style="item.state? 'background-color: rgba(109, 205, 50, 1);color: white;': ''">{{ item.receiptQty }}</uni-td>
  90. <uni-td align="center"
  91. :style="item.state? 'background-color: rgba(109, 205, 50, 1);color: white;': ''">{{ calculateTotalQty(item) }}</uni-td>
  92. <uni-td align="center"
  93. :style="item.state? 'background-color: rgba(109, 205, 50, 1);color: white;': ''">{{ item.purchaseOrderNo }}</uni-td>
  94. <uni-td align="center"
  95. :style="item.state? 'background-color: rgba(109, 205, 50, 1);color: white;': ''">{{ item.materialNo }}</uni-td>
  96. <uni-td align="center"
  97. :style="item.state? 'background-color: rgba(109, 205, 50, 1);color: white;': ''">{{ item.name }}</uni-td>
  98. <uni-td align="center"
  99. :style="item.state? 'background-color: rgba(109, 205, 50, 1);color: white;': ''">{{ item.deliverBatch }}</uni-td>
  100. <uni-td align="center"
  101. :style="item.state? 'background-color: rgba(109, 205, 50, 1);color: white;': ''">
  102. <!-- 时间选择功能,暂时注释掉 -->
  103. <!-- <uni-datetime-picker
  104. v-model="item.produceDate"
  105. type="datetime"
  106. :border="false"
  107. placeholder="选择日期时间" /> -->
  108. <uni-datetime-picker
  109. v-model="item.produceDate"
  110. type="date"
  111. :border="false"
  112. placeholder="选择日期" />
  113. </uni-td>
  114. </uni-tr>
  115. </uni-table>
  116. </view>
  117. <gui-right-menus>
  118. <!-- 扩展按钮 -->
  119. <template #menus-more>
  120. <view hover-class="gui-tap"
  121. class="menu-items gui-bg-green gui-flex gui-columns gui-justify-content-center"
  122. @click="handeleRegister">
  123. <text class="menu-text gui-block gui-text-center gui-color-white">登记</text>
  124. </view>
  125. <view hover-class="gui-tap"
  126. class="menu-items gui-bg-blue gui-flex gui-columns gui-justify-content-center"
  127. @click="handleNavigateToRegisterRecord">
  128. <text class="menu-text gui-block gui-text-center gui-color-white">登记记录</text>
  129. </view>
  130. </template>
  131. <!-- 核心按钮 -->
  132. <template #menus-primary>
  133. <view class="menu-items gui-bg-primary gui-flex gui-columns gui-justify-content-center">
  134. <text class="menu-icon gui-color-white gui-block gui-text-center gui-icons"></text>
  135. <text class="menu-text gui-color-white gui-block gui-text-center">操作</text>
  136. </view>
  137. </template>
  138. </gui-right-menus>
  139. <uni-popup ref="modalForm" type="dialog">
  140. <uni-popup-dialog type="error" cancel-text="不使用" confirm-text="继续使用" title="提示" content="此物料已过保质期!"
  141. @confirm="handleCompleteDialog" @close="handleCloseDialog" />
  142. </uni-popup>
  143. <uni-popup ref="errorTip" type="dialog">
  144. <uni-popup-dialog type="error" cancel-text="关闭" confirm-text="确认" title="提示"
  145. :content="errorTipMessage" @confirm="handleCloseErrorTipsModal"
  146. @close="handleCloseErrorTipsModal" />
  147. </uni-popup>
  148. </view>
  149. </template>
  150. </gui-page>
  151. </template>
  152. <script>
  153. import {
  154. defineComponent,
  155. ref,
  156. computed,
  157. onMounted
  158. } from 'vue'
  159. export default defineComponent({
  160. setup() {
  161. const modalForm = ref('')
  162. const errorTip = ref('')
  163. const errorTipMessage = ref('')
  164. const easyinput = ref('')
  165. const easyinput2 = ref('')
  166. const errorState = ref(0)
  167. const fdIndex = ref(0)
  168. const scanParams = ref({
  169. deliveryOrderNo: '',
  170. supplierCode: '',
  171. supplierName: '',
  172. materialUrl:'',
  173. reportUrl:'',
  174. remark: '',
  175. scanType: '',
  176. deliverBatch: '',
  177. validateFlag: -1,
  178. detail: []
  179. })
  180. const scanTypeList = ref([])
  181. const handleMapass = function() {
  182. // uni.$reqGet("scanDeliveryOrderNo", {
  183. // deliveryOrderNo: "CGSH230907000007"
  184. // })
  185. // .then(({
  186. // code,
  187. // data,
  188. // msg
  189. // }) => {
  190. // if (code === 0) {
  191. // Object.assign(scanParams.value, data);
  192. // // 给箱数补默认值
  193. // scanParams.value.detail.forEach(item => {
  194. // if (item.bagQty == null || item.bagQty === '') item.bagQty = 1
  195. // })
  196. // setInputFocus2();
  197. // } else {
  198. // // #ifdef APP-PLUS
  199. // plus.device.beep(2);
  200. // // #endif
  201. // errorTipMessage.value = msg;
  202. // errorTip.value.open();
  203. // errorState.value = 0;
  204. // }
  205. // })
  206. // #ifdef APP-PLUS
  207. const mpaasScanModule = uni.requireNativePlugin('Mpaas-Scan-Module')
  208. mpaasScanModule.mpaasScan({
  209. // 扫码识别类型,参数可多选,qrCode、barCode,不设置,默认识别所有
  210. 'scanType': ['qrCode', 'barCode'],
  211. // 是否隐藏相册,默认false不隐藏
  212. 'hideAlbum': false
  213. },
  214. (ret) => {
  215. // errorTipMessage.value = ret.resp_code + "-" + ret.resp_result;
  216. // errorTip.value.open();
  217. // errorState.value = -1;
  218. if (ret.resp_code === 1000) {
  219. uni.$reqGet('scanDeliveryOrderNo', {
  220. deliveryOrderNo: ret.resp_result,
  221. tableName: scanParams.value.scanType
  222. })
  223. .then(({
  224. code,
  225. data,
  226. msg
  227. }) => {
  228. if (code === 0) {
  229. Object.assign(scanParams.value, data)
  230. // 给箱数补默认值
  231. scanParams.value.detail.forEach(item => {
  232. if (item.bagQty == null || item.bagQty === '') item.bagQty = 1
  233. })
  234. setInputFocus2()
  235. } else {
  236. // #ifdef APP-PLUS
  237. plus.device.beep(2)
  238. // #endif
  239. errorTipMessage.value = msg
  240. errorTip.value.open()
  241. errorState.value = 0
  242. }
  243. })
  244. }
  245. })
  246. // #endif
  247. }
  248. // 扫描送货单输入框回车事件
  249. const confirmDeliverOrderNo = function(e) {
  250. uni.$reqGet('scanDeliveryOrderNo', {
  251. deliveryOrderNo: e,
  252. tableName: scanParams.value.scanType,
  253. })
  254. .then(({
  255. code,
  256. data,
  257. msg
  258. }) => {
  259. if (code === 0) {
  260. Object.assign(scanParams.value, data)
  261. // 给箱数补默认值
  262. scanParams.value.detail.forEach(item => {
  263. if (item.bagQty == null || item.bagQty === '') item.bagQty = 1
  264. })
  265. setInputFocus2()
  266. } else {
  267. // #ifdef APP-PLUS
  268. plus.device.beep(2)
  269. // #endif
  270. errorTipMessage.value = msg
  271. errorTip.value.open()
  272. errorState.value = 0
  273. }
  274. })
  275. }
  276. const handleScanMaterial = function() {
  277. // #ifdef APP-PLUS
  278. const mpaasScanModule = uni.requireNativePlugin('Mpaas-Scan-Module')
  279. mpaasScanModule.mpaasScan({
  280. // 扫码识别类型,参数可多选,qrCode、barCode,不设置,默认识别所有
  281. 'scanType': ['qrCode', 'barCode'],
  282. // 是否隐藏相册,默认false不隐藏
  283. 'hideAlbum': false
  284. },
  285. (ret) => {
  286. if (ret.resp_code === 1000) {
  287. uni.$reqGet('scanRegisterMaterial', {
  288. batchNumber: ret.resp_result
  289. })
  290. .then(({
  291. code,
  292. data,
  293. msg
  294. }) => {
  295. scanParams.value.deliverBatch = data?.deliverBatch
  296. if (code === 0) {
  297. fdIndex.value = scanParams.value.detail.findIndex(item => item
  298. ?.deliverBatch ===
  299. data?.deliverBatch)
  300. if (fdIndex.value !== -1) {
  301. if (data?.ifExpired === 1) {
  302. // 物料超过保质期
  303. modalForm.value.open()
  304. } else {
  305. setInputFocus2()
  306. scanParams.value.detail[fdIndex.value].state = true
  307. }
  308. } else {
  309. // #ifdef APP-PLUS
  310. plus.device.beep(2)
  311. // #endif
  312. errorTipMessage.value = '请扫描正确的物料'
  313. errorTip.value.open()
  314. errorState.value = 1
  315. }
  316. } else {
  317. // #ifdef APP-PLUS
  318. plus.device.beep(2)
  319. // #endif
  320. errorTipMessage.value = msg
  321. errorTip.value.open()
  322. errorState.value = 1
  323. }
  324. })
  325. }
  326. })
  327. // #endif
  328. }
  329. // 扫描物料输入框回车事件
  330. const confirmMaterial = function(e) {
  331. uni.$reqGet('scanRegisterMaterial', {
  332. batchNumber: e
  333. })
  334. .then(({
  335. code,
  336. data,
  337. msg
  338. }) => {
  339. scanParams.value.deliverBatch = data?.deliverBatch
  340. if (code === 0) {
  341. fdIndex.value = scanParams.value.detail.findIndex(item => item
  342. ?.deliverBatch ===
  343. data?.deliverBatch)
  344. if (fdIndex.value !== -1) {
  345. if (data?.ifExpired === 1) {
  346. // 物料超过保质期
  347. modalForm.value.open()
  348. } else {
  349. setInputFocus2()
  350. scanParams.value.detail[fdIndex.value].state = true
  351. }
  352. } else {
  353. // #ifdef APP-PLUS
  354. plus.device.beep(2)
  355. // #endif
  356. errorTipMessage.value = '请扫描正确的物料'
  357. errorTip.value.open()
  358. errorState.value = 1
  359. }
  360. } else {
  361. // #ifdef APP-PLUS
  362. plus.device.beep(2)
  363. // #endif
  364. errorTipMessage.value = msg
  365. errorTip.value.open()
  366. errorState.value = 1
  367. }
  368. })
  369. }
  370. const handleNavigateToRegisterRecord = function() {
  371. uni.navigateTo({
  372. url: '/pages/workbranch/warehouse/materialRegister/Record/registerRecord'
  373. })
  374. }
  375. // 登记
  376. const handeleRegister = function() {
  377. let isTrue = false
  378. if (scanParams.value.detail.length === 0) {
  379. // #ifdef APP-PLUS
  380. plus.device.beep(2)
  381. // #endif
  382. errorTipMessage.value = '登记数据不能为空'
  383. errorTip.value.open()
  384. errorState.value = 0
  385. return
  386. }
  387. if (scanParams.value.validateFlag === 0) {
  388. isTrue = true
  389. } else {
  390. isTrue = scanParams.value.detail.every(item => item.state === true)
  391. }
  392. if (isTrue) {
  393. uni.showLoading({
  394. title: '数据请求中',
  395. duration: 20000,
  396. mask: true
  397. })
  398. // 深拷贝参数对象
  399. const requestParams = JSON.parse(JSON.stringify(scanParams.value))
  400. // 转换生产日期为时间戳
  401. requestParams.detail.forEach(item => {
  402. if (item.produceDate) {
  403. // 将日期字符串转换为时间戳
  404. item.produceDate = new Date(item.produceDate).getTime()
  405. }
  406. })
  407. uni.$reqPost('incomingReceiptMasterCreate', requestParams)
  408. .then(({
  409. code,
  410. data,
  411. msg
  412. }) => {
  413. scanParams.value = {
  414. deliveryOrderNo: '',
  415. supplierCode: '',
  416. supplierName: '',
  417. materialUrl:'',
  418. reportUrl:'',
  419. remark: '',
  420. scanType: '',
  421. deliverBatch: '',
  422. validateFlag: -1,
  423. detail: []
  424. }
  425. if (code === 0) {
  426. uni.showToast({
  427. title: '来料登记成功',
  428. icon: 'none',
  429. duration: 2000
  430. })
  431. } else {
  432. // #ifdef APP-PLUS
  433. plus.device.beep(2)
  434. // #endif
  435. errorTipMessage.value = msg
  436. errorTip.value.open()
  437. errorState.value = -1
  438. }
  439. })
  440. .finally(() => {
  441. uni.hideLoading()
  442. })
  443. } else {
  444. // #ifdef APP-PLUS
  445. plus.device.beep(2)
  446. // #endif
  447. errorTipMessage.value = '请填写完整需求清单'
  448. errorTip.value.open()
  449. errorState.value = 1
  450. }
  451. }
  452. const handleCompleteDialog = function() {
  453. setInputFocus2()
  454. scanParams.value.detail[fdIndex.value].state = true
  455. modalForm.value.close()
  456. }
  457. const handleCloseDialog = function() {
  458. setInputFocus2()
  459. modalForm.value.close()
  460. }
  461. const goBack = function() {
  462. uni.$goBack('/pages/workbranch/warehouse/materialRegister/registerType')
  463. }
  464. const setInputFocus = function() {
  465. scanParams.value.deliveryOrderNo = ''
  466. easyinput.value.onBlur()
  467. easyinput.value.onFocus()
  468. }
  469. const setInputFocus2 = function() {
  470. scanParams.value.deliverBatch = ''
  471. easyinput2.value.onBlur()
  472. easyinput2.value.onFocus()
  473. }
  474. // 关闭错误信息弹窗
  475. const handleCloseErrorTipsModal = async function() {
  476. errorTip.value.close()
  477. if (errorState.value === 0) {
  478. await setInputFocus()
  479. } else if (errorState.value === 1) {
  480. await setInputFocus2()
  481. }
  482. }
  483. // 计算总数量
  484. const calculateTotalQty = function(item) {
  485. const bagQty = item.bagQty || 1
  486. const receiptQty = item.receiptQty || 0
  487. return bagQty * receiptQty
  488. }
  489. // 处理箱数变化
  490. const handleBagQtyChange = function() {
  491. // 当箱数变化时,Vue的响应式会自动触发calculateTotalQty的重新计算
  492. }
  493. // 禁用软键盘
  494. const handleInputFocus = function() {
  495. setTimeout(() => {
  496. uni.hideKeyboard()
  497. }, 100)
  498. }
  499. // 计算属性:获取扫码类型的中文标签
  500. const scanTypeLabel = computed(() => {
  501. if (!scanParams.value.scanType) return '未选择'
  502. const typeItem = scanTypeList.value.find(item => item.value === scanParams.value.scanType)
  503. return typeItem ? typeItem.text : scanParams.value.scanType
  504. })
  505. onMounted(() => {
  506. // 获取扫码类型字典数据
  507. uni.$reqGet('getDictDataPage', {
  508. dictType: 'srm_tablename_type', // 使用字典编码418
  509. pageNo: 1,
  510. pageSize: 100
  511. }).then(({ data }) => {
  512. scanTypeList.value = []
  513. const dataList = data?.list || [];
  514. for (var i = 0; i < dataList.length; i++) {
  515. scanTypeList.value.push({
  516. text: dataList[i].label,
  517. value: dataList[i].value,
  518. })
  519. }
  520. })
  521. })
  522. return {
  523. goBack,
  524. modalForm,
  525. easyinput,
  526. easyinput2,
  527. errorState,
  528. errorTip,
  529. errorTipMessage,
  530. scanParams,
  531. scanTypeList,
  532. scanTypeLabel,
  533. handleMapass,
  534. handleInputFocus,
  535. handleCompleteDialog,
  536. handleCloseDialog,
  537. handleScanMaterial,
  538. handeleRegister,
  539. confirmMaterial,
  540. confirmDeliverOrderNo,
  541. handleCloseErrorTipsModal,
  542. handleNavigateToRegisterRecord,
  543. calculateTotalQty,
  544. handleBagQtyChange
  545. }
  546. }
  547. })
  548. </script>
  549. <style lang="scss" scoped>
  550. .gui-header-leader-btns {
  551. color: black;
  552. font-size: 24px !important;
  553. }
  554. .gui-sbody {
  555. background-color: rgba(234, 239, 242, 1);
  556. }
  557. .form {
  558. margin-top: 85px;
  559. font-size: 14px;
  560. }
  561. .row {
  562. height: 55px;
  563. display: flex;
  564. justify-content: center;
  565. padding-left: 20px;
  566. padding-right: 20px;
  567. margin: 10px 0;
  568. background-color: white;
  569. .row-card {
  570. display: flex;
  571. flex-direction: row;
  572. justify-content: space-between;
  573. align-items: center;
  574. width: calc(375px - 30px);
  575. }
  576. }
  577. .input-200 {
  578. width: 200px;
  579. padding-left: 10px;
  580. }
  581. .font-icons {
  582. width: 40px;
  583. font-size: 20px;
  584. text-align: right;
  585. }
  586. .card-list-flexbox {
  587. width: calc(100vw - 24px);
  588. height: 195px;
  589. margin: 0 12px;
  590. display: flex;
  591. justify-content: center;
  592. flex-direction: column;
  593. align-items: center;
  594. overflow-y: scroll;
  595. .card-list-title {
  596. width: 100%;
  597. height: 35px;
  598. line-height: 35px;
  599. margin: 0 4px 0 4px;
  600. border-radius: 4px 4px 0 0;
  601. text-align: center;
  602. color: white;
  603. background-color: rgba(0, 160, 233, 1.0);
  604. }
  605. .card-list-item,
  606. .card-list-item-operation {
  607. width: 100%;
  608. height: 35px;
  609. margin: 0 4px 3rpx 4px;
  610. border-radius: 4px;
  611. display: flex;
  612. flex-direction: row;
  613. align-items: center;
  614. justify-content: space-between;
  615. background-color: #fff;
  616. uni-text {
  617. font-size: 14px;
  618. height: 50rpx;
  619. text-align: left;
  620. padding: 0 8px;
  621. display: flex;
  622. flex-direction: row;
  623. align-items: center;
  624. }
  625. .text-1 {
  626. flex: 1;
  627. height: 35px;
  628. justify-content: flex-start;
  629. }
  630. .text-2 {
  631. flex: 3;
  632. height: 35px;
  633. justify-content: flex-end;
  634. margin-right: 4px;
  635. padding: 2px 6px;
  636. }
  637. }
  638. }
  639. .table-title {
  640. height: 40px;
  641. line-height: 40px;
  642. margin: 4px 0 -3px 0;
  643. padding: 0 12px;
  644. font-size: 16px;
  645. font-weight: bold;
  646. background-color: white;
  647. }
  648. .custom-table {
  649. height: calc(100vh - 405px);
  650. min-height: 230px;
  651. margin: 5px 0;
  652. overflow-y: scroll;
  653. }
  654. </style>