From 3af90800ff3f86b4df3027d1c76a30515192c801 Mon Sep 17 00:00:00 2001 From: goodmice Date: Tue, 17 May 2022 16:12:22 +0500 Subject: [PATCH] =?UTF-8?q?*=20=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5?= =?UTF-8?q?=D0=BD=D0=BE=20=D0=B1=D0=B0=D0=B7=D0=BE=D0=B2=D0=BE=D0=B5=20?= =?UTF-8?q?=D0=BE=D0=BF=D0=B8=D1=81=D0=B0=D0=BD=D0=B8=D0=B5=20README.md=20?= =?UTF-8?q?*=20TODO.md=20=D1=83=D0=B4=D0=B0=D0=BB=D1=91=D0=BD=20=D0=B7?= =?UTF-8?q?=D0=B0=20=D0=BD=D0=B5=D0=BD=D0=B0=D0=B4=D0=BE=D0=B1=D0=BD=D0=BE?= =?UTF-8?q?=D1=81=D1=82=D1=8C=D1=8E=20*=20=D0=92=20index.html=20=D0=B4?= =?UTF-8?q?=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5=D0=BD=D0=BE=20=D0=B1=D0=BE?= =?UTF-8?q?=D0=BB=D0=B5=D0=B5=20=D0=BF=D0=BE=D0=B4=D1=80=D0=BE=D0=B1=D0=BD?= =?UTF-8?q?=D0=BE=D0=B5=20=D0=BE=D0=BF=D0=B8=D1=81=D0=B0=D0=BD=D0=B8=D0=B5?= =?UTF-8?q?=20=D1=86=D0=B2=D0=B5=D1=82=D0=BE=D0=B2=D1=8B=D1=85=20=D1=82?= =?UTF-8?q?=D0=B5=D0=BC=20*=20=D0=A7=D0=B0=D1=81=D1=82=D0=B8=20=D0=BC?= =?UTF-8?q?=D0=B5=D1=82=D0=BE=D0=B4=D0=BE=D0=B2=20utils=20=D0=B4=D0=BE?= =?UTF-8?q?=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5=D0=BD=D0=B0=20=D0=B4=D0=BE=D0=BA?= =?UTF-8?q?=D1=83=D0=BC=D0=B5=D0=BD=D1=82=D0=B0=D1=86=D0=B8=D1=8F,=20?= =?UTF-8?q?=D1=8F=D0=B2=D0=BD=D0=BE=20=D1=83=D0=BA=D0=B0=D0=B7=D0=B0=D0=BD?= =?UTF-8?q?=D1=8B=20=D1=82=D0=B8=D0=BF=D0=B0=20=D0=B4=D0=B0=D0=BD=D0=BD?= =?UTF-8?q?=D1=8B=D1=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 62 ++++++++++++++++++++++++++++++++++++++++- TODO.md | 1 - public/index.html | 8 ++++-- src/utils/datetime.ts | 6 ++-- src/utils/functions.tsx | 35 +++++++++++++---------- src/utils/index.ts | 47 +++++++++++++++++++++++++++---- src/utils/string.ts | 4 +-- 7 files changed, 134 insertions(+), 29 deletions(-) delete mode 100755 TODO.md diff --git a/README.md b/README.md index e940f42..60b1e40 100755 --- a/README.md +++ b/README.md @@ -1 +1,61 @@ -Проект веб части ASB cloud \ No newline at end of file +![ASB Logo](concept/ImagesSrc/logo_Asb.svg) +# Проект веб части ASB cloud + +# Порядок запуска +## 1. Установка пакетов +Для запуска установки необходимо иметь уже установленый [NPM](https://www.npmjs.com). + +Установка выполняется одной командой: +```bash +npm i +``` + +## 2. Автогенерация сервисов +Для корректной работы веб-приложения необходимо наличие сервисов работы с RestAPI. + +Для их автогенерации требуется уже запущенная серверная часть. + +Автогенерацию можно запустить с помощью уже прописанных в [package.json](package.json) скриптов, либо вручную. + +Если сервер запущен на текущей машине достаточно написать: +```bash +npm run update_openapi +``` + +Для получения сервисов с основного сервера: +```bash +npm run update_openapi_server +``` + +или же ручной вариант: +```bash +npx openapi -i http://{IP_ADDRESS}:{PORT}/swagger/v1/swagger.json -o src/services/api +``` + +где ***IP_ADDRESS*** и ***PORT*** это соответственно IP-адрес и порт сервера. + +На данный момент имеются следующие IP-адреса: +| IP-адрес | Описание | +|:-|:-| +| 127.0.0.1:5000 | Локальный адрес вашей машины (привязан к `update_openapi`) | +| 192.168.1.70:5000 | Локальный адрес development-сервера (привязан к `update_openapi_server`) | +| 46.146.209.148:89 | Внешний адрес development-сервера | +| 46.146.209.148 | Внешний адрес production-сервера | + +## 3. Компиляция production-версии приложения +После выполнения вышеописанных пунктов приложение готово к компиляции. + +Для компиляции досточно выполнить команду: +```bash +npm run build +``` + +После завершения этой команды скомпилированное приложение будет находиться в появившейся директории [build/](build/). + +## 4. Запуск development-версии приложения +В [package.json](package.json) необходимо проверить и при необходимости изменить значение в поле ***proxy*** (пара адрес-порт сервера с RestAPI) на актуальное. + +После чего выполнить запуск командой: +```bash +npm start +``` diff --git a/TODO.md b/TODO.md deleted file mode 100755 index 3d2733d..0000000 --- a/TODO.md +++ /dev/null @@ -1 +0,0 @@ -env params prod/dev \ No newline at end of file diff --git a/public/index.html b/public/index.html index aeeddf7..affdf4a 100755 --- a/public/index.html +++ b/public/index.html @@ -1,13 +1,15 @@ - + - + + + АСБ Vision diff --git a/src/utils/datetime.ts b/src/utils/datetime.ts index 74090a8..9977f60 100755 --- a/src/utils/datetime.ts +++ b/src/utils/datetime.ts @@ -19,7 +19,7 @@ export function isRawDate(value: unknown): value is RawDate { return !isNaN(Date.parse(String(value))) } -export const formatDate = (date: unknown, utc = false, format = defaultFormat) => { +export const formatDate = (date: unknown, utc: boolean = false, format: string = defaultFormat) => { if (!isRawDate(date)) return null const out = utc ? moment.utc(date).local() : moment(date) return out.format(format) @@ -40,8 +40,8 @@ export const periodToString = (time?: number) => { return `${days > 0 ? days : ''} ${toFixed(hours)}:${toFixed(minutes)}:${toFixed(seconds)}` } -export const calcDuration = (start: unknown, end: unknown) => { - if (!isRawDate(start) || !isRawDate(end)) return +export const calcDuration = (start: unknown, end: unknown): number | undefined => { + if (!isRawDate(start) || !isRawDate(end)) return undefined return (+new Date(end) - +new Date(start)) * timeInS.millisecond / timeInS.day } diff --git a/src/utils/functions.tsx b/src/utils/functions.tsx index a6751d2..cc377e8 100755 --- a/src/utils/functions.tsx +++ b/src/utils/functions.tsx @@ -1,20 +1,25 @@ import { OperationStatService, WellOperationDto, WellOperationDtoPlanFactPredictBase } from '@api' -const maxPrefix = 'isMax' -const minPrefix = 'isMin' +const maxPrefix: string = 'isMax' +const minPrefix: string = 'isMin' -export const getPrecision = (number: number) => Number.isFinite(number) ? number.toFixed(2) : '-' +export const getPrecision = (number: number): string => Number.isFinite(number) ? number.toFixed(2) : '-' export type KeyType = number | string -export const nwtIdCategory = 1043 +export const nwtIdCategory: number = 1043 export type SaubData = WellOperationDto & { - isNPT?: boolean // Относится ли операция к НПВ - key?: number // ID операции - depth?: number // Глубина - date?: string // Дата - nptHours?: number // Колличество часов НПВ с начала бурения до текущего момента + /** Относится ли операция к НПВ */ + isNPT?: boolean + /** ID операции */ + key?: number + /** Глубина */ + depth?: number + /** Дата */ + date?: string + /** Колличество часов НПВ с начала бурения до текущего момента */ + nptHours?: number } export const getOperations = async (idWell: number): Promise<{ @@ -25,11 +30,13 @@ export const getOperations = async (idWell: number): Promise<{ }> => { const ops = await OperationStatService.getTvd(idWell) - if (!ops) return { - operations: [], - plan: [], - fact: [], - predict: [], + if (!ops) { + return { + operations: [], + plan: [], + fact: [], + predict: [], + } } const convert = (operation?: WellOperationDto): SaubData => ({ diff --git a/src/utils/index.ts b/src/utils/index.ts index 7e84db5..49517b9 100755 --- a/src/utils/index.ts +++ b/src/utils/index.ts @@ -1,25 +1,62 @@ -export type { RawDate, timeInS } from './datetime' export { isRawDate, formatDate, defaultFormat, periodToString } from './datetime' +export type { RawDate, timeInS } from './datetime' -export const headerHeight = 64 +export const headerHeight: number = 64 export const mainFrameSize = () => ({ width: window.innerWidth, height: window.innerHeight - headerHeight }) +/** + * Возвращает + * + * @param arr Входящие данные + * @param def Значение по-умолчанию + * + * @returns Если `arr` - массив будет возвращено оно, иначе `def` + */ export const arrayOrDefault = (arr?: unknown, def: T[] = []): T[] => Array.isArray(arr) ? arr : def +/** + * Копирует данные в глубину. + * + * @remarks + * При копированиий объектов, содержащих функций может возникнуть исключение. + * Не предназначено для копирования функций. + * + * @param data Копируемые данные + * @returns Полная копия `data` + */ export const deepCopy = (data: T): T => JSON.parse(JSON.stringify(data ?? null)) +/** + * Маппинг полей объекта + * + * @param data Входящие данные + * @param handler Обработчик + * + * @returns Объект с обработанными полями + */ export const wrapValues = (data: Record, handler: (data: T, key: string, object: Record) => R): Record => Object.fromEntries(Object.entries(data).map(([key, value]) => [key, handler(value, key, data)])) +/** + * Генерирует массив чисел в заданном диапазоне + * + * @param end Конечное значение + * @param start Начальное значение + * + * @returns Массив чисел в диапазоне от `start` до `end` + */ export const range = (end: number, start: number = 0) => Array.from({ length: end - start }, (_, i) => start + i) /** - * Объединить типы, исключив совпадающие поля справа - * @param T Тип, передаваемый полностью - * @param R Аддитивный тип + * Объединить типы, исключив совпадающие поля справа. + * + * @typeParam T - Тип, передаваемый полностью + * @typeParam R - Аддитивный тип + * + * @returns Общий тип с полным `T` и несовпадающими полями из `R` */ export type OmitExtends = T & Omit diff --git a/src/utils/string.ts b/src/utils/string.ts index debbcf3..ae27338 100755 --- a/src/utils/string.ts +++ b/src/utils/string.ts @@ -1,7 +1,7 @@ -export const makeStringCutter = (maxLength = 100, separator = ' ', suffix = '...') => (comment?: string) => { +export const makeStringCutter = (maxLength: number = 100, separator: string = ' ', suffix: string = '...') => (comment?: string) => { if (!comment || comment.length < maxLength) return comment - let lastSep = comment.lastIndexOf(separator, maxLength) + const lastSep = comment.lastIndexOf(separator, maxLength) if (lastSep < 0) return comment.substring(0, maxLength - suffix.length) + suffix return comment.substring(0, lastSep)