|
|
@@ -289,6 +289,16 @@
|
|
|
<el-option label="退票" value="REFUND" />
|
|
|
</el-select>
|
|
|
</el-form-item>
|
|
|
+ <el-form-item v-if="is_platform_user" label="租户">
|
|
|
+ <el-select v-model="transferSearchForm.tenant_id" placeholder="选择租户" clearable filterable>
|
|
|
+ <el-option v-for="t in allTenantData" :key="t.id" :label="t.name" :value="t.id" />
|
|
|
+ </el-select>
|
|
|
+ </el-form-item>
|
|
|
+ <el-form-item label="企业">
|
|
|
+ <el-select v-model="transferSearchForm.enterprise_id" placeholder="选择企业" clearable filterable>
|
|
|
+ <el-option v-for="e in enterpriseStore.getEnterpriseList" :key="e.enterprise_id" :label="e.name" :value="e.enterprise_id" />
|
|
|
+ </el-select>
|
|
|
+ </el-form-item>
|
|
|
<el-form-item>
|
|
|
<el-button type="primary" @click="handleTransferSearch">查询</el-button>
|
|
|
<el-button @click="handleTransferSearchReset">重置</el-button>
|
|
|
@@ -350,6 +360,95 @@
|
|
|
</div>
|
|
|
</el-tab-pane>
|
|
|
|
|
|
+ <el-tab-pane label="消费记录" name="consume-record">
|
|
|
+ <div class="tab-content">
|
|
|
+ <el-card>
|
|
|
+ <template #header>
|
|
|
+ <div class="card-header">
|
|
|
+ <span>消费记录列表</span>
|
|
|
+ </div>
|
|
|
+ </template>
|
|
|
+ <div class="mb-4">
|
|
|
+ <el-form :inline="true" :model="consumeSearchForm">
|
|
|
+ <el-form-item v-if="is_platform_user" label="租户">
|
|
|
+ <el-select v-model="consumeSearchForm.tenant_id" placeholder="选择租户" clearable filterable>
|
|
|
+ <el-option v-for="t in allTenantData" :key="t.id" :label="t.name" :value="t.id" />
|
|
|
+ </el-select>
|
|
|
+ </el-form-item>
|
|
|
+ <el-form-item label="企业">
|
|
|
+ <el-select v-model="consumeSearchForm.enterprise_id" placeholder="选择企业" clearable filterable>
|
|
|
+ <el-option v-for="e in enterpriseStore.getEnterpriseList" :key="e.enterprise_id" :label="e.name" :value="e.enterprise_id" />
|
|
|
+ </el-select>
|
|
|
+ </el-form-item>
|
|
|
+ <el-form-item label="消费类型">
|
|
|
+ <el-select v-model="consumeSearchForm.consume_type" placeholder="全部" clearable>
|
|
|
+ <el-option label="消费" value="CONSUME" />
|
|
|
+ <el-option label="退款" value="REFUND" />
|
|
|
+ <el-option label="转账" value="TRANSFER" />
|
|
|
+ </el-select>
|
|
|
+ </el-form-item>
|
|
|
+ <el-form-item label="状态">
|
|
|
+ <el-select v-model="consumeSearchForm.status" placeholder="全部" clearable>
|
|
|
+ <el-option label="未处理" value="NEW" />
|
|
|
+ <el-option label="已处理" value="PROCESSED" />
|
|
|
+ </el-select>
|
|
|
+ </el-form-item>
|
|
|
+ <el-form-item label="时间范围">
|
|
|
+ <el-date-picker
|
|
|
+ v-model="consumeSearchForm.dateRange"
|
|
|
+ type="daterange"
|
|
|
+ range-separator="至"
|
|
|
+ start-placeholder="开始日期"
|
|
|
+ end-placeholder="结束日期"
|
|
|
+ value-format="YYYY-MM-DD"
|
|
|
+ @change="handleConsumeDateChange"
|
|
|
+ />
|
|
|
+ </el-form-item>
|
|
|
+ <el-form-item>
|
|
|
+ <el-button type="primary" @click="handleConsumeSearch">查询</el-button>
|
|
|
+ <el-button @click="handleConsumeSearchReset">重置</el-button>
|
|
|
+ </el-form-item>
|
|
|
+ </el-form>
|
|
|
+ </div>
|
|
|
+
|
|
|
+ <el-table :data="consumeRecordList" border stripe v-loading="consumeListLoading">
|
|
|
+ <template #empty>
|
|
|
+ <el-empty description="暂无数据" />
|
|
|
+ </template>
|
|
|
+ <el-table-column prop="pay_no" label="账单号" min-width="180" />
|
|
|
+ <el-table-column prop="enterprise_id" label="企业ID" min-width="120" />
|
|
|
+ <el-table-column prop="employee_id" label="员工ID" min-width="120" />
|
|
|
+ <el-table-column prop="consume_amount" label="消费金额" min-width="120">
|
|
|
+ <template #default="{ row }">
|
|
|
+ ¥{{ Number(row.consume_amount).toFixed(2) }}
|
|
|
+ </template>
|
|
|
+ </el-table-column>
|
|
|
+ <el-table-column prop="consume_type" label="消费类型" min-width="100">
|
|
|
+ <template #default="{ row }">
|
|
|
+ <el-tag :type="getConsumeTypeTag(row.consume_type)">
|
|
|
+ {{ getConsumeTypeLabel(row.consume_type) }}
|
|
|
+ </el-tag>
|
|
|
+ </template>
|
|
|
+ </el-table-column>
|
|
|
+ <el-table-column prop="status" label="状态" min-width="100">
|
|
|
+ <template #default="{ row }">
|
|
|
+ <el-tag :type="getConsumeStatusType(row.status)">
|
|
|
+ {{ getConsumeStatusLabel(row.status) }}
|
|
|
+ </el-tag>
|
|
|
+ </template>
|
|
|
+ </el-table-column>
|
|
|
+ <el-table-column prop="gmt_biz_create" label="业务时间" min-width="160" />
|
|
|
+ </el-table>
|
|
|
+ <div class="mt-4 flex justify-end">
|
|
|
+ <el-pagination v-model:current-page="consumePage.page_no" v-model:page-size="consumePage.page_size"
|
|
|
+ :total="consumePage.total" :page-sizes="[10, 20, 50, 100]"
|
|
|
+ layout="total, sizes, prev, pager, next, jumper" @size-change="handleConsumeListChange"
|
|
|
+ @current-change="handleConsumeListChange" />
|
|
|
+ </div>
|
|
|
+ </el-card>
|
|
|
+ </div>
|
|
|
+ </el-tab-pane>
|
|
|
+
|
|
|
<!-- <el-tab-pane label="账单查询" name="consume">
|
|
|
<div class="tab-content">
|
|
|
<el-card>
|
|
|
@@ -599,11 +698,12 @@ defineOptions({
|
|
|
inheritAttrs: false,
|
|
|
});
|
|
|
|
|
|
-import { useEnterpriseStore } from "@/store/modules/enterprise.store";
|
|
|
+import { useEnterpriseStore, useUserStore } from "@/store";
|
|
|
import AccountAPI from "@/api/module_payment/account";
|
|
|
import AccountOverview from "./components/AccountOverview.vue";
|
|
|
import TransferDetail from "./components/TransferDetail.vue";
|
|
|
import ConsumeDetail from "./components/ConsumeDetail.vue";
|
|
|
+import TenantAPI, { TenantTable } from "@/api/module_system/tenant";
|
|
|
import { ref, reactive, computed, onMounted, watch } from "vue";
|
|
|
import { Refresh, Loading } from "@element-plus/icons-vue";
|
|
|
import { ElMessage, ElMessageBox } from "element-plus";
|
|
|
@@ -611,6 +711,9 @@ import type { FormInstance, FormRules } from "element-plus";
|
|
|
import * as ExcelJS from "exceljs";
|
|
|
|
|
|
const enterpriseStore = useEnterpriseStore();
|
|
|
+const userStore = useUserStore();
|
|
|
+
|
|
|
+const is_platform_user = computed(() => userStore.is_platform_user);
|
|
|
|
|
|
const activeTab = ref("overview");
|
|
|
const pageLoading = ref(false);
|
|
|
@@ -746,8 +849,12 @@ const transferPage = reactive({
|
|
|
const transferSearchForm = reactive({
|
|
|
out_biz_no: "",
|
|
|
status: "",
|
|
|
+ tenant_id: undefined as number | undefined,
|
|
|
+ enterprise_id: undefined as string | undefined,
|
|
|
});
|
|
|
|
|
|
+const allTenantData = ref<TenantTable[]>([]);
|
|
|
+
|
|
|
const transferDetailVisible = ref(false);
|
|
|
const currentTransferOutBizNo = ref("");
|
|
|
|
|
|
@@ -1320,6 +1427,8 @@ async function handleTransferSearch() {
|
|
|
function handleTransferSearchReset() {
|
|
|
transferSearchForm.out_biz_no = "";
|
|
|
transferSearchForm.status = "";
|
|
|
+ transferSearchForm.tenant_id = undefined;
|
|
|
+ transferSearchForm.enterprise_id = undefined;
|
|
|
handleTransferSearch();
|
|
|
}
|
|
|
|
|
|
@@ -1331,6 +1440,8 @@ async function fetchTransferList() {
|
|
|
page_size: transferPage.page_size,
|
|
|
out_biz_no: transferSearchForm.out_biz_no || undefined,
|
|
|
status: transferSearchForm.status || undefined,
|
|
|
+ tenant_id: transferSearchForm.tenant_id || undefined,
|
|
|
+ enterprise_id: transferSearchForm.enterprise_id || undefined,
|
|
|
});
|
|
|
transferList.value = res.data.data.items || [];
|
|
|
transferPage.total = res.data.data.total || 0;
|
|
|
@@ -1343,6 +1454,90 @@ function handleTransferListChange() {
|
|
|
fetchTransferList();
|
|
|
}
|
|
|
|
|
|
+async function fetchAllTenantData() {
|
|
|
+ try {
|
|
|
+ const res = await TenantAPI.listTenant({ page_no: 1, page_size: 100 });
|
|
|
+ allTenantData.value = [{ id: undefined as any, name: "全部" }, ...(res.data.data?.items || [])];
|
|
|
+ } catch (error) {
|
|
|
+ console.error("获取所有租户数据失败:", error);
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+// ========== 消费记录 ==========
|
|
|
+
|
|
|
+const consumeRecordList = ref<any[]>([]);
|
|
|
+const consumeListLoading = ref(false);
|
|
|
+const consumePage = reactive({ page_no: 1, page_size: 10, total: 0 });
|
|
|
+const consumeSearchForm = reactive({
|
|
|
+ tenant_id: undefined as number | undefined,
|
|
|
+ enterprise_id: undefined as string | undefined,
|
|
|
+ consume_type: undefined as string | undefined,
|
|
|
+ status: undefined as string | undefined,
|
|
|
+ start_time: undefined as string | undefined,
|
|
|
+ end_time: undefined as string | undefined,
|
|
|
+ dateRange: null as Date[] | null,
|
|
|
+});
|
|
|
+
|
|
|
+function handleConsumeDateChange() {
|
|
|
+ if (consumeSearchForm.dateRange && consumeSearchForm.dateRange.length === 2) {
|
|
|
+ consumeSearchForm.start_time = (consumeSearchForm.dateRange as any)[0];
|
|
|
+ consumeSearchForm.end_time = (consumeSearchForm.dateRange as any)[1];
|
|
|
+ } else {
|
|
|
+ consumeSearchForm.start_time = undefined;
|
|
|
+ consumeSearchForm.end_time = undefined;
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+async function fetchConsumeList() {
|
|
|
+ consumeListLoading.value = true;
|
|
|
+ try {
|
|
|
+ const res = await AccountAPI.consumeList({
|
|
|
+ page_no: consumePage.page_no,
|
|
|
+ page_size: consumePage.page_size,
|
|
|
+ tenant_id: consumeSearchForm.tenant_id || undefined,
|
|
|
+ enterprise_id: consumeSearchForm.enterprise_id || undefined,
|
|
|
+ consume_type: consumeSearchForm.consume_type || undefined,
|
|
|
+ status: consumeSearchForm.status || undefined,
|
|
|
+ start_time: consumeSearchForm.start_time || undefined,
|
|
|
+ end_time: consumeSearchForm.end_time || undefined,
|
|
|
+ });
|
|
|
+ consumeRecordList.value = res.data.data.items || [];
|
|
|
+ consumePage.total = res.data.data.total || 0;
|
|
|
+ } finally {
|
|
|
+ consumeListLoading.value = false;
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+function handleConsumeSearch() { consumePage.page_no = 1; fetchConsumeList(); }
|
|
|
+function handleConsumeSearchReset() {
|
|
|
+ consumeSearchForm.tenant_id = undefined;
|
|
|
+ consumeSearchForm.enterprise_id = undefined;
|
|
|
+ consumeSearchForm.consume_type = undefined;
|
|
|
+ consumeSearchForm.status = undefined;
|
|
|
+ consumeSearchForm.start_time = undefined;
|
|
|
+ consumeSearchForm.end_time = undefined;
|
|
|
+ consumeSearchForm.dateRange = null;
|
|
|
+ handleConsumeSearch();
|
|
|
+}
|
|
|
+function handleConsumeListChange() { fetchConsumeList(); }
|
|
|
+
|
|
|
+function getConsumeTypeTag(type: string) {
|
|
|
+ const map: Record<string, any> = { CONSUME: '', REFUND: 'warning', TRANSFER: 'info' };
|
|
|
+ return map[type] || 'info';
|
|
|
+}
|
|
|
+function getConsumeTypeLabel(type: string) {
|
|
|
+ const map: Record<string, string> = { CONSUME: '消费', REFUND: '退款', TRANSFER: '转账' };
|
|
|
+ return map[type] || type;
|
|
|
+}
|
|
|
+function getConsumeStatusType(status: string) {
|
|
|
+ const map: Record<string, any> = { NEW: 'info', PROCESSED: 'success' };
|
|
|
+ return map[status] || 'info';
|
|
|
+}
|
|
|
+function getConsumeStatusLabel(status: string) {
|
|
|
+ const map: Record<string, string> = { NEW: '未处理', PROCESSED: '已处理' };
|
|
|
+ return map[status] || status;
|
|
|
+}
|
|
|
+
|
|
|
function handleViewTransferDetail(outBizNo: string) {
|
|
|
currentTransferOutBizNo.value = outBizNo;
|
|
|
transferDetailVisible.value = true;
|
|
|
@@ -1472,7 +1667,15 @@ async function handleGoTab(tab: string) {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-onMounted(() => {
|
|
|
+onMounted(async () => {
|
|
|
+ if (is_platform_user.value) {
|
|
|
+ await fetchAllTenantData();
|
|
|
+ }
|
|
|
+ await enterpriseStore.loadEnterpriseList();
|
|
|
+ if (!is_platform_user.value) {
|
|
|
+ transferSearchForm.enterprise_id = currentEnterpriseId.value;
|
|
|
+ consumeSearchForm.enterprise_id = currentEnterpriseId.value;
|
|
|
+ }
|
|
|
if (currentEnterpriseId.value) {
|
|
|
authorizeForm.enterprise_id = currentEnterpriseId.value;
|
|
|
createForm.enterprise_id = currentEnterpriseId.value;
|
|
|
@@ -1486,6 +1689,9 @@ watch(activeTab, async (newValue) => {
|
|
|
if (newValue === "transfer") {
|
|
|
await handleTransferSearch();
|
|
|
}
|
|
|
+ if (newValue === "consume-record") {
|
|
|
+ await handleConsumeSearch();
|
|
|
+ }
|
|
|
})
|
|
|
|
|
|
// watch(batchTransferVisible, (newValue) => {
|