|
@@ -1,109 +1,241 @@
|
|
|
<template>
|
|
|
- <!-- 分销申请审批 -->
|
|
|
- <div class="taskMessagePage flex-col">
|
|
|
- <s-header :name="$t('taskMessage.distributionApplicationApproval')" :noback="false"></s-header>
|
|
|
- <div class="taskMessageBox flex-col">
|
|
|
- <van-list v-model:loading="loading" v-model:error="error" :error-text="$t('common.reqFailClkReload')"
|
|
|
- :finished="finished" :finished-text="$t('common.noMoreTxt')" offset="300" :immediate-check="false" @load="onLoad">
|
|
|
- <div class="searchRow flex-row justify-between">
|
|
|
- <div class="flex-col">
|
|
|
- <div class="flex-row justify-between bd3">
|
|
|
- <div class="flex-col outer4 proportionIcon"></div>
|
|
|
- <span class="flex-col txt2">{{ $t('taskMessage.total') }}<span class="discountNumber">{{ alarmHistoryTotal
|
|
|
- }}</span>{{ $t('taskMessage.recordsInTotal') }}</span>
|
|
|
+ <div class="task-page">
|
|
|
+ <!-- 顶部导航 -->
|
|
|
+ <s-header
|
|
|
+ :name="$t('taskMessage.distributionApplicationApproval')"
|
|
|
+ :noback="false"
|
|
|
+ ></s-header>
|
|
|
+
|
|
|
+ <div class="task-container">
|
|
|
+ <van-list
|
|
|
+ v-model:loading="loading"
|
|
|
+ v-model:error="error"
|
|
|
+ :error-text="$t('common.reqFailClkReload')"
|
|
|
+ :finished="finished"
|
|
|
+ :finished-text="$t('common.noMoreTxt')"
|
|
|
+ offset="300"
|
|
|
+ :immediate-check="false"
|
|
|
+ @load="onLoad"
|
|
|
+ >
|
|
|
+ <!-- 顶部筛选和信息区域 -->
|
|
|
+ <div class="header-info">
|
|
|
+ <div class="total-card">
|
|
|
+ <div class="icon-box">
|
|
|
+ <van-icon name="todo-list" class="dist-icon" />
|
|
|
</div>
|
|
|
- </div>
|
|
|
- <div class="l-flex-RC">
|
|
|
- <div @click="reviewedClk" class="label3 o-mr-10">{{
|
|
|
- $t('taskMessage.toViewAppro')
|
|
|
- }}</div>
|
|
|
- <div @click="noticeClk" class="main5 l-flex-RC">
|
|
|
- <img class="label2 o-mr-5" src="../../../assets/device/searchIcon.png" />
|
|
|
+ <div class="total-info">
|
|
|
+ {{ $t("taskMessage.total") }}
|
|
|
+ <span class="highlight">{{ alarmHistoryTotal }}</span>
|
|
|
+ {{ $t("taskMessage.recordsInTotal") }}
|
|
|
</div>
|
|
|
</div>
|
|
|
+
|
|
|
+ <div class="actions">
|
|
|
+ <van-button
|
|
|
+ round
|
|
|
+ size="small"
|
|
|
+ plain
|
|
|
+ class="action-btn"
|
|
|
+ @click="reviewedClk"
|
|
|
+ >
|
|
|
+ {{ $t("taskMessage.toViewAppro") }}
|
|
|
+ </van-button>
|
|
|
+ <van-button
|
|
|
+ round
|
|
|
+ size="small"
|
|
|
+ plain
|
|
|
+ class="action-btn"
|
|
|
+ @click="noticeClk"
|
|
|
+ >
|
|
|
+ <van-icon name="search" size="20" />
|
|
|
+ </van-button>
|
|
|
+ </div>
|
|
|
</div>
|
|
|
- <div class="listBox">
|
|
|
- <div v-for="(item, index) in alarmHistoryList" :key="index" class="listItem">
|
|
|
- <div class="itemBox">
|
|
|
- <div class="itemRow">
|
|
|
- <span class="itemTitle">{{ $t('taskMessage.equipmentName') }}: </span>
|
|
|
- {{ item.equipmentName != null ? item.equipmentName : item.clientId.slice(-6) }}
|
|
|
- </div>
|
|
|
- <div class="itemRow">
|
|
|
- <span class="itemTitle">{{ $t('taskMessage.equipmentNo') }}: </span>
|
|
|
- {{ item.clientId }}
|
|
|
- </div>
|
|
|
- <!-- 机主的 -->
|
|
|
- <div class="itemRow">
|
|
|
- <span class="itemTitle">{{ $t('taskMessage.owner') }}: </span>
|
|
|
- {{ $t('taskMessage.machineOwner') }}
|
|
|
- <span class="itemTitle discount">{{ $t('taskMessage.proportion') }}: </span>
|
|
|
- {{ item.proportion }}%
|
|
|
- </div>
|
|
|
- <!-- 平台的 -->
|
|
|
- <div class="itemRow">
|
|
|
- <span class="itemTitle">{{ $t('taskMessage.platform') }}: </span>
|
|
|
- {{ $t('taskMessage.platformAccount') }}
|
|
|
- <span class="itemTitle discount">{{ $t('taskMessage.proportion') }}: </span>
|
|
|
- {{ item.adminProportion }}%
|
|
|
- </div>
|
|
|
- <!-- 分账方的 -->
|
|
|
- <div class="itemRow" v-if="item.type >= 1">
|
|
|
- <span class="itemTitle">{{ $t('taskMessage.partners') }}: </span>
|
|
|
- {{ item.agencyName }}
|
|
|
- <span class="itemTitle discount">{{ $t('taskMessage.proportion') }}: </span>
|
|
|
- {{ item.agencyProportion }}%
|
|
|
- </div>
|
|
|
- <!-- 分账方4个 -->
|
|
|
- <div class="itemRow" v-if="item.type >= 2">
|
|
|
- <span class="itemTitle">{{ $t('taskMessage.partners') }}: </span>
|
|
|
- {{ item.merchantName }}
|
|
|
- <span class="itemTitle discount">{{ $t('taskMessage.proportion') }}: </span>
|
|
|
- {{ item.merchantProportion }}%
|
|
|
- </div>
|
|
|
- <!-- 分账方5个以上 -->
|
|
|
- <div class="itemRow" v-if="item.type >= 3">
|
|
|
- <span class="itemTitle">{{ $t('taskMessage.partners') }}: </span>
|
|
|
- {{ item.personageNam }}
|
|
|
- <span class="itemTitle discount">{{ $t('taskMessage.proportion') }}: </span>
|
|
|
- {{ item.personageProportion }}%
|
|
|
+
|
|
|
+ <!-- 分销申请列表 -->
|
|
|
+ <div class="list-container">
|
|
|
+ <div
|
|
|
+ v-for="(item, index) in alarmHistoryList"
|
|
|
+ :key="index"
|
|
|
+ class="list-card"
|
|
|
+ :class="{
|
|
|
+ pending: item.checkType === '0',
|
|
|
+ approved: item.checkType === '1',
|
|
|
+ cancelled: item.checkType === '2',
|
|
|
+ rejected: item.checkType === '3',
|
|
|
+ }"
|
|
|
+ >
|
|
|
+ <div class="card-header">
|
|
|
+ <div class="status-tag">
|
|
|
+ {{ getStatusText(item.checkType) }}
|
|
|
</div>
|
|
|
- <div class="itemRow">
|
|
|
- <span class="itemTitle">{{ $t('taskMessage.applicationTime') }}: </span>
|
|
|
+ <div class="time-label">
|
|
|
+ {{ $t("taskMessage.applicationTime") }}:
|
|
|
{{ showDateTime(item.createDate) }}
|
|
|
</div>
|
|
|
- <div class="itemRow" v-if="item.checkType !== '0'">
|
|
|
- <span class="itemTitle">{{ $t('taskMessage.approvalTime') }}: </span>
|
|
|
- {{ showDateTime(item.modifyDate) }}
|
|
|
+ </div>
|
|
|
+
|
|
|
+ <div class="card-content">
|
|
|
+ <!-- 设备信息 -->
|
|
|
+ <div class="info-row">
|
|
|
+ <van-icon name="setting-o" class="row-icon" />
|
|
|
+ <div class="row-content">
|
|
|
+ <span class="label"
|
|
|
+ >{{ $t("taskMessage.equipmentNo") }}: </span
|
|
|
+ >
|
|
|
+ <span class="value">{{ item.clientId }}</span>
|
|
|
+ </div>
|
|
|
</div>
|
|
|
- <div class="itemRow" style="display: flex; justify-content: flex-end"
|
|
|
- v-if="item.checkType === '0' && isOper">
|
|
|
- <van-button span="5" round type="primary" style="
|
|
|
- height: 2em;
|
|
|
- padding: 0 1em;
|
|
|
- margin: 0 0.5em;
|
|
|
- background: rgb(255 0 0 / 20%);
|
|
|
- color: #ff0000;
|
|
|
- border-color: #ff0000;
|
|
|
- " @click="changeStatusFun(item, 3)">
|
|
|
- {{ $t('taskMessage.fail') }}
|
|
|
- </van-button>
|
|
|
- <van-button span="5" round type="primary" style="
|
|
|
- height: 2em;
|
|
|
- padding: 0 1em;
|
|
|
- margin: 0 0.5em;
|
|
|
- background: rgb(25 137 250 / 20%);
|
|
|
- color: #1989fa;
|
|
|
- " @click="changeStatusFun(item, 1)">
|
|
|
- {{ $t('taskMessage.adopt') }}
|
|
|
- </van-button>
|
|
|
+
|
|
|
+ <div class="info-row">
|
|
|
+ <van-icon name="idcard" class="row-icon" />
|
|
|
+ <div class="row-content">
|
|
|
+ <span class="label"
|
|
|
+ >{{ $t("taskMessage.equipmentName") }}: </span
|
|
|
+ >
|
|
|
+ <span class="value">{{
|
|
|
+ item.equipmentName || item.clientId.slice(-6)
|
|
|
+ }}</span>
|
|
|
+ </div>
|
|
|
</div>
|
|
|
- <div class="itemRow" style="display: flex; justify-content: flex-end">
|
|
|
- <span v-if="item.checkType === '0' && (user.type > 1 && user.type < 4)" style="color: #FFA500"> {{ $t('taskMessage.toBeApproved') }}</span>
|
|
|
- <span v-if="item.checkType === '1'" style="color: #1989fa"> {{ $t('taskMessage.adopt') }}</span>
|
|
|
- <span v-if="item.checkType === '2'" style="color: #ff0033"> {{ $t('taskMessage.cancel') }}</span>
|
|
|
- <span v-if="item.checkType === '3'" style="color: #ff0000"> {{ $t('taskMessage.fail') }}</span>
|
|
|
+
|
|
|
+ <!-- 分账比例 -->
|
|
|
+ <div class="dist-grid">
|
|
|
+ <!-- 固定分账方 -->
|
|
|
+ <div class="dist-section">
|
|
|
+ <div class="dist-item">
|
|
|
+ <div class="dist-icon-box">
|
|
|
+ <van-icon name="user-o" class="dist-icon" />
|
|
|
+ </div>
|
|
|
+ <div class="dist-info">
|
|
|
+ <div class="dist-title">
|
|
|
+ {{ $t("taskMessage.owner") }}
|
|
|
+ </div>
|
|
|
+ <div class="dist-content">
|
|
|
+ <span class="dist-name">{{
|
|
|
+ $t("taskMessage.machineOwner")
|
|
|
+ }}</span>
|
|
|
+ <span class="dist-percent">{{ item.proportion }}%</span>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ <div class="dist-section">
|
|
|
+ <div class="dist-item">
|
|
|
+ <div class="dist-icon-box">
|
|
|
+ <van-icon name="label-o" class="dist-icon" />
|
|
|
+ </div>
|
|
|
+ <div class="dist-info">
|
|
|
+ <div class="dist-title">
|
|
|
+ {{ $t("taskMessage.platform") }}
|
|
|
+ </div>
|
|
|
+ <div class="dist-content">
|
|
|
+ <span class="dist-name">{{
|
|
|
+ $t("taskMessage.platformAccount")
|
|
|
+ }}</span>
|
|
|
+ <span class="dist-percent"
|
|
|
+ >{{ item.adminProportion }}%</span
|
|
|
+ >
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+
|
|
|
+ <!-- 动态分账方 -->
|
|
|
+ <div class="dist-section" v-if="item.type >= 1">
|
|
|
+ <div class="dist-item">
|
|
|
+ <div class="dist-icon-box">
|
|
|
+ <van-icon name="friends-o" class="dist-icon" />
|
|
|
+ </div>
|
|
|
+ <div class="dist-info">
|
|
|
+ <div class="dist-title">
|
|
|
+ {{ $t("taskMessage.partners") }}
|
|
|
+ </div>
|
|
|
+ <div class="dist-content">
|
|
|
+ <span class="dist-name">{{ item.agencyName }}</span>
|
|
|
+ <span class="dist-percent"
|
|
|
+ >{{ item.agencyProportion }}%</span
|
|
|
+ >
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+
|
|
|
+ <div class="dist-section" v-if="item.type >= 2">
|
|
|
+ <div class="dist-item">
|
|
|
+ <div class="dist-icon-box">
|
|
|
+ <van-icon name="friends-o" class="dist-icon" />
|
|
|
+ </div>
|
|
|
+ <div class="dist-info">
|
|
|
+ <div class="dist-title">
|
|
|
+ {{ $t("taskMessage.partners") }}
|
|
|
+ </div>
|
|
|
+ <div class="dist-content">
|
|
|
+ <span class="dist-name">{{ item.merchantName }}</span>
|
|
|
+ <span class="dist-percent"
|
|
|
+ >{{ item.merchantProportion }}%</span
|
|
|
+ >
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+
|
|
|
+ <div class="dist-section" v-if="item.type >= 3">
|
|
|
+ <div class="dist-item">
|
|
|
+ <div class="dist-icon-box">
|
|
|
+ <van-icon name="friends-o" class="dist-icon" />
|
|
|
+ </div>
|
|
|
+ <div class="dist-info">
|
|
|
+ <div class="dist-title">
|
|
|
+ {{ $t("taskMessage.partners") }}
|
|
|
+ </div>
|
|
|
+ <div class="dist-content">
|
|
|
+ <span class="dist-name">{{ item.personageNam }}</span>
|
|
|
+ <span class="dist-percent"
|
|
|
+ >{{ item.personageProportion }}%</span
|
|
|
+ >
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
</div>
|
|
|
+
|
|
|
+ <!-- 审批时间 -->
|
|
|
+ <template v-if="item.checkType !== '0'">
|
|
|
+ <div class="info-row">
|
|
|
+ <van-icon name="clock-o" class="row-icon" />
|
|
|
+ <div class="row-content">
|
|
|
+ <span class="label"
|
|
|
+ >{{ $t("taskMessage.approvalTime") }}: </span
|
|
|
+ >
|
|
|
+ <span class="value">{{
|
|
|
+ showDateTime(item.modifyDate)
|
|
|
+ }}</span>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </template>
|
|
|
+ </div>
|
|
|
+
|
|
|
+ <!-- 审批操作按钮 -->
|
|
|
+ <div v-if="item.checkType === '0' && isOper" class="card-actions">
|
|
|
+ <van-button
|
|
|
+ round
|
|
|
+ size="small"
|
|
|
+ class="reject-btn"
|
|
|
+ @click="changeStatusFun(item, 3)"
|
|
|
+ >
|
|
|
+ <van-icon name="close" size="20" class="btn-icon" />
|
|
|
+ {{ $t("taskMessage.fail") }}
|
|
|
+ </van-button>
|
|
|
+ <van-button
|
|
|
+ round
|
|
|
+ size="small"
|
|
|
+ class="approve-btn"
|
|
|
+ @click="changeStatusFun(item, 1)"
|
|
|
+ >
|
|
|
+ <van-icon name="passed" size="20" class="btn-icon" />
|
|
|
+ {{ $t("taskMessage.adopt") }}
|
|
|
+ </van-button>
|
|
|
</div>
|
|
|
</div>
|
|
|
</div>
|
|
@@ -111,30 +243,56 @@
|
|
|
</div>
|
|
|
|
|
|
<!-- 筛选弹窗 -->
|
|
|
- <kDialog :dialogTitle="$t('taskMessage.equipmentInit.searchPop.title')"
|
|
|
- :confirmBtnTxt="$t('taskMessage.equipmentInit.searchPop.filterBtn')" ref="kDialogRef" @confirmclk="confirmClk">
|
|
|
+ <kDialog
|
|
|
+ :dialogTitle="$t('taskMessage.equipmentInit.searchPop.title')"
|
|
|
+ :confirmBtnTxt="$t('taskMessage.equipmentInit.searchPop.filterBtn')"
|
|
|
+ ref="kDialogRef"
|
|
|
+ @confirmclk="confirmClk"
|
|
|
+ >
|
|
|
<template #content>
|
|
|
- <div class="cust_vantBorder">
|
|
|
- <van-field clearable v-model="searchForm.merchantName" :placeholder="$t('taskMessage.equipmentInit.searchPop.merchantNamePlace')
|
|
|
- " :label="$t('taskMessage.equipmentInit.searchPop.merchantName')" />
|
|
|
- <van-field @click-input="busiInpClk" readonly clearable v-model="searchForm.stateName"
|
|
|
+ <div class="dialog-content">
|
|
|
+ <van-field
|
|
|
+ clearable
|
|
|
+ v-model="searchForm.merchantName"
|
|
|
+ :placeholder="
|
|
|
+ $t('taskMessage.equipmentInit.searchPop.merchantNamePlace')
|
|
|
+ "
|
|
|
+ :label="$t('taskMessage.equipmentInit.searchPop.merchantName')"
|
|
|
+ />
|
|
|
+
|
|
|
+ <van-field
|
|
|
+ @click-input="busiInpClk"
|
|
|
+ readonly
|
|
|
+ clearable
|
|
|
+ v-model="searchForm.stateName"
|
|
|
:placeholder="$t('taskMessage.equipmentInit.searchPop.statePlace')"
|
|
|
- :label="$t('taskMessage.equipmentInit.searchPop.state')">
|
|
|
+ :label="$t('taskMessage.equipmentInit.searchPop.state')"
|
|
|
+ >
|
|
|
<template #right-icon>
|
|
|
- <div class="l-flex-RC">
|
|
|
- <van-icon v-if="searchForm.stateName" @click="searchForm.stateName = ''; searchForm.state = ''"
|
|
|
- class="o-mr-6" name="clear" />
|
|
|
- <van-icon @click="busiInpClk" name="arrow-down" />
|
|
|
+ <div class="icon-container">
|
|
|
+ <van-icon
|
|
|
+ v-if="searchForm.stateName"
|
|
|
+ @click.stop="clearState"
|
|
|
+ class="clear-icon"
|
|
|
+ name="clear"
|
|
|
+ />
|
|
|
+ <van-icon @click.stop="busiInpClk" name="arrow-down" />
|
|
|
</div>
|
|
|
</template>
|
|
|
</van-field>
|
|
|
</div>
|
|
|
</template>
|
|
|
</kDialog>
|
|
|
+
|
|
|
<!-- 状态选择框 -->
|
|
|
- <van-popup v-model:show="busiPopShow" position="bottom">
|
|
|
- <van-picker :title="$t('taskMessage.equipmentInit.searchPop.statePlace')" :columns="busiPopList"
|
|
|
- :columns-field-names="busiPopFieldName" @confirm="busiPopConfirm" @cancel="busiPopShow = false" />
|
|
|
+ <van-popup v-model:show="busiPopShow" position="bottom" round>
|
|
|
+ <van-picker
|
|
|
+ :title="$t('taskMessage.equipmentInit.searchPop.statePlace')"
|
|
|
+ :columns="busiPopList"
|
|
|
+ :columns-field-names="busiPopFieldName"
|
|
|
+ @confirm="busiPopConfirm"
|
|
|
+ @cancel="busiPopShow = false"
|
|
|
+ />
|
|
|
</van-popup>
|
|
|
</div>
|
|
|
</template>
|
|
@@ -147,7 +305,7 @@ import {
|
|
|
changeProportionStatus,
|
|
|
} from "@/service/taskMessage";
|
|
|
import { showFailToast } from "vant";
|
|
|
-import { getLoginUser, styleUrl } from "@/common/js/utils";
|
|
|
+import { getLoginUser } from "@/common/js/utils";
|
|
|
import dateUtil from "@/utils/dateUtil";
|
|
|
import kDialog from "@/components/commom/kDialog/index.vue";
|
|
|
import { useI18n } from "vue-i18n";
|
|
@@ -159,11 +317,11 @@ export default {
|
|
|
// 筛选弹窗
|
|
|
const busiPopList = reactive([
|
|
|
{
|
|
|
- name: t('taskMessage.whole'),
|
|
|
+ name: t("taskMessage.whole"),
|
|
|
id: "1",
|
|
|
},
|
|
|
{
|
|
|
- name: t('taskMessage.unapproved'),
|
|
|
+ name: t("taskMessage.unapproved"),
|
|
|
id: "0",
|
|
|
},
|
|
|
]);
|
|
@@ -177,7 +335,7 @@ export default {
|
|
|
const searchForm = reactive({
|
|
|
merchantName: "",
|
|
|
state: "",
|
|
|
- stateName: '',
|
|
|
+ stateName: "",
|
|
|
});
|
|
|
// 点击状态输入框
|
|
|
const busiInpClk = () => {
|
|
@@ -261,8 +419,6 @@ export default {
|
|
|
const isOper = ref(true);
|
|
|
// 初始化页面获取列表
|
|
|
onMounted(async () => {
|
|
|
- // 加载样式
|
|
|
- styleUrl('taskMessage');
|
|
|
if (user) {
|
|
|
searchParams.adminId = user.id;
|
|
|
searchGetList();
|
|
@@ -288,7 +444,21 @@ export default {
|
|
|
} else {
|
|
|
showFailToast(data.message);
|
|
|
}
|
|
|
- console.log(data);
|
|
|
+ };
|
|
|
+
|
|
|
+ const getStatusText = (status) => {
|
|
|
+ switch (status) {
|
|
|
+ case "0":
|
|
|
+ return t("taskMessage.toBeApproved");
|
|
|
+ case "1":
|
|
|
+ return t("taskMessage.adopt");
|
|
|
+ case "2":
|
|
|
+ return t("taskMessage.cancel");
|
|
|
+ case "3":
|
|
|
+ return t("taskMessage.fail");
|
|
|
+ default:
|
|
|
+ return "";
|
|
|
+ }
|
|
|
};
|
|
|
return {
|
|
|
loading,
|
|
@@ -311,11 +481,372 @@ export default {
|
|
|
reviewedClk,
|
|
|
isOper,
|
|
|
user,
|
|
|
+ getStatusText,
|
|
|
};
|
|
|
},
|
|
|
};
|
|
|
</script>
|
|
|
|
|
|
<style lang="less" scoped>
|
|
|
-@import "../../../common/style/common.less";
|
|
|
+@theme-color: #4d6add;
|
|
|
+@pending-color: #ff9800;
|
|
|
+@approved-color: #4caf50;
|
|
|
+@cancelled-color: #9e9e9e;
|
|
|
+@rejected-color: #f44336;
|
|
|
+@light-bg: #f5f8ff;
|
|
|
+@card-shadow: 0 3px 10px rgba(77, 106, 221, 0.15);
|
|
|
+@hover-shadow: 0 8px 15px rgba(77, 106, 221, 0.2);
|
|
|
+@transition: all 0.3s ease;
|
|
|
+@text-dark: #333;
|
|
|
+@text-light: #666;
|
|
|
+@text-lighter: #999;
|
|
|
+@border-radius: 12px;
|
|
|
+
|
|
|
+.task-page {
|
|
|
+ display: flex;
|
|
|
+ flex-direction: column;
|
|
|
+ height: 100vh;
|
|
|
+ background-color: @light-bg;
|
|
|
+}
|
|
|
+
|
|
|
+.task-container {
|
|
|
+ flex: 1;
|
|
|
+ padding: 15px;
|
|
|
+ overflow-y: auto;
|
|
|
+}
|
|
|
+
|
|
|
+.header-info {
|
|
|
+ display: flex;
|
|
|
+ justify-content: space-between;
|
|
|
+ align-items: center;
|
|
|
+ margin-bottom: 20px;
|
|
|
+ padding: 12px 15px;
|
|
|
+ background: white;
|
|
|
+ border-radius: @border-radius;
|
|
|
+ box-shadow: @card-shadow;
|
|
|
+}
|
|
|
+
|
|
|
+.total-card {
|
|
|
+ display: flex;
|
|
|
+ align-items: center;
|
|
|
+}
|
|
|
+
|
|
|
+.icon-box {
|
|
|
+ width: 44px;
|
|
|
+ height: 44px;
|
|
|
+ display: flex;
|
|
|
+ align-items: center;
|
|
|
+ justify-content: center;
|
|
|
+ background-color: fade(@theme-color, 8%);
|
|
|
+ border-radius: 10px;
|
|
|
+ margin-right: 12px;
|
|
|
+
|
|
|
+ .dist-icon {
|
|
|
+ color: @theme-color;
|
|
|
+ font-size: 24px;
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+.total-info {
|
|
|
+ font-size: 14px;
|
|
|
+ color: @text-dark;
|
|
|
+
|
|
|
+ .highlight {
|
|
|
+ color: @theme-color;
|
|
|
+ font-weight: bold;
|
|
|
+ margin: 0 3px;
|
|
|
+ font-size: 18px;
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+.actions {
|
|
|
+ display: flex;
|
|
|
+ gap: 10px;
|
|
|
+}
|
|
|
+
|
|
|
+.action-btn {
|
|
|
+ height: 32px;
|
|
|
+ padding: 0 12px;
|
|
|
+ border-color: fade(@theme-color, 50%);
|
|
|
+ color: @theme-color;
|
|
|
+}
|
|
|
+
|
|
|
+.list-container {
|
|
|
+ display: flex;
|
|
|
+ flex-direction: column;
|
|
|
+ gap: 15px;
|
|
|
+}
|
|
|
+
|
|
|
+.list-card {
|
|
|
+ background: white;
|
|
|
+ border-radius: @border-radius;
|
|
|
+ box-shadow: @card-shadow;
|
|
|
+ padding: 16px;
|
|
|
+ transition: @transition;
|
|
|
+ position: relative;
|
|
|
+ overflow: hidden;
|
|
|
+
|
|
|
+ &.pending {
|
|
|
+ border-left: 3px solid @pending-color;
|
|
|
+
|
|
|
+ .status-tag {
|
|
|
+ background-color: fade(@pending-color, 15%);
|
|
|
+ color: darken(@pending-color, 10%);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ &.approved {
|
|
|
+ border-left: 3px solid @approved-color;
|
|
|
+
|
|
|
+ .status-tag {
|
|
|
+ background-color: fade(@approved-color, 15%);
|
|
|
+ color: darken(@approved-color, 10%);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ &.cancelled {
|
|
|
+ border-left: 3px solid @cancelled-color;
|
|
|
+
|
|
|
+ .status-tag {
|
|
|
+ background-color: fade(@cancelled-color, 15%);
|
|
|
+ color: darken(@cancelled-color, 10%);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ &.rejected {
|
|
|
+ border-left: 3px solid @rejected-color;
|
|
|
+
|
|
|
+ .status-tag {
|
|
|
+ background-color: fade(@rejected-color, 15%);
|
|
|
+ color: darken(@rejected-color, 10%);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ &:hover {
|
|
|
+ transform: translateY(-2px);
|
|
|
+ box-shadow: @hover-shadow;
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+.card-header {
|
|
|
+ display: flex;
|
|
|
+ justify-content: space-between;
|
|
|
+ align-items: center;
|
|
|
+ margin-bottom: 15px;
|
|
|
+ padding-bottom: 12px;
|
|
|
+ border-bottom: 1px solid fade(@theme-color, 10%);
|
|
|
+}
|
|
|
+
|
|
|
+.status-tag {
|
|
|
+ padding: 4px 10px;
|
|
|
+ border-radius: 30px;
|
|
|
+ font-size: 13px;
|
|
|
+ font-weight: 600;
|
|
|
+ min-width: 70px;
|
|
|
+ text-align: center;
|
|
|
+}
|
|
|
+
|
|
|
+.time-label {
|
|
|
+ font-size: 12px;
|
|
|
+ color: @text-lighter;
|
|
|
+}
|
|
|
+
|
|
|
+.card-content {
|
|
|
+ display: flex;
|
|
|
+ flex-direction: column;
|
|
|
+ gap: 12px;
|
|
|
+}
|
|
|
+
|
|
|
+.info-row {
|
|
|
+ display: flex;
|
|
|
+ align-items: flex-start;
|
|
|
+
|
|
|
+ .row-icon {
|
|
|
+ flex-shrink: 0;
|
|
|
+ font-size: 18px;
|
|
|
+ color: @theme-color;
|
|
|
+ margin-right: 10px;
|
|
|
+ }
|
|
|
+
|
|
|
+ .row-content {
|
|
|
+ flex: 1;
|
|
|
+ font-size: 14px;
|
|
|
+ }
|
|
|
+
|
|
|
+ .label {
|
|
|
+ color: @text-light;
|
|
|
+ min-width: 90px;
|
|
|
+ display: inline-block;
|
|
|
+ }
|
|
|
+
|
|
|
+ .value {
|
|
|
+ color: @text-dark;
|
|
|
+ word-break: break-all;
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+.dist-grid {
|
|
|
+ display: flex;
|
|
|
+ flex-direction: column;
|
|
|
+ gap: 12px;
|
|
|
+ padding: 12px;
|
|
|
+ background: fade(@theme-color, 4%);
|
|
|
+ border-radius: 10px;
|
|
|
+ margin: 12px 0;
|
|
|
+}
|
|
|
+
|
|
|
+.dist-section {
|
|
|
+ display: flex;
|
|
|
+ flex-direction: column;
|
|
|
+ gap: 8px;
|
|
|
+ padding-bottom: 8px;
|
|
|
+ border-bottom: 1px solid fade(@theme-color, 10%);
|
|
|
+
|
|
|
+ &:last-child {
|
|
|
+ border-bottom: none;
|
|
|
+ padding-bottom: 0;
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+.dist-item {
|
|
|
+ display: flex;
|
|
|
+ align-items: flex-start;
|
|
|
+ gap: 12px;
|
|
|
+}
|
|
|
+
|
|
|
+.dist-icon-box {
|
|
|
+ width: 36px;
|
|
|
+ height: 36px;
|
|
|
+ display: flex;
|
|
|
+ align-items: center;
|
|
|
+ justify-content: center;
|
|
|
+ background-color: fade(@theme-color, 8%);
|
|
|
+ border-radius: 8px;
|
|
|
+ flex-shrink: 0;
|
|
|
+
|
|
|
+ .dist-icon {
|
|
|
+ color: @theme-color;
|
|
|
+ font-size: 18px;
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+.dist-info {
|
|
|
+ flex: 1;
|
|
|
+}
|
|
|
+
|
|
|
+.dist-title {
|
|
|
+ font-size: 14px;
|
|
|
+ color: @text-dark;
|
|
|
+ font-weight: 500;
|
|
|
+ margin-bottom: 4px;
|
|
|
+}
|
|
|
+
|
|
|
+.dist-content {
|
|
|
+ display: flex;
|
|
|
+ justify-content: space-between;
|
|
|
+ align-items: center;
|
|
|
+ font-size: 13px;
|
|
|
+}
|
|
|
+
|
|
|
+.dist-name {
|
|
|
+ color: @text-light;
|
|
|
+ flex: 1;
|
|
|
+ padding-right: 10px;
|
|
|
+ word-break: break-word;
|
|
|
+}
|
|
|
+
|
|
|
+.dist-percent {
|
|
|
+ font-weight: bold;
|
|
|
+ color: @theme-color;
|
|
|
+ font-size: 15px;
|
|
|
+ min-width: 50px;
|
|
|
+ text-align: right;
|
|
|
+}
|
|
|
+
|
|
|
+.card-actions {
|
|
|
+ display: flex;
|
|
|
+ justify-content: flex-end;
|
|
|
+ gap: 15px;
|
|
|
+ margin-top: 15px;
|
|
|
+ padding-top: 15px;
|
|
|
+ border-top: 1px dashed fade(@theme-color, 15%);
|
|
|
+
|
|
|
+ .reject-btn,
|
|
|
+ .approve-btn {
|
|
|
+ min-width: 90px;
|
|
|
+ height: 34px;
|
|
|
+ padding: 0 15px;
|
|
|
+ font-size: 13px;
|
|
|
+
|
|
|
+ .btn-icon {
|
|
|
+ vertical-align: -2px;
|
|
|
+ margin-right: 5px;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ .reject-btn {
|
|
|
+ border-color: fade(@rejected-color, 50%);
|
|
|
+ color: @rejected-color;
|
|
|
+ background-color: fade(@rejected-color, 8%);
|
|
|
+ }
|
|
|
+
|
|
|
+ .approve-btn {
|
|
|
+ border-color: fade(@approved-color, 50%);
|
|
|
+ color: @approved-color;
|
|
|
+ background-color: fade(@approved-color, 8%);
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+.dialog-content {
|
|
|
+ padding: 10px 0;
|
|
|
+
|
|
|
+ :deep(.van-cell) {
|
|
|
+ padding: 12px 0;
|
|
|
+ border-bottom: 1px solid rgba(0, 0, 0, 0.05);
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+.icon-container {
|
|
|
+ display: flex;
|
|
|
+ align-items: center;
|
|
|
+
|
|
|
+ .clear-icon {
|
|
|
+ color: #999;
|
|
|
+ margin-right: 8px;
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+/* 空状态样式 */
|
|
|
+.empty-list {
|
|
|
+ text-align: center;
|
|
|
+ padding: 40px 20px;
|
|
|
+
|
|
|
+ .empty-icon {
|
|
|
+ font-size: 80px;
|
|
|
+ color: fade(@theme-color, 20%);
|
|
|
+ margin-bottom: 15px;
|
|
|
+ }
|
|
|
+
|
|
|
+ .empty-text {
|
|
|
+ color: @text-light;
|
|
|
+ font-size: 16px;
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+/* 动画效果 */
|
|
|
+@keyframes cardEntry {
|
|
|
+ 0% {
|
|
|
+ transform: translateY(15px);
|
|
|
+ opacity: 0;
|
|
|
+ }
|
|
|
+ 100% {
|
|
|
+ transform: translateY(0);
|
|
|
+ opacity: 1;
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+.list-card {
|
|
|
+ animation: cardEntry 0.4s ease-out forwards;
|
|
|
+ opacity: 0;
|
|
|
+}
|
|
|
</style>
|