瀏覽代碼

✨ feat(pushReport): 增加status、删除

dodo hold 1 年之前
父節點
當前提交
9afceffe67
共有 2 個文件被更改,包括 143 次插入16 次删除
  1. 12 1
      src/api/dataReport.ts
  2. 131 15
      src/views/site/pushReport.vue

+ 12 - 1
src/api/dataReport.ts

@@ -26,10 +26,18 @@ export interface PushDataReportRecord {
     request_id: string;
     create_time: Date;
     update_time: Date;
-    status: number;
+    status: number; // 0未推送,1推送成功,2推送失败,3手动推送
     last_push_time?: Date;
 }
 
+// 添加状态常量定义
+export const PUSH_STATUS = {
+    NOT_PUSHED: 0,    // 未推送
+    SUCCESS: 1,       // 推送成功
+    FAILED: 2,        // 推送失败
+    MANUAL: 3         // 手动推送
+};
+
 export interface PushDataReportParams {
     current: number;
     pageSize: number;
@@ -57,4 +65,7 @@ export function saveReport(data: Partial<PushDataReportRecord>) {
 
 export function pushReport(id: number) {
     return axios.post<FormRes>('/api/dataReport/push', { id });
+} 
+export function deleteReport(id: number) {
+    return axios.post<FormRes>('/api/dataReport/delete', { id });
 } 

+ 131 - 15
src/views/site/pushReport.vue

@@ -80,6 +80,12 @@
                             </template>
                             批量推送 ({{ selectedRowKeys.length }})
                         </a-button>
+                        <a-button type="danger" :disabled="selectedRowKeys.length === 0" @click="onBatchDelete">
+                            <template #icon>
+                                <icon-delete />
+                            </template>
+                            批量删除 ({{ selectedRowKeys.length }})
+                        </a-button>
                     </a-space>
                 </a-col>
                 <a-col :span="12" style="
@@ -165,7 +171,7 @@
                 <template #status="{ record }">
                     <div>
                         <a-tag :color="getStatusColor(record.status)" bordered>
-                            {{ record.status === 1 ? '已推送' : getStatusText(record.status, record.last_push_time) }}
+                            {{ getStatusText(record.status) }}
                         </a-tag>
                         <div class="status-extra-info" v-if="record.last_push_time || record.request_id">
                             <div v-if="record.request_id" class="text-ellipsis">
@@ -216,10 +222,13 @@
                 <template #command="{ record }">
                     <a-space>
                         <a-button type="primary" @click="onEdit(record)">
-                            更新数据
+                            编辑
+                        </a-button>
+                        <a-button status="danger" @click="onDelete(record)">
+                            删除
                         </a-button>
                         <a-button status="success" @click="onPush(record)">
-                            推送数据
+                            推送
                         </a-button>
                     </a-space>
                 </template>
@@ -337,6 +346,20 @@
                                 allow-search :filter-option="filterPlatformOption" />
                         </a-form-item>
                     </a-col>
+                    <a-col :span="12">
+                        <a-form-item label="推送状态">
+                            <a-select v-model="editForm.status" :options="[
+                                { label: '未推送', value: 0 },
+                                { label: '推送成功', value: 1 },
+                                { label: '推送失败', value: 2 },
+                                { label: '手动推送', value: 3 }
+                            ]">
+                                <template #label="{ data }">
+                                    <span :style="{ color: getStatusColor(data.value) }">{{ data.label }}</span>
+                                </template>
+                            </a-select>
+                        </a-form-item>
+                    </a-col>
                 </a-row>
             </a-form>
         </a-modal>
@@ -393,7 +416,7 @@ import type { TableColumnData } from '@arco-design/web-vue/es/table/interface';
 import cloneDeep from 'lodash/cloneDeep';
 import Sortable from 'sortablejs';
 import {
-    PushDataReportParams, PushDataReportRecord, queryReportList, saveReport, pushReport
+    PushDataReportParams, PushDataReportRecord, queryReportList, saveReport, pushReport, deleteReport
 } from '@/api/dataReport';
 import { platformList, getPlatformNameById } from '@/constants/pushPlatform';
 
@@ -487,13 +510,17 @@ const statusOptions = computed<SelectOptionData[]>(() => [
         value: 0,
     },
     {
-        label: '推送',
+        label: '推送成功',
         value: 1,
     },
     {
         label: '推送失败',
         value: 2,
     },
+    {
+        label: '手动推送',
+        value: 3,
+    },
 ]);
 
 // 结算状态选项
@@ -664,7 +691,7 @@ const columns = computed<TableColumnData[]>(() => [
     {
         title: '操作',
         slotName: 'command',
-        width: 180,
+        width: 240,
         fixed: 'right',
     },
 ]);
@@ -990,19 +1017,16 @@ const onTypeOrDateChange = () => {
     search();
 };
 
-const getStatusText = (status: number, lastPushTime?: Date) => {
+const getStatusText = (status: number) => {
     switch (status) {
         case 0:
             return '未推送';
         case 1:
-            if (lastPushTime) {
-                return `${dayjs(lastPushTime).format('MM-DD HH:mm')} 已推送`;
-            }
-            return '已推送';
+            return '推送成功';
         case 2:
-            return '推送中';
-        case -1:
             return '推送失败';
+        case 3:
+            return '手动推送';
         default:
             return `未知(${status})`;
     }
@@ -1015,9 +1039,9 @@ const getStatusColor = (status: number) => {
         case 1:
             return 'green';
         case 2:
-            return 'blue';
-        case -1:
             return 'red';
+        case 3:
+            return 'blue';
         default:
             return '';
     }
@@ -1142,6 +1166,98 @@ const handleBatchPushComplete = (done: () => void) => {
     search();
     done(); // 关闭对话框
 };
+
+// 添加删除方法
+const onDelete = (record: PushDataReportRecord) => {
+    Modal.confirm({
+        title: '确认删除',
+        content: `确定要删除 ID 为 ${record.id} 的数据记录吗?此操作不可恢复。`,
+        okText: '删除',
+        okButtonProps: { status: 'danger' },
+        cancelText: '取消',
+        onOk: async () => {
+            try {
+                const response = await deleteReport(record.id);
+                if (response.data.success) {
+                    Message.success(response.data.msg || '删除成功');
+                    // 刷新数据列表
+                    search();
+                } else {
+                    Message.error(response.data.msg || '删除失败');
+                }
+            } catch (error) {
+                Message.error('删除请求失败');
+            }
+        }
+    });
+};
+
+// 批量删除方法
+const onBatchDelete = () => {
+    if (selectedRowKeys.value.length === 0) {
+        Message.warning('请选择要删除的数据');
+        return;
+    }
+
+    Modal.confirm({
+        title: '批量删除确认',
+        content: `确定要删除选中的 ${selectedRowKeys.value.length} 条数据吗?此操作不可恢复。`,
+        okText: '删除',
+        okButtonProps: { status: 'danger' },
+        cancelText: '取消',
+        onOk: async () => {
+            let successCount = 0;
+            let failCount = 0;
+            
+            // 创建进度弹窗
+            const progressModal = Modal.info({
+                title: '删除中',
+                content: `0/${selectedRowKeys.value.length}条数据已处理,请稍候...`,
+                okButtonProps: { disabled: true },
+                cancelButtonProps: { disabled: true },
+                footer: false,
+                closable: false,
+                maskClosable: false
+            });
+            
+            // 依次删除每条数据
+            for (let i = 0; i < selectedRowKeys.value.length; i += 1) {
+                const id = Number(selectedRowKeys.value[i]);
+                try {
+                    // eslint-disable-next-line no-await-in-loop
+                    const response = await deleteReport(id);
+                    if (response.data && response.data.success) {
+                        successCount += 1;
+                    } else {
+                        failCount += 1;
+                    }
+                } catch (error) {
+                    failCount += 1;
+                }
+                
+                // 更新进度信息
+                progressModal.update({
+                    content: `${i + 1}/${selectedRowKeys.value.length}条数据已处理,成功:${successCount},失败:${failCount},请稍候...`
+                });
+            }
+            
+            // 关闭进度弹窗
+            progressModal.close();
+            
+            // 显示结果
+            Modal.success({
+                title: '删除完成',
+                content: `已完成所有数据删除,成功:${successCount},失败:${failCount}`,
+                onOk: () => {
+                    // 清空选择并刷新数据
+                    selectedRowKeys.value = [];
+                    selectedRows.value = [];
+                    search();
+                }
+            });
+        }
+    });
+};
 </script>
 
 <script lang="ts">