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)