# 유지보수 업무 요청/처리 관리 작업계획서 > 작성일: 2026-01-10 > 예상 기간: 5~7일 > 우선순위: 3 --- ## 1. 기능 개요 ### 1.1 핵심 컨셉 - 기존 엑셀/구글시트로 관리하던 유지보수 업무를 시스템화 - **AI가 다양한 양식의 파일을 파싱** → 표준 형식으로 변환 - 파싱 결과를 사용자가 검토/수정 후 등록 - 처리 완료/진행중 업무 → **주간보고 실적 자동 반영** ### 1.2 플로우 ``` [엑셀/구글시트 파일 업로드] ↓ 🤖 AI 파싱 (다양한 양식 → 표준 형식) ↓ [검토 화면에 로드] (사용자가 확인/수정) ↓ [등록] ↓ [상태 관리: 미진행→진행중→완료] ↓ [주간보고 작성 시] ↓ 🤖 완료/진행중 업무 → 실적 자동 작성 (유사 실적 있으면 AI가 병합) ``` ### 1.3 결정 사항 | # | 항목 | 결정 | |:-:|------|:----:| | 1 | 데이터 소스 | 엑셀/구글시트 파일 업로드 | | 2 | 양식 | 통일 안됨 → AI 파싱 | | 3 | 파싱 결과 | 검토 화면에서 사용자 확인 후 등록 | | 4 | 주간보고 연계 | 완료/진행중 → 실적 자동 작성, 유사 건 병합 | --- ## 2. 데이터 모델 ### 2.1 유지보수 업무 테이블 (wr_maintenance_task) ```sql CREATE TABLE wr_maintenance_task ( task_id SERIAL PRIMARY KEY, -- 프로젝트/사업 연결 project_id INTEGER REFERENCES wr_project_info(project_id), business_id INTEGER REFERENCES wr_business(business_id), -- 요청 정보 request_date DATE NOT NULL, -- 접수일자 task_title VARCHAR(300) NOT NULL, -- 제목 task_content TEXT, -- 내용 requester_name VARCHAR(50), -- 요청자 priority VARCHAR(20) DEFAULT 'MEDIUM', -- 우선순위: HIGH/MEDIUM/LOW -- 처리 정보 assignee_id INTEGER REFERENCES wr_employee_info(employee_id), -- 담당자 task_status VARCHAR(20) DEFAULT 'PENDING', -- 상태 -- PENDING: 미진행, IN_PROGRESS: 진행중, COMPLETED: 완료 completed_date DATE, -- 작업완료일자 -- 반영 여부 is_dev_deployed BOOLEAN DEFAULT false, -- 개발서버 반영 dev_deployed_date DATE, is_prod_deployed BOOLEAN DEFAULT false, -- 운영서버 반영 prod_deployed_date DATE, is_customer_confirmed BOOLEAN DEFAULT false, -- 고객 확인 customer_confirmed_date DATE, -- 주간보고 연계 linked_report_id INTEGER REFERENCES wr_weekly_report(report_id), linked_task_id INTEGER REFERENCES wr_weekly_report_task(task_id), -- 업로드 출처 upload_batch_id INTEGER, -- 일괄 업로드 시 배치 ID source_row_number INTEGER, -- 원본 파일 행 번호 -- 메타 author_id INTEGER NOT NULL REFERENCES wr_employee_info(employee_id), created_at TIMESTAMP DEFAULT NOW(), updated_at TIMESTAMP DEFAULT NOW(), created_ip VARCHAR(50), created_email VARCHAR(100), updated_ip VARCHAR(50), updated_email VARCHAR(100) ); -- 인덱스 CREATE INDEX idx_maint_project ON wr_maintenance_task(project_id); CREATE INDEX idx_maint_business ON wr_maintenance_task(business_id); CREATE INDEX idx_maint_status ON wr_maintenance_task(task_status); CREATE INDEX idx_maint_assignee ON wr_maintenance_task(assignee_id); CREATE INDEX idx_maint_request_date ON wr_maintenance_task(request_date); CREATE INDEX idx_maint_completed_date ON wr_maintenance_task(completed_date); ``` ### 2.2 업로드 배치 테이블 (wr_maintenance_upload_batch) ```sql CREATE TABLE wr_maintenance_upload_batch ( batch_id SERIAL PRIMARY KEY, -- 파일 정보 file_name VARCHAR(200) NOT NULL, file_type VARCHAR(20), -- EXCEL, GOOGLE_SHEET -- 처리 결과 total_rows INTEGER, -- 전체 행 수 parsed_rows INTEGER, -- 파싱 성공 registered_rows INTEGER, -- 등록 완료 skipped_rows INTEGER, -- 스킵 (중복 등) -- AI 파싱 원본 ai_parsed_json TEXT, -- AI 파싱 결과 원본 -- 메타 uploaded_by INTEGER NOT NULL REFERENCES wr_employee_info(employee_id), uploaded_at TIMESTAMP DEFAULT NOW() ); ``` --- ## 3. API 설계 ### 3.1 유지보수 업무 API | Method | Endpoint | 설명 | |--------|----------|------| | GET | /api/maintenance/list | 업무 목록 조회 (필터: 상태, 기간, 프로젝트) | | GET | /api/maintenance/[id]/detail | 업무 상세 조회 | | POST | /api/maintenance/create | 업무 직접 등록 | | PUT | /api/maintenance/[id]/update | 업무 수정 | | PUT | /api/maintenance/[id]/status | 상태 변경 | | DELETE | /api/maintenance/[id]/delete | 업무 삭제 | ### 3.2 파일 업로드/AI 파싱 API | Method | Endpoint | 설명 | |--------|----------|------| | POST | /api/maintenance/upload/parse | 파일 업로드 → AI 파싱 | | POST | /api/maintenance/upload/register | 파싱 결과 검토 후 일괄 등록 | | GET | /api/maintenance/upload/history | 업로드 이력 조회 | ### 3.3 통계 API | Method | Endpoint | 설명 | |--------|----------|------| | GET | /api/maintenance/stats/weekly | 주간 통계 (요청/처리 건수) | | GET | /api/maintenance/stats/by-project | 프로젝트별 통계 | | GET | /api/maintenance/stats/by-assignee | 담당자별 통계 | ### 3.4 주간보고 연계 API | Method | Endpoint | 설명 | |--------|----------|------| | GET | /api/maintenance/for-report | 주간보고용 업무 목록 (완료/진행중) | | POST | /api/maintenance/link-to-report | 업무 → 주간보고 실적 연계 | --- ## 4. 화면 설계 ### 4.1 유지보수 업무 목록 (/maintenance) ``` ┌─────────────────────────────────────────────────────────────────┐ │ 유지보수 업무 관리 [파일 업로드] [+ 직접등록] │ ├─────────────────────────────────────────────────────────────────┤ │ 프로젝트: [전체 ▼] 상태: [전체 ▼] 기간: [____] ~ [____] │ ├─────────────────────────────────────────────────────────────────┤ │ │ │ 📊 이번 주 현황: 요청 12건 | 완료 8건 | 진행중 3건 | 미진행 1건 │ │ │ ├─────────────────────────────────────────────────────────────────┤ │ 접수일 | 제목 | 요청자 | 담당자 | 상태 | 반영 │ │ ────────────────────────────────────────────────────────────── │ │ 01/10 | 로그인 오류 수정 | 김담당 | 조효성 | ✅완료 | 🟢🟢🟢 │ │ 01/09 | 보고서 양식 변경 | 박과장 | 서혜원 | 🔄진행 | 🟢⚪⚪ │ │ 01/09 | 엑셀 다운로드 추가 | 김담당 | - | ⏳미진행| ⚪⚪⚪ │ │ 01/08 | 대시보드 통계 오류 | 이대리 | 조효성 | ✅완료 | 🟢🟢🟢 │ │ ... │ └─────────────────────────────────────────────────────────────────┘ * 반영: 개발/운영/고객확인 (🟢완료 ⚪미완료) ``` ### 4.2 파일 업로드 → AI 파싱 (/maintenance/upload) ``` ┌─────────────────────────────────────────────────────────────────┐ │ 유지보수 업무 파일 업로드 │ ├─────────────────────────────────────────────────────────────────┤ │ │ │ ┌───────────────────────────────────────────────────────────┐ │ │ │ │ │ │ │ 📁 엑셀 또는 구글시트 파일을 드래그하세요 │ │ │ │ │ │ │ │ [파일 선택] │ │ │ │ │ │ │ │ 지원 형식: .xlsx, .xls, .csv │ │ │ │ │ │ │ └───────────────────────────────────────────────────────────┘ │ │ │ │ 프로젝트: [PIMS 유지보수 ▼] ← 기본 프로젝트 선택 │ │ │ │ [업로드 및 분석] │ └─────────────────────────────────────────────────────────────────┘ ↓ AI 파싱 중... ↓ ┌─────────────────────────────────────────────────────────────────┐ │ 🤖 AI 분석 결과 [전체선택] [등록] │ ├─────────────────────────────────────────────────────────────────┤ │ 파일: 유지보수현황_202601.xlsx │ │ 분석: 15건 감지 (신규 12건, 중복 3건) │ ├─────────────────────────────────────────────────────────────────┤ │ │ │ ☑ #1 (신규) │ │ ┌─────────────────────────────────────────────────────────────┐ │ │ │ 접수일: 2026-01-10 요청자: 김담당 │ │ │ │ 제목: [로그인 오류 수정__________________________] │ │ │ │ 내용: [세션 만료 후 재로그인 시 오류 발생________] │ │ │ │ 우선순위: [높음 ▼] 담당자: [조효성 ▼] 상태: [완료 ▼] │ │ │ │ 완료일: [2026-01-10] │ │ │ │ 반영: ☑개발 ☑운영 ☑고객확인 │ │ │ └─────────────────────────────────────────────────────────────┘ │ │ │ │ ☑ #2 (신규) │ │ ┌─────────────────────────────────────────────────────────────┐ │ │ │ 접수일: 2026-01-09 요청자: 박과장 │ │ │ │ 제목: [보고서 양식 변경__________________________] │ │ │ │ ... │ │ │ └─────────────────────────────────────────────────────────────┘ │ │ │ │ ☐ #3 (⚠️ 중복 - 기존 건과 유사) │ │ ┌─────────────────────────────────────────────────────────────┐ │ │ │ 제목: 로그인 문제 수정 │ │ │ │ 💡 유사 건: #1234 "로그인 오류 수정" (01/10 등록) │ │ │ │ [병합] [별도 등록] [스킵] │ │ │ └─────────────────────────────────────────────────────────────┘ │ │ │ │ [선택 항목 등록 (10건)] │ └─────────────────────────────────────────────────────────────────┘ ``` ### 4.3 업무 상세/수정 (/maintenance/[id]) ``` ┌─────────────────────────────────────────────────────────────────┐ │ 유지보수 업무 상세 [수정] [삭제] │ ├─────────────────────────────────────────────────────────────────┤ │ 프로젝트: PIMS 유지보수 │ │ 접수일: 2026-01-10 │ │ 요청자: 김담당 (고객사) │ ├─────────────────────────────────────────────────────────────────┤ │ 제목: 로그인 오류 수정 │ │ 우선순위: 🔴 높음 │ ├─────────────────────────────────────────────────────────────────┤ │ 내용: │ │ 세션 만료 후 재로그인 시 "잘못된 요청입니다" 오류 발생 │ │ 크롬 브라우저에서만 발생, IE는 정상 │ ├─────────────────────────────────────────────────────────────────┤ │ 📋 처리 현황 │ │ ─────────────────────────────────────────────────────────────── │ │ 담당자: 조효성 │ │ 상태: ✅ 완료 (2026-01-10) │ │ │ │ ☑ 개발서버 반영 (2026-01-10) │ │ ☑ 운영서버 반영 (2026-01-10) │ │ ☑ 고객 확인 (2026-01-10) │ ├─────────────────────────────────────────────────────────────────┤ │ 🔗 주간보고 연계 │ │ ─────────────────────────────────────────────────────────────── │ │ 연계됨: 2026년 2주차 주간보고 - 조효성 │ │ "PIMS 로그인 세션 오류 수정 (2h)" │ └─────────────────────────────────────────────────────────────────┘ ``` ### 4.4 주간보고 작성 시 연계 ``` ┌─────────────────────────────────────────────────────────────────┐ │ 💡 이번 주 처리한 유지보수 업무가 있습니다 │ ├─────────────────────────────────────────────────────────────────┤ │ │ │ ☑ 로그인 오류 수정 (완료, 01/10) │ │ → 실적 추가: "PIMS 로그인 세션 오류 수정" │ │ → 예상 시간: [2]시간 │ │ │ │ ☑ 대시보드 통계 오류 (완료, 01/08) │ │ → 실적 추가: "대시보드 월별 통계 쿼리 수정" │ │ → 예상 시간: [1]시간 │ │ │ │ ☐ 보고서 양식 변경 (진행중) │ │ → 실적 추가 안함 (진행중은 선택) │ │ │ │ ─────────────────────────────────────────────────────────────── │ │ ⚠️ 유사한 기존 실적이 있습니다: │ │ │ │ "로그인 오류 수정" ↔ 기존: "PIMS 인증 버그 수정 (1h)" │ │ [병합 (3h로 합산)] [별도 유지] [기존 건에 추가] │ │ │ │ [선택 항목 실적에 추가] │ └─────────────────────────────────────────────────────────────────┘ ``` ### 4.5 통계 대시보드 (/maintenance/stats) ``` ┌─────────────────────────────────────────────────────────────────┐ │ 📊 유지보수 업무 통계 │ ├─────────────────────────────────────────────────────────────────┤ │ 기간: [2026-01 ▼] 프로젝트: [전체 ▼] │ ├─────────────────────────────────────────────────────────────────┤ │ │ │ 이번 달 현황 │ │ ┌──────────┬──────────┬──────────┬──────────┐ │ │ │ 총 요청 │ 완료 │ 진행중 │ 미진행 │ │ │ │ 45건 │ 32건 │ 8건 │ 5건 │ │ │ │ │ (71%) │ (18%) │ (11%) │ │ │ └──────────┴──────────┴──────────┴──────────┘ │ │ │ │ 주간 추이 (최근 4주) │ │ ┌─────────────────────────────────────────────────────────┐ │ │ │ 12 ████████████ │ │ │ │ 10 ██████████ ████████ │ │ │ │ 8 ████████ ██████ ████████████ │ │ │ │ 6 ██████ ████ ██████████ │ │ │ │ ────────────────────────────────── │ │ │ │ 1주차 2주차 3주차 4주차 │ │ │ │ ■ 요청 ■ 완료 │ │ │ └─────────────────────────────────────────────────────────┘ │ │ │ │ 담당자별 처리 현황 │ │ ───────────────────────────────────────────────────────────── │ │ 조효성: ████████████████ 18건 │ │ 서혜원: ████████████ 14건 │ │ 미배정: ████ 5건 │ │ │ │ 평균 처리 시간: 1.8일 │ │ SLA 준수율: 92% (24시간 내 완료 기준) │ │ │ └─────────────────────────────────────────────────────────────────┘ ``` --- ## 5. AI 프롬프트 설계 ### 5.1 파일 파싱 프롬프트 ``` 당신은 엑셀/CSV 파일에서 유지보수 업무 데이터를 추출하는 전문가입니다. 다양한 양식의 파일에서 아래 표준 형식으로 데이터를 변환해주세요. ## 입력 데이터 {file_content_as_text} ## 추출할 필드 - request_date: 접수일자 (YYYY-MM-DD) - title: 제목/요약 - content: 상세 내용 - requester: 요청자 - priority: 우선순위 (HIGH/MEDIUM/LOW, 긴급/높음→HIGH, 보통/일반→MEDIUM, 낮음→LOW) - assignee: 담당자 - status: 상태 (PENDING/IN_PROGRESS/COMPLETED) - 미진행/대기/접수 → PENDING - 진행/진행중/처리중 → IN_PROGRESS - 완료/종료/해결 → COMPLETED - completed_date: 완료일자 (있는 경우) - is_dev_deployed: 개발 반영 여부 (true/false) - is_prod_deployed: 운영 반영 여부 (true/false) - is_customer_confirmed: 고객 확인 여부 (true/false) ## 출력 형식 (JSON) { "parsed_rows": [ { "row_number": 1, "request_date": "2026-01-10", "title": "로그인 오류 수정", "content": "세션 만료 후 재로그인 시 오류", "requester": "김담당", "priority": "HIGH", "assignee": "조효성", "status": "COMPLETED", "completed_date": "2026-01-10", "is_dev_deployed": true, "is_prod_deployed": true, "is_customer_confirmed": true, "confidence": 0.95, "parse_notes": "정상 파싱" } ], "summary": { "total_rows": 15, "parsed_successfully": 14, "parse_failed": 1, "notes": "1행은 헤더로 스킵" } } ## 규칙 1. 헤더 행은 자동 감지하여 스킵 2. 빈 행은 스킵 3. 날짜는 다양한 형식 인식 (01/10, 2026.01.10, 1월10일 등) 4. 상태/우선순위는 유사 표현 매핑 5. 파싱 불확실한 필드는 confidence 낮게, parse_notes에 이유 기재 6. JSON 외 다른 텍스트 출력 금지 ``` ### 5.2 중복/유사 건 감지 프롬프트 ``` 당신은 유지보수 업무의 중복/유사 건을 판단하는 전문가입니다. ## 신규 업무 - 제목: {new_title} - 내용: {new_content} - 접수일: {new_date} ## 기존 업무 목록 {existing_tasks_json} ## 판단 기준 1. 제목이 80% 이상 유사하면 중복 의심 2. 내용의 핵심 키워드가 동일하면 중복 의심 3. 같은 날짜에 동일 요청자가 등록한 유사 건은 중복 가능성 높음 ## 출력 형식 (JSON) { "is_duplicate": true, "similar_task_id": 1234, "similarity_score": 0.85, "reason": "제목과 내용이 85% 유사, 동일 요청자", "recommendation": "MERGE | SKIP | REGISTER_SEPARATE" } ``` ### 5.3 주간보고 실적 생성 프롬프트 ``` 당신은 유지보수 업무를 주간보고 실적으로 변환하는 전문가입니다. ## 이번 주 처리 업무 {maintenance_tasks_json} ## 기존 주간보고 실적 {existing_report_tasks_json} ## 작업 1. 각 유지보수 업무를 주간보고 실적 문장으로 변환 2. 기존 실적 중 유사한 것이 있으면 병합 제안 3. 예상 소요 시간 추정 ## 출력 형식 (JSON) { "generated_tasks": [ { "maintenance_task_id": 123, "report_description": "PIMS 로그인 세션 오류 수정", "estimated_hours": 2, "similar_existing": { "task_id": 456, "description": "PIMS 인증 버그 수정", "merge_recommendation": "MERGE | KEEP_SEPARATE", "merged_description": "PIMS 로그인/인증 오류 수정", "merged_hours": 3 } } ] } ``` --- ## 6. 작업 일정 ### Phase 1: 기본 CRUD (2일) - [ ] 시작: - [ ] 완료: - [ ] 소요시간: **작업 내용:** - [ ] DB 테이블 생성 (wr_maintenance_task, wr_maintenance_upload_batch) - [ ] 유지보수 업무 CRUD API - [ ] 업무 목록/상세/등록/수정 화면 - [ ] 상태 변경 기능 --- ### Phase 2: 파일 업로드 + AI 파싱 (2일) - [ ] 시작: - [ ] 완료: - [ ] 소요시간: **작업 내용:** - [ ] 파일 업로드 API (엑셀/CSV) - [ ] AI 파싱 프롬프트 구현 - [ ] 파싱 결과 검토 화면 - [ ] 중복 감지 로직 - [ ] 일괄 등록 기능 --- ### Phase 3: 주간보고 연계 (2일) - [ ] 시작: - [ ] 완료: - [ ] 소요시간: **작업 내용:** - [ ] 주간보고 작성 시 유지보수 업무 조회 - [ ] AI 실적 문장 생성 - [ ] 유사 실적 병합 기능 - [ ] 연계 정보 저장 --- ### Phase 4: 통계 + 테스트 (1일) - [ ] 시작: - [ ] 완료: - [ ] 소요시간: **작업 내용:** - [ ] 통계 API (주간/월간/담당자별) - [ ] 통계 대시보드 화면 - [ ] 전체 테스트 및 버그 수정 --- ## 작업 완료 결과 ### Phase별 작업 시간 | Phase | 작업 내용 | 시작 | 완료 | 소요시간 | |:-----:|----------|:----:|:----:|:--------:| | 1 | 기본 CRUD | - | - | - | | 2 | 파일 업로드 + AI 파싱 | - | - | - | | 3 | 주간보고 연계 | - | - | - | | 4 | 통계 + 테스트 | - | - | - | | | | | **총 소요시간** | **-** | --- ### 생성/수정된 파일 | 구분 | 파일 | 작업 | |------|------|:----:| | **DB** | wr_maintenance_task | 신규 테이블 | | **DB** | wr_maintenance_upload_batch | 신규 테이블 | | **API** | backend/api/maintenance/*.ts | 신규 | | **API** | backend/api/maintenance/upload/*.ts | 신규 | | **API** | backend/api/maintenance/stats/*.ts | 신규 | | **Frontend** | frontend/pages/maintenance/*.vue | 신규 | | **Frontend** | frontend/pages/report/weekly/write.vue | 수정 | | **Utils** | backend/utils/openai.ts | 수정 (프롬프트 추가) | | **Utils** | backend/utils/excel-parser.ts | 신규 | --- ## 7. 기술 스택 - **Backend**: Nitro (H3) + PostgreSQL - **Frontend**: Nuxt3 + Vue3 + Bootstrap 5 - **파일 처리**: SheetJS (xlsx) - **AI**: OpenAI GPT-4o-mini (파싱, 중복감지, 실적생성) - **인증**: 기존 세션 기반 (requireAuth) --- ## 8. 향후 확장 고려 1. **구글 시트 직접 연동**: URL 입력 → API로 직접 읽기 2. **알림 기능**: 긴급 건 등록 시 담당자 알림 3. **SLA 관리**: 처리 기한 설정 및 초과 알림 4. **고객 포털**: 고객이 직접 요청 등록/상태 조회 5. **월간 보고서**: 월별 유지보수 현황 자동 생성