Selaa lähdekoodia

ci: vip 筛选

Pius-X 1 vuosi sitten
vanhempi
commit
47a05da4e8

+ 5 - 0
src/lang/options.ts

@@ -75,6 +75,11 @@ export const UserTypeOptions: options = [
   { value: 2, label: "FB" }
 ];
 
+export const VIPTypeOptions: options = [
+  { value: 0, label: "游客" },
+  { value: 1, label: "FB" }
+];
+
 export const StopServerStatusOptions: options = [
   { value: 1, label: "不停服,任何人能进" },
   { value: 2, label: "停服,任何人不能进" },

+ 18 - 0
src/views/waiterCenter/types.d.ts

@@ -24,6 +24,24 @@ export type VipInfo = {
   k_nick: string;
 };
 
+export type VipSearchInfo = {
+  uid: number;
+  ask_limit_range: [number, number];
+  last_ask_ts_range: [];
+  statuses: [];
+  ask_ss_ts_range: [];
+  content: string;
+  country: string;
+  langs: [];
+  fb_nick: string;
+  email: string;
+  isFbs: [];
+  last_login_time_range: [];
+  payed_range: [number, number];
+  last_pay_time_range: [];
+  kids: [];
+};
+
 export type WaiterLog = {
   id: number;
   uid: number;

+ 176 - 41
src/views/waiterCenter/vipUsers/subview/userList.vue

@@ -39,27 +39,6 @@
     </el-table-column>
     <el-table-column align="center" label="邮箱" prop="email" width="180" />
     <el-table-column align="center" label="邀请状态" width="140">
-      <template #header>
-        <span>邀请状态</span>
-        <el-popover placement="bottom" trigger="click" width="auto">
-          <template #reference>
-            <el-icon class="cursor-pointer" style="margin-left: 5px">
-              <EpFilter />
-            </el-icon>
-          </template>
-          <div>
-            <el-row align="bottom" justify="space-between" style="margin-top: 10px">
-              <ul style="width: max-content">
-                <li class="cursor-pointer" @click="filterStatus(-1)">全部</li>
-                <li v-for="(val, key) in inviteStatusMap" :key="key" class="cursor-pointer" @click="filterStatus(key)">
-                  {{ val }}
-                </li>
-              </ul>
-            </el-row>
-          </div>
-        </el-popover>
-      </template>
-
       <template #default="{ row }">
         <el-tag v-if="row.status === 0" type="info">待邀请</el-tag>
         <el-tag v-else-if="row.status === 1">已邀请待激活</el-tag>
@@ -79,16 +58,12 @@
     <el-table-column :formatter="formatData" align="center" label="激活时间" prop="ask_ss_ts" width="180" />
     <el-table-column :fixed="'right'" align="center" label="操作" width="160">
       <template #header>
-        <el-tooltip content="输入玩家UID或游戏昵称,游戏昵称可进行模糊搜索" placement="top-start">
-          <el-input
-            v-model="searchCondition"
-            :loading="loading"
-            :prefix-icon="loading ? EpLoading : EpSearch"
-            clearable
-            placeholder="搜索"
-            @keydown.enter="getViperList"
-          />
-        </el-tooltip>
+        <el-button-group size="small">
+          <el-button :icon="loading ? EpLoading : EpSearch" :loading="loading" type="primary" @click="searchDrawerShow = true"
+            >筛选</el-button
+          >
+          <el-button :icon="loading ? EpLoading : EpRefresh" :loading="loading" type="success" @click="handleReset">重置</el-button>
+        </el-button-group>
       </template>
 
       <template #default="{ row }">
@@ -214,6 +189,141 @@
     </template>
   </el-dialog>
 
+  <el-drawer v-model="searchDrawerShow" size="40%">
+    <template #header>
+      <h4><b>筛选条件选择</b></h4>
+      <el-button style="margin-right: 10px" type="primary" @click="handleSearch">搜索</el-button>
+    </template>
+    <el-form :model="searchInfo" label-width="160px">
+      <el-form-item label="玩家UID">
+        <el-input v-model="searchInfo.uid" :type="'number'" clearable placeholder="精确查找, 输入完整UID" style="width: 80%" />
+      </el-form-item>
+      <el-form-item label="游戏昵称">
+        <el-input v-model="searchInfo.fb_nick" clearable placeholder="可模糊查找, 可输入部分游戏昵称" style="width: 80%" />
+      </el-form-item>
+      <el-form-item label="账号类型">
+        <el-select v-model="searchInfo.isFbs" clearable multiple placeholder="选择账号类型,可多选" style="width: 80%">
+          <el-option v-for="item in VIPTypeOptions" :key="item.value" :label="item.label" :value="item.value" />
+        </el-select>
+      </el-form-item>
+      <el-form-item label="邮箱">
+        <el-input v-model="searchInfo.email" clearable placeholder="可模糊查找, 可输入部分邮箱" style="width: 80%" />
+      </el-form-item>
+      <el-form-item label="邀请状态">
+        <el-select v-model="searchInfo.statuses" clearable multiple placeholder="选择邀请状态,可多选" style="width: 80%">
+          <el-option v-for="(label, key) in inviteStatusMap" :key="key" :label="label" :value="key" />
+        </el-select>
+      </el-form-item>
+      <el-form-item label="备注">
+        <el-input v-model="searchInfo.content" clearable placeholder="可模糊查找, 可输入部分备注" style="width: 80%" />
+      </el-form-item>
+      <el-form-item label="客服昵称">
+        <el-select v-model="searchInfo.kids" clearable filterable multiple placeholder="选择客服昵称,可多选" style="width: 80%">
+          <el-option v-for="(item, key) in waiters" :key="key" :label="item.label" :value="item.value" />
+        </el-select>
+      </el-form-item>
+      <el-form-item label="国家">
+        <el-input v-model="searchInfo.country" clearable placeholder="可模糊查找, 可输入部分国家" style="width: 80%" />
+      </el-form-item>
+      <el-form-item label="语言">
+        <el-select v-model="searchInfo.langs" clearable filterable multiple placeholder="选择语言,可多选" style="width: 80%">
+          <el-option v-for="(item, key) in langUpper" :key="key" :label="item" :value="item" />
+        </el-select>
+      </el-form-item>
+      <el-form-item label="最后登录时间范围" style="width: 80%">
+        <el-date-picker
+          v-model="searchInfo.last_login_time_range"
+          end-placeholder="结束时间"
+          range-separator="To"
+          start-placeholder="开始时间"
+          type="datetimerange"
+          value-format="x"
+        />
+      </el-form-item>
+
+      <el-form-item label="支付金额范围">
+        <el-row>
+          <el-form-item>
+            <el-input
+              v-model="searchInfo.payed_range[0]"
+              :type="'number'"
+              clearable
+              placeholder="输入最小支付金额(包含)"
+              style="width: 200px"
+            />
+          </el-form-item>
+          <span>&nbsp;To&nbsp;</span>
+          <el-form-item>
+            <el-input
+              v-model="searchInfo.payed_range[1]"
+              :type="'number'"
+              clearable
+              placeholder="输入最大支付金额(包含)"
+              style="width: 200px"
+            />
+          </el-form-item>
+          <el-tag>只支持页内搜索</el-tag>
+        </el-row>
+      </el-form-item>
+      <el-form-item label="最后支付时间范围" style="width: 80%">
+        <el-date-picker
+          v-model="searchInfo.last_pay_time_range"
+          end-placeholder="结束时间"
+          range-separator="To"
+          start-placeholder="开始时间"
+          style="width: 440px"
+          type="datetimerange"
+          value-format="x"
+        />
+        <el-tag style="margin-left: 5px">只支持页内搜索</el-tag>
+      </el-form-item>
+      <el-form-item label="邀请次数范围">
+        <el-row>
+          <el-form-item>
+            <el-input
+              v-model="searchInfo.ask_limit_range[0]"
+              :type="'number'"
+              clearable
+              placeholder="输入最小邀请次数(包含)"
+              style="width: 200px"
+            />
+          </el-form-item>
+          <span>&nbsp;To&nbsp;</span>
+          <el-form-item>
+            <el-input
+              v-model="searchInfo.ask_limit_range[1]"
+              :type="'number'"
+              clearable
+              placeholder="输入最大邀请次数(包含)"
+              style="width: 200px"
+            />
+          </el-form-item>
+        </el-row>
+      </el-form-item>
+
+      <el-form-item label="最后邀请时间范围" style="width: 80%">
+        <el-date-picker
+          v-model="searchInfo.last_ask_ts_range"
+          end-placeholder="结束时间"
+          range-separator="To"
+          start-placeholder="开始时间"
+          type="datetimerange"
+          value-format="x"
+        />
+      </el-form-item>
+      <el-form-item label="激活时间范围" style="width: 80%">
+        <el-date-picker
+          v-model="searchInfo.ask_ss_ts_range"
+          end-placeholder="结束时间"
+          range-separator="To"
+          start-placeholder="开始时间"
+          type="datetimerange"
+          value-format="x"
+        />
+      </el-form-item>
+    </el-form>
+  </el-drawer>
+
   <ant-prize-set v-model="prizeData" v-model:visible="prizeDialogVisible" :type="'func'" />
 </template>
 
@@ -226,23 +336,22 @@ import EpCircleCheck from "~icons/ep/circle-check";
 import EpCircleClose from "~icons/ep/circle-close";
 import EpMessage from "~icons/ep/message";
 import EpPhone from "~icons/ep/phone";
-import EpFilter from "~icons/ep/filter";
 import { useUserStore } from "@/store/modules/user";
 import EpLoading from "~icons/ep/loading";
 import EpSearch from "~icons/ep/search";
-import { VipInfo, VipWaiterConf } from "@/views/waiterCenter/types";
+import EpRefresh from "~icons/ep/refresh";
+import { VipInfo, VipSearchInfo, VipWaiterConf } from "@/views/waiterCenter/types";
 import { langUpper } from "@/lang/config";
 import { ElTable, FormInstance, FormRules } from "element-plus";
 import { showMessage } from "@/utils/message";
 import dayjs from "dayjs";
 import { Pagination } from "@/components/types";
+import { VIPTypeOptions } from "@/lang/options";
 
 const admin = useUserStore().getUserInfo();
 
 const pagination = $ref<Pagination>({});
 
-const searchCondition = $ref("");
-let searchStatus = $ref(-1);
 let userList: VipInfo[] = $ref([]); // 用户信息
 let waiters: options = $ref([]); // 客服列表
 let mailList = $ref([]); // 邮件列表
@@ -301,6 +410,37 @@ const handleSave = () => {
   });
 };
 
+const defaultSearchInfo: VipSearchInfo = {
+  uid: null,
+  ask_limit_range: [null, null],
+  last_ask_ts_range: null,
+  statuses: [],
+  ask_ss_ts_range: null,
+  content: null,
+  country: null,
+  langs: [],
+  fb_nick: null,
+  email: null,
+  isFbs: [],
+  last_login_time_range: [],
+  payed_range: [null, null],
+  last_pay_time_range: [],
+  kids: []
+};
+
+let searchInfo: VipSearchInfo = $ref(JSON.parse(JSON.stringify(defaultSearchInfo)));
+let searchDrawerShow = $ref(false);
+const handleSearch = () => {
+  searchDrawerShow = false;
+  getViperList();
+};
+
+const handleReset = () => {
+  searchDrawerShow = false;
+  searchInfo = JSON.parse(JSON.stringify(defaultSearchInfo));
+  getViperList();
+};
+
 let emailDialogShow = $ref(false);
 const defaultEmailConf = { uids: [], msgId: "", rewards: [] };
 let sendMsgConf = $ref(defaultEmailConf);
@@ -461,15 +601,10 @@ onMounted(() => {
   initData();
 });
 
-const filterStatus = status => {
-  searchStatus = status;
-  getViperList();
-};
-
 const getViperList = () => {
   loading = true;
   const { currentPage: page, pageSize } = pagination;
-  const params = { page, pageSize, aid: admin.id, gid: admin.gid, keyword: searchCondition, status: searchStatus };
+  const params = { page, pageSize, aid: admin.id, gid: admin.gid, keyword: JSON.stringify(searchInfo) };
   http.get("waiter/vips", params).then((data: HttpResponse) => {
     loading = false;
     if (data.code === 0) {