@dssp/project 0.0.9 → 0.0.11

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 (286) hide show
  1. package/client/pages/project/project-detail.ts +109 -30
  2. package/client/pages/project/project-list.ts +46 -10
  3. package/client/pages/project/project-schedule-list.ts +11 -3
  4. package/client/pages/project/project-schedule.ts +86 -339
  5. package/client/pages/project/project-setting-list.ts +11 -3
  6. package/client/pages/resource/construction-detail-type-popup.ts +201 -0
  7. package/client/pages/resource/construction-type-management.ts +40 -39
  8. package/client/pages/resource/inspection-drawing-type-management.ts +210 -0
  9. package/client/pages/resource/inspection-part-popup.ts +201 -0
  10. package/client/pages/resource/manager-management.ts +0 -27
  11. package/client/pages/{checklist/checklist-importer.ts → resource/resource-importer.ts} +11 -8
  12. package/client/pages/{checklist/checklist-list-page.ts → resource/resource-list-page.ts} +41 -25
  13. package/client/pages/resource/worker-type-management.ts +3 -37
  14. package/client/pages/task-resource/task-resource-importer.ts +97 -0
  15. package/client/pages/task-resource/task-resource-list-page.ts +356 -0
  16. package/client/route.ts +13 -1
  17. package/dist-client/pages/project/project-detail.d.ts +5 -1
  18. package/dist-client/pages/project/project-detail.js +123 -40
  19. package/dist-client/pages/project/project-detail.js.map +1 -1
  20. package/dist-client/pages/project/project-list.d.ts +33 -7
  21. package/dist-client/pages/project/project-list.js +26 -11
  22. package/dist-client/pages/project/project-list.js.map +1 -1
  23. package/dist-client/pages/project/project-schedule-list.js +11 -3
  24. package/dist-client/pages/project/project-schedule-list.js.map +1 -1
  25. package/dist-client/pages/project/project-schedule.d.ts +5 -1
  26. package/dist-client/pages/project/project-schedule.js +96 -337
  27. package/dist-client/pages/project/project-schedule.js.map +1 -1
  28. package/dist-client/pages/project/project-setting-list.js +11 -3
  29. package/dist-client/pages/project/project-setting-list.js.map +1 -1
  30. package/dist-client/pages/resource/construction-detail-type-popup.d.ts +2 -0
  31. package/dist-client/pages/resource/construction-detail-type-popup.js +197 -0
  32. package/dist-client/pages/resource/construction-detail-type-popup.js.map +1 -0
  33. package/dist-client/pages/resource/construction-type-management.d.ts +12 -0
  34. package/dist-client/pages/resource/construction-type-management.js +30 -38
  35. package/dist-client/pages/resource/construction-type-management.js.map +1 -1
  36. package/dist-client/pages/resource/inspection-drawing-type-management.d.ts +34 -0
  37. package/dist-client/pages/resource/inspection-drawing-type-management.js +198 -0
  38. package/dist-client/pages/resource/inspection-drawing-type-management.js.map +1 -0
  39. package/dist-client/pages/resource/inspection-part-popup.d.ts +2 -0
  40. package/dist-client/pages/resource/inspection-part-popup.js +197 -0
  41. package/dist-client/pages/resource/inspection-part-popup.js.map +1 -0
  42. package/dist-client/pages/resource/manager-management.js +0 -27
  43. package/dist-client/pages/resource/manager-management.js.map +1 -1
  44. package/dist-client/pages/{checklist/checklist-importer.d.ts → resource/resource-importer.d.ts} +2 -2
  45. package/dist-client/pages/{checklist/checklist-importer.js → resource/resource-importer.js} +10 -10
  46. package/dist-client/pages/resource/resource-importer.js.map +1 -0
  47. package/dist-client/pages/{checklist/checklist-list-page.d.ts → resource/resource-list-page.d.ts} +6 -6
  48. package/dist-client/pages/{checklist/checklist-list-page.js → resource/resource-list-page.js} +41 -32
  49. package/dist-client/pages/resource/resource-list-page.js.map +1 -0
  50. package/dist-client/pages/resource/worker-type-management.d.ts +7 -1
  51. package/dist-client/pages/resource/worker-type-management.js +3 -45
  52. package/dist-client/pages/resource/worker-type-management.js.map +1 -1
  53. package/dist-client/pages/task-resource/task-resource-importer.d.ts +10 -0
  54. package/dist-client/pages/task-resource/task-resource-importer.js +101 -0
  55. package/dist-client/pages/task-resource/task-resource-importer.js.map +1 -0
  56. package/dist-client/pages/task-resource/task-resource-list-page.d.ts +63 -0
  57. package/dist-client/pages/task-resource/task-resource-list-page.js +332 -0
  58. package/dist-client/pages/task-resource/task-resource-list-page.js.map +1 -0
  59. package/dist-client/route.d.ts +1 -1
  60. package/dist-client/route.js +9 -0
  61. package/dist-client/route.js.map +1 -1
  62. package/dist-client/tsconfig.tsbuildinfo +1 -1
  63. package/dist-server/controllers/import-task.d.ts +19 -0
  64. package/dist-server/controllers/import-task.js +104 -0
  65. package/dist-server/controllers/import-task.js.map +1 -0
  66. package/dist-server/index.d.ts +1 -0
  67. package/dist-server/index.js +1 -0
  68. package/dist-server/index.js.map +1 -1
  69. package/dist-server/migrations/1723861466413-seed-roles.d.ts +5 -0
  70. package/dist-server/migrations/1723861466413-seed-roles.js +117 -0
  71. package/dist-server/migrations/1723861466413-seed-roles.js.map +1 -0
  72. package/dist-server/migrations/1723861466414-seed-codes.d.ts +5 -0
  73. package/dist-server/migrations/1723861466414-seed-codes.js +132 -0
  74. package/dist-server/migrations/1723861466414-seed-codes.js.map +1 -0
  75. package/dist-server/migrations/1723861476419-seed-resources.d.ts +5 -0
  76. package/dist-server/migrations/1723861476419-seed-resources.js +57 -0
  77. package/dist-server/migrations/1723861476419-seed-resources.js.map +1 -0
  78. package/dist-server/migrations/1723861478420-seed-/bsample-project.d.ts +5 -0
  79. package/dist-server/migrations/1723861478420-seed-/bsample-project.js +68 -0
  80. package/dist-server/migrations/1723861478420-seed-/bsample-project.js.map +1 -0
  81. package/dist-server/migrations/1723861478421-seed-/bsample-tasks.d.ts +5 -0
  82. package/dist-server/migrations/1723861478421-seed-/bsample-tasks.js +189 -0
  83. package/dist-server/migrations/1723861478421-seed-/bsample-tasks.js.map +1 -0
  84. package/dist-server/migrations/index.d.ts +1 -0
  85. package/dist-server/migrations/index.js +12 -0
  86. package/dist-server/migrations/index.js.map +1 -0
  87. package/dist-server/service/construction-detail-type/construction-detail-type-mutation.d.ts +6 -0
  88. package/dist-server/service/construction-detail-type/construction-detail-type-mutation.js +56 -0
  89. package/dist-server/service/construction-detail-type/construction-detail-type-mutation.js.map +1 -0
  90. package/dist-server/service/construction-detail-type/construction-detail-type-query.d.ts +9 -0
  91. package/dist-server/service/construction-detail-type/construction-detail-type-query.js +53 -0
  92. package/dist-server/service/construction-detail-type/construction-detail-type-query.js.map +1 -0
  93. package/dist-server/service/construction-detail-type/construction-detail-type-type.d.ts +11 -0
  94. package/dist-server/service/construction-detail-type/construction-detail-type-type.js +43 -0
  95. package/dist-server/service/construction-detail-type/construction-detail-type-type.js.map +1 -0
  96. package/dist-server/service/construction-detail-type/construction-detail-type.d.ts +15 -0
  97. package/dist-server/service/construction-detail-type/construction-detail-type.js +69 -0
  98. package/dist-server/service/construction-detail-type/construction-detail-type.js.map +1 -0
  99. package/dist-server/service/construction-detail-type/index.d.ts +5 -0
  100. package/dist-server/service/construction-detail-type/index.js +9 -0
  101. package/dist-server/service/construction-detail-type/index.js.map +1 -0
  102. package/dist-server/service/construction-type/construction-type-query.d.ts +2 -0
  103. package/dist-server/service/construction-type/construction-type-query.js +14 -0
  104. package/dist-server/service/construction-type/construction-type-query.js.map +1 -1
  105. package/dist-server/service/construction-type/construction-type.d.ts +2 -0
  106. package/dist-server/service/construction-type/construction-type.js +6 -0
  107. package/dist-server/service/construction-type/construction-type.js.map +1 -1
  108. package/dist-server/service/index.d.ts +7 -5
  109. package/dist-server/service/index.js +21 -10
  110. package/dist-server/service/index.js.map +1 -1
  111. package/dist-server/service/inspection-drawing-type/index.d.ts +5 -0
  112. package/dist-server/service/inspection-drawing-type/index.js +9 -0
  113. package/dist-server/service/inspection-drawing-type/index.js.map +1 -0
  114. package/dist-server/service/inspection-drawing-type/inspection-drawing-type-mutation.d.ts +6 -0
  115. package/dist-server/service/inspection-drawing-type/inspection-drawing-type-mutation.js +64 -0
  116. package/dist-server/service/inspection-drawing-type/inspection-drawing-type-mutation.js.map +1 -0
  117. package/dist-server/service/inspection-drawing-type/inspection-drawing-type-query.d.ts +12 -0
  118. package/dist-server/service/inspection-drawing-type/inspection-drawing-type-query.js +83 -0
  119. package/dist-server/service/inspection-drawing-type/inspection-drawing-type-query.js.map +1 -0
  120. package/dist-server/service/inspection-drawing-type/inspection-drawing-type-type.d.ts +10 -0
  121. package/dist-server/service/inspection-drawing-type/inspection-drawing-type-type.js +39 -0
  122. package/dist-server/service/inspection-drawing-type/inspection-drawing-type-type.js.map +1 -0
  123. package/dist-server/service/inspection-drawing-type/inspection-drawing-type.d.ts +16 -0
  124. package/dist-server/service/inspection-drawing-type/inspection-drawing-type.js +72 -0
  125. package/dist-server/service/inspection-drawing-type/inspection-drawing-type.js.map +1 -0
  126. package/dist-server/service/inspection-part/index.d.ts +5 -0
  127. package/dist-server/service/inspection-part/index.js +9 -0
  128. package/dist-server/service/inspection-part/index.js.map +1 -0
  129. package/dist-server/service/inspection-part/inspection-part-mutation.d.ts +6 -0
  130. package/dist-server/service/inspection-part/inspection-part-mutation.js +55 -0
  131. package/dist-server/service/inspection-part/inspection-part-mutation.js.map +1 -0
  132. package/dist-server/service/inspection-part/inspection-part-query.d.ts +10 -0
  133. package/dist-server/service/inspection-part/inspection-part-query.js +66 -0
  134. package/dist-server/service/inspection-part/inspection-part-query.js.map +1 -0
  135. package/dist-server/service/inspection-part/inspection-part-type.d.ts +11 -0
  136. package/dist-server/service/inspection-part/inspection-part-type.js +43 -0
  137. package/dist-server/service/inspection-part/inspection-part-type.js.map +1 -0
  138. package/dist-server/service/inspection-part/inspection-part.d.ts +15 -0
  139. package/dist-server/service/inspection-part/inspection-part.js +69 -0
  140. package/dist-server/service/inspection-part/inspection-part.js.map +1 -0
  141. package/dist-server/service/project/index.d.ts +0 -2
  142. package/dist-server/service/project/index.js +1 -3
  143. package/dist-server/service/project/index.js.map +1 -1
  144. package/dist-server/service/project/project-query.d.ts +7 -5
  145. package/dist-server/service/project/project-query.js +34 -38
  146. package/dist-server/service/project/project-query.js.map +1 -1
  147. package/dist-server/service/project/project-type.d.ts +3 -6
  148. package/dist-server/service/project/project-type.js +25 -35
  149. package/dist-server/service/project/project-type.js.map +1 -1
  150. package/dist-server/service/project/project.d.ts +3 -2
  151. package/dist-server/service/project/project.js +10 -10
  152. package/dist-server/service/project/project.js.map +1 -1
  153. package/dist-server/service/resource/index.d.ts +6 -0
  154. package/dist-server/service/resource/index.js +10 -0
  155. package/dist-server/service/resource/index.js.map +1 -0
  156. package/dist-server/service/resource/resource-mutation.d.ts +10 -0
  157. package/dist-server/service/resource/resource-mutation.js +132 -0
  158. package/dist-server/service/resource/resource-mutation.js.map +1 -0
  159. package/dist-server/service/resource/resource-query.d.ts +11 -0
  160. package/dist-server/service/{checklist/checklist-query.js → resource/resource-query.js} +33 -38
  161. package/dist-server/service/resource/resource-query.js.map +1 -0
  162. package/dist-server/service/resource/resource-type.d.ts +17 -0
  163. package/dist-server/service/resource/resource-type.js +65 -0
  164. package/dist-server/service/resource/resource-type.js.map +1 -0
  165. package/dist-server/service/resource/resource.d.ts +24 -0
  166. package/dist-server/service/resource/resource.js +93 -0
  167. package/dist-server/service/resource/resource.js.map +1 -0
  168. package/dist-server/service/task/task-mutation.js +6 -0
  169. package/dist-server/service/task/task-mutation.js.map +1 -1
  170. package/dist-server/service/task/task-query.d.ts +9 -1
  171. package/dist-server/service/task/task-query.js +142 -20
  172. package/dist-server/service/task/task-query.js.map +1 -1
  173. package/dist-server/service/task/task-type.d.ts +13 -0
  174. package/dist-server/service/task/task-type.js +57 -12
  175. package/dist-server/service/task/task-type.js.map +1 -1
  176. package/dist-server/service/task/task.d.ts +12 -5
  177. package/dist-server/service/task/task.js +51 -16
  178. package/dist-server/service/task/task.js.map +1 -1
  179. package/dist-server/service/task-resource/index.d.ts +6 -0
  180. package/dist-server/service/task-resource/index.js +10 -0
  181. package/dist-server/service/task-resource/index.js.map +1 -0
  182. package/dist-server/service/task-resource/task-resource-mutation.d.ts +10 -0
  183. package/dist-server/service/task-resource/task-resource-mutation.js +132 -0
  184. package/dist-server/service/task-resource/task-resource-mutation.js.map +1 -0
  185. package/dist-server/service/task-resource/task-resource-query.d.ts +7 -0
  186. package/dist-server/service/task-resource/task-resource-query.js +50 -0
  187. package/dist-server/service/task-resource/task-resource-query.js.map +1 -0
  188. package/dist-server/service/task-resource/task-resource-type.d.ts +17 -0
  189. package/dist-server/service/task-resource/task-resource-type.js +65 -0
  190. package/dist-server/service/task-resource/task-resource-type.js.map +1 -0
  191. package/dist-server/service/task-resource/task-resource.d.ts +13 -0
  192. package/dist-server/service/task-resource/task-resource.js +59 -0
  193. package/dist-server/service/task-resource/task-resource.js.map +1 -0
  194. package/dist-server/tsconfig.tsbuildinfo +1 -1
  195. package/helps/project/checklist-type-detail.md +160 -0
  196. package/helps/project/checklist-type.md +160 -0
  197. package/helps/project/task-resource.md +160 -0
  198. package/package.json +11 -7
  199. package/server/controllers/import-task.ts +140 -0
  200. package/server/index.ts +1 -0
  201. package/server/migrations/1723861466413-seed-roles.ts +128 -0
  202. package/server/migrations/1723861466414-seed-codes.ts +139 -0
  203. package/server/migrations/1723861476419-seed-resources.ts +62 -0
  204. package/server/migrations/1723861478420-seed-/bsample-project.ts +87 -0
  205. package/server/migrations/1723861478421-seed-/bsample-tasks.ts +194 -0
  206. package/server/migrations/index.ts +9 -0
  207. package/server/service/construction-detail-type/construction-detail-type-mutation.ts +57 -0
  208. package/server/service/construction-detail-type/construction-detail-type-query.ts +31 -0
  209. package/server/service/construction-detail-type/construction-detail-type-type.ts +26 -0
  210. package/server/service/construction-detail-type/construction-detail-type.ts +52 -0
  211. package/server/service/construction-detail-type/index.ts +6 -0
  212. package/server/service/construction-type/construction-type-query.ts +9 -0
  213. package/server/service/construction-type/construction-type.ts +8 -2
  214. package/server/service/index.ts +24 -11
  215. package/server/service/inspection-drawing-type/index.ts +6 -0
  216. package/server/service/inspection-drawing-type/inspection-drawing-type-mutation.ts +69 -0
  217. package/server/service/inspection-drawing-type/inspection-drawing-type-query.ts +55 -0
  218. package/server/service/inspection-drawing-type/inspection-drawing-type-type.ts +23 -0
  219. package/server/service/inspection-drawing-type/inspection-drawing-type.ts +68 -0
  220. package/server/service/inspection-part/index.ts +6 -0
  221. package/server/service/inspection-part/inspection-part-mutation.ts +52 -0
  222. package/server/service/inspection-part/inspection-part-query.ts +41 -0
  223. package/server/service/inspection-part/inspection-part-type.ts +26 -0
  224. package/server/service/inspection-part/inspection-part.ts +51 -0
  225. package/server/service/project/index.ts +0 -2
  226. package/server/service/project/project-query.ts +30 -38
  227. package/server/service/project/project-type.ts +22 -27
  228. package/server/service/project/project.ts +11 -12
  229. package/server/service/resource/index.ts +7 -0
  230. package/server/service/resource/resource-mutation.ts +137 -0
  231. package/server/service/resource/resource-query.ts +50 -0
  232. package/server/service/resource/resource-type.ts +41 -0
  233. package/server/service/resource/resource.ts +82 -0
  234. package/server/service/task/task-mutation.ts +8 -9
  235. package/server/service/task/task-query.ts +135 -22
  236. package/server/service/task/task-type.ts +41 -15
  237. package/server/service/task/task.ts +44 -15
  238. package/server/service/task-resource/index.ts +7 -0
  239. package/server/service/task-resource/task-resource-mutation.ts +140 -0
  240. package/server/service/task-resource/task-resource-query.ts +36 -0
  241. package/server/service/task-resource/task-resource-type.ts +41 -0
  242. package/server/service/task-resource/task-resource.ts +51 -0
  243. package/things-factory.config.js +1 -0
  244. package/translations/en.json +15 -1
  245. package/translations/ko.json +9 -5
  246. package/dist-client/pages/checklist/checklist-importer.js.map +0 -1
  247. package/dist-client/pages/checklist/checklist-list-page.js.map +0 -1
  248. package/dist-server/service/check-item/check-item-mutation.d.ts +0 -10
  249. package/dist-server/service/check-item/check-item-mutation.js +0 -129
  250. package/dist-server/service/check-item/check-item-mutation.js.map +0 -1
  251. package/dist-server/service/check-item/check-item-query.d.ts +0 -11
  252. package/dist-server/service/check-item/check-item-query.js +0 -86
  253. package/dist-server/service/check-item/check-item-query.js.map +0 -1
  254. package/dist-server/service/check-item/check-item-type.d.ts +0 -18
  255. package/dist-server/service/check-item/check-item-type.js +0 -69
  256. package/dist-server/service/check-item/check-item-type.js.map +0 -1
  257. package/dist-server/service/check-item/check-item.d.ts +0 -18
  258. package/dist-server/service/check-item/check-item.js +0 -84
  259. package/dist-server/service/check-item/check-item.js.map +0 -1
  260. package/dist-server/service/check-item/index.d.ts +0 -5
  261. package/dist-server/service/check-item/index.js +0 -9
  262. package/dist-server/service/check-item/index.js.map +0 -1
  263. package/dist-server/service/checklist/checklist-mutation.d.ts +0 -10
  264. package/dist-server/service/checklist/checklist-mutation.js +0 -129
  265. package/dist-server/service/checklist/checklist-mutation.js.map +0 -1
  266. package/dist-server/service/checklist/checklist-query.d.ts +0 -11
  267. package/dist-server/service/checklist/checklist-query.js.map +0 -1
  268. package/dist-server/service/checklist/checklist-type.d.ts +0 -18
  269. package/dist-server/service/checklist/checklist-type.js +0 -69
  270. package/dist-server/service/checklist/checklist-type.js.map +0 -1
  271. package/dist-server/service/checklist/checklist.d.ts +0 -26
  272. package/dist-server/service/checklist/checklist.js +0 -120
  273. package/dist-server/service/checklist/checklist.js.map +0 -1
  274. package/dist-server/service/checklist/index.d.ts +0 -5
  275. package/dist-server/service/checklist/index.js +0 -9
  276. package/dist-server/service/checklist/index.js.map +0 -1
  277. package/server/service/check-item/check-item-mutation.ts +0 -142
  278. package/server/service/check-item/check-item-query.ts +0 -56
  279. package/server/service/check-item/check-item-type.ts +0 -49
  280. package/server/service/check-item/check-item.ts +0 -74
  281. package/server/service/check-item/index.ts +0 -6
  282. package/server/service/checklist/checklist-mutation.ts +0 -142
  283. package/server/service/checklist/checklist-query.ts +0 -56
  284. package/server/service/checklist/checklist-type.ts +0 -49
  285. package/server/service/checklist/checklist.ts +0 -105
  286. package/server/service/checklist/index.ts +0 -6
@@ -1,30 +1,39 @@
1
- import { Resolver, Query, FieldResolver, Root, Args, Arg, Ctx, Directive } from 'type-graphql'
2
- import { Attachment } from '@things-factory/attachment-base'
1
+ import { Resolver, Query, Field, FieldResolver, ObjectType, Root, Args, Arg, Ctx, Directive } from 'type-graphql'
3
2
  import { Domain, getQueryBuilderFromListParams, getRepository, ListParam } from '@things-factory/shell'
4
3
  import { User } from '@things-factory/auth-base'
5
- import { Task } from './task'
4
+ import { Task, TaskType } from './task'
6
5
  import { TaskList } from './task-type'
6
+ import { TaskResource } from '../task-resource/task-resource'
7
+ import { ResourceType } from 'service/resource/resource'
8
+
9
+ @ObjectType()
10
+ export class DigestedResource {
11
+ @Field({ nullable: true, description: '자원 유형' })
12
+ type?: string
13
+
14
+ @Field({ nullable: true, description: '할당량' })
15
+ allocated?: number
16
+ }
7
17
 
8
18
  @Resolver(Task)
9
19
  export class TaskQuery {
10
- @Query(returns => Task!, { nullable: true, description: 'To fetch a Task' })
20
+ @Directive('@privilege(category: "project", privilege: "query", domainOwnerGranted: true)')
21
+ @Query(returns => Task!, { nullable: true, description: 'Fetch a single Task by its ID' })
11
22
  async task(@Arg('id') id: string, @Ctx() context: ResolverContext): Promise<Task> {
12
- const { domain } = context.state
13
-
14
23
  return await getRepository(Task).findOne({
15
- where: { id }
24
+ where: { id },
25
+ relations: ['parent', 'taskResources']
16
26
  })
17
27
  }
18
28
 
19
- @Query(returns => TaskList, { description: 'To fetch multiple Tasks' })
29
+ @Directive('@privilege(category: "project", privilege: "query", domainOwnerGranted: true)')
30
+ @Query(returns => TaskList, { description: 'Fetch multiple Tasks based on list parameters' })
20
31
  async tasks(@Args() params: ListParam, @Ctx() context: ResolverContext): Promise<TaskList> {
21
- const { domain } = context.state
22
-
23
32
  const queryBuilder = getQueryBuilderFromListParams({
24
- domain,
25
33
  params,
26
34
  repository: await getRepository(Task),
27
- searchables: ['name', 'description']
35
+ alias: 'tasks',
36
+ searchables: ['name', 'code']
28
37
  })
29
38
 
30
39
  const [items, total] = await queryBuilder.getManyAndCount()
@@ -32,24 +41,128 @@ export class TaskQuery {
32
41
  return { items, total }
33
42
  }
34
43
 
35
- @FieldResolver(type => String)
36
- async thumbnail(@Root() task: Task): Promise<string | undefined> {
37
- const attachment: Attachment = await getRepository(Attachment).findOne({
38
- where: {
39
- refType: Task.name,
40
- refBy: task.id
44
+ // @FieldResolver(type => Date, { nullable: true, description: 'Calculate or return the start date of the task' })
45
+ // async startDate(@Root() task: Task): Promise<Date | undefined> {
46
+ // if (task.type === TaskType.TASK) {
47
+ // return task.startDate
48
+ // } else {
49
+ // const children = await getRepository(Task).find({ where: { parent: { id: task.id } } })
50
+ // return children.reduce(
51
+ // (earliest, child) => {
52
+ // if (!earliest || (child.startDate && child.startDate < earliest)) {
53
+ // return child.startDate
54
+ // }
55
+ // return earliest
56
+ // },
57
+ // undefined as Date | undefined
58
+ // )
59
+ // }
60
+ // }
61
+
62
+ // @FieldResolver(type => Date, { nullable: true, description: 'Calculate or return the end date of the task' })
63
+ // async endDate(@Root() task: Task): Promise<Date | undefined> {
64
+ // if (task.type === TaskType.TASK) {
65
+ // return task.endDate
66
+ // } else {
67
+ // const children = await getRepository(Task).find({ where: { parent: { id: task.id } } })
68
+ // return children.reduce(
69
+ // (latest, child) => {
70
+ // if (!latest || (child.endDate && child.endDate > latest)) {
71
+ // return child.endDate
72
+ // }
73
+ // return latest
74
+ // },
75
+ // undefined as Date | undefined
76
+ // )
77
+ // }
78
+ // }
79
+
80
+ // @FieldResolver(type => Number, { nullable: true, description: 'Calculate the duration of the task in days' })
81
+ // async duration(@Root() task: Task): Promise<number | undefined> {
82
+ // if (task.type === TaskType.TASK) {
83
+ // return task.duration
84
+ // } else {
85
+ // const startDate = await this.startDate(task)
86
+ // const endDate = await this.endDate(task)
87
+
88
+ // if (startDate && endDate) {
89
+ // const durationInMs = endDate.getTime() - startDate.getTime()
90
+ // const durationInDays = Math.ceil(durationInMs / (1000 * 60 * 60 * 24))
91
+ // return durationInDays
92
+ // }
93
+
94
+ // return
95
+ // }
96
+ // }
97
+
98
+ @FieldResolver(type => String, { nullable: true, description: 'Calculate the duration of the task in days' })
99
+ async length(@Root() task: Task): Promise<string | undefined> {
100
+ // if (task.type === TaskType.TASK) {
101
+ return `${task.duration || 1}d`
102
+ // } else {
103
+ // const startDate = await this.startDate(task)
104
+ // const endDate = await this.endDate(task)
105
+
106
+ // if (startDate && endDate) {
107
+ // const durationInMs = endDate.getTime() - startDate.getTime()
108
+ // const durationInDays = Math.ceil(durationInMs / (1000 * 60 * 60 * 24))
109
+ // return `${durationInDays || 1}d`
110
+ // }
111
+
112
+ // return
113
+ // }
114
+ }
115
+
116
+ @FieldResolver(type => [Task])
117
+ async children(
118
+ @Root() task: Task,
119
+ @Args(type => ListParam) params: ListParam,
120
+ @Ctx() context: ResolverContext
121
+ ): Promise<Task[]> {
122
+ const { domain } = context.state
123
+
124
+ const queryBuilder = getQueryBuilderFromListParams({
125
+ params,
126
+ alias: 'tasks',
127
+ repository: await getRepository(Task),
128
+ searchables: ['name', 'code']
129
+ }).andWhere({ parent: { id: task.id } })
130
+
131
+ const [items, total] = await queryBuilder.getManyAndCount()
132
+
133
+ return items
134
+ }
135
+
136
+ @FieldResolver(type => [TaskResource], { description: 'Return the list of resources allocated to the task' })
137
+ async taskResources(@Root() task: Task): Promise<TaskResource[]> {
138
+ return task?.id && (await getRepository(TaskResource).find({ where: { task: { id: task.id } } }))
139
+ }
140
+
141
+ @FieldResolver(type => [DigestedResource], { description: 'Return the simple list of resources allocated to the task' })
142
+ async resources(@Root() task: Task): Promise<DigestedResource[]> {
143
+ const taskResources =
144
+ task?.id &&
145
+ (await getRepository(TaskResource).find({
146
+ where: {
147
+ task: { id: task.id }
148
+ },
149
+ relations: ['resource']
150
+ }))
151
+
152
+ return (taskResources || []).map(taskResource => {
153
+ return {
154
+ type: taskResource.resource.name,
155
+ allocated: taskResource.quantity
41
156
  }
42
157
  })
43
-
44
- return attachment?.fullpath
45
158
  }
46
159
 
47
- @FieldResolver(type => User)
160
+ @FieldResolver(type => User, { description: 'Fetch the user who last updated the task' })
48
161
  async updater(@Root() task: Task): Promise<User> {
49
162
  return await getRepository(User).findOneBy({ id: task.updaterId })
50
163
  }
51
164
 
52
- @FieldResolver(type => User)
165
+ @FieldResolver(type => User, { description: 'Fetch the user who created the task' })
53
166
  async creator(@Root() task: Task): Promise<User> {
54
167
  return await getRepository(User).findOneBy({ id: task.creatorId })
55
168
  }
@@ -1,49 +1,75 @@
1
- import type { FileUpload } from 'graphql-upload/GraphQLUpload.js'
2
- import GraphQLUpload from 'graphql-upload/GraphQLUpload.js'
3
1
  import { ObjectType, Field, InputType, Int, ID, registerEnumType } from 'type-graphql'
4
-
5
2
  import { ObjectRef, ScalarObject } from '@things-factory/shell'
6
-
7
3
  import { Task } from './task'
8
4
 
5
+ @InputType()
6
+ export class ObjectRefForProject extends ObjectRef {
7
+ @Field({ nullable: true, description: '프로젝트 이름 (선택 사항)' })
8
+ name?: string
9
+ }
10
+
11
+ @InputType()
12
+ export class ObjectRefForTask extends ObjectRef {
13
+ @Field({ nullable: true, description: '작업 코드 (선택 사항)' })
14
+ code?: string
15
+ }
16
+
9
17
  @InputType()
10
18
  export class NewTask {
11
- @Field()
19
+ @Field({ description: '프로젝트 내에서 유니크한 작업 코드' })
20
+ code: string
21
+
22
+ @Field({ description: '작업의 이름' })
12
23
  name: string
13
24
 
14
- @Field({ nullable: true })
25
+ @Field(type => ObjectRefForProject, { nullable: true, description: '작업이 속한 프로젝트 (선택 사항)' })
26
+ project?: ObjectRefForProject
27
+
28
+ @Field(type => ObjectRefForTask, { nullable: true, description: '부모 작업, 해당 작업이 하위 작업인 경우 (선택 사항)' })
29
+ parent?: ObjectRefForTask
30
+
31
+ @Field({ nullable: true, description: '작업에 대한 설명 (선택 사항)' })
15
32
  description?: string
16
33
 
17
- @Field({ nullable: true })
34
+ @Field({ nullable: true, description: '작업이 활성 상태인지 여부 (선택 사항)' })
18
35
  active?: boolean
19
36
 
20
- @Field({ nullable: true })
37
+ @Field({ nullable: true, description: '작업에 대한 추가 파라미터, JSON 형식으로 저장 (선택 사항)' })
21
38
  params?: string
22
39
  }
23
40
 
24
41
  @InputType()
25
42
  export class TaskPatch {
26
- @Field(type => ID, { nullable: true })
43
+ @Field(type => ID, { nullable: true, description: '수정할 작업의 ID (선택 사항)' })
27
44
  id?: string
28
45
 
29
- @Field({ nullable: true })
46
+ @Field({ nullable: true, description: '프로젝트 내에서 유니크한 작업 코드 (선택 사항)' })
47
+ code?: string
48
+
49
+ @Field({ nullable: true, description: '작업의 이름 (선택 사항)' })
30
50
  name?: string
31
51
 
32
- @Field({ nullable: true })
52
+ @Field(type => ObjectRefForProject, { nullable: true, description: '작업이 속한 프로젝트 (선택 사항)' })
53
+ project?: ObjectRefForProject
54
+
55
+ @Field(type => ObjectRefForTask, { nullable: true, description: '부모 작업, 해당 작업이 하위 작업인 경우 (선택 사항)' })
56
+ parent?: ObjectRefForTask
57
+
58
+ @Field({ nullable: true, description: '작업에 대한 설명 (선택 사항)' })
33
59
  description?: string
34
60
 
35
- @Field({ nullable: true })
61
+ @Field({ nullable: true, description: '작업이 활성 상태인지 여부 (선택 사항)' })
36
62
  active?: boolean
37
63
 
38
- @Field({ nullable: true })
64
+ @Field({ nullable: true, description: "생성('+') 또는 수정('M') 플래그 (선택 사항)" })
39
65
  cuFlag?: string
40
66
  }
41
67
 
42
68
  @ObjectType()
43
69
  export class TaskList {
44
- @Field(type => [Task])
70
+ @Field(type => [Task], { description: '작업 리스트 항목들' })
45
71
  items: Task[]
46
72
 
47
- @Field(type => Int)
73
+ @Field(type => Int, { description: '전체 작업 수' })
48
74
  total: number
49
75
  }
@@ -4,23 +4,23 @@ import {
4
4
  DeleteDateColumn,
5
5
  Entity,
6
6
  Index,
7
- JoinTable,
8
7
  Column,
9
8
  RelationId,
10
- ManyToMany,
11
9
  ManyToOne,
12
10
  OneToMany,
13
11
  PrimaryGeneratedColumn
14
12
  } from 'typeorm'
15
13
  import { ObjectType, Field, ID, registerEnumType } from 'type-graphql'
16
14
 
15
+ import { ScalarObject } from '@things-factory/shell'
17
16
  import { User } from '@things-factory/auth-base'
18
17
  import { Project } from '../project/project'
19
- import { Checklist } from '../checklist/checklist'
18
+ // import { Checklist } from '@dssp/supervisor'
19
+ import { TaskResource } from '../task-resource/task-resource'
20
20
 
21
21
  export enum TaskType {
22
- GROUP = 'GROUP',
23
- TASK = 'TASK'
22
+ GROUP = 'group',
23
+ TASK = 'task'
24
24
  }
25
25
 
26
26
  registerEnumType(TaskType, {
@@ -29,13 +29,17 @@ registerEnumType(TaskType, {
29
29
  })
30
30
 
31
31
  @Entity()
32
- @Index('ix_task_0', (task: Task) => [task.project], { where: '"deleted_at" IS NULL' })
32
+ @Index('ix_task_project_code', (task: Task) => [task.project, task.code], { unique: true, where: '"deleted_at" IS NULL' })
33
33
  @ObjectType({ description: '공정표 작업 정보' })
34
34
  export class Task {
35
35
  @PrimaryGeneratedColumn('uuid')
36
36
  @Field(type => ID)
37
37
  readonly id: string
38
38
 
39
+ @Column({ nullable: false, comment: '프로젝트 내에서 유니크한 작업 코드' })
40
+ @Field({ nullable: false })
41
+ code: string
42
+
39
43
  @Column({ nullable: true, comment: '작업 명' })
40
44
  @Field({ nullable: true })
41
45
  name?: string
@@ -44,9 +48,16 @@ export class Task {
44
48
  @Field({ nullable: true })
45
49
  type?: TaskType
46
50
 
47
- @Column({ nullable: true, comment: '테스크에 그룹(부모)가 있을 taskId' })
51
+ @ManyToOne(type => Task, task => task.children, { nullable: true })
48
52
  @Field({ nullable: true })
49
- parentTaskId?: string
53
+ parent: Task
54
+
55
+ @RelationId((task: Task) => task.parent)
56
+ parentId?: string
57
+
58
+ @OneToMany(type => Task, task => task.parent, { nullable: true })
59
+ @Field(type => [Task], { nullable: true })
60
+ children?: Task[]
50
61
 
51
62
  @Column({ nullable: true, comment: '시작일' })
52
63
  @Field({ nullable: true })
@@ -56,18 +67,36 @@ export class Task {
56
67
  @Field({ nullable: true })
57
68
  endDate?: Date
58
69
 
59
- // 프로젝트 정보 (상위 테이블 참조)
60
- @Field(() => Project)
61
- @ManyToOne(() => Project, project => project.tasks)
70
+ @Column({ nullable: true, comment: '기간' })
71
+ @Field({ nullable: true })
72
+ duration?: number
73
+
74
+ @Column({ nullable: true, comment: '선행 태스크 코드' })
75
+ @Field({ nullable: true })
76
+ dependsOn?: string
77
+
78
+ @ManyToOne(type => Project, project => project.tasks)
79
+ @Field(type => Project)
62
80
  project?: Project
63
81
 
64
82
  @RelationId((task: Task) => task.project)
65
83
  projectId?: string
66
84
 
67
- // 체크리스트 정보 (하위 테이블 참조)
68
- @Field(() => Checklist)
69
- @OneToMany(() => Checklist, checklist => checklist.task)
70
- checklists?: Checklist[]
85
+ @Column('simple-json', { nullable: true, default: null })
86
+ @Field(type => ScalarObject, { nullable: true })
87
+ tags?: string[]
88
+
89
+ @Column({ nullable: true, comment: '진행율' })
90
+ @Field({ nullable: true })
91
+ progress?: number
92
+
93
+ // @OneToMany(type => Checklist, checklist => checklist.task, { nullable: true })
94
+ // @Field(type => [Checklist], { nullable: true })
95
+ // checklists?: Checklist[]
96
+
97
+ @OneToMany(type => TaskResource, taskResource => taskResource.task, { cascade: true })
98
+ @Field(type => [TaskResource], { nullable: true })
99
+ taskResources?: TaskResource[]
71
100
 
72
101
  @CreateDateColumn()
73
102
  @Field({ nullable: true })
@@ -0,0 +1,7 @@
1
+ import { TaskResource } from './task-resource'
2
+ import { TaskResourceQuery } from './task-resource-query'
3
+ import { TaskResourceMutation } from './task-resource-mutation'
4
+
5
+ export const entities = [TaskResource]
6
+ export const resolvers = [TaskResourceQuery, TaskResourceMutation]
7
+ export const subscribers = []
@@ -0,0 +1,140 @@
1
+ import { Resolver, Mutation, Arg, Ctx, Directive } from 'type-graphql'
2
+ import { In } from 'typeorm'
3
+
4
+ import { TaskResource } from './task-resource'
5
+ import { NewTaskResource, TaskResourcePatch } from './task-resource-type'
6
+
7
+ @Resolver(TaskResource)
8
+ export class TaskResourceMutation {
9
+ @Directive('@transaction')
10
+ @Directive('@privilege(category: "project", privilege: "mutation", domainOwnerGranted: true)')
11
+ @Mutation(returns => TaskResource, { description: 'To create new TaskResource' })
12
+ async createTaskResource(
13
+ @Arg('taskResource') taskResource: NewTaskResource,
14
+ @Ctx() context: ResolverContext
15
+ ): Promise<TaskResource> {
16
+ const { domain, user, tx } = context.state
17
+
18
+ const result = await tx.getRepository(TaskResource).save({
19
+ ...taskResource,
20
+ domain,
21
+ creator: user,
22
+ updater: user
23
+ })
24
+
25
+ return result
26
+ }
27
+
28
+ @Directive('@transaction')
29
+ @Directive('@privilege(category: "project", privilege: "mutation", domainOwnerGranted: true)')
30
+ @Mutation(returns => TaskResource, { description: 'To modify TaskResource information' })
31
+ async updateTaskResource(
32
+ @Arg('id') id: string,
33
+ @Arg('patch') patch: TaskResourcePatch,
34
+ @Ctx() context: ResolverContext
35
+ ): Promise<TaskResource> {
36
+ const { domain, user, tx } = context.state
37
+
38
+ const repository = tx.getRepository(TaskResource)
39
+ const taskResource = await repository.findOne({
40
+ where: { id }
41
+ })
42
+
43
+ const result = await repository.save({
44
+ ...taskResource,
45
+ ...patch,
46
+ updater: user
47
+ })
48
+
49
+ return result
50
+ }
51
+
52
+ @Directive('@transaction')
53
+ @Directive('@privilege(category: "project", privilege: "mutation", domainOwnerGranted: true)')
54
+ @Mutation(returns => [TaskResource], { description: "To modify multiple TaskResources' information" })
55
+ async updateMultipleTaskResource(
56
+ @Arg('patches', type => [TaskResourcePatch]) patches: TaskResourcePatch[],
57
+ @Ctx() context: ResolverContext
58
+ ): Promise<TaskResource[]> {
59
+ const { domain, user, tx } = context.state
60
+
61
+ let results = []
62
+ const _createRecords = patches.filter((patch: any) => patch.cuFlag.toUpperCase() === '+')
63
+ const _updateRecords = patches.filter((patch: any) => patch.cuFlag.toUpperCase() === 'M')
64
+ const taskResourceRepo = tx.getRepository(TaskResource)
65
+
66
+ if (_createRecords.length > 0) {
67
+ for (let i = 0; i < _createRecords.length; i++) {
68
+ const newRecord = _createRecords[i]
69
+
70
+ const result = await taskResourceRepo.save({
71
+ ...newRecord,
72
+ domain,
73
+ creator: user,
74
+ updater: user
75
+ })
76
+
77
+ results.push({ ...result, cuFlag: '+' })
78
+ }
79
+ }
80
+
81
+ if (_updateRecords.length > 0) {
82
+ for (let i = 0; i < _updateRecords.length; i++) {
83
+ const updateRecord = _updateRecords[i]
84
+ const taskResource = await taskResourceRepo.findOneBy({ id: updateRecord.id })
85
+
86
+ const result = await taskResourceRepo.save({
87
+ ...taskResource,
88
+ ...updateRecord,
89
+ updater: user
90
+ })
91
+
92
+ results.push({ ...result, cuFlag: 'M' })
93
+ }
94
+ }
95
+
96
+ return results
97
+ }
98
+
99
+ @Directive('@transaction')
100
+ @Directive('@privilege(category: "project", privilege: "mutation", domainOwnerGranted: true)')
101
+ @Mutation(returns => Boolean, { description: 'To delete TaskResource' })
102
+ async deleteTaskResource(@Arg('id') id: string, @Ctx() context: ResolverContext): Promise<boolean> {
103
+ const { domain, tx } = context.state
104
+
105
+ await tx.getRepository(TaskResource).delete({ id })
106
+
107
+ return true
108
+ }
109
+
110
+ @Directive('@transaction')
111
+ @Directive('@privilege(category: "project", privilege: "mutation", domainOwnerGranted: true)')
112
+ @Mutation(returns => Boolean, { description: 'To delete multiple TaskResources' })
113
+ async deleteTaskResources(@Arg('ids', type => [String]) ids: string[], @Ctx() context: ResolverContext): Promise<boolean> {
114
+ const { domain, tx } = context.state
115
+
116
+ await tx.getRepository(TaskResource).delete({
117
+ id: In(ids)
118
+ })
119
+
120
+ return true
121
+ }
122
+
123
+ @Directive('@transaction')
124
+ @Directive('@privilege(category: "project", privilege: "mutation", domainOwnerGranted: true)')
125
+ @Mutation(returns => Boolean, { description: 'To import multiple TaskResources' })
126
+ async importTaskResources(
127
+ @Arg('taskResources', type => [TaskResourcePatch]) taskResources: TaskResourcePatch[],
128
+ @Ctx() context: ResolverContext
129
+ ): Promise<boolean> {
130
+ const { domain, tx } = context.state
131
+
132
+ await Promise.all(
133
+ taskResources.map(async (taskResource: TaskResourcePatch) => {
134
+ const createdTaskResource: TaskResource = await tx.getRepository(TaskResource).save({ domain, ...taskResource })
135
+ })
136
+ )
137
+
138
+ return true
139
+ }
140
+ }
@@ -0,0 +1,36 @@
1
+ import { Resolver, Query, FieldResolver, Root, Args, Arg, Ctx, Directive } from 'type-graphql'
2
+ import { Attachment } from '@things-factory/attachment-base'
3
+ import { Domain, getQueryBuilderFromListParams, getRepository, ListParam } from '@things-factory/shell'
4
+ import { User } from '@things-factory/auth-base'
5
+ import { TaskResource } from './task-resource'
6
+ import { TaskResourceList } from './task-resource-type'
7
+
8
+ @Resolver(TaskResource)
9
+ export class TaskResourceQuery {
10
+ @Directive('@privilege(category: "project", privilege: "query", domainOwnerGranted: true)')
11
+ @Query(returns => TaskResource!, { nullable: true, description: 'To fetch a TaskResource' })
12
+ async taskResource(@Arg('id') id: string, @Ctx() context: ResolverContext): Promise<TaskResource> {
13
+ const { domain } = context.state
14
+
15
+ return await getRepository(TaskResource).findOne({
16
+ where: { id }
17
+ })
18
+ }
19
+
20
+ @Directive('@privilege(category: "project", privilege: "query", domainOwnerGranted: true)')
21
+ @Query(returns => TaskResourceList, { description: 'To fetch multiple TaskResources' })
22
+ async taskResources(@Args() params: ListParam, @Ctx() context: ResolverContext): Promise<TaskResourceList> {
23
+ const { domain } = context.state
24
+
25
+ const queryBuilder = getQueryBuilderFromListParams({
26
+ domain,
27
+ params,
28
+ repository: await getRepository(TaskResource),
29
+ searchables: ['name', 'description']
30
+ })
31
+
32
+ const [items, total] = await queryBuilder.getManyAndCount()
33
+
34
+ return { items, total }
35
+ }
36
+ }
@@ -0,0 +1,41 @@
1
+ import { InputType, Field, ID, ObjectType, Int } from 'type-graphql'
2
+ import { TaskResource } from './task-resource'
3
+
4
+ @InputType()
5
+ export class NewTaskResource {
6
+ @Field(type => ID)
7
+ taskId: string
8
+
9
+ @Field(type => ID)
10
+ resourceId: string
11
+
12
+ @Field()
13
+ quantity: number
14
+ }
15
+
16
+ @InputType()
17
+ export class TaskResourcePatch {
18
+ @Field(type => ID, { nullable: true })
19
+ id?: string
20
+
21
+ @Field(type => ID, { nullable: true })
22
+ taskId?: string
23
+
24
+ @Field(type => ID, { nullable: true })
25
+ resourceId?: string
26
+
27
+ @Field({ nullable: true })
28
+ quantity?: number
29
+
30
+ @Field({ nullable: true })
31
+ cuFlag?: string
32
+ }
33
+
34
+ @ObjectType()
35
+ export class TaskResourceList {
36
+ @Field(type => [TaskResource])
37
+ items: TaskResource[]
38
+
39
+ @Field(type => Int)
40
+ total: number
41
+ }
@@ -0,0 +1,51 @@
1
+ import {
2
+ Entity,
3
+ PrimaryGeneratedColumn,
4
+ RelationId,
5
+ ManyToOne,
6
+ Column,
7
+ CreateDateColumn,
8
+ UpdateDateColumn,
9
+ DeleteDateColumn
10
+ } from 'typeorm'
11
+ import { ObjectType, Field, ID } from 'type-graphql'
12
+ import { Task } from '../task/task'
13
+ import { Resource } from '../resource/resource'
14
+
15
+ @Entity()
16
+ @ObjectType({ description: '작업에 소요되는 자원' })
17
+ export class TaskResource {
18
+ @PrimaryGeneratedColumn('uuid')
19
+ @Field(type => ID)
20
+ readonly id: string
21
+
22
+ @ManyToOne(() => Task, task => task.taskResources, { nullable: false })
23
+ @Field(type => Task)
24
+ task: Task
25
+
26
+ @RelationId((taskResource: TaskResource) => taskResource.task)
27
+ taskId: string
28
+
29
+ @ManyToOne(() => Resource, resource => resource.taskResources, { nullable: false })
30
+ @Field(type => Resource)
31
+ resource: Resource
32
+
33
+ @RelationId((taskResource: TaskResource) => taskResource.resource)
34
+ resourceId: string
35
+
36
+ @Column({ type: 'float', nullable: false, comment: '소요량 (예: 8, 5 등)' })
37
+ @Field({ nullable: false })
38
+ quantity: number
39
+
40
+ @CreateDateColumn()
41
+ @Field({ nullable: true })
42
+ createdAt?: Date
43
+
44
+ @UpdateDateColumn()
45
+ @Field({ nullable: true })
46
+ updatedAt?: Date
47
+
48
+ @DeleteDateColumn()
49
+ @Field({ nullable: true })
50
+ deletedAt?: Date
51
+ }
@@ -14,6 +14,7 @@ export default {
14
14
  'manager-management', // 담당자 관리
15
15
  'worker-type-management', // 인력 관리
16
16
  'construction-type-management', // 공종 관리
17
+ 'inspection-drawing-type-management', // 도면 타입 및 검측 부위 관리
17
18
  ].map(page => {
18
19
  return {
19
20
  page,