@dssp/supervision 1.0.15 → 1.0.17

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 (35) hide show
  1. package/dist-client/pages/building-inspection/building-inspection-detail-ai-measurement.d.ts +7 -0
  2. package/dist-client/pages/building-inspection/building-inspection-detail-ai-measurement.js +170 -17
  3. package/dist-client/pages/building-inspection/building-inspection-detail-ai-measurement.js.map +1 -1
  4. package/dist-client/pages/building-inspection/inspection-create-popup.js +2 -2
  5. package/dist-client/pages/building-inspection/inspection-create-popup.js.map +1 -1
  6. package/dist-client/pages/building-inspection/inspection-with-checklist-create-popup.js +2 -2
  7. package/dist-client/pages/building-inspection/inspection-with-checklist-create-popup.js.map +1 -1
  8. package/dist-client/pages/checklist/checklist-view.js +3 -3
  9. package/dist-client/pages/checklist/checklist-view.js.map +1 -1
  10. package/dist-client/pages/checklist-template/checklist-template-list.js +1 -1
  11. package/dist-client/pages/checklist-template/checklist-template-list.js.map +1 -1
  12. package/dist-client/pages/project-checklist/project-checklist-management.d.ts +15 -6
  13. package/dist-client/pages/project-checklist/project-checklist-management.js +249 -109
  14. package/dist-client/pages/project-checklist/project-checklist-management.js.map +1 -1
  15. package/dist-client/route.d.ts +1 -1
  16. package/dist-client/tsconfig.tsbuildinfo +1 -1
  17. package/dist-server/service/checklist-item/checklist-item.js +1 -1
  18. package/dist-server/service/checklist-item/checklist-item.js.map +1 -1
  19. package/dist-server/service/checklist-item-history/checklist-item-history.js +1 -1
  20. package/dist-server/service/checklist-item-history/checklist-item-history.js.map +1 -1
  21. package/dist-server/service/index.d.ts +1 -1
  22. package/dist-server/service/project-checklist/index.d.ts +1 -1
  23. package/dist-server/service/project-checklist/project-checklist-mutation.d.ts +4 -3
  24. package/dist-server/service/project-checklist/project-checklist-mutation.js +23 -12
  25. package/dist-server/service/project-checklist/project-checklist-mutation.js.map +1 -1
  26. package/dist-server/service/project-checklist/project-checklist-type.d.ts +4 -0
  27. package/dist-server/service/project-checklist/project-checklist-type.js +16 -1
  28. package/dist-server/service/project-checklist/project-checklist-type.js.map +1 -1
  29. package/dist-server/service/project-checklist/spec-matching-service.d.ts +16 -8
  30. package/dist-server/service/project-checklist/spec-matching-service.js +107 -52
  31. package/dist-server/service/project-checklist/spec-matching-service.js.map +1 -1
  32. package/dist-server/service/project-checklist-item/project-checklist-item.js +1 -1
  33. package/dist-server/service/project-checklist-item/project-checklist-item.js.map +1 -1
  34. package/dist-server/tsconfig.tsbuildinfo +1 -1
  35. package/package.json +3 -3
@@ -55,7 +55,7 @@ tslib_1.__decorate([
55
55
  tslib_1.__metadata("design:type", String)
56
56
  ], ChecklistItem.prototype, "kcsCriteria", void 0);
57
57
  tslib_1.__decorate([
58
- (0, typeorm_1.Column)({ nullable: true, comment: '현장 시방서 기준 - site_spec_matches[0].text' }),
58
+ (0, typeorm_1.Column)({ nullable: true, comment: '공사 시방서 기준 - site_spec_matches[0].text' }),
59
59
  (0, type_graphql_1.Field)({ nullable: true }),
60
60
  tslib_1.__metadata("design:type", String)
61
61
  ], ChecklistItem.prototype, "siteSpecCriteria", void 0);
@@ -1 +1 @@
1
- {"version":3,"file":"checklist-item.js","sourceRoot":"","sources":["../../../server/service/checklist-item/checklist-item.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n CreateDateColumn,\n UpdateDateColumn,\n DeleteDateColumn,\n Entity,\n Index,\n Column,\n RelationId,\n ManyToOne,\n OneToMany,\n PrimaryGeneratedColumn\n} from 'typeorm'\nimport { ObjectType, Field, ID, Int, registerEnumType } from 'type-graphql'\n\nimport { User } from '@things-factory/auth-base'\nimport { Checklist } from '../checklist/checklist'\nimport { ChecklistItemComment } from '../checklist-item-comment/checklist-item-comment'\n\nexport enum ChecklistItemConfirmStatus {\n T = '적합',\n F = '부적합'\n}\n\nregisterEnumType(ChecklistItemConfirmStatus, {\n name: 'ChecklistItemConfirmStatus',\n description: '적합 상태'\n})\n\n@Entity({ comment: '체크 리스트 항목' })\n@Index('ix_checklist_item_0', (checklistItem: ChecklistItem) => [checklistItem.checklist], { where: '\"deleted_at\" IS NULL' })\n@ObjectType()\nexport class ChecklistItem {\n @PrimaryGeneratedColumn('uuid')\n @Field(type => ID)\n readonly id: string\n\n @Column({ nullable: true, comment: '시퀀스' })\n @Field(type => Int, { nullable: true })\n sequence?: number\n\n @Column({ nullable: false, comment: '구분 (텍스트)' })\n @Field({ nullable: false })\n mainType?: string\n\n @Column({ nullable: false, comment: '상세 구분 (텍스트)' })\n @Field({ nullable: false })\n detailType?: string\n\n @Column({ nullable: true, comment: '검사 항목' })\n @Field({ nullable: true })\n name?: string\n\n @Column({ nullable: true, comment: '검사 기준 (레거시 단일 필드)' })\n @Field({ nullable: true })\n inspctionCriteria?: string\n\n @Column({ nullable: true, comment: 'KCS 시방서 기준 - kcs_matches[0] 오브젝트 전체를 JSON 문자열로 저장 (file_label 등 포함)' })\n @Field({ nullable: true })\n kcsCriteria?: string\n\n @Column({ nullable: true, comment: '현장 시방서 기준 - site_spec_matches[0].text' })\n @Field({ nullable: true })\n siteSpecCriteria?: string\n\n @Column({ nullable: true, comment: '시공 관리자 적합 여부 (T: 적합, F: 부적합)' })\n @Field({ nullable: true })\n constructionConfirmStatus?: ChecklistItemConfirmStatus\n\n @Column({ nullable: true, comment: '감리 관리자 적합 여부 (T: 적합, F: 부적합)' })\n @Field({ nullable: true })\n supervisoryConfirmStatus?: ChecklistItemConfirmStatus\n\n // 조치 사항 정보 (하위 테이블 참조)\n @OneToMany(() => ChecklistItemComment, checklistItemComment => checklistItemComment.checklistItem)\n @Field(() => [ChecklistItemComment])\n checklistItemComments?: ChecklistItemComment[]\n\n // 체크리스트 정보 (상위 테이블 참조)\n @ManyToOne(type => Checklist)\n @Field(type => Checklist, { nullable: true })\n checklist?: Checklist\n\n @RelationId((checklistItem: ChecklistItem) => checklistItem.checklist)\n checklistId?: string\n\n @CreateDateColumn()\n @Field({ nullable: true })\n createdAt?: Date\n\n @UpdateDateColumn()\n @Field({ nullable: true })\n updatedAt?: Date\n\n @DeleteDateColumn()\n @Field({ nullable: true })\n deletedAt?: Date\n\n @ManyToOne(type => User, { nullable: true })\n @Field(type => User, { nullable: true })\n creator?: User\n\n @RelationId((checklistItem: ChecklistItem) => checklistItem.creator)\n creatorId?: string\n\n @ManyToOne(type => User, { nullable: true })\n @Field(type => User, { nullable: true })\n updater?: User\n\n @RelationId((checklistItem: ChecklistItem) => checklistItem.updater)\n updaterId?: string\n}\n"]}
1
+ {"version":3,"file":"checklist-item.js","sourceRoot":"","sources":["../../../server/service/checklist-item/checklist-item.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n CreateDateColumn,\n UpdateDateColumn,\n DeleteDateColumn,\n Entity,\n Index,\n Column,\n RelationId,\n ManyToOne,\n OneToMany,\n PrimaryGeneratedColumn\n} from 'typeorm'\nimport { ObjectType, Field, ID, Int, registerEnumType } from 'type-graphql'\n\nimport { User } from '@things-factory/auth-base'\nimport { Checklist } from '../checklist/checklist'\nimport { ChecklistItemComment } from '../checklist-item-comment/checklist-item-comment'\n\nexport enum ChecklistItemConfirmStatus {\n T = '적합',\n F = '부적합'\n}\n\nregisterEnumType(ChecklistItemConfirmStatus, {\n name: 'ChecklistItemConfirmStatus',\n description: '적합 상태'\n})\n\n@Entity({ comment: '체크 리스트 항목' })\n@Index('ix_checklist_item_0', (checklistItem: ChecklistItem) => [checklistItem.checklist], { where: '\"deleted_at\" IS NULL' })\n@ObjectType()\nexport class ChecklistItem {\n @PrimaryGeneratedColumn('uuid')\n @Field(type => ID)\n readonly id: string\n\n @Column({ nullable: true, comment: '시퀀스' })\n @Field(type => Int, { nullable: true })\n sequence?: number\n\n @Column({ nullable: false, comment: '구분 (텍스트)' })\n @Field({ nullable: false })\n mainType?: string\n\n @Column({ nullable: false, comment: '상세 구분 (텍스트)' })\n @Field({ nullable: false })\n detailType?: string\n\n @Column({ nullable: true, comment: '검사 항목' })\n @Field({ nullable: true })\n name?: string\n\n @Column({ nullable: true, comment: '검사 기준 (레거시 단일 필드)' })\n @Field({ nullable: true })\n inspctionCriteria?: string\n\n @Column({ nullable: true, comment: 'KCS 시방서 기준 - kcs_matches[0] 오브젝트 전체를 JSON 문자열로 저장 (file_label 등 포함)' })\n @Field({ nullable: true })\n kcsCriteria?: string\n\n @Column({ nullable: true, comment: '공사 시방서 기준 - site_spec_matches[0].text' })\n @Field({ nullable: true })\n siteSpecCriteria?: string\n\n @Column({ nullable: true, comment: '시공 관리자 적합 여부 (T: 적합, F: 부적합)' })\n @Field({ nullable: true })\n constructionConfirmStatus?: ChecklistItemConfirmStatus\n\n @Column({ nullable: true, comment: '감리 관리자 적합 여부 (T: 적합, F: 부적합)' })\n @Field({ nullable: true })\n supervisoryConfirmStatus?: ChecklistItemConfirmStatus\n\n // 조치 사항 정보 (하위 테이블 참조)\n @OneToMany(() => ChecklistItemComment, checklistItemComment => checklistItemComment.checklistItem)\n @Field(() => [ChecklistItemComment])\n checklistItemComments?: ChecklistItemComment[]\n\n // 체크리스트 정보 (상위 테이블 참조)\n @ManyToOne(type => Checklist)\n @Field(type => Checklist, { nullable: true })\n checklist?: Checklist\n\n @RelationId((checklistItem: ChecklistItem) => checklistItem.checklist)\n checklistId?: string\n\n @CreateDateColumn()\n @Field({ nullable: true })\n createdAt?: Date\n\n @UpdateDateColumn()\n @Field({ nullable: true })\n updatedAt?: Date\n\n @DeleteDateColumn()\n @Field({ nullable: true })\n deletedAt?: Date\n\n @ManyToOne(type => User, { nullable: true })\n @Field(type => User, { nullable: true })\n creator?: User\n\n @RelationId((checklistItem: ChecklistItem) => checklistItem.creator)\n creatorId?: string\n\n @ManyToOne(type => User, { nullable: true })\n @Field(type => User, { nullable: true })\n updater?: User\n\n @RelationId((checklistItem: ChecklistItem) => checklistItem.updater)\n updaterId?: string\n}\n"]}
@@ -54,7 +54,7 @@ tslib_1.__decorate([
54
54
  tslib_1.__metadata("design:type", String)
55
55
  ], ChecklistItemHistory.prototype, "kcsCriteria", void 0);
56
56
  tslib_1.__decorate([
57
- (0, typeorm_1.Column)({ nullable: true, comment: '현장 시방서 기준 - site_spec_matches[0].text' }),
57
+ (0, typeorm_1.Column)({ nullable: true, comment: '공사 시방서 기준 - site_spec_matches[0].text' }),
58
58
  (0, type_graphql_1.Field)({ nullable: true }),
59
59
  tslib_1.__metadata("design:type", String)
60
60
  ], ChecklistItemHistory.prototype, "siteSpecCriteria", void 0);
@@ -1 +1 @@
1
- {"version":3,"file":"checklist-item-history.js","sourceRoot":"","sources":["../../../server/service/checklist-item-history/checklist-item-history.ts"],"names":[],"mappings":"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","sourcesContent":["import { Field, ID, ObjectType } from 'type-graphql'\nimport { Column, CreateDateColumn, Entity, Index, ManyToOne, PrimaryGeneratedColumn, RelationId } from 'typeorm'\nimport { HistoryActionColumn, HistoryActionType, HistoryEntityInterface, HistoryOriginalIdColumn } from '@operato/typeorm-history'\nimport { User } from '@things-factory/auth-base'\nimport { config } from '@things-factory/env'\nimport { ChecklistItem, ChecklistItemConfirmStatus } from '../checklist-item/checklist-item'\nimport { ChecklistHistory } from '../checklist-history/checklist-history'\n\nconst ORMCONFIG = config.get('ormconfig', {})\nconst DATABASE_TYPE = ORMCONFIG.type\n\n@Entity()\n@Index('ix_checklist_item_history_0', (checklistItemHistory: ChecklistItemHistory) => [checklistItemHistory.originalId])\n@ObjectType({ description: 'History Entity of ChecklistItem' })\nexport class ChecklistItemHistory implements HistoryEntityInterface<ChecklistItem> {\n @PrimaryGeneratedColumn('uuid')\n @Field(type => ID)\n readonly id: string\n\n @HistoryOriginalIdColumn()\n public originalId!: string\n\n @Column({ nullable: true, comment: '시퀀스' })\n @Field({ nullable: true })\n sequence?: number\n\n @Column({ nullable: false, comment: '구분 (텍스트)' })\n @Field({ nullable: false })\n mainType?: string\n\n @Column({ nullable: false, comment: '상세 구분 (텍스트)' })\n @Field({ nullable: false })\n detailType?: string\n\n @Column({ nullable: true, comment: '검사 항목' })\n @Field({ nullable: true })\n name?: string\n\n @Column({ nullable: true, comment: '검사 기준 (레거시 단일 필드)' })\n @Field({ nullable: true })\n inspctionCriteria?: string\n\n @Column({ nullable: true, comment: 'KCS 시방서 기준 - kcs_matches[0] 오브젝트 전체를 JSON 문자열로 저장' })\n @Field({ nullable: true })\n kcsCriteria?: string\n\n @Column({ nullable: true, comment: '현장 시방서 기준 - site_spec_matches[0].text' })\n @Field({ nullable: true })\n siteSpecCriteria?: string\n\n @Column({ nullable: true, comment: '시공 관리자 적합 여부 (T: 적합, F: 부적합)' })\n @Field({ nullable: true })\n constructionConfirmStatus?: ChecklistItemConfirmStatus\n\n @Column({ nullable: true, comment: '감리 관리자 적합 여부 (T: 적합, F: 부적합)' })\n @Field({ nullable: true })\n supervisoryConfirmStatus?: ChecklistItemConfirmStatus\n\n // 부모 체크리스트 ID (원본 엔티티 ID 저장)\n @Column({ nullable: true, comment: '체크리스트 ID' })\n @Field({ nullable: true })\n checklistId?: string\n\n // 상위 체크리스트 히스토리 스냅샷 FK (동일 트랜잭션 스냅샷 연결)\n @ManyToOne(type => ChecklistHistory, { nullable: true })\n @Field(type => ChecklistHistory, { nullable: true })\n checklistHistory?: ChecklistHistory\n\n @RelationId((checklistItemHistory: ChecklistItemHistory) => checklistItemHistory.checklistHistory)\n checklistHistoryId?: string\n\n @Column({ nullable: true })\n @Field({ nullable: true })\n createdAt?: Date\n\n @CreateDateColumn()\n @Field({ nullable: true })\n loggedAt?: Date\n\n @ManyToOne(type => User, { nullable: true })\n @Field(type => User, { nullable: true })\n creator?: User\n\n @RelationId((checklistItemHistory: ChecklistItemHistory) => checklistItemHistory.creator)\n creatorId?: string\n\n @ManyToOne(type => User, { nullable: true })\n @Field(type => User, { nullable: true })\n updater?: User\n\n @RelationId((checklistItemHistory: ChecklistItemHistory) => checklistItemHistory.updater)\n updaterId?: string\n\n @HistoryActionColumn({\n nullable: false,\n type:\n DATABASE_TYPE == 'postgres' || DATABASE_TYPE == 'mysql' || DATABASE_TYPE == 'mariadb'\n ? 'enum'\n : DATABASE_TYPE == 'oracle'\n ? 'varchar2'\n : DATABASE_TYPE == 'mssql'\n ? 'nvarchar'\n : 'varchar',\n enum: DATABASE_TYPE == 'postgres' || DATABASE_TYPE == 'mysql' || DATABASE_TYPE == 'mariadb' ? HistoryActionType : undefined,\n length: DATABASE_TYPE == 'postgres' || DATABASE_TYPE == 'mysql' || DATABASE_TYPE == 'mariadb' ? undefined : 10\n })\n public action!: HistoryActionType\n}\n"]}
1
+ {"version":3,"file":"checklist-item-history.js","sourceRoot":"","sources":["../../../server/service/checklist-item-history/checklist-item-history.ts"],"names":[],"mappings":"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","sourcesContent":["import { Field, ID, ObjectType } from 'type-graphql'\nimport { Column, CreateDateColumn, Entity, Index, ManyToOne, PrimaryGeneratedColumn, RelationId } from 'typeorm'\nimport { HistoryActionColumn, HistoryActionType, HistoryEntityInterface, HistoryOriginalIdColumn } from '@operato/typeorm-history'\nimport { User } from '@things-factory/auth-base'\nimport { config } from '@things-factory/env'\nimport { ChecklistItem, ChecklistItemConfirmStatus } from '../checklist-item/checklist-item'\nimport { ChecklistHistory } from '../checklist-history/checklist-history'\n\nconst ORMCONFIG = config.get('ormconfig', {})\nconst DATABASE_TYPE = ORMCONFIG.type\n\n@Entity()\n@Index('ix_checklist_item_history_0', (checklistItemHistory: ChecklistItemHistory) => [checklistItemHistory.originalId])\n@ObjectType({ description: 'History Entity of ChecklistItem' })\nexport class ChecklistItemHistory implements HistoryEntityInterface<ChecklistItem> {\n @PrimaryGeneratedColumn('uuid')\n @Field(type => ID)\n readonly id: string\n\n @HistoryOriginalIdColumn()\n public originalId!: string\n\n @Column({ nullable: true, comment: '시퀀스' })\n @Field({ nullable: true })\n sequence?: number\n\n @Column({ nullable: false, comment: '구분 (텍스트)' })\n @Field({ nullable: false })\n mainType?: string\n\n @Column({ nullable: false, comment: '상세 구분 (텍스트)' })\n @Field({ nullable: false })\n detailType?: string\n\n @Column({ nullable: true, comment: '검사 항목' })\n @Field({ nullable: true })\n name?: string\n\n @Column({ nullable: true, comment: '검사 기준 (레거시 단일 필드)' })\n @Field({ nullable: true })\n inspctionCriteria?: string\n\n @Column({ nullable: true, comment: 'KCS 시방서 기준 - kcs_matches[0] 오브젝트 전체를 JSON 문자열로 저장' })\n @Field({ nullable: true })\n kcsCriteria?: string\n\n @Column({ nullable: true, comment: '공사 시방서 기준 - site_spec_matches[0].text' })\n @Field({ nullable: true })\n siteSpecCriteria?: string\n\n @Column({ nullable: true, comment: '시공 관리자 적합 여부 (T: 적합, F: 부적합)' })\n @Field({ nullable: true })\n constructionConfirmStatus?: ChecklistItemConfirmStatus\n\n @Column({ nullable: true, comment: '감리 관리자 적합 여부 (T: 적합, F: 부적합)' })\n @Field({ nullable: true })\n supervisoryConfirmStatus?: ChecklistItemConfirmStatus\n\n // 부모 체크리스트 ID (원본 엔티티 ID 저장)\n @Column({ nullable: true, comment: '체크리스트 ID' })\n @Field({ nullable: true })\n checklistId?: string\n\n // 상위 체크리스트 히스토리 스냅샷 FK (동일 트랜잭션 스냅샷 연결)\n @ManyToOne(type => ChecklistHistory, { nullable: true })\n @Field(type => ChecklistHistory, { nullable: true })\n checklistHistory?: ChecklistHistory\n\n @RelationId((checklistItemHistory: ChecklistItemHistory) => checklistItemHistory.checklistHistory)\n checklistHistoryId?: string\n\n @Column({ nullable: true })\n @Field({ nullable: true })\n createdAt?: Date\n\n @CreateDateColumn()\n @Field({ nullable: true })\n loggedAt?: Date\n\n @ManyToOne(type => User, { nullable: true })\n @Field(type => User, { nullable: true })\n creator?: User\n\n @RelationId((checklistItemHistory: ChecklistItemHistory) => checklistItemHistory.creator)\n creatorId?: string\n\n @ManyToOne(type => User, { nullable: true })\n @Field(type => User, { nullable: true })\n updater?: User\n\n @RelationId((checklistItemHistory: ChecklistItemHistory) => checklistItemHistory.updater)\n updaterId?: string\n\n @HistoryActionColumn({\n nullable: false,\n type:\n DATABASE_TYPE == 'postgres' || DATABASE_TYPE == 'mysql' || DATABASE_TYPE == 'mariadb'\n ? 'enum'\n : DATABASE_TYPE == 'oracle'\n ? 'varchar2'\n : DATABASE_TYPE == 'mssql'\n ? 'nvarchar'\n : 'varchar',\n enum: DATABASE_TYPE == 'postgres' || DATABASE_TYPE == 'mysql' || DATABASE_TYPE == 'mariadb' ? HistoryActionType : undefined,\n length: DATABASE_TYPE == 'postgres' || DATABASE_TYPE == 'mysql' || DATABASE_TYPE == 'mariadb' ? undefined : 10\n })\n public action!: HistoryActionType\n}\n"]}
@@ -16,7 +16,7 @@ export * from './project-checklist-item/project-checklist-item';
16
16
  export * from './building-inspection/building-inspection';
17
17
  export * from './building-inspection/building-inspection-type';
18
18
  export * from './building-inspection-daily-worklog/building-inspection-daily-worklog';
19
- export declare const entities: (typeof import("./field-document/field-document").FieldDocument | typeof import("./issue/issue").Issue | typeof import("./action-plan/action-plan").ActionPlan | typeof import("./supervisor/supervisor").Supervisor | typeof import("./project-report/project-report").ProjectReport | typeof import("./checklist-type/checklist-type").ChecklistType | typeof import("./checklist-item-comment/checklist-item-comment").ChecklistItemComment | typeof import("./checklist-item/checklist-item").ChecklistItem | typeof import("./checklist/checklist").Checklist | typeof import("./building-inspection/building-inspection").BuildingInspection | typeof import("./building-inspection-daily-worklog/building-inspection-daily-worklog").BuildingInspectionDailyWorklog | typeof import("./checklist-template-item/checklist-template-item").ChecklistTemplateItem | typeof import("./checklist-template/checklist-template").ChecklistTemplate | typeof import("./construction-checklist-template-item/construction-checklist-template-item").ConstructionChecklistTemplateItem | typeof import("./construction-checklist-template/construction-checklist-template").ConstructionChecklistTemplate | typeof import("./project-checklist-item/project-checklist-item").ProjectChecklistItem | typeof import("./project-checklist/project-checklist").ProjectChecklist | typeof import("./building-inspection-history/building-inspection-history").BuildingInspectionHistory | typeof import("./checklist-history/checklist-history").ChecklistHistory | typeof import("./checklist-item-history/checklist-item-history").ChecklistItemHistory)[];
19
+ export declare const entities: (typeof import("./project-checklist/project-checklist").ProjectChecklist | typeof import("./project-checklist-item/project-checklist-item").ProjectChecklistItem | typeof import("./field-document/field-document").FieldDocument | typeof import("./action-plan/action-plan").ActionPlan | typeof import("./issue/issue").Issue | typeof import("./project-report/project-report").ProjectReport | typeof import("./supervisor/supervisor").Supervisor | typeof import("./checklist/checklist").Checklist | typeof import("./checklist-history/checklist-history").ChecklistHistory | typeof import("./checklist-item/checklist-item").ChecklistItem | typeof import("./checklist-item-history/checklist-item-history").ChecklistItemHistory | typeof import("./checklist-item-comment/checklist-item-comment").ChecklistItemComment | typeof import("./checklist-type/checklist-type").ChecklistType | typeof import("./checklist-template-item/checklist-template-item").ChecklistTemplateItem | typeof import("./checklist-template/checklist-template").ChecklistTemplate | typeof import("./construction-checklist-template/construction-checklist-template").ConstructionChecklistTemplate | typeof import("./construction-checklist-template-item/construction-checklist-template-item").ConstructionChecklistTemplateItem | typeof import("./building-inspection/building-inspection").BuildingInspection | typeof import("./building-inspection-history/building-inspection-history").BuildingInspectionHistory | typeof import("./building-inspection-daily-worklog/building-inspection-daily-worklog").BuildingInspectionDailyWorklog)[];
20
20
  export declare const schema: {
21
21
  resolverClasses: typeof import("./project-checklist-item/project-checklist-item-mutation").ProjectChecklistItemMutation[];
22
22
  };
@@ -2,4 +2,4 @@ import { ProjectChecklist } from './project-checklist';
2
2
  import { ProjectChecklistQuery } from './project-checklist-query';
3
3
  import { ProjectChecklistMutation } from './project-checklist-mutation';
4
4
  export declare const entities: (typeof ProjectChecklist)[];
5
- export declare const resolvers: (typeof ProjectChecklistQuery | typeof ProjectChecklistMutation)[];
5
+ export declare const resolvers: (typeof ProjectChecklistMutation | typeof ProjectChecklistQuery)[];
@@ -1,7 +1,8 @@
1
1
  import { ProjectChecklist } from './project-checklist';
2
- import { ProjectChecklistItemInput } from './project-checklist-type';
2
+ import { ProjectChecklistItemInput, SiteSpecFileInput } from './project-checklist-type';
3
3
  export declare class ProjectChecklistMutation {
4
- createProjectChecklist(projectId: string, constructionTypeId: string, constructionDetailTypeId: string, name: string, items: ProjectChecklistItemInput[], siteSpecPdfUrl: string, context: ResolverContext): Promise<ProjectChecklist>;
5
- updateProjectChecklist(id: string, name: string, items: ProjectChecklistItemInput[], siteSpecPdfUrl: string, context: ResolverContext): Promise<ProjectChecklist>;
4
+ createProjectChecklist(projectId: string, constructionTypeId: string, constructionDetailTypeId: string, name: string, items: ProjectChecklistItemInput[], context: ResolverContext): Promise<ProjectChecklist>;
5
+ updateProjectChecklist(id: string, name: string, items: ProjectChecklistItemInput[], context: ResolverContext): Promise<ProjectChecklist>;
6
+ syncProjectSiteSpecs(projectId: string, specFiles: SiteSpecFileInput[]): Promise<number>;
6
7
  deleteProjectChecklists(ids: string[], context: ResolverContext): Promise<boolean>;
7
8
  }
@@ -9,7 +9,7 @@ const project_checklist_type_1 = require("./project-checklist-type");
9
9
  const project_checklist_item_1 = require("../project-checklist-item/project-checklist-item");
10
10
  const spec_matching_service_1 = require("./spec-matching-service");
11
11
  let ProjectChecklistMutation = class ProjectChecklistMutation {
12
- async createProjectChecklist(projectId, constructionTypeId, constructionDetailTypeId, name, items, siteSpecPdfUrl, context) {
12
+ async createProjectChecklist(projectId, constructionTypeId, constructionDetailTypeId, name, items, context) {
13
13
  const { domain, user, tx } = context.state;
14
14
  const checklistRepo = tx.getRepository(project_checklist_1.ProjectChecklist);
15
15
  const itemRepo = tx.getRepository(project_checklist_item_1.ProjectChecklistItem);
@@ -35,11 +35,11 @@ let ProjectChecklistMutation = class ProjectChecklistMutation {
35
35
  });
36
36
  savedItems.push(saved);
37
37
  }
38
- // 검사항목별 KCS 표준 / 현장 시방서 기준 매칭을 백그라운드(비동기)로 트리거
39
- (0, spec_matching_service_1.queueUpdateProjectChecklistCriteria)(savedItems.map(v => v.id), siteSpecPdfUrl);
38
+ // 검사항목별 KCS 표준 / 공사 시방서 기준 매칭을 백그라운드(비동기)로 트리거
39
+ (0, spec_matching_service_1.queueUpdateProjectChecklistCriteria)(savedItems.map(v => v.id), projectId);
40
40
  return checklist;
41
41
  }
42
- async updateProjectChecklist(id, name, items, siteSpecPdfUrl, context) {
42
+ async updateProjectChecklist(id, name, items, context) {
43
43
  const { user, tx } = context.state;
44
44
  const checklistRepo = tx.getRepository(project_checklist_1.ProjectChecklist);
45
45
  const itemRepo = tx.getRepository(project_checklist_item_1.ProjectChecklistItem);
@@ -63,10 +63,15 @@ let ProjectChecklistMutation = class ProjectChecklistMutation {
63
63
  });
64
64
  savedItems.push(saved);
65
65
  }
66
- // 검사항목별 KCS 표준 / 현장 시방서 기준 매칭을 백그라운드(비동기)로 트리거
67
- (0, spec_matching_service_1.queueUpdateProjectChecklistCriteria)(savedItems.map(v => v.id), siteSpecPdfUrl);
66
+ // 검사항목별 KCS 표준 / 공사 시방서 기준 매칭을 백그라운드(비동기)로 트리거
67
+ (0, spec_matching_service_1.queueUpdateProjectChecklistCriteria)(savedItems.map(v => v.id), checklist.projectId);
68
68
  return checklist;
69
69
  }
70
+ // 프로젝트의 공사 시방서 첨부 목록을 매칭 엔진에 등록(재등록)한다.
71
+ // 첨부 업로드/삭제 직후 클라이언트가 현재 목록 전체를 넘겨 호출한다.
72
+ async syncProjectSiteSpecs(projectId, specFiles) {
73
+ return await (0, spec_matching_service_1.syncProjectSiteSpecs)(projectId, specFiles);
74
+ }
70
75
  async deleteProjectChecklists(ids, context) {
71
76
  const { domain, tx } = context.state;
72
77
  await tx.getRepository(project_checklist_1.ProjectChecklist).softDelete({
@@ -85,10 +90,9 @@ tslib_1.__decorate([
85
90
  tslib_1.__param(2, (0, type_graphql_1.Arg)('constructionDetailTypeId')),
86
91
  tslib_1.__param(3, (0, type_graphql_1.Arg)('name')),
87
92
  tslib_1.__param(4, (0, type_graphql_1.Arg)('items', type => [project_checklist_type_1.ProjectChecklistItemInput])),
88
- tslib_1.__param(5, (0, type_graphql_1.Arg)('siteSpecPdfUrl', { nullable: true })),
89
- tslib_1.__param(6, (0, type_graphql_1.Ctx)()),
93
+ tslib_1.__param(5, (0, type_graphql_1.Ctx)()),
90
94
  tslib_1.__metadata("design:type", Function),
91
- tslib_1.__metadata("design:paramtypes", [String, String, String, String, Array, String, Object]),
95
+ tslib_1.__metadata("design:paramtypes", [String, String, String, String, Array, Object]),
92
96
  tslib_1.__metadata("design:returntype", Promise)
93
97
  ], ProjectChecklistMutation.prototype, "createProjectChecklist", null);
94
98
  tslib_1.__decorate([
@@ -97,12 +101,19 @@ tslib_1.__decorate([
97
101
  tslib_1.__param(0, (0, type_graphql_1.Arg)('id')),
98
102
  tslib_1.__param(1, (0, type_graphql_1.Arg)('name')),
99
103
  tslib_1.__param(2, (0, type_graphql_1.Arg)('items', type => [project_checklist_type_1.ProjectChecklistItemInput])),
100
- tslib_1.__param(3, (0, type_graphql_1.Arg)('siteSpecPdfUrl', { nullable: true })),
101
- tslib_1.__param(4, (0, type_graphql_1.Ctx)()),
104
+ tslib_1.__param(3, (0, type_graphql_1.Ctx)()),
102
105
  tslib_1.__metadata("design:type", Function),
103
- tslib_1.__metadata("design:paramtypes", [String, String, Array, String, Object]),
106
+ tslib_1.__metadata("design:paramtypes", [String, String, Array, Object]),
104
107
  tslib_1.__metadata("design:returntype", Promise)
105
108
  ], ProjectChecklistMutation.prototype, "updateProjectChecklist", null);
109
+ tslib_1.__decorate([
110
+ (0, type_graphql_1.Mutation)(returns => type_graphql_1.Int, { description: '프로젝트 공사 시방서를 매칭 엔진에 등록' }),
111
+ tslib_1.__param(0, (0, type_graphql_1.Arg)('projectId')),
112
+ tslib_1.__param(1, (0, type_graphql_1.Arg)('specFiles', type => [project_checklist_type_1.SiteSpecFileInput])),
113
+ tslib_1.__metadata("design:type", Function),
114
+ tslib_1.__metadata("design:paramtypes", [String, Array]),
115
+ tslib_1.__metadata("design:returntype", Promise)
116
+ ], ProjectChecklistMutation.prototype, "syncProjectSiteSpecs", null);
106
117
  tslib_1.__decorate([
107
118
  (0, type_graphql_1.Directive)('@transaction'),
108
119
  (0, type_graphql_1.Mutation)(returns => Boolean, { description: '프로젝트 체크리스트 삭제' }),
@@ -1 +1 @@
1
- {"version":3,"file":"project-checklist-mutation.js","sourceRoot":"","sources":["../../../server/service/project-checklist/project-checklist-mutation.ts"],"names":[],"mappings":"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","sourcesContent":["import { Resolver, Mutation, Arg, Ctx, Directive } from 'type-graphql'\nimport { In } from 'typeorm'\nimport { ProjectChecklist } from './project-checklist'\nimport { ProjectChecklistItemInput } from './project-checklist-type'\nimport { ProjectChecklistItem } from '../project-checklist-item/project-checklist-item'\nimport { queueUpdateProjectChecklistCriteria } from './spec-matching-service'\n\n@Resolver(ProjectChecklist)\nexport class ProjectChecklistMutation {\n @Directive('@transaction')\n @Mutation(returns => ProjectChecklist, { description: '프로젝트 체크리스트 생성' })\n async createProjectChecklist(\n @Arg('projectId') projectId: string,\n @Arg('constructionTypeId') constructionTypeId: string,\n @Arg('constructionDetailTypeId') constructionDetailTypeId: string,\n @Arg('name') name: string,\n @Arg('items', type => [ProjectChecklistItemInput]) items: ProjectChecklistItemInput[],\n @Arg('siteSpecPdfUrl', { nullable: true }) siteSpecPdfUrl: string,\n @Ctx() context: ResolverContext\n ): Promise<ProjectChecklist> {\n const { domain, user, tx } = context.state\n\n const checklistRepo = tx.getRepository(ProjectChecklist)\n const itemRepo = tx.getRepository(ProjectChecklistItem)\n\n const checklist = await checklistRepo.save({\n domain,\n projectId,\n constructionTypeId,\n constructionDetailTypeId,\n name,\n creator: user,\n updater: user\n })\n\n const savedItems = []\n for (let i = 0; i < items.length; i++) {\n const item = items[i]\n const saved = await itemRepo.save({\n projectChecklist: checklist,\n mainType: item.mainType || null,\n name: item.name,\n sequence: i,\n creator: user,\n updater: user\n })\n savedItems.push(saved)\n }\n\n // 검사항목별 KCS 표준 / 현장 시방서 기준 매칭을 백그라운드(비동기)로 트리거\n queueUpdateProjectChecklistCriteria(savedItems.map(v => v.id), siteSpecPdfUrl)\n\n return checklist\n }\n\n @Directive('@transaction')\n @Mutation(returns => ProjectChecklist, { description: '프로젝트 체크리스트 수정' })\n async updateProjectChecklist(\n @Arg('id') id: string,\n @Arg('name') name: string,\n @Arg('items', type => [ProjectChecklistItemInput]) items: ProjectChecklistItemInput[],\n @Arg('siteSpecPdfUrl', { nullable: true }) siteSpecPdfUrl: string,\n @Ctx() context: ResolverContext\n ): Promise<ProjectChecklist> {\n const { user, tx } = context.state\n\n const checklistRepo = tx.getRepository(ProjectChecklist)\n const itemRepo = tx.getRepository(ProjectChecklistItem)\n\n const checklist = await checklistRepo.findOneBy({ id })\n\n // 이름 수정\n checklist.name = name\n checklist.updater = user\n await checklistRepo.save(checklist)\n\n // 기존 아이템 삭제 후 재삽입\n await itemRepo.delete({ projectChecklist: { id } })\n\n const savedItems = []\n for (let i = 0; i < items.length; i++) {\n const item = items[i]\n const saved = await itemRepo.save({\n projectChecklist: checklist,\n mainType: item.mainType || null,\n name: item.name,\n sequence: i,\n creator: user,\n updater: user\n })\n savedItems.push(saved)\n }\n\n // 검사항목별 KCS 표준 / 현장 시방서 기준 매칭을 백그라운드(비동기)로 트리거\n queueUpdateProjectChecklistCriteria(savedItems.map(v => v.id), siteSpecPdfUrl)\n\n return checklist\n }\n\n @Directive('@transaction')\n @Mutation(returns => Boolean, { description: '프로젝트 체크리스트 삭제' })\n async deleteProjectChecklists(\n @Arg('ids', type => [String]) ids: string[],\n @Ctx() context: ResolverContext\n ): Promise<boolean> {\n const { domain, tx } = context.state\n\n await tx.getRepository(ProjectChecklist).softDelete({\n domain: { id: domain.id },\n id: In(ids)\n })\n\n return true\n }\n}\n"]}
1
+ {"version":3,"file":"project-checklist-mutation.js","sourceRoot":"","sources":["../../../server/service/project-checklist/project-checklist-mutation.ts"],"names":[],"mappings":"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","sourcesContent":["import { Resolver, Mutation, Arg, Ctx, Directive, Int } from 'type-graphql'\nimport { In } from 'typeorm'\nimport { ProjectChecklist } from './project-checklist'\nimport { ProjectChecklistItemInput, SiteSpecFileInput } from './project-checklist-type'\nimport { ProjectChecklistItem } from '../project-checklist-item/project-checklist-item'\nimport {\n queueUpdateProjectChecklistCriteria,\n syncProjectSiteSpecs as registerSiteSpecs\n} from './spec-matching-service'\n\n@Resolver(ProjectChecklist)\nexport class ProjectChecklistMutation {\n @Directive('@transaction')\n @Mutation(returns => ProjectChecklist, { description: '프로젝트 체크리스트 생성' })\n async createProjectChecklist(\n @Arg('projectId') projectId: string,\n @Arg('constructionTypeId') constructionTypeId: string,\n @Arg('constructionDetailTypeId') constructionDetailTypeId: string,\n @Arg('name') name: string,\n @Arg('items', type => [ProjectChecklistItemInput]) items: ProjectChecklistItemInput[],\n @Ctx() context: ResolverContext\n ): Promise<ProjectChecklist> {\n const { domain, user, tx } = context.state\n\n const checklistRepo = tx.getRepository(ProjectChecklist)\n const itemRepo = tx.getRepository(ProjectChecklistItem)\n\n const checklist = await checklistRepo.save({\n domain,\n projectId,\n constructionTypeId,\n constructionDetailTypeId,\n name,\n creator: user,\n updater: user\n })\n\n const savedItems = []\n for (let i = 0; i < items.length; i++) {\n const item = items[i]\n const saved = await itemRepo.save({\n projectChecklist: checklist,\n mainType: item.mainType || null,\n name: item.name,\n sequence: i,\n creator: user,\n updater: user\n })\n savedItems.push(saved)\n }\n\n // 검사항목별 KCS 표준 / 공사 시방서 기준 매칭을 백그라운드(비동기)로 트리거\n queueUpdateProjectChecklistCriteria(savedItems.map(v => v.id), projectId)\n\n return checklist\n }\n\n @Directive('@transaction')\n @Mutation(returns => ProjectChecklist, { description: '프로젝트 체크리스트 수정' })\n async updateProjectChecklist(\n @Arg('id') id: string,\n @Arg('name') name: string,\n @Arg('items', type => [ProjectChecklistItemInput]) items: ProjectChecklistItemInput[],\n @Ctx() context: ResolverContext\n ): Promise<ProjectChecklist> {\n const { user, tx } = context.state\n\n const checklistRepo = tx.getRepository(ProjectChecklist)\n const itemRepo = tx.getRepository(ProjectChecklistItem)\n\n const checklist = await checklistRepo.findOneBy({ id })\n\n // 이름 수정\n checklist.name = name\n checklist.updater = user\n await checklistRepo.save(checklist)\n\n // 기존 아이템 삭제 후 재삽입\n await itemRepo.delete({ projectChecklist: { id } })\n\n const savedItems = []\n for (let i = 0; i < items.length; i++) {\n const item = items[i]\n const saved = await itemRepo.save({\n projectChecklist: checklist,\n mainType: item.mainType || null,\n name: item.name,\n sequence: i,\n creator: user,\n updater: user\n })\n savedItems.push(saved)\n }\n\n // 검사항목별 KCS 표준 / 공사 시방서 기준 매칭을 백그라운드(비동기)로 트리거\n queueUpdateProjectChecklistCriteria(savedItems.map(v => v.id), checklist.projectId)\n\n return checklist\n }\n\n // 프로젝트의 공사 시방서 첨부 목록을 매칭 엔진에 등록(재등록)한다.\n // 첨부 업로드/삭제 직후 클라이언트가 현재 목록 전체를 넘겨 호출한다.\n @Mutation(returns => Int, { description: '프로젝트 공사 시방서를 매칭 엔진에 등록' })\n async syncProjectSiteSpecs(\n @Arg('projectId') projectId: string,\n @Arg('specFiles', type => [SiteSpecFileInput]) specFiles: SiteSpecFileInput[]\n ): Promise<number> {\n return await registerSiteSpecs(projectId, specFiles)\n }\n\n @Directive('@transaction')\n @Mutation(returns => Boolean, { description: '프로젝트 체크리스트 삭제' })\n async deleteProjectChecklists(\n @Arg('ids', type => [String]) ids: string[],\n @Ctx() context: ResolverContext\n ): Promise<boolean> {\n const { domain, tx } = context.state\n\n await tx.getRepository(ProjectChecklist).softDelete({\n domain: { id: domain.id },\n id: In(ids)\n })\n\n return true\n }\n}\n"]}
@@ -12,6 +12,10 @@ export declare class ProjectChecklistItemInput {
12
12
  inspctionCriteria?: string;
13
13
  sequence?: number;
14
14
  }
15
+ export declare class SiteSpecFileInput {
16
+ url: string;
17
+ name: string;
18
+ }
15
19
  export declare class ProjectChecklistList {
16
20
  items: ProjectChecklist[];
17
21
  total: number;
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.ProjectChecklistList = exports.ProjectChecklistItemInput = exports.ProjectChecklistPatch = void 0;
3
+ exports.ProjectChecklistList = exports.SiteSpecFileInput = exports.ProjectChecklistItemInput = exports.ProjectChecklistPatch = void 0;
4
4
  const tslib_1 = require("tslib");
5
5
  const type_graphql_1 = require("type-graphql");
6
6
  const project_checklist_1 = require("./project-checklist");
@@ -52,6 +52,21 @@ tslib_1.__decorate([
52
52
  exports.ProjectChecklistItemInput = ProjectChecklistItemInput = tslib_1.__decorate([
53
53
  (0, type_graphql_1.InputType)()
54
54
  ], ProjectChecklistItemInput);
55
+ // 공사 시방서 파일 1건 (프로젝트 첨부 → 매칭 엔진 등록용)
56
+ let SiteSpecFileInput = class SiteSpecFileInput {
57
+ };
58
+ exports.SiteSpecFileInput = SiteSpecFileInput;
59
+ tslib_1.__decorate([
60
+ (0, type_graphql_1.Field)(),
61
+ tslib_1.__metadata("design:type", String)
62
+ ], SiteSpecFileInput.prototype, "url", void 0);
63
+ tslib_1.__decorate([
64
+ (0, type_graphql_1.Field)(),
65
+ tslib_1.__metadata("design:type", String)
66
+ ], SiteSpecFileInput.prototype, "name", void 0);
67
+ exports.SiteSpecFileInput = SiteSpecFileInput = tslib_1.__decorate([
68
+ (0, type_graphql_1.InputType)()
69
+ ], SiteSpecFileInput);
55
70
  let ProjectChecklistList = class ProjectChecklistList {
56
71
  };
57
72
  exports.ProjectChecklistList = ProjectChecklistList;
@@ -1 +1 @@
1
- {"version":3,"file":"project-checklist-type.js","sourceRoot":"","sources":["../../../server/service/project-checklist/project-checklist-type.ts"],"names":[],"mappings":";;;;AAAA,+CAAoE;AACpE,2DAAsD;AAG/C,IAAM,qBAAqB,GAA3B,MAAM,qBAAqB;CAejC,CAAA;AAfY,sDAAqB;AAEhC;IADC,IAAA,oBAAK,EAAC,IAAI,CAAC,EAAE,CAAC,iBAAE,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;;iDAC3B;AAGX;IADC,IAAA,oBAAK,EAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;;wDACR;AAGlB;IADC,IAAA,oBAAK,EAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;;iEACC;AAG3B;IADC,IAAA,oBAAK,EAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;;uEACO;AAGjC;IADC,IAAA,oBAAK,EAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;;mDACb;gCAdF,qBAAqB;IADjC,IAAA,wBAAS,GAAE;GACC,qBAAqB,CAejC;AAGM,IAAM,yBAAyB,GAA/B,MAAM,yBAAyB;CAYrC,CAAA;AAZY,8DAAyB;AAEpC;IADC,IAAA,oBAAK,EAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;;2DACT;AAGjB;IADC,IAAA,oBAAK,GAAE;;uDACI;AAGZ;IADC,IAAA,oBAAK,EAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;;oEACA;AAG1B;IADC,IAAA,oBAAK,EAAC,IAAI,CAAC,EAAE,CAAC,kBAAG,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;;2DACtB;oCAXN,yBAAyB;IADrC,IAAA,wBAAS,GAAE;GACC,yBAAyB,CAYrC;AAGM,IAAM,oBAAoB,GAA1B,MAAM,oBAAoB;CAMhC,CAAA;AANY,oDAAoB;AAE/B;IADC,IAAA,oBAAK,EAAC,IAAI,CAAC,EAAE,CAAC,CAAC,oCAAgB,CAAC,CAAC;;mDACT;AAGzB;IADC,IAAA,oBAAK,EAAC,IAAI,CAAC,EAAE,CAAC,kBAAG,CAAC;;mDACN;+BALF,oBAAoB;IADhC,IAAA,yBAAU,GAAE;GACA,oBAAoB,CAMhC","sourcesContent":["import { ObjectType, Field, InputType, Int, ID } from 'type-graphql'\nimport { ProjectChecklist } from './project-checklist'\n\n@InputType()\nexport class ProjectChecklistPatch {\n @Field(type => ID, { nullable: true })\n id?: string\n\n @Field({ nullable: true })\n projectId?: string\n\n @Field({ nullable: true })\n constructionTypeId?: string\n\n @Field({ nullable: true })\n constructionDetailTypeId?: string\n\n @Field({ nullable: true })\n name?: string\n}\n\n@InputType()\nexport class ProjectChecklistItemInput {\n @Field({ nullable: true })\n mainType?: string\n\n @Field()\n name: string\n\n @Field({ nullable: true })\n inspctionCriteria?: string\n\n @Field(type => Int, { nullable: true })\n sequence?: number\n}\n\n@ObjectType()\nexport class ProjectChecklistList {\n @Field(type => [ProjectChecklist])\n items: ProjectChecklist[]\n\n @Field(type => Int)\n total: number\n}\n"]}
1
+ {"version":3,"file":"project-checklist-type.js","sourceRoot":"","sources":["../../../server/service/project-checklist/project-checklist-type.ts"],"names":[],"mappings":";;;;AAAA,+CAAoE;AACpE,2DAAsD;AAG/C,IAAM,qBAAqB,GAA3B,MAAM,qBAAqB;CAejC,CAAA;AAfY,sDAAqB;AAEhC;IADC,IAAA,oBAAK,EAAC,IAAI,CAAC,EAAE,CAAC,iBAAE,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;;iDAC3B;AAGX;IADC,IAAA,oBAAK,EAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;;wDACR;AAGlB;IADC,IAAA,oBAAK,EAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;;iEACC;AAG3B;IADC,IAAA,oBAAK,EAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;;uEACO;AAGjC;IADC,IAAA,oBAAK,EAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;;mDACb;gCAdF,qBAAqB;IADjC,IAAA,wBAAS,GAAE;GACC,qBAAqB,CAejC;AAGM,IAAM,yBAAyB,GAA/B,MAAM,yBAAyB;CAYrC,CAAA;AAZY,8DAAyB;AAEpC;IADC,IAAA,oBAAK,EAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;;2DACT;AAGjB;IADC,IAAA,oBAAK,GAAE;;uDACI;AAGZ;IADC,IAAA,oBAAK,EAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;;oEACA;AAG1B;IADC,IAAA,oBAAK,EAAC,IAAI,CAAC,EAAE,CAAC,kBAAG,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;;2DACtB;oCAXN,yBAAyB;IADrC,IAAA,wBAAS,GAAE;GACC,yBAAyB,CAYrC;AAED,qCAAqC;AAE9B,IAAM,iBAAiB,GAAvB,MAAM,iBAAiB;CAQ7B,CAAA;AARY,8CAAiB;AAG5B;IADC,IAAA,oBAAK,GAAE;;8CACG;AAIX;IADC,IAAA,oBAAK,GAAE;;+CACI;4BAPD,iBAAiB;IAD7B,IAAA,wBAAS,GAAE;GACC,iBAAiB,CAQ7B;AAGM,IAAM,oBAAoB,GAA1B,MAAM,oBAAoB;CAMhC,CAAA;AANY,oDAAoB;AAE/B;IADC,IAAA,oBAAK,EAAC,IAAI,CAAC,EAAE,CAAC,CAAC,oCAAgB,CAAC,CAAC;;mDACT;AAGzB;IADC,IAAA,oBAAK,EAAC,IAAI,CAAC,EAAE,CAAC,kBAAG,CAAC;;mDACN;+BALF,oBAAoB;IADhC,IAAA,yBAAU,GAAE;GACA,oBAAoB,CAMhC","sourcesContent":["import { ObjectType, Field, InputType, Int, ID } from 'type-graphql'\nimport { ProjectChecklist } from './project-checklist'\n\n@InputType()\nexport class ProjectChecklistPatch {\n @Field(type => ID, { nullable: true })\n id?: string\n\n @Field({ nullable: true })\n projectId?: string\n\n @Field({ nullable: true })\n constructionTypeId?: string\n\n @Field({ nullable: true })\n constructionDetailTypeId?: string\n\n @Field({ nullable: true })\n name?: string\n}\n\n@InputType()\nexport class ProjectChecklistItemInput {\n @Field({ nullable: true })\n mainType?: string\n\n @Field()\n name: string\n\n @Field({ nullable: true })\n inspctionCriteria?: string\n\n @Field(type => Int, { nullable: true })\n sequence?: number\n}\n\n// 공사 시방서 파일 1건 (프로젝트 첨부 → 매칭 엔진 등록용)\n@InputType()\nexport class SiteSpecFileInput {\n // 첨부 전체 URL (https~/attachment/{key}) — 서버가 내려받아 매칭 엔진에 전달한다\n @Field()\n url: string\n\n // 원본 파일명 — 엔진이 확장자로 HWP/PDF 파서를 분기하므로 반드시 필요\n @Field()\n name: string\n}\n\n@ObjectType()\nexport class ProjectChecklistList {\n @Field(type => [ProjectChecklist])\n items: ProjectChecklist[]\n\n @Field(type => Int)\n total: number\n}\n"]}
@@ -1,17 +1,25 @@
1
+ /**
2
+ * 프로젝트의 공사 시방서 첨부 목록을 매칭 엔진에 등록한다 (프로젝트별로 분리 보관됨).
3
+ * 엔진에 개별 삭제 API가 없어 '전체 삭제 후 현재 목록 재등록' 방식이다.
4
+ * 파일이 없으면 삭제만 하고 끝낸다.
5
+ */
6
+ export declare function syncProjectSiteSpecs(projectId: string, specFiles: {
7
+ url: string;
8
+ name: string;
9
+ }[]): Promise<number>;
1
10
  export interface MatchedCriteria {
2
11
  kcsCriteria: string | null;
3
12
  siteSpecCriteria: string | null;
4
13
  }
5
14
  /**
6
- * 검사항목(query) 1건에 대해 KCS 표준 기준과 현장 시방서 기준을 매칭 API로 조회한다.
7
- * - KCS 표준은 API 서버에 파일(kcs.csv)이 이미 존재한다.
8
- * - 현장 시방서는 업로드한 PDF URL(siteSpecPdfUrl)을 넘길 때만 매칭된다.
9
- * - 첨부파일이 없으면 site_spec_pdf_url 파라미터는 생략한다.
15
+ * 검사항목(query) 1건에 대해 KCS 표준 기준과 공사 시방서 기준을 매칭 API로 조회한다.
16
+ * - KCS 표준은 매칭 서버에 이미 구축되어 있다.
17
+ * - 공사 시방서는 projectId 로 등록된 것(syncProjectSiteSpecs)을 검색한다.
10
18
  */
11
- export declare function matchInspectionCriteria(query: string, siteSpecPdfUrl?: string, constructionTypeName?: string, constructionDetailTypeName?: string): Promise<MatchedCriteria>;
19
+ export declare function matchInspectionCriteria(query: string, projectId?: string, constructionTypeName?: string, constructionDetailTypeName?: string): Promise<MatchedCriteria>;
12
20
  /**
13
- * 검사항목 ID 목록에 대해 KCS/현장 시방서 기준을 매칭하여 저장한다.
21
+ * 검사항목 ID 목록에 대해 KCS/공사 시방서 기준을 매칭하여 저장한다.
14
22
  * (트랜잭션 커밋 후 백그라운드에서 실행되므로 전역 repository 사용)
15
23
  */
16
- export declare function updateProjectChecklistCriteria(itemIds: string[], siteSpecPdfUrl?: string): Promise<void>;
17
- export declare function queueUpdateProjectChecklistCriteria(itemIds: string[], siteSpecPdfUrl?: string): void;
24
+ export declare function updateProjectChecklistCriteria(itemIds: string[], projectId?: string): Promise<void>;
25
+ export declare function queueUpdateProjectChecklistCriteria(itemIds: string[], projectId?: string): void;
@@ -1,5 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.syncProjectSiteSpecs = syncProjectSiteSpecs;
3
4
  exports.matchInspectionCriteria = matchInspectionCriteria;
4
5
  exports.updateProjectChecklistCriteria = updateProjectChecklistCriteria;
5
6
  exports.queueUpdateProjectChecklistCriteria = queueUpdateProjectChecklistCriteria;
@@ -17,7 +18,7 @@ function formatClauses(text) {
17
18
  return (text || '').replace(/\s*(?=\(\d+\))/g, '\n').trim();
18
19
  }
19
20
  /**
20
- * 현장 시방서 URL을 매칭 서버가 접근 가능한 URL로 변환한다.
21
+ * 공사 시방서 URL을 매칭 서버가 접근 가능한 URL로 변환한다.
21
22
  * 저장된 URL은 앱 프록시 경로(/attachment/{s3-key})라서 외부 매칭 서버가 접근할 수 없으므로,
22
23
  * S3 스토리지인 경우 해당 key에 대한 presigned GET URL(1시간)을 생성해서 반환한다.
23
24
  */
@@ -26,7 +27,7 @@ async function toDownloadableUrl(siteSpecPdfUrl) {
26
27
  return undefined;
27
28
  const matched = siteSpecPdfUrl.match(/\/attachment\/([^/?#]+)/);
28
29
  if (!matched || (STORAGE === null || STORAGE === void 0 ? void 0 : STORAGE.type) !== 's3') {
29
- console.log('현장 시방서 URL 변환 생략 (원본 그대로 사용) :', siteSpecPdfUrl);
30
+ console.log('공사 시방서 URL 변환 생략 (원본 그대로 사용) :', siteSpecPdfUrl);
30
31
  return siteSpecPdfUrl;
31
32
  }
32
33
  try {
@@ -38,71 +39,127 @@ async function toDownloadableUrl(siteSpecPdfUrl) {
38
39
  region: STORAGE.region
39
40
  });
40
41
  const signedUrl = await (0, s3_request_presigner_1.getSignedUrl)(client, new client_s3_1.GetObjectCommand({ Bucket: STORAGE.bucketName, Key: decodeURIComponent(matched[1]) }), { expiresIn: 3600 });
41
- console.log('현장 시방서 presigned URL 생성 완료 (key :', decodeURIComponent(matched[1]), ')');
42
+ console.log('공사 시방서 presigned URL 생성 완료 (key :', decodeURIComponent(matched[1]), ')');
42
43
  return signedUrl;
43
44
  }
44
45
  catch (error) {
45
- console.error('현장 시방서 presigned URL 생성 실패:', error);
46
+ console.error('공사 시방서 presigned URL 생성 실패:', error);
46
47
  return siteSpecPdfUrl;
47
48
  }
48
49
  }
50
+ // 엔진 파서가 지원하는 확장자 (hwpx 는 미지원 — spec_parser.parse_document 기준)
51
+ const SITE_SPEC_EXTS = ['pdf', 'hwp'];
52
+ // 매칭 서버 nginx client_max_body_size(20MB) 대비 여유를 둔 1회 전송 한도
53
+ const UPLOAD_BATCH_BYTES = 15 * 1024 * 1024;
54
+ /** 파일들을 합계 크기가 limit 을 넘지 않는 묶음으로 나눈다 (한 개가 limit 보다 커도 단독 묶음으로 보낸다). */
55
+ function splitBySize(files, limit) {
56
+ const batches = [];
57
+ let batch = [];
58
+ let size = 0;
59
+ for (const file of files) {
60
+ if (batch.length && size + file.data.length > limit) {
61
+ batches.push(batch);
62
+ batch = [];
63
+ size = 0;
64
+ }
65
+ batch.push(file);
66
+ size += file.data.length;
67
+ }
68
+ if (batch.length)
69
+ batches.push(batch);
70
+ return batches;
71
+ }
72
+ function authHeader() {
73
+ return { Authorization: `Basic ${Buffer.from(`${API_USERNAME}:${API_PASSWORD}`).toString('base64')}` };
74
+ }
75
+ /**
76
+ * spec-matching 모듈 호출 공통부.
77
+ * operato-runner 는 multipart 폼필드 'input'(JSON 문자열) + 'files'(선택)로 입력을 받는다.
78
+ * 반환은 모듈 main() 의 { status, result } (runner 응답의 result 필드).
79
+ */
80
+ async function callSpecMatching(params, files = []) {
81
+ const form = new FormData();
82
+ form.append('input', JSON.stringify(params));
83
+ for (const f of files) {
84
+ form.append('files', new Blob([new Uint8Array(f.data)]), f.name);
85
+ }
86
+ // Content-Type은 FormData가 boundary와 함께 자동 설정하므로 지정하지 않음
87
+ const response = await fetch(SPEC_MATCHING_API_URL, { method: 'POST', headers: authHeader(), body: form });
88
+ const outer = await (response === null || response === void 0 ? void 0 : response.json());
89
+ return outer === null || outer === void 0 ? void 0 : outer.result;
90
+ }
49
91
  /**
50
- * 검사항목(query) 1건에 대해 KCS 표준 기준과 현장 시방서 기준을 매칭 API로 조회한다.
51
- * - KCS 표준은 API 서버에 파일(kcs.csv)이 이미 존재한다.
52
- * - 현장 시방서는 업로드한 PDF URL(siteSpecPdfUrl)을 넘길 때만 매칭된다.
53
- * - 첨부파일이 없으면 site_spec_pdf_url 파라미터는 생략한다.
92
+ * 프로젝트의 공사 시방서 첨부 목록을 매칭 엔진에 등록한다 (프로젝트별로 분리 보관됨).
93
+ * 엔진에 개별 삭제 API가 없어 '전체 삭제 후 현재 목록 재등록' 방식이다.
94
+ * 파일이 없으면 삭제만 하고 끝낸다.
54
95
  */
55
- async function matchInspectionCriteria(query, siteSpecPdfUrl, constructionTypeName, constructionDetailTypeName) {
56
- var _a, _b, _c, _d;
57
- // operato-runner /api/run/{module} 은 multipart 폼필드 'input'(JSON 문자열)으로 입력을 받는다
96
+ async function syncProjectSiteSpecs(projectId, specFiles) {
97
+ var _a;
98
+ await callSpecMatching({ action: 'clear-site-spec', project_id: projectId });
99
+ const files = [];
100
+ for (const spec of specFiles || []) {
101
+ const ext = (spec.name || '').toLowerCase().split('.').pop() || '';
102
+ if (!SITE_SPEC_EXTS.includes(ext)) {
103
+ console.warn('공사 시방서 등록 제외 (지원하지 않는 형식) :', spec.name);
104
+ continue;
105
+ }
106
+ try {
107
+ // 앱 프록시 URL(/attachment/...) → S3 presigned URL 변환 후 내려받아 러너로 전달
108
+ const url = await toDownloadableUrl(spec.url);
109
+ const res = await fetch(url);
110
+ if (!res.ok)
111
+ throw new Error(`HTTP ${res.status}`);
112
+ files.push({ name: spec.name, data: Buffer.from(await res.arrayBuffer()) });
113
+ }
114
+ catch (error) {
115
+ console.error('공사 시방서 다운로드 실패 :', spec.name, error);
116
+ }
117
+ }
118
+ if (files.length === 0) {
119
+ console.log('공사 시방서 등록 대상 없음 (프로젝트 :', projectId, ')');
120
+ return 0;
121
+ }
122
+ // 매칭 서버 nginx 본문 제한(20MB)을 넘지 않도록 나눠 보낸다.
123
+ // add-site-spec 은 기존 인덱스에 누적 추가되므로 여러 번 호출해도 된다.
124
+ let siteItems = 0;
125
+ for (const batch of splitBySize(files, UPLOAD_BATCH_BYTES)) {
126
+ const moduleReturn = await callSpecMatching({ action: 'add-site-spec', project_id: projectId }, batch);
127
+ if ((moduleReturn === null || moduleReturn === void 0 ? void 0 : moduleReturn.status) !== 'success') {
128
+ console.error('공사 시방서 등록 실패 :', batch.map(f => f.name).join(', '), moduleReturn === null || moduleReturn === void 0 ? void 0 : moduleReturn.error);
129
+ continue;
130
+ }
131
+ siteItems = ((_a = moduleReturn.result) === null || _a === void 0 ? void 0 : _a.site_items) || siteItems;
132
+ console.log('공사 시방서 등록 :', batch.map(f => f.name).join(', '), '→ 누적', siteItems, '항목');
133
+ }
134
+ return siteItems;
135
+ }
136
+ /**
137
+ * 검사항목(query) 1건에 대해 KCS 표준 기준과 공사 시방서 기준을 매칭 API로 조회한다.
138
+ * - KCS 표준은 매칭 서버에 이미 구축되어 있다.
139
+ * - 공사 시방서는 projectId 로 등록된 것(syncProjectSiteSpecs)을 검색한다.
140
+ */
141
+ async function matchInspectionCriteria(query, projectId, constructionTypeName, constructionDetailTypeName) {
142
+ var _a, _b, _c;
58
143
  const params = { query, top_k: 1 };
59
144
  // 공종/세부공종을 주면 매칭 엔진이 해당 KCS 문서 범위로 좁혀 검색한다 (미전달 시 전체 문서 전역 검색)
60
145
  if (constructionTypeName)
61
146
  params['공종'] = constructionTypeName;
62
147
  if (constructionDetailTypeName)
63
148
  params['세부공종'] = constructionDetailTypeName;
64
- // 첨부파일(현장 시방서 PDF)이 없으면 site_spec_pdf_url 은 생략
65
- if (siteSpecPdfUrl) {
66
- params.site_spec_pdf_url = siteSpecPdfUrl;
67
- }
68
- const form = new FormData();
69
- form.append('input', JSON.stringify(params));
70
- // Content-Type은 FormData가 boundary와 함께 자동 설정하므로 지정하지 않음
71
- const headers = {
72
- Authorization: `Basic ${Buffer.from(`${API_USERNAME}:${API_PASSWORD}`).toString('base64')}`
73
- };
149
+ // 프로젝트별로 등록된 공사 시방서 인덱스를 사용 (미전달 시 공용 인덱스)
150
+ if (projectId)
151
+ params.project_id = projectId;
74
152
  try {
75
- const response = await fetch(SPEC_MATCHING_API_URL, {
76
- method: 'POST',
77
- headers,
78
- body: form
79
- });
80
- const outer = await (response === null || response === void 0 ? void 0 : response.json());
81
- console.log('data :', outer);
82
- // 현장 시방서 매칭 결과 로그 (PDF URL 전달 여부 / 매칭 결과 / 에러)
83
- if (siteSpecPdfUrl) {
84
- const innerResult = ((_a = outer === null || outer === void 0 ? void 0 : outer.result) === null || _a === void 0 ? void 0 : _a.result) || {};
85
- console.log('현장 시방서 query :', query);
86
- console.log('현장 시방서 pdf_url :', siteSpecPdfUrl);
87
- console.log('현장 시방서 matches :', innerResult.site_spec_matches);
88
- if (innerResult.site_spec_error) {
89
- console.error('현장 시방서 매칭 에러 :', innerResult.site_spec_error);
90
- }
91
- }
92
- else {
93
- console.log('현장 시방서 pdf_url 없음 → KCS 매칭만 수행 (query :', query, ')');
94
- }
95
- // runner 응답: { result: <모듈 main() 반환>, exit_code, ... }, 모듈 반환: { status, result: {...} }
96
- const moduleReturn = outer === null || outer === void 0 ? void 0 : outer.result;
153
+ const moduleReturn = await callSpecMatching(params);
97
154
  if ((moduleReturn === null || moduleReturn === void 0 ? void 0 : moduleReturn.status) === 'success') {
98
155
  const result = moduleReturn.result || {};
99
- const kcsMatch = ((_b = result.kcs_matches) === null || _b === void 0 ? void 0 : _b[0]) || null;
156
+ const kcsMatch = ((_a = result.kcs_matches) === null || _a === void 0 ? void 0 : _a[0]) || null;
100
157
  // 조항 번호 마커 (1) (2) ... 앞에서 줄바꿈 (저장 시 1회 파싱)
101
158
  if (kcsMatch === null || kcsMatch === void 0 ? void 0 : kcsMatch.text)
102
159
  kcsMatch.text = formatClauses(kcsMatch.text);
103
160
  return {
104
161
  kcsCriteria: kcsMatch ? JSON.stringify(kcsMatch) : null,
105
- siteSpecCriteria: formatClauses((_d = (_c = result.site_spec_matches) === null || _c === void 0 ? void 0 : _c[0]) === null || _d === void 0 ? void 0 : _d.text) || null
162
+ siteSpecCriteria: formatClauses((_c = (_b = result.site_spec_matches) === null || _b === void 0 ? void 0 : _b[0]) === null || _c === void 0 ? void 0 : _c.text) || null
106
163
  };
107
164
  }
108
165
  }
@@ -112,13 +169,11 @@ async function matchInspectionCriteria(query, siteSpecPdfUrl, constructionTypeNa
112
169
  return { kcsCriteria: null, siteSpecCriteria: null };
113
170
  }
114
171
  /**
115
- * 검사항목 ID 목록에 대해 KCS/현장 시방서 기준을 매칭하여 저장한다.
172
+ * 검사항목 ID 목록에 대해 KCS/공사 시방서 기준을 매칭하여 저장한다.
116
173
  * (트랜잭션 커밋 후 백그라운드에서 실행되므로 전역 repository 사용)
117
174
  */
118
- async function updateProjectChecklistCriteria(itemIds, siteSpecPdfUrl) {
175
+ async function updateProjectChecklistCriteria(itemIds, projectId) {
119
176
  const repository = (0, shell_1.getRepository)(project_checklist_item_1.ProjectChecklistItem);
120
- // 앱 프록시 URL(/attachment/...) → S3 presigned URL 변환 (배치당 1회)
121
- const downloadableUrl = await toDownloadableUrl(siteSpecPdfUrl);
122
177
  // 체크리스트별 공종/세부공종 이름 캐시 — 매칭 엔진이 이 값으로 KCS 문서 범위를 좁힌다
123
178
  const typeNameCache = {};
124
179
  for (const id of itemIds) {
@@ -139,7 +194,7 @@ async function updateProjectChecklistCriteria(itemIds, siteSpecPdfUrl) {
139
194
  typeNames = { gongjong: ct === null || ct === void 0 ? void 0 : ct.name, sebu: cdt === null || cdt === void 0 ? void 0 : cdt.name };
140
195
  typeNameCache[checklist.id] = typeNames;
141
196
  }
142
- const { kcsCriteria, siteSpecCriteria } = await matchInspectionCriteria(item.name, downloadableUrl, typeNames === null || typeNames === void 0 ? void 0 : typeNames.gongjong, typeNames === null || typeNames === void 0 ? void 0 : typeNames.sebu);
197
+ const { kcsCriteria, siteSpecCriteria } = await matchInspectionCriteria(item.name, projectId, typeNames === null || typeNames === void 0 ? void 0 : typeNames.gongjong, typeNames === null || typeNames === void 0 ? void 0 : typeNames.sebu);
143
198
  await repository.update({ id }, { kcsCriteria, siteSpecCriteria });
144
199
  }
145
200
  catch (error) {
@@ -148,11 +203,11 @@ async function updateProjectChecklistCriteria(itemIds, siteSpecPdfUrl) {
148
203
  }
149
204
  }
150
205
  // 검사 기준 매칭을 백그라운드(비동기)로 트리거 — 저장 응답을 막지 않는다.
151
- function queueUpdateProjectChecklistCriteria(itemIds, siteSpecPdfUrl) {
206
+ function queueUpdateProjectChecklistCriteria(itemIds, projectId) {
152
207
  if (!itemIds || itemIds.length === 0)
153
208
  return;
154
209
  setTimeout(() => {
155
- updateProjectChecklistCriteria(itemIds, siteSpecPdfUrl).catch(err => {
210
+ updateProjectChecklistCriteria(itemIds, projectId).catch(err => {
156
211
  console.error('Background spec-matching update failed (project-checklist):', err);
157
212
  });
158
213
  }, 0);