From e55b421ed7f1e2b42a8f90d50595b3cddb08b58f Mon Sep 17 00:00:00 2001 From: LeonG11 Date: Fri, 26 Jun 2026 17:53:21 +0300 Subject: [PATCH] feat: add front page stock movements --- backend/models/stock.go | 18 +++--- frontend/src/api/index.js | 6 +- frontend/src/components/AdminStock.jsx | 84 ++++++++++++++++++++++++++ frontend/src/pages/AdminPage.jsx | 5 +- 4 files changed, 102 insertions(+), 11 deletions(-) create mode 100644 frontend/src/components/AdminStock.jsx diff --git a/backend/models/stock.go b/backend/models/stock.go index e5fcc67..e5551bf 100644 --- a/backend/models/stock.go +++ b/backend/models/stock.go @@ -5,13 +5,13 @@ import ( ) type StockMovement struct { - ID uint `json:"id" gorm:"primaryKey"` - ItemID uint `json:"item_id"` - Item Item `json:"item" gorm:"foreignKey:ItemID"` - Type string `json:"type"` - Quantity float64 `json:"quantity"` - Reason string `json:"reason" gorm:"not null"` - OrderID *uint `json:"order_id"` - Comment string `json:"comment"` - CreatedAt time.Time + ID uint `json:"id" gorm:"primaryKey"` + ItemID uint `json:"item_id"` + Item Item `json:"item" gorm:"foreignKey:ItemID"` + Type string `json:"type"` + Quantity float64 `json:"quantity"` + Reason string `json:"reason" gorm:"not null"` + OrderID *uint `json:"order_id"` + Comment string `json:"comment"` + CreatedAt time.Time `json:"created_at"` } diff --git a/frontend/src/api/index.js b/frontend/src/api/index.js index 9743829..fbf987d 100644 --- a/frontend/src/api/index.js +++ b/frontend/src/api/index.js @@ -65,4 +65,8 @@ export const updateOrderStatus = (id, data) => export const registerAdmin = (data) => axios.post(`${API_URL}/admin/register`, data); -export const stockIn = (data) => axios.post(`${API_URL}/admin/stock/in`, data) +export const stockIn = (data) => axios.post(`${API_URL}/admin/stock/in`, data); +export const stockOut = (data) => + axios.post(`${API_URL}/admin/stock/out`, data); +export const getStockMovements = () => + axios.get(`${API_URL}/admin/stock/movements`); diff --git a/frontend/src/components/AdminStock.jsx b/frontend/src/components/AdminStock.jsx new file mode 100644 index 0000000..780689a --- /dev/null +++ b/frontend/src/components/AdminStock.jsx @@ -0,0 +1,84 @@ +import { useState, useEffect } from "react"; +import { getStockMovements } from "../api/index"; + +const REASON_LABELS = { + purchase: "Закупка", + order: "Продажа", + writeoff: "Списание", + correction: "Корректировка", +}; + +export default function AdminStock() { + const [movements, setMovements] = useState([]); + const [loading, setLoading] = useState(true); + + const loadMovements = () => { + getStockMovements() + .then((res) => { + setMovements(res.data); + }) + .catch(() => { }) + .finally(() => setLoading(false)); + }; + + useEffect(() => { + loadMovements(); + }, []); + + if (loading) return

Загрузка...

; + + return ( +
+

История движения

+ {movements.length === 0 ? ( +

Движений нет

+ ) : ( +
+ + + + + + + + + + + + + {movements.map((m) => ( + + + + + + + + + ))} + +
ДатаТоварТипКоличествоПричинаКомментарий
+ {new Date(m.created_at).toLocaleDateString("ru-RU")} + {m.item?.name} + + {m.type === "in" ? "Приход" : "Уход"} + + + {m.quantity} {m.item?.unit} + + {REASON_LABELS[m.reason] || m.reason} + + {m.comment || "-"} +
+
+ )} +
+ ); +} diff --git a/frontend/src/pages/AdminPage.jsx b/frontend/src/pages/AdminPage.jsx index 63da5a3..99e0162 100644 --- a/frontend/src/pages/AdminPage.jsx +++ b/frontend/src/pages/AdminPage.jsx @@ -1,7 +1,8 @@ import { useState } from "react"; import PageLayout from "../components/PageLayout"; import AdminItems from "../components/AdminItems"; -import AdminOrders from "../components/AdminOrders"; // добавим позже +import AdminOrders from "../components/AdminOrders"; +import AdminStock from "../components/AdminStock"; // import AdminStaff from "../components/AdminStaff"; // добавим позже export default function AdminPage() { @@ -10,6 +11,7 @@ export default function AdminPage() { const tabs = [ { key: "items", label: "Товары" }, { key: "orders", label: "Заказы" }, + { key: "stock", label: "Склад" }, { key: "staff", label: "Сотрудники" }, ]; @@ -39,6 +41,7 @@ export default function AdminPage() { {/* Содержимое активной вкладки */} {tab === "items" && } {tab === "orders" && } + {tab === "stock" && } {tab === "staff" && (

Раздел сотрудников — в разработке

)}