Добавлен новый модель SupplySupplier в схему Prisma и реализована логика для работы с поставщиками в компонентах создания поставок. Обновлены компоненты CreateSupplyPage и DirectSupplyCreation для интеграции новых функций, включая обработку поставщиков и расчет логистики. Оптимизирован интерфейс с использованием новых компонентов и улучшена логика отображения данных.

This commit is contained in:
Bivekich
2025-07-26 01:38:29 +03:00
parent 7d9b76a792
commit a211a6786f
7 changed files with 1115 additions and 522 deletions

View File

@ -1136,4 +1136,24 @@ export const ADMIN_LOGOUT = gql`
mutation AdminLogout {
adminLogout
}
`
export const CREATE_SUPPLY_SUPPLIER = gql`
mutation CreateSupplySupplier($input: CreateSupplySupplierInput!) {
createSupplySupplier(input: $input) {
success
message
supplier {
id
name
contactName
phone
market
address
place
telegram
createdAt
}
}
}
`

View File

@ -178,6 +178,35 @@ export const GET_MY_COUNTERPARTIES = gql`
}
`
export const GET_SUPPLY_SUPPLIERS = gql`
query GetSupplySuppliers {
supplySuppliers {
id
name
contactName
phone
market
address
place
telegram
createdAt
}
}
`
export const GET_ORGANIZATION_LOGISTICS = gql`
query GetOrganizationLogistics($organizationId: ID!) {
organizationLogistics(organizationId: $organizationId) {
id
fromLocation
toLocation
priceUnder1m3
priceOver1m3
description
}
}
`
export const GET_INCOMING_REQUESTS = gql`
query GetIncomingRequests {
incomingRequests {

View File

@ -379,6 +379,45 @@ export const resolvers = {
return counterparties.map((c) => c.counterparty);
},
// Поставщики поставок
supplySuppliers: async (_: unknown, __: unknown, context: Context) => {
if (!context.user) {
throw new GraphQLError("Требуется авторизация", {
extensions: { code: "UNAUTHENTICATED" },
});
}
const currentUser = await prisma.user.findUnique({
where: { id: context.user.id },
include: { organization: true },
});
if (!currentUser?.organization) {
throw new GraphQLError("У пользователя нет организации");
}
const suppliers = await prisma.supplySupplier.findMany({
where: { organizationId: currentUser.organization.id },
orderBy: { createdAt: 'desc' }
});
return suppliers;
},
// Логистика конкретной организации
organizationLogistics: async (_: unknown, args: { organizationId: string }, context: Context) => {
if (!context.user) {
throw new GraphQLError("Требуется авторизация", {
extensions: { code: "UNAUTHENTICATED" },
});
}
return await prisma.logistics.findMany({
where: { organizationId: args.organizationId },
orderBy: { createdAt: "desc" },
});
},
// Входящие заявки
incomingRequests: async (_: unknown, __: unknown, context: Context) => {
if (!context.user) {
@ -4534,6 +4573,76 @@ export const resolvers = {
};
}
},
// Создать поставщика для поставки
createSupplySupplier: async (
_: unknown,
args: {
input: {
name: string;
contactName: string;
phone: string;
market?: string;
address?: string;
place?: string;
telegram?: string;
};
},
context: Context
) => {
if (!context.user) {
throw new GraphQLError("Требуется авторизация", {
extensions: { code: "UNAUTHENTICATED" },
});
}
const currentUser = await prisma.user.findUnique({
where: { id: context.user.id },
include: { organization: true },
});
if (!currentUser?.organization) {
throw new GraphQLError("У пользователя нет организации");
}
try {
// Создаем поставщика в базе данных
const supplier = await prisma.supplySupplier.create({
data: {
name: args.input.name,
contactName: args.input.contactName,
phone: args.input.phone,
market: args.input.market,
address: args.input.address,
place: args.input.place,
telegram: args.input.telegram,
organizationId: currentUser.organization.id,
},
});
return {
success: true,
message: "Поставщик добавлен успешно!",
supplier: {
id: supplier.id,
name: supplier.name,
contactName: supplier.contactName,
phone: supplier.phone,
market: supplier.market,
address: supplier.address,
place: supplier.place,
telegram: supplier.telegram,
createdAt: supplier.createdAt,
},
};
} catch (error) {
console.error("Error creating supply supplier:", error);
return {
success: false,
message: "Ошибка при добавлении поставщика",
};
}
},
},
// Резолверы типов

View File

@ -16,6 +16,12 @@ export const typeDefs = gql`
# Мои контрагенты
myCounterparties: [Organization!]!
# Поставщики поставок
supplySuppliers: [SupplySupplier!]!
# Логистика организации
organizationLogistics(organizationId: ID!): [Logistics!]!
# Входящие заявки
incomingRequests: [CounterpartyRequest!]!
@ -217,6 +223,11 @@ export const typeDefs = gql`
): WildberriesSupplyResponse!
deleteWildberriesSupply(id: ID!): Boolean!
# Работа с поставщиками для поставок
createSupplySupplier(
input: CreateSupplySupplierInput!
): SupplySupplierResponse!
# Админ мутации
adminLogin(username: String!, password: String!): AdminAuthResponse!
adminLogout: Boolean!
@ -963,6 +974,35 @@ export const typeDefs = gql`
type: Int!
}
# Типы для поставщиков поставок
type SupplySupplier {
id: ID!
name: String!
contactName: String!
phone: String!
market: String
address: String
place: String
telegram: String
createdAt: DateTime!
}
input CreateSupplySupplierInput {
name: String!
contactName: String!
phone: String!
market: String
address: String
place: String
telegram: String
}
type SupplySupplierResponse {
success: Boolean!
message: String
supplier: SupplySupplier
}
# Типы для статистики кампаний
input WildberriesCampaignStatsInput {
campaigns: [CampaignStatsRequest!]!