lty/qy-lty-admin/lib/api/affinity.ts
2026-03-17 13:17:02 +08:00

307 lines
8.4 KiB
TypeScript

import type { AffinityRule, AffinityLevel } from "./types"
import { mockResponse, type PaginatedResponse, type PaginationParams } from "./client"
// 模拟好感度规则数据
const mockAffinityRules: AffinityRule[] = [
{
id: "AFR001",
name: "每日登录",
description: "用户每日登录系统可获得好感度",
points: 10,
type: "日常活动",
status: "已启用",
},
{
id: "AFR002",
name: "赠送礼物",
description: "用户赠送礼物可获得好感度",
points: 20,
type: "互动活动",
status: "已启用",
},
{
id: "AFR003",
name: "完成任务",
description: "用户完成指定任务可获得好感度",
points: 15,
type: "任务活动",
status: "已启用",
},
{
id: "AFR004",
name: "参与活动",
description: "用户参与系统活动可获得好感度",
points: 30,
type: "特殊活动",
status: "已启用",
},
{
id: "AFR005",
name: "购买道具",
description: "用户购买道具可获得好感度",
points: 25,
type: "消费活动",
status: "未启用",
},
]
// 模拟好感度等级数据
const mockAffinityLevels: AffinityLevel[] = [
{
id: "AFL001",
level: 1,
name: "初识",
pointsRequired: 0,
rewards: ["基础表情包", "基础头像框"],
description: "刚刚认识洛天依,开始了解她的世界。",
},
{
id: "AFL002",
level: 2,
name: "相识",
pointsRequired: 100,
rewards: ["语音问候", "特殊表情包"],
description: "与洛天依有了初步的交流,开始建立友谊。",
},
{
id: "AFL003",
level: 3,
name: "熟悉",
pointsRequired: 300,
rewards: ["专属头像框", "房间装饰道具"],
description: "与洛天依建立了稳定的友谊,互相了解更多。",
},
{
id: "AFL004",
level: 4,
name: "亲密",
pointsRequired: 600,
rewards: ["专属服装", "专属互动动画"],
description: "与洛天依建立了深厚的友谊,成为了亲密的朋友。",
},
{
id: "AFL005",
level: 5,
name: "挚友",
pointsRequired: 1000,
rewards: ["限定服装", "专属歌曲", "特殊互动场景"],
description: "与洛天依建立了最亲密的关系,成为了无可替代的挚友。",
},
]
// 获取好感度规则列表
export const getAffinityRules = async (params?: PaginationParams): Promise<PaginatedResponse<AffinityRule>> => {
let filteredRules = [...mockAffinityRules]
// 搜索过滤
if (params?.search) {
const search = params.search.toLowerCase()
filteredRules = filteredRules.filter(
(rule) =>
rule.name.toLowerCase().includes(search) ||
rule.description.toLowerCase().includes(search) ||
rule.type.toLowerCase().includes(search),
)
}
// 排序
if (params?.sortBy) {
filteredRules.sort((a: any, b: any) => {
const aValue = a[params.sortBy!]
const bValue = b[params.sortBy!]
if (typeof aValue === "string" && typeof bValue === "string") {
return params.sortOrder === "desc" ? bValue.localeCompare(aValue) : aValue.localeCompare(bValue)
}
return params.sortOrder === "desc" ? bValue - aValue : aValue - bValue
})
}
// 分页
const page = params?.page || 1
const pageSize = params?.pageSize || 10
const startIndex = (page - 1) * pageSize
const paginatedRules = filteredRules.slice(startIndex, startIndex + pageSize)
return mockResponse({
items: paginatedRules,
total: filteredRules.length,
page,
pageSize,
totalPages: Math.ceil(filteredRules.length / pageSize),
})
}
// 获取单个好感度规则
export const getAffinityRule = async (id: string): Promise<AffinityRule> => {
const rule = mockAffinityRules.find((rule) => rule.id === id)
if (!rule) {
return mockResponse({} as AffinityRule, "好感度规则不存在")
}
return mockResponse(rule)
}
// 创建好感度规则
export const createAffinityRule = async (ruleData: Partial<AffinityRule>): Promise<AffinityRule> => {
// 生成新的好感度规则ID
const ruleId = "AFR" + String(mockAffinityRules.length + 1).padStart(3, "0")
const newRule: AffinityRule = {
id: ruleId,
name: ruleData.name || "",
description: ruleData.description || "",
points: ruleData.points || 0,
type: ruleData.type || "",
status: ruleData.status || "未启用",
}
mockAffinityRules.push(newRule)
return mockResponse(newRule)
}
// 更新好感度规则
export const updateAffinityRule = async (id: string, ruleData: Partial<AffinityRule>): Promise<AffinityRule> => {
const ruleIndex = mockAffinityRules.findIndex((rule) => rule.id === id)
if (ruleIndex === -1) {
return mockResponse({} as AffinityRule, "好感度规则不存在")
}
const updatedRule = {
...mockAffinityRules[ruleIndex],
...ruleData,
}
mockAffinityRules[ruleIndex] = updatedRule
return mockResponse(updatedRule)
}
// 删除好感度规则
export const deleteAffinityRule = async (id: string): Promise<boolean> => {
const ruleIndex = mockAffinityRules.findIndex((rule) => rule.id === id)
if (ruleIndex === -1) {
return mockResponse(false, "好感度规则不存在")
}
mockAffinityRules.splice(ruleIndex, 1)
return mockResponse(true)
}
// 获取好感度等级列表
export const getAffinityLevels = async (params?: PaginationParams): Promise<PaginatedResponse<AffinityLevel>> => {
let filteredLevels = [...mockAffinityLevels]
// 搜索过滤
if (params?.search) {
const search = params.search.toLowerCase()
filteredLevels = filteredLevels.filter(
(level) => level.name.toLowerCase().includes(search) || level.description.toLowerCase().includes(search),
)
}
// 排序
if (params?.sortBy) {
filteredLevels.sort((a: any, b: any) => {
const aValue = a[params.sortBy!]
const bValue = b[params.sortBy!]
if (typeof aValue === "string" && typeof bValue === "string") {
return params.sortOrder === "desc" ? bValue.localeCompare(aValue) : aValue.localeCompare(bValue)
}
return params.sortOrder === "desc" ? bValue - aValue : aValue - bValue
})
} else {
// 默认按等级排序
filteredLevels.sort((a, b) => a.level - b.level)
}
// 分页
const page = params?.page || 1
const pageSize = params?.pageSize || 10
const startIndex = (page - 1) * pageSize
const paginatedLevels = filteredLevels.slice(startIndex, startIndex + pageSize)
return mockResponse({
items: paginatedLevels,
total: filteredLevels.length,
page,
pageSize,
totalPages: Math.ceil(filteredLevels.length / pageSize),
})
}
// 获取单个好感度等级
export const getAffinityLevel = async (id: string): Promise<AffinityLevel> => {
const level = mockAffinityLevels.find((level) => level.id === id)
if (!level) {
return mockResponse({} as AffinityLevel, "好感度等级不存在")
}
return mockResponse(level)
}
// 创建好感度等级
export const createAffinityLevel = async (levelData: Partial<AffinityLevel>): Promise<AffinityLevel> => {
// 生成新的好感度等级ID
const levelId = "AFL" + String(mockAffinityLevels.length + 1).padStart(3, "0")
const newLevel: AffinityLevel = {
id: levelId,
level: levelData.level || mockAffinityLevels.length + 1,
name: levelData.name || "",
pointsRequired: levelData.pointsRequired || 0,
rewards: levelData.rewards || [],
description: levelData.description || "",
}
mockAffinityLevels.push(newLevel)
// 按等级排序
mockAffinityLevels.sort((a, b) => a.level - b.level)
return mockResponse(newLevel)
}
// 更新好感度等级
export const updateAffinityLevel = async (id: string, levelData: Partial<AffinityLevel>): Promise<AffinityLevel> => {
const levelIndex = mockAffinityLevels.findIndex((level) => level.id === id)
if (levelIndex === -1) {
return mockResponse({} as AffinityLevel, "好感度等级不存在")
}
const updatedLevel = {
...mockAffinityLevels[levelIndex],
...levelData,
}
mockAffinityLevels[levelIndex] = updatedLevel
// 按等级排序
mockAffinityLevels.sort((a, b) => a.level - b.level)
return mockResponse(updatedLevel)
}
// 删除好感度等级
export const deleteAffinityLevel = async (id: string): Promise<boolean> => {
const levelIndex = mockAffinityLevels.findIndex((level) => level.id === id)
if (levelIndex === -1) {
return mockResponse(false, "好感度等级不存在")
}
mockAffinityLevels.splice(levelIndex, 1)
return mockResponse(true)
}