fuel; nest api
This commit is contained in:
@ -1,5 +1,14 @@
|
||||
import { ApiProperty } from "@nestjs/swagger";
|
||||
import { IsNumber, IsUUID } from "class-validator";
|
||||
import { Type } from "class-transformer";
|
||||
import { IsArray, IsNumber, IsObject, IsUUID, ValidateNested } from "class-validator";
|
||||
|
||||
class MonthDto {
|
||||
@IsNumber()
|
||||
month: number
|
||||
|
||||
@IsNumber()
|
||||
value: number
|
||||
}
|
||||
|
||||
export class CreateLimitDto {
|
||||
@ApiProperty({ format: 'uuid' })
|
||||
@ -10,15 +19,13 @@ export class CreateLimitDto {
|
||||
@IsNumber()
|
||||
id_fuel: number
|
||||
|
||||
@ApiProperty()
|
||||
@IsNumber()
|
||||
month: Date
|
||||
|
||||
@ApiProperty()
|
||||
@IsNumber()
|
||||
year: number
|
||||
|
||||
@ApiProperty()
|
||||
@IsNumber()
|
||||
value: number
|
||||
@IsArray()
|
||||
@ValidateNested({ each: true })
|
||||
@Type(() => MonthDto)
|
||||
months: MonthDto[]
|
||||
}
|
||||
18
server/src/fuel/dto/get-city-settings.ts
Normal file
18
server/src/fuel/dto/get-city-settings.ts
Normal file
@ -0,0 +1,18 @@
|
||||
import { ApiProperty, ApiPropertyOptional } from "@nestjs/swagger"
|
||||
import { IsNumberString, IsOptional } from "class-validator"
|
||||
|
||||
export class GetCitySettingsDTO {
|
||||
@ApiProperty()
|
||||
@IsNumberString()
|
||||
city_id: number
|
||||
|
||||
@ApiPropertyOptional()
|
||||
@IsNumberString()
|
||||
@IsOptional()
|
||||
offset?: number
|
||||
|
||||
@ApiPropertyOptional()
|
||||
@IsNumberString()
|
||||
@IsOptional()
|
||||
limit?: number
|
||||
}
|
||||
22
server/src/fuel/dto/get-limits.ts
Normal file
22
server/src/fuel/dto/get-limits.ts
Normal file
@ -0,0 +1,22 @@
|
||||
import { ApiProperty, ApiPropertyOptional } from "@nestjs/swagger"
|
||||
import { IsNumberString, IsOptional } from "class-validator"
|
||||
|
||||
export class GetLimitsDTO {
|
||||
@ApiProperty()
|
||||
@IsNumberString()
|
||||
city_id: number
|
||||
|
||||
@ApiProperty()
|
||||
@IsNumberString()
|
||||
year: number
|
||||
|
||||
@ApiPropertyOptional()
|
||||
@IsNumberString()
|
||||
@IsOptional()
|
||||
offset?: number
|
||||
|
||||
@ApiPropertyOptional()
|
||||
@IsNumberString()
|
||||
@IsOptional()
|
||||
limit?: number
|
||||
}
|
||||
@ -9,6 +9,8 @@ import { FuelExpenseDto } from './dto/expense'
|
||||
import { FuelTransferDto } from './dto/transfer'
|
||||
import { GetBoilersDTO } from './dto/get-boilers'
|
||||
import { GetFuelsDTO } from './dto/get-fuels'
|
||||
import { GetLimitsDTO } from './dto/get-limits'
|
||||
import { GetCitySettingsDTO } from './dto/get-city-settings'
|
||||
|
||||
@Controller('fuel')
|
||||
export class FuelController {
|
||||
@ -43,8 +45,8 @@ export class FuelController {
|
||||
type: FuelLimitDto,
|
||||
isArray: true,
|
||||
})
|
||||
async getBoilersFuelsLimits(): Promise<FuelLimitDto[]> {
|
||||
return this.fuelService.getBoilersFuelsLimits()
|
||||
async getBoilersFuelsLimits(@Query() getLimitsDTO: GetLimitsDTO): Promise<FuelLimitDto[]> {
|
||||
return this.fuelService.getBoilersFuelsLimits(getLimitsDTO)
|
||||
}
|
||||
|
||||
@Post('/limits')
|
||||
@ -52,6 +54,16 @@ export class FuelController {
|
||||
return this.fuelService.addBoilersFuelsLimit(createLimitDto)
|
||||
}
|
||||
|
||||
// Fuel limits
|
||||
@Get('/city-settings')
|
||||
@ApiOkResponse({
|
||||
description: 'City settings',
|
||||
isArray: true,
|
||||
})
|
||||
async getCitySettings(@Query() getCitySettingsDTO: GetCitySettingsDTO): Promise<any[]> {
|
||||
return this.fuelService.getCitySettings(getCitySettingsDTO)
|
||||
}
|
||||
|
||||
// Fuel expenses
|
||||
@Get('/expenses')
|
||||
@ApiOkResponse({
|
||||
|
||||
@ -1,10 +1,12 @@
|
||||
import { Injectable } from '@nestjs/common';
|
||||
import { Injectable, Logger } from '@nestjs/common';
|
||||
import { InjectDataSource } from '@nestjs/typeorm';
|
||||
import { DataSource } from 'typeorm';
|
||||
import { CreateExpenseDto } from './dto/create-expense';
|
||||
import { CreateLimitDto } from './dto/create-limit';
|
||||
import { CreateTransferDto } from './dto/create-transfer';
|
||||
import { GetFuelsDTO } from './dto/get-fuels';
|
||||
import { GetLimitsDTO } from './dto/get-limits';
|
||||
import { GetCitySettingsDTO } from './dto/get-city-settings';
|
||||
|
||||
@Injectable()
|
||||
export class FuelService {
|
||||
@ -56,13 +58,12 @@ export class FuelService {
|
||||
const result = await this.wsDataSource.query(`
|
||||
SELECT
|
||||
b.*,
|
||||
COALESCE(
|
||||
(SELECT fp.*
|
||||
(
|
||||
SELECT fp.*
|
||||
FROM isFuels.dbo.BoilersFuels bf
|
||||
INNER JOIN isWorldstone.dbo.dFuelsParameters fp ON bf.id_fuels = fp.id
|
||||
WHERE bf.id_boilers = b.id_object
|
||||
FOR JSON PATH),
|
||||
'[]'
|
||||
FOR JSON PATH
|
||||
) AS id_fuels
|
||||
FROM isWorldstone.dbo.vBoilers b
|
||||
WHERE id_city = @0
|
||||
@ -90,11 +91,118 @@ export class FuelService {
|
||||
return result
|
||||
}
|
||||
|
||||
async getBoilersFuelsLimits(): Promise<any[]> {
|
||||
async getCitySettings(getCitySettings: GetCitySettingsDTO): Promise<any[]> {
|
||||
const { city_id } = getCitySettings
|
||||
|
||||
const result = await this.wsDataSource.query(`
|
||||
SELECT * FROM isWorldstone..vCitySettings
|
||||
WHERE id_city = @0
|
||||
`, [Number(city_id)])
|
||||
|
||||
return result
|
||||
}
|
||||
|
||||
async getBoilersFuelsLimits(getLimitsDTO: GetLimitsDTO): Promise<any[]> {
|
||||
const { city_id, year, offset, limit } = getLimitsDTO
|
||||
|
||||
// const result = await this.wsDataSource.query(`
|
||||
// SELECT
|
||||
// b.*,
|
||||
// (
|
||||
// SELECT
|
||||
// bf.id AS id_fuels_entry,
|
||||
// df.id AS fuel_id,
|
||||
// df.name,
|
||||
|
||||
// -- вложенный JSON: лимиты по месяцам
|
||||
// (
|
||||
// SELECT
|
||||
// l.month,
|
||||
// l.year,
|
||||
// l.value
|
||||
// FROM isFuels..BoilersFuelsLimits l
|
||||
// WHERE l.id_fuel = bf.id
|
||||
// ORDER BY l.year, l.month
|
||||
// FOR JSON PATH
|
||||
// ) AS limits
|
||||
|
||||
// FROM isFuels..BoilersFuels bf
|
||||
// JOIN isWorldstone..dFuelsParameters df
|
||||
// ON df.id = bf.id_fuels
|
||||
// WHERE bf.id_boilers = b.id_object
|
||||
// FOR JSON PATH
|
||||
// ) AS fuels
|
||||
// FROM isWorldstone..vBoilers b
|
||||
// WHERE id_city = @0
|
||||
// ORDER BY id_object
|
||||
// OFFSET @1 ROWS
|
||||
// FETCH NEXT @2 ROWS ONLY
|
||||
// ;
|
||||
// `, [city_id, Number(offset || 0), Number(limit || 100)])
|
||||
|
||||
const result = await this.wsDataSource.query(`
|
||||
WITH Src AS (
|
||||
SELECT
|
||||
b.id_object AS id_boiler,
|
||||
b.name AS boiler_name,
|
||||
bf.id AS id_boiler_fuel,
|
||||
bf.id_fuels AS id_fuel_type,
|
||||
fp.name AS fuel_name,
|
||||
l.month,
|
||||
l.value,
|
||||
l.year
|
||||
FROM isWorldstone..vBoilers b
|
||||
LEFT JOIN isFuels..BoilersFuels bf
|
||||
ON bf.id_boilers = b.id_object
|
||||
LEFT JOIN isWorldstone..dFuelsParameters fp
|
||||
ON fp.id = bf.id_fuels
|
||||
LEFT JOIN isFuels..BoilersFuelsLimits l
|
||||
ON l.id_boiler = bf.id_boilers
|
||||
AND l.id_fuel = bf.id
|
||||
AND (
|
||||
(l.month BETWEEN 7 AND 12 AND l.year = @1) -- second half
|
||||
OR
|
||||
(l.month BETWEEN 1 AND 6 AND l.year = @2) -- first half next year
|
||||
)
|
||||
WHERE b.id_city = @0
|
||||
),
|
||||
|
||||
Renamed AS (
|
||||
SELECT
|
||||
id_boiler,
|
||||
boiler_name,
|
||||
id_boiler_fuel,
|
||||
id_fuel_type,
|
||||
fuel_name,
|
||||
CASE month
|
||||
WHEN 7 THEN 'jul'
|
||||
WHEN 8 THEN 'aug'
|
||||
WHEN 9 THEN 'sep'
|
||||
WHEN 10 THEN 'oct'
|
||||
WHEN 11 THEN 'nov'
|
||||
WHEN 12 THEN 'dec'
|
||||
WHEN 1 THEN 'jan'
|
||||
WHEN 2 THEN 'feb'
|
||||
WHEN 3 THEN 'mar'
|
||||
WHEN 4 THEN 'apr'
|
||||
WHEN 5 THEN 'may'
|
||||
WHEN 6 THEN 'jun'
|
||||
END AS MonthName,
|
||||
value
|
||||
FROM Src
|
||||
)
|
||||
|
||||
SELECT *
|
||||
FROM "vBoilerLimits";
|
||||
`)
|
||||
FROM Renamed
|
||||
PIVOT (
|
||||
MAX(value)
|
||||
FOR MonthName IN (
|
||||
[jul], [aug], [sep], [oct], [nov], [dec],
|
||||
[jan], [feb], [mar], [apr], [may], [jun]
|
||||
)
|
||||
) AS P
|
||||
ORDER BY id_boiler, id_boiler_fuel;
|
||||
`, [city_id, year, year + 1])
|
||||
return result
|
||||
}
|
||||
|
||||
@ -114,10 +222,14 @@ export class FuelService {
|
||||
}
|
||||
|
||||
async addBoilersFuelsLimit(createLimitDto: CreateLimitDto): Promise<any[]> {
|
||||
const result = await this.dataSource.query(`
|
||||
INSERT INTO dbo.BoilersFuelsLimits (id_boiler, id_fuel, value, month, year) VALUES ($1, $2, $3, $4, $5)
|
||||
`, [createLimitDto.id_boiler, createLimitDto.id_fuel, createLimitDto.value, createLimitDto.month, createLimitDto.year])
|
||||
return result
|
||||
const logger = new Logger('INFO'); // 'MyContext' is an optional string for log context
|
||||
logger.log(createLimitDto)
|
||||
|
||||
return [createLimitDto]
|
||||
// const result = await this.dataSource.query(`
|
||||
// INSERT INTO isFuels..BoilersFuelsLimits (id_boiler, id_fuel, value, month, year) VALUES ($1, $2, $3, $4, $5)
|
||||
// `, [createLimitDto.id_boiler, createLimitDto.id_fuel, createLimitDto.value, createLimitDto.month, createLimitDto.year])
|
||||
// return result
|
||||
}
|
||||
|
||||
async addFuelsTransfer(createTransferDto: CreateTransferDto): Promise<any[]> {
|
||||
|
||||
Reference in New Issue
Block a user