fuel; nest api

This commit is contained in:
2025-12-23 09:53:04 +09:00
parent fa516b3a20
commit 04ce74d320
23 changed files with 1125 additions and 183 deletions

View File

@ -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[]
}

View 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
}

View 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
}

View File

@ -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({

View File

@ -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[]> {