index.vue 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833
  1. <template>
  2. <view class="detail-page">
  3. <!-- 顶部状态栏 -->
  4. <view class="header-section">
  5. <view class="header-content">
  6. <view class="title-group">
  7. <text class="main-title">黑名单企业监控</text>
  8. <text class="sub-title">监控异常经营企业</text>
  9. </view>
  10. <view class="stat-box">
  11. <text class="stat-num">{{ rows?.length || 0 }}</text>
  12. <text class="stat-unit">家</text>
  13. </view>
  14. </view>
  15. <view class="header-toolbar">
  16. <view class="update-tip">
  17. <!-- <text class="tip-icon">🕒</text> -->
  18. <text>统计日期:{{
  19. formatDate(
  20. new Date().setDate(new Date().getDate() - 1),
  21. "YYYY-MM-DD",
  22. ) || "--"
  23. }}</text>
  24. </view>
  25. <view class="filter-wrap">
  26. <view class="selector" @click.stop="toggleProvinceDropdown">
  27. <text class="selector-text">{{
  28. selectedProvince || "全部省份"
  29. }}</text>
  30. <text class="selector-arrow" :class="{ open: dropdownProvinceOpen }"></text>
  31. </view>
  32. </view>
  33. </view>
  34. <!-- 背景装饰 -->
  35. <view class="header-circle circle-1"></view>
  36. <view class="header-circle circle-2"></view>
  37. </view>
  38. <scroll-view class="list-scroll" scroll-y="true" refresher-enabled :refresher-triggered="isRefreshing"
  39. @refresherrefresh="onRefresh">
  40. <view class="list-container">
  41. <view class="card-item" v-for="(item, index) in rows" :key="index" @click="toDetail(item)">
  42. <view class="card-header">
  43. <view class="header-left">
  44. <text class="index-num">{{ index + 1 }}</text>
  45. <text class="company-name">{{ item.queryCustomer }}</text>
  46. </view>
  47. <view class="header-right">
  48. <text class="status-tag">黑名单</text>
  49. </view>
  50. </view>
  51. <view class="card-body">
  52. <view class="code-row">
  53. <text class="label">信用代码:</text>
  54. <text class="value code-text">{{ item.socialCreditCode }}</text>
  55. </view>
  56. <view class="info-grid">
  57. <view class="info-item">
  58. <text class="label">省份</text>
  59. <text class="value">{{ item.province }}</text>
  60. </view>
  61. </view>
  62. </view>
  63. </view>
  64. <view v-if="!loading && rows.length === 0" class="empty-data">
  65. <EmptyView text="无相关数据" />
  66. </view>
  67. </view>
  68. </scroll-view>
  69. <view class="footer-btn-area">
  70. <button class="action-btn history-btn" @click="handleHistory">
  71. 历史记录
  72. </button>
  73. <button class="action-btn export-btn" @click="handleExport">
  74. 导出至邮箱
  75. </button>
  76. </view>
  77. <!-- 蒙层 -->
  78. <view class="report-export-create-modal-mask" v-if="emailModalOpen" @click="closeEmailModal"
  79. @touchmove.stop.prevent></view>
  80. <!-- 邮箱导出弹窗 -->
  81. <view class="report-export-create-modal report-export-create-email-modal"
  82. :class="{ 'report-export-create-modal--open': emailModalOpen }" v-if="emailModalOpen">
  83. <view class="report-export-create-modal-title">
  84. <text>发送至邮箱</text>
  85. <view class="report-export-create-modal-close" @click.stop="closeEmailModal">×</view>
  86. </view>
  87. <view class="report-export-create-modal-body" :style="{ padding: '40rpx' }">
  88. <up-input v-model="emailForm.email" border="none" :customStyle="{
  89. backgroundColor: '#ebf3fb',
  90. height: '80rpx',
  91. paddingLeft: '20rpx',
  92. }" placeholder="请填写邮箱" @input="emailError = false" disabled>
  93. <template #suffix>
  94. <view style="margin-right: 20rpx; color: #666">@999.com.cn</view>
  95. </template>
  96. </up-input>
  97. <text v-if="emailError" class="report-export-error-text">请输入邮箱</text>
  98. </view>
  99. <view class="report-export-create-modal-footer" :style="{
  100. padding: '20rpx 40rpx 40rpx',
  101. display: 'flex',
  102. 'justify-content': 'space-between',
  103. }">
  104. <view class="report-export-create-modal-btn cancel-btn" @click.stop="closeEmailModal">取消</view>
  105. <view class="report-export-create-modal-btn confirm-btn" @click.stop="handleSendEmail">发送</view>
  106. </view>
  107. </view>
  108. <!-- 独立的下拉菜单层 -->
  109. <view class="dropdown-layer" v-if="dropdownProvinceOpen" @click.stop>
  110. <view class="dropdown">
  111. <view class="dropdown-search-bar">
  112. <input class="dropdown-search-input" v-model="provinceSearchText" @input="onProvinceSearch"
  113. placeholder="搜索省份..." placeholder-style="color: #999" />
  114. </view>
  115. <scroll-view scroll-y="true" class="dropdown-scroll-view">
  116. <view class="dropdown-item" v-for="(p, i) in filteredProvinceList" :key="p || i" :class="{
  117. active: p === selectedProvince || (!selectedProvince && i === 0),
  118. }" @click.stop="selectProvince(p)">
  119. {{ p || "全部省份" }}
  120. <text v-if="p === selectedProvince || (!selectedProvince && i === 0)" class="check-mark">✓</text>
  121. </view>
  122. <view v-if="filteredProvinceList.length === 0" class="dropdown-empty">暂无数据</view>
  123. </scroll-view>
  124. </view>
  125. </view>
  126. </view>
  127. </template>
  128. <script>
  129. import EmptyView from "../../../wigets/empty.vue";
  130. import request from "../../../request/index.js";
  131. import { formatDate } from "../../../utils/utils.js";
  132. export default {
  133. components: {
  134. EmptyView,
  135. },
  136. data() {
  137. return {
  138. isRefreshing: false,
  139. loading: false,
  140. rows: [],
  141. allRows: [],
  142. dropdownProvinceOpen: false,
  143. provinceSearchText: "",
  144. provinceList: [""],
  145. selectedProvince: "",
  146. emailModalOpen: false,
  147. emailForm: {
  148. email: "",
  149. },
  150. emailError: false,
  151. };
  152. },
  153. created() {
  154. this.resetFetch();
  155. this.getProviceList();
  156. const userEmail = uni.getStorageSync('traceCode_useremail')
  157. this.emailForm.email = userEmail
  158. },
  159. methods: {
  160. formatDate,
  161. getProviceList() {
  162. request("/common/getProviceList", {
  163. path: "traceabilityReport/pages/blacklist/index.vue",
  164. }).then((res) => {
  165. if (res.code == 200) {
  166. const _data = res.data || [];
  167. this.provinceList = ["", ..._data.map((item) => item.regionName)];
  168. }
  169. });
  170. },
  171. fetchList() {
  172. if (this.loading) return;
  173. this.loading = true;
  174. const yesterday = new Date();
  175. yesterday.setDate(yesterday.getDate() - 1);
  176. const dateStr = this.formatDate(yesterday, "YYYY-MM-DD");
  177. request("/blacklist-report/get-export-company-data", {
  178. fromDate: dateStr,
  179. toDate: dateStr,
  180. path: "traceabilityReport/pages/blacklist/index.vue",
  181. }).then((res) => {
  182. if (res.code == 200) {
  183. this.allRows = res.data || [];
  184. this.applyFilter();
  185. }
  186. this.loading = false;
  187. this.isRefreshing = false;
  188. });
  189. },
  190. async onRefresh() {
  191. this.isRefreshing = true;
  192. this.fetchList();
  193. },
  194. resetFetch() {
  195. this.rows = [];
  196. this.fetchList();
  197. },
  198. toDetail(item) {
  199. uni.navigateTo({
  200. url: `/traceCodePackages/traceabilityReport/pages/blacklist/detail/index?id=${item.socialCreditCode}&dateStr=${item.billTime}&name=${encodeURIComponent(item.queryCustomer)}`,
  201. });
  202. },
  203. handleHistory() {
  204. uni.navigateTo({
  205. url: "/traceCodePackages/traceabilityReport/pages/blacklist/history/index",
  206. });
  207. },
  208. handleExport() {
  209. if (this.rows?.length == 0) {
  210. uni.showToast({
  211. title: '暂无数据...',
  212. icon: 'none'
  213. })
  214. return
  215. }
  216. this.emailModalOpen = true;
  217. this.emailError = false;
  218. },
  219. closeEmailModal() {
  220. this.emailModalOpen = false;
  221. },
  222. handleSendEmail() {
  223. if (!this.emailForm.email) {
  224. this.emailError = true;
  225. return;
  226. }
  227. uni.showLoading({ title: "发送中..." });
  228. request("/report/sendemail", {
  229. taskId: this.rows[0]?.taskId,
  230. emailAddress: this.emailForm.email + "@999.com.cn",
  231. path: "traceabilityReport/pages/blacklist/index.vue",
  232. }).then((res) => {
  233. uni.hideLoading();
  234. if (res.code == 200) {
  235. uni.showToast({
  236. title: "发送成功",
  237. icon: "success",
  238. });
  239. this.closeEmailModal();
  240. } else {
  241. uni.showToast({
  242. title: res.msg || "发送失败",
  243. icon: "none",
  244. });
  245. }
  246. });
  247. },
  248. applyFilter() {
  249. if (!this.selectedProvince) {
  250. this.rows = [...this.allRows];
  251. } else {
  252. this.rows = this.allRows.filter(item => item.customerProvinceName === this.selectedProvince);
  253. }
  254. this.totalCount = this.rows.length;
  255. },
  256. toggleProvinceDropdown() {
  257. this.dropdownProvinceOpen = !this.dropdownProvinceOpen;
  258. },
  259. closeProvinceDropdown() {
  260. this.dropdownProvinceOpen = false;
  261. },
  262. selectProvince(province) {
  263. this.selectedProvince = province || "";
  264. this.dropdownProvinceOpen = false;
  265. this.applyFilter();
  266. },
  267. },
  268. computed: {
  269. filteredProvinceList() {
  270. if (!this.provinceSearchText) {
  271. return this.provinceList;
  272. }
  273. return this.provinceList.filter((p) =>
  274. p?.toLowerCase()?.includes(this.provinceSearchText.toLowerCase()),
  275. );
  276. },
  277. },
  278. };
  279. </script>
  280. <style scoped>
  281. .detail-page {
  282. display: flex;
  283. flex-direction: column;
  284. height: calc(100vh - 116rpx - env(safe-area-inset-bottom));
  285. box-sizing: border-box;
  286. background: #f5f7fa;
  287. }
  288. /* Header Section */
  289. .header-section {
  290. background: linear-gradient(135deg, #2b32b2 0%, #1488cc 100%);
  291. padding: 40rpx 40rpx 80rpx;
  292. /* Extra padding at bottom for overlap effect */
  293. position: relative;
  294. z-index: 20;
  295. color: #fff;
  296. border-bottom-left-radius: 40rpx;
  297. border-bottom-right-radius: 40rpx;
  298. overflow: hidden;
  299. box-shadow: 0 10rpx 30rpx rgba(20, 136, 204, 0.2);
  300. }
  301. .header-content {
  302. display: flex;
  303. justify-content: space-between;
  304. align-items: center;
  305. position: relative;
  306. z-index: 2;
  307. margin-bottom: 24rpx;
  308. }
  309. .title-group {
  310. display: flex;
  311. flex-direction: column;
  312. }
  313. .main-title {
  314. font-size: 40rpx;
  315. font-weight: bold;
  316. margin-bottom: 8rpx;
  317. letter-spacing: 2rpx;
  318. }
  319. .sub-title {
  320. font-size: 24rpx;
  321. opacity: 0.8;
  322. }
  323. .stat-box {
  324. display: flex;
  325. align-items: baseline;
  326. }
  327. .stat-num {
  328. font-size: 56rpx;
  329. font-weight: bold;
  330. margin-right: 8rpx;
  331. font-family: "DINAlternate-Bold", sans-serif;
  332. }
  333. .stat-unit {
  334. font-size: 24rpx;
  335. opacity: 0.8;
  336. }
  337. .header-toolbar {
  338. display: flex;
  339. justify-content: space-between;
  340. align-items: center;
  341. position: relative;
  342. z-index: 3;
  343. }
  344. .update-tip {
  345. display: inline-flex;
  346. align-items: center;
  347. background: rgba(255, 255, 255, 0.15);
  348. padding: 8rpx 20rpx;
  349. border-radius: 30rpx;
  350. font-size: 22rpx;
  351. backdrop-filter: blur(10px);
  352. }
  353. .tip-icon {
  354. margin-right: 8rpx;
  355. font-size: 20rpx;
  356. }
  357. /* Filter Styles */
  358. .filter-wrap {
  359. position: relative;
  360. }
  361. .selector {
  362. display: flex;
  363. align-items: center;
  364. color: #fff;
  365. font-size: 26rpx;
  366. font-weight: 500;
  367. padding: 8rpx 20rpx;
  368. background: rgba(255, 255, 255, 0.2);
  369. border-radius: 30rpx;
  370. border: 1rpx solid rgba(255, 255, 255, 0.3);
  371. }
  372. .selector-text {
  373. max-width: 200rpx;
  374. overflow: hidden;
  375. white-space: nowrap;
  376. text-overflow: ellipsis;
  377. }
  378. .selector-arrow {
  379. margin-left: 10rpx;
  380. width: 0;
  381. height: 0;
  382. border-left: 8rpx solid transparent;
  383. border-right: 8rpx solid transparent;
  384. border-top: 10rpx solid #fff;
  385. transition: transform 0.3s;
  386. }
  387. .selector-arrow.open {
  388. transform: rotate(180deg);
  389. }
  390. /* Dropdown Layer (Absolute on top of everything) */
  391. .dropdown-layer {
  392. position: absolute;
  393. top: 300rpx;
  394. /* Adjust based on header layout */
  395. right: 40rpx;
  396. z-index: 999;
  397. }
  398. .dropdown {
  399. width: 360rpx;
  400. background: #fff;
  401. border-radius: 12rpx;
  402. box-shadow: 0 8rpx 30rpx rgba(0, 0, 0, 0.15);
  403. overflow: hidden;
  404. }
  405. .dropdown-search-bar {
  406. padding: 16rpx;
  407. border-bottom: 1rpx solid #f0f0f0;
  408. }
  409. .dropdown-search-input {
  410. background: #f5f7fa;
  411. height: 64rpx;
  412. border-radius: 32rpx;
  413. padding: 0 24rpx;
  414. font-size: 26rpx;
  415. }
  416. .dropdown-scroll-view {
  417. max-height: 400rpx;
  418. }
  419. .dropdown-item {
  420. padding: 20rpx 30rpx;
  421. font-size: 28rpx;
  422. color: #333;
  423. display: flex;
  424. justify-content: space-between;
  425. align-items: center;
  426. transition: background 0.2s;
  427. }
  428. .dropdown-item:active {
  429. background: #f5f7fa;
  430. }
  431. .dropdown-item.active {
  432. color: #1890ff;
  433. font-weight: 500;
  434. background: #e6f7ff;
  435. }
  436. .check-mark {
  437. font-size: 24rpx;
  438. }
  439. .dropdown-empty {
  440. padding: 40rpx;
  441. text-align: center;
  442. color: #999;
  443. font-size: 26rpx;
  444. }
  445. /* Header Decor Circles */
  446. .header-circle {
  447. position: absolute;
  448. border-radius: 50%;
  449. background: rgba(255, 255, 255, 0.05);
  450. }
  451. .circle-1 {
  452. width: 300rpx;
  453. height: 300rpx;
  454. top: -100rpx;
  455. right: -50rpx;
  456. }
  457. .circle-2 {
  458. width: 200rpx;
  459. height: 200rpx;
  460. bottom: -50rpx;
  461. left: -50rpx;
  462. }
  463. /* List Scroll */
  464. .list-scroll {
  465. flex: 1;
  466. height: 0;
  467. padding: 0 24rpx;
  468. /* Remove vertical padding from scroll container */
  469. box-sizing: border-box;
  470. margin-top: -50rpx;
  471. /* Negative margin to pull list up */
  472. position: relative;
  473. z-index: 21;
  474. }
  475. .list-container {
  476. padding-top: 10rpx;
  477. padding-bottom: calc(200rpx + env(safe-area-inset-bottom));
  478. }
  479. .card-item {
  480. background: #fff;
  481. border-radius: 20rpx;
  482. padding: 30rpx;
  483. margin-bottom: 24rpx;
  484. box-shadow: 0 8rpx 24rpx rgba(0, 0, 0, 0.05);
  485. transition: transform 0.2s;
  486. }
  487. .card-item:active {
  488. transform: scale(0.99);
  489. }
  490. .card-header {
  491. display: flex;
  492. justify-content: space-between;
  493. align-items: flex-start;
  494. margin-bottom: 24rpx;
  495. }
  496. .header-left {
  497. flex: 1;
  498. display: flex;
  499. align-items: center;
  500. margin-right: 20rpx;
  501. }
  502. .index-num {
  503. font-size: 24rpx;
  504. color: #999;
  505. margin-right: 12rpx;
  506. font-family: monospace;
  507. }
  508. .company-name {
  509. font-size: 32rpx;
  510. font-weight: 600;
  511. color: #096dd9;
  512. line-height: 1.4;
  513. text-decoration: underline;
  514. }
  515. .header-right {
  516. flex-shrink: 0;
  517. }
  518. .status-tag {
  519. font-size: 20rpx;
  520. padding: 6rpx 16rpx;
  521. border-radius: 20rpx;
  522. background: #fff1f0;
  523. color: #ff4d4f;
  524. font-weight: 600;
  525. border: 1rpx solid rgba(255, 77, 79, 0.2);
  526. }
  527. .card-body {
  528. background: #f9fbfd;
  529. border-radius: 12rpx;
  530. padding: 24rpx;
  531. }
  532. .code-row {
  533. display: flex;
  534. align-items: center;
  535. margin-bottom: 20rpx;
  536. padding-bottom: 20rpx;
  537. border-bottom: 1rpx solid #edf0f5;
  538. }
  539. .code-row:last-child {
  540. margin-bottom: 0;
  541. padding-bottom: 0;
  542. border-bottom: none;
  543. }
  544. .code-text {
  545. font-family: monospace;
  546. color: #333 !important;
  547. font-weight: 600 !important;
  548. letter-spacing: 1rpx;
  549. }
  550. .info-grid {
  551. display: flex;
  552. flex-wrap: wrap;
  553. gap: 24rpx;
  554. }
  555. .info-item {
  556. display: flex;
  557. align-items: center;
  558. width: 45%;
  559. }
  560. .info-item .label,
  561. .code-row .label {
  562. font-size: 24rpx;
  563. color: #999;
  564. margin-right: 12rpx;
  565. }
  566. .info-item .value,
  567. .code-row .value {
  568. font-size: 26rpx;
  569. color: #666;
  570. font-weight: 500;
  571. }
  572. /* Loading & Footer */
  573. .loading-more {
  574. display: flex;
  575. justify-content: center;
  576. align-items: center;
  577. padding: 30rpx 0;
  578. }
  579. .loading-text {
  580. font-size: 24rpx;
  581. color: #999;
  582. }
  583. .loading-icon {
  584. width: 32rpx;
  585. height: 32rpx;
  586. margin-right: 12rpx;
  587. animation: spin 1s linear infinite;
  588. }
  589. .empty-data {
  590. padding-top: 120rpx;
  591. }
  592. .no-more {
  593. text-align: center;
  594. color: #ccc;
  595. font-size: 24rpx;
  596. padding: 30rpx 0;
  597. }
  598. @keyframes spin {
  599. from {
  600. transform: rotate(0deg);
  601. }
  602. to {
  603. transform: rotate(360deg);
  604. }
  605. }
  606. .footer-btn-area {
  607. padding: 24rpx 32rpx calc(24rpx + env(safe-area-inset-bottom));
  608. background: #fff;
  609. box-shadow: 0 -4rpx 20rpx rgba(0, 0, 0, 0.08);
  610. position: fixed;
  611. z-index: 100;
  612. bottom: 0;
  613. width: 100%;
  614. box-sizing: border-box;
  615. display: flex;
  616. gap: 24rpx;
  617. }
  618. .action-btn {
  619. flex: 1;
  620. height: 88rpx;
  621. line-height: 88rpx;
  622. border-radius: 44rpx;
  623. font-size: 30rpx;
  624. font-weight: 600;
  625. text-align: center;
  626. border: none;
  627. transition: all 0.3s;
  628. }
  629. .action-btn::after {
  630. border: none;
  631. }
  632. .action-btn:active {
  633. transform: scale(0.96);
  634. }
  635. .history-btn {
  636. background: #fff;
  637. color: #1890ff;
  638. border: 2rpx solid #1890ff;
  639. box-shadow: 0 4rpx 12rpx rgba(24, 144, 255, 0.1);
  640. }
  641. .export-btn {
  642. background: linear-gradient(135deg, #1890ff 0%, #096dd9 100%);
  643. color: #fff;
  644. box-shadow: 0 6rpx 16rpx rgba(24, 144, 255, 0.35);
  645. }
  646. /* 弹窗样式 */
  647. .report-export-create-modal-mask {
  648. position: fixed;
  649. top: 0;
  650. left: 0;
  651. right: 0;
  652. bottom: 0;
  653. background: rgba(0, 0, 0, 0.6);
  654. z-index: 999;
  655. backdrop-filter: blur(2px);
  656. }
  657. .report-export-create-modal {
  658. position: fixed;
  659. z-index: 1000;
  660. background: #fff;
  661. transition: all 0.3s ease;
  662. }
  663. .report-export-create-email-modal {
  664. top: 50%;
  665. left: 50%;
  666. transform: translate(-50%, -50%);
  667. width: 620rpx;
  668. border-radius: 24rpx;
  669. opacity: 0;
  670. visibility: hidden;
  671. overflow: hidden;
  672. }
  673. .report-export-create-email-modal.report-export-create-modal--open {
  674. opacity: 1;
  675. visibility: visible;
  676. }
  677. .report-export-create-modal-title {
  678. padding: 36rpx 32rpx;
  679. font-size: 36rpx;
  680. color: #333;
  681. text-align: center;
  682. font-weight: 600;
  683. border-bottom: 1rpx solid #f0f0f0;
  684. position: relative;
  685. }
  686. .report-export-create-modal-close {
  687. position: absolute;
  688. right: 32rpx;
  689. top: 50%;
  690. transform: translateY(-50%);
  691. font-size: 44rpx;
  692. color: #999;
  693. line-height: 1;
  694. padding: 10rpx;
  695. }
  696. .report-export-create-modal-body {
  697. padding: 48rpx 40rpx 32rpx;
  698. }
  699. .report-export-error-text {
  700. font-size: 24rpx;
  701. color: #ff4d4f;
  702. margin-top: 12rpx;
  703. display: block;
  704. }
  705. .report-export-create-modal-footer {
  706. padding: 0 40rpx 48rpx;
  707. display: flex;
  708. justify-content: space-between;
  709. gap: 24rpx;
  710. }
  711. .report-export-create-modal-btn {
  712. height: 88rpx;
  713. line-height: 88rpx;
  714. border-radius: 44rpx;
  715. text-align: center;
  716. font-size: 30rpx;
  717. font-weight: 600;
  718. flex: 1;
  719. margin: 0;
  720. }
  721. .cancel-btn {
  722. background: #f5f7fa;
  723. color: #666;
  724. border: 1rpx solid #e4e7ed;
  725. }
  726. .confirm-btn {
  727. background: linear-gradient(135deg, #1890ff 0%, #096dd9 100%);
  728. color: #fff;
  729. box-shadow: 0 6rpx 16rpx rgba(24, 144, 255, 0.3);
  730. }
  731. </style>