From 88f358df33ee3b093c6b813f81f131628990152b Mon Sep 17 00:00:00 2001 From: "COT001\\DEV" <871066422@qq.com> Date: Mon, 30 Mar 2026 13:21:06 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B5=8B=E8=AF=95=E5=8D=95=E5=85=83bug?= =?UTF-8?q?=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ruoyi-fastapi-backend/.env.dev | 9 +- .../system/entity/vo/test_item_vo.py | 6 +- .../system/service/test_item_service.py | 61 +++++++++++- .../src/views/system/test_item/index.vue | 94 +++++++++++-------- 4 files changed, 124 insertions(+), 46 deletions(-) diff --git a/ruoyi-fastapi-backend/.env.dev b/ruoyi-fastapi-backend/.env.dev index 2457d5e..6eb96fc 100644 --- a/ruoyi-fastapi-backend/.env.dev +++ b/ruoyi-fastapi-backend/.env.dev @@ -33,10 +33,9 @@ JWT_REDIS_EXPIRE_MINUTES = 30 # 数据库类型,可选的有'mysql'、'postgresql',默认为'mysql' DB_TYPE = 'mysql' # 数据库主机 -DB_HOST = '123.57.81.127' -#'localhost' +DB_HOST = 'localhost' # 数据库端口 -DB_PORT = 3306 +DB_PORT = 3307 # 数据库用户名 DB_USERNAME = 'cpy_admin' #'root' @@ -58,9 +57,9 @@ DB_POOL_TIMEOUT = 30 # -------- Redis配置 -------- # Redis主机 -REDIS_HOST = '127.0.0.1' +REDIS_HOST = 'localhost' # Redis端口 -REDIS_PORT = 6379 +REDIS_PORT = 6380 # Redis用户名 REDIS_USERNAME = '' # Redis密码 diff --git a/ruoyi-fastapi-backend/module_admin/system/entity/vo/test_item_vo.py b/ruoyi-fastapi-backend/module_admin/system/entity/vo/test_item_vo.py index 89ef272..f824e43 100644 --- a/ruoyi-fastapi-backend/module_admin/system/entity/vo/test_item_vo.py +++ b/ruoyi-fastapi-backend/module_admin/system/entity/vo/test_item_vo.py @@ -21,10 +21,12 @@ class Test_itemModel(BaseModel): eut_type_id: Optional[int] = Field(default=None, description='产品类别ID') eut_type_name: Optional[str] = Field(default=None, description='产品类别名称') condition_form_id: Optional[int] = Field(default=None, description='测试条件表单模板ID') + condition_form_name: Optional[str] = Field(default=None, description='测试条件表单模板名称') condition_data: Optional[str] = Field(default=None, description='测试条件填写数据JSON') result_form_id: Optional[int] = Field(default=None, description='测试结果表单模板ID') - condition_json: Optional[str] = Field(default=None, description='测试条件模板JSON(旧)') - config_json: Optional[str] = Field(default=None, description='测试结果模板JSON(旧)') + result_form_name: Optional[str] = Field(default=None, description='测试结果表单模板名称') + condition_json: Optional[str] = Field(default=None, description='测试条件模板JSON(动态获取)') + config_json: Optional[str] = Field(default=None, description='测试结果模板JSON(动态获取)') memo: Optional[str] = Field(default=None, description='备注说明') update_by: Optional[int] = Field(default=None, description='更新者') update_time: Optional[datetime] = Field(default=None, description='修改时间') diff --git a/ruoyi-fastapi-backend/module_admin/system/service/test_item_service.py b/ruoyi-fastapi-backend/module_admin/system/service/test_item_service.py index 3835313..2f77660 100644 --- a/ruoyi-fastapi-backend/module_admin/system/service/test_item_service.py +++ b/ruoyi-fastapi-backend/module_admin/system/service/test_item_service.py @@ -4,6 +4,7 @@ from config.constant import CommonConstant from exceptions.exception import ServiceException from module_admin.entity.vo.common_vo import CrudResponseModel from module_admin.system.dao.test_item_dao import Test_itemDao +from module_admin.system.dao.test_form_dao import TestFormDao from module_admin.system.entity.vo.test_item_vo import DeleteTest_itemModel, Test_itemModel, Test_itemPageQueryModel from utils.common_util import CamelCaseUtil from utils.excel_util import ExcelUtil @@ -27,9 +28,43 @@ class Test_itemService: :return: 测试单元列表信息对象 """ test_item_list_result = await Test_itemDao.get_test_item_list(query_db, query_object, is_page) - + + # 如果是分页结果,处理rows;如果是列表,直接处理 + if isinstance(test_item_list_result, dict) and 'rows' in test_item_list_result: + rows = test_item_list_result['rows'] + for item in rows: + await cls._enrich_form_data(query_db, item) + test_item_list_result['rows'] = rows + elif isinstance(test_item_list_result, list): + for item in test_item_list_result: + await cls._enrich_form_data(query_db, item) + return test_item_list_result + @classmethod + async def _enrich_form_data(cls, query_db: AsyncSession, item: dict): + """ + 根据表单模板ID动态获取最新的表单JSON数据 + + :param query_db: orm对象 + :param item: 测试单元数据字典 + """ + # 获取测试条件表单模板 + condition_form_id = item.get('conditionFormId') or item.get('condition_form_id') + if condition_form_id: + form = await TestFormDao.get_by_id(query_db, condition_form_id) + if form: + item['conditionJson'] = form.form_json + item['condition_form_name'] = form.name + + # 获取测试结果表单模板 + result_form_id = item.get('resultFormId') or item.get('result_form_id') + if result_form_id: + form = await TestFormDao.get_by_id(query_db, result_form_id) + if form: + item['configJson'] = form.form_json + item['result_form_name'] = form.name + @classmethod async def add_test_item_services(cls, query_db: AsyncSession, page_object: Test_itemModel): @@ -107,11 +142,35 @@ class Test_itemService: test_item = await Test_itemDao.get_test_item_detail_by_id(query_db, id=id) if test_item: result = Test_itemModel(**CamelCaseUtil.transform_result(test_item)) + # 动态获取最新的表单模板数据 + await cls._enrich_form_data_for_model(query_db, result) else: result = Test_itemModel(**dict()) return result + @classmethod + async def _enrich_form_data_for_model(cls, query_db: AsyncSession, model: Test_itemModel): + """ + 根据表单模板ID动态获取最新的表单JSON数据(用于Model对象) + + :param query_db: orm对象 + :param model: 测试单元Model对象 + """ + # 获取测试条件表单模板 + if model.condition_form_id: + form = await TestFormDao.get_by_id(query_db, model.condition_form_id) + if form: + model.condition_json = form.form_json + model.condition_form_name = form.name + + # 获取测试结果表单模板 + if model.result_form_id: + form = await TestFormDao.get_by_id(query_db, model.result_form_id) + if form: + model.config_json = form.form_json + model.result_form_name = form.name + @staticmethod async def export_test_item_list_services(test_item_list: List): """ diff --git a/ruoyi-fastapi-frontend/src/views/system/test_item/index.vue b/ruoyi-fastapi-frontend/src/views/system/test_item/index.vue index 35b04a5..2f7548c 100644 --- a/ruoyi-fastapi-frontend/src/views/system/test_item/index.vue +++ b/ruoyi-fastapi-frontend/src/views/system/test_item/index.vue @@ -94,14 +94,16 @@ - + - + @@ -375,16 +377,20 @@ export default { /** 查询测试单元列表 */ async getList() { this.loading = true; - await Promise.all([ - this.getTestCategoryOptions(), - this.getEutTypeOptions() - ]); + + // 确保表单选项已加载 + if (this.conditionFormOptions.length === 0 || this.resultFormOptions.length === 0) { + await this.loadFormOptions(); + } listTest_item(this.queryParams).then(response => { this.test_itemList = response.rows.map(item => ({ ...item, testCategoryName: this.testCategoryOptions.find(opt => opt.value === item.testCategoryId)?.label || '', - eutTypeName: this.typeEutOptions.find(opt => opt.value === item.eutTypeId)?.label || '' + eutTypeName: this.typeEutOptions.find(opt => opt.value === item.eutTypeId)?.label || '', + // 使用后端返回的表单名称,如果没有则从本地选项查找 + conditionFormName: item.conditionFormName || this.conditionFormOptions.find(opt => opt.id === item.conditionFormId)?.name || '', + resultFormName: item.resultFormName || this.resultFormOptions.find(opt => opt.id === item.resultFormId)?.name || '' })); this.total = response.total; this.loading = false; @@ -413,15 +419,14 @@ export default { this.resetForm("form"); }, /** 加载表单选项 */ - loadFormOptions() { + async loadFormOptions() { // 加载测试条件表单 - listTest_form_by_type('CONDITION').then(response => { - this.conditionFormOptions = response.data || []; - }); + const conditionRes = await listTest_form_by_type('CONDITION'); + this.conditionFormOptions = conditionRes.data || []; + // 加载测试结果表单 - listTest_form_by_type('RESULT').then(response => { - this.resultFormOptions = response.data || []; - }); + const resultRes = await listTest_form_by_type('RESULT'); + this.resultFormOptions = resultRes.data || []; }, /** 测试条件表单选择变化 */ handleConditionFormChange(formId) { @@ -487,6 +492,23 @@ export default { const self = this; + // 预处理方法定义 - 移到外部以便在 data 和 methods 中都能访问 + const uploadMethods = {}; + const varPattern = /v-model="(\w+)"|:file-list="(\w+)"|:action="(\w+)"|:before-upload="(\w+)"/g; + let match; + while ((match = varPattern.exec(cleanTemplate)) !== null) { + const varName = match[4]; // before-upload 方法 + if (varName) { + uploadMethods[varName] = function(file) { + const isLt10M = file.size / 1024 / 1024 < 10; + if (!isLt10M) { + this.$message.error('上传文件大小不能超过 10MB!'); + } + return isLt10M; + }; + } + } + // 创建动态表单组件 const DynamicForm = { template: ` @@ -503,29 +525,19 @@ export default { data() { // 自动扫描模板中引用的变量,补充默认值 const extraData = {}; - const uploadMethods = {}; const token = getToken(); - const varPattern = /v-model="(\w+)"|:file-list="(\w+)"|:action="(\w+)"|:before-upload="(\w+)"/g; - let match; - while ((match = varPattern.exec(cleanTemplate)) !== null) { - const varName = match[1] || match[2] || match[3] || match[4]; + const varPattern2 = /v-model="(\w+)"|:file-list="(\w+)"|:action="(\w+)"|:before-upload="(\w+)"/g; + let match2; + while ((match2 = varPattern2.exec(cleanTemplate)) !== null) { + const varName = match2[1] || match2[2] || match2[3] || match2[4]; if (varName && varName !== 'formData' && !varName.startsWith('formData.')) { - if (match[2]) { + if (match2[2]) { // file-list 变量 extraData[varName] = []; - } else if (match[3]) { + } else if (match2[3]) { // action 变量 extraData[varName] = process.env.VUE_APP_BASE_API + '/common/upload'; - } else if (match[4]) { - // before-upload 方法 - 记录到methods中,不放data - uploadMethods[varName] = function(file) { - const isLt10M = file.size / 1024 / 1024 < 10; - if (!isLt10M) { - this.$message.error('上传文件大小不能超过 10MB!'); - } - return isLt10M; - }; - } else if (match[1] && !match[1].startsWith('formData')) { + } else if (match2[1] && !match2[1].startsWith('formData')) { extraData[varName] = null; } } @@ -608,14 +620,20 @@ export default { this.title = "添加测试单元"; }, /** 修改按钮操作 */ - handleUpdate(row) { + async handleUpdate(row) { this.reset(); - // const id = row.id || this.ids; - // getTest_item(id).then(response => { - this.form = row; + const id = row.id || this.ids[0]; + + // 确保表单选项已加载 + if (this.conditionFormOptions.length === 0 || this.resultFormOptions.length === 0) { + await this.loadFormOptions(); + } + + getTest_item(id).then(response => { + this.form = response.data; this.open = true; this.title = "修改测试单元"; - // }); + }); }, /** 提交按钮 */ submitForm() {