测试单元bug修复

main
COT001\DEV 2026-03-30 13:21:06 +08:00
parent 0948ed7c62
commit 88f358df33
4 changed files with 124 additions and 46 deletions

View File

@ -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密码

View File

@ -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='修改时间')

View File

@ -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):
"""

View File

@ -94,14 +94,16 @@
<el-table-column label="名称" align="center" prop="name" />
<el-table-column label="测试类别" align="center" prop="testCategoryName" />
<el-table-column label="产品类别" align="center" prop="eutTypeName" />
<el-table-column label="测试条件" align="center" width="100">
<el-table-column label="测试条件" align="center" width="150">
<template slot-scope="scope">
<el-tag :type="scope.row.conditionFormId ? 'success' : 'danger'">{{ scope.row.conditionFormId ? '已配置' : '未配置' }}</el-tag>
<el-tag v-if="scope.row.conditionFormId" type="success">{{ scope.row.conditionFormName || '' }}</el-tag>
<el-tag v-else type="danger">未配置</el-tag>
</template>
</el-table-column>
<el-table-column label="测试结果" align="center" width="100">
<el-table-column label="测试结果" align="center" width="150">
<template slot-scope="scope">
<el-tag :type="scope.row.resultFormId ? 'success' : 'danger'">{{ scope.row.resultFormId ? '已配置' : '未配置' }}</el-tag>
<el-tag v-if="scope.row.resultFormId" type="success">{{ scope.row.resultFormName || '' }}</el-tag>
<el-tag v-else type="danger">未配置</el-tag>
</template>
</el-table-column>
<el-table-column label="备注说明" align="center" prop="memo" />
@ -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 - methodsdata
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() {