From 3502a333d61eba71b1b097312a3262afd02076c8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E0=B9=8F?= Date: Thu, 9 Jul 2026 17:51:12 +0800 Subject: [PATCH 1/7] =?UTF-8?q?feat:=20=E6=96=B0=E5=A2=9E=E8=83=BD?= =?UTF-8?q?=E6=BA=90=E6=8A=A5=E5=91=8A=E6=A8=A1=E6=9D=BF=E7=AE=A1=E7=90=86?= =?UTF-8?q?=E6=A8=A1=E5=9D=97=EF=BC=8C=E8=A7=84=E5=88=99=E5=85=B3=E8=81=94?= =?UTF-8?q?=E7=BB=91=E5=AE=9A=E6=93=8D=E4=BD=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/api/module_energy_report/report.ts | 302 +++++ src/views/module_energy_report/promptVars.ts | 26 + .../module_energy_report/template/detail.vue | 698 ++++++++++++ .../module_energy_report/template/edit.vue | 1001 +++++++++++++++++ .../module_energy_report/template/list.vue | 749 ++++++++++++ 5 files changed, 2776 insertions(+) create mode 100644 src/api/module_energy_report/report.ts create mode 100644 src/views/module_energy_report/promptVars.ts create mode 100644 src/views/module_energy_report/template/detail.vue create mode 100644 src/views/module_energy_report/template/edit.vue create mode 100644 src/views/module_energy_report/template/list.vue diff --git a/src/api/module_energy_report/report.ts b/src/api/module_energy_report/report.ts new file mode 100644 index 0000000..75d9245 --- /dev/null +++ b/src/api/module_energy_report/report.ts @@ -0,0 +1,302 @@ +// 能源报告模块接口 +// 包含:文件上传(通用)、能源报告模板(CRUD) +import { request } from "@utils"; + +const FILE_PATH = "/common/file"; +const TEMPLATE_PATH = "/attachment-template"; + +// ============ 文件上传(通用) ============ + +const FileAPI = { + /** + * 上传文件 + * @param file 文件本体 + * @param business_type 业务类型(能源报告模板固定传 energy_report_template) + * @param options 其他 query 参数 + */ + upload( + file: File, + business_type = "energy_report_template", + options?: { upload_type?: string; business_id?: number } + ) { + const formData = new FormData(); + formData.append("file", file); + const params: Record = { + business_type, + upload_type: options?.upload_type || "file", + }; + if (options?.business_id) { + params.business_id = options.business_id; + } + return request>({ + url: `${FILE_PATH}/upload`, + method: "post", + data: formData, + params, + headers: { "Content-Type": "multipart/form-data" }, + }); + }, + + /** 生成文件预签名访问地址(私有桶使用) */ + presigned(id: number) { + return request>({ + url: `${FILE_PATH}/presigned/${id}`, + method: "get", + }); + }, + + /** 删除文件记录(可选同时删 MinIO 对象) */ + remove(ids: number[], delete_object = false) { + return request({ + url: `${FILE_PATH}/delete`, + method: "delete", + data: ids, + params: delete_object ? { delete_object: true } : undefined, + }); + }, +}; + +// ============ 能源报告模板 ============ + +const ReportTemplateAPI = { + /** 查询模板分页列表 */ + page(query?: ReportTemplatePageQuery) { + return request>>({ + url: `${TEMPLATE_PATH}/list`, + method: "get", + params: query, + }); + }, + + /** 查询模板详情 */ + detail(id: number) { + return request>({ + url: `${TEMPLATE_PATH}/detail/${id}`, + method: "get", + }); + }, + + /** 创建模板 */ + create(body: ReportTemplateCreateForm) { + return request>({ + url: `${TEMPLATE_PATH}/create`, + method: "post", + data: body, + }); + }, + + /** 修改模板 */ + update(id: number, body: ReportTemplateUpdateForm) { + return request>({ + url: `${TEMPLATE_PATH}/update/${id}`, + method: "put", + data: body, + }); + }, + + /** 删除模板(传 ID 数组) */ + remove(ids: number[]) { + return request({ + url: `${TEMPLATE_PATH}/delete`, + method: "delete", + data: ids, + }); + }, +}; + +// ============ 章节标注与变量绑定 ============ + +const CHAPTER_PATH = "/chapter"; +const CONFIG_PATH = "/attachment-template/config/chapter"; +const VARIABLE_PATH = "/variable/chapter"; + +const ChapterAnnotationAPI = { + /** 查询模板下全部章节规则标注 */ + listByTemplate(templateId: number) { + return request>({ + url: `${CHAPTER_PATH}/list_by_template`, + method: "get", + params: { template_id: templateId }, + }); + }, + + /** 点击标注查看变量绑定 */ + getVariableConfig(chapterId: number) { + return request>({ + url: `${VARIABLE_PATH}/${chapterId}`, + method: "get", + }); + }, + + /** 新增单个章节标注并保存变量 */ + create(body: ChapterConfigForm) { + return request>({ + url: `${CONFIG_PATH}/create`, + method: "post", + data: body, + }); + }, + + /** 更新单个章节标注并保存变量 */ + update(chapterId: number, body: ChapterConfigForm) { + return request>({ + url: `${CONFIG_PATH}/update/${chapterId}`, + method: "put", + data: body, + }); + }, + + /** 删除章节规则标注(传 ID 数组) */ + remove(ids: number[]) { + return request({ + url: `${CHAPTER_PATH}/delete`, + method: "delete", + data: ids, + }); + }, +}; + +export { FileAPI, ReportTemplateAPI, ChapterAnnotationAPI }; +export default { FileAPI, ReportTemplateAPI, ChapterAnnotationAPI }; + +// ============ 类型定义 ============ + +/** 模板状态:0 启用 / 1 停用 */ +export type ReportTemplateStatus = 0 | 1; + +/** 文件记录对象(common_file) */ +export interface FileInfo { + id: number; + uuid?: string; + storage_type?: string; + bucket_name?: string; + object_name?: string; + original_name?: string; + origin_name?: string; + file_name?: string; + file_ext?: string; + content_type?: string; + file_size?: number; + file_path?: string; + file_url?: string; + upload_type?: string; + business_type?: string; + business_id?: number; +} + +/** 模板分页查询参数 */ +export interface ReportTemplatePageQuery { + page_no?: number; + page_size?: number; + order_by?: string; + template_name?: string; + template_type?: string; + version?: string; + status?: ReportTemplateStatus; + created_time?: string[]; + updated_time?: string[]; + created_id?: number; + updated_id?: number; + tenant_id?: number; +} + +/** 模板对象(后端返回) */ +export interface ReportTemplateItem { + id: number; + uuid?: string; + template_name: string; + template_type: string; + version?: string; + file_id: number; + status: ReportTemplateStatus; + order?: number; + description?: string; + /** 文件记录对象 */ + file?: FileInfo; + /** 文件访问地址,可直接用于下载 */ + file_url?: string; + /** 原始文件名 */ + original_name?: string; + /** MinIO 对象名称 */ + object_name?: string; + /** 标注数量(接口暂未返回,后续补充) */ + annotation_count?: number; + tenant_id?: number; + created_id?: number; + created_by?: CommonType; + updated_id?: number; + updated_by?: CommonType; + created_time?: string; + updated_time?: string; + is_deleted?: boolean; +} + +/** 创建模板表单 */ +export interface ReportTemplateCreateForm { + template_name: string; + template_type?: string; + version?: string; + file_id: number; + status?: ReportTemplateStatus; + order?: number; + description?: string; +} + +/** 修改模板表单 */ +export interface ReportTemplateUpdateForm extends ReportTemplateCreateForm {} + +// ============ 章节标注与变量绑定类型 ============ + +/** 章节规则标注(列表项) */ +export interface ChapterAnnotationItem { + id: number; + template_id: number; + chapter_name: string; + chapter_order?: number; + rule_id: number; + rule_name?: string; + description?: string; +} + +/** 变量绑定中的章节信息 */ +export interface VariableChapterInfo { + chapter_name: string; + annotation_ids: number[]; + rules: { chapter_annotation_id: number; rule_id: number; rule_name: string }[]; +} + +/** 变量绑定项 */ +export interface ChapterVariableItem { + variable_name: string; + chapter_names: string[]; + chapters?: VariableChapterInfo[]; + checked: boolean; +} + +/** 点击标注查看变量绑定的返回结构 */ +export interface ChapterVariableDetail { + chapter_annotation: { + id: number; + chapter_name: string; + rule_id: number; + rule_name?: string; + }; + variables: ChapterVariableItem[]; +} + +/** 创建/更新章节标注的请求体 */ +export interface ChapterConfigForm { + template_id: number; + chapters: { + id?: number; + chapter_name: string; + chapter_order?: number; + rule_id: number; + description?: string; + }[]; + variables: { + variable_name: string; + chapter_names: string[]; + checked?: boolean; + }[]; +} diff --git a/src/views/module_energy_report/promptVars.ts b/src/views/module_energy_report/promptVars.ts new file mode 100644 index 0000000..7bef14f --- /dev/null +++ b/src/views/module_energy_report/promptVars.ts @@ -0,0 +1,26 @@ +// 提示词模板变量解析工具 +// 支持形如 ${variable_name} 或 ${{ variable_name }} 的占位符 + +/** + * 从提示词模板中提取所有变量名。 + * 匹配规则: + * - ${xxx} + * - ${{ xxx }} + * 返回变量名数组(去重,按出现顺序) + */ +export function extractPromptVariables(prompt: string): string[] { + if (!prompt) return []; + const vars: string[] = []; + const set = new Set(); + // 同时匹配 ${var} 和 ${{ var }} + const re = /\$\{\s*([^{}]+?)\s*\}/g; + let m: RegExpExecArray | null; + while ((m = re.exec(prompt)) !== null) { + const name = m[1]?.trim(); + if (name && !set.has(name)) { + set.add(name); + vars.push(name); + } + } + return vars; +} diff --git a/src/views/module_energy_report/template/detail.vue b/src/views/module_energy_report/template/detail.vue new file mode 100644 index 0000000..485a38d --- /dev/null +++ b/src/views/module_energy_report/template/detail.vue @@ -0,0 +1,698 @@ + + + + + + diff --git a/src/views/module_energy_report/template/edit.vue b/src/views/module_energy_report/template/edit.vue new file mode 100644 index 0000000..647fc8f --- /dev/null +++ b/src/views/module_energy_report/template/edit.vue @@ -0,0 +1,1001 @@ + + + + + + diff --git a/src/views/module_energy_report/template/list.vue b/src/views/module_energy_report/template/list.vue new file mode 100644 index 0000000..de9e6e2 --- /dev/null +++ b/src/views/module_energy_report/template/list.vue @@ -0,0 +1,749 @@ + + + + + + From 616e5bf891d7c2586f882732c178472907013111 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E0=B9=8F?= Date: Thu, 9 Jul 2026 17:51:58 +0800 Subject: [PATCH 2/7] =?UTF-8?q?chore:=20=E6=9B=B4=E6=8D=A2=E7=BD=91?= =?UTF-8?q?=E7=AB=99=E5=9B=BE=E6=A0=87?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- index.html | 2 +- public/logo.png | Bin 0 -> 98806 bytes src/assets/fa_imgs/nwlogo.png | Bin 0 -> 98806 bytes src/components/base/fa-logo/index.vue | 2 +- 4 files changed, 2 insertions(+), 2 deletions(-) create mode 100644 public/logo.png create mode 100644 src/assets/fa_imgs/nwlogo.png diff --git a/index.html b/index.html index 2e9163e..553369d 100644 --- a/index.html +++ b/index.html @@ -9,7 +9,7 @@ name="keywords" content="vue,element-plus,typescript,vue-element-admin,vue3-element-admin" /> - + diff --git a/src/views/module_report/report-review/components/LogDrawer.vue b/src/views/module_report/report-review/components/LogDrawer.vue new file mode 100644 index 0000000..9eff380 --- /dev/null +++ b/src/views/module_report/report-review/components/LogDrawer.vue @@ -0,0 +1,224 @@ + + + + + diff --git a/src/views/module_report/report-review/components/ReviewFormDialog.vue b/src/views/module_report/report-review/components/ReviewFormDialog.vue new file mode 100644 index 0000000..7a38e59 --- /dev/null +++ b/src/views/module_report/report-review/components/ReviewFormDialog.vue @@ -0,0 +1,340 @@ + + + + + diff --git a/src/views/module_report/report-review/components/TaskDetailDialog.vue b/src/views/module_report/report-review/components/TaskDetailDialog.vue new file mode 100644 index 0000000..a73f136 --- /dev/null +++ b/src/views/module_report/report-review/components/TaskDetailDialog.vue @@ -0,0 +1,121 @@ + + + + + diff --git a/src/views/module_report/report-review/index.vue b/src/views/module_report/report-review/index.vue new file mode 100644 index 0000000..86e1ca5 --- /dev/null +++ b/src/views/module_report/report-review/index.vue @@ -0,0 +1,668 @@ + + + + + + diff --git a/src/views/module_report/report-review/result.vue b/src/views/module_report/report-review/result.vue new file mode 100644 index 0000000..5ff5837 --- /dev/null +++ b/src/views/module_report/report-review/result.vue @@ -0,0 +1,563 @@ + + + + + diff --git a/src/views/module_energy_report/template/detail.vue b/src/views/module_report/template/detail.vue similarity index 96% rename from src/views/module_energy_report/template/detail.vue rename to src/views/module_report/template/detail.vue index 485a38d..5524645 100644 --- a/src/views/module_energy_report/template/detail.vue +++ b/src/views/module_report/template/detail.vue @@ -4,7 +4,7 @@