123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351 |
- import { Injectable } from '@angular/core';
- import { Observable, of, delay } from 'rxjs';
- export interface AIQuotationParams {
- area: number;
- style: string;
- level: string;
- specialRequirements?: string;
- }
- export interface AIQuotationItem {
- category: string;
- name: string;
- quantity: number;
- unit: string;
- unitPrice: number;
- description?: string;
- }
- export interface AIQuotationResult {
- items: AIQuotationItem[];
- totalAmount: number;
- suggestions?: string[];
- }
- @Injectable({
- providedIn: 'root'
- })
- export class AIQuotationService {
-
- // 装修风格价格系数
- private styleMultipliers: { [key: string]: number } = {
- '现代简约': 1.0,
- '北欧风格': 1.1,
- '中式风格': 1.3,
- '欧式风格': 1.4,
- '美式风格': 1.2,
- '工业风格': 1.1,
- '地中海风格': 1.2,
- '日式风格': 1.15
- };
- // 装修档次价格系数
- private levelMultipliers: { [key: string]: number } = {
- '经济型': 0.8,
- '舒适型': 1.0,
- '豪华型': 1.5,
- '奢华型': 2.0
- };
- // 基础报价模板
- private baseQuotationTemplate: AIQuotationItem[] = [
- {
- category: '客餐厅',
- name: '墙面乳胶漆',
- quantity: 1,
- unit: '㎡',
- unitPrice: 35,
- description: '包含基层处理、刮腻子、刷底漆面漆'
- },
- {
- category: '客餐厅',
- name: '地面瓷砖铺贴',
- quantity: 1,
- unit: '㎡',
- unitPrice: 80,
- description: '包含瓷砖、水泥沙浆、人工费'
- },
- {
- category: '客餐厅',
- name: '吊顶造型',
- quantity: 1,
- unit: '㎡',
- unitPrice: 120,
- description: '石膏板吊顶,包含龙骨、石膏板、乳胶漆'
- },
- {
- category: '厨房',
- name: '厨房墙地砖',
- quantity: 1,
- unit: '㎡',
- unitPrice: 90,
- description: '防滑地砖、墙面瓷砖铺贴'
- },
- {
- category: '厨房',
- name: '橱柜定制',
- quantity: 1,
- unit: '延米',
- unitPrice: 1200,
- description: '包含地柜、吊柜、台面、五金配件'
- },
- {
- category: '卫生间',
- name: '卫生间防水',
- quantity: 1,
- unit: '㎡',
- unitPrice: 60,
- description: '聚氨酯防水涂料,包工包料'
- },
- {
- category: '卫生间',
- name: '卫浴洁具',
- quantity: 1,
- unit: '套',
- unitPrice: 2500,
- description: '马桶、洗手盆、花洒、龙头等'
- },
- {
- category: '卧室',
- name: '卧室地板',
- quantity: 1,
- unit: '㎡',
- unitPrice: 150,
- description: '复合地板,包含踢脚线安装'
- },
- {
- category: '卧室',
- name: '衣柜定制',
- quantity: 1,
- unit: '㎡',
- unitPrice: 800,
- description: '整体衣柜,包含五金配件'
- },
- {
- category: '水电改造',
- name: '水电改造',
- quantity: 1,
- unit: '项',
- unitPrice: 8000,
- description: '全屋水电线路改造,包含材料人工'
- }
- ];
- constructor() { }
- /**
- * 生成AI智能报价
- * @param params 报价参数
- * @returns 报价结果
- */
- generateQuotation(params: AIQuotationParams): Observable<AIQuotationResult> {
- // 模拟AI处理延迟
- return of(this.calculateQuotation(params)).pipe(
- delay(2000) // 模拟2秒的AI处理时间
- );
- }
- /**
- * 计算报价
- * @param params 报价参数
- * @returns 报价结果
- */
- private calculateQuotation(params: AIQuotationParams): AIQuotationResult {
- const { area, style, level, specialRequirements } = params;
-
- // 获取价格系数
- const styleMultiplier = this.styleMultipliers[style] || 1.0;
- const levelMultiplier = this.levelMultipliers[level] || 1.0;
-
- // 计算各项目数量和价格
- const items: AIQuotationItem[] = this.baseQuotationTemplate.map(template => {
- let quantity = area;
- let unitPrice = template.unitPrice * styleMultiplier * levelMultiplier;
-
- // 根据项目类型调整数量
- switch (template.category) {
- case '客餐厅':
- quantity = Math.round(area * 0.4); // 客餐厅占40%面积
- break;
- case '厨房':
- if (template.name.includes('橱柜')) {
- quantity = Math.round(area * 0.08); // 橱柜按延米计算
- } else {
- quantity = Math.round(area * 0.1); // 厨房占10%面积
- }
- break;
- case '卫生间':
- if (template.name.includes('洁具')) {
- quantity = Math.ceil(area / 50); // 每50㎡一套洁具
- } else {
- quantity = Math.round(area * 0.08); // 卫生间占8%面积
- }
- break;
- case '卧室':
- if (template.name.includes('衣柜')) {
- quantity = Math.round(area * 0.15); // 衣柜按投影面积
- } else {
- quantity = Math.round(area * 0.3); // 卧室占30%面积
- }
- break;
- case '水电改造':
- quantity = 1; // 水电改造按项目计算
- unitPrice = area * 80 * levelMultiplier; // 按面积计算水电改造费用
- break;
- }
-
- return {
- ...template,
- quantity: Math.max(1, quantity),
- unitPrice: Math.round(unitPrice)
- };
- });
- // 根据特殊需求调整报价
- if (specialRequirements) {
- this.adjustForSpecialRequirements(items, specialRequirements);
- }
- // 计算总金额
- const totalAmount = items.reduce((sum, item) => sum + (item.quantity * item.unitPrice), 0);
- // 生成建议
- const suggestions = this.generateSuggestions(params, totalAmount);
- return {
- items,
- totalAmount: Math.round(totalAmount),
- suggestions
- };
- }
- /**
- * 根据特殊需求调整报价
- * @param items 报价项目
- * @param specialRequirements 特殊需求
- */
- private adjustForSpecialRequirements(items: AIQuotationItem[], specialRequirements: string): void {
- const requirements = specialRequirements.toLowerCase();
-
- // 智能家居需求
- if (requirements.includes('智能') || requirements.includes('智能家居')) {
- items.push({
- category: '智能家居',
- name: '智能家居系统',
- quantity: 1,
- unit: '套',
- unitPrice: 15000,
- description: '包含智能开关、智能门锁、智能窗帘等'
- });
- }
- // 中央空调需求
- if (requirements.includes('中央空调') || requirements.includes('空调')) {
- items.push({
- category: '暖通设备',
- name: '中央空调系统',
- quantity: 1,
- unit: '套',
- unitPrice: 25000,
- description: '包含主机、管道、出风口等'
- });
- }
- // 地暖需求
- if (requirements.includes('地暖') || requirements.includes('采暖')) {
- items.push({
- category: '暖通设备',
- name: '地暖系统',
- quantity: 1,
- unit: '套',
- unitPrice: 18000,
- description: '包含地暖管道、分水器、温控器等'
- });
- }
- // 新风系统需求
- if (requirements.includes('新风') || requirements.includes('通风')) {
- items.push({
- category: '暖通设备',
- name: '新风系统',
- quantity: 1,
- unit: '套',
- unitPrice: 12000,
- description: '包含新风主机、管道、出风口等'
- });
- }
- // 定制家具需求
- if (requirements.includes('定制') || requirements.includes('家具')) {
- items.push({
- category: '定制家具',
- name: '全屋定制家具',
- quantity: 1,
- unit: '套',
- unitPrice: 30000,
- description: '包含鞋柜、电视柜、书柜等定制家具'
- });
- }
- }
- /**
- * 生成装修建议
- * @param params 报价参数
- * @param totalAmount 总金额
- * @returns 建议列表
- */
- private generateSuggestions(params: AIQuotationParams, totalAmount: number): string[] {
- const suggestions: string[] = [];
- const { area, style, level } = params;
-
- // 预算建议
- const budgetPerSqm = totalAmount / area;
- if (budgetPerSqm > 2000) {
- suggestions.push('当前预算较高,建议优化材料选择以控制成本');
- } else if (budgetPerSqm < 800) {
- suggestions.push('当前预算偏低,建议适当提升材料档次以保证质量');
- }
- // 风格建议
- if (style === '现代简约') {
- suggestions.push('现代简约风格注重功能性,建议选择简洁大方的材料和色彩');
- } else if (style === '中式风格') {
- suggestions.push('中式风格建议选用实木材料,注重对称和层次感');
- } else if (style === '北欧风格') {
- suggestions.push('北欧风格建议使用浅色系,注重自然光线和简约线条');
- }
- // 档次建议
- if (level === '经济型') {
- suggestions.push('经济型装修建议重点投入在基础工程,后期可逐步升级软装');
- } else if (level === '豪华型' || level === '奢华型') {
- suggestions.push('高端装修建议选择知名品牌材料,注重细节工艺和环保性能');
- }
- // 面积建议
- if (area < 60) {
- suggestions.push('小户型建议采用开放式设计,合理利用每一寸空间');
- } else if (area > 150) {
- suggestions.push('大户型建议做好功能分区,可考虑增加储物空间和休闲区域');
- }
- return suggestions;
- }
- /**
- * 获取装修风格列表
- * @returns 风格列表
- */
- getStyleOptions(): string[] {
- return Object.keys(this.styleMultipliers);
- }
- /**
- * 获取装修档次列表
- * @returns 档次列表
- */
- getLevelOptions(): string[] {
- return Object.keys(this.levelMultipliers);
- }
- }
|