@dssp/supervision 1.0.15 → 1.0.16

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 (30) 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.js +14 -14
  13. package/dist-client/pages/project-checklist/project-checklist-management.js.map +1 -1
  14. package/dist-client/route.d.ts +1 -1
  15. package/dist-client/tsconfig.tsbuildinfo +1 -1
  16. package/dist-server/service/checklist-item/checklist-item.js +1 -1
  17. package/dist-server/service/checklist-item/checklist-item.js.map +1 -1
  18. package/dist-server/service/checklist-item-history/checklist-item-history.js +1 -1
  19. package/dist-server/service/checklist-item-history/checklist-item-history.js.map +1 -1
  20. package/dist-server/service/index.d.ts +1 -1
  21. package/dist-server/service/project-checklist/index.d.ts +1 -1
  22. package/dist-server/service/project-checklist/project-checklist-mutation.js +2 -2
  23. package/dist-server/service/project-checklist/project-checklist-mutation.js.map +1 -1
  24. package/dist-server/service/project-checklist/spec-matching-service.d.ts +3 -3
  25. package/dist-server/service/project-checklist/spec-matching-service.js +14 -14
  26. package/dist-server/service/project-checklist/spec-matching-service.js.map +1 -1
  27. package/dist-server/service/project-checklist-item/project-checklist-item.js +1 -1
  28. package/dist-server/service/project-checklist-item/project-checklist-item.js.map +1 -1
  29. package/dist-server/tsconfig.tsbuildinfo +1 -1
  30. 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("./checklist-item/checklist-item").ChecklistItem | typeof import("./checklist-item-comment/checklist-item-comment").ChecklistItemComment | typeof import("./checklist/checklist").Checklist | typeof import("./project-checklist-item/project-checklist-item").ProjectChecklistItem | typeof import("./project-checklist/project-checklist").ProjectChecklist | typeof import("./checklist-item-history/checklist-item-history").ChecklistItemHistory | typeof import("./checklist-history/checklist-history").ChecklistHistory | 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-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)[];
@@ -35,7 +35,7 @@ let ProjectChecklistMutation = class ProjectChecklistMutation {
35
35
  });
36
36
  savedItems.push(saved);
37
37
  }
38
- // 검사항목별 KCS 표준 / 현장 시방서 기준 매칭을 백그라운드(비동기)로 트리거
38
+ // 검사항목별 KCS 표준 / 공사 시방서 기준 매칭을 백그라운드(비동기)로 트리거
39
39
  (0, spec_matching_service_1.queueUpdateProjectChecklistCriteria)(savedItems.map(v => v.id), siteSpecPdfUrl);
40
40
  return checklist;
41
41
  }
@@ -63,7 +63,7 @@ let ProjectChecklistMutation = class ProjectChecklistMutation {
63
63
  });
64
64
  savedItems.push(saved);
65
65
  }
66
- // 검사항목별 KCS 표준 / 현장 시방서 기준 매칭을 백그라운드(비동기)로 트리거
66
+ // 검사항목별 KCS 표준 / 공사 시방서 기준 매칭을 백그라운드(비동기)로 트리거
67
67
  (0, spec_matching_service_1.queueUpdateProjectChecklistCriteria)(savedItems.map(v => v.id), siteSpecPdfUrl);
68
68
  return checklist;
69
69
  }
@@ -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 } 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"]}
@@ -3,14 +3,14 @@ export interface MatchedCriteria {
3
3
  siteSpecCriteria: string | null;
4
4
  }
5
5
  /**
6
- * 검사항목(query) 1건에 대해 KCS 표준 기준과 현장 시방서 기준을 매칭 API로 조회한다.
6
+ * 검사항목(query) 1건에 대해 KCS 표준 기준과 공사 시방서 기준을 매칭 API로 조회한다.
7
7
  * - KCS 표준은 API 서버에 파일(kcs.csv)이 이미 존재한다.
8
- * - 현장 시방서는 업로드한 PDF URL(siteSpecPdfUrl)을 넘길 때만 매칭된다.
8
+ * - 공사 시방서는 업로드한 PDF URL(siteSpecPdfUrl)을 넘길 때만 매칭된다.
9
9
  * - 첨부파일이 없으면 site_spec_pdf_url 파라미터는 생략한다.
10
10
  */
11
11
  export declare function matchInspectionCriteria(query: string, siteSpecPdfUrl?: string, constructionTypeName?: string, constructionDetailTypeName?: string): Promise<MatchedCriteria>;
12
12
  /**
13
- * 검사항목 ID 목록에 대해 KCS/현장 시방서 기준을 매칭하여 저장한다.
13
+ * 검사항목 ID 목록에 대해 KCS/공사 시방서 기준을 매칭하여 저장한다.
14
14
  * (트랜잭션 커밋 후 백그라운드에서 실행되므로 전역 repository 사용)
15
15
  */
16
16
  export declare function updateProjectChecklistCriteria(itemIds: string[], siteSpecPdfUrl?: string): Promise<void>;
@@ -17,7 +17,7 @@ function formatClauses(text) {
17
17
  return (text || '').replace(/\s*(?=\(\d+\))/g, '\n').trim();
18
18
  }
19
19
  /**
20
- * 현장 시방서 URL을 매칭 서버가 접근 가능한 URL로 변환한다.
20
+ * 공사 시방서 URL을 매칭 서버가 접근 가능한 URL로 변환한다.
21
21
  * 저장된 URL은 앱 프록시 경로(/attachment/{s3-key})라서 외부 매칭 서버가 접근할 수 없으므로,
22
22
  * S3 스토리지인 경우 해당 key에 대한 presigned GET URL(1시간)을 생성해서 반환한다.
23
23
  */
@@ -26,7 +26,7 @@ async function toDownloadableUrl(siteSpecPdfUrl) {
26
26
  return undefined;
27
27
  const matched = siteSpecPdfUrl.match(/\/attachment\/([^/?#]+)/);
28
28
  if (!matched || (STORAGE === null || STORAGE === void 0 ? void 0 : STORAGE.type) !== 's3') {
29
- console.log('현장 시방서 URL 변환 생략 (원본 그대로 사용) :', siteSpecPdfUrl);
29
+ console.log('공사 시방서 URL 변환 생략 (원본 그대로 사용) :', siteSpecPdfUrl);
30
30
  return siteSpecPdfUrl;
31
31
  }
32
32
  try {
@@ -38,18 +38,18 @@ async function toDownloadableUrl(siteSpecPdfUrl) {
38
38
  region: STORAGE.region
39
39
  });
40
40
  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]), ')');
41
+ console.log('공사 시방서 presigned URL 생성 완료 (key :', decodeURIComponent(matched[1]), ')');
42
42
  return signedUrl;
43
43
  }
44
44
  catch (error) {
45
- console.error('현장 시방서 presigned URL 생성 실패:', error);
45
+ console.error('공사 시방서 presigned URL 생성 실패:', error);
46
46
  return siteSpecPdfUrl;
47
47
  }
48
48
  }
49
49
  /**
50
- * 검사항목(query) 1건에 대해 KCS 표준 기준과 현장 시방서 기준을 매칭 API로 조회한다.
50
+ * 검사항목(query) 1건에 대해 KCS 표준 기준과 공사 시방서 기준을 매칭 API로 조회한다.
51
51
  * - KCS 표준은 API 서버에 파일(kcs.csv)이 이미 존재한다.
52
- * - 현장 시방서는 업로드한 PDF URL(siteSpecPdfUrl)을 넘길 때만 매칭된다.
52
+ * - 공사 시방서는 업로드한 PDF URL(siteSpecPdfUrl)을 넘길 때만 매칭된다.
53
53
  * - 첨부파일이 없으면 site_spec_pdf_url 파라미터는 생략한다.
54
54
  */
55
55
  async function matchInspectionCriteria(query, siteSpecPdfUrl, constructionTypeName, constructionDetailTypeName) {
@@ -61,7 +61,7 @@ async function matchInspectionCriteria(query, siteSpecPdfUrl, constructionTypeNa
61
61
  params['공종'] = constructionTypeName;
62
62
  if (constructionDetailTypeName)
63
63
  params['세부공종'] = constructionDetailTypeName;
64
- // 첨부파일(현장 시방서 PDF)이 없으면 site_spec_pdf_url 은 생략
64
+ // 첨부파일(공사 시방서 PDF)이 없으면 site_spec_pdf_url 은 생략
65
65
  if (siteSpecPdfUrl) {
66
66
  params.site_spec_pdf_url = siteSpecPdfUrl;
67
67
  }
@@ -79,18 +79,18 @@ async function matchInspectionCriteria(query, siteSpecPdfUrl, constructionTypeNa
79
79
  });
80
80
  const outer = await (response === null || response === void 0 ? void 0 : response.json());
81
81
  console.log('data :', outer);
82
- // 현장 시방서 매칭 결과 로그 (PDF URL 전달 여부 / 매칭 결과 / 에러)
82
+ // 공사 시방서 매칭 결과 로그 (PDF URL 전달 여부 / 매칭 결과 / 에러)
83
83
  if (siteSpecPdfUrl) {
84
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);
85
+ console.log('공사 시방서 query :', query);
86
+ console.log('공사 시방서 pdf_url :', siteSpecPdfUrl);
87
+ console.log('공사 시방서 matches :', innerResult.site_spec_matches);
88
88
  if (innerResult.site_spec_error) {
89
- console.error('현장 시방서 매칭 에러 :', innerResult.site_spec_error);
89
+ console.error('공사 시방서 매칭 에러 :', innerResult.site_spec_error);
90
90
  }
91
91
  }
92
92
  else {
93
- console.log('현장 시방서 pdf_url 없음 → KCS 매칭만 수행 (query :', query, ')');
93
+ console.log('공사 시방서 pdf_url 없음 → KCS 매칭만 수행 (query :', query, ')');
94
94
  }
95
95
  // runner 응답: { result: <모듈 main() 반환>, exit_code, ... }, 모듈 반환: { status, result: {...} }
96
96
  const moduleReturn = outer === null || outer === void 0 ? void 0 : outer.result;
@@ -112,7 +112,7 @@ async function matchInspectionCriteria(query, siteSpecPdfUrl, constructionTypeNa
112
112
  return { kcsCriteria: null, siteSpecCriteria: null };
113
113
  }
114
114
  /**
115
- * 검사항목 ID 목록에 대해 KCS/현장 시방서 기준을 매칭하여 저장한다.
115
+ * 검사항목 ID 목록에 대해 KCS/공사 시방서 기준을 매칭하여 저장한다.
116
116
  * (트랜잭션 커밋 후 백그라운드에서 실행되므로 전역 repository 사용)
117
117
  */
118
118
  async function updateProjectChecklistCriteria(itemIds, siteSpecPdfUrl) {
@@ -1 +1 @@
1
- {"version":3,"file":"spec-matching-service.js","sourceRoot":"","sources":["../../../server/service/project-checklist/spec-matching-service.ts"],"names":[],"mappings":"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","sourcesContent":["import { GetObjectCommand, S3Client } from '@aws-sdk/client-s3'\nimport { getSignedUrl } from '@aws-sdk/s3-request-presigner'\nimport { config } from '@things-factory/env'\nimport { getRepository } from '@things-factory/shell'\nimport { ProjectChecklistItem } from '../project-checklist-item/project-checklist-item'\n\nconst STORAGE: any = config.get('storage', {})\n\nconst SPEC_MATCHING_API_URL: string = 'https://hatiolab-korea-uni.nruing.com/api/run/spec-matching'\nconst API_USERNAME: string = 'admin'\nconst API_PASSWORD: string = 'admin1234'\n\n// 조항 번호 마커 (1) (2) ... 앞에서 줄바꿈\nfunction formatClauses(text?: string): string {\n return (text || '').replace(/\\s*(?=\\(\\d+\\))/g, '\\n').trim()\n}\n\n/**\n * 현장 시방서 URL을 매칭 서버가 접근 가능한 URL로 변환한다.\n * 저장된 URL은 앱 프록시 경로(/attachment/{s3-key})라서 외부 매칭 서버가 접근할 수 없으므로,\n * S3 스토리지인 경우 해당 key에 대한 presigned GET URL(1시간)을 생성해서 반환한다.\n */\nasync function toDownloadableUrl(siteSpecPdfUrl?: string): Promise<string | undefined> {\n if (!siteSpecPdfUrl) return undefined\n\n const matched = siteSpecPdfUrl.match(/\\/attachment\\/([^/?#]+)/)\n if (!matched || STORAGE?.type !== 's3') {\n console.log('현장 시방서 URL 변환 생략 (원본 그대로 사용) :', siteSpecPdfUrl)\n return siteSpecPdfUrl\n }\n\n try {\n const client = new S3Client({\n credentials: {\n accessKeyId: STORAGE.accessKeyId,\n secretAccessKey: STORAGE.secretAccessKey\n },\n region: STORAGE.region\n })\n const signedUrl = await getSignedUrl(\n client,\n new GetObjectCommand({ Bucket: STORAGE.bucketName, Key: decodeURIComponent(matched[1]) }),\n { expiresIn: 3600 }\n )\n console.log('현장 시방서 presigned URL 생성 완료 (key :', decodeURIComponent(matched[1]), ')')\n return signedUrl\n } catch (error) {\n console.error('현장 시방서 presigned URL 생성 실패:', error)\n return siteSpecPdfUrl\n }\n}\n\nexport interface MatchedCriteria {\n // KCS 시방서 기준: kcs_matches[0] 오브젝트 전체를 JSON 문자열로 저장 (file_label 등 포함)\n kcsCriteria: string | null\n // 현장 시방서 기준: site_spec_matches[0].text\n siteSpecCriteria: string | null\n}\n\n/**\n * 검사항목(query) 1건에 대해 KCS 표준 기준과 현장 시방서 기준을 매칭 API로 조회한다.\n * - KCS 표준은 API 서버에 파일(kcs.csv)이 이미 존재한다.\n * - 현장 시방서는 업로드한 PDF URL(siteSpecPdfUrl)을 넘길 때만 매칭된다.\n * - 첨부파일이 없으면 site_spec_pdf_url 파라미터는 생략한다.\n */\nexport async function matchInspectionCriteria(\n query: string,\n siteSpecPdfUrl?: string,\n constructionTypeName?: string,\n constructionDetailTypeName?: string\n): Promise<MatchedCriteria> {\n // operato-runner /api/run/{module} 은 multipart 폼필드 'input'(JSON 문자열)으로 입력을 받는다\n const params: any = { query, top_k: 1 }\n // 공종/세부공종을 주면 매칭 엔진이 해당 KCS 문서 범위로 좁혀 검색한다 (미전달 시 전체 문서 전역 검색)\n if (constructionTypeName) params['공종'] = constructionTypeName\n if (constructionDetailTypeName) params['세부공종'] = constructionDetailTypeName\n // 첨부파일(현장 시방서 PDF)이 없으면 site_spec_pdf_url 은 생략\n if (siteSpecPdfUrl) {\n params.site_spec_pdf_url = siteSpecPdfUrl\n }\n\n const form = new FormData()\n form.append('input', JSON.stringify(params))\n\n // Content-Type은 FormData가 boundary와 함께 자동 설정하므로 지정하지 않음\n const headers: any = {\n Authorization: `Basic ${Buffer.from(`${API_USERNAME}:${API_PASSWORD}`).toString('base64')}`\n }\n\n try {\n const response = await fetch(SPEC_MATCHING_API_URL, {\n method: 'POST',\n headers,\n body: form\n })\n\n const outer = await response?.json()\n\n console.log('data :', outer)\n\n // 현장 시방서 매칭 결과 로그 (PDF URL 전달 여부 / 매칭 결과 / 에러)\n if (siteSpecPdfUrl) {\n const innerResult = outer?.result?.result || {}\n console.log('현장 시방서 query :', query)\n console.log('현장 시방서 pdf_url :', siteSpecPdfUrl)\n console.log('현장 시방서 matches :', innerResult.site_spec_matches)\n if (innerResult.site_spec_error) {\n console.error('현장 시방서 매칭 에러 :', innerResult.site_spec_error)\n }\n } else {\n console.log('현장 시방서 pdf_url 없음 → KCS 매칭만 수행 (query :', query, ')')\n }\n // runner 응답: { result: <모듈 main() 반환>, exit_code, ... }, 모듈 반환: { status, result: {...} }\n const moduleReturn = outer?.result\n if (moduleReturn?.status === 'success') {\n const result = moduleReturn.result || {}\n const kcsMatch = result.kcs_matches?.[0] || null\n // 조항 번호 마커 (1) (2) ... 앞에서 줄바꿈 (저장 시 1회 파싱)\n if (kcsMatch?.text) kcsMatch.text = formatClauses(kcsMatch.text)\n\n return {\n kcsCriteria: kcsMatch ? JSON.stringify(kcsMatch) : null,\n siteSpecCriteria: formatClauses(result.site_spec_matches?.[0]?.text) || null\n }\n }\n } catch (error) {\n console.error('spec-matching API 호출 실패:', error)\n }\n\n return { kcsCriteria: null, siteSpecCriteria: null }\n}\n\n/**\n * 검사항목 ID 목록에 대해 KCS/현장 시방서 기준을 매칭하여 저장한다.\n * (트랜잭션 커밋 후 백그라운드에서 실행되므로 전역 repository 사용)\n */\nexport async function updateProjectChecklistCriteria(itemIds: string[], siteSpecPdfUrl?: string): Promise<void> {\n const repository = getRepository(ProjectChecklistItem)\n\n // 앱 프록시 URL(/attachment/...) → S3 presigned URL 변환 (배치당 1회)\n const downloadableUrl = await toDownloadableUrl(siteSpecPdfUrl)\n\n // 체크리스트별 공종/세부공종 이름 캐시 — 매칭 엔진이 이 값으로 KCS 문서 범위를 좁힌다\n const typeNameCache: { [checklistId: string]: { gongjong?: string; sebu?: string } } = {}\n\n for (const id of itemIds) {\n try {\n const item = await repository.findOne({ where: { id }, relations: ['projectChecklist'] })\n if (!item) continue\n\n const checklist = item.projectChecklist\n let typeNames = checklist ? typeNameCache[checklist.id] : undefined\n if (checklist && !typeNames) {\n // 공종/세부공종 이름 조회 (@dssp/project 테이블 — 패키지 의존 없이 raw query)\n const [ct] = await repository.manager.query(`SELECT name FROM construction_types WHERE id = $1`, [\n checklist.constructionTypeId\n ])\n const [cdt] = await repository.manager.query(`SELECT name FROM construction_detail_types WHERE id = $1`, [\n checklist.constructionDetailTypeId\n ])\n typeNames = { gongjong: ct?.name, sebu: cdt?.name }\n typeNameCache[checklist.id] = typeNames\n }\n\n const { kcsCriteria, siteSpecCriteria } = await matchInspectionCriteria(\n item.name,\n downloadableUrl,\n typeNames?.gongjong,\n typeNames?.sebu\n )\n await repository.update({ id }, { kcsCriteria, siteSpecCriteria })\n } catch (error) {\n console.error('project-checklist 검사 기준 매칭 실패:', error)\n }\n }\n}\n\n// 검사 기준 매칭을 백그라운드(비동기)로 트리거 — 저장 응답을 막지 않는다.\nexport function queueUpdateProjectChecklistCriteria(itemIds: string[], siteSpecPdfUrl?: string): void {\n if (!itemIds || itemIds.length === 0) return\n\n setTimeout(() => {\n updateProjectChecklistCriteria(itemIds, siteSpecPdfUrl).catch(err => {\n console.error('Background spec-matching update failed (project-checklist):', err)\n })\n }, 0)\n}\n"]}
1
+ {"version":3,"file":"spec-matching-service.js","sourceRoot":"","sources":["../../../server/service/project-checklist/spec-matching-service.ts"],"names":[],"mappings":"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","sourcesContent":["import { GetObjectCommand, S3Client } from '@aws-sdk/client-s3'\nimport { getSignedUrl } from '@aws-sdk/s3-request-presigner'\nimport { config } from '@things-factory/env'\nimport { getRepository } from '@things-factory/shell'\nimport { ProjectChecklistItem } from '../project-checklist-item/project-checklist-item'\n\nconst STORAGE: any = config.get('storage', {})\n\nconst SPEC_MATCHING_API_URL: string = 'https://hatiolab-korea-uni.nruing.com/api/run/spec-matching'\nconst API_USERNAME: string = 'admin'\nconst API_PASSWORD: string = 'admin1234'\n\n// 조항 번호 마커 (1) (2) ... 앞에서 줄바꿈\nfunction formatClauses(text?: string): string {\n return (text || '').replace(/\\s*(?=\\(\\d+\\))/g, '\\n').trim()\n}\n\n/**\n * 공사 시방서 URL을 매칭 서버가 접근 가능한 URL로 변환한다.\n * 저장된 URL은 앱 프록시 경로(/attachment/{s3-key})라서 외부 매칭 서버가 접근할 수 없으므로,\n * S3 스토리지인 경우 해당 key에 대한 presigned GET URL(1시간)을 생성해서 반환한다.\n */\nasync function toDownloadableUrl(siteSpecPdfUrl?: string): Promise<string | undefined> {\n if (!siteSpecPdfUrl) return undefined\n\n const matched = siteSpecPdfUrl.match(/\\/attachment\\/([^/?#]+)/)\n if (!matched || STORAGE?.type !== 's3') {\n console.log('공사 시방서 URL 변환 생략 (원본 그대로 사용) :', siteSpecPdfUrl)\n return siteSpecPdfUrl\n }\n\n try {\n const client = new S3Client({\n credentials: {\n accessKeyId: STORAGE.accessKeyId,\n secretAccessKey: STORAGE.secretAccessKey\n },\n region: STORAGE.region\n })\n const signedUrl = await getSignedUrl(\n client,\n new GetObjectCommand({ Bucket: STORAGE.bucketName, Key: decodeURIComponent(matched[1]) }),\n { expiresIn: 3600 }\n )\n console.log('공사 시방서 presigned URL 생성 완료 (key :', decodeURIComponent(matched[1]), ')')\n return signedUrl\n } catch (error) {\n console.error('공사 시방서 presigned URL 생성 실패:', error)\n return siteSpecPdfUrl\n }\n}\n\nexport interface MatchedCriteria {\n // KCS 시방서 기준: kcs_matches[0] 오브젝트 전체를 JSON 문자열로 저장 (file_label 등 포함)\n kcsCriteria: string | null\n // 공사 시방서 기준: site_spec_matches[0].text\n siteSpecCriteria: string | null\n}\n\n/**\n * 검사항목(query) 1건에 대해 KCS 표준 기준과 공사 시방서 기준을 매칭 API로 조회한다.\n * - KCS 표준은 API 서버에 파일(kcs.csv)이 이미 존재한다.\n * - 공사 시방서는 업로드한 PDF URL(siteSpecPdfUrl)을 넘길 때만 매칭된다.\n * - 첨부파일이 없으면 site_spec_pdf_url 파라미터는 생략한다.\n */\nexport async function matchInspectionCriteria(\n query: string,\n siteSpecPdfUrl?: string,\n constructionTypeName?: string,\n constructionDetailTypeName?: string\n): Promise<MatchedCriteria> {\n // operato-runner /api/run/{module} 은 multipart 폼필드 'input'(JSON 문자열)으로 입력을 받는다\n const params: any = { query, top_k: 1 }\n // 공종/세부공종을 주면 매칭 엔진이 해당 KCS 문서 범위로 좁혀 검색한다 (미전달 시 전체 문서 전역 검색)\n if (constructionTypeName) params['공종'] = constructionTypeName\n if (constructionDetailTypeName) params['세부공종'] = constructionDetailTypeName\n // 첨부파일(공사 시방서 PDF)이 없으면 site_spec_pdf_url 은 생략\n if (siteSpecPdfUrl) {\n params.site_spec_pdf_url = siteSpecPdfUrl\n }\n\n const form = new FormData()\n form.append('input', JSON.stringify(params))\n\n // Content-Type은 FormData가 boundary와 함께 자동 설정하므로 지정하지 않음\n const headers: any = {\n Authorization: `Basic ${Buffer.from(`${API_USERNAME}:${API_PASSWORD}`).toString('base64')}`\n }\n\n try {\n const response = await fetch(SPEC_MATCHING_API_URL, {\n method: 'POST',\n headers,\n body: form\n })\n\n const outer = await response?.json()\n\n console.log('data :', outer)\n\n // 공사 시방서 매칭 결과 로그 (PDF URL 전달 여부 / 매칭 결과 / 에러)\n if (siteSpecPdfUrl) {\n const innerResult = outer?.result?.result || {}\n console.log('공사 시방서 query :', query)\n console.log('공사 시방서 pdf_url :', siteSpecPdfUrl)\n console.log('공사 시방서 matches :', innerResult.site_spec_matches)\n if (innerResult.site_spec_error) {\n console.error('공사 시방서 매칭 에러 :', innerResult.site_spec_error)\n }\n } else {\n console.log('공사 시방서 pdf_url 없음 → KCS 매칭만 수행 (query :', query, ')')\n }\n // runner 응답: { result: <모듈 main() 반환>, exit_code, ... }, 모듈 반환: { status, result: {...} }\n const moduleReturn = outer?.result\n if (moduleReturn?.status === 'success') {\n const result = moduleReturn.result || {}\n const kcsMatch = result.kcs_matches?.[0] || null\n // 조항 번호 마커 (1) (2) ... 앞에서 줄바꿈 (저장 시 1회 파싱)\n if (kcsMatch?.text) kcsMatch.text = formatClauses(kcsMatch.text)\n\n return {\n kcsCriteria: kcsMatch ? JSON.stringify(kcsMatch) : null,\n siteSpecCriteria: formatClauses(result.site_spec_matches?.[0]?.text) || null\n }\n }\n } catch (error) {\n console.error('spec-matching API 호출 실패:', error)\n }\n\n return { kcsCriteria: null, siteSpecCriteria: null }\n}\n\n/**\n * 검사항목 ID 목록에 대해 KCS/공사 시방서 기준을 매칭하여 저장한다.\n * (트랜잭션 커밋 후 백그라운드에서 실행되므로 전역 repository 사용)\n */\nexport async function updateProjectChecklistCriteria(itemIds: string[], siteSpecPdfUrl?: string): Promise<void> {\n const repository = getRepository(ProjectChecklistItem)\n\n // 앱 프록시 URL(/attachment/...) → S3 presigned URL 변환 (배치당 1회)\n const downloadableUrl = await toDownloadableUrl(siteSpecPdfUrl)\n\n // 체크리스트별 공종/세부공종 이름 캐시 — 매칭 엔진이 이 값으로 KCS 문서 범위를 좁힌다\n const typeNameCache: { [checklistId: string]: { gongjong?: string; sebu?: string } } = {}\n\n for (const id of itemIds) {\n try {\n const item = await repository.findOne({ where: { id }, relations: ['projectChecklist'] })\n if (!item) continue\n\n const checklist = item.projectChecklist\n let typeNames = checklist ? typeNameCache[checklist.id] : undefined\n if (checklist && !typeNames) {\n // 공종/세부공종 이름 조회 (@dssp/project 테이블 — 패키지 의존 없이 raw query)\n const [ct] = await repository.manager.query(`SELECT name FROM construction_types WHERE id = $1`, [\n checklist.constructionTypeId\n ])\n const [cdt] = await repository.manager.query(`SELECT name FROM construction_detail_types WHERE id = $1`, [\n checklist.constructionDetailTypeId\n ])\n typeNames = { gongjong: ct?.name, sebu: cdt?.name }\n typeNameCache[checklist.id] = typeNames\n }\n\n const { kcsCriteria, siteSpecCriteria } = await matchInspectionCriteria(\n item.name,\n downloadableUrl,\n typeNames?.gongjong,\n typeNames?.sebu\n )\n await repository.update({ id }, { kcsCriteria, siteSpecCriteria })\n } catch (error) {\n console.error('project-checklist 검사 기준 매칭 실패:', error)\n }\n }\n}\n\n// 검사 기준 매칭을 백그라운드(비동기)로 트리거 — 저장 응답을 막지 않는다.\nexport function queueUpdateProjectChecklistCriteria(itemIds: string[], siteSpecPdfUrl?: string): void {\n if (!itemIds || itemIds.length === 0) return\n\n setTimeout(() => {\n updateProjectChecklistCriteria(itemIds, siteSpecPdfUrl).catch(err => {\n console.error('Background spec-matching update failed (project-checklist):', err)\n })\n }, 0)\n}\n"]}
@@ -35,7 +35,7 @@ tslib_1.__decorate([
35
35
  tslib_1.__metadata("design:type", String)
36
36
  ], ProjectChecklistItem.prototype, "kcsCriteria", void 0);
37
37
  tslib_1.__decorate([
38
- (0, typeorm_1.Column)({ nullable: true, comment: '현장 시방서 기준 - site_spec_matches[0].text' }),
38
+ (0, typeorm_1.Column)({ nullable: true, comment: '공사 시방서 기준 - site_spec_matches[0].text' }),
39
39
  (0, type_graphql_1.Field)({ nullable: true }),
40
40
  tslib_1.__metadata("design:type", String)
41
41
  ], ProjectChecklistItem.prototype, "siteSpecCriteria", void 0);
@@ -1 +1 @@
1
- {"version":3,"file":"project-checklist-item.js","sourceRoot":"","sources":["../../../server/service/project-checklist-item/project-checklist-item.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n CreateDateColumn,\n UpdateDateColumn,\n Entity,\n Index,\n Column,\n RelationId,\n ManyToOne,\n PrimaryGeneratedColumn\n} from 'typeorm'\nimport { ObjectType, Field, ID, Int } from 'type-graphql'\n\nimport { User } from '@things-factory/auth-base'\nimport { ProjectChecklist } from '../project-checklist/project-checklist'\n\n@Entity({ comment: '프로젝트 체크리스트 아이템' })\n@Index('ix_project_checklist_item_0', (item: ProjectChecklistItem) => [\n item.projectChecklist,\n item.sequence\n])\n@ObjectType()\nexport class ProjectChecklistItem {\n @PrimaryGeneratedColumn('uuid')\n @Field(type => ID)\n readonly id: string\n\n @Column({ nullable: true, comment: '구분' })\n @Field({ nullable: true })\n mainType?: string\n\n @Column({ nullable: false, comment: '검사항목' })\n @Field({ nullable: false })\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: '시퀀스' })\n @Field(type => Int, { nullable: true })\n sequence?: number\n\n @ManyToOne(type => ProjectChecklist)\n @Field(type => ProjectChecklist, { nullable: true })\n projectChecklist?: ProjectChecklist\n\n @RelationId((item: ProjectChecklistItem) => item.projectChecklist)\n projectChecklistId?: string\n\n @CreateDateColumn()\n @Field({ nullable: true })\n createdAt?: Date\n\n @UpdateDateColumn()\n @Field({ nullable: true })\n updatedAt?: Date\n\n @ManyToOne(type => User, { nullable: true })\n @Field(type => User, { nullable: true })\n creator?: User\n\n @RelationId((item: ProjectChecklistItem) => item.creator)\n creatorId?: string\n\n @ManyToOne(type => User, { nullable: true })\n @Field(type => User, { nullable: true })\n updater?: User\n\n @RelationId((item: ProjectChecklistItem) => item.updater)\n updaterId?: string\n}\n"]}
1
+ {"version":3,"file":"project-checklist-item.js","sourceRoot":"","sources":["../../../server/service/project-checklist-item/project-checklist-item.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n CreateDateColumn,\n UpdateDateColumn,\n Entity,\n Index,\n Column,\n RelationId,\n ManyToOne,\n PrimaryGeneratedColumn\n} from 'typeorm'\nimport { ObjectType, Field, ID, Int } from 'type-graphql'\n\nimport { User } from '@things-factory/auth-base'\nimport { ProjectChecklist } from '../project-checklist/project-checklist'\n\n@Entity({ comment: '프로젝트 체크리스트 아이템' })\n@Index('ix_project_checklist_item_0', (item: ProjectChecklistItem) => [\n item.projectChecklist,\n item.sequence\n])\n@ObjectType()\nexport class ProjectChecklistItem {\n @PrimaryGeneratedColumn('uuid')\n @Field(type => ID)\n readonly id: string\n\n @Column({ nullable: true, comment: '구분' })\n @Field({ nullable: true })\n mainType?: string\n\n @Column({ nullable: false, comment: '검사항목' })\n @Field({ nullable: false })\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: '시퀀스' })\n @Field(type => Int, { nullable: true })\n sequence?: number\n\n @ManyToOne(type => ProjectChecklist)\n @Field(type => ProjectChecklist, { nullable: true })\n projectChecklist?: ProjectChecklist\n\n @RelationId((item: ProjectChecklistItem) => item.projectChecklist)\n projectChecklistId?: string\n\n @CreateDateColumn()\n @Field({ nullable: true })\n createdAt?: Date\n\n @UpdateDateColumn()\n @Field({ nullable: true })\n updatedAt?: Date\n\n @ManyToOne(type => User, { nullable: true })\n @Field(type => User, { nullable: true })\n creator?: User\n\n @RelationId((item: ProjectChecklistItem) => item.creator)\n creatorId?: string\n\n @ManyToOne(type => User, { nullable: true })\n @Field(type => User, { nullable: true })\n updater?: User\n\n @RelationId((item: ProjectChecklistItem) => item.updater)\n updaterId?: string\n}\n"]}