From eb0b661cb59ce88085e5f2a17d5ce42ac8739a0f Mon Sep 17 00:00:00 2001
From: wupengfei <834520024@qq.com>
Date: 星期一, 29 九月 2025 10:01:30 +0800
Subject: [PATCH] feat: 日志

---
 src/views/TraceIdLogManage/SmsLogs.vue     |  236 ++++++++++++++++++++++++++
 src/views/TraceIdLogManage/DbAuditLogs.vue |    1 
 .eslintrc-auto-import.json                 |    4 
 src/views/TraceIdLogManage/ConsoleLogs.vue |  221 ++++++++++++++++++++++++
 auto-imports.d.ts                          |    8 
 src/constants/logs.ts                      |   27 +++
 6 files changed, 496 insertions(+), 1 deletions(-)

diff --git a/.eslintrc-auto-import.json b/.eslintrc-auto-import.json
index 0fb83b8..58b65b5 100644
--- a/.eslintrc-auto-import.json
+++ b/.eslintrc-auto-import.json
@@ -28,6 +28,7 @@
     "EnumClientTypeText": true,
     "EnumCodeUrlScene": true,
     "EnumConsoleLogAccess": true,
+    "EnumConsoleLogAccessText": true,
     "EnumContractTemplateStatus": true,
     "EnumContractTemplateStatusText": true,
     "EnumContractTemplateStatusTextForEnterpriseFilter": true,
@@ -55,6 +56,7 @@
     "EnumEnterpriseWalletTransactionType": true,
     "EnumGetEnterpriseEmployeesQuerySignContractStatus": true,
     "EnumLogLevel": true,
+    "EnumLogLevelText": true,
     "EnumMenuType": true,
     "EnumMenuVisitLevel": true,
     "EnumOcrAccess": true,
@@ -81,8 +83,10 @@
     "EnumSettlementCycleText": true,
     "EnumSmsAccess": true,
     "EnumSmsAccessText": true,
+    "EnumSmsAccessTextUseInLogs": true,
     "EnumSmsAccessTextUseInSms": true,
     "EnumSmsStatus": true,
+    "EnumSmsStatusText": true,
     "EnumTaskCheckReceiveStatus": true,
     "EnumTaskCheckReceiveStatusText": true,
     "EnumTaskRecommendStatus": true,
diff --git a/auto-imports.d.ts b/auto-imports.d.ts
index 9d158b2..2787dce 100644
--- a/auto-imports.d.ts
+++ b/auto-imports.d.ts
@@ -30,6 +30,7 @@
   const EnumClientTypeText: typeof import('./src/constants/apiEnumText')['EnumClientTypeText']
   const EnumCodeUrlScene: typeof import('./src/constants/apiEnum')['EnumCodeUrlScene']
   const EnumConsoleLogAccess: typeof import('./src/constants/apiEnum')['EnumConsoleLogAccess']
+  const EnumConsoleLogAccessText: typeof import('./src/constants/logs')['EnumConsoleLogAccessText']
   const EnumContractTemplateStatus: typeof import('./src/constants/apiEnum')['EnumContractTemplateStatus']
   const EnumContractTemplateStatusText: typeof import('./src/constants/electronSign')['EnumContractTemplateStatusText']
   const EnumContractTemplateStatusTextForEnterpriseFilter: typeof import('./src/constants/electronSign')['EnumContractTemplateStatusTextForEnterpriseFilter']
@@ -58,6 +59,7 @@
   const EnumEnterpriseWalletTransactionType: typeof import('./src/constants/apiEnum')['EnumEnterpriseWalletTransactionType']
   const EnumGetEnterpriseEmployeesQuerySignContractStatus: typeof import('./src/constants/apiEnum')['EnumGetEnterpriseEmployeesQuerySignContractStatus']
   const EnumLogLevel: typeof import('./src/constants/apiEnum')['EnumLogLevel']
+  const EnumLogLevelText: typeof import('./src/constants/logs')['EnumLogLevelText']
   const EnumMenuType: typeof import('./src/constants/apiEnum')['EnumMenuType']
   const EnumMenuVisitLevel: typeof import('./src/constants/apiEnum')['EnumMenuVisitLevel']
   const EnumOcrAccess: typeof import('./src/constants/apiEnum')['EnumOcrAccess']
@@ -85,8 +87,10 @@
   const EnumSettlementCycleText: typeof import('./src/constants/task')['EnumSettlementCycleText']
   const EnumSmsAccess: typeof import('./src/constants/apiEnum')['EnumSmsAccess']
   const EnumSmsAccessText: typeof import('./src/constants/enterprise')['EnumSmsAccessText']
+  const EnumSmsAccessTextUseInLogs: typeof import('./src/constants/logs')['EnumSmsAccessTextUseInLogs']
   const EnumSmsAccessTextUseInSms: typeof import('./src/constants/enterprise')['EnumSmsAccessTextUseInSms']
   const EnumSmsStatus: typeof import('./src/constants/apiEnum')['EnumSmsStatus']
+  const EnumSmsStatusText: typeof import('./src/constants/logs')['EnumSmsStatusText']
   const EnumTaskCheckReceiveStatus: typeof import('./src/constants/apiEnum')['EnumTaskCheckReceiveStatus']
   const EnumTaskCheckReceiveStatusText: typeof import('./src/constants/task')['EnumTaskCheckReceiveStatusText']
   const EnumTaskRecommendStatus: typeof import('./src/constants/apiEnum')['EnumTaskRecommendStatus']
@@ -345,6 +349,7 @@
     readonly EnumClientTypeText: UnwrapRef<typeof import('./src/constants/apiEnumText')['EnumClientTypeText']>
     readonly EnumCodeUrlScene: UnwrapRef<typeof import('./src/constants/apiEnum')['EnumCodeUrlScene']>
     readonly EnumConsoleLogAccess: UnwrapRef<typeof import('./src/constants/apiEnum')['EnumConsoleLogAccess']>
+    readonly EnumConsoleLogAccessText: UnwrapRef<typeof import('./src/constants/logs')['EnumConsoleLogAccessText']>
     readonly EnumContractTemplateStatus: UnwrapRef<typeof import('./src/constants/apiEnum')['EnumContractTemplateStatus']>
     readonly EnumContractTemplateStatusText: UnwrapRef<typeof import('./src/constants/electronSign')['EnumContractTemplateStatusText']>
     readonly EnumContractTemplateStatusTextForEnterpriseFilter: UnwrapRef<typeof import('./src/constants/electronSign')['EnumContractTemplateStatusTextForEnterpriseFilter']>
@@ -372,6 +377,7 @@
     readonly EnumEnterpriseWalletTransactionType: UnwrapRef<typeof import('./src/constants/apiEnum')['EnumEnterpriseWalletTransactionType']>
     readonly EnumGetEnterpriseEmployeesQuerySignContractStatus: UnwrapRef<typeof import('./src/constants/apiEnum')['EnumGetEnterpriseEmployeesQuerySignContractStatus']>
     readonly EnumLogLevel: UnwrapRef<typeof import('./src/constants/apiEnum')['EnumLogLevel']>
+    readonly EnumLogLevelText: UnwrapRef<typeof import('./src/constants/logs')['EnumLogLevelText']>
     readonly EnumMenuType: UnwrapRef<typeof import('./src/constants/apiEnum')['EnumMenuType']>
     readonly EnumMenuVisitLevel: UnwrapRef<typeof import('./src/constants/apiEnum')['EnumMenuVisitLevel']>
     readonly EnumOcrAccess: UnwrapRef<typeof import('./src/constants/apiEnum')['EnumOcrAccess']>
@@ -398,8 +404,10 @@
     readonly EnumSettlementCycleText: UnwrapRef<typeof import('./src/constants/task')['EnumSettlementCycleText']>
     readonly EnumSmsAccess: UnwrapRef<typeof import('./src/constants/apiEnum')['EnumSmsAccess']>
     readonly EnumSmsAccessText: UnwrapRef<typeof import('./src/constants/enterprise')['EnumSmsAccessText']>
+    readonly EnumSmsAccessTextUseInLogs: UnwrapRef<typeof import('./src/constants/logs')['EnumSmsAccessTextUseInLogs']>
     readonly EnumSmsAccessTextUseInSms: UnwrapRef<typeof import('./src/constants/enterprise')['EnumSmsAccessTextUseInSms']>
     readonly EnumSmsStatus: UnwrapRef<typeof import('./src/constants/apiEnum')['EnumSmsStatus']>
+    readonly EnumSmsStatusText: UnwrapRef<typeof import('./src/constants/logs')['EnumSmsStatusText']>
     readonly EnumTaskCheckReceiveStatus: UnwrapRef<typeof import('./src/constants/apiEnum')['EnumTaskCheckReceiveStatus']>
     readonly EnumTaskCheckReceiveStatusText: UnwrapRef<typeof import('./src/constants/task')['EnumTaskCheckReceiveStatusText']>
     readonly EnumTaskRecommendStatus: UnwrapRef<typeof import('./src/constants/apiEnum')['EnumTaskRecommendStatus']>
diff --git a/src/constants/logs.ts b/src/constants/logs.ts
index 491e8ff..5558f67 100644
--- a/src/constants/logs.ts
+++ b/src/constants/logs.ts
@@ -5,3 +5,30 @@
   [EnumResourceMethod.Put]: '淇敼',
   [EnumResourceMethod.Delete]: '鍒犻櫎',
 };
+
+export const EnumConsoleLogAccessText = {
+  [EnumConsoleLogAccess.Back]: '鍚庣',
+  [EnumConsoleLogAccess.Front]: '鍓嶇',
+};
+
+export const EnumSmsAccessTextUseInLogs = {
+  [EnumSmsAccess.None]: '鏃�',
+  [EnumSmsAccess.AliyunSms]: '闃块噷浜戠煭淇�',
+  [EnumSmsAccess.ChengLiYe]: '璇氱珛涓�',
+};
+
+export const EnumSmsStatusText = {
+  [EnumSmsStatus.Wait]: '寰呭彂閫�',
+  [EnumSmsStatus.InProcess]: '鍙戦�佷腑',
+  [EnumSmsStatus.Success]: '鍙戦�佹垚鍔�',
+  [EnumSmsStatus.Fail]: '鍙戦�佸け璐�',
+};
+
+export const EnumLogLevelText = {
+  [EnumLogLevel.Trace]: '璺熻釜',
+  [EnumLogLevel.Debug]: '璋冭瘯',
+  [EnumLogLevel.Information]: '淇℃伅',
+  [EnumLogLevel.Warning]: '璀﹀憡',
+  [EnumLogLevel.Error]: '閿欒',
+  [EnumLogLevel.Critical]: '涓ラ噸',
+};
diff --git a/src/views/TraceIdLogManage/ConsoleLogs.vue b/src/views/TraceIdLogManage/ConsoleLogs.vue
new file mode 100644
index 0000000..e76704a
--- /dev/null
+++ b/src/views/TraceIdLogManage/ConsoleLogs.vue
@@ -0,0 +1,221 @@
+<template>
+  <LoadingLayout :loading="state.loading">
+    <AppContainer>
+      <ProTableQueryFilterBar @on-reset="reset">
+        <template #query>
+          <QueryFilterItem tip-content="閫氶亾">
+            <FieldRadio
+              v-model="extraParamState.access"
+              :value-enum="EnumConsoleLogAccessText"
+              buttonStyle
+              showAllBtn
+              @change="getList()"
+            />
+          </QueryFilterItem>
+          <QueryFilterItem tip-content="绛夌骇">
+            <FieldRadio
+              v-model="extraParamState.level"
+              :value-enum="EnumLogLevelText"
+              buttonStyle
+              showAllBtn
+              @change="getList()"
+            />
+          </QueryFilterItem>
+          <QueryFilterItem tip-content="鍒涘缓鏃堕棿">
+            <FieldDatePicker
+              v-model="extraParamState.createdTime"
+              type="daterange"
+              range-separator="~"
+              start-placeholder="寮�濮嬫椂闂�"
+              end-placeholder="缁撴潫鏃堕棿"
+              clearable
+              @change="getList()"
+            ></FieldDatePicker>
+          </QueryFilterItem>
+          <QueryFilterItem>
+            <SearchInput
+              v-model="extraParamState.createdUser"
+              style="width: 260px"
+              placeholder="鎿嶄綔浜篶reatedUser"
+              @on-click-search="getList()"
+            >
+            </SearchInput>
+          </QueryFilterItem>
+          <QueryFilterItem>
+            <SearchInput
+              v-model="extraParamState.traceId"
+              style="width: 260px"
+              placeholder="璺熻釜Id(traceId)"
+              @on-click-search="getList()"
+            >
+            </SearchInput>
+          </QueryFilterItem>
+          <QueryFilterItem>
+            <SearchInput
+              v-model="extraParamState.content"
+              style="width: 260px"
+              placeholder="鍐呭content"
+              @on-click-search="getList()"
+            >
+            </SearchInput>
+          </QueryFilterItem>
+          <QueryFilterItem>
+            <SearchInput
+              v-model="extraParamState.url"
+              style="width: 260px"
+              placeholder="閾炬帴鍦板潃url"
+              @on-click-search="getList()"
+            >
+            </SearchInput>
+          </QueryFilterItem>
+          <QueryFilterItem>
+            <SearchInput
+              v-model="extraParamState.request"
+              style="width: 260px"
+              placeholder="浼犲弬request"
+              @on-click-search="getList()"
+            >
+            </SearchInput>
+          </QueryFilterItem>
+          <QueryFilterItem>
+            <SearchInput
+              v-model="extraParamState.ext"
+              style="width: 260px"
+              placeholder="鎵╁睍ext"
+              @on-click-search="getList()"
+            >
+            </SearchInput>
+          </QueryFilterItem>
+        </template>
+      </ProTableQueryFilterBar>
+      <ProTableV2 v-bind="proTableProps" :columns="column" :operationBtns="operationBtns">
+        <template #createdUser="{ row }">
+          <el-button
+            v-if="row.createdUser"
+            type="primary"
+            link
+            @click="
+              handleAdd({ json: { createdUser: JSON.parse(JSON.stringify(row.createdUser)) } })
+            "
+            >鏌ョ湅</el-button
+          >
+        </template>
+      </ProTableV2>
+      <JsonViewerDialog v-bind="dialogProps" />
+    </AppContainer>
+  </LoadingLayout>
+</template>
+
+<script setup lang="ts">
+import {
+  ProTableQueryFilterBar,
+  SearchInput,
+  LoadingLayout,
+  AppContainer,
+  QueryFilterItem,
+  useTable,
+  ProTableV2,
+  FieldRadio,
+  FieldDatePicker,
+  useFormDialog,
+} from '@bole-core/components';
+import { EnumConsoleLogAccessText, EnumLogLevelText } from '@/constants';
+import * as logRecordsServices from '@/services/api/logRecords';
+import { ModelValueType } from 'element-plus';
+import { format } from '@/utils';
+import JsonViewerDialog from './components/JsonViewerDialog.vue';
+
+defineOptions({
+  name: 'ConsoleLogs',
+});
+
+const operationBtnMap: Record<string, OperationBtnType> = {
+  detailBtn: { emits: { onClick: (role) => openDialog(role) } },
+};
+
+const { column, operationBtns } = useAccess({
+  operationBtnMap,
+});
+
+const BaseState = {
+  loading: true,
+};
+
+const state = reactive({ ...BaseState });
+
+onMounted(async () => {
+  await getList();
+  state.loading = false;
+});
+
+const {
+  getDataSource: getList,
+  proTableProps,
+  paginationState,
+  extraParamState,
+  reset,
+} = useTable(
+  async ({ pageIndex, pageSize }, extraParamState) => {
+    try {
+      let params: API.GetConsoleLogsQuery = {
+        pageModel: {
+          rows: pageSize,
+          page: pageIndex,
+          // orderInput: extraParamState.orderInput,
+        },
+        createdTimeBegin: format(extraParamState.createdTime?.[0] ?? '', 'YYYY-MM-DD 00:00:00'),
+        createdTimeEnd: format(extraParamState.createdTime?.[1] ?? '', 'YYYY-MM-DD 23:59:59'),
+        createdUser: extraParamState.createdUser,
+        traceId: extraParamState.traceId,
+        access: extraParamState.access,
+        level: extraParamState.level,
+        content: extraParamState.content,
+        url: extraParamState.url,
+        request: extraParamState.request,
+        ext: extraParamState.ext,
+      };
+      let res = await logRecordsServices.getConsoleLogs(params, {
+        showLoading: !state.loading,
+      });
+      return res;
+    } catch (error) {}
+  },
+  {
+    defaultExtraParams: {
+      createdUser: '',
+      traceId: '',
+      access: '' as any as EnumConsoleLogAccess,
+      level: '' as any as EnumLogLevel,
+      content: '',
+      url: '',
+      request: '',
+      ext: '',
+      createdTime: [] as unknown as ModelValueType,
+      orderInput: [{ property: 'createdTime', order: EnumPagedListOrder.Desc }],
+    },
+    columnsRenderProps: {
+      createdTime: { type: 'date', format: 'YYYY-MM-DD HH:mm:ss' },
+      access: { type: 'enum', valueEnum: EnumConsoleLogAccessText },
+      level: { type: 'enum', valueEnum: EnumLogLevelText },
+    },
+  }
+);
+
+const { dialogProps, handleAdd } = useFormDialog({
+  defaultFormParams: {
+    json: null,
+  },
+});
+
+function openDialog(row: API.GetConsoleLogsQueryResultItem) {
+  handleAdd({
+    json: {
+      createdUser: JSON.parse(JSON.stringify(row.createdUser)),
+    },
+  });
+}
+</script>
+
+<style lang="scss" scoped>
+@use '@/style/common.scss' as *;
+</style>
diff --git a/src/views/TraceIdLogManage/DbAuditLogs.vue b/src/views/TraceIdLogManage/DbAuditLogs.vue
index 9b62f3a..bec5a5d 100644
--- a/src/views/TraceIdLogManage/DbAuditLogs.vue
+++ b/src/views/TraceIdLogManage/DbAuditLogs.vue
@@ -9,7 +9,6 @@
               :value-enum="EnumDbAuditOperateText"
               buttonStyle
               showAllBtn
-              :all-btn-value="null"
               @change="getList()"
             />
           </QueryFilterItem>
diff --git a/src/views/TraceIdLogManage/SmsLogs.vue b/src/views/TraceIdLogManage/SmsLogs.vue
new file mode 100644
index 0000000..e29e742
--- /dev/null
+++ b/src/views/TraceIdLogManage/SmsLogs.vue
@@ -0,0 +1,236 @@
+<template>
+  <LoadingLayout :loading="state.loading">
+    <AppContainer>
+      <ProTableQueryFilterBar @on-reset="reset">
+        <template #query>
+          <QueryFilterItem tip-content="閫氶亾">
+            <FieldRadio
+              v-model="extraParamState.access"
+              :value-enum="EnumSmsAccessTextUseInLogs"
+              buttonStyle
+              showAllBtn
+              @change="getList()"
+            />
+          </QueryFilterItem>
+          <QueryFilterItem tip-content="鏄惁浣跨敤">
+            <FieldRadio
+              v-model="extraParamState.isUsed"
+              :value-enum="[
+                { label: '鎴愬姛', value: true },
+                { label: '澶辫触', value: false },
+              ]"
+              buttonStyle
+              showAllBtn
+              :all-btn-value="null"
+              @change="getList()"
+            />
+          </QueryFilterItem>
+          <QueryFilterItem tip-content="鍙戦�佺姸鎬�">
+            <FieldRadio
+              v-model="extraParamState.status"
+              :value-enum="EnumSmsStatusText"
+              buttonStyle
+              showAllBtn
+              @change="getList()"
+            />
+          </QueryFilterItem>
+          <QueryFilterItem tip-content="鍒涘缓鏃堕棿">
+            <FieldDatePicker
+              v-model="extraParamState.createdTime"
+              type="daterange"
+              range-separator="~"
+              start-placeholder="寮�濮嬫椂闂�"
+              end-placeholder="缁撴潫鏃堕棿"
+              clearable
+              @change="getList()"
+            ></FieldDatePicker>
+          </QueryFilterItem>
+          <QueryFilterItem>
+            <SearchInput
+              v-model="extraParamState.createdUser"
+              style="width: 260px"
+              placeholder="鎿嶄綔浜篶reatedUser"
+              @on-click-search="getList()"
+            >
+            </SearchInput>
+          </QueryFilterItem>
+          <QueryFilterItem>
+            <SearchInput
+              v-model="extraParamState.traceId"
+              style="width: 260px"
+              placeholder="璺熻釜Id(traceId)"
+              @on-click-search="getList()"
+            >
+            </SearchInput>
+          </QueryFilterItem>
+          <QueryFilterItem>
+            <SearchInput
+              v-model="extraParamState.phoneNumber"
+              style="width: 260px"
+              placeholder="鎵嬫満鍙风爜phoneNumber"
+              @on-click-search="getList()"
+            >
+            </SearchInput>
+          </QueryFilterItem>
+          <QueryFilterItem>
+            <SearchInput
+              v-model="extraParamState.templateCode"
+              style="width: 260px"
+              placeholder="妯℃澘浠g爜templateCode"
+              @on-click-search="getList()"
+            >
+            </SearchInput>
+          </QueryFilterItem>
+          <QueryFilterItem>
+            <SearchInput
+              v-model="extraParamState.templateParam"
+              style="width: 260px"
+              placeholder="妯℃澘鍙傛暟templateParam"
+              @on-click-search="getList()"
+            >
+            </SearchInput>
+          </QueryFilterItem>
+        </template>
+      </ProTableQueryFilterBar>
+      <ProTableV2 v-bind="proTableProps" :columns="column" :operationBtns="operationBtns">
+        <template #createdUser="{ row }">
+          <el-button
+            v-if="row.createdUser"
+            type="primary"
+            link
+            @click="
+              handleAdd({ json: { createdUser: JSON.parse(JSON.stringify(row.createdUser)) } })
+            "
+            >鏌ョ湅</el-button
+          >
+        </template>
+      </ProTableV2>
+      <JsonViewerDialog v-bind="dialogProps" />
+    </AppContainer>
+  </LoadingLayout>
+</template>
+
+<script setup lang="ts">
+import {
+  ProTableQueryFilterBar,
+  SearchInput,
+  LoadingLayout,
+  AppContainer,
+  QueryFilterItem,
+  useTable,
+  ProTableV2,
+  FieldRadio,
+  FieldDatePicker,
+  useFormDialog,
+} from '@bole-core/components';
+import { EnumSmsAccessTextUseInLogs, EnumSmsStatusText } from '@/constants';
+import * as logRecordsServices from '@/services/api/logRecords';
+import { ModelValueType } from 'element-plus';
+import { format } from '@/utils';
+import JsonViewerDialog from './components/JsonViewerDialog.vue';
+
+defineOptions({
+  name: 'SmsLogs',
+});
+
+const operationBtnMap: Record<string, OperationBtnType> = {
+  detailBtn: { emits: { onClick: (role) => openDialog(role) } },
+};
+
+const { column, operationBtns } = useAccess({
+  operationBtnMap,
+});
+
+const BaseState = {
+  loading: true,
+};
+
+const state = reactive({ ...BaseState });
+
+onMounted(async () => {
+  await getList();
+  state.loading = false;
+});
+
+const {
+  getDataSource: getList,
+  proTableProps,
+  paginationState,
+  extraParamState,
+  reset,
+} = useTable(
+  async ({ pageIndex, pageSize }, extraParamState) => {
+    try {
+      let params: API.GetSmsLogsQuery = {
+        pageModel: {
+          rows: pageSize,
+          page: pageIndex,
+          // orderInput: extraParamState.orderInput,
+        },
+        createdTimeBegin: format(extraParamState.createdTime?.[0] ?? '', 'YYYY-MM-DD 00:00:00'),
+        createdTimeEnd: format(extraParamState.createdTime?.[1] ?? '', 'YYYY-MM-DD 23:59:59'),
+        createdUser: extraParamState.createdUser,
+        traceId: extraParamState.traceId,
+        access: extraParamState.access,
+        phoneNumber: extraParamState.phoneNumber,
+        templateCode: extraParamState.templateCode,
+        templateParam: extraParamState.templateParam,
+        isUsed: extraParamState.isUsed,
+        status: extraParamState.status,
+      };
+      let res = await logRecordsServices.getSmsLogs(params, {
+        showLoading: !state.loading,
+      });
+      return res;
+    } catch (error) {}
+  },
+  {
+    defaultExtraParams: {
+      createdUser: '',
+      traceId: '',
+      access: '' as any as EnumSmsAccess,
+      phoneNumber: '',
+      templateCode: '',
+      templateParam: '',
+      isUsed: null as any as boolean,
+      status: '' as any as EnumSmsStatus,
+      createdTime: [] as unknown as ModelValueType,
+      orderInput: [{ property: 'createdTime', order: EnumPagedListOrder.Desc }],
+    },
+    columnsRenderProps: {
+      createdTime: { type: 'date', format: 'YYYY-MM-DD HH:mm:ss' },
+      expiry: { type: 'date', format: 'YYYY-MM-DD HH:mm:ss' },
+      access: { type: 'enum', valueEnum: EnumSmsAccessTextUseInLogs },
+      status: { type: 'enum', valueEnum: EnumSmsStatusText },
+      isUsed: {
+        formatter: (row: API.GetSmsLogsQueryResultItem) => {
+          return row.isUsed ? '鏄�' : '鍚�';
+        },
+      },
+      templateParam: {
+        formatter: (row: API.GetSmsLogsQueryResultItem) => {
+          return row.templateParam ? JSON.parse(row.templateParam).code : '';
+        },
+      },
+    },
+  }
+);
+
+const { dialogProps, handleAdd } = useFormDialog({
+  defaultFormParams: {
+    json: null,
+  },
+});
+
+function openDialog(row: API.GetSmsLogsQueryResultItem) {
+  handleAdd({
+    json: {
+      createdUser: JSON.parse(JSON.stringify(row.createdUser)),
+    },
+  });
+}
+</script>
+
+<style lang="scss" scoped>
+@use '@/style/common.scss' as *;
+</style>

--
Gitblit v1.9.1