|
@@ -4,37 +4,23 @@
|
|
|
<view class="header-section">
|
|
<view class="header-section">
|
|
|
<view class="header-content">
|
|
<view class="header-content">
|
|
|
<view class="title-group">
|
|
<view class="title-group">
|
|
|
- <text class="main-title">黑名单企业库</text>
|
|
|
|
|
|
|
+ <text class="main-title">黑名单企业监控</text>
|
|
|
<text class="sub-title">实时监控异常经营企业</text>
|
|
<text class="sub-title">实时监控异常经营企业</text>
|
|
|
</view>
|
|
</view>
|
|
|
<view class="stat-box">
|
|
<view class="stat-box">
|
|
|
- <text class="stat-num">{{ totalCount }}</text>
|
|
|
|
|
|
|
+ <text class="stat-num">{{ rows?.length || 0 }}</text>
|
|
|
<text class="stat-unit">家</text>
|
|
<text class="stat-unit">家</text>
|
|
|
</view>
|
|
</view>
|
|
|
</view>
|
|
</view>
|
|
|
<view class="header-toolbar">
|
|
<view class="header-toolbar">
|
|
|
<view class="update-tip">
|
|
<view class="update-tip">
|
|
|
- <text class="tip-icon">🕒</text>
|
|
|
|
|
- <text
|
|
|
|
|
- >更新:{{
|
|
|
|
|
- formatDate(
|
|
|
|
|
- new Date().setDate(new Date().getDate() - 1),
|
|
|
|
|
- "YYYY-MM-DD",
|
|
|
|
|
- ) || "--"
|
|
|
|
|
- }}</text
|
|
|
|
|
- >
|
|
|
|
|
- </view>
|
|
|
|
|
-
|
|
|
|
|
- <view class="filter-wrap">
|
|
|
|
|
- <view class="selector" @click.stop="toggleProvinceDropdown">
|
|
|
|
|
- <text class="selector-text">{{
|
|
|
|
|
- selectedProvince || "全部省份"
|
|
|
|
|
- }}</text>
|
|
|
|
|
- <text
|
|
|
|
|
- class="selector-arrow"
|
|
|
|
|
- :class="{ open: dropdownProvinceOpen }"
|
|
|
|
|
- ></text>
|
|
|
|
|
- </view>
|
|
|
|
|
|
|
+ <!-- <text class="tip-icon">🕒</text> -->
|
|
|
|
|
+ <text>更新:{{
|
|
|
|
|
+ formatDate(
|
|
|
|
|
+ new Date().setDate(new Date().getDate() - 1),
|
|
|
|
|
+ "YYYY-MM-DD",
|
|
|
|
|
+ ) || "--"
|
|
|
|
|
+ }}</text>
|
|
|
</view>
|
|
</view>
|
|
|
</view>
|
|
</view>
|
|
|
<!-- 背景装饰 -->
|
|
<!-- 背景装饰 -->
|
|
@@ -42,25 +28,14 @@
|
|
|
<view class="header-circle circle-2"></view>
|
|
<view class="header-circle circle-2"></view>
|
|
|
</view>
|
|
</view>
|
|
|
|
|
|
|
|
- <scroll-view
|
|
|
|
|
- class="list-scroll"
|
|
|
|
|
- scroll-y="true"
|
|
|
|
|
- refresher-enabled
|
|
|
|
|
- :refresher-triggered="isRefreshing"
|
|
|
|
|
- @refresherrefresh="onRefresh"
|
|
|
|
|
- @scrolltolower="onLoadMore"
|
|
|
|
|
- >
|
|
|
|
|
|
|
+ <scroll-view class="list-scroll" scroll-y="true" refresher-enabled :refresher-triggered="isRefreshing"
|
|
|
|
|
+ @refresherrefresh="onRefresh">
|
|
|
<view class="list-container">
|
|
<view class="list-container">
|
|
|
- <view
|
|
|
|
|
- class="card-item"
|
|
|
|
|
- v-for="(item, index) in rows"
|
|
|
|
|
- :key="index"
|
|
|
|
|
- @click="toDetail(item)"
|
|
|
|
|
- >
|
|
|
|
|
|
|
+ <view class="card-item" v-for="(item, index) in rows" :key="index" @click="toDetail(item)">
|
|
|
<view class="card-header">
|
|
<view class="card-header">
|
|
|
<view class="header-left">
|
|
<view class="header-left">
|
|
|
<text class="index-num">{{ index + 1 }}</text>
|
|
<text class="index-num">{{ index + 1 }}</text>
|
|
|
- <text class="company-name">{{ item.receiverName }}</text>
|
|
|
|
|
|
|
+ <text class="company-name">{{ item.queryCustomer }}</text>
|
|
|
</view>
|
|
</view>
|
|
|
<view class="header-right">
|
|
<view class="header-right">
|
|
|
<text class="status-tag">黑名单</text>
|
|
<text class="status-tag">黑名单</text>
|
|
@@ -70,36 +45,20 @@
|
|
|
<view class="card-body">
|
|
<view class="card-body">
|
|
|
<view class="code-row">
|
|
<view class="code-row">
|
|
|
<text class="label">信用代码:</text>
|
|
<text class="label">信用代码:</text>
|
|
|
- <text class="value code-text">{{ item.companyCode }}</text>
|
|
|
|
|
|
|
+ <text class="value code-text">{{ item.socialCreditCode }}</text>
|
|
|
</view>
|
|
</view>
|
|
|
<view class="info-grid">
|
|
<view class="info-grid">
|
|
|
<view class="info-item">
|
|
<view class="info-item">
|
|
|
<text class="label">省份</text>
|
|
<text class="label">省份</text>
|
|
|
- <text class="value">{{ item.receiverProvince }}</text>
|
|
|
|
|
- </view>
|
|
|
|
|
- <view class="info-item">
|
|
|
|
|
- <text class="label">性质</text>
|
|
|
|
|
- <text class="value">{{ item.customerNature }}</text>
|
|
|
|
|
|
|
+ <text class="value">{{ item.province }}</text>
|
|
|
</view>
|
|
</view>
|
|
|
</view>
|
|
</view>
|
|
|
</view>
|
|
</view>
|
|
|
</view>
|
|
</view>
|
|
|
|
|
|
|
|
- <view class="loading-more" v-if="loading">
|
|
|
|
|
- <image
|
|
|
|
|
- class="loading-icon"
|
|
|
|
|
- src="../../../static/images/loading.png"
|
|
|
|
|
- />
|
|
|
|
|
- <text class="loading-text">加载中...</text>
|
|
|
|
|
- </view>
|
|
|
|
|
-
|
|
|
|
|
<view v-if="!loading && rows.length === 0" class="empty-data">
|
|
<view v-if="!loading && rows.length === 0" class="empty-data">
|
|
|
<EmptyView text="无相关数据" />
|
|
<EmptyView text="无相关数据" />
|
|
|
</view>
|
|
</view>
|
|
|
-
|
|
|
|
|
- <view v-if="!hasMore && rows.length > 0" class="no-more">
|
|
|
|
|
- <text>没有更多数据了</text>
|
|
|
|
|
- </view>
|
|
|
|
|
</view>
|
|
</view>
|
|
|
</scroll-view>
|
|
</scroll-view>
|
|
|
|
|
|
|
@@ -112,38 +71,54 @@
|
|
|
</button>
|
|
</button>
|
|
|
</view>
|
|
</view>
|
|
|
|
|
|
|
|
|
|
+ <!-- 蒙层 -->
|
|
|
|
|
+ <view class="report-export-create-modal-mask" v-if="emailModalOpen" @click="closeEmailModal"
|
|
|
|
|
+ @touchmove.stop.prevent></view>
|
|
|
|
|
+
|
|
|
|
|
+ <!-- 邮箱导出弹窗 -->
|
|
|
|
|
+ <view class="report-export-create-modal report-export-create-email-modal"
|
|
|
|
|
+ :class="{ 'report-export-create-modal--open': emailModalOpen }" v-if="emailModalOpen">
|
|
|
|
|
+ <view class="report-export-create-modal-title">
|
|
|
|
|
+ <text>发送至邮箱</text>
|
|
|
|
|
+ <view class="report-export-create-modal-close" @click.stop="closeEmailModal">×</view>
|
|
|
|
|
+ </view>
|
|
|
|
|
+ <view class="report-export-create-modal-body" :style="{ padding: '40rpx' }">
|
|
|
|
|
+ <up-input v-model="emailForm.email" border="none" :customStyle="{
|
|
|
|
|
+ backgroundColor: '#ebf3fb',
|
|
|
|
|
+ height: '80rpx',
|
|
|
|
|
+ paddingLeft: '20rpx',
|
|
|
|
|
+ }" placeholder="请填写邮箱" @input="emailError = false">
|
|
|
|
|
+ <template #suffix>
|
|
|
|
|
+ <view style="margin-right: 20rpx; color: #666">@999.com.cn</view>
|
|
|
|
|
+ </template>
|
|
|
|
|
+ </up-input>
|
|
|
|
|
+ <text v-if="emailError" class="report-export-error-text">请输入邮箱</text>
|
|
|
|
|
+ </view>
|
|
|
|
|
+ <view class="report-export-create-modal-footer" :style="{
|
|
|
|
|
+ padding: '20rpx 40rpx 40rpx',
|
|
|
|
|
+ display: 'flex',
|
|
|
|
|
+ 'justify-content': 'space-between',
|
|
|
|
|
+ }">
|
|
|
|
|
+ <view class="report-export-create-modal-btn cancel-btn" @click.stop="closeEmailModal">取消</view>
|
|
|
|
|
+ <view class="report-export-create-modal-btn confirm-btn" @click.stop="handleSendEmail">发送</view>
|
|
|
|
|
+ </view>
|
|
|
|
|
+ </view>
|
|
|
|
|
+
|
|
|
<!-- 独立的下拉菜单层 -->
|
|
<!-- 独立的下拉菜单层 -->
|
|
|
<view class="dropdown-layer" v-if="dropdownProvinceOpen" @click.stop>
|
|
<view class="dropdown-layer" v-if="dropdownProvinceOpen" @click.stop>
|
|
|
<view class="dropdown">
|
|
<view class="dropdown">
|
|
|
<view class="dropdown-search-bar">
|
|
<view class="dropdown-search-bar">
|
|
|
- <input
|
|
|
|
|
- class="dropdown-search-input"
|
|
|
|
|
- v-model="provinceSearchText"
|
|
|
|
|
- @input="onProvinceSearch"
|
|
|
|
|
- placeholder="搜索省份..."
|
|
|
|
|
- placeholder-style="color: #999"
|
|
|
|
|
- />
|
|
|
|
|
|
|
+ <input class="dropdown-search-input" v-model="provinceSearchText" @input="onProvinceSearch"
|
|
|
|
|
+ placeholder="搜索省份..." placeholder-style="color: #999" />
|
|
|
</view>
|
|
</view>
|
|
|
<scroll-view scroll-y="true" class="dropdown-scroll-view">
|
|
<scroll-view scroll-y="true" class="dropdown-scroll-view">
|
|
|
- <view
|
|
|
|
|
- class="dropdown-item"
|
|
|
|
|
- v-for="(p, i) in filteredProvinceList"
|
|
|
|
|
- :key="p || i"
|
|
|
|
|
- :class="{
|
|
|
|
|
- active: p === selectedProvince || (!selectedProvince && i === 0),
|
|
|
|
|
- }"
|
|
|
|
|
- @click.stop="selectProvince(p)"
|
|
|
|
|
- >
|
|
|
|
|
|
|
+ <view class="dropdown-item" v-for="(p, i) in filteredProvinceList" :key="p || i" :class="{
|
|
|
|
|
+ active: p === selectedProvince || (!selectedProvince && i === 0),
|
|
|
|
|
+ }" @click.stop="selectProvince(p)">
|
|
|
{{ p || "全部省份" }}
|
|
{{ p || "全部省份" }}
|
|
|
- <text
|
|
|
|
|
- v-if="p === selectedProvince || (!selectedProvince && i === 0)"
|
|
|
|
|
- class="check-mark"
|
|
|
|
|
- >✓</text
|
|
|
|
|
- >
|
|
|
|
|
|
|
+ <text v-if="p === selectedProvince || (!selectedProvince && i === 0)" class="check-mark">✓</text>
|
|
|
</view>
|
|
</view>
|
|
|
- <view v-if="filteredProvinceList.length === 0" class="dropdown-empty"
|
|
|
|
|
- >暂无数据</view
|
|
|
|
|
- >
|
|
|
|
|
|
|
+ <view v-if="filteredProvinceList.length === 0" class="dropdown-empty">暂无数据</view>
|
|
|
</scroll-view>
|
|
</scroll-view>
|
|
|
</view>
|
|
</view>
|
|
|
</view>
|
|
</view>
|
|
@@ -155,7 +130,6 @@ import EmptyView from "../../../wigets/empty.vue";
|
|
|
import request from "../../../request/index.js";
|
|
import request from "../../../request/index.js";
|
|
|
import { formatDate } from "../../../utils/utils.js";
|
|
import { formatDate } from "../../../utils/utils.js";
|
|
|
|
|
|
|
|
-const NATURES = ["协议客户", "非协议客户", "商业客户", "终端客户"];
|
|
|
|
|
|
|
|
|
|
export default {
|
|
export default {
|
|
|
components: {
|
|
components: {
|
|
@@ -166,19 +140,22 @@ export default {
|
|
|
isRefreshing: false,
|
|
isRefreshing: false,
|
|
|
loading: false,
|
|
loading: false,
|
|
|
rows: [],
|
|
rows: [],
|
|
|
- totalCount: 60, // Simulated total count
|
|
|
|
|
- hasMore: true,
|
|
|
|
|
- pageNum: 1,
|
|
|
|
|
- pageSize: 20,
|
|
|
|
|
dropdownProvinceOpen: false,
|
|
dropdownProvinceOpen: false,
|
|
|
provinceSearchText: "",
|
|
provinceSearchText: "",
|
|
|
provinceList: [""],
|
|
provinceList: [""],
|
|
|
selectedProvince: "",
|
|
selectedProvince: "",
|
|
|
|
|
+ emailModalOpen: false,
|
|
|
|
|
+ emailForm: {
|
|
|
|
|
+ email: "",
|
|
|
|
|
+ },
|
|
|
|
|
+ emailError: false,
|
|
|
};
|
|
};
|
|
|
},
|
|
},
|
|
|
created() {
|
|
created() {
|
|
|
this.resetFetch();
|
|
this.resetFetch();
|
|
|
this.getProviceList();
|
|
this.getProviceList();
|
|
|
|
|
+ const userEmail = uni.getStorageSync('traceCode_useremail')
|
|
|
|
|
+ this.emailForm.email = userEmail
|
|
|
},
|
|
},
|
|
|
methods: {
|
|
methods: {
|
|
|
formatDate,
|
|
formatDate,
|
|
@@ -194,82 +171,41 @@ export default {
|
|
|
});
|
|
});
|
|
|
},
|
|
},
|
|
|
|
|
|
|
|
- generateFakeData() {
|
|
|
|
|
- const newRows = [];
|
|
|
|
|
- const codes = [
|
|
|
|
|
- "91370104771001730R",
|
|
|
|
|
- "91420105783155681H",
|
|
|
|
|
- "91330110MA2CCJE32Y",
|
|
|
|
|
- "91441581761581268X",
|
|
|
|
|
- "91510106768621824L",
|
|
|
|
|
- ];
|
|
|
|
|
- const provinces =
|
|
|
|
|
- this.provinceList.length > 1
|
|
|
|
|
- ? this.provinceList.slice(1)
|
|
|
|
|
- : ["北京市", "上海市", "广东省", "浙江省", "江苏省"];
|
|
|
|
|
-
|
|
|
|
|
- const startIdx = (this.pageNum - 1) * this.pageSize;
|
|
|
|
|
- const endIdx = Math.min(startIdx + this.pageSize, this.totalCount);
|
|
|
|
|
-
|
|
|
|
|
- if (startIdx >= this.totalCount) {
|
|
|
|
|
- this.hasMore = false;
|
|
|
|
|
- return [];
|
|
|
|
|
- }
|
|
|
|
|
|
|
+ fetchList() {
|
|
|
|
|
+ if (this.loading) return;
|
|
|
|
|
+ this.loading = true;
|
|
|
|
|
|
|
|
- for (let i = startIdx; i < endIdx; i++) {
|
|
|
|
|
- newRows.push({
|
|
|
|
|
- id: i,
|
|
|
|
|
- receiverName: `测试收货企业${i + 1}有限公司`,
|
|
|
|
|
- companyCode: codes[i % codes.length],
|
|
|
|
|
- receiverProvince: provinces[i % provinces.length],
|
|
|
|
|
- customerNature: NATURES[i % NATURES.length],
|
|
|
|
|
- });
|
|
|
|
|
- }
|
|
|
|
|
- return newRows;
|
|
|
|
|
- },
|
|
|
|
|
|
|
+ const yesterday = new Date();
|
|
|
|
|
+ yesterday.setDate(yesterday.getDate() - 1);
|
|
|
|
|
+ const dateStr = this.formatDate(yesterday, "YYYY-MM-DD");
|
|
|
|
|
|
|
|
- async onRefresh() {
|
|
|
|
|
- this.isRefreshing = true;
|
|
|
|
|
- this.pageNum = 1;
|
|
|
|
|
- this.hasMore = true;
|
|
|
|
|
- // Simulate network request
|
|
|
|
|
- setTimeout(() => {
|
|
|
|
|
- this.rows = this.generateFakeData();
|
|
|
|
|
- this.isRefreshing = false;
|
|
|
|
|
- }, 1000);
|
|
|
|
|
- },
|
|
|
|
|
-
|
|
|
|
|
- onLoadMore() {
|
|
|
|
|
- if (this.loading || !this.hasMore) return;
|
|
|
|
|
- this.loading = true;
|
|
|
|
|
- this.pageNum++;
|
|
|
|
|
|
|
|
|
|
- // Simulate network request
|
|
|
|
|
- setTimeout(() => {
|
|
|
|
|
- const more = this.generateFakeData();
|
|
|
|
|
- if (more.length > 0) {
|
|
|
|
|
- this.rows = [...this.rows, ...more];
|
|
|
|
|
- } else {
|
|
|
|
|
- this.hasMore = false;
|
|
|
|
|
|
|
+ request("/blacklist-report/get-export-company-data", {
|
|
|
|
|
+ fromDate: dateStr,
|
|
|
|
|
+ toDate: dateStr,
|
|
|
|
|
+ path: "traceabilityReport/pages/blacklist/index.vue",
|
|
|
|
|
+ }).then((res) => {
|
|
|
|
|
+ if (res.code == 200) {
|
|
|
|
|
+ this.rows = res.data || [];
|
|
|
}
|
|
}
|
|
|
this.loading = false;
|
|
this.loading = false;
|
|
|
- }, 800);
|
|
|
|
|
|
|
+ this.isRefreshing = false;
|
|
|
|
|
+ });
|
|
|
|
|
+ },
|
|
|
|
|
+
|
|
|
|
|
+ async onRefresh() {
|
|
|
|
|
+ this.isRefreshing = true;
|
|
|
|
|
+ this.fetchList();
|
|
|
},
|
|
},
|
|
|
|
|
|
|
|
resetFetch() {
|
|
resetFetch() {
|
|
|
- this.loading = true;
|
|
|
|
|
- this.pageNum = 1;
|
|
|
|
|
- this.hasMore = true;
|
|
|
|
|
- // Simulate initial load
|
|
|
|
|
- setTimeout(() => {
|
|
|
|
|
- this.rows = this.generateFakeData();
|
|
|
|
|
- this.loading = false;
|
|
|
|
|
- }, 500);
|
|
|
|
|
|
|
+ this.rows = [];
|
|
|
|
|
+ this.fetchList();
|
|
|
},
|
|
},
|
|
|
|
|
|
|
|
toDetail(item) {
|
|
toDetail(item) {
|
|
|
uni.navigateTo({
|
|
uni.navigateTo({
|
|
|
- url: `/traceCodePackages/traceabilityReport/pages/blacklist/detail/index?id=${item.id}&name=${encodeURIComponent(item.receiverName)}`,
|
|
|
|
|
|
|
+ url: `/traceCodePackages/traceabilityReport/pages/blacklist/detail/index?id=${item.socialCreditCode}&dateStr=${item.billTime}&name=${encodeURIComponent(item.queryCustomer)}`,
|
|
|
});
|
|
});
|
|
|
},
|
|
},
|
|
|
|
|
|
|
@@ -280,25 +216,47 @@ export default {
|
|
|
},
|
|
},
|
|
|
|
|
|
|
|
handleExport() {
|
|
handleExport() {
|
|
|
- uni.showModal({
|
|
|
|
|
- title: "导出至邮箱",
|
|
|
|
|
- editable: true,
|
|
|
|
|
- placeholderText: "请输入邮箱地址",
|
|
|
|
|
- success: (res) => {
|
|
|
|
|
- if (res.confirm) {
|
|
|
|
|
- if (!res.content) {
|
|
|
|
|
- uni.showToast({
|
|
|
|
|
- title: "请输入邮箱",
|
|
|
|
|
- icon: "none",
|
|
|
|
|
- });
|
|
|
|
|
- return;
|
|
|
|
|
- }
|
|
|
|
|
- uni.showToast({
|
|
|
|
|
- title: "导出请求已发送",
|
|
|
|
|
- icon: "success",
|
|
|
|
|
- });
|
|
|
|
|
- }
|
|
|
|
|
- },
|
|
|
|
|
|
|
+ if (this.rows?.length == 0) {
|
|
|
|
|
+ uni.showToast({
|
|
|
|
|
+ title: '暂无数据...',
|
|
|
|
|
+ icon: 'none'
|
|
|
|
|
+ })
|
|
|
|
|
+ return
|
|
|
|
|
+ }
|
|
|
|
|
+ this.emailModalOpen = true;
|
|
|
|
|
+ this.emailError = false;
|
|
|
|
|
+ },
|
|
|
|
|
+
|
|
|
|
|
+ closeEmailModal() {
|
|
|
|
|
+ this.emailModalOpen = false;
|
|
|
|
|
+ },
|
|
|
|
|
+
|
|
|
|
|
+ handleSendEmail() {
|
|
|
|
|
+
|
|
|
|
|
+ if (!this.emailForm.email) {
|
|
|
|
|
+ this.emailError = true;
|
|
|
|
|
+ return;
|
|
|
|
|
+ }
|
|
|
|
|
+ uni.showLoading({ title: "发送中..." });
|
|
|
|
|
+
|
|
|
|
|
+ request("/report/sendemail", {
|
|
|
|
|
+ taskId: this.rows[0]?.taskId,
|
|
|
|
|
+ emailAddress: this.emailForm.email + "@999.com.cn",
|
|
|
|
|
+ path: "traceabilityReport/pages/blacklist/index.vue",
|
|
|
|
|
+ }).then((res) => {
|
|
|
|
|
+ uni.hideLoading();
|
|
|
|
|
+ if (res.code == 200) {
|
|
|
|
|
+ uni.showToast({
|
|
|
|
|
+ title: "发送成功",
|
|
|
|
|
+ icon: "success",
|
|
|
|
|
+ });
|
|
|
|
|
+ this.closeEmailModal();
|
|
|
|
|
+ } else {
|
|
|
|
|
+ uni.showToast({
|
|
|
|
|
+ title: res.msg || "发送失败",
|
|
|
|
|
+ icon: "none",
|
|
|
|
|
+ });
|
|
|
|
|
+ }
|
|
|
});
|
|
});
|
|
|
},
|
|
},
|
|
|
|
|
|
|
@@ -313,6 +271,7 @@ export default {
|
|
|
selectProvince(province) {
|
|
selectProvince(province) {
|
|
|
this.selectedProvince = province || "";
|
|
this.selectedProvince = province || "";
|
|
|
this.dropdownProvinceOpen = false;
|
|
this.dropdownProvinceOpen = false;
|
|
|
|
|
+ this.resetFetch();
|
|
|
},
|
|
},
|
|
|
},
|
|
},
|
|
|
computed: {
|
|
computed: {
|
|
@@ -340,7 +299,8 @@ export default {
|
|
|
/* Header Section */
|
|
/* Header Section */
|
|
|
.header-section {
|
|
.header-section {
|
|
|
background: linear-gradient(135deg, #2b32b2 0%, #1488cc 100%);
|
|
background: linear-gradient(135deg, #2b32b2 0%, #1488cc 100%);
|
|
|
- padding: 40rpx 40rpx 80rpx; /* Extra padding at bottom for overlap effect */
|
|
|
|
|
|
|
+ padding: 40rpx 40rpx 80rpx;
|
|
|
|
|
+ /* Extra padding at bottom for overlap effect */
|
|
|
position: relative;
|
|
position: relative;
|
|
|
z-index: 20;
|
|
z-index: 20;
|
|
|
color: #fff;
|
|
color: #fff;
|
|
@@ -457,7 +417,8 @@ export default {
|
|
|
/* Dropdown Layer (Absolute on top of everything) */
|
|
/* Dropdown Layer (Absolute on top of everything) */
|
|
|
.dropdown-layer {
|
|
.dropdown-layer {
|
|
|
position: absolute;
|
|
position: absolute;
|
|
|
- top: 300rpx; /* Adjust based on header layout */
|
|
|
|
|
|
|
+ top: 300rpx;
|
|
|
|
|
+ /* Adjust based on header layout */
|
|
|
right: 40rpx;
|
|
right: 40rpx;
|
|
|
z-index: 999;
|
|
z-index: 999;
|
|
|
}
|
|
}
|
|
@@ -543,9 +504,11 @@ export default {
|
|
|
.list-scroll {
|
|
.list-scroll {
|
|
|
flex: 1;
|
|
flex: 1;
|
|
|
height: 0;
|
|
height: 0;
|
|
|
- padding: 0 24rpx; /* Remove vertical padding from scroll container */
|
|
|
|
|
|
|
+ padding: 0 24rpx;
|
|
|
|
|
+ /* Remove vertical padding from scroll container */
|
|
|
box-sizing: border-box;
|
|
box-sizing: border-box;
|
|
|
- margin-top: -50rpx; /* Negative margin to pull list up */
|
|
|
|
|
|
|
+ margin-top: -50rpx;
|
|
|
|
|
+ /* Negative margin to pull list up */
|
|
|
position: relative;
|
|
position: relative;
|
|
|
z-index: 21;
|
|
z-index: 21;
|
|
|
}
|
|
}
|
|
@@ -592,8 +555,9 @@ export default {
|
|
|
.company-name {
|
|
.company-name {
|
|
|
font-size: 32rpx;
|
|
font-size: 32rpx;
|
|
|
font-weight: 600;
|
|
font-weight: 600;
|
|
|
- color: #333;
|
|
|
|
|
|
|
+ color: #096dd9;
|
|
|
line-height: 1.4;
|
|
line-height: 1.4;
|
|
|
|
|
+ text-decoration: underline;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
.header-right {
|
|
.header-right {
|
|
@@ -698,6 +662,7 @@ export default {
|
|
|
from {
|
|
from {
|
|
|
transform: rotate(0deg);
|
|
transform: rotate(0deg);
|
|
|
}
|
|
}
|
|
|
|
|
+
|
|
|
to {
|
|
to {
|
|
|
transform: rotate(360deg);
|
|
transform: rotate(360deg);
|
|
|
}
|
|
}
|
|
@@ -748,4 +713,101 @@ export default {
|
|
|
color: #fff;
|
|
color: #fff;
|
|
|
box-shadow: 0 6rpx 16rpx rgba(24, 144, 255, 0.35);
|
|
box-shadow: 0 6rpx 16rpx rgba(24, 144, 255, 0.35);
|
|
|
}
|
|
}
|
|
|
|
|
+
|
|
|
|
|
+/* 弹窗样式 */
|
|
|
|
|
+.report-export-create-modal-mask {
|
|
|
|
|
+ position: fixed;
|
|
|
|
|
+ top: 0;
|
|
|
|
|
+ left: 0;
|
|
|
|
|
+ right: 0;
|
|
|
|
|
+ bottom: 0;
|
|
|
|
|
+ background: rgba(0, 0, 0, 0.6);
|
|
|
|
|
+ z-index: 999;
|
|
|
|
|
+ backdrop-filter: blur(2px);
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+.report-export-create-modal {
|
|
|
|
|
+ position: fixed;
|
|
|
|
|
+ z-index: 1000;
|
|
|
|
|
+ background: #fff;
|
|
|
|
|
+ transition: all 0.3s ease;
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+.report-export-create-email-modal {
|
|
|
|
|
+ top: 50%;
|
|
|
|
|
+ left: 50%;
|
|
|
|
|
+ transform: translate(-50%, -50%);
|
|
|
|
|
+ width: 620rpx;
|
|
|
|
|
+ border-radius: 24rpx;
|
|
|
|
|
+ opacity: 0;
|
|
|
|
|
+ visibility: hidden;
|
|
|
|
|
+ overflow: hidden;
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+.report-export-create-email-modal.report-export-create-modal--open {
|
|
|
|
|
+ opacity: 1;
|
|
|
|
|
+ visibility: visible;
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+.report-export-create-modal-title {
|
|
|
|
|
+ padding: 36rpx 32rpx;
|
|
|
|
|
+ font-size: 36rpx;
|
|
|
|
|
+ color: #333;
|
|
|
|
|
+ text-align: center;
|
|
|
|
|
+ font-weight: 600;
|
|
|
|
|
+ border-bottom: 1rpx solid #f0f0f0;
|
|
|
|
|
+ position: relative;
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+.report-export-create-modal-close {
|
|
|
|
|
+ position: absolute;
|
|
|
|
|
+ right: 32rpx;
|
|
|
|
|
+ top: 50%;
|
|
|
|
|
+ transform: translateY(-50%);
|
|
|
|
|
+ font-size: 44rpx;
|
|
|
|
|
+ color: #999;
|
|
|
|
|
+ line-height: 1;
|
|
|
|
|
+ padding: 10rpx;
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+.report-export-create-modal-body {
|
|
|
|
|
+ padding: 48rpx 40rpx 32rpx;
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+.report-export-error-text {
|
|
|
|
|
+ font-size: 24rpx;
|
|
|
|
|
+ color: #ff4d4f;
|
|
|
|
|
+ margin-top: 12rpx;
|
|
|
|
|
+ display: block;
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+.report-export-create-modal-footer {
|
|
|
|
|
+ padding: 0 40rpx 48rpx;
|
|
|
|
|
+ display: flex;
|
|
|
|
|
+ justify-content: space-between;
|
|
|
|
|
+ gap: 24rpx;
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+.report-export-create-modal-btn {
|
|
|
|
|
+ height: 88rpx;
|
|
|
|
|
+ line-height: 88rpx;
|
|
|
|
|
+ border-radius: 44rpx;
|
|
|
|
|
+ text-align: center;
|
|
|
|
|
+ font-size: 30rpx;
|
|
|
|
|
+ font-weight: 600;
|
|
|
|
|
+ flex: 1;
|
|
|
|
|
+ margin: 0;
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+.cancel-btn {
|
|
|
|
|
+ background: #f5f7fa;
|
|
|
|
|
+ color: #666;
|
|
|
|
|
+ border: 1rpx solid #e4e7ed;
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+.confirm-btn {
|
|
|
|
|
+ background: linear-gradient(135deg, #1890ff 0%, #096dd9 100%);
|
|
|
|
|
+ color: #fff;
|
|
|
|
|
+ box-shadow: 0 6rpx 16rpx rgba(24, 144, 255, 0.3);
|
|
|
|
|
+}
|
|
|
</style>
|
|
</style>
|