Добавлен новый компонент для компактного выбора кампаний в AdvertisingTab, обновлены интерфейсы для типизации данных API. Реализован GraphQL запрос для получения списка кампаний Wildberries. Оптимизирована логика отображения статистики кампаний и добавлены новые поля для обработки данных. Обновлены резолверы и типы для поддержки новых данных.

This commit is contained in:
Bivekich
2025-07-28 13:19:27 +03:00
parent 17c929b507
commit 6fbb570282
4 changed files with 966 additions and 257 deletions

View File

@ -712,7 +712,10 @@ export const GET_WILDBERRIES_CAMPAIGN_STATS = gql`
cr
shks
sum_price
dates
interval {
begin
end
}
days {
date
views
@ -725,25 +728,65 @@ export const GET_WILDBERRIES_CAMPAIGN_STATS = gql`
cr
shks
sum_price
apps {
views
clicks
ctr
cpc
sum
atbs
orders
cr
shks
sum_price
appType
nm {
views
clicks
ctr
cpc
sum
atbs
orders
cr
shks
sum_price
name
nmId
}
}
}
boosterStats {
date
views
clicks
ctr
cpc
sum
atbs
orders
cr
shks
sum_price
nm
avg_position
}
}
}
}
`
export const GET_WILDBERRIES_CAMPAIGNS_LIST = gql`
query GetWildberriesCampaignsList {
getWildberriesCampaignsList {
success
message
data {
adverts {
type
status
count
advert_list {
advertId
changeTime
}
}
all
}
}
}
`
// Админ запросы
export const ADMIN_ME = gql`
query AdminMe {

View File

@ -5836,6 +5836,73 @@ const wildberriesQueries = {
};
}
},
getWildberriesCampaignsList: async (
_: unknown,
__: unknown,
context: Context
) => {
if (!context.user) {
throw new GraphQLError("Требуется авторизация", {
extensions: { code: "UNAUTHENTICATED" },
});
}
try {
// Получаем организацию пользователя и её WB API ключ
const user = await prisma.user.findUnique({
where: { id: context.user.id },
include: {
organization: {
include: {
apiKeys: true,
},
},
},
});
if (!user?.organization) {
throw new GraphQLError("Организация не найдена");
}
if (user.organization.type !== "SELLER") {
throw new GraphQLError("Доступно только для продавцов");
}
const wbApiKeyRecord = user.organization.apiKeys?.find(
(key) => key.marketplace === "WILDBERRIES" && key.isActive
);
if (!wbApiKeyRecord) {
throw new GraphQLError("WB API ключ не настроен");
}
// Создаем экземпляр сервиса
const wbService = new WildberriesService(wbApiKeyRecord.apiKey);
// Получаем список кампаний
const campaignsList = await wbService.getCampaignsList();
return {
success: true,
data: campaignsList,
message: null,
};
} catch (error) {
console.error("Error fetching WB campaigns list:", error);
return {
success: false,
message:
error instanceof Error
? error.message
: "Ошибка получения списка кампаний",
data: {
adverts: [],
all: 0,
},
};
}
},
};
// Добавляем админ запросы и мутации к основным резолверам

View File

@ -102,6 +102,9 @@ export const typeDefs = gql`
getWildberriesCampaignStats(
input: WildberriesCampaignStatsInput!
): WildberriesCampaignStatsResponse!
# Список кампаний Wildberries
getWildberriesCampaignsList: WildberriesCampaignsListResponse!
}
type Mutation {
@ -1057,9 +1060,14 @@ export const typeDefs = gql`
cr: Float!
shks: Int!
sum_price: Float!
dates: [String!]!
interval: WildberriesCampaignInterval
days: [WildberriesCampaignDayStats!]!
boosterStats: [WildberriesCampaignDayStats!]!
boosterStats: [WildberriesBoosterStats!]!
}
type WildberriesCampaignInterval {
begin: String!
end: String!
}
type WildberriesCampaignDayStats {
@ -1074,5 +1082,66 @@ export const typeDefs = gql`
cr: Float!
shks: Int!
sum_price: Float!
apps: [WildberriesAppStats!]
}
type WildberriesAppStats {
views: Int!
clicks: Int!
ctr: Float!
cpc: Float!
sum: Float!
atbs: Int!
orders: Int!
cr: Float!
shks: Int!
sum_price: Float!
appType: Int!
nm: [WildberriesProductStats!]
}
type WildberriesProductStats {
views: Int!
clicks: Int!
ctr: Float!
cpc: Float!
sum: Float!
atbs: Int!
orders: Int!
cr: Float!
shks: Int!
sum_price: Float!
name: String!
nmId: Int!
}
type WildberriesBoosterStats {
date: String!
nm: Int!
avg_position: Float!
}
# Типы для списка кампаний
type WildberriesCampaignsListResponse {
success: Boolean!
message: String
data: WildberriesCampaignsData!
}
type WildberriesCampaignsData {
adverts: [WildberriesCampaignGroup!]!
all: Int!
}
type WildberriesCampaignGroup {
type: Int!
status: Int!
count: Int!
advert_list: [WildberriesCampaignItem!]!
}
type WildberriesCampaignItem {
advertId: Int!
changeTime: String!
}
`;