Browse Source

元数据标签提交

master
siyaqi 3 weeks ago
parent
commit
9da879e16d
  1. 9
      vue-fastapi-backend/module_admin/controller/metadata_config_controller.py
  2. 18
      vue-fastapi-backend/module_admin/dao/batch_label_config_dao.py
  3. 17
      vue-fastapi-backend/module_admin/entity/vo/metadata_config_vo.py
  4. 89
      vue-fastapi-backend/module_admin/service/batch_label_config_service.py
  5. 18
      vue-fastapi-frontend/src/store/modules/user.js
  6. 1
      vue-fastapi-frontend/src/views/datastd/stdcode/codeMap.vue
  7. 88
      vue-fastapi-frontend/src/views/metadataConfig/metaclas/index.vue

9
vue-fastapi-backend/module_admin/controller/metadata_config_controller.py

@ -18,6 +18,7 @@ from module_admin.entity.vo.metadata_config_vo import (
BatchDataopLabelConfigModel,
BatchDatatypeLabelConfigModel,
BatchBusiLabelConfigPageQueryModel,
BatchDataopLabelConfigModelVo,
BatchDataopLabelModelPageQueryModel,
BatchDatatypeLabelConfigPageQueryModel,
SecuBizPermiConfigQueryModel,
@ -357,19 +358,19 @@ async def get_busi_label_detail(
@metadataConfigController.get('/dataopLabel/list', response_model=PageResponseModel)
async def get_dataop_label_list(
request: Request,
query: BatchDataopLabelConfigModel,
query: BatchDataopLabelConfigModel=Depends(BatchDataopLabelModelPageQueryModel.as_query),
query_db: AsyncSession = Depends(get_db),
):
result = await BatchLabelConfigService.get_dataop_list_services(query_db, query, is_page=True)
result = await BatchLabelConfigService.get_dataop_vo_services(query_db, query, is_page=True)
logger.info('获取操作标签配置列表成功')
return ResponseUtil.success(model_content=result)
return ResponseUtil.success(data=result)
@metadataConfigController.post('/dataopLabel')
@ValidateFields(validate_model='add_dataop_label')
async def add_dataop_label(
request: Request,
model: BatchDataopLabelConfigModel,
model: BatchDataopLabelConfigModelVo,
query_db: AsyncSession = Depends(get_db),
current_user: CurrentUserModel = Depends(LoginService.get_current_user),

18
vue-fastapi-backend/module_admin/dao/batch_label_config_dao.py

@ -49,11 +49,25 @@ class BatchLabelConfigDAO:
@classmethod
async def get_dataop_list(cls, db: AsyncSession, query_object, is_page: bool = False):
query = select(BatchDataopLabelConfig).where(
BatchDataopLabelConfig.optype.like(f"%{query_object.optype}%") if query_object.optype else True,
BatchDataopLabelConfig.mdl_name == query_object.mdl_name if query_object.mdl_name else True,
BatchDataopLabelConfig.ssys_cd == query_object.ssys_cd if query_object.ssys_cd else True,
)
return await PageUtil.paginate(db, query, query_object.page_num, query_object.page_size, is_page)
@classmethod
async def get_dataop_list_all(cls, db: AsyncSession, query_object):
conditions = []
if query_object.mdl_name:
conditions.append(BatchDataopLabelConfig.mdl_name == query_object.mdl_name)
if query_object.ssys_cd:
conditions.append(BatchDataopLabelConfig.ssys_cd == query_object.ssys_cd)
stmt = select(BatchDataopLabelConfig).where(*conditions)
result = await db.execute(stmt)
return result.scalars().all()
@classmethod
async def add_dataop(cls, db: AsyncSession, obj):

17
vue-fastapi-backend/module_admin/entity/vo/metadata_config_vo.py

@ -257,6 +257,23 @@ class BatchDataopLabelConfigModel(BaseModel):
mdl_name: Optional[str] = Field(default=None, description='模块名称')
upd_by: Optional[str] = Field(default=None, description='更新人员')
upd_time: Optional[datetime] = Field(default=None, description='更新时间')
class BatchDataopLabelConfigModelVo(BaseModel):
"""
批处理数据操作标签配置 Pydantic 模型
"""
model_config = ConfigDict(alias_generator=to_camel, from_attributes=True)
config1: Optional[float] = Field(default=None, description='参数1')
config2: Optional[float] = Field(default=None, description='参数2')
config3: Optional[float] = Field(default=None, description='参数3')
config4: Optional[float] = Field(default=None, description='参数4')
config5: Optional[float] = Field(default=None, description='参数5')
config6: Optional[float] = Field(default=None, description='参数6')
config7: Optional[float] = Field(default=None, description='参数7')
ssys_cd: Optional[str] = Field(default=None, description='系统代码')
mdl_name: Optional[str] = Field(default=None, description='模块名称')
upd_by: Optional[str] = Field(default=None, description='更新人员')
upd_time: Optional[datetime] = Field(default=None, description='更新时间')
class BatchDatatypeLabelConfigModel(BaseModel):
"""
批处理字段类型标签配置 Pydantic 模型

89
vue-fastapi-backend/module_admin/service/batch_label_config_service.py

@ -1,7 +1,7 @@
from sqlalchemy.ext.asyncio import AsyncSession
from module_admin.dao.batch_label_config_dao import BatchLabelConfigDAO
from module_admin.entity.vo.common_vo import CrudResponseModel
from module_admin.entity.vo.metadata_config_vo import BatchBusiLabelConfigModel,BatchDataopLabelConfigModel,BatchDatatypeLabelConfigModel
from module_admin.entity.vo.metadata_config_vo import BatchBusiLabelConfigModel,BatchDataopLabelConfigModel,BatchDatatypeLabelConfigModel,BatchDataopLabelConfigModelVo
from exceptions.exception import ServiceException
import uuid
from utils.common_util import CamelCaseUtil
@ -70,14 +70,95 @@ class BatchLabelConfigService:
@classmethod
async def get_dataop_list_services(cls, db: AsyncSession, query_object, is_page: bool = False):
return await BatchLabelConfigDAO.get_dataop_list(db, query_object, is_page)
@classmethod
async def get_dataop_vo_services(cls, db: AsyncSession, query_object, is_page: bool = False):
result = BatchDataopLabelConfigModelVo() # 自定义返回 VO 对象
resultList = await BatchLabelConfigDAO.get_dataop_list_all(db, query_object)
if resultList:
for item in resultList:
if item.optype == "唯一类型":
result.config1 = item.config1
result.config2 = item.config2
result.config3 = item.config3
result.config4 = item.config4
result.ssys_cd = item.ssys_cd
result.mdl_name = item.mdl_name
result.upd_by = item.upd_by
result.upd_time = item.upd_time
elif item.optype == "忽略类型":
result.config5 = item.config1 # 注意:忽略类型只有 config1, config2
result.config6 = item.config2
# 其他公共字段,如果你也想覆盖可再写一次:
result.ssys_cd = item.ssys_cd
result.mdl_name = item.mdl_name
result.upd_by = item.upd_by
result.upd_time = item.upd_time
return result
@classmethod
async def add_dataop_services(cls, db: AsyncSession, page_object):
try:
page_object.onum = str(uuid.uuid4())
await BatchLabelConfigDAO.add_dataop(db, page_object)
resultList = await BatchLabelConfigDAO.get_dataop_list_all(db, page_object)
# 唯一类型对象
onopLabel = BatchDataopLabelConfigModel(
optype="唯一类型",
config1=page_object.config1,
config2=page_object.config2,
config3=page_object.config3,
config4=page_object.config4,
ssysCd=page_object.ssys_cd,
mdlName=page_object.mdl_name,
updBy=page_object.upd_by,
updTime=page_object.upd_time
)
# 忽略类型对象
inopLabel = BatchDataopLabelConfigModel(
optype="忽略类型",
config1=page_object.config5,
config2=page_object.config6,
ssysCd=page_object.ssys_cd,
mdlName=page_object.mdl_name,
updBy=page_object.upd_by,
updTime=page_object.upd_time
)
if resultList:
for item in resultList:
if item.optype == "唯一类型":
update_data = {
"config1": onopLabel.config1,
"config2": onopLabel.config2,
"config3": onopLabel.config3,
"config4": onopLabel.config4,
"ssys_cd": onopLabel.ssys_cd,
"mdl_name": onopLabel.mdl_name,
"upd_by": onopLabel.upd_by,
"upd_time": onopLabel.upd_time
}
elif item.optype == "忽略类型":
update_data = {
"config1": inopLabel.config1,
"config2": inopLabel.config2,
"ssys_cd": inopLabel.ssys_cd,
"mdl_name": inopLabel.mdl_name,
"upd_by": inopLabel.upd_by,
"upd_time": inopLabel.upd_time
}
else:
continue # 忽略未知类型
await BatchLabelConfigDAO.edit_dataop(db, item.onum, update_data)
else:
await BatchLabelConfigDAO.add_dataop(db, onopLabel)
await BatchLabelConfigDAO.add_dataop(db, inopLabel)
await db.commit()
return CrudResponseModel(is_success=True, message="新增成功")
return CrudResponseModel(is_success=True, message="新增或更新成功")
except Exception as e:
await db.rollback()
raise e

18
vue-fastapi-frontend/src/store/modules/user.js

@ -31,16 +31,7 @@ const useUserStore = defineStore(
setToken(res.token)
this.token = res.token
resolve()
datasourcetree()
.then(res => {
this.dsSysList = res.rows || [] // 确保为空时不报错
resolve(res)
})
.catch(error => {
this.dsSysList = [] // 请求失败也清空列表,避免残留
reject(error)
})
}).catch(error => {
reject(error)
})
@ -66,6 +57,15 @@ const useUserStore = defineStore(
} else {
this.roles = ['ROLE_DEFAULT']
}
datasourcetree()
.then(res => {
this.dsSysList = res.rows || [] // 确保为空时不报错
resolve(res)
})
.catch(error => {
this.dsSysList = [] // 请求失败也清空列表,避免残留
reject(error)
})
this.id = user.userId
this.name = user.userName
this.avatar = avatar

1
vue-fastapi-frontend/src/views/datastd/stdcode/codeMap.vue

@ -84,6 +84,7 @@ const props = defineProps({
},
});
const getSrcSysName = (id) => {
const match = dsSysList.find(item => item.id === id);
return match ? match.name : id;

88
vue-fastapi-frontend/src/views/metadataConfig/metaclas/index.vue

@ -64,11 +64,11 @@
stripe
>
<el-table-column type="selection" width="55" />
<el-table-column prop="datatype" label="值类型" width="200" />
<el-table-column prop="ratio" label="阈值" width="150" />
<el-table-column prop="updBy" label="更新人" width="150" />
<el-table-column prop="datatype" label="值类型"/>
<el-table-column prop="ratio" label="阈值"/>
<el-table-column prop="updBy" label="更新人"/>
<el-table-column prop="updTime" label="更新时间" width="180" />
<el-table-column prop="updTime" label="更新时间" />
</el-table>
<span> 业务类型参数调整</span>
@ -110,17 +110,46 @@
stripe
>
<el-table-column type="selection" width="55" />
<el-table-column prop="regexName" label="业务类型" width="200" />
<el-table-column prop="regexPattern" label="正则表达式" width="200" />
<el-table-column prop="ratio" label="阈值" width="150" />
<el-table-column prop="updBy" label="更新人" width="150" />
<el-table-column prop="regexName" label="业务类型"/>
<el-table-column prop="regexPattern" label="正则表达式" />
<el-table-column prop="ratio" label="阈值" />
<el-table-column prop="updBy" label="更新人" />
<el-table-column prop="updTime" label="更新时间" width="180" />
<el-table-column prop="updTime" label="更新时间" />
</el-table>
<span> 字段处理类型参数调整</span>
<el-form
ref="clasFormRef3"
:model="form3"
label-width="120px"
size="small"
>
<span>唯一类型数值类判定条件</span>
<el-form-item label="空值率小于" prop="config1">
<el-input v-model="form3.config1" autocomplete="off" />
</el-form-item>
<el-form-item label="值长度方差小于" prop="config2">
<el-input v-model.number="form3.config2" autocomplete="off" />
</el-form-item>
<el-form-item label="重复率大于" prop="config3">
<el-input v-model.number="form3.config3" autocomplete="off" />
</el-form-item>
<span>唯一类型非数值类判定条件</span>
<el-form-item label="重复率大于" prop="config4">
<el-input v-model.number="form3.config4" autocomplete="off" />
</el-form-item>
<span>忽略类型数值类判断条件</span>
<el-form-item label="空值率大于" prop="config5">
<el-input v-model.number="form3.config5" autocomplete="off" />
</el-form-item>
<span>忽略类型其他判断条件</span>
<el-form-item label="平均值长大于" prop="config6">
<el-input v-model.number="form3.config6" autocomplete="off" />
</el-form-item>
</el-form>
<el-button type="primary" @click="submitForm3">保存</el-button>
<el-dialog
:title="title"
v-model="open1"
@ -194,13 +223,14 @@ import {
deleteBusiLabel,
editBusiLabel,
addBusiLabel,
addDataopLabel,
getDataopLabelList,
getBusiLabelList
} from "@/api/metadataConfig/metadataConfig";
import useUserStore from '@/store/modules/user';
const userStore = useUserStore();
const dsSysList = userStore.dsSysList;
import useUserStore from '@/store/modules/user'; //
const userStore = useUserStore(); //
const dsSysList = userStore.dsSysList; // 访
const queryForm = reactive({
ssysCd: "*",
mdlName: "*",
@ -226,6 +256,15 @@ const form2 = reactive({
regexPattern: "",
ratio: null,
});
const form3 = reactive({
config1: null,
config2: null,
config3: null,
config4: null,
config5: null,
config6: null,
config7: null,
});
const rules1 = {
datatype: [{ required: true, message: "请输入值类型", trigger: "blur" }],
@ -270,17 +309,27 @@ async function getList2() {
loading.value = false;
}
}
async function getList3() {
const res = await getDataopLabelList(queryForm);
Object.assign(form3, res.data);
}
function resetQuery() {
queryForm.ssysCd = "*";
queryForm.mdlName = "*";
getList1();
getList2();
getList3();
}
function handleSearch() {
getList1();
getList2();
getList3();
}
// ===== =====
@ -318,7 +367,17 @@ function submitForm1() {
}
});
}
async function submitForm3() {
const submitData = { ...form3,ssysCd:queryForm.ssysCd,mdlName:queryForm.mdlName };
try {
await addDataopLabel(submitData);
ElMessage.success("编辑成功");
} catch (error) {
ElMessage.error("操作失败,请重试");
}
}
function deleteSelected1() {
if (selectedRows1.value.length === 0) {
ElMessage.warning("请至少选择一条记录删除");
@ -417,5 +476,6 @@ function handleClose2(done) {
onMounted(() => {
getList1();
getList2();
getList3();
});
</script>

Loading…
Cancel
Save