From 6794b01ac8211ea78afbc97924cf34df30ce8fa9 Mon Sep 17 00:00:00 2001 From: ilnaz <237x237@gmail.com> Date: Sun, 23 Feb 2025 12:32:53 +0300 Subject: [PATCH 1/3] feat: add fetch image --- server/routers/dry-wash/image.js | 91 ++++++++++++++++++++++++++++++++ server/routers/dry-wash/index.js | 2 + 2 files changed, 93 insertions(+) create mode 100644 server/routers/dry-wash/image.js diff --git a/server/routers/dry-wash/image.js b/server/routers/dry-wash/image.js new file mode 100644 index 0000000..263e342 --- /dev/null +++ b/server/routers/dry-wash/image.js @@ -0,0 +1,91 @@ +const API_URL = "https://gigachat.devices.sberbank.ru/api/v1" +const router = require('express').Router() +const { v4: uuidv4 } = require("uuid"); + +process.env.NODE_TLS_REJECT_UNAUTHORIZED = "0" + +const token = 'MTQwMmNmZjgtZjA5OC00OGMxLWI0OTUtNWU3ZTU4YzMzZjdjOmU5OGFiYmNiLThmMDItNGVmOC1hNjhhLTA4Y2QxYjVmOGRmMA==' + + +const getToken = async (req, res) => { + + const rqUID = uuidv4() + const body = new URLSearchParams({ + scope: "GIGACHAT_API_PERS", + }) + + const response = await fetch("https://ngw.devices.sberbank.ru:9443/api/v2/oauth", { + method: "POST", + headers: { + Authorization: `Basic ${token}`, + "Content-Type": "application/x-www-form-urlencoded", + Accept: "application/json", + RqUID: rqUID, + }, + body, + }) + + if (!response.ok) { + const errorData = await response.json(); + console.error(" Ошибка запроса:", errorData); + return res.status(response.status).json(errorData); + } + + return await response.json() +} + +async function analyzeImage(fileId,token) { + const response = await fetch(`${API_URL}/chat/completions`, { + method: "POST", + headers: { + "Content-Type": "application/json", + Accept: "application/json", + Authorization: `Bearer ${token}`, + }, + body: JSON.stringify({ + model: "GigaChat-Max", + stream: false, + update_interval: 0, + messages: [ + { + role: "system", + content: + "Ты эксперт по оценке чистоты автомобилей. Твоя задача — анализировать фотографии машин и определять степень их чистоты по 10-балльной шкале, где 1 — очень грязная, 10 — полностью чистая. Отвечай только числом от 1 до 10, без пояснений и дополнительных слов.", + }, + { + role: "user", + content: "Что с чистотой машины? Отвечай на основе приложенного документа", + attachments: [fileId], + }, + ], + }), + }); + + const data = await response.json() + console.log(" Результат анализа:", data) + return data +} + +router.post("/upload", async (req, res) => { + + const {access_token} = await getToken(req, res) + + const response = await fetch(`${API_URL}/files`, { + method: "POST", + headers: { + Authorization: `Bearer ${access_token}`, + contentType: "multipart/form-data", + }, + body: req.body, + }) + + const data = await response.json() + + const analysisResponse = await analyzeImage(data.id,access_token) + + res.json({ fileId: data.id, analysis: analysisResponse }) +}) + + + +module.exports = router diff --git a/server/routers/dry-wash/index.js b/server/routers/dry-wash/index.js index 5a89a80..b1dda9f 100644 --- a/server/routers/dry-wash/index.js +++ b/server/routers/dry-wash/index.js @@ -2,11 +2,13 @@ const router = require('express').Router() const armMasterRouter = require('./arm-master') const armOrdersRouter = require('./arm-orders') const orderRouter = require('./order') +const imageRouter = require('./image') router.use('/arm', armMasterRouter) router.use('/arm', armOrdersRouter) router.use('/order', orderRouter) +router.use('/image', imageRouter) module.exports = router -- 2.45.2 From c828718498bdfd17f1bd78589265b6f0d2525d26 Mon Sep 17 00:00:00 2001 From: ilnaz <237x237@gmail.com> Date: Mon, 3 Mar 2025 19:36:56 +0300 Subject: [PATCH 2/3] feat: add today filter --- server/routers/dry-wash/arm-master.js | 207 +++++++++++++------------- 1 file changed, 106 insertions(+), 101 deletions(-) diff --git a/server/routers/dry-wash/arm-master.js b/server/routers/dry-wash/arm-master.js index ce1af19..5403a43 100644 --- a/server/routers/dry-wash/arm-master.js +++ b/server/routers/dry-wash/arm-master.js @@ -1,111 +1,116 @@ -const router = require('express').Router() -const {MasterModel} = require('./model/master') -const mongoose = require("mongoose") -const {OrderModel} = require("./model/order") - +const router = require("express").Router(); +const { MasterModel } = require("./model/master"); +const mongoose = require("mongoose"); +const { OrderModel } = require("./model/order"); router.get("/masters", async (req, res, next) => { - try { - const masters = await MasterModel.find({}); - const orders = await OrderModel.find({}); + try { + const masters = await MasterModel.find({}); - const mastersWithOrders = masters.map((master) => { - const masterOrders = orders.filter((order) => { - return ( - order?.master && order.master.toString() === master._id.toString() - ); - }); + // Создаем объекты для начала и конца текущего дня + const today = new Date(); + today.setHours(0, 0, 0, 0); + const tomorrow = new Date(today); + tomorrow.setDate(tomorrow.getDate() + 1); - const schedule = masterOrders.map((order) => ({ - id: order._id, - startWashTime: order.startWashTime, - endWashTime: order.endWashTime, - })); + const orders = await OrderModel.find({ + startWashTime: { + $gte: today, + $lt: tomorrow, + }, + }); - return { - id: master._id, - name: master.name, - schedule: schedule, - phone: master.phone, - }; - }); - - res.status(200).send({ success: true, body: mastersWithOrders }); - } catch (error) { - next(error); - } -}); - -router.delete('/masters/:id', async (req, res,next) => { - const { id } = req.params; - - if (!mongoose.Types.ObjectId.isValid(id)){ - throw new Error('ID is required') - } - - try { - const master = await MasterModel.findByIdAndDelete(id, { - new: true, - }); - if (!master) { - throw new Error('master not found') - } - res.status(200).send({success: true, body: master}) - } catch (error) { - next(error) - } -}) - - -router.post('/masters', async (req, res,next) => { - - const {name, phone} = req.body - - if (!name || !phone ){ - throw new Error('Enter name and phone') - } - try { - const master = await MasterModel.create({name, phone}) - res.status(200).send({success: true, body: master}) - } catch (error) { - next(error) - } -}) - - -router.patch('/masters/:id', async (req, res, next) => { - const { id } = req.params; - - if (!mongoose.Types.ObjectId.isValid(id)) { - throw new Error('ID is required') - } - - const { name, phone } = req.body; - - if (!name && !phone) { - throw new Error('Enter name and phone') - } - - - try { - const updateData = {}; - if (name) updateData.name = name; - if (phone) updateData.phone = phone; - - const master = await MasterModel.findByIdAndUpdate( - id, - updateData, - { new: true } + const mastersWithOrders = masters.map((master) => { + const masterOrders = orders.filter((order) => { + return ( + order?.master && order.master.toString() === master._id.toString() ); + }); - if (!master) { - throw new Error('master not found') - } + const schedule = masterOrders.map((order) => ({ + id: order._id, + startWashTime: order.startWashTime, + endWashTime: order.endWashTime, + })); - res.status(200).send({ success: true, body: master }); - } catch (error) { - next(error); - } + return { + id: master._id, + name: master.name, + schedule: schedule, + phone: master.phone, + }; + }); + + res.status(200).send({ success: true, body: mastersWithOrders }); + } catch (error) { + next(error); + } }); -module.exports = router +router.delete("/masters/:id", async (req, res, next) => { + const { id } = req.params; + + if (!mongoose.Types.ObjectId.isValid(id)) { + throw new Error("ID is required"); + } + + try { + const master = await MasterModel.findByIdAndDelete(id, { + new: true, + }); + if (!master) { + throw new Error("master not found"); + } + res.status(200).send({ success: true, body: master }); + } catch (error) { + next(error); + } +}); + +router.post("/masters", async (req, res, next) => { + const { name, phone } = req.body; + + if (!name || !phone) { + throw new Error("Enter name and phone"); + } + try { + const master = await MasterModel.create({ name, phone }); + res.status(200).send({ success: true, body: master }); + } catch (error) { + next(error); + } +}); + +router.patch("/masters/:id", async (req, res, next) => { + const { id } = req.params; + + if (!mongoose.Types.ObjectId.isValid(id)) { + throw new Error("ID is required"); + } + + const { name, phone } = req.body; + + if (!name && !phone) { + throw new Error("Enter name and phone"); + } + + try { + const updateData = {}; + if (name) updateData.name = name; + if (phone) updateData.phone = phone; + + const master = await MasterModel.findByIdAndUpdate(id, updateData, { + new: true, + }); + + if (!master) { + throw new Error("master not found"); + } + + res.status(200).send({ success: true, body: master }); + } catch (error) { + next(error); + } +}); + +module.exports = router; -- 2.45.2 From 566bce466305e5e3b90bde35065c8ff8611898f6 Mon Sep 17 00:00:00 2001 From: ilnaz <237x237@gmail.com> Date: Mon, 3 Mar 2025 19:46:10 +0300 Subject: [PATCH 3/3] feat: delete image --- server/routers/dry-wash/image.js | 91 -------------------------------- server/routers/dry-wash/index.js | 2 - 2 files changed, 93 deletions(-) delete mode 100644 server/routers/dry-wash/image.js diff --git a/server/routers/dry-wash/image.js b/server/routers/dry-wash/image.js deleted file mode 100644 index 263e342..0000000 --- a/server/routers/dry-wash/image.js +++ /dev/null @@ -1,91 +0,0 @@ -const API_URL = "https://gigachat.devices.sberbank.ru/api/v1" -const router = require('express').Router() -const { v4: uuidv4 } = require("uuid"); - -process.env.NODE_TLS_REJECT_UNAUTHORIZED = "0" - -const token = 'MTQwMmNmZjgtZjA5OC00OGMxLWI0OTUtNWU3ZTU4YzMzZjdjOmU5OGFiYmNiLThmMDItNGVmOC1hNjhhLTA4Y2QxYjVmOGRmMA==' - - -const getToken = async (req, res) => { - - const rqUID = uuidv4() - const body = new URLSearchParams({ - scope: "GIGACHAT_API_PERS", - }) - - const response = await fetch("https://ngw.devices.sberbank.ru:9443/api/v2/oauth", { - method: "POST", - headers: { - Authorization: `Basic ${token}`, - "Content-Type": "application/x-www-form-urlencoded", - Accept: "application/json", - RqUID: rqUID, - }, - body, - }) - - if (!response.ok) { - const errorData = await response.json(); - console.error(" Ошибка запроса:", errorData); - return res.status(response.status).json(errorData); - } - - return await response.json() -} - -async function analyzeImage(fileId,token) { - const response = await fetch(`${API_URL}/chat/completions`, { - method: "POST", - headers: { - "Content-Type": "application/json", - Accept: "application/json", - Authorization: `Bearer ${token}`, - }, - body: JSON.stringify({ - model: "GigaChat-Max", - stream: false, - update_interval: 0, - messages: [ - { - role: "system", - content: - "Ты эксперт по оценке чистоты автомобилей. Твоя задача — анализировать фотографии машин и определять степень их чистоты по 10-балльной шкале, где 1 — очень грязная, 10 — полностью чистая. Отвечай только числом от 1 до 10, без пояснений и дополнительных слов.", - }, - { - role: "user", - content: "Что с чистотой машины? Отвечай на основе приложенного документа", - attachments: [fileId], - }, - ], - }), - }); - - const data = await response.json() - console.log(" Результат анализа:", data) - return data -} - -router.post("/upload", async (req, res) => { - - const {access_token} = await getToken(req, res) - - const response = await fetch(`${API_URL}/files`, { - method: "POST", - headers: { - Authorization: `Bearer ${access_token}`, - contentType: "multipart/form-data", - }, - body: req.body, - }) - - const data = await response.json() - - const analysisResponse = await analyzeImage(data.id,access_token) - - res.json({ fileId: data.id, analysis: analysisResponse }) -}) - - - -module.exports = router diff --git a/server/routers/dry-wash/index.js b/server/routers/dry-wash/index.js index b1dda9f..5a89a80 100644 --- a/server/routers/dry-wash/index.js +++ b/server/routers/dry-wash/index.js @@ -2,13 +2,11 @@ const router = require('express').Router() const armMasterRouter = require('./arm-master') const armOrdersRouter = require('./arm-orders') const orderRouter = require('./order') -const imageRouter = require('./image') router.use('/arm', armMasterRouter) router.use('/arm', armOrdersRouter) router.use('/order', orderRouter) -router.use('/image', imageRouter) module.exports = router -- 2.45.2