Эх сурвалжийг харах

feat:sim卡管理增加过滤功能,调优界面显示

Jerry Liang 3 сар өмнө
parent
commit
a4852405ad

+ 6 - 1
service/controllers/simCardManageControllers.go

@@ -37,8 +37,13 @@ func GetSimCardBatchInfo(c *fiber.Ctx) error {
 	if status != "" {
 		statusPtr = &status
 	}
+	platform := c.Query("platform", "")
+	var platformPtr *string
+	if platform != "" {
+		platformPtr = &platform
+	}
 
-	date, err := services.GetSimCardBatchInfo(uint(page), uint(size), search, statusPtr)
+	date, err := services.GetSimCardBatchInfo(uint(page), uint(size), search, statusPtr, platformPtr)
 	if err != nil {
 		return Error(c, "Get SIM card info failed.")
 	}

+ 17 - 9
service/domain/simCardDomain.go

@@ -16,16 +16,24 @@ const (
 	SimStatusRetired      SimCardStatus = "RETIRED"       // 失效
 )
 
+type SimCardPlatform string
+
+const (
+	SimPlatformSmartHub    SimCardPlatform = "SmartHub"
+	SimPlatformAcceleronix SimCardPlatform = "Acceleronix"
+)
+
 type SimCardInfo struct {
-	GICCID         string        `bson:"_id" json:"giccid"`                    // 只取前19位不取检验码
-	IMEI           string        `bson:"imei" json:"imei"`                     // 国际移动用户识别码
-	IMSI           string        `bson:"imsi" json:"imsi"`                     // 国际移动用户识别码
-	MSISDN         string        `bson:"msisdn" json:"msisdn"`                 // 移动用户号码
-	Status         SimCardStatus `bson:"status" json:"status"`                 // 卡状态
-	ExpirationTime string        `bson:"expirationTime" json:"expirationTime"` // 到期时间(后付费卡没有到期时间) 格式:yyyy-MM-dd
-	Month          string        `bson:"month" json:"month"`                   // 统计月份 格式:yyyy-MM
-	AllDataUsage   float64       `bson:"allDataUsage" json:"allDataUsage"`     // 月数据用量(KB)
-	UpdateTime     time.Time     `bson:"updateTime" json:"updateTime"`         // UTC时间
+	GICCID         string          `bson:"_id" json:"giccid"`                    // 只取前19位不取检验码
+	IMEI           string          `bson:"imei" json:"imei"`                     // 国际移动用户识别码
+	IMSI           string          `bson:"imsi" json:"imsi"`                     // 国际移动用户识别码
+	MSISDN         string          `bson:"msisdn" json:"msisdn"`                 // 移动用户号码
+	Status         SimCardStatus   `bson:"status" json:"status"`                 // 卡状态
+	Platform       SimCardPlatform `bson:"platform" json:"platform"`             // 数据来源平台: SmartHub / Acceleronix
+	ExpirationTime string          `bson:"expirationTime" json:"expirationTime"` // 到期时间(后付费卡没有到期时间) 格式:yyyy-MM-dd
+	Month          string          `bson:"month" json:"month"`                   // 统计月份 格式:yyyy-MM
+	AllDataUsage   float64         `bson:"allDataUsage" json:"allDataUsage"`     // 月数据用量(KB)
+	UpdateTime     time.Time       `bson:"updateTime" json:"updateTime"`         // UTC时间
 }
 
 type SimCardMonthlyData struct {

+ 13 - 10
service/dto/simCardDTO.go

@@ -15,15 +15,18 @@ type SimCardStatus = domain.SimCardStatus
 // 	SimStatusRetired      SimCardStatus = "RETIRED"       // 失效
 // )
 
+type SimCardPlatform = domain.SimCardPlatform
+
 type SimCardInfo struct {
-	GICCID         string        `json:"giccid"`         // 只取前19位不取检验码
-	SN             []string      `json:"sn"`             // 相关的SN列表
-	IMEI           string        `json:"imei"`           // 国际移动用户识别码
-	IMSI           string        `json:"imsi"`           // 国际移动用户识别码
-	MSISDN         string        `json:"msisdn"`         // 移动用户号码
-	Status         SimCardStatus `json:"status"`         // 卡状态
-	ExpirationTime string        `json:"expirationTime"` // 到期时间(后付费卡没有到期时间) 格式:yyyy-MM-dd
-	Month          string        `json:"month"`          // 统计月份 格式:yyyy-MM
-	AllDataUsage   float64       `json:"allDataUsage"`   // 月数据用量(KB)
-	UpdateTime     time.Time     `json:"updateTime"`     // UTC时间
+	GICCID         string          `json:"giccid"`         // 只取前19位不取检验码
+	SN             []string        `json:"sn"`             // 相关的SN列表
+	IMEI           string          `json:"imei"`           // 国际移动用户识别码
+	IMSI           string          `json:"imsi"`           // 国际移动用户识别码
+	MSISDN         string          `json:"msisdn"`         // 移动用户号码
+	Status         SimCardStatus   `json:"status"`         // 卡状态
+	Platform       SimCardPlatform `json:"platform"`       // 数据来源平台: SmartHub / Acceleronix
+	ExpirationTime string          `json:"expirationTime"` // 到期时间(后付费卡没有到期时间) 格式:yyyy-MM-dd
+	Month          string          `json:"month"`          // 统计月份 格式:yyyy-MM
+	AllDataUsage   float64         `json:"allDataUsage"`   // 月数据用量(KB)
+	UpdateTime     time.Time       `json:"updateTime"`     // UTC时间
 }

+ 18 - 4
service/repositories/mongo/simCardManageRepo.go

@@ -6,6 +6,7 @@ import (
 	"fwh-toolbox-server/database"
 	"fwh-toolbox-server/domain"
 	"fwh-toolbox-server/dto"
+	"strings"
 	"time"
 
 	"go.mongodb.org/mongo-driver/bson"
@@ -20,7 +21,7 @@ const (
 )
 
 // 查询SIM卡信息(批量)
-func GetSimCardBatchInfo(page, size uint, search string, status *string) (*dto.ResPage[domain.SimCardInfo], error) {
+func GetSimCardBatchInfo(page, size uint, search string, status *string, platform *string) (*dto.ResPage[domain.SimCardInfo], error) {
 	ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
 	defer cancel()
 
@@ -37,10 +38,23 @@ func GetSimCardBatchInfo(page, size uint, search string, status *string) (*dto.R
 		}
 	}
 
-	// 过滤状态
+	// 过滤状态(支持逗号分隔多值)
 	if status != nil {
-		filter["status"] = bson.M{
-			"$eq": *status,
+		parts := strings.Split(*status, ",")
+		if len(parts) == 1 {
+			filter["status"] = bson.M{"$eq": parts[0]}
+		} else {
+			filter["status"] = bson.M{"$in": parts}
+		}
+	}
+
+	// 过滤平台(支持逗号分隔多值)
+	if platform != nil {
+		parts := strings.Split(*platform, ",")
+		if len(parts) == 1 {
+			filter["platform"] = bson.M{"$eq": parts[0]}
+		} else {
+			filter["platform"] = bson.M{"$in": parts}
 		}
 	}
 

+ 3 - 2
service/services/simCardManageServices.go

@@ -9,8 +9,8 @@ import (
 )
 
 // 查询SIM卡信息(批量)
-func GetSimCardBatchInfo(page uint, size uint, search string, status *string) (*dto.ResPage[dto.SimCardInfo], error) {
-	infoList, err := repositories.GetSimCardBatchInfo(page, size, search, status)
+func GetSimCardBatchInfo(page uint, size uint, search string, status *string, platform *string) (*dto.ResPage[dto.SimCardInfo], error) {
+	infoList, err := repositories.GetSimCardBatchInfo(page, size, search, status, platform)
 	if err != nil {
 		zap.L().Error("repositories.GetSimCardBatchInfo failed.", zap.String("err", err.Error()), zap.Uint("page", page), zap.Uint("size", size), zap.String("search", search), zap.Any("status", status))
 		return nil, err
@@ -41,6 +41,7 @@ func GetSimCardBatchInfo(page uint, size uint, search string, status *string) (*
 			IMSI:           info.IMSI,
 			MSISDN:         info.MSISDN,
 			Status:         info.Status,
+			Platform:       info.Platform,
 			ExpirationTime: info.ExpirationTime,
 			Month:          info.Month,
 			AllDataUsage:   info.AllDataUsage,

+ 1 - 0
service/task/queue/simCardQueue/simCardTaskAcceleronix.go

@@ -66,6 +66,7 @@ func (processor *SimCardProcessor) acceleronixInfoToSimCardInfo(infoList []domai
 		}
 
 		simCardInfo.ExpirationTime = info.ExpirationTime // 到期时间(后付费卡没有到期时间) 格式:yyyy-MM-dd
+		simCardInfo.Platform = domain.SimPlatformAcceleronix // 数据来源平台
 
 		usageInfo := dataUsage[info.Iccid]
 		if usageInfo == nil {

+ 1 - 0
service/task/queue/simCardQueue/simCardTaskSmartHub.go

@@ -59,6 +59,7 @@ func (processor *SimCardProcessor) smartHubInfoToSimCardInfo(infoList []domain.S
 			break
 		}
 
+		simCardInfo.Platform = domain.SimPlatformSmartHub               // 数据来源平台
 		simCardInfo.ExpirationTime = ""                                // SmartHub没有有效期
 		simCardInfo.Month = time.Now().UTC().Format(time.DateOnly)[:7] // 统计月份 格式:yyyy-MM
 		simCardInfo.AllDataUsage = info.CurrentCycleUsages.DataUsage   // 月数据用量(KB)

+ 2 - 1
src/service/simCardManage/index.ts

@@ -16,9 +16,10 @@ export const getSimCardInfo = async (
   size: number,
   search: string,
   status: string | undefined,
+  platform: string | undefined,
 ): Promise<SimCardInfoPage> => {
   const url = API_List.simCardInfoList
-  const res = await http.get<SimCardInfoPage>(url, { params: { page, size, search, status } })
+  const res = await http.get<SimCardInfoPage>(url, { params: { page, size, search, status, platform } })
   return res
 }
 

+ 3 - 0
src/service/simCardManage/interface.ts

@@ -2,6 +2,8 @@ import type { ResPage } from '../interface'
 
 export type SimCardStatus = 'UNKNOWN' | 'NOT_ACTIVATED' | 'ACTIVATED' | 'DEACTIVATED' | 'RETIRED'
 
+export type SimCardPlatform = 'SmartHub' | 'Acceleronix' | ''
+
 export interface SimCardInfo {
   giccid: string // 只取前19位不取检验码
   sn: string[] // 关联的SN列表
@@ -9,6 +11,7 @@ export interface SimCardInfo {
   imsi: string // 国际移动用户识别码
   msisdn: string // 移动用户号码
   status: string // 卡状态
+  platform: SimCardPlatform // 数据来源平台: SmartHub / Acceleronix
   expirationTime: string // 到期时间(后付费卡没有到期时间) 格式:yyyy-MM-dd
   month: string // 统计月份 格式:yyyy-MM
   allDataUsage: number // 月数据用量(KB)

+ 44 - 13
src/views/sim-card-manage/index.vue

@@ -6,15 +6,26 @@
       content-class="h-full flex flex-col"
       :style="cardHeight"
     >
-      <div class="flex gap-2 h-6 items-center">
-        <!-- <div class="flex items-center"> -->
-        <NForm inline label-placement="left" label-width="auto" :show-feedback="false">
+      <div class="flex gap-2 min-h-6 items-center">
+        <NForm inline label-placement="left" label-width="auto" :show-feedback="false" class="flex-1 flex-wrap">
           <NFormItem label="Status">
             <NSelect
               v-model:value="selectStatus"
               class="w-180px"
               :options="optionsStatus"
+              multiple
               clearable
+              :max-tag-count="2"
+            />
+          </NFormItem>
+          <NFormItem label="Platform">
+            <NSelect
+              v-model:value="selectPlatform"
+              class="w-160px"
+              :options="optionsPlatform"
+              multiple
+              clearable
+              :max-tag-count="1"
             />
           </NFormItem>
           <NFormItem label="GICCID">
@@ -27,13 +38,14 @@
               size="small"
             />
           </NFormItem>
+          <NFormItem>
+            <NButton text :focusable="false" style="font-size: 18px" @click="clickSearch">
+              <span class="i-mdi:search" />
+            </NButton>
+          </NFormItem>
         </NForm>
-        <NButton text :focusable="false" style="font-size: 18px" @click="clickSearch">
-          <span class="i-mdi:search" />
-        </NButton>
-        <!-- </div> -->
         <NButton
-          class="ml-auto"
+          class="shrink-0"
           text
           :focusable="false"
           style="font-size: 18px"
@@ -98,6 +110,7 @@ import { getSimCardInfo, getSimCardMonthlyData } from '@/service/simCardManage'
 import type {
   SimCardInfo,
   SimCardMonthlyData,
+  SimCardPlatform,
   SimCardStatus,
 } from '@/service/simCardManage/interface'
 import SimCardDataView from './component/simCardDataView.vue'
@@ -272,9 +285,17 @@ function createColumns(): DataTableColumns<SimCardInfo> {
       width: 150,
     },
     {
-      title: 'Usage',
+      title: 'Platform',
+      key: 'platform',
+      width: 120,
+    },
+    {
+      title: 'Usage (MB)',
       key: 'allDataUsage',
       minWidth: 100,
+      render(rowData) {
+        return (rowData.allDataUsage / 1024).toFixed(2)
+      },
     },
     {
       title: 'UpdateTime',
@@ -284,7 +305,7 @@ function createColumns(): DataTableColumns<SimCardInfo> {
   ]
 }
 
-const selectStatus = ref<SimCardStatus | undefined>()
+const selectStatus = ref<SimCardStatus[]>([])
 const optionsStatus: SelectOption[] = [
   { label: 'UNKNOWN', value: 'UNKNOWN' },
   { label: 'NOT_ACTIVATED', value: 'NOT_ACTIVATED' },
@@ -293,8 +314,14 @@ const optionsStatus: SelectOption[] = [
   { label: 'RETIRED', value: 'RETIRED' },
 ]
 
+const selectPlatform = ref<SimCardPlatform[]>([])
+const optionsPlatform: SelectOption[] = [
+  { label: 'SmartHub', value: 'SmartHub' },
+  { label: 'Acceleronix', value: 'Acceleronix' },
+]
+
 const tableData = ref<SimCardInfo[]>([])
-const dataTableMaxWidth = ref<number | undefined>(undefined)
+const dataTableMaxWidth = ref<number | undefined>(1120)
 const tableColumns = computed<DataTableColumns<SimCardInfo>>(createColumns)
 const tablePagination = reactive<PaginationProps>({
   simple: false,
@@ -338,8 +365,9 @@ const querySimCardInfoList = async (
   pageNum: number,
   search: string,
   status: string | undefined,
+  platform: string | undefined,
 ) => {
-  const responseList = await getSimCardInfo(pageNum, pageSize, search, status)
+  const responseList = await getSimCardInfo(pageNum, pageSize, search, status, platform)
   if (responseList.data != null) {
     tableData.value = responseList.data
   } else {
@@ -352,7 +380,10 @@ const handleListQuery = async () => {
   const pageSize = tablePagination.pageSize ?? 10
   const pageNum = tablePagination.page ?? 1
 
-  await querySimCardInfoList(pageSize, pageNum, searchKeyword.value, selectStatus.value)
+  const status = selectStatus.value.length > 0 ? selectStatus.value.join(',') : undefined
+  const platform = selectPlatform.value.length > 0 ? selectPlatform.value.join(',') : undefined
+
+  await querySimCardInfoList(pageSize, pageNum, searchKeyword.value, status, platform)
 }
 
 onMounted(async () => {