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 @@
-
+
- {{ scope.row.conditionFormId ? '已配置' : '未配置' }}
+ {{ scope.row.conditionFormName || '已配置' }}
+ 未配置
-
+
- {{ scope.row.resultFormId ? '已配置' : '未配置' }}
+ {{ scope.row.resultFormName || '已配置' }}
+ 未配置
@@ -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() {