diff --git a/apps/src/api/legacy/operate.ts b/apps/src/api/legacy/operate.ts index 59fef6b..ed2973c 100644 --- a/apps/src/api/legacy/operate.ts +++ b/apps/src/api/legacy/operate.ts @@ -212,6 +212,17 @@ export async function getClsGoldRunningWater(params: Record) { }); } +export async function exportClsGoldRunningWater( + params: Record, + filename = 'GmGoldRunningWater', +) { + return downloadLegacyExcel( + '/user-wallet/gold/running-water/cls/export', + params, + filename, + ); +} + export async function getPurchaseTable(params: Record) { return requestClient.get>>( '/order/purchase/history/page', diff --git a/apps/src/api/legacy/system.ts b/apps/src/api/legacy/system.ts index 6be9f91..b6ba9ce 100644 --- a/apps/src/api/legacy/system.ts +++ b/apps/src/api/legacy/system.ts @@ -43,12 +43,23 @@ export interface LegacyUser { }>; } +export interface LegacyBackUserOption { + id: number | string; + loginName?: string; + nickname?: string; + status?: number | string; +} + export async function pageUsers(params: Record) { return requestClient.get>('/users', { params, }); } +export async function listBackUserOptions() { + return requestClient.get('/users/list/combo'); +} + export async function switchUserStatus( id: number | string, status: number | string, diff --git a/apps/src/api/legacy/user.ts b/apps/src/api/legacy/user.ts index 2623a43..ae0376b 100644 --- a/apps/src/api/legacy/user.ts +++ b/apps/src/api/legacy/user.ts @@ -216,11 +216,14 @@ export async function pageFreightRunningWater(params: Record) { ); } -export async function exportFreightWaters(params: Record) { +export async function exportFreightWaters( + params: Record, + filename = 'ExportFreightWaters', +) { return downloadLegacyExcel( '/freight/running-water/export', params, - 'ExportFreightWaters', + filename, ); } diff --git a/apps/src/views/gm/gold-operation.vue b/apps/src/views/gm/gold-operation.vue index 4b80d29..9ad9395 100644 --- a/apps/src/views/gm/gold-operation.vue +++ b/apps/src/views/gm/gold-operation.vue @@ -21,9 +21,12 @@ import { } from 'antdv-next'; import dayjs from 'dayjs'; -import { submitGmGoldOperation } from '#/api/legacy/gm'; -import { getClsGoldRunningWater } from '#/api/legacy/operate'; -import { listMembers } from '#/api/legacy/team'; +import { pageGmGoldOperation, submitGmGoldOperation } from '#/api/legacy/gm'; +import { + exportClsGoldRunningWater, + getClsGoldRunningWater, +} from '#/api/legacy/operate'; +import { listBackUserOptions } from '#/api/legacy/system'; import { getUserBaseInfoBySysOriginAccount } from '#/api/legacy/user'; import AccountInput from '#/components/account-input.vue'; import UserProfileLink from '#/views/operate/components/user-profile-link.vue'; @@ -56,6 +59,8 @@ const DEFAULT_PAGE_SIZE = 100; const open = ref(false); const loading = ref(false); const loadMoreLoading = ref(false); +const operatorsLoading = ref(false); +const exporting = ref(false); const submitting = ref(false); const list = ref>>([]); const notMore = ref(false); @@ -64,7 +69,7 @@ const rangeDate = ref<[string, string] | null>(null); const operators = ref>>([]); const query = reactive>({ - backOperationUser: undefined, + backOperationUsers: [], context: '', endTime: '', lastId: '', @@ -103,10 +108,14 @@ const showUsdQuantity = computed( ); const operatorOptions = computed(() => - operators.value.map((item) => ({ - label: `${item.nickname || item.loginName || item.id} / ${item.loginName || item.id}`, - value: item.id, - })), + operators.value.map((item) => { + const name = item.nickname || item.loginName || item.name || item.id; + const account = item.loginName && item.loginName !== name ? ` / ${item.loginName}` : ''; + return { + label: `${name}${account}`, + value: item.id, + }; + }), ); const currentPageList = computed(() => { @@ -259,22 +268,81 @@ function filterOperatorOption(input: string, option: any) { } async function loadOperators() { - operators.value = (await listMembers()) || []; + operatorsLoading.value = true; + try { + let backUsers: Array> = []; + try { + const result = await listBackUserOptions(); + backUsers = Array.isArray(result) ? result : []; + } catch { + backUsers = []; + } + operators.value = + backUsers.length > 0 + ? normalizeOperators(backUsers) + : await loadRecentGmOperators().catch(() => []); + } finally { + operatorsLoading.value = false; + } } -async function loadData(reset = false) { - if (loading.value || loadMoreLoading.value) { - return; - } +function normalizeOperators(items: Array>) { + const operatorMap = new Map>(); + items.forEach((item) => { + const id = item.id || item.applicantId; + if (!id) { + return; + } + operatorMap.set(String(id), { + id, + loginName: item.loginName, + name: item.name, + nickname: item.nickname || item.applicantName, + status: item.status, + }); + }); + return [...operatorMap.values()]; +} + +async function loadRecentGmOperators() { + const result = await pageGmGoldOperation({ cursor: 1, limit: 500 }); + return normalizeOperators(result?.records || []); +} + +function validateQueryTimeRange() { if (!query.startTime || !query.endTime) { message.warning('请选择时间范围'); - return; + return false; } const startYear = new Date(Number(query.startTime)).getFullYear(); const endYear = new Date(Number(query.endTime)).getFullYear(); if (startYear !== endYear) { message.warning('不允许跨年查询'); + return false; + } + return true; +} + +function buildRunningWaterParams() { + const backOperationUsers = Array.isArray(query.backOperationUsers) + ? query.backOperationUsers.filter(Boolean).join(',') + : ''; + return { + backOperationUsers: backOperationUsers || undefined, + endTime: query.endTime, + queryBackOperationUser: true, + startTime: query.startTime, + type: query.type, + userId: query.userId || undefined, + }; +} + +async function loadData(reset = false) { + if (loading.value || loadMoreLoading.value) { + return; + } + if (!validateQueryTimeRange()) { return; } @@ -294,15 +362,10 @@ async function loadData(reset = false) { try { const result = await getClsGoldRunningWater({ - backOperationUser: query.backOperationUser || undefined, + ...buildRunningWaterParams(), context: query.context || undefined, - endTime: query.endTime, lastId: query.lastId || undefined, limit: query.limit, - queryBackOperationUser: true, - startTime: query.startTime, - type: query.type, - userId: query.userId || undefined, }); const waters = result?.waters || []; const nextList = reset ? waters : [...list.value, ...waters]; @@ -352,6 +415,21 @@ async function handleSearch() { await loadData(true); } +async function handleExport() { + if (exporting.value || !validateQueryTimeRange()) { + return; + } + exporting.value = true; + try { + await exportClsGoldRunningWater( + buildRunningWaterParams(), + `GmGoldRunningWater_${dayjs(Number(query.startTime)).format('YYYYMMDD')}_${dayjs(Number(query.endTime)).format('YYYYMMDD')}`, + ); + } finally { + exporting.value = false; + } +} + async function handleSubmit() { if (!validateForm()) { return; @@ -420,15 +498,19 @@ void loadData(true); style="width: 240px" />