@dssp/supervision 1.0.0-alpha.4 → 1.0.0-alpha.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist-client/pages/building-inspection/building-inspection-list.js +2 -1
- package/dist-client/pages/building-inspection/building-inspection-list.js.map +1 -1
- package/dist-client/pages/building-inspection/component/inspection-event-provider.js +3 -3
- package/dist-client/pages/building-inspection/component/inspection-event-provider.js.map +1 -1
- package/dist-client/pages/building-inspection/inspection-create-popup.js +5 -4
- package/dist-client/pages/building-inspection/inspection-create-popup.js.map +1 -1
- package/dist-client/pages/building-inspection-grid/building-inspection-grid-detail.d.ts +46 -0
- package/dist-client/pages/building-inspection-grid/building-inspection-grid-detail.js +930 -0
- package/dist-client/pages/building-inspection-grid/building-inspection-grid-detail.js.map +1 -0
- package/dist-client/pages/building-inspection-grid/component/grid-inspection-create-popup.d.ts +2 -0
- package/dist-client/pages/building-inspection-grid/component/grid-inspection-create-popup.js +734 -0
- package/dist-client/pages/building-inspection-grid/component/grid-inspection-create-popup.js.map +1 -0
- package/dist-client/pages/building-inspection-grid/component/notice-comment-popup.d.ts +1 -0
- package/dist-client/pages/building-inspection-grid/component/notice-comment-popup.js +304 -0
- package/dist-client/pages/building-inspection-grid/component/notice-comment-popup.js.map +1 -0
- package/dist-client/pages/building-inspection-grid/component/plan-preview-popup.d.ts +15 -0
- package/dist-client/pages/building-inspection-grid/component/plan-preview-popup.js +430 -0
- package/dist-client/pages/building-inspection-grid/component/plan-preview-popup.js.map +1 -0
- package/dist-client/pages/checklist/checklist-view.d.ts +2 -0
- package/dist-client/pages/checklist/checklist-view.js +286 -185
- package/dist-client/pages/checklist/checklist-view.js.map +1 -1
- package/dist-client/pages/checklist-template/checklist-template-item.js +8 -3
- package/dist-client/pages/checklist-template/checklist-template-item.js.map +1 -1
- package/dist-client/pages/checklist-template/checklist-template-list.js +1 -1
- package/dist-client/pages/checklist-template/checklist-template-list.js.map +1 -1
- package/dist-client/route.d.ts +1 -1
- package/dist-client/route.js +3 -0
- package/dist-client/route.js.map +1 -1
- package/dist-client/stt/speech-to-text.d.ts +36 -0
- package/dist-client/stt/speech-to-text.js +89 -0
- package/dist-client/stt/speech-to-text.js.map +1 -0
- package/dist-client/stt/stt-utils.d.ts +28 -0
- package/dist-client/stt/stt-utils.js +146 -0
- package/dist-client/stt/stt-utils.js.map +1 -0
- package/dist-client/tsconfig.tsbuildinfo +1 -1
- package/dist-server/service/action-plan/index.d.ts +0 -1
- package/dist-server/service/action-plan/index.js +1 -2
- package/dist-server/service/action-plan/index.js.map +1 -1
- package/dist-server/service/building-inspection/building-inspection-mutation.d.ts +1 -0
- package/dist-server/service/building-inspection/building-inspection-mutation.js +83 -10
- package/dist-server/service/building-inspection/building-inspection-mutation.js.map +1 -1
- package/dist-server/service/building-inspection/building-inspection-query.d.ts +2 -1
- package/dist-server/service/building-inspection/building-inspection-query.js +31 -2
- package/dist-server/service/building-inspection/building-inspection-query.js.map +1 -1
- package/dist-server/service/building-inspection/building-inspection-type.d.ts +5 -2
- package/dist-server/service/building-inspection/building-inspection-type.js +16 -4
- package/dist-server/service/building-inspection/building-inspection-type.js.map +1 -1
- package/dist-server/service/building-inspection/building-inspection.d.ts +9 -0
- package/dist-server/service/building-inspection/building-inspection.js +40 -2
- package/dist-server/service/building-inspection/building-inspection.js.map +1 -1
- package/dist-server/service/building-inspection/index.d.ts +2 -4
- package/dist-server/service/building-inspection/index.js +2 -4
- package/dist-server/service/building-inspection/index.js.map +1 -1
- package/dist-server/service/checklist/checklist-history.d.ts +8 -0
- package/dist-server/service/checklist/checklist-history.js +36 -0
- package/dist-server/service/checklist/checklist-history.js.map +1 -1
- package/dist-server/service/checklist/checklist.d.ts +10 -0
- package/dist-server/service/checklist/checklist.js +45 -3
- package/dist-server/service/checklist/checklist.js.map +1 -1
- package/dist-server/service/checklist/index.d.ts +0 -2
- package/dist-server/service/checklist/index.js +1 -3
- package/dist-server/service/checklist/index.js.map +1 -1
- package/dist-server/service/checklist-item-comment/index.d.ts +0 -2
- package/dist-server/service/checklist-item-comment/index.js +1 -3
- package/dist-server/service/checklist-item-comment/index.js.map +1 -1
- package/dist-server/service/checklist-template-item/checklist-template-item.js +2 -4
- package/dist-server/service/checklist-template-item/checklist-template-item.js.map +1 -1
- package/dist-server/service/index.d.ts +0 -1
- package/dist-server/service/index.js +1 -11
- package/dist-server/service/index.js.map +1 -1
- package/dist-server/service/issue/index.d.ts +0 -1
- package/dist-server/service/issue/index.js +1 -2
- package/dist-server/service/issue/index.js.map +1 -1
- package/dist-server/service/project-report/index.d.ts +0 -1
- package/dist-server/service/project-report/index.js +1 -2
- package/dist-server/service/project-report/index.js.map +1 -1
- package/dist-server/service/supervisor/index.d.ts +0 -1
- package/dist-server/service/supervisor/index.js +1 -2
- package/dist-server/service/supervisor/index.js.map +1 -1
- package/dist-server/tsconfig.tsbuildinfo +1 -1
- package/package.json +13 -13
- package/things-factory.config.js +3 -1
- package/dist-server/service/building-inspection/event-subscriber.d.ts +0 -7
- package/dist-server/service/building-inspection/event-subscriber.js +0 -21
- package/dist-server/service/building-inspection/event-subscriber.js.map +0 -1
- package/dist-server/service/checklist/event-subscriber.d.ts +0 -7
- package/dist-server/service/checklist/event-subscriber.js +0 -21
- package/dist-server/service/checklist/event-subscriber.js.map +0 -1
- package/dist-server/service/checklist-item-comment/event-subscriber.d.ts +0 -7
- package/dist-server/service/checklist-item-comment/event-subscriber.js +0 -21
- package/dist-server/service/checklist-item-comment/event-subscriber.js.map +0 -1
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
// stt-utils.ts
|
|
2
|
+
// 음성 인식 텍스트를 체크리스트 명령으로 해석하는 유틸리티
|
|
3
|
+
/**
|
|
4
|
+
* 한글 숫자 → 아라비아 숫자 변환 맵
|
|
5
|
+
*/
|
|
6
|
+
export const hangulDigits = {
|
|
7
|
+
일: '1',
|
|
8
|
+
이: '2',
|
|
9
|
+
삼: '3',
|
|
10
|
+
사: '4',
|
|
11
|
+
오: '5',
|
|
12
|
+
육: '6',
|
|
13
|
+
륙: '6',
|
|
14
|
+
칠: '7',
|
|
15
|
+
팔: '8',
|
|
16
|
+
구: '9',
|
|
17
|
+
십: '10',
|
|
18
|
+
십일: '11',
|
|
19
|
+
열하나: '11',
|
|
20
|
+
십이: '12',
|
|
21
|
+
열둘: '12',
|
|
22
|
+
십삼: '13',
|
|
23
|
+
열셋: '13',
|
|
24
|
+
십사: '14',
|
|
25
|
+
열넷: '14',
|
|
26
|
+
십오: '15',
|
|
27
|
+
열다섯: '15',
|
|
28
|
+
십육: '16',
|
|
29
|
+
열여섯: '16',
|
|
30
|
+
십칠: '17',
|
|
31
|
+
열일곱: '17',
|
|
32
|
+
십팔: '18',
|
|
33
|
+
열여덟: '18',
|
|
34
|
+
십구: '19',
|
|
35
|
+
열아홉: '19',
|
|
36
|
+
이십: '20',
|
|
37
|
+
스물: '20'
|
|
38
|
+
};
|
|
39
|
+
/**
|
|
40
|
+
* 음성 인식 오인식 보정 맵
|
|
41
|
+
*/
|
|
42
|
+
export const misheardMap = {
|
|
43
|
+
일번: '1번',
|
|
44
|
+
일본: '1번',
|
|
45
|
+
이번: '2번',
|
|
46
|
+
삼번: '3번',
|
|
47
|
+
사번: '4번',
|
|
48
|
+
오번: '5번',
|
|
49
|
+
육번: '6번',
|
|
50
|
+
륙번: '6번',
|
|
51
|
+
칠번: '7번',
|
|
52
|
+
팔번: '8번',
|
|
53
|
+
구번: '9번',
|
|
54
|
+
십번: '10번',
|
|
55
|
+
십일번: '11번',
|
|
56
|
+
열하나번: '11번',
|
|
57
|
+
십이번: '12번',
|
|
58
|
+
열둘번: '12번',
|
|
59
|
+
십삼번: '13번',
|
|
60
|
+
열셋번: '13번',
|
|
61
|
+
십사번: '14번',
|
|
62
|
+
열넷번: '14번',
|
|
63
|
+
십오번: '15번',
|
|
64
|
+
열다섯번: '15번',
|
|
65
|
+
십육번: '16번',
|
|
66
|
+
열여섯번: '16번',
|
|
67
|
+
십칠번: '17번',
|
|
68
|
+
열일곱번: '17번',
|
|
69
|
+
십팔번: '18번',
|
|
70
|
+
열여덟번: '18번',
|
|
71
|
+
십구번: '19번',
|
|
72
|
+
열아홉번: '19번',
|
|
73
|
+
이십번: '20번',
|
|
74
|
+
스물번: '20번',
|
|
75
|
+
// 추가 보정
|
|
76
|
+
'조치 사항': '조치사항',
|
|
77
|
+
조치상: '조치사항',
|
|
78
|
+
조치: '조치사항',
|
|
79
|
+
자제: '자재'
|
|
80
|
+
};
|
|
81
|
+
/**
|
|
82
|
+
* 합격/불합격 동의어
|
|
83
|
+
*/
|
|
84
|
+
export const passSynonyms = ['합격', 'pass', 'approved', 'okay'];
|
|
85
|
+
export const failSynonyms = ['불합격', 'fail', 'failed'];
|
|
86
|
+
/**
|
|
87
|
+
* 음성 인식 텍스트를 체크리스트 명령으로 해석
|
|
88
|
+
* @param command 음성 인식 결과 텍스트
|
|
89
|
+
* @param checklistLength 체크리스트 항목 개수(번호 범위 제한용)
|
|
90
|
+
*/
|
|
91
|
+
export function parseSpeechCommand(command, checklistLength = 20) {
|
|
92
|
+
let original = command;
|
|
93
|
+
// (A) 하이픈 제거, 오인식 보정
|
|
94
|
+
command = command.replace(/-/g, '');
|
|
95
|
+
for (const [wrong, correct] of Object.entries(misheardMap)) {
|
|
96
|
+
command = command.replace(new RegExp(wrong, 'g'), correct);
|
|
97
|
+
}
|
|
98
|
+
// (B) 한글 숫자 변환
|
|
99
|
+
let tokens = command.split(/\s+/).map(token => {
|
|
100
|
+
if (hangulDigits[token])
|
|
101
|
+
return hangulDigits[token] + '번';
|
|
102
|
+
const m = token.match(/^([일이삼사오육륙칠팔구십])번$/);
|
|
103
|
+
if (m)
|
|
104
|
+
return hangulDigits[m[1]] + '번';
|
|
105
|
+
return token;
|
|
106
|
+
});
|
|
107
|
+
command = tokens.join(' ');
|
|
108
|
+
// (C) 번호 추출
|
|
109
|
+
const rowRegexGlobal = /(\d+)번/g;
|
|
110
|
+
let rowMatches = [...command.matchAll(rowRegexGlobal)];
|
|
111
|
+
let rowIds = [];
|
|
112
|
+
rowMatches.forEach(match => {
|
|
113
|
+
let numStr = match[1];
|
|
114
|
+
let numeric = parseInt(numStr, 10);
|
|
115
|
+
if (numeric >= 1 && numeric <= checklistLength) {
|
|
116
|
+
rowIds.push(numeric);
|
|
117
|
+
}
|
|
118
|
+
});
|
|
119
|
+
// (D) 합격/불합격 여부
|
|
120
|
+
let isPass = null;
|
|
121
|
+
for (let word of passSynonyms) {
|
|
122
|
+
if (command.includes(word)) {
|
|
123
|
+
isPass = true;
|
|
124
|
+
break;
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
for (let word of failSynonyms) {
|
|
128
|
+
if (command.includes(word)) {
|
|
129
|
+
isPass = false;
|
|
130
|
+
break;
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
// (E) 조치사항 텍스트 추출
|
|
134
|
+
let actionText;
|
|
135
|
+
let actionMatch = command.match(/조치사항\s*(.*)/);
|
|
136
|
+
if (actionMatch && actionMatch[1]) {
|
|
137
|
+
actionText = actionMatch[1].trim();
|
|
138
|
+
}
|
|
139
|
+
return {
|
|
140
|
+
rowIds,
|
|
141
|
+
isPass,
|
|
142
|
+
actionText,
|
|
143
|
+
raw: original
|
|
144
|
+
};
|
|
145
|
+
}
|
|
146
|
+
//# sourceMappingURL=stt-utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stt-utils.js","sourceRoot":"","sources":["../../client/stt/stt-utils.ts"],"names":[],"mappings":"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","sourcesContent":["// stt-utils.ts\n// 음성 인식 텍스트를 체크리스트 명령으로 해석하는 유틸리티\n\n/**\n * 한글 숫자 → 아라비아 숫자 변환 맵\n */\nexport const hangulDigits: Record<string, string> = {\n 일: '1',\n 이: '2',\n 삼: '3',\n 사: '4',\n 오: '5',\n 육: '6',\n 륙: '6',\n 칠: '7',\n 팔: '8',\n 구: '9',\n 십: '10',\n 십일: '11',\n 열하나: '11',\n 십이: '12',\n 열둘: '12',\n 십삼: '13',\n 열셋: '13',\n 십사: '14',\n 열넷: '14',\n 십오: '15',\n 열다섯: '15',\n 십육: '16',\n 열여섯: '16',\n 십칠: '17',\n 열일곱: '17',\n 십팔: '18',\n 열여덟: '18',\n 십구: '19',\n 열아홉: '19',\n 이십: '20',\n 스물: '20'\n}\n\n/**\n * 음성 인식 오인식 보정 맵\n */\nexport const misheardMap: Record<string, string> = {\n 일번: '1번',\n 일본: '1번',\n 이번: '2번',\n 삼번: '3번',\n 사번: '4번',\n 오번: '5번',\n 육번: '6번',\n 륙번: '6번',\n 칠번: '7번',\n 팔번: '8번',\n 구번: '9번',\n 십번: '10번',\n 십일번: '11번',\n 열하나번: '11번',\n 십이번: '12번',\n 열둘번: '12번',\n 십삼번: '13번',\n 열셋번: '13번',\n 십사번: '14번',\n 열넷번: '14번',\n 십오번: '15번',\n 열다섯번: '15번',\n 십육번: '16번',\n 열여섯번: '16번',\n 십칠번: '17번',\n 열일곱번: '17번',\n 십팔번: '18번',\n 열여덟번: '18번',\n 십구번: '19번',\n 열아홉번: '19번',\n 이십번: '20번',\n 스물번: '20번',\n // 추가 보정\n '조치 사항': '조치사항',\n 조치상: '조치사항',\n 조치: '조치사항',\n 자제: '자재'\n}\n\n/**\n * 합격/불합격 동의어\n */\nexport const passSynonyms = ['합격', 'pass', 'approved', 'okay']\nexport const failSynonyms = ['불합격', 'fail', 'failed']\n\n/**\n * 체크리스트 명령 해석 결과 타입\n */\nexport interface ParsedSpeechCommand {\n rowIds: number[] // 체크리스트 항목 번호(1,2,3 등)\n isPass: boolean | null // 합격/불합격 여부 (없으면 null)\n actionText?: string // 조치사항 텍스트 (있을 때만)\n raw: string // 원본 텍스트\n}\n\n/**\n * 음성 인식 텍스트를 체크리스트 명령으로 해석\n * @param command 음성 인식 결과 텍스트\n * @param checklistLength 체크리스트 항목 개수(번호 범위 제한용)\n */\nexport function parseSpeechCommand(command: string, checklistLength = 20): ParsedSpeechCommand {\n let original = command\n\n // (A) 하이픈 제거, 오인식 보정\n command = command.replace(/-/g, '')\n for (const [wrong, correct] of Object.entries(misheardMap)) {\n command = command.replace(new RegExp(wrong, 'g'), correct)\n }\n\n // (B) 한글 숫자 변환\n let tokens = command.split(/\\s+/).map(token => {\n if (hangulDigits[token]) return hangulDigits[token] + '번'\n const m = token.match(/^([일이삼사오육륙칠팔구십])번$/)\n if (m) return hangulDigits[m[1]] + '번'\n return token\n })\n command = tokens.join(' ')\n\n // (C) 번호 추출\n const rowRegexGlobal = /(\\d+)번/g\n let rowMatches = [...command.matchAll(rowRegexGlobal)]\n let rowIds: number[] = []\n rowMatches.forEach(match => {\n let numStr = match[1]\n let numeric = parseInt(numStr, 10)\n if (numeric >= 1 && numeric <= checklistLength) {\n rowIds.push(numeric)\n }\n })\n\n // (D) 합격/불합격 여부\n let isPass: boolean | null = null\n for (let word of passSynonyms) {\n if (command.includes(word)) {\n isPass = true\n break\n }\n }\n for (let word of failSynonyms) {\n if (command.includes(word)) {\n isPass = false\n break\n }\n }\n\n // (E) 조치사항 텍스트 추출\n let actionText: string | undefined\n let actionMatch = command.match(/조치사항\\s*(.*)/)\n if (actionMatch && actionMatch[1]) {\n actionText = actionMatch[1].trim()\n }\n\n return {\n rowIds,\n isPass,\n actionText,\n raw: original\n }\n}\n"]}
|