@fmsim/fmsim 1.0.88 → 2.0.0-beta.100

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.
Files changed (67) hide show
  1. package/Dockerfile +3 -3
  2. package/_index.html +8 -43
  3. package/assets/manifest.json +2 -0
  4. package/assets/playback-test-board.json +8440 -0
  5. package/config/config.development.js +2 -3
  6. package/dist-client/apptools/favorite-tool.js +4 -5
  7. package/dist-client/apptools/favorite-tool.js.map +1 -1
  8. package/dist-client/board-list/board-tile-list.js +205 -21
  9. package/dist-client/board-list/board-tile-list.js.map +1 -1
  10. package/dist-client/board-list/group-bar.js +6 -6
  11. package/dist-client/board-list/group-bar.js.map +1 -1
  12. package/dist-client/bootstrap.js +0 -2
  13. package/dist-client/bootstrap.js.map +1 -1
  14. package/dist-client/entries/headless-scene-components.js +7 -0
  15. package/dist-client/entries/headless-scene-components.js.map +1 -0
  16. package/dist-client/entries/scene-player.js +83 -0
  17. package/dist-client/entries/scene-player.js.map +1 -0
  18. package/dist-client/entries/scene-viewer.js +80 -0
  19. package/dist-client/entries/scene-viewer.js.map +1 -0
  20. package/dist-client/entries/things-scene-components.import +1 -0
  21. package/dist-client/pages/board-list-page.js +24 -4
  22. package/dist-client/pages/board-list-page.js.map +1 -1
  23. package/dist-client/themes/board-app-menu-tools-theme.css +0 -2
  24. package/dist-client/themes/index.css +8 -2
  25. package/dist-client/themes/light.css +51 -0
  26. package/dist-client/tsconfig.tsbuildinfo +1 -1
  27. package/dist-client/viewparts/board-info.js +16 -26
  28. package/dist-client/viewparts/board-info.js.map +1 -1
  29. package/dist-client/viewparts/group-info.js +15 -25
  30. package/dist-client/viewparts/group-info.js.map +1 -1
  31. package/dist-client/viewparts/menu-tools.js +10 -12
  32. package/dist-client/viewparts/menu-tools.js.map +1 -1
  33. package/dist-server/index.js +1 -0
  34. package/dist-server/index.js.map +1 -1
  35. package/dist-server/routes.js +41 -0
  36. package/dist-server/routes.js.map +1 -0
  37. package/dist-server/service/index.js +5 -2
  38. package/dist-server/service/index.js.map +1 -1
  39. package/dist-server/service/machine-units/machine-units-mock.js +84 -0
  40. package/dist-server/service/machine-units/machine-units-mock.js.map +1 -0
  41. package/dist-server/service/playback/index.js +217 -0
  42. package/dist-server/service/playback/index.js.map +1 -0
  43. package/dist-server/service/playback/mock-data.js +658 -0
  44. package/dist-server/service/playback/mock-data.js.map +1 -0
  45. package/dist-server/tsconfig.tsbuildinfo +1 -1
  46. package/package.json +34 -33
  47. package/schema.graphql +3504 -380
  48. package/views/auth-page.html +2 -2
  49. package/views/internal-board-full-feature-view.html +1 -2
  50. package/views/internal-board-service-view.html +1 -2
  51. package/views/internal-label-command-view.html +0 -1
  52. package/views/public/home.html +2 -2
  53. package/dist-client/apptools/favorite-tool.d.ts +0 -26
  54. package/dist-client/board-list/board-tile-list.d.ts +0 -20
  55. package/dist-client/board-list/group-bar.d.ts +0 -14
  56. package/dist-client/bootstrap.d.ts +0 -5
  57. package/dist-client/index.d.ts +0 -0
  58. package/dist-client/pages/attachment-list-page.d.ts +0 -21
  59. package/dist-client/pages/board-list-page.d.ts +0 -70
  60. package/dist-client/pages/connection-list-page.d.ts +0 -30
  61. package/dist-client/pages/font-list-page.d.ts +0 -10
  62. package/dist-client/pages/scenario-list-page.d.ts +0 -30
  63. package/dist-client/pages/toplevel-theme-list-page.d.ts +0 -25
  64. package/dist-client/route.d.ts +0 -1
  65. package/dist-client/viewparts/board-info.d.ts +0 -16
  66. package/dist-client/viewparts/group-info.d.ts +0 -15
  67. package/dist-client/viewparts/menu-tools.d.ts +0 -20
@@ -0,0 +1,217 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.resolvers = exports.entities = void 0;
4
+ const tslib_1 = require("tslib");
5
+ const type_graphql_1 = require("type-graphql");
6
+ const mock_data_1 = require("./mock-data");
7
+ let PlaybackRecord = class PlaybackRecord {
8
+ };
9
+ tslib_1.__decorate([
10
+ (0, type_graphql_1.Field)(),
11
+ tslib_1.__metadata("design:type", String)
12
+ ], PlaybackRecord.prototype, "type", void 0);
13
+ tslib_1.__decorate([
14
+ (0, type_graphql_1.Field)(),
15
+ tslib_1.__metadata("design:type", String)
16
+ ], PlaybackRecord.prototype, "time", void 0);
17
+ tslib_1.__decorate([
18
+ (0, type_graphql_1.Field)(),
19
+ tslib_1.__metadata("design:type", String)
20
+ ], PlaybackRecord.prototype, "data", void 0);
21
+ PlaybackRecord = tslib_1.__decorate([
22
+ (0, type_graphql_1.ObjectType)()
23
+ ], PlaybackRecord);
24
+ let PlaybackScenarioType = class PlaybackScenarioType {
25
+ };
26
+ tslib_1.__decorate([
27
+ (0, type_graphql_1.Field)(),
28
+ tslib_1.__metadata("design:type", String)
29
+ ], PlaybackScenarioType.prototype, "scenarioName", void 0);
30
+ tslib_1.__decorate([
31
+ (0, type_graphql_1.Field)(() => [PlaybackRecord]),
32
+ tslib_1.__metadata("design:type", Array)
33
+ ], PlaybackScenarioType.prototype, "snapshots", void 0);
34
+ PlaybackScenarioType = tslib_1.__decorate([
35
+ (0, type_graphql_1.ObjectType)()
36
+ ], PlaybackScenarioType);
37
+ let PlaybackResult = class PlaybackResult {
38
+ };
39
+ tslib_1.__decorate([
40
+ (0, type_graphql_1.Field)(() => [PlaybackScenarioType]),
41
+ tslib_1.__metadata("design:type", Array)
42
+ ], PlaybackResult.prototype, "scenarios", void 0);
43
+ PlaybackResult = tslib_1.__decorate([
44
+ (0, type_graphql_1.ObjectType)()
45
+ ], PlaybackResult);
46
+ let PlaybackResponse = class PlaybackResponse {
47
+ };
48
+ tslib_1.__decorate([
49
+ (0, type_graphql_1.Field)(),
50
+ tslib_1.__metadata("design:type", Boolean)
51
+ ], PlaybackResponse.prototype, "status", void 0);
52
+ tslib_1.__decorate([
53
+ (0, type_graphql_1.Field)({ nullable: true }),
54
+ tslib_1.__metadata("design:type", String)
55
+ ], PlaybackResponse.prototype, "errorMessage", void 0);
56
+ tslib_1.__decorate([
57
+ (0, type_graphql_1.Field)(() => PlaybackResult, { nullable: true }),
58
+ tslib_1.__metadata("design:type", PlaybackResult)
59
+ ], PlaybackResponse.prototype, "playback", void 0);
60
+ PlaybackResponse = tslib_1.__decorate([
61
+ (0, type_graphql_1.ObjectType)()
62
+ ], PlaybackResponse);
63
+ let MockVehicles = class MockVehicles {
64
+ };
65
+ tslib_1.__decorate([
66
+ (0, type_graphql_1.Field)(() => [String]),
67
+ tslib_1.__metadata("design:type", Array)
68
+ ], MockVehicles.prototype, "agvs", void 0);
69
+ tslib_1.__decorate([
70
+ (0, type_graphql_1.Field)(() => [String]),
71
+ tslib_1.__metadata("design:type", Array)
72
+ ], MockVehicles.prototype, "ohts", void 0);
73
+ MockVehicles = tslib_1.__decorate([
74
+ (0, type_graphql_1.ObjectType)()
75
+ ], MockVehicles);
76
+ let MockEntities = class MockEntities {
77
+ };
78
+ tslib_1.__decorate([
79
+ (0, type_graphql_1.Field)(() => MockVehicles),
80
+ tslib_1.__metadata("design:type", MockVehicles)
81
+ ], MockEntities.prototype, "vehicles", void 0);
82
+ tslib_1.__decorate([
83
+ (0, type_graphql_1.Field)(() => [String]),
84
+ tslib_1.__metadata("design:type", Array)
85
+ ], MockEntities.prototype, "ports", void 0);
86
+ tslib_1.__decorate([
87
+ (0, type_graphql_1.Field)(() => [String]),
88
+ tslib_1.__metadata("design:type", Array)
89
+ ], MockEntities.prototype, "zones", void 0);
90
+ tslib_1.__decorate([
91
+ (0, type_graphql_1.Field)(() => [String]),
92
+ tslib_1.__metadata("design:type", Array)
93
+ ], MockEntities.prototype, "stockers", void 0);
94
+ MockEntities = tslib_1.__decorate([
95
+ (0, type_graphql_1.ObjectType)()
96
+ ], MockEntities);
97
+ let CarrierLocation = class CarrierLocation {
98
+ };
99
+ tslib_1.__decorate([
100
+ (0, type_graphql_1.Field)(),
101
+ tslib_1.__metadata("design:type", String)
102
+ ], CarrierLocation.prototype, "time", void 0);
103
+ tslib_1.__decorate([
104
+ (0, type_graphql_1.Field)(),
105
+ tslib_1.__metadata("design:type", String)
106
+ ], CarrierLocation.prototype, "machineName", void 0);
107
+ tslib_1.__decorate([
108
+ (0, type_graphql_1.Field)(),
109
+ tslib_1.__metadata("design:type", String)
110
+ ], CarrierLocation.prototype, "unitName", void 0);
111
+ CarrierLocation = tslib_1.__decorate([
112
+ (0, type_graphql_1.ObjectType)()
113
+ ], CarrierLocation);
114
+ let CarrierLocationHistoryResponse = class CarrierLocationHistoryResponse {
115
+ };
116
+ tslib_1.__decorate([
117
+ (0, type_graphql_1.Field)({ nullable: true }),
118
+ tslib_1.__metadata("design:type", String)
119
+ ], CarrierLocationHistoryResponse.prototype, "errorMessage", void 0);
120
+ tslib_1.__decorate([
121
+ (0, type_graphql_1.Field)(() => [CarrierLocation]),
122
+ tslib_1.__metadata("design:type", Array)
123
+ ], CarrierLocationHistoryResponse.prototype, "carrierLocHistory", void 0);
124
+ CarrierLocationHistoryResponse = tslib_1.__decorate([
125
+ (0, type_graphql_1.ObjectType)()
126
+ ], CarrierLocationHistoryResponse);
127
+ let PlaybackResolver = class PlaybackResolver {
128
+ async playback(startTime, endTime, count, includeSnapshot) {
129
+ try {
130
+ // endTime 또는 count 중 하나로 조회 범위 지정.
131
+ // 둘 다 없으면 기본 1시간 (endTime 기반).
132
+ let opts;
133
+ if (endTime) {
134
+ opts = { endTime };
135
+ }
136
+ else if (count && count > 0) {
137
+ opts = { count };
138
+ }
139
+ else {
140
+ const start = new Date(startTime.replace(' ', 'T'));
141
+ const defaultEnd = new Date(start.getTime() + 3600000)
142
+ .toISOString()
143
+ .replace('T', ' ')
144
+ .replace(/\.\d+Z$/, '');
145
+ opts = { endTime: defaultEnd };
146
+ }
147
+ const scenarios = (0, mock_data_1.generatePlaybackData)(startTime, opts);
148
+ // includeSnapshot=false이면 snapshot 프레임 제거
149
+ if (!includeSnapshot) {
150
+ for (const s of scenarios) {
151
+ s.snapshots = s.snapshots.filter(f => f.type !== 'snapshot');
152
+ }
153
+ }
154
+ // data 배열을 JSON string으로 직렬화
155
+ const serialized = scenarios.map(s => (Object.assign(Object.assign({}, s), { snapshots: s.snapshots.map(f => ({
156
+ type: f.type,
157
+ time: f.time,
158
+ data: JSON.stringify(f.data)
159
+ })) })));
160
+ return {
161
+ status: true,
162
+ playback: { scenarios: serialized }
163
+ };
164
+ }
165
+ catch (e) {
166
+ return {
167
+ status: false,
168
+ errorMessage: e.message || String(e)
169
+ };
170
+ }
171
+ }
172
+ async playbackEntities() {
173
+ return mock_data_1.MOCK_ENTITIES;
174
+ }
175
+ async carrierLocationHistory(startTime, endTime, carrierName) {
176
+ try {
177
+ const carrierLocHistory = (0, mock_data_1.generateCarrierLocationHistory)(startTime, endTime, carrierName);
178
+ return { errorMessage: null, carrierLocHistory };
179
+ }
180
+ catch (e) {
181
+ return { errorMessage: (e === null || e === void 0 ? void 0 : e.message) || String(e), carrierLocHistory: [] };
182
+ }
183
+ }
184
+ };
185
+ tslib_1.__decorate([
186
+ (0, type_graphql_1.Query)(() => PlaybackResponse, { description: 'Playback 데이터 조회 (목업)' }),
187
+ tslib_1.__param(0, (0, type_graphql_1.Arg)('startTime')),
188
+ tslib_1.__param(1, (0, type_graphql_1.Arg)('endTime', { nullable: true })),
189
+ tslib_1.__param(2, (0, type_graphql_1.Arg)('count', () => type_graphql_1.Int, { nullable: true })),
190
+ tslib_1.__param(3, (0, type_graphql_1.Arg)('includeSnapshot', { nullable: true, defaultValue: true })),
191
+ tslib_1.__metadata("design:type", Function),
192
+ tslib_1.__metadata("design:paramtypes", [String, String, Number, Boolean]),
193
+ tslib_1.__metadata("design:returntype", Promise)
194
+ ], PlaybackResolver.prototype, "playback", null);
195
+ tslib_1.__decorate([
196
+ (0, type_graphql_1.Query)(() => MockEntities, { description: '목업 엔티티 목록 (보드 작화용)' }),
197
+ tslib_1.__metadata("design:type", Function),
198
+ tslib_1.__metadata("design:paramtypes", []),
199
+ tslib_1.__metadata("design:returntype", Promise)
200
+ ], PlaybackResolver.prototype, "playbackEntities", null);
201
+ tslib_1.__decorate([
202
+ (0, type_graphql_1.Query)(() => CarrierLocationHistoryResponse, {
203
+ description: 'Carrier 위치 이력 조회 (목업). 영구추적 fallback 용.'
204
+ }),
205
+ tslib_1.__param(0, (0, type_graphql_1.Arg)('startTime')),
206
+ tslib_1.__param(1, (0, type_graphql_1.Arg)('endTime')),
207
+ tslib_1.__param(2, (0, type_graphql_1.Arg)('carrierName')),
208
+ tslib_1.__metadata("design:type", Function),
209
+ tslib_1.__metadata("design:paramtypes", [String, String, String]),
210
+ tslib_1.__metadata("design:returntype", Promise)
211
+ ], PlaybackResolver.prototype, "carrierLocationHistory", null);
212
+ PlaybackResolver = tslib_1.__decorate([
213
+ (0, type_graphql_1.Resolver)()
214
+ ], PlaybackResolver);
215
+ exports.entities = [];
216
+ exports.resolvers = [PlaybackResolver];
217
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../server/service/playback/index.ts"],"names":[],"mappings":"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","sourcesContent":["import { Resolver, Query, Arg, ObjectType, Field, Int } from 'type-graphql'\nimport { generatePlaybackData, generateCarrierLocationHistory, MOCK_ENTITIES } from './mock-data'\n\n@ObjectType()\nclass PlaybackRecord {\n @Field() type!: string\n @Field() time!: string\n @Field() data!: string // JSON string\n}\n\n@ObjectType()\nclass PlaybackScenarioType {\n @Field() scenarioName!: string\n @Field(() => [PlaybackRecord]) snapshots!: PlaybackRecord[]\n}\n\n@ObjectType()\nclass PlaybackResult {\n @Field(() => [PlaybackScenarioType]) scenarios!: PlaybackScenarioType[]\n}\n\n@ObjectType()\nclass PlaybackResponse {\n @Field() status!: boolean\n @Field({ nullable: true }) errorMessage?: string\n @Field(() => PlaybackResult, { nullable: true }) playback?: PlaybackResult\n}\n\n@ObjectType()\nclass MockVehicles {\n @Field(() => [String]) agvs!: string[]\n @Field(() => [String]) ohts!: string[]\n}\n\n@ObjectType()\nclass MockEntities {\n @Field(() => MockVehicles) vehicles!: MockVehicles\n @Field(() => [String]) ports!: string[]\n @Field(() => [String]) zones!: string[]\n @Field(() => [String]) stockers!: string[]\n}\n\n@ObjectType()\nclass CarrierLocation {\n @Field() time!: string\n @Field() machineName!: string\n @Field() unitName!: string\n}\n\n@ObjectType()\nclass CarrierLocationHistoryResponse {\n @Field({ nullable: true }) errorMessage?: string | null\n @Field(() => [CarrierLocation]) carrierLocHistory!: CarrierLocation[]\n}\n\n@Resolver()\nclass PlaybackResolver {\n @Query(() => PlaybackResponse, { description: 'Playback 데이터 조회 (목업)' })\n async playback(\n @Arg('startTime') startTime: string,\n @Arg('endTime', { nullable: true }) endTime: string,\n @Arg('count', () => Int, { nullable: true }) count: number,\n @Arg('includeSnapshot', { nullable: true, defaultValue: true }) includeSnapshot: boolean\n ): Promise<PlaybackResponse> {\n try {\n // endTime 또는 count 중 하나로 조회 범위 지정.\n // 둘 다 없으면 기본 1시간 (endTime 기반).\n let opts: { endTime?: string; count?: number }\n if (endTime) {\n opts = { endTime }\n } else if (count && count > 0) {\n opts = { count }\n } else {\n const start = new Date(startTime.replace(' ', 'T'))\n const defaultEnd = new Date(start.getTime() + 3600000)\n .toISOString()\n .replace('T', ' ')\n .replace(/\\.\\d+Z$/, '')\n opts = { endTime: defaultEnd }\n }\n\n const scenarios = generatePlaybackData(startTime, opts)\n\n // includeSnapshot=false이면 snapshot 프레임 제거\n if (!includeSnapshot) {\n for (const s of scenarios) {\n s.snapshots = s.snapshots.filter(f => f.type !== 'snapshot')\n }\n }\n\n // data 배열을 JSON string으로 직렬화\n const serialized = scenarios.map(s => ({\n ...s,\n snapshots: s.snapshots.map(f => ({\n type: f.type,\n time: f.time,\n data: JSON.stringify(f.data)\n }))\n }))\n\n return {\n status: true,\n playback: { scenarios: serialized }\n }\n } catch (e: any) {\n return {\n status: false,\n errorMessage: e.message || String(e)\n }\n }\n }\n\n @Query(() => MockEntities, { description: '목업 엔티티 목록 (보드 작화용)' })\n async playbackEntities(): Promise<MockEntities> {\n return MOCK_ENTITIES\n }\n\n @Query(() => CarrierLocationHistoryResponse, {\n description: 'Carrier 위치 이력 조회 (목업). 영구추적 fallback 용.'\n })\n async carrierLocationHistory(\n @Arg('startTime') startTime: string,\n @Arg('endTime') endTime: string,\n @Arg('carrierName') carrierName: string\n ): Promise<CarrierLocationHistoryResponse> {\n try {\n const carrierLocHistory = generateCarrierLocationHistory(startTime, endTime, carrierName)\n return { errorMessage: null, carrierLocHistory }\n } catch (e: any) {\n return { errorMessage: e?.message || String(e), carrierLocHistory: [] }\n }\n }\n}\n\nexport const entities = []\nexport const resolvers = [PlaybackResolver]\n"]}