@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.
- package/dist-client/pages/building-inspection/building-inspection-detail-ai-measurement.d.ts +7 -0
- package/dist-client/pages/building-inspection/building-inspection-detail-ai-measurement.js +170 -17
- package/dist-client/pages/building-inspection/building-inspection-detail-ai-measurement.js.map +1 -1
- package/dist-client/pages/building-inspection/inspection-create-popup.js +2 -2
- package/dist-client/pages/building-inspection/inspection-create-popup.js.map +1 -1
- package/dist-client/pages/building-inspection/inspection-with-checklist-create-popup.js +2 -2
- package/dist-client/pages/building-inspection/inspection-with-checklist-create-popup.js.map +1 -1
- package/dist-client/pages/checklist/checklist-view.js +3 -3
- package/dist-client/pages/checklist/checklist-view.js.map +1 -1
- package/dist-client/pages/checklist-template/checklist-template-list.js +1 -1
- package/dist-client/pages/checklist-template/checklist-template-list.js.map +1 -1
- package/dist-client/pages/project-checklist/project-checklist-management.js +14 -14
- package/dist-client/pages/project-checklist/project-checklist-management.js.map +1 -1
- package/dist-client/route.d.ts +1 -1
- package/dist-client/tsconfig.tsbuildinfo +1 -1
- package/dist-server/service/checklist-item/checklist-item.js +1 -1
- package/dist-server/service/checklist-item/checklist-item.js.map +1 -1
- package/dist-server/service/checklist-item-history/checklist-item-history.js +1 -1
- package/dist-server/service/checklist-item-history/checklist-item-history.js.map +1 -1
- package/dist-server/service/index.d.ts +1 -1
- package/dist-server/service/project-checklist/index.d.ts +1 -1
- package/dist-server/service/project-checklist/project-checklist-mutation.js +2 -2
- package/dist-server/service/project-checklist/project-checklist-mutation.js.map +1 -1
- package/dist-server/service/project-checklist/spec-matching-service.d.ts +3 -3
- package/dist-server/service/project-checklist/spec-matching-service.js +14 -14
- package/dist-server/service/project-checklist/spec-matching-service.js.map +1 -1
- package/dist-server/service/project-checklist-item/project-checklist-item.js +1 -1
- package/dist-server/service/project-checklist-item/project-checklist-item.js.map +1 -1
- package/dist-server/tsconfig.tsbuildinfo +1 -1
- 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: '
|
|
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: '
|
|
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: '
|
|
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: '
|
|
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("./
|
|
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
|
|
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 표준 /
|
|
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 표준 기준과
|
|
6
|
+
* 검사항목(query) 1건에 대해 KCS 표준 기준과 공사 시방서 기준을 매칭 API로 조회한다.
|
|
7
7
|
* - KCS 표준은 API 서버에 파일(kcs.csv)이 이미 존재한다.
|
|
8
|
-
* -
|
|
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
|
-
*
|
|
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('
|
|
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('
|
|
41
|
+
console.log('공사 시방서 presigned URL 생성 완료 (key :', decodeURIComponent(matched[1]), ')');
|
|
42
42
|
return signedUrl;
|
|
43
43
|
}
|
|
44
44
|
catch (error) {
|
|
45
|
-
console.error('
|
|
45
|
+
console.error('공사 시방서 presigned URL 생성 실패:', error);
|
|
46
46
|
return siteSpecPdfUrl;
|
|
47
47
|
}
|
|
48
48
|
}
|
|
49
49
|
/**
|
|
50
|
-
* 검사항목(query) 1건에 대해 KCS 표준 기준과
|
|
50
|
+
* 검사항목(query) 1건에 대해 KCS 표준 기준과 공사 시방서 기준을 매칭 API로 조회한다.
|
|
51
51
|
* - KCS 표준은 API 서버에 파일(kcs.csv)이 이미 존재한다.
|
|
52
|
-
* -
|
|
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
|
-
// 첨부파일(
|
|
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
|
-
//
|
|
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('
|
|
86
|
-
console.log('
|
|
87
|
-
console.log('
|
|
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('
|
|
89
|
+
console.error('공사 시방서 매칭 에러 :', innerResult.site_spec_error);
|
|
90
90
|
}
|
|
91
91
|
}
|
|
92
92
|
else {
|
|
93
|
-
console.log('
|
|
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: '
|
|
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: '
|
|
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"]}
|