@dssp/project 0.0.36 → 1.0.0-alpha.1

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 (100) hide show
  1. package/dist-client/pages/project/project-schedule.js +31 -22
  2. package/dist-client/pages/project/project-schedule.js.map +1 -1
  3. package/dist-client/tsconfig.tsbuildinfo +1 -1
  4. package/dist-server/tsconfig.tsbuildinfo +1 -1
  5. package/package.json +11 -11
  6. package/client/bootstrap.ts +0 -0
  7. package/client/index.ts +0 -0
  8. package/client/pages/lib/select2-component.ts +0 -175
  9. package/client/pages/lib/waether.ts +0 -159
  10. package/client/pages/project/component/project-update-header.ts +0 -88
  11. package/client/pages/project/popup/popup-plan-upload.ts +0 -138
  12. package/client/pages/project/popup/popup-project-create.ts +0 -147
  13. package/client/pages/project/popup/popup-schedule-upload.ts +0 -102
  14. package/client/pages/project/project-completed-list.ts +0 -281
  15. package/client/pages/project/project-detail.ts +0 -738
  16. package/client/pages/project/project-list.ts +0 -418
  17. package/client/pages/project/project-plan-management.ts +0 -476
  18. package/client/pages/project/project-schedule-list.ts +0 -294
  19. package/client/pages/project/project-schedule.ts +0 -393
  20. package/client/pages/project/project-setting-list.ts +0 -393
  21. package/client/pages/project/project-update.ts +0 -876
  22. package/client/pages/resource/construction-detail-type-popup.ts +0 -201
  23. package/client/pages/resource/construction-type-management.ts +0 -212
  24. package/client/pages/resource/inspection-drawing-type-management.ts +0 -245
  25. package/client/pages/resource/inspection-part-popup.ts +0 -201
  26. package/client/pages/resource/resource-importer.ts +0 -97
  27. package/client/pages/resource/resource-list-page.ts +0 -356
  28. package/client/pages/resource/worker-type-management.ts +0 -192
  29. package/client/pages/task/task-importer.ts +0 -94
  30. package/client/pages/task/task-list-page.ts +0 -340
  31. package/client/pages/task-resource/task-resource-importer.ts +0 -97
  32. package/client/pages/task-resource/task-resource-list-page.ts +0 -356
  33. package/client/route.ts +0 -55
  34. package/client/tsconfig.json +0 -11
  35. package/server/controllers/export-tasks.ts +0 -40
  36. package/server/controllers/import-task.ts +0 -134
  37. package/server/controllers/index.ts +0 -0
  38. package/server/controllers/parse-excel.ts +0 -86
  39. package/server/controllers/types.ts +0 -20
  40. package/server/index.ts +0 -4
  41. package/server/middlewares/index.ts +0 -3
  42. package/server/migrations/1723861466413-seed-roles.ts +0 -128
  43. package/server/migrations/1723861466414-seed-codes.ts +0 -157
  44. package/server/migrations/1723861476419-seed-resources.ts +0 -62
  45. package/server/migrations/1723861478420-seed-/bsample-project.ts +0 -87
  46. package/server/migrations/1723861478421-seed-/bsample-tasks.ts +0 -194
  47. package/server/migrations/index.ts +0 -9
  48. package/server/routes.ts +0 -108
  49. package/server/service/construction-detail-type/construction-detail-type-mutation.ts +0 -57
  50. package/server/service/construction-detail-type/construction-detail-type-query.ts +0 -31
  51. package/server/service/construction-detail-type/construction-detail-type-type.ts +0 -26
  52. package/server/service/construction-detail-type/construction-detail-type.ts +0 -52
  53. package/server/service/construction-detail-type/index.ts +0 -6
  54. package/server/service/construction-type/construction-type-mutation.ts +0 -66
  55. package/server/service/construction-type/construction-type-query.ts +0 -56
  56. package/server/service/construction-type/construction-type-type.ts +0 -26
  57. package/server/service/construction-type/construction-type.ts +0 -74
  58. package/server/service/construction-type/index.ts +0 -6
  59. package/server/service/index.ts +0 -56
  60. package/server/service/inspection-drawing-type/index.ts +0 -6
  61. package/server/service/inspection-drawing-type/inspection-drawing-type-mutation.ts +0 -69
  62. package/server/service/inspection-drawing-type/inspection-drawing-type-query.ts +0 -55
  63. package/server/service/inspection-drawing-type/inspection-drawing-type-type.ts +0 -23
  64. package/server/service/inspection-drawing-type/inspection-drawing-type.ts +0 -68
  65. package/server/service/inspection-part/index.ts +0 -6
  66. package/server/service/inspection-part/inspection-part-mutation.ts +0 -52
  67. package/server/service/inspection-part/inspection-part-query.ts +0 -41
  68. package/server/service/inspection-part/inspection-part-type.ts +0 -26
  69. package/server/service/inspection-part/inspection-part.ts +0 -51
  70. package/server/service/manager/index.ts +0 -6
  71. package/server/service/manager/manager-mutation.ts +0 -42
  72. package/server/service/manager/manager-query.ts +0 -28
  73. package/server/service/manager/manager-type.ts +0 -40
  74. package/server/service/manager/manager.ts +0 -29
  75. package/server/service/project/index.ts +0 -6
  76. package/server/service/project/project-mutation.ts +0 -255
  77. package/server/service/project/project-query.ts +0 -105
  78. package/server/service/project/project-type.ts +0 -72
  79. package/server/service/project/project.ts +0 -134
  80. package/server/service/resource/index.ts +0 -7
  81. package/server/service/resource/resource-mutation.ts +0 -137
  82. package/server/service/resource/resource-query.ts +0 -50
  83. package/server/service/resource/resource-type.ts +0 -41
  84. package/server/service/resource/resource.ts +0 -82
  85. package/server/service/task/index.ts +0 -6
  86. package/server/service/task/task-mutation.ts +0 -135
  87. package/server/service/task/task-query.ts +0 -169
  88. package/server/service/task/task-type.ts +0 -75
  89. package/server/service/task/task.ts +0 -130
  90. package/server/service/task-resource/index.ts +0 -7
  91. package/server/service/task-resource/task-resource-mutation.ts +0 -140
  92. package/server/service/task-resource/task-resource-query.ts +0 -36
  93. package/server/service/task-resource/task-resource-type.ts +0 -41
  94. package/server/service/task-resource/task-resource.ts +0 -51
  95. package/server/service/worker-type/index.ts +0 -6
  96. package/server/service/worker-type/worker-type-mutation.ts +0 -66
  97. package/server/service/worker-type/worker-type-query.ts +0 -47
  98. package/server/service/worker-type/worker-type-type.ts +0 -26
  99. package/server/service/worker-type/worker-type.ts +0 -68
  100. package/server/tsconfig.json +0 -10
@@ -1,738 +0,0 @@
1
- import '@material/web/icon/icon.js'
2
- import '@material/web/button/elevated-button.js'
3
- import '@material/web/textfield/outlined-text-field.js'
4
- import '@material/web/button/outlined-button.js'
5
-
6
- import { navigate, PageView } from '@operato/shell'
7
- import { PageLifecycle } from '@operato/shell/dist/src/app/pages/page-view'
8
- import { css, html } from 'lit'
9
- import { customElement, state } from 'lit/decorators.js'
10
- import { ScopedElementsMixin } from '@open-wc/scoped-elements'
11
- import { client } from '@operato/graphql'
12
- import { ScrollbarStyles } from '@operato/styles'
13
-
14
- import gql from 'graphql-tag'
15
- import { BUILDING_INSPECTION_STATUS, BuildingInspection, BuildingInspectionStatus, Project } from './project-list'
16
- import _getWeather from '../lib/waether'
17
- import '@operato/chart/ox-progress-circle.js'
18
-
19
- export interface InspectionSummary {
20
- wait: number
21
- request: number
22
- pass: number
23
- fail: number
24
- }
25
-
26
- interface Weather {
27
- rain: number
28
- temperature: number
29
- humidity: number
30
- wind: string
31
- }
32
-
33
- @customElement('project-detail')
34
- export class ProjectDetail extends ScopedElementsMixin(PageView) {
35
- static styles = [
36
- ScrollbarStyles,
37
- css`
38
- :host {
39
- display: grid;
40
- grid-template-rows: 55px auto;
41
- color: #4e5055;
42
-
43
- width: 100%;
44
- background-color: var(--md-sys-color-background, #f6f6f6);
45
- overflow-y: auto;
46
-
47
- --grid-record-emphasized-background-color: red;
48
- --grid-record-emphasized-color: yellow;
49
- }
50
-
51
- md-outlined-button {
52
- --md-outlined-button-container-height: 30px;
53
- --md-outlined-button-trailing-space: var(--spacing-medium, 8px);
54
- --md-outlined-button-leading-space: var(--spacing-medium, 8px);
55
- --md-sys-color-outline: rgba(51,51,51,.20);
56
- }
57
-
58
- *[bold] {
59
- font-weight: bold;
60
- }
61
-
62
- div[header] {
63
- display: flex;
64
- margin: 0px var(--spacing-large, 12px);
65
-
66
- h2 {
67
- flex: 0.5;
68
- color: #3f71a0;
69
- font-size:18px;
70
- }
71
-
72
- div[button-container] {
73
- display: flex;
74
- align-items: center;
75
- justify-content: end;
76
- flex: 0.5;
77
-
78
- md-elevated-button {
79
- margin: 0 var(--spacing-small, 4px);
80
-
81
- --md-elevated-button-container-height: 32px;
82
- --md-elevated-button-label-text-size: 16px;
83
- --md-elevated-button-container-color: #0595e5;
84
-
85
- --md-elevated-button-label-text-color: var(--md-sys-color-on-primary);
86
- --md-elevated-button-hover-label-text-color: var(--md-sys-color-on-primary);
87
- --md-elevated-button-pressed-label-text-color: var(--md-sys-color-on-primary);
88
- --md-elevated-button-focus-label-text-color: var(--md-sys-color-on-primary);
89
- --md-elevated-button-icon-color: var(--md-sys-color-on-primary);
90
- --md-elevated-button-hover-icon-color: var(--md-sys-color-on-primary);
91
- --md-elevated-button-pressed-icon-color: var(--md-sys-color-on-primary);
92
- --md-elevated-button-focus-icon-color: var(--md-sys-color-on-primary);
93
- }
94
- }
95
- }
96
-
97
- div[body] {
98
- display: flex;
99
- margin: var(--spacing-large, 12px);
100
- margin-top:0;
101
- gap: var(--spacing-medium, 8px);
102
-
103
- h3 {
104
- color: #2e79be;
105
- font-size: 16px;
106
- margin: 0px;
107
-
108
- a {
109
- text-decoration: none;
110
- color: #2e79be;
111
- }
112
- }
113
-
114
- & > div {
115
- display: flex;
116
- flex: 1;
117
- gap: var(--spacing-medium, 8px);
118
- flex-direction: column;
119
-
120
- & > div {
121
- display: flex;
122
- flex-direction: column;
123
- background-color: var(--md-sys-color-on-primary);
124
- border: 1px solid #cccccc80;
125
- gap: var(--spacing-medium, 8px);
126
- padding: var(--spacing-large, 12px);
127
- border-radius: 5px;
128
- }
129
-
130
- div[left-top] {
131
- div[content-1] {
132
- display: flex;
133
- align-items: center;
134
- gap: var(--spacing-medium, 8px);
135
- font-size: 14px;
136
-
137
- img {
138
- width: 42%;
139
- height: auto;
140
- aspect-ratio: 1920 / 1080;
141
- border: 1px solid #cccccc80;
142
- }
143
- img[no-image] {
144
- object-fit: contain;
145
- opacity: 0.5;
146
- }
147
- }
148
- div[content-2] {
149
- height: 65px;
150
- overflow-y: auto;
151
- font-size: 14px;
152
- }
153
- }
154
-
155
- div[left-bottom] {
156
- flex: 1;
157
-
158
- display: flex;
159
- flex-direction: column;
160
-
161
- [building-complex-img] {
162
- width: 100%;
163
- flex: 1;
164
- aspect-ratio: 2 / 1;
165
- }
166
-
167
- img {
168
- opacity: 0.5;
169
- }
170
-
171
- div[subject] {
172
- margin-bottom: var(--spacing-small, 4px);
173
- }
174
-
175
- div[building-container] {
176
- display: block;
177
-
178
- & > * {
179
- margin-right: var(--spacing-medium, 8px);
180
- margin-bottom: var(--spacing-medium, 8px);
181
- }
182
- md-outlined-button {
183
- --md-outlined-button-container-height: 30px;
184
- --md-outlined-button-trailing-space: var(--spacing-medium, 8px);
185
- --md-outlined-button-leading-space: var(--spacing-medium, 8px);
186
- --md-sys-color-outline: rgba(51,51,51,.20);
187
- }
188
- }
189
- }
190
-
191
- div[right-top] {
192
- div[state] {
193
- display: grid;
194
- grid-template-columns: 0.95fr 0.95fr 1.1fr;
195
- gap: var(--spacing-large, 12px);
196
-
197
- span[progress] {
198
- max-width: 150px;
199
- text-align: center;
200
- display: flex;
201
- justify-self: center;
202
- flex-direction: column;
203
- width: 100%;
204
-
205
- & > div {
206
- font-weight: bold;
207
- color: #2e79be;
208
- font-size: 12px;
209
- margin-top: var(--spacing-small, 4px);
210
- }
211
- & > div[week] {
212
- color: #06b5af;
213
- }
214
- }
215
- span[weather] {
216
- display: flex;
217
- flex-direction: column;
218
- gap: var(--spacing-small, 4px);
219
- margin-left: var(--spacing-medium, 8px);
220
- font-size:14px;
221
-
222
- & > div {
223
- display: flex;
224
- justify-content: space-between;
225
- --md-icon-size: 18px;
226
- margin-right: var(--spacing-small, 4px);
227
-
228
- & > span {
229
- display: flex;
230
- align-item:center;
231
- var(--spacing-tiny, 2px);
232
- }
233
- }
234
- }
235
- }
236
- div[inspection] {
237
- display: grid;
238
- grid-template-columns: 1.4fr 0.9fr 0.9fr 0.9fr 0.9fr;
239
- margin-top: var(--spacing-small, 4px);
240
- background: #f6f6f6;
241
- border-radius: 7px;
242
- padding: var(--spacing-small, 4px) 0px;
243
-
244
- & > span {
245
- display: flex;
246
- flex-direction: column;
247
- align-items: center;
248
- justify-content: center;
249
-
250
- div[wait] {
251
- color: #4e5055;
252
- }
253
- div[request] {
254
- color: #2e79be;
255
- }
256
- div[pass] {
257
- color: #1bb401;
258
- }
259
- div[fail] {
260
- color: #ff4444;
261
- }
262
- }
263
- & > span[name] {
264
- flex-direction: row;
265
- text-align: right;
266
- gap: var(--spacing-medium, 8px);
267
- line-height:1.3;
268
-
269
- md-icon {
270
- width: 40px;
271
- height: 40px;
272
- border-radius: 7px;
273
- color: #fff;
274
- background: #f16154;
275
- }
276
- }
277
- }
278
- div[notice] {
279
- margin-top: var(--spacing-medium, 8px);
280
-
281
- div[name] {
282
- margin-left: 4px;
283
- }
284
- div[content] {
285
- background-color: #ebc8321a;
286
- border-radius: 10px;
287
- padding: var(--spacing-medium, 8px);
288
- font-size: 14px;
289
- margin-top: var(--spacing-small, 4px);
290
- }
291
- }
292
- }
293
-
294
- div[right-bottom] {
295
- flex: 1;
296
-
297
- display: flex;
298
- flex-direction: column;
299
-
300
- div[table-container] {
301
- flex: 1;
302
-
303
- overflow-y: auto;
304
- overflow-x: hidden;
305
- position: relative;
306
- }
307
-
308
- hr {
309
- position: sticky;
310
- margin: 0;
311
- top: 0px;
312
- border: 1px solid #3295f1;
313
- }
314
-
315
- table {
316
- width: 100%;
317
- border-collapse: collapse;
318
- table-layout: fixed;
319
- }
320
-
321
- thead {
322
- position: sticky;
323
- top: var(--spacing-tiny, 2px);
324
- background-color: #464651;
325
- color: var(--md-sys-color-on-primary);
326
- z-index: 1;
327
- }
328
-
329
- thead th {
330
- padding: var(--spacing-tiny, 2px) var(--spacing-small, 4px);
331
- font-size: 15px;
332
- text-wrap: pretty;
333
- }
334
-
335
- tbody td {
336
- border-bottom: 1px solid rgba(51,51,51,.20);
337
- padding: var(--spacing-small, 4px);
338
- text-align: center;
339
- white-space: nowrap;
340
- text-overflow: ellipsis;
341
- overflow: hidden;
342
- font-size: 13px;
343
- }
344
-
345
- md-elevated-button {
346
- margin: 0 var(--spacing-small, 4px);
347
-
348
- --md-elevated-button-container-height: 32px;
349
- --md-elevated-button-label-text-size: 16px;
350
- --md-elevated-button-container-color: #0595e5;
351
-
352
- --md-elevated-button-label-text-color: var(--md-sys-color-on-primary);
353
- --md-elevated-button-hover-label-text-color: var(--md-sys-color-on-primary);
354
- --md-elevated-button-pressed-label-text-color: var(--md-sys-color-on-primary);
355
- --md-elevated-button-focus-label-text-color: var(--md-sys-color-on-primary);
356
- --md-elevated-button-icon-color: var(--md-sys-color-on-primary);
357
- --md-elevated-button-hover-icon-color: var(--md-sys-color-on-primary);
358
- --md-elevated-button-pressed-icon-color: var(--md-sys-color-on-primary);
359
- --md-elevated-button-focus-icon-color: var(--md-sys-color-on-primary);
360
-
361
- &[red] {
362
- --md-elevated-button-container-color: #e15757;
363
- }
364
- }
365
- }
366
- }
367
- }
368
- `
369
- ]
370
-
371
- get context() {
372
- return {
373
- title: '진행 중 프로젝트 상세 정보'
374
- }
375
- }
376
-
377
- private defaultProject = {
378
- name: '',
379
- buildingComplex: {
380
- address: '',
381
- area: 0,
382
- constructionCompany: '',
383
- clientCompany: '',
384
- supervisoryCompany: '',
385
- designCompany: '',
386
- constructionType: '',
387
- buildings: []
388
- }
389
- }
390
-
391
- @state() projectId: string = ''
392
- @state() project: Project = { ...this.defaultProject }
393
- @state() buildingInspections: BuildingInspection[] = []
394
- @state() inspectionSummary: InspectionSummary = {
395
- wait: 0,
396
- request: 0,
397
- pass: 0,
398
- fail: 0
399
- }
400
- @state() weather: Weather = {
401
- rain: 0,
402
- temperature: 0,
403
- humidity: 0,
404
- wind: ''
405
- }
406
-
407
- render() {
408
- return html`
409
- <div header>
410
- <h2>${this.project.name}</h2>
411
- <div button-container>
412
- <md-elevated-button href=${`project-update/${this.project.id}`}>
413
- <md-icon slot="icon">assignment</md-icon>프로젝트 정보 수정
414
- </md-elevated-button>
415
- <md-elevated-button href=${`project-plan-management/${this.project.id}`}>
416
- <md-icon slot="icon">description</md-icon>도면 관리
417
- </md-elevated-button>
418
- <md-elevated-button href=${`project-schedule/${this.project.id}`}>
419
- <md-icon slot="icon">event_note</md-icon>공정표 관리
420
- </md-elevated-button>
421
- </div>
422
- </div>
423
-
424
- <div body>
425
- <div>
426
- <div left-top>
427
- <h3>기본 정보</h3>
428
- <div content-1>
429
- <img
430
- ?no-image=${!this.project.mainPhoto?.fullpath}
431
- src=${this.project.mainPhoto?.fullpath || '/assets/images/no-image.png'}
432
- />
433
-
434
- <div>
435
- <div row>
436
- <span>- 면적 : </span>
437
- <span>${this.project.buildingComplex?.area?.toLocaleString()} ㎡</span>
438
- </div>
439
- <div row>
440
- <span>- 착공~준공 : </span>
441
- <span bold>${this.project.startDate}~${this.project.endDate}</span>
442
- </div>
443
- <div row>
444
- <span>- 발주처 : </span>
445
- <span>${this.project.buildingComplex?.clientCompany}</span>
446
- </div>
447
- <div row>
448
- <span>- 건설사 : </span>
449
- <span>${this.project.buildingComplex?.constructionCompany}</span>
450
- </div>
451
- <div row>
452
- <span>- 감리사 : </span>
453
- <span>${this.project.buildingComplex?.supervisoryCompany}</span>
454
- </div>
455
- <div row>
456
- <span>- 설계사 : </span>
457
- <span>${this.project.buildingComplex?.designCompany}</span>
458
- </div>
459
- </div>
460
- </div>
461
-
462
- <div content-2>
463
- <div row>
464
- <span>- 건설구분 : </span>
465
- <span>${this.project.buildingComplex?.constructionType}</span>
466
- </div>
467
- <div row>
468
- <span>- 공사금액 : </span>
469
- <span>${this.project.buildingComplex?.constructionCost?.toLocaleString()} 원</span>
470
- </div>
471
- <div row>
472
- <span>- 세대수 : </span>
473
- <span>${this.project.buildingComplex?.householdCount?.toLocaleString()}</span>
474
- </div>
475
- <div row>
476
- <span>- 기타 : </span>
477
- <span>${this.project.buildingComplex?.etc}</span>
478
- </div>
479
- </div>
480
- </div>
481
-
482
- <div left-bottom>
483
- <h3>조감도(BIM도면)</h3>
484
- ${this.project.buildingComplex?.drawing?.fullpath
485
- ? html`<div building-complex-img></div>`
486
- : html`<img building-complex-img src="/assets/images/img-building-complex-default.jpg" />`}
487
- <div>
488
- <div subject bold>개별 단지 상세정보 바로가기</div>
489
- <div building-container>
490
- ${this.project.buildingComplex?.buildings?.map(building => {
491
- return html`<md-outlined-button href=${`building-complex-detail/${this.project.id}?buildingId=${building.id}`}>
492
- ${building.name}
493
- </md-outlined-button>`
494
- })}
495
- </div>
496
- </div>
497
- </div>
498
- </div>
499
-
500
- <div>
501
- <div right-top>
502
- <h3>프로젝트 현황</h3>
503
- <div state>
504
- <span progress>
505
- <ox-progress-circle
506
- .value=${this.project.totalProgress}
507
- titleText="전체"
508
- suffix="%"
509
- fontSize="27px"
510
- fontColor="#4E5055"
511
- borderStyle="none"
512
- innerCircleSize="28%"
513
- circleColor="#0595E5"
514
- shadow="#00000026 4px 4px 4px"
515
- background="#eaf5fd"
516
- ></ox-progress-circle>
517
- <div>전체공정율(%)</div>
518
- </span>
519
- <span progress>
520
- <ox-progress-circle
521
- .value=${this.project.weeklyProgress}
522
- titleText="주간"
523
- suffix="%"
524
- fontSize="27px"
525
- fontColor="#4E5055"
526
- borderStyle="none"
527
- innerCircleSize="28%"
528
- circleColor="#06B5AF"
529
- shadow="#00000026 4px 4px 4px"
530
- background="#eaf7f7"
531
- ></ox-progress-circle>
532
- <div week>주간공정율(%)</div>
533
- </span>
534
- <span weather>
535
- <div bold>현장현황</div>
536
- <div>
537
- <span><md-icon slot="icon">rainy</md-icon>강수확률</span>
538
- <span bold>${this.weather.rain}%</span>
539
- </div>
540
- <div>
541
- <span><md-icon slot="icon">humidity_percentage</md-icon> 습도</span>
542
- <span bold>${this.weather.humidity}%</span>
543
- </div>
544
- <div>
545
- <span><md-icon slot="icon">thermostat</md-icon> 온도</span>
546
- <span bold>${this.weather.temperature}°C</span>
547
- </div>
548
- <div>
549
- <span><md-icon slot="icon">air</md-icon> 풍향</span>
550
- <span bold>${this.weather.wind}</span>
551
- </div>
552
- </span>
553
- </div>
554
- <div inspection>
555
- <span name bold>
556
- <md-icon slot="icon">list_alt_add</md-icon>
557
- 시공검측<br />현황
558
- </span>
559
- <span>
560
- <div>검측요청</div>
561
- <div bold>${this.inspectionSummary.wait}</div>
562
- </span>
563
- <span>
564
- <div>검측대기</div>
565
- <div bold>${this.inspectionSummary.request}</div>
566
- </span>
567
- <span>
568
- <div>합격</div>
569
- <div bold pass>${this.inspectionSummary.pass}</div>
570
- </span>
571
- <span>
572
- <div>불합격</div>
573
- <div bold fail>${this.inspectionSummary.fail}</div>
574
- </span>
575
- </div>
576
- <div notice>
577
- <div name bold>공지사항</div>
578
- <div content>${this.project.buildingComplex.notice}</div>
579
- </div>
580
- </div>
581
-
582
- <div right-bottom>
583
- <h3>검측 현황</h3>
584
- <div table-container>
585
- <hr />
586
- <table>
587
- <thead>
588
- <tr>
589
- <th width="3%"></th>
590
- <th width="10%">검측 위치</th>
591
- <th width="10%">공종</th>
592
- <th width="22%">내용</th>
593
- <th width="15%">검측 요청일</th>
594
- <th width="10%">검측 결과</th>
595
- </tr>
596
- </thead>
597
- <tbody>
598
- ${this.buildingInspections.map((inspection, idx) => {
599
- return html` <tr @click=${() => this._onClickInspection(inspection.id || '')}>
600
- <td>${idx + 1}</td>
601
- <td>${inspection?.buildingLevel?.building?.name} ${inspection?.buildingLevel?.floor}층</td>
602
- <td bold>${inspection.checklist?.constructionType}</td>
603
- <td>${inspection.checklist?.inspectionParts?.join(', ') || ''}</td>
604
- <td>${this._formatDate(inspection.requestDate)}</td>
605
- <td bold>${inspection.status && BUILDING_INSPECTION_STATUS[inspection.status]}</td>
606
- </tr>`
607
- })}
608
- </tbody>
609
- </table>
610
- </div>
611
- </div>
612
- </div>
613
- </div>
614
- `
615
- }
616
-
617
- async pageInitialized(lifecycle: PageLifecycle) {}
618
-
619
- async pageUpdated(changes: any, lifecycle: PageLifecycle) {
620
- if (this.active) {
621
- this.projectId = lifecycle.resourceId || ''
622
- await this.initProject(lifecycle.resourceId)
623
- }
624
- }
625
-
626
- async initProject(projectId: string = '') {
627
- const response = await client.query({
628
- query: gql`
629
- query Project($id: String!, $projectId: String!, $params: BuildingInspectionsOfProject!) {
630
- project(id: $id) {
631
- id
632
- name
633
- startDate
634
- endDate
635
- mainPhoto {
636
- fullpath
637
- }
638
- totalProgress
639
- weeklyProgress
640
- kpi
641
- inspPassRate
642
- robotProgressRate
643
- structuralSafetyRate
644
- buildingComplex {
645
- id
646
- address
647
- latitude
648
- longitude
649
- area
650
- clientCompany
651
- constructionCompany
652
- supervisoryCompany
653
- designCompany
654
- drawing {
655
- id
656
- name
657
- fullpath
658
- }
659
- constructionType
660
- constructionCost
661
- etc
662
- notice
663
- householdCount
664
- buildingCount
665
- buildings {
666
- id
667
- name
668
- floorCount
669
- }
670
- }
671
- }
672
-
673
- inspectionSummary: buildingInspectionSummaryOfProject(projectId: $projectId) {
674
- wait
675
- request
676
- pass
677
- fail
678
- }
679
-
680
- buildingInspectionsOfProject(params: $params) {
681
- items {
682
- id
683
- status
684
- requestDate
685
- buildingLevel {
686
- floor
687
- building {
688
- name
689
- }
690
- }
691
- checklist {
692
- name
693
- constructionType
694
- constructionDetailType
695
- inspectionParts
696
- }
697
- }
698
- total
699
- }
700
- }
701
- `,
702
- variables: {
703
- id: projectId,
704
- projectId,
705
- params: {
706
- projectId,
707
- limit: 10
708
- }
709
- }
710
- })
711
-
712
- if (response.errors) return
713
-
714
- this.project = response.data?.project || {}
715
- this.inspectionSummary = response.data?.inspectionSummary || {}
716
- this.buildingInspections = response.data?.buildingInspectionsOfProject?.items || []
717
-
718
- const { latitude, longitude } = this.project?.buildingComplex
719
- if (latitude && longitude) {
720
- this.weather = await _getWeather(latitude, longitude)
721
- }
722
- }
723
-
724
- private _onClickInspection(buildingInspectionId: string) {
725
- navigate(`building-inspection-detail-drawing/${buildingInspectionId}`)
726
- }
727
-
728
- private _formatDate(date: Date | undefined) {
729
- return date
730
- ? new Intl.DateTimeFormat('en-CA', {
731
- timeZone: 'Asia/Seoul',
732
- year: 'numeric',
733
- month: '2-digit',
734
- day: '2-digit'
735
- }).format(new Date(date))
736
- : ''
737
- }
738
- }