123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483 |
- import { Injectable } from '@angular/core';
- import { Observable, of } from 'rxjs';
- import {
- Project,
- Task,
- RenderProgress,
- ModelCheckItem,
- CustomerFeedback,
- DesignerChange,
- Settlement,
- SkillTag,
- PerformanceData,
- MatchingOrder,
- ProjectStage
- } from '../models/project.model';
- // 材料统计数据接口
- interface MaterialStatistics {
- monthlyAdded: number;
- totalCostSaved: number;
- personalDownloads: number;
- }
- // 材料项接口
- interface MaterialItem {
- id: string;
- name: string;
- type: string;
- style: string;
- price: number;
- thumbnailUrl: string;
- downloadCount: number;
- tags: string[];
- costSaved: number;
- isNew: boolean;
- uploadTime: Date;
- }
- // 材料列表响应接口
- interface MaterialsResponse {
- materials: MaterialItem[];
- total: number;
- }
- // 异常历史记录接口
- interface ExceptionHistory {
- id: string;
- type: 'failed' | 'stuck' | 'quality' | 'other';
- description: string;
- submitTime: Date;
- status: '待处理' | '处理中' | '已解决';
- response?: string;
- }
- @Injectable({
- providedIn: 'root'
- })
- export class ProjectService {
- // 模拟数据 - 实际应用中应从API获取
- private projects: Project[] = [
- {
- id: '1',
- name: '现代风格客厅设计',
- customerName: '张三',
- customerTags: [
- { source: '朋友圈', needType: '硬装', preference: '现代', colorAtmosphere: '简约明亮' }
- ],
- highPriorityNeeds: ['需家具购买建议'],
- status: '进行中',
- currentStage: '建模',
- createdAt: new Date('2025-09-01'),
- deadline: new Date('2025-09-15'),
- assigneeId: 'designer1',
- assigneeName: '设计师A',
- skillsRequired: ['现代风格', '硬装']
- },
- {
- id: '2',
- name: '宋式风格卧室设计',
- customerName: '李四',
- customerTags: [
- { source: '信息流', needType: '软装', preference: '宋式', colorAtmosphere: '典雅古朴' }
- ],
- highPriorityNeeds: [],
- status: '进行中',
- currentStage: '渲染',
- createdAt: new Date('2025-09-02'),
- deadline: new Date('2025-09-20'),
- assigneeId: 'designer1',
- assigneeName: '设计师A',
- skillsRequired: ['宋式风格', '软装']
- },
- {
- id: '3',
- name: '欧式风格厨房设计',
- customerName: '王五',
- customerTags: [
- { source: '朋友圈', needType: '硬装', preference: '欧式', colorAtmosphere: '豪华温馨' }
- ],
- highPriorityNeeds: ['需快速交付'],
- status: '已完成',
- currentStage: '完成',
- createdAt: new Date('2025-08-20'),
- deadline: new Date('2025-09-05'),
- assigneeId: 'designer1',
- assigneeName: '设计师A',
- skillsRequired: ['欧式风格', '硬装']
- }
- ];
- private tasks: Task[] = [
- {
- id: 't1',
- projectId: '1',
- projectName: '现代风格客厅设计',
- title: '完成客厅建模',
- stage: '建模',
- deadline: new Date('2025-09-10'),
- isOverdue: false,
- isCompleted: false,
- priority: 'high',
- assignee: '设计师A',
- description: '根据客户需求完成客厅3D模型构建'
- },
- {
- id: 't2',
- projectId: '2',
- projectName: '宋式风格卧室设计',
- title: '确认渲染结果',
- stage: '渲染',
- deadline: new Date('2025-09-12'),
- isOverdue: false,
- isCompleted: false,
- priority: 'medium',
- assignee: '设计师B',
- description: '审核渲染效果并与客户确认'
- },
- {
- id: 't3',
- projectId: '1',
- projectName: '现代风格客厅设计',
- title: '处理客户反馈',
- stage: '后期',
- deadline: new Date('2025-09-08'),
- isOverdue: true,
- isCompleted: false,
- priority: 'high',
- assignee: '客服',
- description: '整理客户反馈意见并传达给设计团队'
- }
- ];
- private renderProgresses: RenderProgress[] = [
- {
- id: 'rp1',
- projectId: '2',
- completionRate: 60,
- estimatedTimeRemaining: 1,
- status: '进行中',
- updatedAt: new Date()
- }
- ];
- private modelCheckItems: ModelCheckItem[] = [
- { id: 'm1', name: '尺寸准确性', isPassed: true },
- { id: 'm2', name: '比例协调性', isPassed: true },
- { id: 'm3', name: '户型匹配度', isPassed: false, notes: '需调整沙发位置' }
- ];
- private feedbacks: CustomerFeedback[] = [
- {
- id: 'f1',
- projectId: '1',
- content: '客厅设计不太满意',
- isSatisfied: false,
- problemLocation: '沙发区域',
- expectedEffect: '更宽敞舒适',
- referenceCase: '提供了参考图片',
- status: '待处理',
- createdAt: new Date('2025-09-07')
- }
- ];
- private settlements: Settlement[] = [
- {
- id: 's1',
- projectId: '3',
- stage: '建模',
- amount: 3000,
- percentage: 30,
- status: '已结算',
- createdAt: new Date('2025-08-25'),
- settledAt: new Date('2025-09-01')
- },
- {
- id: 's2',
- projectId: '3',
- stage: '渲染',
- amount: 5000,
- percentage: 50,
- status: '已结算',
- createdAt: new Date('2025-08-28'),
- settledAt: new Date('2025-09-01')
- },
- {
- id: 's3',
- projectId: '3',
- stage: '后期',
- amount: 2000,
- percentage: 20,
- status: '已结算',
- createdAt: new Date('2025-09-02'),
- settledAt: new Date('2025-09-05')
- },
- {
- id: 's4',
- projectId: '1',
- stage: '建模',
- amount: 3000,
- percentage: 30,
- status: '待结算',
- createdAt: new Date('2025-09-06')
- }
- ];
- private skillTags: SkillTag[] = [
- { id: 'sk1', name: '现代风格', level: 5, count: 10 },
- { id: 'sk2', name: '宋式风格', level: 3, count: 5 },
- { id: 'sk3', name: '硬装', level: 5, count: 8 },
- { id: 'sk4', name: '软装', level: 3, count: 4 }
- ];
- private performanceData: PerformanceData[] = [
- { month: '2025-08', projectCompletionRate: 90, customerSatisfaction: 95, deliveryOnTimeRate: 85 },
- { month: '2025-09', projectCompletionRate: 85, customerSatisfaction: 90, deliveryOnTimeRate: 90 },
- { month: '2025-10', projectCompletionRate: 95, customerSatisfaction: 92, deliveryOnTimeRate: 88 }
- ];
- private matchingOrders: MatchingOrder[] = [
- {
- id: 'mo1',
- projectName: '新中式风格书房设计',
- requiredSkills: ['宋式风格', '硬装'],
- matchRate: 90,
- customerLevel: '优质'
- },
- {
- id: 'mo2',
- projectName: '北欧风格餐厅设计',
- requiredSkills: ['现代风格', '软装'],
- matchRate: 80,
- customerLevel: '普通'
- }
- ];
- // 获取当前设计师的项目列表
- getProjects(): Observable<Project[]> {
- return of(this.projects);
- }
- // 获取项目详情
- getProjectById(id: string): Observable<Project | undefined> {
- return of(this.projects.find(project => project.id === id));
- }
- // 获取待办任务
- getTasks(): Observable<Task[]> {
- return of(this.tasks);
- }
- // 标记任务完成
- markTaskAsCompleted(taskId: string): Observable<Task> {
- const task = this.tasks.find(t => t.id === taskId);
- if (task) {
- task.isCompleted = true;
- task.completedDate = new Date();
- }
- return of(task as Task);
- }
- // 获取渲染进度
- getRenderProgress(projectId: string): Observable<RenderProgress | undefined> {
- return of(this.renderProgresses.find(rp => rp.projectId === projectId));
- }
- // 获取模型检查清单
- getModelCheckItems(): Observable<ModelCheckItem[]> {
- return of(this.modelCheckItems);
- }
- // 更新模型检查项
- updateModelCheckItem(itemId: string, isPassed: boolean): Observable<ModelCheckItem> {
- const item = this.modelCheckItems.find(i => i.id === itemId);
- if (item) {
- item.isPassed = isPassed;
- }
- return of(item as ModelCheckItem);
- }
- // 获取客户反馈
- getCustomerFeedbacks(): Observable<CustomerFeedback[]> {
- return of(this.feedbacks);
- }
- // 更新反馈状态
- updateFeedbackStatus(feedbackId: string, status: '处理中' | '已解决'): Observable<CustomerFeedback> {
- const feedback = this.feedbacks.find(f => f.id === feedbackId);
- if (feedback) {
- feedback.status = status;
- feedback.updatedAt = new Date();
- }
- return of(feedback as CustomerFeedback);
- }
- // 获取结算记录
- getSettlements(): Observable<Settlement[]> {
- return of(this.settlements);
- }
- // 获取技能标签
- getSkillTags(): Observable<SkillTag[]> {
- return of(this.skillTags);
- }
- // 获取绩效数据
- getPerformanceData(): Observable<PerformanceData[]> {
- return of(this.performanceData);
- }
- // 获取匹配订单
- getMatchingOrders(): Observable<MatchingOrder[]> {
- return of(this.matchingOrders);
- }
- // 生成需求确认清单
- generateRequirementChecklist(projectId: string): Observable<string[]> {
- return of([
- '个性化需求已确认',
- '色彩氛围已确认',
- '硬装/软装范围已确认',
- '资料提交截止时间已确认'
- ]);
- }
- // 生成提醒话术
- generateReminderMessage(type: 'overdue' | 'stagnation'): Observable<string> {
- if (type === 'overdue') {
- return of('当前处于对图期,需1小时内回复,若您需时间梳理需求,可约定XX时间沟通');
- } else {
- return of('接下来将推进新项目,若需修改请提前1天预约');
- }
- }
- // 更新项目阶段
- updateProjectStage(projectId: string, stage: ProjectStage): Observable<Project | undefined> {
- const project = this.projects.find(p => p.id === projectId);
- if (project) {
- project.currentStage = stage;
- }
- return of(project);
- }
- // 获取材料统计数据
- getMaterialStatistics(): Observable<MaterialStatistics> {
- return of({
- monthlyAdded: 15,
- totalCostSaved: 2800,
- personalDownloads: 42
- });
- }
- // 获取异常历史记录
- getExceptionHistories(projectId: string): Observable<ExceptionHistory[]> {
- return of([
- {
- id: 'eh1',
- type: 'quality',
- description: '光线效果不符合预期',
- submitTime: new Date('2025-09-05'),
- status: '已解决',
- response: '已调整灯光参数'
- },
- {
- id: 'eh2',
- type: 'stuck',
- description: '沙发尺寸需要调整',
- submitTime: new Date('2025-09-07'),
- status: '待处理'
- }
- ]);
- }
- // 更新收藏材料状态
- updateFavoriteMaterial(materialId: string, isFavorite: boolean): Observable<void> {
- // 模拟API调用
- console.log(`${isFavorite ? '添加' : '取消'}材料收藏:`, materialId);
- return of(void 0);
- }
- // 获取收藏材料列表
- getFavoriteMaterials(): Observable<string[]> {
- // 模拟返回收藏的材料ID列表
- return of(['mat1', 'mat3', 'mat5']);
- }
- // 获取材料列表
- getMaterials(
- searchQuery: string = '',
- filterType: string = '',
- filterStyle: string = '',
- filterPrice: string = '',
- page: number = 1,
- pageSize: number = 10
- ): Observable<MaterialsResponse> {
- // 模拟材料数据
- const mockMaterials: MaterialItem[] = [
- { id: 'mat1', name: '现代风格沙发', type: '家具', style: '现代', price: 2800, thumbnailUrl: 'https://picsum.photos/200/150', downloadCount: 120, tags: ['现代', '舒适', '客厅', '布艺'], costSaved: 500, isNew: false, uploadTime: new Date('2025-08-15') },
- { id: 'mat2', name: '宋式风格茶几', type: '家具', style: '宋式', price: 1500, thumbnailUrl: 'https://picsum.photos/200/151', downloadCount: 85, tags: ['宋式', '古典', '实木', '客厅'], costSaved: 300, isNew: true, uploadTime: new Date('2025-09-07') },
- { id: 'mat3', name: '欧式吊灯', type: '灯具', style: '欧式', price: 2200, thumbnailUrl: 'https://picsum.photos/200/152', downloadCount: 150, tags: ['欧式', '奢华', '客厅', '水晶'], costSaved: 450, isNew: false, uploadTime: new Date('2025-08-20') },
- { id: 'mat4', name: '中式地毯', type: '纺织品', style: '中式', price: 1800, thumbnailUrl: 'https://picsum.photos/200/153', downloadCount: 95, tags: ['中式', '传统', '卧室', '羊毛'], costSaved: 350, isNew: false, uploadTime: new Date('2025-08-25') },
- { id: 'mat5', name: '北欧风格窗帘', type: '纺织品', style: '北欧', price: 1200, thumbnailUrl: 'https://picsum.photos/200/154', downloadCount: 130, tags: ['北欧', '简约', '卧室', '亚麻'], costSaved: 250, isNew: true, uploadTime: new Date('2025-09-05') }
- ];
-
- // 简单的搜索和过滤逻辑
- let filtered = [...mockMaterials];
- if (searchQuery) {
- filtered = filtered.filter(m => m.name.toLowerCase().includes(searchQuery.toLowerCase()));
- }
- if (filterType) {
- filtered = filtered.filter(m => m.type === filterType);
- }
- if (filterStyle) {
- filtered = filtered.filter(m => m.style === filterStyle);
- }
-
- // 分页
- const startIndex = (page - 1) * pageSize;
- const paginated = filtered.slice(startIndex, startIndex + pageSize);
-
- return of({ materials: paginated, total: filtered.length });
- }
- // 记录材料下载
- recordMaterialDownload(materialId: string): Observable<void> {
- // 模拟下载记录
- console.log('记录材料下载:', materialId);
- return of(void 0);
- }
- // 创建项目
- createProject(projectData: {
- customerId: string;
- customerName: string;
- requirement: any;
- referenceCases: any[];
- tags: {
- demandType?: string;
- preferenceTags?: string[];
- followUpStatus?: string;
- };
- }): Observable<{ success: boolean; projectId: string }> {
- // 模拟API调用
- console.log('创建项目:', projectData);
- // 模拟返回创建的项目ID
- return of({ success: true, projectId: 'new-project-' + Date.now() });
- }
- // 创建项目群
- createProjectGroup(groupData: {
- customerId: string;
- customerName: string;
- tags?: {
- demandType?: string;
- preferenceTags?: string[];
- followUpStatus?: string;
- };
- }): Observable<{ success: boolean; groupId: string }> {
- // 模拟API调用
- console.log('创建项目群:', groupData);
- // 模拟返回创建的群组ID
- return of({ success: true, groupId: 'new-group-' + Date.now() });
- }
- }
|