Files
makemd/server/src/api/controllers/CurrencyController.ts

262 lines
9.2 KiB
TypeScript
Raw Normal View History

import { Request, Response } from 'express';
import currencyService from '../../services/CurrencyService';
import exchangeRateService from '../../services/ExchangeRateService';
import currencyConversionService from '../../services/CurrencyConversionService';
import currencyCalculationService from '../../services/CurrencyCalculationService';
import { PriceCalculationParams, ProfitCalculationParams } from '../../services/CurrencyCalculationService';
export class CurrencyController {
// 货币管理相关接口
static async getCurrencies(req: Request, res: Response) {
try {
const currencies = await currencyService.getCurrencies();
res.json({ success: true, data: currencies });
} catch (error: any) {
res.status(500).json({ success: false, error: error.message });
}
}
static async getCurrencyByCode(req: Request, res: Response) {
const { code } = req.params;
try {
const currency = await currencyService.getCurrencyByCode(code);
if (currency) {
res.json({ success: true, data: currency });
} else {
res.status(404).json({ success: false, error: 'Currency not found' });
}
} catch (error: any) {
res.status(500).json({ success: false, error: error.message });
}
}
static async getDefaultCurrency(req: Request, res: Response) {
try {
const currency = await currencyService.getDefaultCurrency();
if (currency) {
res.json({ success: true, data: currency });
} else {
res.status(404).json({ success: false, error: 'Default currency not set' });
}
} catch (error: any) {
res.status(500).json({ success: false, error: error.message });
}
}
static async createCurrency(req: Request, res: Response) {
const { code, name, symbol, decimal_places, format, is_default } = req.body;
const { userId } = (req as any).traceContext;
try {
const currency = await currencyService.createCurrency({
code,
name,
symbol,
decimal_places,
format,
is_default,
created_by: userId,
});
res.status(201).json({ success: true, data: currency });
} catch (error: any) {
res.status(400).json({ success: false, error: error.message });
}
}
static async updateCurrency(req: Request, res: Response) {
const { id } = req.params;
const { name, symbol, decimal_places, format, is_active, is_default } = req.body;
const { userId } = (req as any).traceContext;
try {
const currency = await currencyService.updateCurrency(id, {
name,
symbol,
decimal_places,
format,
is_active,
is_default,
updated_by: userId,
});
res.json({ success: true, data: currency });
} catch (error: any) {
res.status(400).json({ success: false, error: error.message });
}
}
static async deactivateCurrency(req: Request, res: Response) {
const { id } = req.params;
const { userId } = (req as any).traceContext;
try {
const currency = await currencyService.deactivateCurrency(id, userId);
res.json({ success: true, data: currency });
} catch (error: any) {
res.status(400).json({ success: false, error: error.message });
}
}
static async setDefaultCurrency(req: Request, res: Response) {
const { id } = req.params;
const { userId } = (req as any).traceContext;
try {
const currency = await currencyService.setDefaultCurrency(id, userId);
res.json({ success: true, data: currency });
} catch (error: any) {
res.status(400).json({ success: false, error: error.message });
}
}
// 汇率相关接口
static async getExchangeRate(req: Request, res: Response) {
const { from, to } = req.params;
try {
const rate = await exchangeRateService.getExchangeRate(from, to);
if (rate) {
res.json({ success: true, data: rate });
} else {
res.status(404).json({ success: false, error: 'Exchange rate not found' });
}
} catch (error: any) {
res.status(500).json({ success: false, error: error.message });
}
}
static async updateExchangeRates(req: Request, res: Response) {
try {
const count = await exchangeRateService.updateExchangeRates();
res.json({ success: true, data: { updated_count: count } });
} catch (error: any) {
res.status(500).json({ success: false, error: error.message });
}
}
static async getExchangeRateHistory(req: Request, res: Response) {
const { from, to } = req.params;
const { days = 30 } = req.query;
try {
const history = await exchangeRateService.getExchangeRateHistory(from, to, parseInt(days as string));
res.json({ success: true, data: history });
} catch (error: any) {
res.status(500).json({ success: false, error: error.message });
}
}
static async getAllExchangeRates(req: Request, res: Response) {
try {
const rates = await exchangeRateService.getAllExchangeRates();
res.json({ success: true, data: rates });
} catch (error: any) {
res.status(500).json({ success: false, error: error.message });
}
}
// 货币转换相关接口
static async convertCurrency(req: Request, res: Response) {
const { amount, from, to } = req.body;
try {
const convertedAmount = await currencyConversionService.convert(amount, from, to);
res.json({ success: true, data: { amount: convertedAmount, currency: to } });
} catch (error: any) {
res.status(400).json({ success: false, error: error.message });
}
}
static async convertMultipleCurrencies(req: Request, res: Response) {
const { amounts, from, to } = req.body;
try {
const convertedAmounts = await currencyConversionService.convertMultiple(amounts, from, to);
res.json({ success: true, data: { amounts: convertedAmounts, currency: to } });
} catch (error: any) {
res.status(400).json({ success: false, error: error.message });
}
}
static async convertToDefaultCurrency(req: Request, res: Response) {
const { amount, from } = req.body;
try {
const convertedAmount = await currencyConversionService.convertToDefault(amount, from);
const defaultCurrency = await currencyService.getDefaultCurrency();
res.json({ success: true, data: { amount: convertedAmount, currency: defaultCurrency?.code } });
} catch (error: any) {
res.status(400).json({ success: false, error: error.message });
}
}
static async convertFromDefaultCurrency(req: Request, res: Response) {
const { amount, to } = req.body;
try {
const convertedAmount = await currencyConversionService.convertFromDefault(amount, to);
res.json({ success: true, data: { amount: convertedAmount, currency: to } });
} catch (error: any) {
res.status(400).json({ success: false, error: error.message });
}
}
// 货币计算相关接口
static async calculatePrice(req: Request, res: Response) {
const params: PriceCalculationParams = req.body;
try {
const price = await currencyCalculationService.calculatePrice(params);
res.json({ success: true, data: { price, currency: params.targetCurrency } });
} catch (error: any) {
res.status(400).json({ success: false, error: error.message });
}
}
static async calculateProfit(req: Request, res: Response) {
const params: ProfitCalculationParams = req.body;
try {
const profit = await currencyCalculationService.calculateProfit(params);
res.json({ success: true, data: { profit, currency: params.sellingCurrency } });
} catch (error: any) {
res.status(400).json({ success: false, error: error.message });
}
}
static async calculateProfitPercentage(req: Request, res: Response) {
const params: ProfitCalculationParams = req.body;
try {
const profitPercentage = await currencyCalculationService.calculateProfitPercentage(params);
res.json({ success: true, data: { profitPercentage } });
} catch (error: any) {
res.status(400).json({ success: false, error: error.message });
}
}
static async calculateBreakEvenPrice(req: Request, res: Response) {
const { costPrice, costCurrency, targetCurrency, additionalCosts, additionalCostCurrency } = req.body;
try {
const breakEvenPrice = await currencyCalculationService.calculateBreakEvenPrice(
costPrice,
costCurrency,
targetCurrency,
additionalCosts,
additionalCostCurrency
);
res.json({ success: true, data: { breakEvenPrice, currency: targetCurrency } });
} catch (error: any) {
res.status(400).json({ success: false, error: error.message });
}
}
static async calculateMarkupPercentage(req: Request, res: Response) {
const { sellingPrice, sellingCurrency, costPrice, costCurrency, additionalCosts, additionalCostCurrency } = req.body;
try {
const markupPercentage = await currencyCalculationService.calculateMarkupPercentage(
sellingPrice,
sellingCurrency,
costPrice,
costCurrency,
additionalCosts,
additionalCostCurrency
);
res.json({ success: true, data: { markupPercentage } });
} catch (error: any) {
res.status(400).json({ success: false, error: error.message });
}
}
}