瀏覽代碼

增加zlong转发

dodo hold 4 月之前
父節點
當前提交
de6c911128
共有 5 個文件被更改,包括 113 次插入27 次删除
  1. 3 1
      src/api/taobao.ts
  2. 1 1
      src/locale/en-US/taoke.ts
  3. 1 1
      src/locale/zh-CN/taoke.ts
  4. 44 23
      src/views/settings/config.vue
  5. 64 1
      src/views/settings/xhsZlongReport.vue

+ 3 - 1
src/api/taobao.ts

@@ -56,7 +56,7 @@ export interface UpdateConfigModel {
     ks_blacklist_regular: string;
     ksTestToken: string;
 
-    webook_xhs_zlong: number;
+    webook_forward_zlong: string;
 }
 
 export interface UpdateConfigRes {
@@ -77,6 +77,7 @@ export interface XhsZlongForwardReportSummary {
 }
 
 export interface XhsZlongForwardReportRecord {
+    channel: string;
     bucket_type: string;
     bucket_value: string;
     report_time: string;
@@ -89,6 +90,7 @@ export interface XhsZlongForwardReportRecord {
 export interface XhsZlongForwardReportParams {
     current: number;
     pageSize: number;
+    channels?: string;
     bucket_type?: string;
     start?: string;
     end?: string;

+ 1 - 1
src/locale/en-US/taoke.ts

@@ -1,7 +1,7 @@
 export default {
     'menu.settings': 'Settings',
     'menu.settings.config': 'System Config',
-    'menu.settings.xhsZlongReport': 'XHS Forward Report',
+    'menu.settings.xhsZlongReport': 'Multi-channel Forward Report',
     'menu.settings.apiAccount': 'API Account',
 
     'menu.apiAccount': 'API Account',

+ 1 - 1
src/locale/zh-CN/taoke.ts

@@ -1,7 +1,7 @@
 export default {
   'menu.settings': '系统设置',
   'menu.settings.config': '全局配置',
-  'menu.settings.xhsZlongReport': '小红书转发报表',
+  'menu.settings.xhsZlongReport': '多渠道转发报表',
   'menu.settings.aliyun': '阿里云资源管理',
   'menu.settings.apiAccount': '接口授权管理',
 

+ 44 - 23
src/views/settings/config.vue

@@ -35,11 +35,14 @@
                                             :auto-size="{ minRows: 5, maxRows: 20 }" />
                                     </a-form-item>
 
-                                    <a-form-item field="webook_xhs_zlong" label="小红书 Zlong 转发">
-                                        <a-space>
-                                            <a-switch v-model="formData.webook_xhs_zlong" :checked-value="1"
-                                                :unchecked-value="0" />
-                                        </a-space>
+                                    <a-form-item field="webook_forward_zlong" label="Zlong 转发渠道">
+                                        <a-checkbox-group v-model="forwardChannelsModel">
+                                            <a-checkbox value="xhs">小红书</a-checkbox>
+                                            <a-checkbox value="ks">快手</a-checkbox>
+                                        </a-checkbox-group>
+                                        <template #extra>
+                                            实际保存值:{{ formData.webook_forward_zlong || '未启用' }}
+                                        </template>
                                     </a-form-item>
 
                                 </a-tab-pane>
@@ -284,30 +287,18 @@
 
 <script lang="ts" setup>
 import { ref, computed } from 'vue';
-import { useRouter } from 'vue-router';
 
 import useLoading from '@/hooks/loading';
 import { Message } from '@arco-design/web-vue';
 import { FormInstance } from '@arco-design/web-vue/es/form';
 import {
     UpdateConfigModel, updateConfig,
-    getConfig, UpdateConfigRes
+    getConfig
 } from '@/api/taobao';
-import { useUserStore } from '@/store';
 import RegularTester from './components/regular-tester.vue';
 
-const userStore = useUserStore();
-const userInfo = computed(() => {
-    return {
-        name: userStore.name,
-    };
-});
-console.log(userInfo.value)
-
 const { loading, setLoading } = useLoading(true);
 
-const router = useRouter();
-
 const formRef = ref<FormInstance>();
 const formData = ref<UpdateConfigModel>({
     cookie: '',
@@ -357,10 +348,41 @@ const formData = ref<UpdateConfigModel>({
     ks_blacklist_regular: '',
     ksTestToken: '',
     ks_limit_per_oaid_24h: 0,
-    webook_xhs_zlong: 0
+    webook_forward_zlong: 'xhs,ks'
 
 });
 
+const defaultForwardChannels = ['xhs', 'ks'];
+const normalizeForwardChannels = (value?: string | string[]) => {
+    const list = Array.isArray(value)
+        ? value
+        : String(value || '')
+            .split(',')
+            .map((item) => item.trim())
+            .filter(Boolean);
+
+    const normalized = Array.from(
+        new Set(
+            list
+                .map((item) => item.toLowerCase())
+                .filter((item) => defaultForwardChannels.includes(item))
+        )
+    );
+
+    return normalized;
+};
+const buildForwardChannelValue = (value?: string | string[]) => {
+    return normalizeForwardChannels(value).join(',');
+};
+const forwardChannelsModel = computed<string[]>({
+    get() {
+        return normalizeForwardChannels(formData.value.webook_forward_zlong);
+    },
+    set(value) {
+        formData.value.webook_forward_zlong = buildForwardChannelValue(value);
+    },
+});
+
 const showRegularTester = ref<boolean>(false);
 const RegularTesterPattern = ref<string>('');
 
@@ -371,10 +393,6 @@ const clickRegularTester = (pattern: string) => {
     RegularTesterPattern.value = pattern
 };
 
-const goXhsZlongReport = () => {
-    router.push({ name: 'xhsZlongReport' });
-};
-
 const validate = async () => {
     const res = await formRef.value?.validate();
     if (!res) {
@@ -410,6 +428,9 @@ const reset = async () => {
         config.tk_whitelist_regular = restoreJson(config.tk_whitelist_regular)
         config.tk_blacklist_regular = restoreJson(config.tk_blacklist_regular)
         config.multi_token_regular = restoreJson(config.multi_token_regular)
+        config.webook_forward_zlong = buildForwardChannelValue(
+            config.webook_forward_zlong || (config as any).webook_xhs_zlong || defaultForwardChannels
+        )
         formData.value = config
     }
     setLoading(false);

+ 64 - 1
src/views/settings/xhsZlongReport.vue

@@ -69,6 +69,16 @@
                     <a-form :model="formModel" :label-col-props="{ span: 6 }" :wrapper-col-props="{ span: 18 }"
                         label-align="left">
                         <a-row :gutter="16">
+                            <a-col :span="6">
+                                <a-form-item field="channels" label="渠道">
+                                    <a-select v-model="formModel.channels" multiple allow-clear placeholder="全部渠道"
+                                        @change="search">
+                                        <a-option v-for="item in channelOptions" :key="item.value" :value="item.value">
+                                            {{ item.label }}
+                                        </a-option>
+                                    </a-select>
+                                </a-form-item>
+                            </a-col>
                             <a-col :span="6">
                                 <a-form-item field="bucket_type" label="统计粒度">
                                     <a-select v-model="formModel.bucket_type" @change="search">
@@ -130,6 +140,11 @@
             <a-table row-key="redis_key" :loading="loading" :pagination="pagination" :columns="columns"
                 :data="renderData" :bordered="{ headerCell: true }" size="small" @page-change="onPageChange"
                 @page-size-change="onPageSizeChange">
+                <template #channel="{ record }">
+                    <a-tag :color="channelColorMap[record.channel] || 'gray'">
+                        {{ channelLabelMap[record.channel] || record.channel }}
+                    </a-tag>
+                </template>
                 <template #bucket_type="{ record }">
                     <a-tag :color="bucketColorMap[record.bucket_type] || 'gray'">
                         {{ bucketLabelMap[record.bucket_type] || record.bucket_type }}
@@ -172,6 +187,19 @@ const bucketColorMap: Record<string, string> = {
     month: 'orange',
     year: 'purple',
 };
+const defaultChannels = ['xhs', 'ks'];
+const channelOptions = [
+    { label: '小红书', value: 'xhs' },
+    { label: '快手', value: 'ks' },
+];
+const channelLabelMap: Record<string, string> = {
+    xhs: '小红书',
+    ks: '快手',
+};
+const channelColorMap: Record<string, string> = {
+    xhs: 'red',
+    ks: 'blue',
+};
 
 const { loading, setLoading } = useLoading(false);
 const renderData = ref<XhsZlongForwardReportRecord[]>([]);
@@ -188,6 +216,7 @@ const summary = ref<XhsZlongForwardReportSummary>({
 });
 
 const formModel = reactive({
+    channels: [...defaultChannels],
     bucket_type: 'day',
 });
 
@@ -209,13 +238,41 @@ const pagination = reactive({
 });
 
 const toNumber = (value: unknown) => Number(value || 0);
+const normalizeChannels = (channels?: string[]) => {
+    const list = (channels || [])
+        .map((item) => String(item || '').trim().toLowerCase())
+        .filter((item) => defaultChannels.includes(item));
+
+    return list.length > 0 ? Array.from(new Set(list)) : [...defaultChannels];
+};
+const buildChannelsValue = (channels?: string[]) => normalizeChannels(channels).join(',');
 const normalizeRecord = (item: XhsZlongForwardReportRecord): XhsZlongForwardReportRecord => ({
     ...item,
+    channel: String(item.channel || '').toLowerCase(),
     total: toNumber(item.total),
     exception_count: toNumber(item.exception_count),
 });
 const sortedChartData = computed(() => {
-    return [...chartData.value].sort((left, right) => {
+    const grouped = new Map<string, XhsZlongForwardReportRecord>();
+
+    chartData.value.forEach((item) => {
+        const key = String(item.report_time || item.display_time || '');
+        const current = grouped.get(key);
+
+        if (current) {
+            current.total += toNumber(item.total);
+            current.exception_count += toNumber(item.exception_count);
+            return;
+        }
+
+        grouped.set(key, {
+            ...item,
+            total: toNumber(item.total),
+            exception_count: toNumber(item.exception_count),
+        });
+    });
+
+    return Array.from(grouped.values()).sort((left, right) => {
         return new Date(left.report_time).getTime() - new Date(right.report_time).getTime();
     });
 });
@@ -316,6 +373,11 @@ const { chartOption } = useChartOption(() => ({
 }));
 
 const columns = computed<TableColumnData[]>(() => [
+    {
+        title: '渠道',
+        slotName: 'channel',
+        width: 110,
+    },
     {
         title: '统计粒度',
         slotName: 'bucket_type',
@@ -342,6 +404,7 @@ const buildParams = (current = 1, pageSize = pagination.pageSize): XhsZlongForwa
     return {
         current,
         pageSize,
+        channels: buildChannelsValue(formModel.channels),
         bucket_type: formModel.bucket_type,
         start: dateRange.value?.[0] || undefined,
         end: dateRange.value?.[1] || undefined,