262 lines
9.2 KiB
TypeScript
262 lines
9.2 KiB
TypeScript
|
|
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 });
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|