@dssp/project 0.0.2

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 (195) hide show
  1. package/CHANGELOG.md +8 -0
  2. package/assets/images/hatiolab-logo.png +0 -0
  3. package/assets/images/o-mark.png +0 -0
  4. package/assets/images/x-mark.png +0 -0
  5. package/client/bootstrap.ts +0 -0
  6. package/client/index.ts +0 -0
  7. package/client/pages/checklist/checklist-importer.ts +96 -0
  8. package/client/pages/checklist/checklist-list-page.ts +355 -0
  9. package/client/pages/lib/waether.ts +159 -0
  10. package/client/pages/project/ox-progress-circle.ts +133 -0
  11. package/client/pages/project/project-create-popup.ts +148 -0
  12. package/client/pages/project/project-detail.ts +618 -0
  13. package/client/pages/project/project-list.ts +354 -0
  14. package/client/pages/project/project-plan-management.ts +437 -0
  15. package/client/pages/project/project-schedule-list.ts +280 -0
  16. package/client/pages/project/project-schedule.ts +248 -0
  17. package/client/pages/project/project-setting-list.ts +298 -0
  18. package/client/pages/project/project-update.ts +797 -0
  19. package/client/pages/resource/resource-importer.ts +96 -0
  20. package/client/pages/resource/resource-list-page.ts +355 -0
  21. package/client/pages/task/task-importer.ts +96 -0
  22. package/client/pages/task/task-list-page.ts +355 -0
  23. package/client/route.ts +39 -0
  24. package/client/tsconfig.json +11 -0
  25. package/dist-client/bootstrap.d.ts +0 -0
  26. package/dist-client/bootstrap.js +2 -0
  27. package/dist-client/bootstrap.js.map +1 -0
  28. package/dist-client/index.d.ts +0 -0
  29. package/dist-client/index.js +2 -0
  30. package/dist-client/index.js.map +1 -0
  31. package/dist-client/pages/checklist/checklist-importer.d.ts +9 -0
  32. package/dist-client/pages/checklist/checklist-importer.js +100 -0
  33. package/dist-client/pages/checklist/checklist-importer.js.map +1 -0
  34. package/dist-client/pages/checklist/checklist-list-page.d.ts +62 -0
  35. package/dist-client/pages/checklist/checklist-list-page.js +331 -0
  36. package/dist-client/pages/checklist/checklist-list-page.js.map +1 -0
  37. package/dist-client/pages/lib/waether.d.ts +6 -0
  38. package/dist-client/pages/lib/waether.js +152 -0
  39. package/dist-client/pages/lib/waether.js.map +1 -0
  40. package/dist-client/pages/project/ox-progress-circle.d.ts +41 -0
  41. package/dist-client/pages/project/ox-progress-circle.js +182 -0
  42. package/dist-client/pages/project/ox-progress-circle.js.map +1 -0
  43. package/dist-client/pages/project/project-create-popup.d.ts +14 -0
  44. package/dist-client/pages/project/project-create-popup.js +153 -0
  45. package/dist-client/pages/project/project-create-popup.js.map +1 -0
  46. package/dist-client/pages/project/project-detail.d.ts +35 -0
  47. package/dist-client/pages/project/project-detail.js +617 -0
  48. package/dist-client/pages/project/project-detail.js.map +1 -0
  49. package/dist-client/pages/project/project-list.d.ts +88 -0
  50. package/dist-client/pages/project/project-list.js +303 -0
  51. package/dist-client/pages/project/project-list.js.map +1 -0
  52. package/dist-client/pages/project/project-plan-management.d.ts +27 -0
  53. package/dist-client/pages/project/project-plan-management.js +438 -0
  54. package/dist-client/pages/project/project-plan-management.js.map +1 -0
  55. package/dist-client/pages/project/project-schedule-list.d.ts +18 -0
  56. package/dist-client/pages/project/project-schedule-list.js +292 -0
  57. package/dist-client/pages/project/project-schedule-list.js.map +1 -0
  58. package/dist-client/pages/project/project-schedule.d.ts +23 -0
  59. package/dist-client/pages/project/project-schedule.js +256 -0
  60. package/dist-client/pages/project/project-schedule.js.map +1 -0
  61. package/dist-client/pages/project/project-setting-list.d.ts +23 -0
  62. package/dist-client/pages/project/project-setting-list.js +307 -0
  63. package/dist-client/pages/project/project-setting-list.js.map +1 -0
  64. package/dist-client/pages/project/project-update.d.ts +24 -0
  65. package/dist-client/pages/project/project-update.js +797 -0
  66. package/dist-client/pages/project/project-update.js.map +1 -0
  67. package/dist-client/pages/resource/resource-importer.d.ts +9 -0
  68. package/dist-client/pages/resource/resource-importer.js +100 -0
  69. package/dist-client/pages/resource/resource-importer.js.map +1 -0
  70. package/dist-client/pages/resource/resource-list-page.d.ts +62 -0
  71. package/dist-client/pages/resource/resource-list-page.js +331 -0
  72. package/dist-client/pages/resource/resource-list-page.js.map +1 -0
  73. package/dist-client/pages/task/task-importer.d.ts +9 -0
  74. package/dist-client/pages/task/task-importer.js +100 -0
  75. package/dist-client/pages/task/task-importer.js.map +1 -0
  76. package/dist-client/pages/task/task-list-page.d.ts +62 -0
  77. package/dist-client/pages/task/task-list-page.js +331 -0
  78. package/dist-client/pages/task/task-list-page.js.map +1 -0
  79. package/dist-client/route.d.ts +1 -0
  80. package/dist-client/route.js +32 -0
  81. package/dist-client/route.js.map +1 -0
  82. package/dist-client/tsconfig.tsbuildinfo +1 -0
  83. package/dist-server/controllers/index.js +1 -0
  84. package/dist-server/controllers/index.js.map +1 -0
  85. package/dist-server/controllers/project-to-excel.js +30 -0
  86. package/dist-server/controllers/project-to-excel.js.map +1 -0
  87. package/dist-server/index.js +6 -0
  88. package/dist-server/index.js.map +1 -0
  89. package/dist-server/middlewares/index.js +8 -0
  90. package/dist-server/middlewares/index.js.map +1 -0
  91. package/dist-server/routes.js +105 -0
  92. package/dist-server/routes.js.map +1 -0
  93. package/dist-server/service/check-item/check-item-mutation.js +129 -0
  94. package/dist-server/service/check-item/check-item-mutation.js.map +1 -0
  95. package/dist-server/service/check-item/check-item-query.js +86 -0
  96. package/dist-server/service/check-item/check-item-query.js.map +1 -0
  97. package/dist-server/service/check-item/check-item-type.js +69 -0
  98. package/dist-server/service/check-item/check-item-type.js.map +1 -0
  99. package/dist-server/service/check-item/check-item.js +84 -0
  100. package/dist-server/service/check-item/check-item.js.map +1 -0
  101. package/dist-server/service/check-item/index.js +9 -0
  102. package/dist-server/service/check-item/index.js.map +1 -0
  103. package/dist-server/service/checklist/checklist-mutation.js +129 -0
  104. package/dist-server/service/checklist/checklist-mutation.js.map +1 -0
  105. package/dist-server/service/checklist/checklist-query.js +86 -0
  106. package/dist-server/service/checklist/checklist-query.js.map +1 -0
  107. package/dist-server/service/checklist/checklist-type.js +69 -0
  108. package/dist-server/service/checklist/checklist-type.js.map +1 -0
  109. package/dist-server/service/checklist/checklist.js +120 -0
  110. package/dist-server/service/checklist/checklist.js.map +1 -0
  111. package/dist-server/service/checklist/index.js +9 -0
  112. package/dist-server/service/checklist/index.js.map +1 -0
  113. package/dist-server/service/index.js +36 -0
  114. package/dist-server/service/index.js.map +1 -0
  115. package/dist-server/service/project/index.js +11 -0
  116. package/dist-server/service/project/index.js.map +1 -0
  117. package/dist-server/service/project/project-mutation.js +190 -0
  118. package/dist-server/service/project/project-mutation.js.map +1 -0
  119. package/dist-server/service/project/project-query.js +143 -0
  120. package/dist-server/service/project/project-query.js.map +1 -0
  121. package/dist-server/service/project/project-type.js +106 -0
  122. package/dist-server/service/project/project-type.js.map +1 -0
  123. package/dist-server/service/project/project.js +146 -0
  124. package/dist-server/service/project/project.js.map +1 -0
  125. package/dist-server/service/resource/index.js +9 -0
  126. package/dist-server/service/resource/index.js.map +1 -0
  127. package/dist-server/service/resource/resource-mutation.js +129 -0
  128. package/dist-server/service/resource/resource-mutation.js.map +1 -0
  129. package/dist-server/service/resource/resource-query.js +86 -0
  130. package/dist-server/service/resource/resource-query.js.map +1 -0
  131. package/dist-server/service/resource/resource-type.js +69 -0
  132. package/dist-server/service/resource/resource-type.js.map +1 -0
  133. package/dist-server/service/resource/resource.js +62 -0
  134. package/dist-server/service/resource/resource.js.map +1 -0
  135. package/dist-server/service/task/index.js +9 -0
  136. package/dist-server/service/task/index.js.map +1 -0
  137. package/dist-server/service/task/task-mutation.js +129 -0
  138. package/dist-server/service/task/task-mutation.js.map +1 -0
  139. package/dist-server/service/task/task-query.js +86 -0
  140. package/dist-server/service/task/task-query.js.map +1 -0
  141. package/dist-server/service/task/task-type.js +69 -0
  142. package/dist-server/service/task/task-type.js.map +1 -0
  143. package/dist-server/service/task/task.js +106 -0
  144. package/dist-server/service/task/task.js.map +1 -0
  145. package/dist-server/tsconfig.tsbuildinfo +1 -0
  146. package/helps/management/alarm.md +160 -0
  147. package/helps/management/alter-video.md +160 -0
  148. package/helps/management/cctv.md +160 -0
  149. package/helps/management/device.md +160 -0
  150. package/helps/management/parking.md +160 -0
  151. package/helps/management/site.md +160 -0
  152. package/helps/management/sun-pnl.md +160 -0
  153. package/helps/project/checklist.md +160 -0
  154. package/helps/project/project.md +160 -0
  155. package/helps/project/resource.md +160 -0
  156. package/helps/project/task.md +160 -0
  157. package/package.json +38 -0
  158. package/server/controllers/index.ts +0 -0
  159. package/server/controllers/project-to-excel.ts +40 -0
  160. package/server/index.ts +3 -0
  161. package/server/middlewares/index.ts +3 -0
  162. package/server/routes.ts +108 -0
  163. package/server/service/check-item/check-item-mutation.ts +142 -0
  164. package/server/service/check-item/check-item-query.ts +56 -0
  165. package/server/service/check-item/check-item-type.ts +49 -0
  166. package/server/service/check-item/check-item.ts +74 -0
  167. package/server/service/check-item/index.ts +6 -0
  168. package/server/service/checklist/checklist-mutation.ts +142 -0
  169. package/server/service/checklist/checklist-query.ts +56 -0
  170. package/server/service/checklist/checklist-type.ts +49 -0
  171. package/server/service/checklist/checklist.ts +105 -0
  172. package/server/service/checklist/index.ts +6 -0
  173. package/server/service/index.ts +35 -0
  174. package/server/service/project/index.ts +8 -0
  175. package/server/service/project/project-mutation.ts +201 -0
  176. package/server/service/project/project-query.ts +103 -0
  177. package/server/service/project/project-type.ts +71 -0
  178. package/server/service/project/project.ts +131 -0
  179. package/server/service/resource/index.ts +6 -0
  180. package/server/service/resource/resource-mutation.ts +139 -0
  181. package/server/service/resource/resource-query.ts +56 -0
  182. package/server/service/resource/resource-type.ts +49 -0
  183. package/server/service/resource/resource.ts +56 -0
  184. package/server/service/task/index.ts +6 -0
  185. package/server/service/task/task-mutation.ts +136 -0
  186. package/server/service/task/task-query.ts +56 -0
  187. package/server/service/task/task-type.ts +49 -0
  188. package/server/service/task/task.ts +97 -0
  189. package/server/tsconfig.json +10 -0
  190. package/things-factory.config.js +20 -0
  191. package/translations/en.json +1 -0
  192. package/translations/ja.json +1 -0
  193. package/translations/ko.json +9 -0
  194. package/translations/ms.json +1 -0
  195. package/translations/zh.json +1 -0
@@ -0,0 +1,618 @@
1
+ import { PageView } from '@operato/shell'
2
+ import { PageLifecycle } from '@operato/shell/dist/src/app/pages/page-view'
3
+ import { css, html } from 'lit'
4
+ import { customElement, state } from 'lit/decorators.js'
5
+ import { ScopedElementsMixin } from '@open-wc/scoped-elements'
6
+ import { client } from '@operato/graphql'
7
+ import { notify } from '@operato/layout'
8
+
9
+ import gql from 'graphql-tag'
10
+ import { Project } from './project-list'
11
+ import '@material/web/button/elevated-button.js'
12
+ import '@material/web/textfield/outlined-text-field.js'
13
+ import '@material/web/button/outlined-button.js'
14
+ import './ox-progress-circle'
15
+ import _getWeather from '../lib/waether'
16
+
17
+ export interface InspectionSummary {
18
+ request: number
19
+ pass: number
20
+ fail: number
21
+ }
22
+
23
+ interface Weather {
24
+ rain: number
25
+ temperature: number
26
+ humidity: number
27
+ wind: string
28
+ }
29
+
30
+ @customElement('project-detail')
31
+ export class ProjectDetail extends ScopedElementsMixin(PageView) {
32
+ static styles = [
33
+ css`
34
+ :host {
35
+ display: grid;
36
+ grid-template-rows: 75px auto;
37
+ color: #4e5055;
38
+
39
+ width: 100%;
40
+ background-color: #f7f7f7;
41
+ overflow-y: auto;
42
+
43
+ --grid-record-emphasized-background-color: red;
44
+ --grid-record-emphasized-color: yellow;
45
+ }
46
+
47
+ md-outlined-button {
48
+ --md-outlined-button-container-height: 30px;
49
+ --md-outlined-button-trailing-space: 15px;
50
+ --md-outlined-button-leading-space: 15px;
51
+ }
52
+
53
+ *[bold] {
54
+ font-weight: bold;
55
+ }
56
+
57
+ div[header] {
58
+ display: flex;
59
+ margin: 0px 20px;
60
+
61
+ h2 {
62
+ flex: 0.5;
63
+ color: #3f71a0;
64
+ }
65
+
66
+ div[button-container] {
67
+ display: flex;
68
+ align-items: center;
69
+ justify-content: end;
70
+ flex: 0.5;
71
+
72
+ md-elevated-button {
73
+ margin: 0px 3px;
74
+
75
+ --md-elevated-button-container-height: 35px;
76
+ --md-elevated-button-label-text-size: 16px;
77
+ --md-elevated-button-container-color: #0595e5;
78
+
79
+ --md-elevated-button-label-text-color: #fff;
80
+ --md-elevated-button-hover-label-text-color: #fff;
81
+ --md-elevated-button-pressed-label-text-color: #fff;
82
+ --md-elevated-button-focus-label-text-color: #fff;
83
+ --md-elevated-button-icon-color: #fff;
84
+ --md-elevated-button-hover-icon-color: #fff;
85
+ --md-elevated-button-pressed-icon-color: #fff;
86
+ --md-elevated-button-focus-icon-color: #fff;
87
+ }
88
+ }
89
+ }
90
+
91
+ div[body] {
92
+ display: flex;
93
+ margin: 0px 25px 25px 25px;
94
+ gap: 10px;
95
+
96
+ h3 {
97
+ color: #2e79be;
98
+ font-size: 18px;
99
+ margin: 0px;
100
+ }
101
+
102
+ & > div {
103
+ display: flex;
104
+ flex: 1;
105
+ gap: 10px;
106
+ flex-direction: column;
107
+
108
+ & > div {
109
+ display: flex;
110
+ flex-direction: column;
111
+ background-color: #ffffff;
112
+ border: 1px solid #cccccc80;
113
+ gap: 10px;
114
+ padding: 15px;
115
+ border-radius: 5px;
116
+ }
117
+
118
+ div[left-top] {
119
+ div[content-1] {
120
+ display: flex;
121
+ align-items: center;
122
+ gap: 15px;
123
+
124
+ img {
125
+ width: 42%;
126
+ height: fit-content;
127
+ }
128
+
129
+ div[row] {
130
+ line-height: 25px;
131
+ }
132
+ }
133
+ div[content-2] {
134
+ height: 65px;
135
+ overflow-y: auto;
136
+ }
137
+ }
138
+
139
+ div[left-bottom] {
140
+ img {
141
+ width: 100%;
142
+ aspect-ratio: 2 / 1;
143
+ }
144
+
145
+ div[subject] {
146
+ margin-bottom: 7px;
147
+ }
148
+ div[building-container] {
149
+ display: block;
150
+ height: 40px;
151
+ overflow-y: auto;
152
+
153
+ & > * {
154
+ margin-right: 10px;
155
+ margin-bottom: 7px;
156
+ }
157
+ }
158
+ }
159
+
160
+ div[right-top] {
161
+ flex: 3;
162
+
163
+ div[state] {
164
+ display: grid;
165
+ grid-template-columns: 0.95fr 0.95fr 1.1fr;
166
+ gap: 15px;
167
+
168
+ span[progress] {
169
+ max-width: 170px;
170
+ text-align: center;
171
+ display: flex;
172
+ justify-self: center;
173
+ flex-direction: column;
174
+ width: 100%;
175
+
176
+ & > div {
177
+ font-weight: bold;
178
+ color: #2e79be;
179
+ font-size: 12px;
180
+ margin-top: 5px;
181
+ }
182
+ & > div[week] {
183
+ color: #06b5af;
184
+ }
185
+ }
186
+ span[weather] {
187
+ display: flex;
188
+ flex-direction: column;
189
+ gap: 5px;
190
+ margin-left: 10px;
191
+
192
+ & > div {
193
+ display: flex;
194
+ justify-content: space-between;
195
+
196
+ & > span {
197
+ display: flex;
198
+ }
199
+ }
200
+ }
201
+ }
202
+ div[inspection] {
203
+ display: grid;
204
+ grid-template-columns: 1.4fr 0.9fr 0.9fr 0.9fr 0.9fr;
205
+ margin-top: 5px;
206
+ background: #f6f6f6;
207
+ border-radius: 7px;
208
+ padding: 7px 0px;
209
+
210
+ & > span {
211
+ display: flex;
212
+ flex-direction: column;
213
+ align-items: center;
214
+ justify-content: center;
215
+
216
+ div[pass] {
217
+ color: #1bb401;
218
+ }
219
+ div[fail] {
220
+ color: #ff4444;
221
+ }
222
+ }
223
+ & > span[name] {
224
+ flex-direction: row;
225
+ text-align: right;
226
+ gap: 10px;
227
+
228
+ md-icon {
229
+ width: 40px;
230
+ height: 40px;
231
+ border-radius: 7px;
232
+ color: #fff;
233
+ background: #f16154;
234
+ }
235
+ }
236
+ }
237
+ div[notice] {
238
+ margin-top: 7px;
239
+
240
+ div[name] {
241
+ margin-left: 4px;
242
+ }
243
+ div[content] {
244
+ background-color: #ebc8321a;
245
+ border-radius: 10px;
246
+ padding: 10px;
247
+ font-size: 14px;
248
+ margin-top: 6px;
249
+ }
250
+ }
251
+ }
252
+
253
+ div[right-bottom] {
254
+ flex: 2;
255
+
256
+ div[table-container] {
257
+ width: 100%;
258
+ height: 15rem;
259
+ overflow-y: auto;
260
+ overflow-x: hidden;
261
+ position: relative;
262
+ }
263
+
264
+ hr {
265
+ position: sticky;
266
+ width: 100%;
267
+ margin: 0;
268
+ top: 0px;
269
+ border: 1px solid #3295f1;
270
+ }
271
+
272
+ table {
273
+ width: 100%;
274
+ border-collapse: collapse;
275
+ table-layout: fixed;
276
+ }
277
+
278
+ thead {
279
+ position: sticky;
280
+ top: 2px;
281
+ background-color: #464651;
282
+ color: #fff;
283
+ z-index: 1;
284
+ }
285
+
286
+ thead th {
287
+ padding: 5px;
288
+ font-size: 15px;
289
+ }
290
+
291
+ tbody td {
292
+ border-bottom: 1px solid #cccccc;
293
+ padding: 5px 3px;
294
+ text-align: center;
295
+ white-space: nowrap;
296
+ text-overflow: ellipsis;
297
+ overflow: hidden;
298
+ font-size: 15px;
299
+ }
300
+ }
301
+ }
302
+ }
303
+ `
304
+ ]
305
+
306
+ get context() {
307
+ return {
308
+ title: '진행 중 프로젝트 상세 정보'
309
+ }
310
+ }
311
+
312
+ private defaultProject = {
313
+ name: '',
314
+ buildingComplex: {
315
+ address: '',
316
+ area: 0,
317
+ constructionCompany: '',
318
+ clientCompany: '',
319
+ supervisoryCompany: '',
320
+ designCompany: '',
321
+ constructionType: '',
322
+ buildings: []
323
+ }
324
+ }
325
+ @state() projectId: string = ''
326
+ @state() project: Project = { ...this.defaultProject }
327
+ @state() inspectionSummary: InspectionSummary = {
328
+ request: 0,
329
+ pass: 0,
330
+ fail: 0
331
+ }
332
+ @state() weather: Weather = {
333
+ rain: 0,
334
+ temperature: 0,
335
+ humidity: 0,
336
+ wind: ''
337
+ }
338
+
339
+ render() {
340
+ return html`
341
+ <div header>
342
+ <h2>${this.project.name}</h2>
343
+ <div button-container>
344
+ <md-elevated-button href=${`project-update/${this.project.id}`}>
345
+ <md-icon slot="icon">assignment</md-icon>프로젝트 정보 수정
346
+ </md-elevated-button>
347
+ <md-elevated-button href=${`project-plan-management/${this.project.id}`}>
348
+ <md-icon slot="icon">description</md-icon>도면 관리
349
+ </md-elevated-button>
350
+ <md-elevated-button href=${`project-task-update/${this.project.id}`}>
351
+ <md-icon slot="icon">event_note</md-icon>공정표 관리
352
+ </md-elevated-button>
353
+ </div>
354
+ </div>
355
+
356
+ <div body>
357
+ <div>
358
+ <div left-top>
359
+ <h3>기본 정보</h3>
360
+ <div content-1>
361
+ <img project-img src=${this.project.mainPhoto?.fullpath || ''} />
362
+
363
+ <div>
364
+ <div row>
365
+ <span>- 면적 : </span>
366
+ <span>${this.project.buildingComplex?.area}</span>
367
+ </div>
368
+ <div row>
369
+ <span>- 착공 ~ 준공 : </span>
370
+ <span bold>${this.project.startDate} ~ ${this.project.endDate}</span>
371
+ </div>
372
+ <div row>
373
+ <span>- 발주처 : </span>
374
+ <span>${this.project.buildingComplex?.clientCompany}</span>
375
+ </div>
376
+ <div row>
377
+ <span>- 건설사 : </span>
378
+ <span>${this.project.buildingComplex?.constructionCompany}</span>
379
+ </div>
380
+ <div row>
381
+ <span>- 감리사 : </span>
382
+ <span>${this.project.buildingComplex?.supervisoryCompany}</span>
383
+ </div>
384
+ <div row>
385
+ <span>- 설계사 : </span>
386
+ <span>${this.project.buildingComplex?.designCompany}</span>
387
+ </div>
388
+ </div>
389
+ </div>
390
+
391
+ <div content-2>
392
+ <div row>
393
+ <span>- 건설구분 : </span>
394
+ <span>${this.project.buildingComplex?.constructionType}</span>
395
+ </div>
396
+ <div row>
397
+ <span>- 공사금액 : </span>
398
+ <span>${this.project.buildingComplex?.constructionCost}</span>
399
+ </div>
400
+ <div row>
401
+ <span>- 세대수 : </span>
402
+ <span>${this.project.buildingComplex?.householdCount}</span>
403
+ </div>
404
+ <div row>
405
+ <span>- 기타 : </span>
406
+ <span>${this.project.buildingComplex?.etc}</span>
407
+ </div>
408
+ </div>
409
+ </div>
410
+
411
+ <div left-bottom>
412
+ <h3>조감도(BIM도면)</h3>
413
+ <img src=${this.project.buildingComplex?.drawing?.fullpath || ''} />
414
+ <div>
415
+ <div subject bold>개별 단지 상세정보 바로가기</div>
416
+ <div building-container>
417
+ ${this.project.buildingComplex?.buildings?.map(building => {
418
+ return html`<md-outlined-button
419
+ href=${`building-complex-detail/${this.project.id}?buildingId=${building.id}`}
420
+ >
421
+ ${building.name}
422
+ </md-outlined-button>`
423
+ })}
424
+ </div>
425
+ </div>
426
+ </div>
427
+ </div>
428
+
429
+ <div>
430
+ <div right-top>
431
+ <h3>프로젝트 현황</h3>
432
+ <div state>
433
+ <span progress>
434
+ <ox-progress-circle
435
+ .value=${70}
436
+ titleText="전체"
437
+ suffix="%"
438
+ fontSize="27px"
439
+ fontColor="#4E5055"
440
+ borderStyle="none"
441
+ innerCircleSize="28%"
442
+ circleColor="#0595E5"
443
+ shadow="#00000026 4px 4px 4px"
444
+ background="#eaf5fd"
445
+ ></ox-progress-circle>
446
+ <div>전체공정율(%)</div>
447
+ </span>
448
+ <span progress>
449
+ <ox-progress-circle
450
+ .value=${30.4}
451
+ titleText="주간"
452
+ fontSize="27px"
453
+ fontColor="#4E5055"
454
+ borderStyle="none"
455
+ innerCircleSize="28%"
456
+ circleColor="#06B5AF"
457
+ shadow="#00000026 4px 4px 4px"
458
+ background="#eaf7f7"
459
+ ></ox-progress-circle>
460
+ <div week>주간공정율(%)</div>
461
+ </span>
462
+ <span weather>
463
+ <div bold>현장현황</div>
464
+ <div>
465
+ <span><md-icon slot="icon">rainy</md-icon> 강수확률</span>
466
+ <span bold>${this.weather.rain}%</span>
467
+ </div>
468
+ <div>
469
+ <span><md-icon slot="icon">humidity_percentage</md-icon> 습도</span>
470
+ <span bold>${this.weather.humidity}%</span>
471
+ </div>
472
+ <div>
473
+ <span><md-icon slot="icon">thermostat</md-icon> 온도</span>
474
+ <span bold>${this.weather.temperature}°C</span>
475
+ </div>
476
+ <div>
477
+ <span><md-icon slot="icon">air</md-icon> 풍향</span>
478
+ <span bold>${this.weather.wind}</span>
479
+ </div>
480
+ </span>
481
+ </div>
482
+ <div inspection>
483
+ <span name bold>
484
+ <md-icon slot="icon">list_alt_add</md-icon>
485
+ 시공검측<br />현황
486
+ </span>
487
+ <span>
488
+ <div>검측요청</div>
489
+ <div bold>${this.inspectionSummary.request}</div>
490
+ </span>
491
+ <span>
492
+ <div>합격</div>
493
+ <div bold pass>${this.inspectionSummary.pass}</div>
494
+ </span>
495
+ <span>
496
+ <div>불합격</div>
497
+ <div bold fail>${this.inspectionSummary.fail}</div>
498
+ </span>
499
+ </div>
500
+ <div notice>
501
+ <div name bold>공지사항</div>
502
+ <div content>${this.project.buildingComplex.notice}</div>
503
+ </div>
504
+ </div>
505
+
506
+ <div right-bottom>
507
+ <h3>기타 사항</h3>
508
+ <div table-container>
509
+ <hr />
510
+ <table>
511
+ <thead>
512
+ <tr>
513
+ <th width="20%">검측 위치</th>
514
+ <th width="20%">공종</th>
515
+ <th width="40%">내용</th>
516
+ <th width="20%">검측결과</th>
517
+ </tr>
518
+ </thead>
519
+ <tbody>
520
+ ${[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1].map(inspection => {
521
+ return html`<tr>
522
+ <td>101동 3층</td>
523
+ <td bold>단열공사</td>
524
+ <td>단열재 시공 층간 차음재 시공 벽돌/블록 및 ALC 패널 공사</td>
525
+ <td bold>검측완료</td>
526
+ </tr>`
527
+ })}
528
+ </tbody>
529
+ </table>
530
+ </div>
531
+ </div>
532
+ </div>
533
+ </div>
534
+ `
535
+ }
536
+
537
+ async pageInitialized(lifecycle: PageLifecycle) {}
538
+
539
+ async pageUpdated(changes: any, lifecycle: PageLifecycle) {
540
+ if (this.active) {
541
+ this.projectId = lifecycle.resourceId || ''
542
+ await this.initProject(this.projectId)
543
+ }
544
+ }
545
+
546
+ async initProject(projectId: string = '') {
547
+ const response = await client.query({
548
+ query: gql`
549
+ query Project($id: String!, $projectId: String!) {
550
+ project(id: $id) {
551
+ id
552
+ name
553
+ startDate
554
+ endDate
555
+ mainPhoto {
556
+ fullpath
557
+ }
558
+ totalProgress
559
+ weeklyProgress
560
+ kpi
561
+ inspPassRate
562
+ robotProgressRate
563
+ structuralSafetyRate
564
+ buildingComplex {
565
+ id
566
+ address
567
+ latitude
568
+ longitude
569
+ area
570
+ clientCompany
571
+ constructionCompany
572
+ supervisoryCompany
573
+ designCompany
574
+ drawing {
575
+ id
576
+ name
577
+ fullpath
578
+ }
579
+ constructionType
580
+ constructionCost
581
+ etc
582
+ notice
583
+ householdCount
584
+ buildingCount
585
+ buildings {
586
+ id
587
+ name
588
+ floorCount
589
+ }
590
+ }
591
+ }
592
+
593
+ inspectionSummary(projectId: $projectId) {
594
+ request
595
+ pass
596
+ fail
597
+ }
598
+ }
599
+ `,
600
+ variables: {
601
+ id: projectId,
602
+ projectId
603
+ }
604
+ })
605
+
606
+ if (response.errors) return
607
+
608
+ this.project = response.data?.project
609
+ this.inspectionSummary = response.data?.inspectionSummary
610
+
611
+ const { latitude, longitude } = this.project?.buildingComplex
612
+ if (latitude && longitude) {
613
+ this.weather = await _getWeather(latitude, longitude)
614
+ }
615
+
616
+ console.log('init project : ', this.project)
617
+ }
618
+ }