982abf9d by lxs

Merge branch 'develop' of http://117.78.60.236:8000/csbr-daop/fe-data-asset-management into develop

2 parents 8d73b563 0cf12b6f
......@@ -73,8 +73,8 @@ VITE_API_MESSAGE = ms-swzl-message-notification-service
#新门户接口
VITE_API_NEW_PORTAL = ms-daop-zcgl-asset-dam-service
#企业信息接口
VITE_API_PERSONEL_SERVICE = ms-daop-personel-service
#人员服务
VITE_APP_PERSONAL_URL = 'ms-daop-personel-service'
# 是否在打包时生成 sourcemap
VITE_BUILD_SOURCEMAP = false
......
......@@ -94,7 +94,11 @@ VITE_APP_CAMUNDA_URL = 'ms-daop-camunda-server'
#门户接口
VITE_API_PORTALURL = https://swzl-test.zgsjzc.com/portal
#新门户接口
VITE_API_NEW_PORTAL = ms-daop-zcgl-asset-dam-service
#人员服务
VITE_APP_PERSONAL_URL = 'ms-daop-personel-service'
#数据资产接口地址
VITE_API_ASSET_BASEURL = ms-swzl-data-dam-service
......
This diff could not be displayed because it is too large.
......@@ -756,7 +756,13 @@ export const updateDbDirTable = (data) => request({
export const createTableSql = (data) => request({
url: `${import.meta.env.VITE_APP_CHECK_BASEURL}/db-dir/table/create-table-sql`,
method: 'post',
data
data,
responseType: 'blob',
})
/**删除新建表 */
export const deleteDbDirTable = (params) => request({
url: `${import.meta.env.VITE_APP_CHECK_BASEURL}/db-dir/table/del?tableGuid=${params.tableGuid}`,
method: 'get',
})
/**
......@@ -788,7 +794,7 @@ export const exportDbDirTable = (params) => request({
*
*/
export const getDbDirDetail = (params) => request({
url: `${import.meta.env.VITE_APP_CHECK_BASEURL}/db-dir/detail?tableGuid=${params.tableGuid}`,
url: `${import.meta.env.VITE_APP_CHECK_BASEURL}/db-dir/detail?tableGuid=${params.tableGuid}&execGuid=${params.execGuid}`,
method: 'get',
})
......@@ -834,3 +840,14 @@ export const getFidldEnName = (data) => request({
method: 'post',
data
})
/**
* 数据库目录-查询字段分类分级
* @param {Object}
* @path /db-dir/field/get-classify-and-grade
*/
export const getFieldClassifyAndGrade = (data) => request({
url: `${import.meta.env.VITE_APP_CHECK_BASEURL}/db-dir/field/get-classify-and-grade`,
method: 'post',
data
})
......
......@@ -69,7 +69,7 @@ export const saveMetaReportAnalysis = (params) => request({
**/
// 树形数据
export const getMetaTreeData = (params) => request({
url: `${import.meta.env.VITE_APP_PLAN_BASEURL}/meta-table/meta-tree-list`,
url: `${import.meta.env.VITE_APP_PLAN_BASEURL}/meta-table/meta-tree-list?isImportCreate=${params.isImportCreate}`,
method: 'post',
data: params
})
......
......@@ -13,7 +13,7 @@ export const getProductList = (params) => request({
/** 获取已添加的数据产品列表 */
export const getAddedProductList = (params) => request({
url: `${import.meta.env.VITE_API_ASSET_BASEURL}/product-grounding/list-select`,
url: `${import.meta.env.VITE_API_NEW_PORTAL}/product-grounding/list-select`,
method: 'post',
data: params
})
......@@ -27,35 +27,43 @@ export const getListingList = (params) => request({
/** 获取数据产品上架详情 */
export const getListingDetail = (params) => request({
url: `${import.meta.env.VITE_API_ASSET_BASEURL}/product-grounding/detail`,
url: `${import.meta.env.VITE_API_NEW_PORTAL}/product-grounding/detail`,
method: 'get',
params
})
/** 新增数据产品上架信息 */
export const listingSave = (params) => request({
url: `${import.meta.env.VITE_API_ASSET_BASEURL}/product-grounding/save`,
url: `${import.meta.env.VITE_API_NEW_PORTAL}/product-grounding/save`,
method: 'post',
data: params
});
/**数据产品上架新增门户/product-grounding/save-gateway */
export const listingSavePortal = (params) => request({
url: `${import.meta.env.VITE_API_NEW_PORTAL}/product-grounding/save-gateway`,
method: 'post',
data: params
});
/** 更新数据产品上架信息 */
export const listingUpdate = (params) => request({
url: `${import.meta.env.VITE_API_ASSET_BASEURL}/product-grounding/update`,
url: `${import.meta.env.VITE_API_NEW_PORTAL}/product-grounding/update`,
method: 'post',
data: params
});
/** 删除数据产品上架信息 */
export const listingDelete = (params) => request({
url: `${import.meta.env.VITE_API_ASSET_BASEURL}/product-grounding/delete`,
url: `${import.meta.env.VITE_API_NEW_PORTAL}/product-grounding/delete`,
method: 'delete',
data: params
});
/** 更新数据产品上架状态及上架平台 */
export const listingUpdateStatus = (params) => request({
url: `${import.meta.env.VITE_API_ASSET_BASEURL}/product-grounding/update-grounding-pick`,
url: `${import.meta.env.VITE_API_NEW_PORTAL}/product-grounding/update-grounding-pick`,
method: 'post',
data: params
});
......@@ -65,75 +73,75 @@ export const listingUpdateStatus = (params) => request({
**/
/** 获取数据需求列表。 */
export const getDemandList = (params) => request({
url: `${import.meta.env.VITE_API_ASSET_BASEURL}/demand-release/page-list`,
url: `${import.meta.env.VITE_API_NEW_PORTAL}/demand-release/page-list`,
method: 'post',
data: params
})
/** 获取数据需求发布详情 */
export const getDemandDetail = (params) => request({
url: `${import.meta.env.VITE_API_ASSET_BASEURL}/demand-release/detail`,
url: `${import.meta.env.VITE_API_NEW_PORTAL}/demand-release/detail`,
method: 'get',
params
})
/** 新增数据需求发布信息 */
export const demandSave = (params) => request({
url: `${import.meta.env.VITE_API_ASSET_BASEURL}/demand-release/save`,
url: `${import.meta.env.VITE_API_NEW_PORTAL}/demand-release/save`,
method: 'post',
data: params
});
/** 新增竞赛需求发布 */
export const competitionSave = (params) => request({
url: `${import.meta.env.VITE_API_ASSET_BASEURL}/demand-release/competition-save`,
url: `${import.meta.env.VITE_API_NEW_PORTAL}/demand-release/competition-save`,
method: 'post',
data: params
});
/** 新增要素市场需求发布 */
export const marketSave = (params) => request({
url: `${import.meta.env.VITE_API_ASSET_BASEURL}/demand-release/market-save`,
url: `${import.meta.env.VITE_API_NEW_PORTAL}/demand-release/market-save`,
method: 'post',
data: params
});
/** 更新数据需求发布信息 */
export const demandUpdate = (params) => request({
url: `${import.meta.env.VITE_API_ASSET_BASEURL}/demand-release/update`,
url: `${import.meta.env.VITE_API_NEW_PORTAL}/demand-release/update`,
method: 'post',
data: params
});
/** 更新竞赛发布信息 */
export const competitionUpdate = (params) => request({
url: `${import.meta.env.VITE_API_ASSET_BASEURL}/demand-release/competition-update`,
url: `${import.meta.env.VITE_API_NEW_PORTAL}/demand-release/competition-update`,
method: 'post',
data: params
});
/** 更新数据要素市场发布信息 */
export const marketUpdate = (params) => request({
url: `${import.meta.env.VITE_API_ASSET_BASEURL}/demand-release/market-update`,
url: `${import.meta.env.VITE_API_NEW_PORTAL}/demand-release/market-update`,
method: 'post',
data: params
});
/** 删除数据需求发布信息 */
export const demandDelete = (params) => request({
url: `${import.meta.env.VITE_API_ASSET_BASEURL}/demand-release/delete`,
url: `${import.meta.env.VITE_API_NEW_PORTAL}/demand-release/delete`,
method: 'delete',
data: params
});
/** 更新数据需求发布状态及上架平台 */
export const demandUpdateStatus = (params) => request({
url: `${import.meta.env.VITE_API_ASSET_BASEURL}/demand-release/update-listing-Status`,
url: `${import.meta.env.VITE_API_NEW_PORTAL}/demand-release/update-listing-Status`,
method: 'post',
data: params
});
/** 验证数据需求名称唯一性 */
export const checkDemandName = (params) => request({
url: `${import.meta.env.VITE_API_ASSET_BASEURL}/demand-release/verify-data-name?dataName=${params}`,
url: `${import.meta.env.VITE_API_NEW_PORTAL}/demand-release/verify-data-name?dataName=${params}`,
method: 'get'
})
......
......@@ -64,8 +64,7 @@ export const getQualityTableRule = (params) => request({
/** 删除质检表规则 */
export const deleteQualityTableRule = (params) => request({
url: `${import.meta.env.VITE_APP_QUALITY_BASEURL}/quality-model/conf/del?ruleConfGuid=${params}`,
method: 'delete',
data: params
method: 'delete'
})
/** 更新质检表规则的禁用和启用状态 */
......@@ -76,11 +75,18 @@ export const updateRuleBizState = (params) => request({
/** 获取数据库表列表 */
export const getDatabase = (params) => request({
url: `${import.meta.env.VITE_APP_API_BASEURL}/data-source/get-source-list`,
url: `${import.meta.env.VITE_APP_DATA_SOURCE_URL}/data-source/get-source-list`,
method: 'post',
data: params
})
/** 获取盘点的数据库目录 */
export const getInventoryDsDir = () => request({
url: `${import.meta.env.VITE_APP_CHECK_BASEURL}/db-dir/tree-list`,
method: 'post',
data: {}
})
/** 新建质检表,获取主题域分层的主题表树结构 */
export const getSubjectTableTree = (params) => request({
url: `${import.meta.env.VITE_APP_PLAN_BASEURL}/data-catalog-directory/directory-tree-list`,
......@@ -95,10 +101,10 @@ export const getSubjectTableByDomain = (params) => request({
data: params
})
/** 获取主题表的字段列表 */
export const getSubjectFields = (params) => request({
url: `${import.meta.env.VITE_APP_PLAN_BASEURL}/data-catalog-subject/field/list?subjectGuid=${params}`,
method: 'get',
/** 获取主题表的字段列表,目前应包括盘点目录和元数据目录的表及字段 */
export const getSubjectFields = (tableGuid, dataSource) => request({
url: `${import.meta.env.VITE_APP_QUALITY_BASEURL}/quality-model/field/list-by-subject-guid?tableGuid=${tableGuid}&dataSource=${dataSource}`,
method: 'post',
})
/** 表的逻辑条件和sql检验。 */
......@@ -138,23 +144,20 @@ export const getRuleTypeList = () => request({
// 获取规则大类的接口
export const getLargeCategoryList = () => request({
url:`${import.meta.env.VITE_APP_API_BASEURL}/data-dict/get-data-list`,
method: 'post',
data: { paramCode: "LARGE-CATEGORY" }
url: `${import.meta.env.VITE_APP_CONFIG_URL}/dict/data/get-by-dictType?dictType=${'规则大类'}`,
method: 'get',
})
// 获取规则小类的接口
export const getSmallCategoryList = () => request({
url:`${import.meta.env.VITE_APP_API_BASEURL}/data-dict/get-data-list`,
method: 'post',
data: { paramCode: "SMALL-CATEGORY" }
url: `${import.meta.env.VITE_APP_CONFIG_URL}/dict/data/get-by-dictType?dictType=${'规则小类'}`,
method: 'get',
})
// 获取规范性检验规则。
export const getCheckRulesList = () => request({
url:`${import.meta.env.VITE_APP_API_BASEURL}/data-dict/get-data-list`,
method: 'post',
data: { paramCode: "REGULAR_RULE" }
url: `${import.meta.env.VITE_APP_CONFIG_URL}/dict/data/get-by-dictType?dictType=${'正则校验'}`,
method: 'get',
})
// 根据规则guid获取规则的详情信息。
......
......@@ -23,6 +23,7 @@ export const parseAndDecodeUrl = (url:string) => {
// 返回去掉主机信息和开头斜杠后的解码部分以及最后一个斜杠后面的内容
return {
fileName: pathname,
decodedPath: pathname + search + hash,
lastPart: lastPart
};
......
......@@ -33,6 +33,13 @@ export const getSystemMenu = (params) => {
});
};
export const getCurrentUserInfo = (tenantGuid) => {
return request({
url: `${import.meta.env.VITE_APP_PERSONAL_URL}/staff/data/get-current-staff?tenantGuid=${tenantGuid}`,
method: "post",
});
};
// 获取当前用户对应的产品和菜单
export const getUserInfo = () => {
return request({
......
......@@ -99,10 +99,16 @@ const onClickOutside = (e: any) => {
};
const getDrawerConRef = (refName) => {
console.log(refName, '----------')
if (refName == 'drawerTableRef') {
const dtf = drawerTableRef.value[0] || drawerTableRef.value
return dtf?.tableRef
}
// const drawerForm = drawerFormRef.value[0] || drawerFormRef.value;
if (refName == 'drawerFormRef') {
const drawerForm = drawerFormRef.value[0] || drawerFormRef.value;
return drawerForm
}
}
defineExpose({
......
......@@ -205,6 +205,10 @@ const inputChange = (val, row) => {
/** 输入框输入触发事件 */
const inputEventChange = (val, item) => {
if (val === '' && item.clearable) {
formInline.value[item.field] = '';
return;
}
if (item.regexp) {
formInline.value[item.field] = val.replace(item.regexp, '');
if (item.min != null && (formInline.value[item.field] < item.min)) {
......@@ -337,7 +341,8 @@ const handlePictureCardPreview = (file, item) => {
const onUploadFilePreview = async (file, item) => {
let f = formInline.value[item.field].find(i => i.name == file.name);
let url = f.url;
const refSignInfo: any = await getDownFileSignByUrl(parseAndDecodeUrl(url).decodedPath);
let fileName: string = parseAndDecodeUrl(url).fileName;
const refSignInfo: any = await getDownFileSignByUrl(fileName);
if (!refSignInfo?.data) {
refSignInfo?.msg && ElMessage.error(refSignInfo?.msg);
return;
......@@ -360,7 +365,7 @@ const onUploadFilePreview = async (file, item) => {
}
const downloadTemplate = async (url) => {
const refSignInfo: any = await getDownFileSignByUrl(parseAndDecodeUrl(url).decodedPath);
const refSignInfo: any = await getDownFileSignByUrl(parseAndDecodeUrl(url).fileName);
if (!refSignInfo?.data) {
refSignInfo?.msg && ElMessage.error(refSignInfo?.msg);
return;
......@@ -379,7 +384,7 @@ const downloadTemplate = async (url) => {
const onUploadFileDownload = async (file, item) => {
let url = file.url;
const refSignInfo: any = await getDownFileSignByUrl(parseAndDecodeUrl(url).decodedPath);
const refSignInfo: any = await getDownFileSignByUrl(parseAndDecodeUrl(url).fileName);
if (!refSignInfo?.data) {
refSignInfo?.msg && ElMessage.error(refSignInfo?.msg);
return;
......@@ -1137,7 +1142,8 @@ const panelChange = (scope, row) => {
:value="child.props?.value ? opts[child.props.value] : opts.value" :disabled="opts.disabled" />
</el-select>
<el-input v-else v-model.trim="formInline[child.field]" :placeholder="child.placeholder"
:clearable="child.clearable" :maxlength="child.maxlength ?? ''" />
:clearable="child.clearable" :maxlength="child.maxlength ?? ''"
@change="(val) => inputChange(val, child)" @input="(val) => inputEventChange(val, child)" />
</el-form-item>
</template>
</div>
......
......@@ -90,6 +90,10 @@ const pageInfo = computed(() => {
return props.tableInfo.page;
});
// const expandRowKeys = computed(() => {
// return Array.isArray(props.tableInfo.expandedKey) ? props.tableInfo.expandedKey : [];;
// });
const tableRowClassName = (row, rowIndex) => {
if (rowIndex === 1) {
return "warning-row";
......@@ -236,7 +240,7 @@ onMounted(() => {
:show-header="props.tableInfo.showHeader ?? true" stripe :border="props.tableInfo.border
?? true" :height="props.tableInfo.height === null ? null : (props.tableInfo.height ?? '100%')"
:max-height="maxHeight" :row-key="rowKey" :current-row-key="currentRowKey" :row-class-name="rowClassName"
:expand-row-keys="props.tableInfo.expandRowKeys" v-loading="tableDataLoading" @row-click="rowClick"
:expand-row-keys="props.tableInfo.expandedKey" v-loading="tableDataLoading" @row-click="rowClick"
@row-dblclick="rowDblClick" @selection-change="selectionChange" @select="tableCheckboxSelectChange"
@select-all="tableCheckboxAllSelectChange" style="width: 100%; display: inline-block"
:style="{ 'min-height': props.tableInfo.minHeight ?? '200px' }" tooltip-effect="light"
......
......@@ -5,9 +5,15 @@ import useSettingsStore from '@/store/modules/settings'
import type { Menu } from '#/global'
import { getDownloadUrl, download } from "@/utils/common";
import { getImageContent } from "@/api/modules/queryService";
import {createSVG } from "@/utils/common"
import { createSVG } from "@/utils/common"
import { onBeforeMount } from "vue"
import { resolve } from 'path-browserify';
import { ElMessage } from "element-plus";
import {
parseAndDecodeUrl,
getDownFileSignByUrl,
obsDownloadRequest
} from '@/api/modules/obsService';
const props = defineProps({
item: {
type: Object as () => Menu.recordRaw,
......@@ -19,7 +25,7 @@ const props = defineProps({
},
})
const settingsStore = useSettingsStore()
const item1:any = ref()
const item1: any = ref()
const hasChildren = computed(() => {
let flag = true
if (props.item.children) {
......@@ -32,70 +38,79 @@ const hasChildren = computed(() => {
}
return flag
})
onBeforeMount( async ()=>{
onBeforeMount(async () => {
await getSvgElement(props.item)
})
const getSvgElement = async (item:any)=>{
const getSvgElement = async (item: any) => {
console.log(item)
item1.value = item
//// return new Promise( async (reslove,inject)=>{
if(item1.value.meta.icon && item1.value.meta.icon.indexOf("https")>-1) {
const res1:any = await getImageContent(item1.value.meta?.icon)
let ele:any
if (res1 && !res1.msg) {
let name = item1.value.meta?.icon;
var fileSuffix = name ? name.substring(name.lastIndexOf('.') + 1) : '';
if (fileSuffix === 'svg') { //浏览器可以支持图片和pdf预览
let blob= getDownloadUrl(res1, name, fileSuffix,false) as Blob
ele = await createSVG(blob)
item1.value.meta.isEle = false
item1.value.meta.icon = ele
// reslove({})
}
}
}
// reslove(122)
if (item1.value.meta.icon && item1.value.meta.icon.indexOf("https") > -1) {
const refSignInfo: any = await getDownFileSignByUrl(parseAndDecodeUrl(item1.value.meta.icon).fileName);
if (!refSignInfo?.data) {
refSignInfo?.msg && ElMessage.error(refSignInfo?.msg);
return;
}
console.log(refSignInfo, '------')
const res1: any = await obsDownloadRequest(refSignInfo?.data)
let ele: any
console.log(res1, '*********')
// if (res1 && !res1.msg) {
// ele = await createSVG(res1)
// item1.value.meta.isEle = false
// item1.value.meta.icon = ele
// // reslove({})
// }
}
}
// reslove(122)
// })
}
</script>
<template>
<div class="sidebar-item">
<router-link v-if="!hasChildren" v-slot="{ href, navigate, isActive, isExactActive }" custom :to="resolveRoutePath(basePath, item1.path)">
<a :href="item1.meta?.link ? item1.meta.link : href" :class="[isActive && 'router-link-active', isExactActive && 'router-link-exact-active']" :target="item.meta?.link ? '_blank' : '_self'" @click="navigate" v-preReClick>
<router-link v-if="!hasChildren" v-slot="{ href, navigate, isActive, isExactActive }" custom
:to="resolveRoutePath(basePath, item1.path)">
<a :href="item1.meta?.link ? item1.meta.link : href"
:class="[isActive && 'router-link-active', isExactActive && 'router-link-exact-active']"
:target="item.meta?.link ? '_blank' : '_self'" @click="navigate" v-preReClick>
<el-menu-item :title="item1.meta?.title ?? '[ 无标题 ]'" :index="resolveRoutePath(basePath, item1.path || '')">
<el-icon v-if="item1.meta?.icon" class="title-icon" >
<el-icon v-if="item1.meta?.icon" class="title-icon">
<!-- <img :src="item.meta.icon" v-if="item.meta.icon.indexOf('http')>-1" alt=""> -->
<!-- {{ item.meta.icon }} -->
<template v-if="item1.meta.icon.indexOf('svg')>-1">
<template v-if="item1.meta.icon.indexOf('svg') > -1">
<i v-html="item1.meta.icon" :key="item1.meta.icon" v-if="!item1.meta.isEle"></i>
</template>
<template v-else>
<svg-icon :name="item1.meta.icon"/>
<svg-icon :name="item1.meta.icon" />
</template>
</el-icon>
<span class="title">{{ item1.meta?.title ?? '[ 无标题 ]' }}</span>
</el-menu-item>
</a>
</router-link>
<el-sub-menu v-else :title="item1.meta?.title ?? '[ 无标题 ]'" :index="settingsStore.settings.app.routeBaseOn !== 'filesystem' ? resolveRoutePath(basePath, item1.path) : JSON.stringify(item1)">
<el-sub-menu v-else :title="item1.meta?.title ?? '[ 无标题 ]'"
:index="settingsStore.settings.app.routeBaseOn !== 'filesystem' ? resolveRoutePath(basePath, item1.path) : JSON.stringify(item1)">
<template #title>
<el-icon v-if="item1.meta?.icon" class="title-icon" >
<el-icon v-if="item1.meta?.icon" class="title-icon">
<!-- <img :src="item.meta.icon" v-if="item.meta.icon.indexOf('http')>-1" alt="">
<svg-icon :name="item.meta.icon" v-else /> -->
<template v-if="item1.meta.icon.indexOf('svg')>-1">
<template v-if="item1.meta.icon.indexOf('svg') > -1">
<i v-html="item1.meta.icon" :key="item1.meta.icon" v-if="!item1.meta.isEle"></i>
</template>
<template v-else>
<svg-icon :name="item1.meta.icon"/>
<svg-icon :name="item1.meta.icon" />
</template>
</el-icon>
<span class="title">{{ item.meta?.title ?? '[ 无标题 ]' }}</span>
</template>
<template v-for="route in (item1.children as Menu.recordRaw[])">
<SidebarItem v-if="route.meta?.sidebar !== false" :key="route.path" :item="route" :base-path="resolveRoutePath(basePath, item1.path)" />
<SidebarItem v-if="route.meta?.sidebar !== false" :key="route.path" :item="route"
:base-path="resolveRoutePath(basePath, item1.path)" />
</template>
</el-sub-menu>
</div>
......@@ -128,7 +143,7 @@ const getSvgElement = async (item:any)=>{
color: #B2B2B2;
}
.title-icon + .title {
.title-icon+.title {
margin-left: 10px;
}
......@@ -154,7 +169,7 @@ a {
}
.el-sub-menu__title {
> .badge {
>.badge {
&-dot {
right: 40px;
}
......@@ -171,7 +186,7 @@ a {
background-color: var(--g-sub-sidebar-menu-bg) !important;
.el-menu-item,
.el-sub-menu > .el-sub-menu__title {
.el-sub-menu>.el-sub-menu__title {
color: var(--g-sub-sidebar-menu-color);
background-color: var(--g-sub-sidebar-menu-bg) !important;
......@@ -194,7 +209,7 @@ a {
}
.el-menu-item.is-active,
.el-menu--collapse .el-sub-menu.is-active > .el-sub-menu__title,
.el-menu--collapse .el-sub-menu.is-active>.el-sub-menu__title,
.el-sub-menu .el-menu--inline .el-menu-item.is-active {
color: var(--g-sub-sidebar-menu-active-color) !important;
background-color: var(--g-sub-sidebar-menu-active-bg) !important;
......@@ -203,10 +218,12 @@ a {
.el-sub-menu__icon-arrow {
color: unset;
}
.title-icon {
color: var(--g-sub-sidebar-menu-active-color);
}
}
svg {
g {
fill: inherit !important;
......
......@@ -4,7 +4,7 @@ import router from '@/router'
import { ElMessage } from 'element-plus'
import apiUser from '@/api/modules/user'
import { getCurrentTime } from '@/utils/common'
import { getSystemMenu, getUserInfo, getTokenByCode, loginOut, refreshToken, editPasswordInterface, getCurrentUserInfo } from '@/api/modules/queryService'
import { getSystemMenu, getUserInfo, getTokenByCode, loginOut, refreshToken, editPasswordInterface, getCurrentUserInfo, getCurrentUserInfo } from '@/api/modules/queryService'
const useUserStore = defineStore(
// 唯一ID
......@@ -52,21 +52,27 @@ const useUserStore = defineStore(
account.value = res.data.logonUser
userId.value = res.data.userId
userName.value = res.data.userName
// userData.value = JSON.stringify(res.data.data);
currentTenantGuid.value = res.data.tenantInfoList && res.data.tenantInfoList.length ? res.data.tenantInfoList[0].guid : '';
localStorage.setItem('currentTenantGuid', currentTenantGuid.value);
let currentTenant = res.data.tenantInfoList?.[0];
return getCurrentUserInfo({ tenantGuid: currentTenantGuid.value }).then((result: any) => {
getCurrentUserInfo(currentTenantGuid.value).then((res: any) => {
console.log(res, 'getCurrentUserInfo');
if (res.code == '00000') {
localStorage.setItem('userData', JSON.stringify(res.data));
} else {
ElMessage.error(res.msg)
}
})
return getSystemMenu({ tenantGuid: currentTenantGuid.value }).then((info: any) => {
if (info.code == '00000') {
localStorage.setItem('userName', currentTenant?.name)
localStorage.setItem('userInfoData', JSON.stringify(info.data));
userInfoData.value = info.data;
localStorage.setItem('userData', JSON.stringify(result.data));
} else {
ElMessage.error(info.msg)
}
})
})
} else {
isLogin.value = false;
// ElMessage.error(res.msg);//授权码被重复使用,不抛出异常。
......
......@@ -7,7 +7,8 @@ import { ref } from 'vue';
import { useRouter, useRoute } from "vue-router";
import useUserStore from "@/store/modules/user";
import {
getAreaData
getAreaData,
getCurrentUserInfo
} from "@/api/modules/queryService";
import {
getParamsList,
......@@ -28,6 +29,7 @@ import importTableField from "./importTableField.vue";
import { useValidator } from '@/hooks/useValidator';
import useDataAssetStore from "@/store/modules/dataAsset";
import { handleContentWrapView, scrollLastRowToView, changeNum } from '@/utils/common';
import { ElMessage } from 'element-plus';
const { proxy } = getCurrentInstance() as any;
const { required, checkExistName } = useValidator();
......@@ -491,6 +493,15 @@ const addAssetTable = () => {
}
onBeforeMount(() => {
// const currentTenantGuid = localStorage.getItem('currentTenantGuid');
// getCurrentUserInfo(currentTenantGuid).then((res: any) => {
// console.log(res, 'getCurrentUserInfo');
// if (res.code == '00000') {
// localStorage.setItem('userData', JSON.stringify(res.data));
// } else {
// ElMessage.error(res.msg)
// }
// })
getParentAreaPromise.value = getAreaData({ parentId: null }).then((res: any) => {
if (res?.code == proxy.$passCode) {
parentAreaData.value = res.data ?? [];
......@@ -574,9 +585,8 @@ onBeforeMount(() => {
}).then((res: any) => {
if (res.code == proxy.$passCode) {
damTypes.value = res.data || [];
baseInfoFormItems.value[1].options = damTypes.value;
// let item = baseInfoFormItems.value.find(item => item.field == 'damType');
// item && (item.options = damTypes.value);
let item = baseInfoFormItems.value.find(item => item.field == 'damType');
item && (item.options = damTypes.value);
} else {
proxy.$ElMessage.error(res.msg);
}
......@@ -585,11 +595,9 @@ onBeforeMount(() => {
dictType: "数据资产目录主题名称",
}).then((res: any) => {
if (res.code == proxy.$passCode) {
subjectDomainListData.value = res.data || [];
replaceChildDictListKey(subjectDomainListData.value);
baseInfoFormItems.value[3].options = replaceChildDictListKey(subjectDomainListData.value);
// let item = baseInfoFormItems.value.find(item => item.field == 'subjectDomain');
// item && (item.options = subjectDomainListData.value);
subjectDomainListData.value = replaceChildDictListKey(res.data) || [];
let item = baseInfoFormItems.value.find(item => item.field == 'subjectDomain');
item && (item.options = subjectDomainListData.value);
} else {
proxy.$ElMessage.error(res.msg);
}
......
......@@ -25,7 +25,13 @@ const assetStore = useDataAssetStore();
const router = useRouter();
const { proxy } = getCurrentInstance() as any;
const damTypes: any = ref([]);
const dataSources: any = ref([]);
const subjectDomainListData: any = ref([])
// 登记状态 Y 已登记 N 未登记
const isRegisterOptions = ref<any>([
{ label: "已登记", value: "Y" },
{ label: "未登记", value: "N" },
])
const searchItemList = ref([
{
type: "input",
......@@ -72,23 +78,37 @@ const searchItemList = ref([
showCheckbox: true
},
{
type: "input",
type: "select",
label: "",
field: "damName",
field: "dataSources",
default: "",
placeholder: "来源",
placeholder: "数据来源",
clearable: true,
filterable: true,
options: dataSources.value,
props: {
value: 'value',
label: 'label'
}
},
{
type: "input",
type: "select",
label: "",
field: "damName",
field: "isRegister",
default: "",
placeholder: "登记状态",
clearable: true,
filterable: true,
options: isRegisterOptions.value,
props: {
value: 'value',
label: 'label'
}
},
]);
const pageInfo = ref({
...commonPageConfig,
rows: 0,
......@@ -216,14 +236,25 @@ onActivated(() => {
});
onBeforeMount(() => {
getParamsList({
getDamTypesList({
dictType: "数据来源",
}).then((res: any) => {
if (res.code == proxy.$passCode) {
dataSources.value = res.data || [];
let item = searchItemList.value.find(item => item.field == 'dataSources');
item && (item.options = dataSources.value);
} else {
proxy.$ElMessage.error(res.msg);
}
})
getDamTypesList({
dictType: "资产类型",
}).then((res: any) => {
if (res.code == proxy.$passCode) {
damTypes.value = res.data || [];
searchItemList.value[1].options = damTypes.value;
// let item = searchItemList.value.find(item => item.field == 'damType');
// item && (item.options = damTypes.value);
let item = searchItemList.value.find(item => item.field == 'damType');
item && (item.options = damTypes.value);
} else {
proxy.$ElMessage.error(res.msg);
}
......@@ -232,11 +263,9 @@ onBeforeMount(() => {
dictType: "数据资产目录主题名称",
}).then((res: any) => {
if (res.code == proxy.$passCode) {
subjectDomainListData.value = res.data || [];
replaceChildDictListKey(subjectDomainListData.value);
searchItemList.value[2].options = replaceChildDictListKey(subjectDomainListData.value);
// let item = searchItemList.value.find(item => item.field == 'subjectDomain');
// item && (item.options = subjectDomainListData.value);
subjectDomainListData.value = replaceChildDictListKey(res.data) || [];
let item = searchItemList.value.find(item => item.field == 'subjectDomain');
item && (item.options = subjectDomainListData.value);
} else {
proxy.$ElMessage.error(res.msg);
}
......@@ -286,6 +315,8 @@ const handleCreate = () => {
<div class="type-btn">
<div class="type">{{ item.subjectDomainName || item.subjectDomain }}</div>
<div class="type">{{ item.damTypeName || '--' }}</div>
<div class="type">{{ item.isRegister == 'Y' ? '已登记' : '未登记' }}</div>
<div class="type">{{ item.foundMode == '1' ? '自建' : '加工交付' }}</div>
</div>
<div class="desc">{{ item.propertyDescription }}</div>
<el-popover v-model="cardBtnVisible" placement="bottom" width="96" trigger="click"
......
......@@ -62,7 +62,7 @@ const parentAreaData: any = ref([]);
const getArea1 = (node, resolve) => {
const { level } = node
let params = {
parentId: node.value
parentGuid: node.value
}
if (!node.value) {
if (getParentAreaPromise.value) {
......@@ -111,7 +111,7 @@ const getArea1 = (node, resolve) => {
const getArea = (node, resolve) => {
const { level } = node
let params = {
parentId: node.value
parentGuid: node.value
}
if (!node.value) {
if (getParentAreaPromise.value) {
......@@ -375,6 +375,18 @@ const getRegisterCatalogListData = () => {
dataScaleItem.disabled = false;
}
}
if (draftDetailInfo.value.damGuid) {
let da = registerCatalogList.value.find(r => r.guid == draftDetailInfo.value.damGuid);
if (da && da.dataCount != null) {
dataScaleItem.disabled = true;
if (draftDetailInfo.value.dataScale == null) {
draftDetailInfo.value.dataScale = da.dataCount;
setBaseFormItemsValue(draftDetailInfo.value);
}
} else {
dataScaleItem.disabled = false;
}
}
} else {
ElMessage.error(res.msg);
}
......@@ -596,7 +608,7 @@ onBeforeMount(() => {
})
getParamsList({ dictType: '数据资产目录主题名称' }).then((res: any) => {
if (res.code == proxy.$passCode) {
subjectDomainListData.value = res.data || [];
subjectDomainListData.value = replaceChildDictListKey(res.data) || [];
let item = baseFormItems.value.find(item => item.field == 'subjectDomain');
item && (item.options = subjectDomainListData.value);
} else {
......@@ -731,6 +743,14 @@ const baseFormItems: any = ref([
clearable: true,
required: true,
}, {
label: "数据时间范围",
type: "date-picker",
field: "dateRange",
default: null,
placeholder: "开始时间~结束时间",
clearable: true,
required: true,
}, {
label: '病例总数(例)',
type: 'input',
placeholder: '请输入',
......@@ -740,6 +760,7 @@ const baseFormItems: any = ref([
default: '',
required: false
}, {
}, {
label: '数据覆盖地域',
type: 'checkbox-select',
placeholder: '全国',
......@@ -783,6 +804,7 @@ const baseFormItems: any = ref([
field: 'exchangeGuid',
default: '',
// col: 'mr8',
// col: 'mr8',
options: currTenantChanged.value,
props: {
// value: 'serviceTenantGuid',
......
......@@ -80,7 +80,7 @@ const drawerRef = ref<any>('');
const heightlightRow = ref<any>('');
const scopeRow = ref<any>(null);
const tableInfo = ref({
id: "data-class-standard-table",
id: "data-class-table",
multiple: false,
fields: [
{ label: "序号", type: "index", width: 56, align: "center" },
......@@ -110,7 +110,7 @@ const tableInfo = ref({
data: [],
rowKey: 'guid',
currentRowKey: '',
expandedKeys: [] as any,
expandedKey: [],
showPage: false,
actionInfo: {
label: "操作",
......@@ -119,6 +119,7 @@ const tableInfo = ref({
btns: [
{
label: "编辑", value: "edit", click: (scope) => {
console.log(scope);
tableInfo.value.currentRowKey = scope.row.guid;
heightlightRow.value = scope.row.guid;
scopeRow.value = scope.row;
......@@ -823,11 +824,40 @@ const handleTableRowClick = (row, id) => {
tableInfo.value.currentRowKey = row.guid;
}
const findParentsGuids = (treeList, targetGuid) => {
let result = null;
const recursiveSearch = (nodes) => {
for (let node of nodes) {
if (node.guid === targetGuid) {
result = node.parentGuids;
return;
}
if (node.children) {
recursiveSearch(node.children);
}
}
};
recursiveSearch(treeList);
return result;
};
const drawerSelectChange = (val, row, info) => {
const tree = tableRef.value.tableRef;
console.log(val, row, info, tree);
tableInfo.value.expandedKeys.push(val);
console.log(tableInfo.value.expandedKeys);
if (row.field === 'gradeGuid') {
return;
}
tableInfo.value.expandedKey = [];
const parentGuids: any = findParentsGuids(treeListData.value, val);
if (parentGuids) {
tableInfo.value.expandedKey.push(val);
parentGuids.forEach((guid) => {
tableInfo.value.expandedKey.push(guid);
});
} else {
console.log('No matching item found.');
}
}
</script>
......
......@@ -6,16 +6,12 @@
import { Warning } from "@element-plus/icons-vue";
import TableTools from '@/components/Tools/table_tools.vue';
import {
getDictionary,
saveBizRuleConfig,
getDbDirTreeList,
getDbDirTablePageList,
getDbDirFieldPageList,
getExecGuidAndName,
getClassifyTreeList,
getCgLabelPageList,
execTaskFieldList,
execTaskSheetList,
getTaskExeTreeList,
getDbFieldList,
exportCgDir,
......@@ -25,13 +21,15 @@ import {
getDbDirTableSelectList,
getDbDirFieldSelectList,
updateDataAsset,
getDictionaryAll
getDictionaryAll,
getNewDataTypeList,
deleteDbDirTable
} from '@/api/modules/dataInventory';
import { TableColumnWidth } from "@/utils/enum";
import router from "@/router";
import { download } from "@/utils/common";
import { getLabelList } from "@/api/modules/dataLabel";
import { de } from "element-plus/es/locale";
import { da, sl } from "element-plus/es/locale";
const currentPath = ref<string[]>([]);
const currentDatabasePath = ref<string[]>([]);
......@@ -106,7 +104,7 @@ const getDictionaryList = () => {
dictionaryList.value = [];
if (res.code == proxy.$passCode) {
dictionaryList.value = res.data || [];
classEditFormItems.value[4].options = res.data || [];
classEditFormItems.value[5].options = res.data || [];
} else {
proxy.$ElMessage.error(res.msg);
}
......@@ -124,6 +122,22 @@ const getExecGuid = async () => {
}
}
// 获取字段类型
const optionsD = ref<any>();
const selectedD = ref<any>();
const fieldData = ref<any>();
const getFieldTypeData = async () => {
const params = {
dictType: "字段类型"
}
const res: any = await getNewDataTypeList(params);
if (res.code == proxy.$passCode) {
fieldData.value = res.data;
optionsD.value = res.data;
} else {
proxy.$ElMessage.error(res.msg);
}
}
onMounted(async () => {
await getExecGuid();
......@@ -136,6 +150,26 @@ onMounted(async () => {
getSearchTableList();
// getLabelListData();
getGradeData(refGradeGuid.value);
getFieldTypeData();
if (route.query.databaseGuid && route.query.tableGuid) {
activeName.value = 'second';
classifyDetailGuidInfo.value = '';
selectedA.value = route.query.databaseGuid;
selectedB.value = route.query.tableGuid;
selectedC.value = null;
optionsA.value = [];
optionsB.value = [];
optionsC.value = [];
await getDataBaseTreeData();
await getDbDirTableSelectData(1, {});
await getDataBaseTableData();
await getDataBaseFieldData();
await getDbDirTableSelectData(2, { databaseGuid: selectedA.value, condition: "2" });
}
})
......@@ -215,14 +249,61 @@ const searchItemList = ref([
// 搜索
const searchCount = ref(0);
const toSearch = (val: any, clear: boolean = false) => {
console.log('toSearch', val, clear);
if (clear) {
selectedA.value = null;
selectedB.value = null;
selectedC.value = null;
levelGuidInfo.value = '';
val.levelName = '';
val.classfiyName = '';
searchItemList.value.map(item => item.default = '')
}
console.log('toSearch', val, classifyDetailGuidInfo.value);
if (activeName.value === 'first') {
treeInfo.value.expandedKey = [];
currentPath.value = [CgDirTreeList.value[0].classifyName];
treeInfo.value.expandedKey.push(CgDirTreeList.value[0].classifyDetailGuid);
treeInfo.value.currentNodeKey = CgDirTreeList.value[0].classifyDetailGuid;
getCgDirFieldPage({
execGuid: execGuidInfo.value.execGuid,
classifyDetail: CgDirTreeList.value[0].classifyDetailGuid,
});
}
if (activeName.value === 'second') {
dataBaseTreeInfo.value.expandedKey = [];
dataBaseTreeInfo.value.expandedKey.push(dataBaseTreeData.value[0].guid);
dataBaseTreeInfo.value.currentNodeKey = dataBaseTreeData.value[0].guid;
dataBaseGuid.value = dataBaseTreeData.value[0].databaseGuid;
currentDatabasePath.value = [dataBaseTreeData.value[0].name];
selectedA.value = dataBaseTreeData.value[0].databaseGuid;
getDbDirTableSelectData(2, { databaseGuid: selectedA.value, condition: "2" })
getDataBaseTableData({
pageIndex: 1,
pageSize: 50,
execGuid: execGuidInfo.value.execGuid,
tableGuid: '',
databaseGuid: selectedA.value || dataBaseGuid.value || '',
classifyDetailGuid: '',
gradeDetailGuid: '',
labelGuid: '',
});
getDataBaseFieldData({
pageIndex: 1,
pageSize: 50,
execGuid: execGuidInfo.value.execGuid,
tableGuid: '',
databaseGuid: selectedA.value || dataBaseGuid.value || '',
fieldGuid: '',
classifyDetailGuid: val.classifyName,
gradeDetailGuid: '',
labelGuid: '',
});
}
return;
}
if (activeName.value === 'first' && !clear) {
getCgDirFieldPage({
pageIndex: 1,
pageSize: 50,
......@@ -242,8 +323,8 @@ const toSearch = (val: any, clear: boolean = false) => {
execGuid: execGuidInfo.value.execGuid,
tableGuid: selectedB.value || tableGuid.value || '',
databaseGuid: selectedA.value || dataBaseGuid.value || '',
classifyDetailGuid: val.classifyName,
gradeDetailGuid: val.levelName,
classifyDetailGuid: val.classifyName || '',
gradeDetailGuid: val.levelName || '',
labelGuid: val.labelName,
});
}
......@@ -255,8 +336,8 @@ const toSearch = (val: any, clear: boolean = false) => {
tableGuid: selectedB.value || tableGuid.value || '',
databaseGuid: selectedA.value || dataBaseGuid.value || '',
fieldGuid: selectedC.value || '',
classifyDetailGuid: val.classifyName,
gradeDetailGuid: val.levelName,
classifyDetailGuid: val.classifyName || '',
gradeDetailGuid: val.levelName || '',
labelGuid: val.labelName,
});
}
......@@ -277,6 +358,10 @@ const nodeClick = async (data: any) => {
await getCgDirFieldPage({
execGuid: execGuidInfo.value.execGuid,
classifyDetail: classifyDetailGuid,
gradeDetailGuid: levelGuidInfo.value,
databaseGuid: selectedA.value,
tableGuid: selectedB.value,
fieldGuid: selectedC.value,
});
// 递归tempData找到所有祖先元素的standardName,存入currentPath中
const path = findPath(CgDirTreeList.value, guid);
......@@ -327,11 +412,8 @@ const getGradeData = async (refGradeGuid) => {
// btns-area
const checked = ref(false);
const changeCheck = (val) => {
checked.value = val;
getDataBaseTableData({
isDataAsset: val ? 'Y' : ''
});
getDataBaseTableData();
}
//下方表格配置
......@@ -354,7 +436,8 @@ const tableInfo = ref({
fields: [
{ label: "序号", type: "index", width: 56, align: "center" },
{ label: "字段名", field: "fieldName", width: 140 },
{ label: "字段中文名", field: "fieldChName", width: 180 },
{ label: "字段中文名", field: "fieldChName", width: 140 },
{ label: "字段类型", field: "fieldTypeName", width: 120 },
{
label: "分类", field: "classifyDetailNameRoutes", width: 120, getName: (scope) => {
return scope.row.classifyDetailNameRoutes.join('/');
......@@ -392,9 +475,25 @@ const tablePageChange = (info) => {
});
}
// 判断是否为单文本框
const isSingleInput = (fieldType: string) => {
// 定义单文本框的字段类型
const singleInputTypes = ['text', 'varchar', 'json', 'bit', 'char'];
return singleInputTypes.includes(fieldType) || !fieldType; // 如果fieldType为空,默认为单文本框
};
//time tinyint decimal timestamp datetime date int varchar text json bit char
//剩下判断是为单文本框
const isDoubleInput = (fieldType: string) => {
// 定义单文本框的字段类型
const doubleInputTypes = ['time', 'decimal', 'tinyint', 'timestamp', 'datetime', 'date', 'int'];
return doubleInputTypes.includes(fieldType);
};
// 选中配置的业务规则
const selectedRulesData = ref();
const selectedRulesDataList = ref([]);
const tableCheckboxSelectChange = (select, row) => {
selectedRulesDataList.value = select;
// 遍历选中的数据,存入selectedRulesData
let rulesName: any = [];
let rulesGuid: any = [];
......@@ -408,6 +507,7 @@ const tableCheckboxSelectChange = (select, row) => {
};
}
const tableCheckboxAllSelectChange = (select) => {
selectedRulesDataList.value = select;
// 遍历选中的数据,存入selectedRulesData
let rulesName: any = [];
let rulesGuid: any = [];
......@@ -422,16 +522,70 @@ const tableCheckboxAllSelectChange = (select) => {
}
// 批量配置业务规则
const batchControlRules = () => {
console.log('selectedRulesData', selectedRulesData.value);
// 清空 classEditFormInfo.value.formInfo;
classEditFormItems.value.map(item => {
if (item.field == 'orderNum') {
item.visible = true;
}
if (item.field == 'orderNum1') {
item.visible = false;
}
item.default = '';
if (item.children) {
item.children.map(item => {
item.default = '';
})
}
});
// 判断是否选中数据
if (!selectedRulesData.value || !selectedRulesData.value.guids || selectedRulesData.value.guids.length == 0) {
proxy.$ElMessage.warning('请选择数据');
return;
}
drawerInfo.value.visible = true;
// 标志变量,分别用于存储单文本框和双文本框的字段
let isSingleInputField = false;
let isDoubleInputField = false;
let isValid = true;
// 遍历 selectedRulesDataList,检查每个 fieldType 是否符合单文本框或双文本框
selectedRulesDataList.value.forEach((item: any) => {
if (isSingleInput(item.fieldType)) {
isSingleInputField = true; // 如果是单文本框,标记为单文本框
} else if (isDoubleInput(item.fieldType)) {
isDoubleInputField = true; // 如果是双文本框,标记为双文本框
} else {
// 如果不是单文本框也不是双文本框,标记为无效
isValid = false;
}
});
// 如果有无效的字段类型,则返回 false 并提示警告
if (!isValid) {
proxy.$ElMessage.warning('请选择单文本框或双文本框类型的字段');
return false;
}
// 判断字段类型是否一致
if (isSingleInputField && isDoubleInputField) {
// 如果既有单文本框也有双文本框,提示错误
proxy.$ElMessage.warning('请选择相同类型的字段');
return false;
}
console.log('isSingleInputField', isSingleInputField, 'isDoubleInputField', isDoubleInputField);
// 如果全都是单文本框或者全都是双文本框,则继续后续操作
if (isSingleInputField) {
classEditFormItems.value[4].visible = false;
classEditFormItems.value[6].visible = true;
classEditFormItems.value[7].visible = false;
} else if (isDoubleInputField) {
classEditFormItems.value[4].visible = true;
classEditFormItems.value[6].visible = false;
classEditFormItems.value[7].visible = true;
}
classEditFormItems.value[0].default = selectedRulesData.value.rulesName;
drawerInfo.value.visible = true;
}
// 数据库目录
......@@ -448,7 +602,7 @@ const dataBaseTreeInfo = ref<any>({
value: "guid",
},
nodeKey: 'guid',
expandedKey: ['0'],
expandedKey: [] as any,
currentNodeKey: '',
expandOnNodeClick: false,
data: [],
......@@ -474,7 +628,7 @@ const dataBaseTableInfo = ref({
fields: [
{ label: "序号", type: "index", width: 56, align: "center" },
{ label: "数据源", field: "databaseChName", width: 140 },
{ label: "表名称", field: "tableChName", width: 120 },
{ label: "主题表名称", field: "tableChName", width: 120 },
{ label: "数据库表", field: "tableName", width: 120 },
{
label: "新建方式", field: "foundMode", width: 140, getName: (scope) => {
......@@ -487,7 +641,7 @@ const dataBaseTableInfo = ref({
}
},
{
label: "状态", field: "state", type: 'tag', width: 120, getName: (scope) => {
label: "状态", field: "state", type: 'tag', width: 120, align: "center", getName: (scope) => {
let status = scope.row.state;
// 0 草稿中 1 已建表 2 已有默认表
return status == 0 ? '草稿中' : status == 1 ? '已建表' : '已有默认表';
......@@ -495,7 +649,7 @@ const dataBaseTableInfo = ref({
},
{ label: "修改人", field: "taskUpdateUserName", width: 100 },
{ label: "修改时间", field: "updateTime", width: TableColumnWidth.DATETIME },
{ label: "描述", field: "description", width: 120, align: 'center' },
{ label: "描述", field: "description", width: 120, align: 'left' },
{ label: "规划数据资产", field: "isDataAsset", type: 'switch', activeText: '是', inactiveText: '否', activeValue: 'Y', inactiveValue: 'N', switchWidth: 56, width: 120, align: 'center' },
],
......@@ -508,7 +662,7 @@ const dataBaseTableInfo = ref({
actionInfo: {
label: "操作",
type: "btn",
width: 200,
width: 240,
fixed: 'right',
btns: (scope) => {
return [
......@@ -528,7 +682,8 @@ const dataBaseTableInfo = ref({
databaseChName: scope.row.databaseChName,
}
});
}
},
disabled: scope.row.state == 0 ? true : false
},
{
label: "编辑表结构", value: "edit", click: (scope) => {
......@@ -547,6 +702,7 @@ const dataBaseTableInfo = ref({
database: scope.row.database,
databaseChName: scope.row.databaseChName,
databaseGuid: scope.row.databaseGuid,
state: scope.row.state,
}
});
} else {
......@@ -561,11 +717,43 @@ const dataBaseTableInfo = ref({
database: scope.row.database,
databaseChName: scope.row.databaseChName,
databaseGuid: scope.row.databaseGuid,
state: scope.row.state,
}
});
}
},
disabled: scope.row.state !== 2 ? false : true
},
{
//删除
label: "删除", value: "delete", click: (scope) => {
console.log('删除', scope);
proxy.$confirm('此操作将永久删除该表, 是否继续?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(async () => {
const res: any = await deleteDbDirTable({ tableGuid: scope.row.tableGuid });
if (res.code == proxy.$passCode) {
proxy.$ElMessage.success('删除成功');
dataBaseTableInfo.value.loading = true;
await getDataBaseTableData({
pageIndex: dataBasePage.value.curr,
pageSize: dataBasePage.value.limit
});
dataBaseTableInfo.value.loading = false;
} else {
proxy.$ElMessage.error(res.msg);
}
}).catch(() => {
proxy.$ElMessage({
type: 'info',
message: '已取消删除'
});
});
},
disabled: scope.row.state == 2 ? true : false
}
]
}
......@@ -626,10 +814,13 @@ const selectLength = ref([
{ label: '大于', value: '>', },
{ label: '小于', value: '<', },
{ label: '等于', value: '=', },
{ label: '大于等于', value: '>=', },
{ label: '小于等于', value: '<=', },
{ label: '介于', value: 'between', },
]
)
const classEditFormItems = ref([{
const classEditFormItems = ref<any>([{
label: '已选字段',
type: 'input',
maxlength: 50,
......@@ -646,7 +837,8 @@ const classEditFormItems = ref([{
placeholder: '请选择',
field: 'orderNumLength',
options: selectLength.value,
required: true,
default: '',
required: false,
clearable: true,
},
{
......@@ -656,9 +848,45 @@ const classEditFormItems = ref([{
field: 'orderNum',
maxlength: 6,
regexp: /\D/g,
required: true,
required: false,
clearable: true,
col: 'numberClass',
visible: true,
},
{
label: '',
type: 'input-group',
placeholder: '请输入',
field: 'orderNum1',
default: '',
children: [
{
type: 'input',
placeholder: '请输入',
field: 'startNumber',
default: '',
maxlength: 6,
min: 1,
regexp: /\D/g,
clearable: true,
required: false,
},
{
type: 'input',
placeholder: '请输入',
field: 'endNumber',
default: '',
maxlength: 6,
min: 1,
regexp: /\D/g,
clearable: true,
required: false,
},
],
col: 'numberClass',
clearable: true,
visible: false,
},
{
label: '精度',
......@@ -667,9 +895,11 @@ const classEditFormItems = ref([{
field: 'fieldPrecision',
maxlength: 2,
regexp: /\D/g,
required: true,
min: 1,
required: false,
clearable: true,
block: true,
visible: true,
}, {
label: '关联字典',
field: 'dictionaryGuid',
......@@ -687,59 +917,103 @@ const classEditFormItems = ref([{
},
{
label: '字段取值范围',
type: 'input-group',
type: 'input',
maxlength: 20,
placeholder: '请输入',
field: 'fieldValueRange',
default: '',
clearable: true,
block: false,
disabled: false,
visible: false,
},
{
label: '字段取值范围',
type: 'input-group',
placeholder: '请输入',
field: 'fieldValueRange',
children: [
{
type: 'input',
placeholder: '请输入',
field: 'numberStart',
field: 'startValue',
default: '',
clearable: true,
required: true,
required: false,
min: 1,
regexp: /\D/g,
},
{
type: 'input',
placeholder: '请输入',
field: 'numberEnd',
field: 'endValue',
default: '',
clearable: true,
required: true,
min: 1,
required: false,
regexp: /\D/g,
},
],
col: 'col2',
clearable: true,
visible: true,
},
// 替换为下拉
{
label: '数据是否唯一',
type: "radio-group",
type: "select",
field: "isUnique",
disabled: false,
default: 'N',
default: '',
options: [
{ label: "是", value: "Y", disabled: false },
{ label: "否", value: "N", disabled: false },
],
clearable: true,
},
// {
// label: '数据是否唯一',
// type: "radio-group",
// field: "isUnique",
// disabled: false,
// default: 'N',
// options: [
// { label: "是", value: "Y", disabled: false },
// { label: "否", value: "N", disabled: false },
// ],
// },
{
label: '是否必填',
type: "radio-group",
field: "isNotNull",
type: "select",
field: "notNull",
disabled: false,
default: 'N',
default: '',
options: [
{ label: "是", value: "Y", disabled: false },
{ label: "否", value: "N", disabled: false },
],
clearable: true,
}
// ,
// {
// label: '是否必填',
// type: "radio-group",
// field: "isNotNull",
// disabled: false,
// default: 'N',
// options: [
// { label: "是", value: "Y", disabled: false },
// { label: "否", value: "N", disabled: false },
// ],
// }
]);
const classEditFormRules = ref({
classifyName: [{ required: true, message: '请填写分类名称', trigger: 'blur' }],
orderNumLength: [{ required: true, message: '请选择长度', trigger: 'blur' }],
orderNum: [{ required: true, message: '请填写长度', trigger: 'blur' }],
fieldPrecision: [{ required: true, message: '请填写精度', trigger: 'blur' }],
// classifyName: [{ required: true, message: '请填写分类名称', trigger: 'blur' }],
// orderNumLength: [{ required: true, message: '请选择长度', trigger: 'blur' }],
// orderNum: [{ required: true, message: '请填写长度', trigger: 'blur' }],
// fieldPrecision: [{ required: true, message: '请填写精度', trigger: 'blur' }],
});
/** 新增分类的form */
const classEditFormInfo = ref({
......@@ -777,29 +1051,77 @@ const drawerBtnClick = async (btn, info) => {
drawerInfo.value.visible = false;
} else {
btn.loading = true;
const { orderNumLength, orderNum, numberStart, numberEnd, fieldPrecision, dictionaryGuid, isUnique, isNotNull } = info;
let fieldLengthCondition = orderNumLength + '#' + orderNum;
let fieldValueRange: any = [];
if (numberStart && numberEnd) {
if (numberEnd < numberStart) {
proxy.$ElMessage.error('字段取值范围结束值不能小于开始值');
console.log('drawerBtnClick', info);
const { orderNumLength, orderNum, startNumber, endNumber, fieldValueRange, startValue, endValue, fieldPrecision, dictionaryGuid, isUnique, notNull } = info;
// 判断长度orderNumLength,orderNum 要么都有值,要么都没有值,不能只有一个有值,一个没有值精确提醒
let fieldLengthCondition: any = '';
if ((orderNumLength === 'between' && !startNumber) || (orderNumLength === 'between' && !endNumber)) {
proxy.$ElMessage.error('请选择长度边界范围');
btn.loading = false;
return;
} else {
fieldLengthCondition = orderNumLength + '#' + startNumber + '#' + endNumber;
}
if (orderNumLength !== 'between') {
if (orderNumLength && !orderNum) {
proxy.$ElMessage.error('请填写长度');
btn.loading = false;
return;
}
if (!orderNumLength && orderNum) {
proxy.$ElMessage.error('请选择长度边界范围');
btn.loading = false;
return;
}
fieldValueRange = numberStart + '#' + numberEnd;
if (!orderNumLength && !orderNum) {
fieldLengthCondition = '';
}
if (orderNumLength && orderNum) {
fieldLengthCondition = orderNumLength + '#' + orderNum;
}
}
const params: any = [];
selectedRulesData.value.guids.forEach((item: any) => {
params.push({
let param;
// 根据是否有 fieldValueRange 来决定如何构建参数对象
if (fieldValueRange) {
param = {
fieldPrecision,
dictionaryGuid,
isUnique,
isNotNull,
notNull,
fieldLengthCondition,
fieldValueRange,
fieldGuid: item,
execGuid: execGuidInfo.value.execGuid
})
};
} else {
param = {
fieldPrecision,
dictionaryGuid,
isUnique,
notNull,
fieldLengthCondition,
fieldGuid: item,
execGuid: execGuidInfo.value.execGuid,
startValue,
endValue
};
}
// 检查参数的有效性,如果无效则清空 params 数组
if (isValidParam(param)) {
params.push(param);
} else {
params.length = 0; // 清空数组
}
});
try {
const res: any = await saveBizRuleConfig(params);
if (res.code == proxy.$passCode) {
btn.loading = false;
......@@ -809,7 +1131,6 @@ const drawerBtnClick = async (btn, info) => {
execGuid: execGuidInfo.value.execGuid,
classifyDetail: classifyDetailGuidInfo.value,
gradeDetailGuid: levelGuidInfo.value,
labelGuid: labelGuidInfo.value,
databaseGuid: selectedA.value,
tableGuid: selectedB.value,
fieldGuid: selectedC.value,
......@@ -818,42 +1139,111 @@ const drawerBtnClick = async (btn, info) => {
btn.loading = false;
proxy.$ElMessage.error(res.msg);
}
} catch (error) {
btn.loading = false;
}
}
}
const handleTreeItemMenuClick = (data: any, type) => {
console.log('handleTreeItemMenuClick', data, type);
// 辅助函数:检查对象的除 `fieldGuid` 和 `execGuid` 外的字段是否为空
const isValidParam = (param) => {
const { fieldGuid, execGuid, ...rest } = param;
return Object.values(rest).some(value => value !== null && value !== undefined && value !== '');
}
const drawerRef = ref<any>();
const drawerSelectChange = (val, row, info) => {
const tempInfo = drawerRef.value.getDrawerConRef('drawerFormRef').formInline;
if (val === 'between') {
classEditFormItems.value.forEach(item => {
if (item.field === 'orderNum') {
item.visible = false;
}
if (item.field === 'orderNum1') {
item.visible = true;
}
if (item.field === 'orderNumLength') {
item.default = val;
}
});
}
if (val === '>' || val === '<' || val === '=' || val === '>=' || val === '<=') {
{
classEditFormItems.value.forEach(item => {
if (item.field === 'orderNum') {
item.visible = true;
}
if (item.field === 'orderNum1') {
item.visible = false;
}
if (item.field === 'orderNumLength') {
item.default = val;
}
});
}
}
classEditFormItems.value.forEach(item => {
if (item.field === 'orderNum') {
item.default = tempInfo.orderNum;
}
if (item.field === 'dictionaryGuid') {
item.default = tempInfo.dictionaryGuid;
}
if (item.field === 'isNotNull') {
item.default = tempInfo.isNotNull;
}
if (item.field === 'isUnique') {
item.default = tempInfo.isUnique;
}
if (item.field === 'fieldValueRange' && item.children) {
item.children.forEach(item => {
if (item.field === 'startValue') {
item.default = tempInfo.startValue;
}
if (item.field === 'endValue') {
item.default = tempInfo.endValue;
}
});
}
if (item.field === 'fieldValueRange' && !item.children) {
item.default = tempInfo.fieldValueRange;
}
});
}
// 记录切换时的信息记录
// tab切换
const activeName = ref('first');
const handleClick = (tab: any) => {
const handleClick = async (tab: any) => {
// 切换时选中的配置业务规则清空
selectedRulesData.value = {};
console.log(tab.props.name);
activeName.value = tab.props.name;
if (tab.props.name === 'second') {
classifyDetailGuidInfo.value = '';
if (activeTab.value === 'table') {
searchItemList.value[0].visible = false;
searchItemList.value[1].visible = false;
searchItemList.value[0].default = '';
searchItemList.value[1].default = '';
}
// if (activeTab.value === 'table') {
// searchItemList.value[0].visible = false;
// searchItemList.value[1].visible = false;
// searchItemList.value[0].default = '';
// searchItemList.value[1].default = '';
// }
selectedA.value = null;
selectedB.value = null;
selectedC.value = null;
optionsA.value = [];
optionsB.value = [];
optionsC.value = [];
getDataBaseTreeData();
getDataBaseTableData();
getDataBaseFieldData();
getDbDirTableSelectData(1, {});
await getDataBaseTreeData();
await getDbDirTableSelectData(1, {});
await getDataBaseTableData();
await getDataBaseFieldData();
await getDbDirTableSelectData(2, { databaseGuid: selectedA.value, condition: "2" });
// if (activeTab.value === 'word') {
// await getDbDirTableSelectData(1, {});
// await getDbDirTableSelectData(2, { databaseGuid: selectedA.value, condition: "2" });
// }
} else {
searchItemList.value[0].visible = true;
searchItemList.value[1].visible = true;
......@@ -879,14 +1269,47 @@ const getDataBaseTreeData = async () => {
const dataArray = res.data;
// 遍历并添加 GUIDs
dataArray.forEach(addGuids);
console.log('dataArray', dataArray, localStorage.getItem("onActiveInfo"));
// 更新到绑定的响应式数据
dataBaseTreeData.value = dataArray;
dataBaseTreeInfo.value.data = dataArray;
if (localStorage.getItem("shouldReloadData")) {
dataBaseTreeInfo.value.expandedKey = [];
const info = JSON.parse(localStorage.getItem("onActiveInfo") || '{}');
dataBaseTreeInfo.value.expandedKey.push(dataArray[info.dbindex].guid);
dataBaseTreeInfo.value.currentNodeKey = dataArray[info.dbindex].guid;
dataBaseGuid.value = dataArray[info?.dbindex].databaseGuid;
currentDatabasePath.value = info?.path;
if (dataArray[info?.dbindex].dicType === 1) {
isShowCreateBtn.value = true;
}
if (dataArray[info?.dbindex].dicType === 2) {
isShowCreateBtn.value = false;
}
dataBaseTreeInfo.value.loading = false;
return;
}
if (route.query.databaseGuid && route.query.tableGuid) {
dataBaseTreeInfo.value.expandedKey = [];
dataBaseTreeInfo.value.expandedKey.push(route.query.tableGuid);
dataBaseTreeInfo.value.currentNodeKey = route.query.tableGuid;
dataBaseGuid.value = route.query.databaseGuid;
currentDatabasePath.value = findDDatabasePath(dataBaseTreeData.value, route.query.tableGuid);
const item = dataBaseTreeData.value.find(item => item.databaseGuid === route.query.databaseGuid);
if (item === 1) {
isShowCreateBtn.value = true;
}
if (item === 2) {
isShowCreateBtn.value = false;
}
dataBaseTreeInfo.value.loading = false;
return;
}
dataBaseTreeInfo.value.expandedKey.push(dataArray[0].guid);
dataBaseTreeInfo.value.currentNodeKey = dataArray[0].guid;
dataBaseGuid.value = dataArray[0].databaseGuid;
currentDatabasePath.value = [dataArray[0].name];
console.log('dataArray', dataArray);
selectedA.value = dataArray[0].databaseGuid;
if (dataArray[0].dicType === 1) {
isShowCreateBtn.value = true;
}
......@@ -921,10 +1344,10 @@ const getDataBaseTableData = async (params = {}) => {
const dataBaseParams = {
pageIndex: dataBasePage.value.curr,
pageSize: dataBasePage.value.limit,
isDataAsset: '',
isDataAsset: checked.value ? 'Y' : '',
execGuid: execGuidInfo.value.execGuid,
tableGuid: tableGuid.value,
databaseGuid: dataBaseGuid.value,
tableGuid: tableGuid.value || selectedB.value || '',
databaseGuid: dataBaseGuid.value || selectedA.value || '',
fieldGuid: "",
labelGuid: "",
classifyDetailGuid: "",
......@@ -973,8 +1396,8 @@ const getDataBaseFieldData = async (params = {}) => {
pageIndex: dataFieldPage.value.curr,
pageSize: dataFieldPage.value.limit,
execGuid: execGuidInfo.value.execGuid,
tableGuid: tableGuid.value || '',
databaseGuid: dataBaseGuid.value || '',
tableGuid: tableGuid.value || selectedB.value || '',
databaseGuid: dataBaseGuid.value || selectedA.value || '',
fieldGuid: "",
labelGuid: "",
classifyDetailGuid: "",
......@@ -1019,7 +1442,12 @@ const tableFieldsDataInfo = ref({
{ label: "表中文名", field: "tableChName", width: 140, },
{ label: "数据库名称", field: "database", width: 120 },
{ label: "数据库中文名", field: "databaseChName", width: TableColumnWidth.DATETIME },
{ label: "分类", field: "classifyDetailName", width: 120, align: 'left' },
{
label: "分类", field: "classifyDetailNameRoutes", width: 120, align: 'left', getName: (scope) => {
// 判断 Array.isArray(scope.row.classifyDetailNameRoutes)
return Array.isArray(scope.row.classifyDetailNameRoutes) ? scope.row.classifyDetailNameRoutes.join('/') : '--';
}
},
{ label: "分级", field: "gradeDetailName", width: 120, align: 'left' },
// { label: "标签", field: "label", width: 120, align: 'center' },
],
......@@ -1041,18 +1469,27 @@ const showTableOrDatabase = ref(true);
const isShowCreateBtn = ref(true);
// 定义tableGuid
const tableGuid = ref('');
const dataBaseGuid = ref('');
const dataBaseGuid = ref<any>('');
const dataBaseInfo = ref<any>({});
// 记录onActive的信息
const onActiveInfo = ref<any>({});
const dataBasenodeClick = (data: any) => {
isShowCreateBtn.value = false;
console.log('dataBasenodeClick', data, dataBaseTreeData.value);
// 找到data.databaseGuid 在dataBaseTreeData.value 中的下标索引,普通数组遍历就行
const dbindex = dataBaseTreeData.value.findIndex((item) => {
return item.guid === data.databaseGuid;
});
const path = findDDatabasePath(dataBaseTreeData.value, data.guid);
console.log('path', path);
onActiveInfo.value = {
dbindex,
path
}
localStorage.setItem('onActiveInfo', JSON.stringify(onActiveInfo.value));
if (path) {
currentDatabasePath.value = path;
} else {
console.error('未找到路径');
}
if (data.databaseGuid) {
dataBaseInfo.value = data;
......@@ -1065,33 +1502,46 @@ const dataBasenodeClick = (data: any) => {
}
tableGuid.value = '';
getDataBaseFieldData({
databaseGuid: data.databaseGuid
databaseGuid: data.databaseGuid,
gradeDetailGuid: levelGuidInfo.value,
tableGuid: tableGuid.value || selectedB.value || '',
fieldGuid: selectedC.value || '',
});
getDataBaseTableData({
databaseGuid: data.databaseGuid
gradeDetailGuid: levelGuidInfo.value,
databaseGuid: data.databaseGuid || selectedA.value || '',
tableGuid: tableGuid.value || selectedB.value || '',
});
}
if (data.tableGuid) {
tableGuid.value = data.tableGuid;
dataBaseGuid.value = '';
getDataBaseFieldData({
tableGuid: data.tableGuid
tableGuid: data.tableGuid,
gradeDetailGuid: levelGuidInfo.value || '',
databaseGuid: data.databaseGuid || selectedA.value || '',
fieldGuid: data.fieldGuid || selectedC.value || '',
});
getDataBaseTableData({
gradeDetailGuid: levelGuidInfo.value || '',
databaseGuid: data.databaseGuid || selectedA.value || '',
tableGuid: tableGuid.value || selectedB.value || '',
});
}
if (data.databaseGuid || data.cgDirName) {
showTableOrDatabase.value = true;
return;
}
if (data.tableGuid) {
showTableOrDatabase.value = false;
return;
}
// if (data.databaseGuid || data.cgDirName) {
// showTableOrDatabase.value = true;
// return;
// }
// if (data.tableGuid) {
// showTableOrDatabase.value = false;
// return;
// }
}
const findDDatabasePath = (data: any[], targetGuid: string, path: string[] = []) => {
const findDDatabasePath = (data: any[], targetGuid: any, path: string[] = []) => {
for (const item of data) {
path.push(item.name); // 添加当前节点名称
if (item.guid === targetGuid) {
......@@ -1106,8 +1556,38 @@ const findDDatabasePath = (data: any[], targetGuid: string, path: string[] = [])
return null; // 未找到目标节点
};
const nodeSelectChange = (data: any) => {
console.log('nodeSelectChange', data);
const nodeSelectChange = (node, checked, checkedChildren) => {
console.log('nodeSelectChange', node, node.parent.data, checkedChildren);
if (node.parent.data.databaseGuid) {
selectedA.value = node.parent.data.databaseGuid;
selectedB.value = '';
if (activeName.value == 'second') {
if (activeTab.value === 'word') {
getDbDirFieldSelectData(2, { databaseGuid: selectedA.value, condition: "2" });
} else {
getDbDirTableSelectData(2, { databaseGuid: selectedA.value, condition: "2" }); // 数据库搜索
}
}
// 选中的是数据库
}
if (node.data.databaseGuid) {
// 选中的是字段
selectedA.value = node.data.databaseGuid;
selectedB.value = '';
if (activeName.value == 'second') {
if (activeTab.value === 'word') {
getDbDirFieldSelectData(2, { databaseGuid: selectedA.value, condition: "2" });
} else {
getDbDirTableSelectData(2, { databaseGuid: selectedA.value, condition: "2" }); // 数据库搜索
}
}
}
if (node.data.tableGuid) {
// 选中的是表
selectedB.value = node.data.tableGuid || '';
getDbDirFieldSelectData(3, { tableGuid: selectedB.value, databaseGuid: selectedA.value, condition: "3" });
}
}
const handleSubjectTableCommand = (command: string) => {
......@@ -1161,29 +1641,17 @@ const addIsShowDatabaseTip = () => {
const activeTab = ref('table');
const isShowWordSearch = ref(true);
const setActiveTab = (tab) => {
console.log('setActiveTab', tab);
activeTab.value = tab;
if (tab === 'word' && activeName.value === 'second') {
searchItemList.value[0].visible = true;
searchItemList.value[1].visible = true;
searchItemList.value[0].default = '';
searchItemList.value[1].default = '';
isShowWordSearch.value = false;
optionsA.value = [];
optionsB.value = [];
optionsC.value = [];
getDbDirFieldSelectData(1);
} else {
searchItemList.value[0].visible = false;
searchItemList.value[1].visible = false;
searchItemList.value[0].default = '';
searchItemList.value[1].default = '';
isShowWordSearch.value = true;
optionsA.value = [];
optionsB.value = [];
optionsC.value = [];
getDbDirTableSelectData(1, {});
}
// if (tab === 'word' && activeName.value === 'second') {
// searchItemList.value[0].visible = true;
// searchItemList.value[1].visible = true;
// searchItemList.value[0].default = '';
// searchItemList.value[1].default = '';
// isShowWordSearch.value = false;
// optionsA.value = [];
// optionsB.value = [];
// optionsC.value = [];
// }
};
// 数据库字段搜索联动 getDbDirFieldSelectList
......@@ -1263,14 +1731,7 @@ const getDbDirTableSelectData = async (type, params = {}) => {
}));
}
if (type == 2) {
if (activeTab.value === 'word') {
console.log('进来了吗', res.data);
optionsC.value = res.data.map((item) => ({
dbGuid: item.fieldName, // 字段标识
name: item.fieldName, // 字段名称
}));
return;
}
optionsB.value = res.data.map((item) => ({
dbGuid: item.tableGuid, // 表标识
name: item.tableChName, // 表名称
......@@ -1289,6 +1750,7 @@ const getDbDirTableSelectData = async (type, params = {}) => {
};
const selectedA = ref<any>(null);
const selectedB = ref<any>(null);
const selectedC = ref<any>(null);
......@@ -1297,6 +1759,7 @@ const optionsA = ref<any>([]);
const optionsB = ref<any>([]);
const optionsC = ref<any>([]);
const dataBaseRef = ref<any>();
// 第一个下拉框值改变时
const onAChange = async () => {
selectedB.value = null;
......@@ -1314,7 +1777,32 @@ const onAChange = async () => {
await getDbDirTableSelectData(2, { databaseGuid: selectedA.value, condition: "2" }); // 数据库搜索
}
}
// nextTick(() => {
// const nodeElement = dataBaseRef.value.treeRef.$el.querySelector(`[data-key="${String(selectedA.value)}"]`);
// if (nodeElement) {
// nodeElement.offsetTop - dataBaseRef.value.treeRef.$el.clientHeight > 0 && (dataBaseRef.value.treeRef.$el.scrollTop = nodeElement.offsetTop - dataBaseRef.value.treeRef.$el.clientHeight + 32);
// }
// });
nextTick(() => {
setTimeout(() => {
const nodeElement = dataBaseRef.value.treeRef.$el.querySelector(`[data-key="${String(selectedA.value)}"]`);
if (nodeElement) {
const rect = nodeElement.getBoundingClientRect();
const treeRect = dataBaseRef.value.treeRef.$el.getBoundingClientRect();
const offset = rect.top - treeRect.top;
console.log('offset', rect, treeRect);
// 这里的 32 是偏移量,可以调整为你需要的距离
const targetScrollTop = dataBaseRef.value.treeRef.$el.scrollTop + offset
dataBaseRef.value.treeRef.$el.scrollTo({
top: targetScrollTop,
behavior: 'smooth'
});
}
}, 200);
});
console.log('selectedA',);
};
......@@ -1328,10 +1816,35 @@ const onBChange = async () => {
await getSearchTableList(3, selectedB.value); // 分类分级搜索
}
if (activeName.value == 'second') {
await getDbDirFieldSelectData(3, { tableGuid: selectedB.value, databaseGuid: selectedA.value, condition: "3" });
if (activeTab.value === 'word') {
await getDbDirFieldSelectData(3, { tableGuid: selectedB.value, databaseGuid: selectedA.value, condition: "3" });
}
}
// nextTick(() => {
// const nodeElement = dataBaseRef.value.treeRef.$el.querySelector(`[data-key="${String(selectedB.value)}"]`);
// if (nodeElement) {
// nodeElement.offsetTop - dataBaseRef.value.treeRef.$el.clientHeight > 0 && (dataBaseRef.value.treeRef.$el.scrollTop = nodeElement.offsetTop - dataBaseRef.value.treeRef.$el.clientHeight + 32);
// }
// });
nextTick(() => {
setTimeout(() => {
const nodeElement = dataBaseRef.value.treeRef.$el.querySelector(`[data-key="${String(selectedB.value)}"]`);
if (nodeElement) {
const rect = nodeElement.getBoundingClientRect();
const treeRect = dataBaseRef.value.treeRef.$el.getBoundingClientRect();
const offset = rect.top - treeRect.top;
console.log('offset', rect, treeRect);
// 这里的 32 是偏移量,可以调整为你需要的距离
const targetScrollTop = dataBaseRef.value.treeRef.$el.scrollTop + offset
dataBaseRef.value.treeRef.$el.scrollTo({
top: targetScrollTop,
behavior: 'smooth'
});
}
}, 200);
});
};
// 导出
......@@ -1353,46 +1866,95 @@ const exportDB = async () => {
}
// 标签guid
const labelGuidInfo = ref('');
// 分级guid信息
const levelGuidInfo = ref('');
// 标签选择
const selectChange = (val, row, info) => {
console.log('selectChange', val, row, info);
if (info.classifyName == undefined) {
classifyDetailGuidInfo.value = '';
}
if (info) {
labelGuidInfo.value = info.labelName;
levelGuidInfo.value = info.levelName;
}
}
// 这里应该是onActivated 钩子,路由从configure-路由从configure-rules跳转过来要重新请求数据、
onActivated(async () => {
if (route.query.reload === 'true') {
await getExecGuid();
activeName.value = 'second';
getDataBaseTreeData();
getDataBaseTableData({
if (localStorage.getItem('shouldReloadData') === 'true') {
await getDataBaseTableData({
exexGuid: execGuidInfo.value.execGuid
});
getDataBaseFieldData(
{
exexGuid: execGuidInfo.value.execGuid
}
);
getDbDirTableSelectData(1, {});
localStorage.removeItem('shouldReloadData');
}
});
const gradeTreeRef = ref<any>();
const treeSelectNodeClick = (node, item) => {
classifyDetailGuidInfo.value = node.classifyDetailGuid;
treeInfo.value.expandedKey = [];
treeInfo.value.expandedKey.push(node.classifyDetailGuid);
treeInfo.value.currentNodeKey = node.classifyDetailGuid;
const path = findPath(CgDirTreeList.value, node.guid);
if (path) {
currentPath.value = path;
console.log('找到路径:', path);
} else {
console.error('未找到路径');
}
if (activeName.value === 'second' && activeTab.value === 'word') {
}
nextTick(() => {
setTimeout(() => {
const nodeElement = gradeTreeRef.value.treeRef.$el.querySelector(`[data-key="${String(node.classifyDetailGuid)}"]`);
if (nodeElement) {
const rect = nodeElement.getBoundingClientRect();
const treeRect = gradeTreeRef.value.treeRef.$el.getBoundingClientRect();
const offset = rect.top - treeRect.top;
console.log('offset', rect, treeRect);
// 这里的 32 是偏移量,可以调整为你需要的距离
const targetScrollTop = gradeTreeRef.value.treeRef.$el.scrollTop + offset
gradeTreeRef.value.treeRef.$el.scrollTo({
top: targetScrollTop,
behavior: 'smooth'
});
}
}, 200);
});
}
watchEffect(() => {
console.log(`count 的值是: ${selectedA.value}`);
if (activeName.value === 'second') {
dataBaseTreeInfo.value.expandedKey = [];
dataBaseTreeInfo.value.expandedKey.push(selectedA.value);
dataBaseTreeInfo.value.currentNodeKey = selectedA.value;
if (selectedB.value) {
dataBaseTreeInfo.value.currentNodeKey = selectedB.value;
}
}
if (activeName.value === 'second' && activeTab.value === 'table') {
searchItemList.value[0].visible = false;
searchItemList.value[1].visible = false;
searchItemList.value[0].default = '';
searchItemList.value[1].default = '';
}
if (activeName.value === 'first') {
searchItemList.value[0].visible = true;
searchItemList.value[1].visible = true;
searchItemList.value[0].default = '';
searchItemList.value[1].default = '';
}
if (activeName.value === 'second' && activeTab.value === 'word') {
searchItemList.value[0].visible = true;
searchItemList.value[1].visible = true;
searchItemList.value[0].default = '';
searchItemList.value[1].default = '';
}
});
</script>
<template>
......@@ -1410,6 +1972,10 @@ const treeSelectNodeClick = (node, item) => {
:clearable="true" v-if="!(activeTab === 'table' && activeName === 'second')">
<el-option v-for="item in optionsC" :key="item.dbGuid" :label="item.name" :value="item.dbGuid" />
</el-select>
<!-- <el-select v-model="selectedD" placeholder="选择字段类型" style="width: 140px;margin-right: 8px" :clearable="true"
v-if="activeName === 'first'">
<el-option v-for="item in optionsD" :key="item.value" :label="item.label" :value="item.value" />
</el-select> -->
<TableTools :searchItems="searchItemList" :init="false" :searchId="'files-standard-search'" @search="toSearch"
@selectChange="selectChange" @treeSelectNodeClick="treeSelectNodeClick" />
</div>
......@@ -1417,11 +1983,12 @@ const treeSelectNodeClick = (node, item) => {
<div class="aside_wrap">
<el-tabs v-model="activeName" class="v-tabs" @tab-click="handleClick">
<el-tab-pane label="分类分级目录" name="first">
<Tree :treeInfo="treeInfo" @nodeClick="nodeClick" />
<Tree :treeInfo="treeInfo" @nodeClick="nodeClick" ref="gradeTreeRef" />
<!-- <Tree ref="treeInfoRef" :treeInfo="treeInfo" @nodeClick="nodeClick" /> -->
</el-tab-pane>
<el-tab-pane label="数据库目录" name="second">
<Tree :treeInfo="dataBaseTreeInfo" @nodeClick="dataBasenodeClick" @nodeSelectChange='nodeSelectChange' />
<Tree :treeInfo="dataBaseTreeInfo" @nodeClick="dataBasenodeClick" @nodeSelectChange='nodeSelectChange'
ref="dataBaseRef" />
</el-tab-pane>
</el-tabs>
</div>
......@@ -1491,8 +2058,8 @@ const treeSelectNodeClick = (node, item) => {
</div>
</div>
<div class="btns-area" v-if="!tableGuid && activeTab === 'table'">
<!-- v-if="!tableGuid && activeTab === 'table'" -->
<div class="btns-area" v-if="activeName === 'second' && activeTab === 'table'">
<div class="left-btns">
<div class="dropdown_btn" v-if="isShowCreateBtn">
<el-dropdown popper-class="table-create-menu" @command="handleSubjectTableCommand"
......@@ -1533,16 +2100,16 @@ const treeSelectNodeClick = (node, item) => {
</div>
</div>
<div class="table_panel_wrap_database" :style="{ height: `calc(100% - ${tipHeight1}px)` }"
v-if="!tableGuid && activeTab === 'table'">
v-if="activeTab === 'table'">
<Table :tableInfo="dataBaseTableInfo" @tablePageChange="dataBaseTablePageChange"
@tableSwitchBeforeChange="tableSwitchBeforeChange" />
</div>
<div class="table_field" :style="{ height: `calc(100% - ${tipHeight2}px)` }"
v-if="tableGuid || activeTab === 'word'">
<div class="table_field" :style="{ height: `calc(100% - ${tipHeight2}px)` }" v-if="activeTab === 'word'">
<Table :tableInfo="tableFieldsDataInfo" @tablePageChange="dataFieldTablePageChange" />
</div>
</div>
<Drawer :drawerInfo="drawerInfo" @drawerBtnClick="drawerBtnClick" class="v-drawer" />
<Drawer :drawerInfo="drawerInfo" @drawerBtnClick="drawerBtnClick" class="v-drawer" ref="drawerRef"
@drawerSelectChange="drawerSelectChange" />
</div>
</div>
......
......@@ -26,6 +26,31 @@ const getBizRuleConfigDetailData = async () => {
item.isEdit = false
})
tableData.value = bizRuleConfigData.value
// 处理tableData,fieldLengthCondition,有值则不用加字段,如果没有值则加字段lengthSymbol 为''
tableData.value.forEach((item: any) => {
if (!item.fieldLengthCondition) {
item.lengthSymbol = ''
}
if (!isSingleInput(item.fieldType) && (item.startValue || item.endValue)) {
item.fieldValueRange = (item.startValue ? item.startValue : '') + '#' + (item.endValue ? item.endValue : '')
}
if (item.fieldLengthCondition) {
const arr = item.fieldLengthCondition.split('#'); // 按 '#' 分割
// 判断数组中是否包含 'between'
if (arr.includes('between')) {
// 如果包含 'between',则将对应的 start 和 end 值赋给相应的字段
item.lengthSymbol = 'between';
item.numberRangeStart = arr[1]; // start value
item.numberRangeEnd = arr[2]; // end value
} else {
// 否则处理其他符号条件,如 '>=', '<=', '>', '<', '=' 等
item.lengthSymbol = arr[0]; // 符号(如 '>', '<=', 等)
item.lengthValue = arr[1]; // 值(如 10,20 等)
}
}
})
console.log('tableData', tableData.value)
tableFieldsLoading.value = false
} else {
proxy.$message.error(res.msg)
......@@ -165,130 +190,193 @@ const editRow = (row) => {
if (!tempRowData.value.find((item) => item.fieldGuid === row.fieldGuid)) {
tempRowData.value.push({ ...row });
}
if (row.fieldLengthCondition) {
const arr = row.fieldLengthCondition.split('#')
row.lengthSymbol = arr[0]
row.lengthValue = arr[1]
}
if (row.fieldValueRange) {
const arr = row.fieldValueRange.split('#')
row.rangeStart = arr[0]
row.rangeEnd = arr[1]
}
console.log('tempRowData:', tempRowData.value);
// console.log('tempRowData:', tempRowData.value);
// if (row.fieldLengthCondition) {
// const arr = row.fieldLengthCondition.split('#'); // 按 '#' 分割
// // 判断数组中是否包含 'between'
// if (arr.includes('between')) {
// // 如果包含 'between',则将对应的 start 和 end 值赋给相应的字段
// row.lengthSymbol = 'between';
// row.numberRangeStart = arr[1]; // start value
// row.numberRangeEnd = arr[2]; // end value
// } else {
// // 否则处理其他符号条件,如 '>=', '<=', '>', '<', '=' 等
// row.lengthSymbol = arr[0]; // 符号(如 '>', '<=', 等)
// row.lengthValue = arr[1]; // 值(如 10,20 等)
// }
// }
// if (row.fieldValueRange && !isSingleInput(row.fieldType)) {
// const arr = row.fieldValueRange.split('#')
// row.startValue = arr[0]
// row.endValue = arr[1]
// }
row.isEdit = true; // 进入编辑模式
};
// 保存数据
const saveRow = (row) => {
console.log('保存:', row);
const tempRow = row;
let fieldLengthCondition = ''
let fieldValueRange = ''
if (row.lengthSymbol === 'between') {
// 校验不能为空,其中一个为空则提示
if (!row.numberRangeStart || !row.numberRangeStart) {
proxy.$message.error('请输入完整的长度范围');
return;
}
if (row.numberRangeStart && !row.numberRangeStart) {
proxy.$ElMessage.error('请输入完整的长度范围');
return
}
if (!row.numberRangeStart && row.numberRangeStart) {
proxy.$ElMessage.error('请输入完整的长度范围');
return
}
console.log(row.lengthSymbol + '#' + row.numberRangeStart + '#' + row.numberRangeEnd)
row.fieldLengthCondition = row.lengthSymbol + '#' + row.numberRangeStart + '#' + row.numberRangeEnd
fieldLengthCondition = row.lengthSymbol + '#' + row.numberRangeStart + '#' + row.numberRangeEnd
} else {
if (!row.lengthValue && row.lengthSymbol) {
proxy.$message.error('请输入完整的长度范围');
return;
}
if (!row.lengthSymbol && row.lengthValue) {
proxy.$message.error('请输入完整的长度范围');
return;
}
if (!row.lengthSymbol && !row.lengthValue) {
row.fieldLengthCondition = ''
fieldLengthCondition = ''
}
if (row.lengthSymbol && row.lengthValue) {
row.fieldLengthCondition = row.lengthSymbol + '#' + row.lengthValue
fieldLengthCondition = row.lengthSymbol + '#' + row.lengthValue
}
}
// 字段范围 双文本情况
if (!isSingleInput(row.fieldType)) {
if (row.startValue || row.endValue) {
row.fieldValueRange = (row.startValue ? row.startValue : '') + '#' + (row.endValue ? row.endValue : '')
fieldValueRange = (row.startValue ? row.startValue : '') + '#' + (row.endValue ? row.endValue : '')
} else {
row.fieldValueRange = ''
fieldValueRange = row.fieldValueRange
}
} else {
fieldValueRange = row.fieldValueRange
}
if (tableData.value.find((item: any) => item.fieldGuid === row.fieldGuid)) {
tableData.value.forEach(item => {
if (item.fieldGuid === row.fieldGuid) {
item.fieldLengthCondition = fieldLengthCondition
item.fieldValueRange = fieldValueRange
item.fieldGuid = tempRow.fieldGuid
item.fieldPrecision = tempRow.fieldPrecision
item.isUnique = tempRow.isUnique
item.notNull = tempRow.notNull
}
});
// 更新 tempRowData 中保存的数据
const tempRowIndex = tempRowData.value.findIndex((item) => item.fieldGuid === row.fieldGuid);
if (tempRowIndex !== -1) {
// 更新 tempRowData 为保存后的数据
tempRowData.value[tempRowIndex] = { ...row };
}
if (row.rangeStart && row.rangeEnd) {
row.fieldValueRange = row.rangeStart + '#' + row.rangeEnd
}
row.isEdit = false
}
const data = [
{
value: '1',
label: 'Level one 1',
children: [
{
value: '1-1',
label: 'Level two 1-1',
children: [
{
value: '1-1-1',
label: 'Level three 1-1-1',
},
],
},
],
},
{
value: '2',
label: 'Level one 2',
children: [
{
value: '2-1',
label: 'Level two 2-1',
children: [
{
value: '2-1-1',
label: 'Level three 2-1-1',
},
],
},
{
value: '2-2',
label: 'Level two 2-2',
children: [
{
value: '2-2-1',
label: 'Level three 2-2-1',
},
],
},
],
},
{
value: '3',
label: 'Level one 3',
children: [
{
value: '3-1',
label: 'Level two 3-1',
children: [
{
value: '3-1-1',
label: 'Level three 3-1-1',
},
],
},
{
value: '3-2',
label: 'Level two 3-2',
children: [
{
value: '3-2-1',
label: 'Level three 3-2-1',
},
],
},
],
},
]
const loading = ref(false)
const saveData = async () => {
loading.value = true
/**入参
* "guid": "string",
"fieldGuid": "string",
"fieldLengthCondition": "string",
"fieldPrecision": 0,
"dictionaryGuid": "string",
"isUnique": "string",
"isNotNull": "string",
"fieldValueRange": "string"
*/
const inParams = [] as any
let inParams = [] as any
console.log('tableData.value', tableData.value)
// 遍历tableData.value,校验
for (let i = 0; i < tableData.value.length - 1; i++) {
let item = tableData.value[i]
if (item.lengthSymbol == 'between') {
if ((!item.numberRangeStart && item.numberRangeEnd) || (item.numberRangeStart && !item.numberRangeEnd) || (!item.numberRangeStart && !item.numberRangeEnd)) {
proxy.$message.error(`第${i + 1}行,请输入完整的长度范围!`);
loading.value = false
return
}
} else if (item.lengthSymbol === '>' || item.lengthSymbol === '<' || item.lengthSymbol === '=' || item.lengthSymbol === '>=' || item.lengthSymbol === '<=') {
if ((!item.lengthSymbol && item.lengthValue) || (item.lengthSymbol && !item.lengthValue)) {
proxy.$message.error(`第${i + 1}行,请输入完整的长度范围!`);
loading.value = false
return
}
}
}
console.log('tableData.value', tableData.value)
tableData.value.forEach((item: any) => {
const obj = {
let fieldLengthCondition = ''
if (item.lengthSymbol == 'between') {
fieldLengthCondition = item.lengthSymbol + '#' + item.numberRangeStart + '#' + item.numberRangeEnd
} else if (item.lengthSymbol === '>' || item.lengthSymbol === '<' || item.lengthSymbol === '=' || item.lengthSymbol === '>=' || item.lengthSymbol === '<=') {
fieldLengthCondition = item.lengthSymbol + '#' + item.lengthValue
} else {
fieldLengthCondition = ''
}
if (isSingleInput(item.fieldType)) {
inParams.push(
{
fieldGuid: item.fieldGuid,
execGuid: router.currentRoute.value.query.execGuid,
fieldLengthCondition: item.fieldLengthCondition,
fieldLengthCondition: fieldLengthCondition,
fieldPrecision: item.fieldPrecision,
dictionaryGuid: item.dictionaryGuid,
isUnique: item.isUnique,
notNull: item.notNull,
fieldValueRange: item.fieldValueRange
}
inParams.push(obj)
)
} else {
inParams.push(
{
fieldGuid: item.fieldGuid,
execGuid: router.currentRoute.value.query.execGuid,
fieldLengthCondition: fieldLengthCondition,
fieldPrecision: item.fieldPrecision,
dictionaryGuid: item.dictionaryGuid,
isUnique: item.isUnique,
notNull: item.notNull,
startValue: item.startValue,
endValue: item.endValue
}
)
}
})
// console.log('finalParams', inParams)
// // 克隆一份 inParams,用于遍历
const cloneInParams = JSON.parse(JSON.stringify(inParams));
// // 遍历 cloneInParams,检查每一项的字段
let allFieldsEmpty = true; // 标记所有字段是否都为空
for (let i = 0; i < cloneInParams.length; i++) {
// 判断每项中除 fieldGuid 和 execGuid 外的字段是否都为空
const item = cloneInParams[i];
const isEmpty = !item.notNull && !item.fieldValueRange && !item.isUnique && !item.dictionaryGuid && !item.fieldLengthCondition && !item.fieldPrecision && !item.startValue && !item.endValue;
// 如果有有效的字段,则不清空 inParams
if (!isEmpty) {
allFieldsEmpty = false;
break;
}
}
// 如果所有项的字段都为空,则清空 inParams
if (allFieldsEmpty) {
inParams = [];
}
try {
const res: any = await saveBizRuleConfig(inParams)
if (res.code === proxy.$passCode) {
loading.value = false
......@@ -301,6 +389,9 @@ const saveData = async () => {
loading.value = false
proxy.$message.error(res.msg)
}
} catch (error) {
loading.value = false
}
}
......@@ -317,14 +408,108 @@ const cancel = () => {
// 点击取消
const cancelEdit = (row) => {
console.log('取消编辑:', row);
// console.log('取消编辑:', row, tempRowData.value);
// 可在此恢复原始数据逻辑,要查找暂存的数据 tempRowData 中 fieldGuid 与当前行的 fieldGuid 相同的数据
const tempRow = tempRowData.value.find((item) => item.fieldGuid === row.fieldGuid);
Object.assign(row, tempRow);
// 遍历tableData.value,找到当前行并恢复原始数据
tableData.value.forEach((item) => {
if (item.fieldGuid === tempRow.fieldGuid) {
// 恢复原始数据
item.fieldLengthCondition = tempRow.fieldLengthCondition;
item.fieldPrecision = tempRow.fieldPrecision;
item.isUnique = tempRow.isUnique;
item.notNull = tempRow.notNull;
item.fieldValueRange = tempRow.fieldValueRange;
}
});
row.isEdit = false; // 退出编辑状态
}
// 判断是否为单文本框
const isSingleInput = (fieldType: string) => {
// 定义单文本框的字段类型
const singleInputTypes = ['string', 'text', 'varchar', 'json', 'bit', 'char'];
return singleInputTypes.includes(fieldType) || !fieldType; // 如果fieldType为空,默认为单文本框
};
const validatePositiveInteger = (row: any, field: string) => {
let value = row[field];
// 如果输入值为0,则将其设置为1
if (value === '0') {
row[field] = '1';
return;
}
// 判断输入是否符合正整数且在1到9999之间
if (value && !/^\d{1,4}$/.test(value)) {
// 如果不是1到4位的正整数,清空输入值
row[field] = '';
} else if (value && (parseInt(value) < 1 || parseInt(value) > 9999)) {
// 如果数字小于1或大于9999,清空输入值
row[field] = '';
}
};
function parseFieldLengthCondition(condition) {
// 如果 condition 为 null 或 undefined,直接返回默认值
if (!condition) {
return '--';
}
if (condition.includes('between')) {
const parts = condition.split('#').filter(Boolean); // 按 '#' 分割并去掉空值
return `介于${parts[1]}-${parts[2]}`; // 显示为 "10-20"
}
let symbol = '';
let value = '';
if (condition.startsWith('>=') || condition.startsWith('<=')) {
symbol = condition.slice(0, 2); // 取前两个字符 '>=', '<='
value = condition.substring(2); // 取从第三个字符开始的部分 '10'
} else {
symbol = condition[0];
value = condition.substring(1);
}
value = value.replace('#', '');
let displayText = '';
switch (symbol) {
case '>':
displayText = `大于${value}`;
break;
case '=':
displayText = `等于${value}`;
break;
case '<':
displayText = `小于${value}`;
break;
case '>=':
displayText = `大于等于${value}`;
break;
case '<=':
displayText = `小于等于${value}`;
break;
default:
displayText = `--`;
break;
}
return displayText;
}
const inputLengthKeyUp = (regexp, scope, field, max: any = null, min: any = null) => {
scope.row[field] = scope.row[field].replace(regexp, '');
if (field == 'fieldLength' && scope.row.dataType == 'decimal') {
max = 65;
}
/** 最大值设置2000 */
if (max && scope.row[field] > max) {
scope.row[field] = max;
}
if (min !== null && scope.row[field] != '' && scope.row[field] <= min) {
scope.row[field] = min;
}
}
</script>
<template>
<div class="configure-rules">
......@@ -335,9 +520,9 @@ const cancelEdit = (row) => {
'max-height': 'calc(100% - 16px)',
display: 'inline-block',
}">
<el-table-column prop="databaseChName" label="数据源" width="180" />
<el-table-column prop="tableName" label="表名称" width="180" />
<el-table-column prop="tableChName" label="数据库表" width="280" />
<el-table-column prop="databaseChName" label="数据源" width="180" show-overflow-tooltip />
<el-table-column prop="tableName" label="表名称" width="180" show-overflow-tooltip />
<el-table-column prop="tableChName" label="数据库表" width="280" show-overflow-tooltip />
<el-table-column prop="description" label="描述" width="180" show-overflow-tooltip />
</el-table>
</div>
......@@ -369,9 +554,10 @@ const cancelEdit = (row) => {
</template>
</el-table-column>
<!-- 分类(不可编辑)classifyName -->
<el-table-column prop="classifyDetailName" label="分类" width="120" show-overflow-tooltip>
<el-table-column prop="classifyDetailNameRoutes" label="分类" width="120" show-overflow-tooltip>
<template #default="scope">
{{ scope.row.classifyDetailName ? scope.row.classifyDetailName : '--' }}
{{ Array.isArray(scope.row.classifyDetailNameRoutes) ? scope.row.classifyDetailNameRoutes.join('/') : '--'
}}
</template>
</el-table-column>
<!-- 分级(不可编辑) -->
......@@ -381,7 +567,7 @@ const cancelEdit = (row) => {
</template>
</el-table-column>
<!-- 字段类型fieldType (不可编辑) -->
<el-table-column prop="fieldType" label="字段类型" width="120" align="center">
<el-table-column prop="fieldType" label="字段类型" width="120" align="center" show-overflow-tooltip>
<template #default="scope">
{{
......@@ -392,36 +578,60 @@ const cancelEdit = (row) => {
</el-table-column>
<!-- 长度列 fieldLengthCondition: '>#10',-->
<el-table-column prop="fieldLengthCondition" label="长度" width="240" align="center">
<el-table-column prop="fieldLengthCondition" label="长度" width="270" align="left" show-overflow-tooltip>
<template #default="scope">
<span v-if="!scope.row.isEdit">{{ scope.row.fieldLengthCondition
? scope.row.fieldLengthCondition.replace('#', '') : '--' }}</span>
<span v-if="!scope.row.isEdit">
{{ parseFieldLengthCondition(scope.row.fieldLengthCondition) || '--' }}
</span>
<div v-else>
<el-select v-model="scope.row.lengthSymbol" placeholder="请选择" style="width: 50%;margin-right: 8px;">
<div style="display: flex; align-items: center;">
<el-select v-model="scope.row.lengthSymbol" placeholder="请选择" style="width: 70%;margin-right: 8px;"
clearable>
<el-option label="大于" value=">"></el-option>
<el-option label="等于" value="="></el-option>
<el-option label="小于" value="<"></el-option>
<el-option label="大于等于" value=">="></el-option>
<el-option label="小于等于" value="<="></el-option>
<!-- 介于 -->
<el-option label="介于" value="between"></el-option>
</el-select>
<el-input v-model="scope.row.lengthValue" placeholder="请输入" style="width: 45%;" />
<!-- 当选择"介于"时,显示两个输入框 -->
<div v-if="scope.row.lengthSymbol === 'between'" style="display: flex; gap: 5px; align-items: center;">
<el-input v-model="scope.row.numberRangeStart" placeholder="请输入" style="width: 45%;" type="number"
clearable @input="validatePositiveInteger(scope.row, 'numberRangeStart')" />
<span>-</span>
<el-input v-model="scope.row.numberRangeEnd" placeholder="请输入" style="width: 45%;" type="number"
clearable @input="validatePositiveInteger(scope.row, 'numberRangeEnd')" />
</div>
<!-- 其他符号时显示一个输入框 -->
<div v-else>
<el-input v-model="scope.row.lengthValue" placeholder="请输入" style="width: 70%;" clearable
@input="validatePositiveInteger(scope.row, 'lengthValue')" type="number" />
</div>
</div>
</div>
</template>
</el-table-column>
<el-table-column prop="fieldPrecision" label="精度" width="120" align="center">
<el-table-column prop="fieldPrecision" label="精度" width="120" align="center" show-overflow-tooltip>
<template #default="scope">
<span v-if="!scope.row.isEdit || !editableFields.fieldPrecision">{{
scope.row.fieldPrecision ? scope.row.fieldPrecision : '--' }}</span>
<el-input v-else v-model="scope.row.fieldPrecision" placeholder="请输入精度" />
<!-- 判断是否是浮点型,并且当前行是否可编辑 -->
<span v-if="!scope.row.isEdit || !editableFields.fieldPrecision || scope.row.fieldType !== 'decimal'">
{{ scope.row.fieldPrecision ? scope.row.fieldPrecision : '--' }}
</span>
<el-input v-else v-model="scope.row.fieldPrecision" placeholder="请输入精度" clearable
@input="inputLengthKeyUp(/\D/g, scope, 'fieldPrecision', 30, 1)" />
</template>
</el-table-column>
<!-- 关联字典(可编辑)el-tree-select 形式下拉形式 -->
<el-table-column prop="dictionaryGuid" label="关联字典" width="150" align="center">
<el-table-column prop="dictionaryGuid" label="关联字典" width="150" align="left" show-overflow-tooltip>
<template #default="scope">
<span v-if="!scope.row.isEdit">{{ scope.row.dictionaryGuid
? dictionaryList.find((item: any) => item.guid === scope.row.dictionaryGuid)?.chName : '--' }}</span>
<el-select v-else v-model="scope.row.dictionaryGuid" placeholder="请选择">
<el-select v-else v-model="scope.row.dictionaryGuid" placeholder="请选择" clearable>
<el-option v-for="item in dictionaryList" :key="item?.guid" :label="item.chName" :value="item.guid" />
</el-select>
</template>
......@@ -429,23 +639,23 @@ const cancelEdit = (row) => {
</el-table-column>
<!-- 数据是否唯一(可编辑) -->
<el-table-column prop="isUnique" label="数据是否唯一" width="150" align="center">
<el-table-column prop="isUnique" label="数据是否唯一" width="150" align="left" show-overflow-tooltip>
<template #default="scope">
<span v-if="!scope.row.isEdit || !editableFields.isUnique">{{ scope.row.isUnique ? (scope.row.isUnique ===
'Y' ? '是' : '否') : '--'
}}</span>
<el-select v-else v-model="scope.row.isUnique" placeholder="请选择">
<el-select v-else v-model="scope.row.isUnique" placeholder="请选择" clearable>
<el-option label="是" value="Y" />
<el-option label="否" value="N" />
</el-select>
</template>
</el-table-column>
<!-- 是否必填(可编辑) -->
<el-table-column prop="notNull" label="是否必填" width="120" align="center">
<el-table-column prop="notNull" label="是否必填" width="120" align="left" show-overflow-tooltip>
<template #default="scope">
<span v-if="!scope.row.isEdit">{{ scope.row.notNull ? (scope.row.notNull === 'Y' ? '是' : '否') : '--'
}}</span>
<el-select v-else v-model="scope.row.notNull" placeholder="请选择">
<el-select v-else v-model="scope.row.notNull" placeholder="请选择" clearable>
<el-option label="是" value="Y" />
<el-option label="否" value="N" />
</el-select>
......@@ -453,24 +663,34 @@ const cancelEdit = (row) => {
</el-table-column>
<!-- 字段取值范围 fieldValueRange(可编辑)-->
<el-table-column prop="fieldValueRange" label="字段取值范围" width="260" align="center">
<el-table-column prop="fieldValueRange" label="字段取值范围" width="260" align="left" show-overflow-tooltip>
<template #default="scope">
<!-- 非编辑模式,展示取值范围 -->
<span v-if="!scope.row.isEdit">
{{ scope.row.fieldValueRange
? scope.row.fieldValueRange.replace('#', '-') : '--' }}
</span>
<!-- 编辑模式,显示两个输入框 -->
<!-- 编辑模式,显示不同的输入框 -->
<div v-else style="display: flex; gap: 5px; align-items: center;">
<el-input v-model="scope.row.rangeStart" placeholder="最小值" style="width: 45%;" type="number" />
<!-- 判断字段类型并渲染对应的输入框 -->
<template v-if="isSingleInput(scope.row.fieldType)">
<!-- 单文本框:字符型、大字段型、单字符型、JSON类型、布尔类型 -->
<el-input v-model="scope.row.fieldValueRange" placeholder="请输入" clearable maxlength="500" />
</template>
<template v-else>
<!-- 双文本框:整型、日期型、日期时间型、时间戳、浮点型、一字节整型、时间类型 -->
<el-input v-model="scope.row.startValue" placeholder="请输入开始值" style="width: 45%;" clearable
maxlength="200" />
<span>-</span>
<el-input v-model="scope.row.rangeEnd" placeholder="最大值" style="width: 45%;" type="number" />
<el-input v-model="scope.row.endValue" placeholder="请输入结束值" style="width: 45%;" clearable
maxlength="200" />
</template>
</div>
</template>
</el-table-column>
<!-- 操作列 -->
<el-table-column label="操作" width="120" align="center" fixed="right">
<el-table-column label="操作" width="120" align="center" fixed="right" show-overflow-tooltip>
<template #default="scope">
<span class="text_btn" v-if="!scope.row.isEdit" @click="editRow(scope.row)">编辑</span>
<span v-else>
......@@ -484,8 +704,8 @@ const cancelEdit = (row) => {
</el-table>
</div>
<div class="botton_btn">
<el-button type="primary" @click="saveData" :loading="loading">保存</el-button>
<el-button @click="cancel">取消</el-button>
<el-button type="primary" @click="saveData" :loading="loading">保存</el-button>
</div>
</div>
......@@ -518,5 +738,11 @@ const cancelEdit = (row) => {
height: 36px;
}
}
.botton_btn {
display: flex;
justify-content: center;
align-items: center;
}
}
</style>
......
......@@ -145,7 +145,7 @@ const orginItems = [
{
label: '字典中文名',
type: 'input',
maxlength: 50,
maxlength: 20,
placeholder: '请输入',
field: 'chName',
clearable: true,
......@@ -154,7 +154,7 @@ const orginItems = [
}, {
label: '字典英文名',
type: 'input',
maxlength: 50,
maxlength: 20,
placeholder: '请输入',
field: 'enName',
clearable: true,
......
......@@ -7,7 +7,7 @@ import Moment from 'moment';
import {
getDsTableByDs,
getDsData,
getDsTableStructure,
getDsTableStructures,
} from "@/api/modules/dataInventory";
......@@ -199,14 +199,14 @@ const getTableStructure = () => {
console.log('tableName');
currDsTableStructureLoading.value = true;
currDsTableStructure.value = [];
getDsTableStructure({
getDsTableStructures([{
// tableName: tableName,
// dataSourceGuid: databaseInfo.value.guid,
// database: databaseInfo.value.databaseNameEn,
// databaseType: databaseInfo.value.databaseType,
tableGuid: currDatasourceSelect.value.tableGuid,
execGuid: props.execGuid
}).then((res: any) => {
}]).then((res: any) => {
currDsTableStructureLoading.value = false;
if (res.code == proxy.$passCode) {
currDsTableStructure.value = res.data || [];
......@@ -438,6 +438,21 @@ const getTextAlign = (field) => {
<el-table-column prop="fieldName" label="字段英文名" width="150px" align="left" header-align="left"
show-overflow-tooltip>
</el-table-column>
<!-- 分类 -->
<el-table-column prop="classifyDetailNameRoutes" label="分类" width="150px" align="left" header-align="left"
show-overflow-tooltip>
<template #default="scope">
{{ scope.row['classifyDetailNameRoutes'] ? scope.row['classifyDetailNameRoutes'].join('/') : '--' }}
</template>
</el-table-column>
<el-table-column prop="gradeDetailName" label="分级" width="80px" align="left" header-align="left"
show-overflow-tooltip>
<template #default="scope">
<span>{{ scope.row['gradeDetailName'] ?? '--' }}</span>
</template>
</el-table-column>
<el-table-column prop="fieldChName" label="字段名" width="150px" align="left" header-align="left"
show-overflow-tooltip>
<template #default="scope">
......@@ -472,9 +487,9 @@ const getTextAlign = (field) => {
<span>{{ scope.row['isPrimary'] ?? '--' }}</span>
</template>
</el-table-column>
<el-table-column prop="isNotNull" label="是否必填" width="100px" align="left" header-align="left"
<el-table-column prop="notNull" label="是否必填" width="100px" align="left" header-align="left"
show-overflow-tooltip>
<template #default="scope">{{ scope.row['isNotNull'] === 'Y' ? 'N' : 'Y' }}</template>
<template #default="scope">{{ scope.row['notNull'] ?? '--' }}</template>
</el-table-column>
<el-table-column prop="isFk" label="是否外键" width="100px" align="left" header-align="left"
show-overflow-tooltip>
......
......@@ -21,6 +21,7 @@ import {
} from "@/api/modules/dataInventory";
import existingTableSelect from "./existingTableSelect.vue";
import useUserStore from "@/store/modules/user";
import { download } from "@/utils/common";
/** 草稿中未建表时就可以编辑表相关信息。如果建表之后就只能编辑字段。 不能修改字段英文名称,数据库修改英文名就相当于删除再添加。都可以直接跳转到*/
......@@ -138,8 +139,10 @@ const findRefGradeGuid = (data, targetClassifyDetailGuid) => {
};
const refGradeGuid = ref<any>('');
const editRow = (row) => {
console.log('row', row)
// 进入编辑模式时,查找classifyDetailGuid所在的refGradeGuid
refGradeGuid.value = findRefGradeGuid(treeSelectOptions.value, row.classifyDetailGuid);
console.log('refGradeGuid', refGradeGuid.value)
if (refGradeGuid.value) {
getGradeList({ classifyGradeGuid: refGradeGuid.value.refGradeGuid, pageIndex: 1, pageSize: -1 }).then((res: any) => {
if (res.code === proxy.$passCode) {
......@@ -187,7 +190,8 @@ onMounted(async () => {
tableFieldsLoading.value = true;
stepsInfo.value.step = 1;
getDbDirDetail({
tableGuid: route.query.tableGuid
tableGuid: route.query.tableGuid,
execGuid: route.query.execGuid,
}).then((res: any) => {
if (res.code == proxy.$passCode) {
editInfoData.value = res.data;
......@@ -225,6 +229,7 @@ const selectedDatabaseTableInfo = ref<any>([]);
const datasourceSelectedRows: Ref<any> = ref([]);
// 记录数据库databaseGuid
const handlDsSelectedChange = (v, curr) => {
tableDataInfo.value[0].description = curr.description || '';
selectedDatabaseTableInfo.value = curr || '';
datasourceSelectedRows.value = v || [];
const params: any = [];
......@@ -293,6 +298,7 @@ const findDDatabasePath = (data: any[], targetGuid: string, path: string[] = [],
// 存储分级数据
const gradeInfo = ref<any>();
const handleClassifyChange = (row, value) => {
console.log('row2', row, value)
const pathInfo = findDDatabasePath(treeSelectOptions.value, value)
row.classifyDetailNameRoutes = pathInfo.path;
row.classifyDetailGuidRoutes = pathInfo.route;
......@@ -301,7 +307,7 @@ const handleClassifyChange = (row, value) => {
// row.gradeOptions = [];
// return;
// }
// if (gradeInfo.value) {
// refGradeGuid.value = findRefGradeGuid(treeSelectOptions.value, row.classifyDetailGuid);
// row.classifyDetailName = refGradeGuid.value.classifyName;
// getGradeList({ classifyGradeGuid: refGradeGuid.value.refGradeGuid, pageIndex: 1, pageSize: -1 }).then((res: any) => {
......@@ -311,15 +317,32 @@ const handleClassifyChange = (row, value) => {
// ElMessage.error(res.msg);
// }
// });
// }
};
const handleNodeClick = (row, node, data) => {
console.log('row1', row, node, data)
// 在gradeInfo找到item.guid === row.gradeGuid
if (gradeInfo.value) {
const matchedItem = gradeInfo.value.find((item) => item.guid === node.gradeGuid);
if (matchedItem) {
row.gradeDetailGuid = matchedItem.guid;
row.gradeDetailName = matchedItem.name;
}
} else {
getGradeList({ classifyGradeGuid: node.refGradeGuid, pageIndex: 1, pageSize: -1 }).then((res: any) => {
if (res.code === proxy.$passCode) {
gradeInfo.value = res.data.records || [];
row.gradeOptions = res.data.records || [];
const matchedItem = gradeInfo.value.find((item) => item.guid === node.gradeGuid);
row.gradeDetailGuid = matchedItem.guid;
row.gradeDetailName = matchedItem.name;
} else {
ElMessage.error(res.msg);
}
});
}
}
const isPrevious = ref(false);
......@@ -353,7 +376,7 @@ const editableFields = {
classifyDetailGuid: true, // 分类可编辑
fieldType: true, // 字段类型可编辑
fieldChName: true, // 字段中文名可编辑
sourceFieldChName: true, // 源字段中文名可编辑
}
const tableFieldsLoading = ref(false)
......@@ -762,12 +785,14 @@ const saveOrUpdate = async (params: any = {}, type) => {
if (params.isDraft === 'Y') {
proxy.$ElMessage.success('保存为草稿成功!');
userStore.setTabbar(userStore.tabbar.filter((tab: any) => tab.fullPath !== fullPath));
router.push({ name: 'classifyGradeCatalogue', query: { reload: 'true' } });
localStorage.setItem('shouldReloadData', 'true');
router.push({ name: 'classifyGradeCatalogue' });
return
}
proxy.$ElMessage.success('保存成功!');
userStore.setTabbar(userStore.tabbar.filter((tab: any) => tab.fullPath !== fullPath));
router.push({ name: 'classifyGradeCatalogue', query: { reload: 'true' } });
localStorage.setItem('shouldReloadData', 'true');
router.push({ name: 'classifyGradeCatalogue' });
} else {
saveBtn.value = false
proxy.$ElMessage.error(res.msg);
......@@ -779,7 +804,8 @@ const saveOrUpdate = async (params: any = {}, type) => {
if (res1.code === proxy.$passCode) {
proxy.$ElMessage.success('编辑成功!');
userStore.setTabbar(userStore.tabbar.filter((tab: any) => tab.fullPath !== fullPath));
router.push({ name: 'classifyGradeCatalogue', query: { reload: 'true' } });
localStorage.setItem('shouldReloadData', 'true');
router.push({ name: 'classifyGradeCatalogue' });
} else {
saveBtn.value = false
proxy.$ElMessage.error(res1.msg);
......@@ -787,12 +813,12 @@ const saveOrUpdate = async (params: any = {}, type) => {
break;
case 2:
// 生成建表语句
const res2: any = await createTableSql(finalParams);
if (res2.code === proxy.$passCode) {
proxy.$ElMessage.success('建表sql生成成功!');
} else {
proxy.$ElMessage.error(res2.msg);
}
createTableSql(finalParams).then((res: any) => {
download(res, '分类分级目录数据.xlsx', 'excel')
});
break;
default:
break;
......@@ -948,18 +974,18 @@ onActivated(() => {
<!-- 表名称列 -->
<el-table-column prop="tableName" label="表名称" width="180">
<template #header>
<span>表名称</span>
<span>数据库表</span>
<span style="color:red;margin-left: 2px;">*</span>
</template>
<template #default="scope">
<el-input v-model="scope.row.tableName" placeholder="请输入表名称" />
<el-input v-model="scope.row.tableName" placeholder="请输入表名称" :disabled="route.query.state === '1'" />
</template>
</el-table-column>
<!-- 数据库表列 -->
<el-table-column prop="tableChName" label="数据库表" width="280">
<template #header>
<span>数据库表</span>
<span>主题表名称</span>
<span style="color:red;margin-left: 2px;">*</span>
</template>
<template #default="scope">
......@@ -982,7 +1008,7 @@ onActivated(() => {
<el-button @click="batchDelete">批量删除</el-button>
<el-button @click="createNewSql">生成建表语句</el-button>
</div>
<div class="bottom_table">
<div class="bottom_table" v-if="route.query.editOpt === '1'">
<el-table :data="tableDataDetailInfo" v-loading="tableFieldsLoading" :highlight-current-row="true" stripe
border height="100%" row-key="guid" @selection-change="selectionFieldsChange" tooltip-effect="light" :style="{
width: '100%',
......@@ -993,10 +1019,12 @@ onActivated(() => {
<!-- 排序列(不可编辑) -->
<el-table-column type="index" label="排序" width="80" align="center" />
<!-- 字段中文名(可编辑)fieldChName -->
<el-table-column prop="fieldChName" label="目标字段中文名" width="150" show-overflow-tooltip>
<el-table-column prop="fieldChName" label="字段中文名" width="150" show-overflow-tooltip>
<!-- 可以编辑 -->
<template #default="scope">
<span v-if="!scope.row.isEdit || !editableFields.fieldChName">{{ scope.row.fieldChName ?
<span
v-if="!scope.row.isEdit || !editableFields.fieldChName || (scope.row.isPrimary === 'Y' && route.query.editOpt === '1' && route.query.state != '0')">{{
scope.row.fieldChName ?
scope.row.fieldChName
: '--' }}</span>
<el-input v-else v-model="scope.row.fieldChName" placeholder="请输入" />
......@@ -1004,9 +1032,11 @@ onActivated(() => {
</el-table-column>
<!-- 字段英文名(可编辑) -->
<el-table-column prop="fieldName" label="目标字段英文名" width="150" show-overflow-tooltip>
<el-table-column prop="fieldName" label="字段英文名" width="150" show-overflow-tooltip>
<template #default="scope">
<span v-if="!scope.row.isEdit || !editableFields.fieldName">{{ scope.row.fieldName ?
<span
v-if="!scope.row.isEdit || !editableFields.fieldName || (scope.row.isPrimary === 'Y' && route.query.editOpt === '1' && route.query.state != '0')">{{
scope.row.fieldName ?
scope.row.fieldName
: '--' }}</span>
<el-input v-else v-model="scope.row.fieldName" placeholder="必填"
......@@ -1014,25 +1044,29 @@ onActivated(() => {
</template>
</el-table-column>
<!-- 源数据库 -->
<el-table-column prop="sourceDatabase" label="源数据库" width="150" show-overflow-tooltip>
<el-table-column prop="sourceDatabase" label="源数据库" width="150" show-overflow-tooltip
v-if="route.query.editOpt != '1'">
<template #default="scope">
{{ scope.row.sourceDatabase ? scope.row.sourceDatabase : '--' }}
</template>
</el-table-column>
<!-- 源数据表 -->
<el-table-column prop="sourceTableName" label="源数据表" width="150" show-overflow-tooltip>
<el-table-column prop="sourceTableName" label="源数据表" width="150" show-overflow-tooltip
v-if="route.query.editOpt != '1'">
<template #default="scope">
{{ scope.row.sourceTableName ? scope.row.sourceTableName : '--' }}
</template>
</el-table-column>
<!-- 源字段中文 -->
<el-table-column prop="sourceFieldName" label="源字段中文" width="150" show-overflow-tooltip>
<el-table-column prop="sourceFieldName" label="源字段中文" width="150" show-overflow-tooltip
v-if="route.query.editOpt != '1'">
<template #default="scope">
{{ scope.row.sourceFieldName ? scope.row.sourceFieldName : '--' }}
</template>
</el-table-column>
<!-- 源字段英文 -->
<el-table-column prop="sourceFieldChName" label="源字段英文" width="120" show-overflow-tooltip>
<el-table-column prop="sourceFieldChName" label="源字段英文" width="120" show-overflow-tooltip
v-if="route.query.editOpt != '1'">
<template #default="scope">
<!-- {{ scope.row.sourceFieldName ? scope.row.sourceFieldName : '--' }} -->
......@@ -1042,7 +1076,206 @@ onActivated(() => {
</template>
</el-table-column>
<!-- 源端字段 fieldType fieldTypeProps-->
<el-table-column prop="fieldType" label="源端字段类型" width="120">
<el-table-column prop="fieldType" label="字段类型" width="120">
<template #default="scope">
<div
v-if="scope.row.isEdit && !(scope.row.isPrimary === 'Y' && $route.query.editOpt === '1' && route.query.state != '0')">
<el-select v-model="scope.row.fieldType" placeholder="选择类型" clearable filterable
:props="fieldTypeProps">
<el-option v-for="(item, index) in fieldData" :key="index" :label="item.label"
:value="item.value"></el-option>
</el-select>
</div>
<div v-else>
{{ fieldData ? (fieldData.find(item => item.value === scope.row.fieldType)?.label || '--') : '--' }}
</div>
</template>
</el-table-column>
<!-- 长度(可编辑) -->
<el-table-column prop="fieldLength" label="长度" width="100" align="left">
<template #default="scope">
<!-- 非编辑状态 -->
<span
v-if="!scope.row.isEdit || (scope.row.isPrimary === 'Y' && route.query.editOpt === '1' && route.query.state != '0')">
{{ ['varchar', 'decimal', 'char'].includes(scope.row.fieldType) ? scope.row.fieldLength || '--' : '--'
}}
</span>
<!-- 编辑状态 -->
<div v-else>
<el-input v-if="['varchar', 'decimal', 'char'].includes(scope.row.fieldType)"
v-model="scope.row.fieldLength" placeholder="请输入长度"
@input="inputLengthKeyUp(/\D/g, scope, 'fieldLength', 2000, 1)" />
<span v-else>--</span>
</div>
</template>
</el-table-column>
<!-- 精度(可编辑) -->
<el-table-column prop="fieldPrecision" label="精度" width="100" align="left">
<template #default="scope">
<!-- 非编辑状态 -->
<span v-if="!scope.row.isEdit">
{{ scope.row.fieldType === 'decimal' ? scope.row.fieldPrecision || '--' : '--' }}
</span>
<!-- 编辑状态 -->
<div v-else>
<el-input v-if="scope.row.fieldType === 'decimal'" v-model="scope.row.fieldPrecision"
placeholder="请输入精度" @input="inputLengthKeyUp(/\D/g, scope, 'fieldPrecision', 30, 1)" />
<span v-else>--</span>
</div>
</template>
</el-table-column>
<!-- 关联字典(可编辑)el-tree-select 形式下拉形式 -->
<el-table-column prop="dictionaryGuid" label="关联字典" width="120" align="left">
<template #default="scope">
<span v-if="!scope.row.isEdit">{{ scope.row.dictionaryGuid
? dictionaryList.find((item: any) => item.guid === scope.row.dictionaryGuid)?.chName : '--' }}</span>
<el-select v-else v-model="scope.row.dictionaryGuid" placeholder="请选择">
<el-option v-for="item in dictionaryList" :key="item?.guid" :label="item.chName" :value="item.guid" />
</el-select>
</template>
</el-table-column>
<!-- 数据是否唯一(可编辑) -->
<el-table-column prop="isPrimary" label="是否主键" width="100" align="left">
<template #default="scope">
<span
v-if="!scope.row.isEdit || !editableFields.isPrimary || (scope.row.isPrimary === 'Y' && route.query.editOpt === '1' && route.query.state != '0')">{{
scope.row.isPrimary || '--' }}</span>
<el-select v-else v-model="scope.row.isPrimary" placeholder="请选择">
<el-option label="Y" value="Y" />
<el-option label="N" value="N" />
</el-select>
</template>
</el-table-column>
<!-- 是否必填(可编辑) -->
<el-table-column prop="notNull" label="是否必填" width="100" align="left">
<template #default="scope">
<span
v-if="!scope.row.isEdit || (scope.row.isPrimary === 'Y' && route.query.editOpt === '1' && route.query.state != '0')">{{
scope.row.notNull || '--' }}</span>
<el-select v-else v-model="scope.row.notNull" placeholder="请选择">
<el-option label="Y" value="Y" />
<el-option label="N" value="N" />
</el-select>
</template>
</el-table-column>
<!-- 分类(不可编辑)classifyName -->
<el-table-column prop="classifyDetailNameRoutes" label="分类" width="150" show-overflow-tooltip>
<template #default="scope">
<!-- 如果当前行是编辑状态,显示 tree-select -->
<div v-if="scope.row.isEdit">
<el-tree-select v-model="scope.row.classifyDetailGuid" :data="treeSelectOptions"
:props="treeSelectProps" placeholder="请选择分类" clearable filterable
@change="(value) => handleClassifyChange(scope.row, value)"
@node-click="(node, data) => handleNodeClick(scope.row, node, data)">
</el-tree-select>
</div>
<!-- 否则直接显示分类名称 -->
<div v-else>
{{ Array.isArray(scope.row?.classifyDetailNameRoutes) ? scope.row.classifyDetailNameRoutes.join('/') :
'--' }}
</div>
</template>
</el-table-column>
<!-- 分级(不可编辑) -->
<el-table-column prop="gradeDetailGuid" label="分级" width="100" align="left">
<template #default="scope">
<div v-if="scope.row.isEdit">
<el-select v-model="scope.row.gradeDetailGuid" placeholder="请选择分级" clearable filterable
:props="gradeSelectProps" @change="handleGradeChange(scope.row)">
<el-option v-for="(item, index) in scope.row.gradeOptions || []" :key="index" :label="item.name"
:value="item.guid"></el-option>
</el-select>
</div>
<div v-else>
{{ scope.row.gradeDetailName || '--' }}
</div>
</template>
</el-table-column>
<!-- 操作列 -->
<el-table-column label="操作" width="100" align="center" fixed="right">
<template #default="scope">
<span class="text_btn" v-if="!scope.row.isEdit" @click="editRow(scope.row)">编辑</span>
<span class="text_btn" v-else @click="saveRow(scope.row)">保存</span>
<el-divider direction="vertical"
v-if="(route.query.state == '0' ? route.query.state == '0' : scope.row.isPrimary != 'Y')" />
<span class="text_btn" @click="deleteRow(scope.$index)"
v-if="(route.query.state == '0' ? route.query.state == '0' : scope.row.isPrimary != 'Y')">删除</span>
</template>
</el-table-column>
</el-table>
</div>
<div class="bottom_table" v-else>
<el-table :data="tableDataDetailInfo" v-loading="tableFieldsLoading" :highlight-current-row="true" stripe
border height="100%" row-key="guid" @selection-change="selectionFieldsChange" tooltip-effect="light" :style="{
width: '100%',
'max-height': 'calc(100% - 16px)',
display: 'inline-block',
}">
<el-table-column type="selection" :width="32" align="center" />
<!-- 排序列(不可编辑) -->
<el-table-column type="index" label="排序" width="80" align="center" />
<!-- 字段中文名(可编辑)fieldChName -->
<el-table-column prop="fieldChName" label="字段中文名" width="150" show-overflow-tooltip>
<!-- 可以编辑 -->
<template #default="scope">
<span v-if="!scope.row.isEdit || !editableFields.fieldChName">{{
scope.row.fieldChName ?
scope.row.fieldChName
: '--' }}</span>
<el-input v-else v-model="scope.row.fieldChName" placeholder="请输入" />
</template>
</el-table-column>
<!-- 字段英文名(可编辑) -->
<el-table-column prop="fieldName" label="字段英文名" width="150" show-overflow-tooltip>
<template #default="scope">
<span v-if="!scope.row.isEdit || !editableFields.fieldName">{{
scope.row.fieldName ?
scope.row.fieldName
: '--' }}</span>
<el-input v-else v-model="scope.row.fieldName" placeholder="必填"
@input="inputLengthKeyUp(/[^a-zA-Z0-9_]/g, scope, 'fieldName')" />
</template>
</el-table-column>
<!-- 源数据库 -->
<el-table-column prop="sourceDatabase" label="源数据库" width="150" show-overflow-tooltip
v-if="route.query.editOpt != '1'">
<template #default="scope">
{{ scope.row.sourceDatabase ? scope.row.sourceDatabase : '--' }}
</template>
</el-table-column>
<!-- 源数据表 -->
<el-table-column prop="sourceTableName" label="源数据表" width="150" show-overflow-tooltip
v-if="route.query.editOpt != '1'">
<template #default="scope">
{{ scope.row.sourceTableName ? scope.row.sourceTableName : '--' }}
</template>
</el-table-column>
<!-- 源字段中文 -->
<el-table-column prop="sourceFieldName" label="源字段中文" width="150" show-overflow-tooltip
v-if="route.query.editOpt != '1'">
<template #default="scope">
{{ scope.row.sourceFieldName ? scope.row.sourceFieldName : '--' }}
</template>
</el-table-column>
<!-- 源字段英文 -->
<el-table-column prop="sourceFieldChName" label="源字段英文" width="120" show-overflow-tooltip
v-if="route.query.editOpt != '1'">
<template #default="scope">
<!-- {{ scope.row.sourceFieldName ? scope.row.sourceFieldName : '--' }} -->
<span>{{ scope.row.sourceFieldChName ?
scope.row.sourceFieldChName : '--' }}</span>
</template>
</el-table-column>
<!-- 源端字段 fieldType fieldTypeProps-->
<el-table-column prop="fieldType" label="字段类型" width="120">
<template #default="scope">
<div v-if="scope.row.isEdit">
<el-select v-model="scope.row.fieldType" placeholder="选择类型" clearable filterable
......@@ -1105,9 +1338,8 @@ onActivated(() => {
<!-- 数据是否唯一(可编辑) -->
<el-table-column prop="isPrimary" label="是否主键" width="100" align="left">
<template #default="scope">
<span v-if="!scope.row.isEdit || !editableFields.isPrimary">{{ scope.row.isPrimary ?
(scope.row.isPrimary ===
'Y' ? '是' : '否') : '--' }}</span>
<span v-if="!scope.row.isEdit || !editableFields.isPrimary">{{
scope.row.isPrimary || '--' }}</span>
<el-select v-else v-model="scope.row.isPrimary" placeholder="请选择">
<el-option label="Y" value="Y" />
<el-option label="N" value="N" />
......@@ -1117,8 +1349,8 @@ onActivated(() => {
<!-- 是否必填(可编辑) -->
<el-table-column prop="notNull" label="是否必填" width="100" align="left">
<template #default="scope">
<span v-if="!scope.row.isEdit">{{ scope.row.notNull ? (scope.row.notNull ===
'Y' ? '是' : '否') : '--' }}</span>
<span v-if="!scope.row.isEdit">{{
scope.row.notNull || '--' }}</span>
<el-select v-else v-model="scope.row.notNull" placeholder="请选择">
<el-option label="Y" value="Y" />
<el-option label="N" value="N" />
......
......@@ -33,7 +33,7 @@ import {
getSubjectTableDetail,
checkSubjectTableData
} from "@/api/modules/dataCatalogService";
import { getDictionaryAll, getFidldEnName, getGradeList, getNewDataTypeList, getTaskExeTreeList, saveDbDirTable } from "@/api/modules/dataInventory";
import { getDictionaryAll, getFidldEnName, getGradeList, getNewDataTypeList, getTaskExeTreeList, saveDbDirTable, getFieldClassifyAndGrade } from "@/api/modules/dataInventory";
import { useDefault } from "@/hooks/useDefault";
import uploadExcelFile from "./components/uploadExcelFile.vue";
import { add } from "lodash-es";
......@@ -115,7 +115,7 @@ const uploadFileRef = ref();
const getSubjectField = () => {
tableFieldsLoading.value = true;
getFidldEnName(fileTableFields.value.map(f => f.chName)).then((res: any) => {
getFidldEnName(fileTableFields.value.map(f => f.chName)).then(async (res: any) => {
tableFieldsLoading.value = false;
if (res.code == proxy.$passCode) {
tableCreateInfo.value.tableFields = res.data?.map((field, i) => {
......@@ -125,6 +125,55 @@ const getSubjectField = () => {
!field.notNull && (field.notNull = 'N');
return field;
}) || [];
console.log(tableCreateInfo.value.tableFields, '7897987');
// 遍历 tableCreateInfo.value.tableFields,找到item.fieldName,组合成入参
let tempFileNames: any = []
tableCreateInfo.value.tableFields.forEach((item: any) => {
tempFileNames.push(item.fieldName);
});
const classify: any = await getFieldClassifyAndGrade({
fieldName: tempFileNames,
execGuid: execGuid.value,
type: 'C'
})
const grade: any = await getFieldClassifyAndGrade({
fieldName: tempFileNames,
execGuid: execGuid.value,
type: 'G'
})
// 通过分类数据和分级数据赋值给 tableFields 的每一项
tableCreateInfo.value.tableFields.forEach((item: any) => {
// 在分类数据中查找对应 fieldName 的项
const classifyItem = classify.find((classify: any) => classify.fieldName === item.fieldName);
// 在分级数据中查找对应 fieldName 的项
const gradeItem = grade.find((grade: any) => grade.fieldName === item.fieldName);
// 如果找到对应的分类数据,赋值给 tableFields 的相应项
if (classifyItem) {
item.classifyDetailGuid = classifyItem.classifyDetailGuid || null;
item.classifyDetailName = classifyItem.classifyDetailName || null;
item.classifyDetailGuidRoutes = classifyItem.classifyDetailGuidRoutes || null;
item.classifyDetailNameRoutes = classifyItem.classifyDetailNameRoutes || null;
}
// 如果找到对应的分级数据,赋值给 tableFields 的相应项
if (gradeItem) {
item.gradeDetailGuid = gradeItem.gradeDetailGuid || null;
item.gradeDetailName = gradeItem.gradeDetailName || null;
}
});
} else {
ElMessage.error(res.msg);
}
});
}
const getGradeClassifyInfo = (params) => {
getFieldClassifyAndGrade(params).then((res: any) => {
if (res.code === proxy.$passCode) {
} else {
ElMessage.error(res.msg);
}
......@@ -1459,7 +1508,7 @@ const saveTable = async () => {
gradeDetailName: item.gradeDetailName,
guid: item.guid,
isFk: item.isFk,
notNull: item.isNotNull,
notNull: item.notNull,
isPrimary: item.isPrimary,
sortValue: item.sortValue,
tableChName: addInfo.chName,
......@@ -1487,7 +1536,8 @@ const saveTable = async () => {
if (res.code === proxy.$passCode) {
proxy.$ElMessage.success('保存成功!');
userStore.setTabbar(userStore.tabbar.filter((tab: any) => tab.fullPath !== fullPath));
router.push({ name: 'classifyGradeCatalogue', query: { reload: 'true' } });
localStorage.setItem('shouldReloadData', 'true');
router.push({ name: 'classifyGradeCatalogue' });
} else {
proxy.$ElMessage.error(res.msg);
}
......@@ -1583,7 +1633,7 @@ const saveDraftTable = async () => {
gradeDetailName: item.gradeDetailName,
guid: item.guid,
isFk: item.isFk,
isNotNull: item.isNotNull,
isNotNull: item.notNull,
isPrimary: item.isPrimary,
sortValue: item.sortValue,
tableChName: addInfo.chName,
......@@ -1610,7 +1660,8 @@ const saveDraftTable = async () => {
if (res.code === proxy.$passCode) {
proxy.$ElMessage.success('保存草稿成功!');
userStore.setTabbar(userStore.tabbar.filter((tab: any) => tab.fullPath !== fullPath));
router.push({ name: 'classifyGradeCatalogue', query: { reload: 'true' } });
localStorage.setItem('shouldReloadData', 'true');
router.push({ name: 'classifyGradeCatalogue' });
} else {
proxy.$ElMessage.error(res.msg);
}
......
......@@ -8,10 +8,14 @@ import { ElMessage, ElMessageBox } from "element-plus";
import Table from '@/components/Table/index.vue'
import TableTools from '@/components/Tools/table_tools.vue'
import {getAnalysisReportList,delAnalysisRepor,updateAnalysisRepor} from "@/api/modules/dataMetaService"
import { getImageContent } from "@/api/modules/queryService";
import Dialog from '@/components/Dialog/index.vue'
import { getDownloadUrl, download } from "@/utils/common";
import { useRouter } from 'vue-router';
import {
parseAndDecodeUrl,
getDownFileSignByUrl,
obsDownloadRequest
} from "@/api/modules/obsService";
const router = useRouter()
const page = ref({
limit: 50,
......@@ -119,20 +123,25 @@ const tableSearchItemList: any = ref([{
placeholder: '血缘关系名称',
clearable: true
}]);
const tableBtnClick = (scope, btn) => {
const tableBtnClick = async (scope, btn) => {
const type = btn.value;
let row = scope.row;
rowData.value = row
currTableData.value = row;
if (type == 'view') {
getImageContent(row.analysisReportUrl).then((res: any) => {
let fileName: string = parseAndDecodeUrl(row.analysisReportUrl).fileName;
const refSignInfo: any = await getDownFileSignByUrl(fileName);
if (!refSignInfo?.data) {
refSignInfo?.msg && ElMessage.error(refSignInfo?.msg);
return;
}
obsDownloadRequest(refSignInfo?.data).then((res: any) => {
if (res && !res.msg) {
let name = row.analysisReportUrl;
var fileSuffix = name ? name.substring(name.lastIndexOf('.') + 1) : '';
var fileSuffix = fileName ? fileName.substring(fileName.lastIndexOf('.') + 1) : '';
if (fileSuffix === 'png') { //浏览器可以支持图片和pdf预览
let fileUrl = getDownloadUrl(res, name, fileSuffix);
let win = window.open(fileUrl, name);
win && (win.document.title = name);
let fileUrl = <string>getDownloadUrl(res, name, fileSuffix);
let win = window.open(fileUrl, row.analysisReportName + fileSuffix);
win && (win.document.title = row.analysisReportName + fileSuffix);
} else {
download(res, row.analysisReportName, fileSuffix);
}
......@@ -141,10 +150,16 @@ const tableBtnClick = (scope, btn) => {
}
});
} else if (type == 'export') {
getImageContent(row.analysisReportUrl).then((res: any) => {
let fileName: string = parseAndDecodeUrl(row.analysisReportUrl).fileName;
const refSignInfo: any = await getDownFileSignByUrl(fileName);
if (!refSignInfo?.data) {
refSignInfo?.msg && ElMessage.error(refSignInfo?.msg);
return;
}
obsDownloadRequest(refSignInfo?.data).then((res: any) => {
if (res && !res.msg) {
let name = row.analysisReportUrl;
var fileSuffix = name ? name.substring(name.lastIndexOf('.') + 1) : '';
// let name = row.analysisReportUrl;
var fileSuffix = fileName ? fileName.substring(fileName.lastIndexOf('.') + 1) : '';
download(res, row.analysisReportName, fileSuffix);
} else {
res?.msg && ElMessage.error(res?.msg);
......
......@@ -22,7 +22,11 @@ import {
delLineAge,
checkTableData
} from '@/api/modules/dataMetaService';
import { getFileUrl } from "@/api/modules/queryService"
import {
parseAndDecodeUrl,
getUpFileSignByUrl,
obsUploadRequest
} from "@/api/modules/obsService";
import { useRouter, useRoute } from "vue-router";
import useDataMetaStore from "@/store/modules/dataMeta"
import { cloneDeep } from 'lodash-es'
......@@ -857,17 +861,23 @@ const pageSave = () => {
return
}
let formData = new FormData();
formData.append('file', file.value);
formData.append('fileName', `${analysisReportName}.png`);
getFileUrl(formData).then((res) => {
dialogInfo1.value.footer.btns[1].loading = true;
return getUpFileSignByUrl({ fileName: `${analysisReportName}.png` })
.then((res: any) => {
obsUploadRequest({
signedUrl: res.data.signedUrl,
file: file.value,
actualSignedRequestHeaders: res.data.actualSignedRequestHeaders
}).then(() => {
if (res.code == '00000') {
saveMetaReportAnalysis({
table: lastClickNode.value.tableName,
database: lastClickNode.value.databaseName,
analysisReportUrl: res.data,
analysisReportUrl: res.data?.signedUrl,
analysisReportName: analysisReportName,
databaseChName: lastClickNode.value.databaseChName
}).then((res: any) => {
dialogInfo1.value.footer.btns[1].loading = false;
if (res.code == proxy.$passCode) {
ElMessage({
type: "success",
......@@ -883,9 +893,19 @@ const pageSave = () => {
})
}
})
} else {
ElMessage({
type: "error",
message: res.msg,
appendTo: lineageGraph.value.containerRef
})
}
}).catch((res) => {
ElMessage.error(res.msg)
})
});
}).catch((res) => {
ElMessage.error(res.msg)
});
}
const formItems1: any = ref([
......@@ -933,7 +953,7 @@ const dialogInfo1 = ref({
footer: {
btns: [
{ type: "default", label: "取消", value: "cancel" },
{ type: "primary", label: "保存", value: "submit" },
{ type: "primary", label: "保存", value: "submit", loading: false },
],
},
});
......
......@@ -144,7 +144,7 @@ const getMetaChangeTableData = () => {
}
const activeTabName = ref('task');
const activeTabName = ref('meta');
watch(() => activeTabName.value, (val) => {
if(val==="task"){
......@@ -420,9 +420,7 @@ const metaChangeTableInfo = ref({
// { label: "状态", field: "changeTime", width: 180, },
// { label: "操作时间", field: "changeTime", width: 180, },
],
data: [{
guid: 1
}],
data: [],
page: {
type: "normal",
rows: 0,
......@@ -486,6 +484,7 @@ onBeforeMount(() => {
</div>
<div class="main_wrap">
<el-tabs v-model="activeTabName">
<!--
<el-tab-pane label="同步任务变更记录" name="task">
<div class="table_tool_wrap">
<TableTools :searchItems="tableSearchItemList" :init="false" searchId="detect-table-search"
......@@ -496,6 +495,7 @@ onBeforeMount(() => {
@tablePageChange="taskChangeTablePageChange" />
</div>
</el-tab-pane>
-->
<el-tab-pane label="元数据变更记录" name="meta">
<div class="table_tool_wrap">
<TableTools :searchItems="metaTableSearchItemList" :init="false" searchId="meta-detect-table-search"
......
......@@ -26,9 +26,13 @@ import {
saveMetaReportAnalysis,
checkTableData
} from '@/api/modules/dataMetaService';
import { getFileUrl } from "@/api/modules/queryService"
import useDataMetaStore from "@/store/modules/dataMeta"
import { TableColumnWidth } from '@/utils/enum';
import {
parseAndDecodeUrl,
getUpFileSignByUrl,
obsUploadRequest
} from "@/api/modules/obsService";
const { proxy } = getCurrentInstance() as any;
const router = useRouter();
......@@ -556,18 +560,24 @@ const pageSave = () => {
})
return
}
let formData = new FormData();
formData.append('file', file.value);
formData.append('fileName', `${analysisReportName}.png`);
console.log(formInline1.value.pageName)
getFileUrl(formData).then((res) => {
dialogInfo1.value.footer.btns[1].loading = true;
getUpFileSignByUrl({ fileName: `${analysisReportName}.png` })
.then((res: any) => {
obsUploadRequest({
signedUrl: res.data.signedUrl,
file: file.value,
actualSignedRequestHeaders: res.data.actualSignedRequestHeaders
}).then(() => {
if (res.code == '00000') {
saveMetaReportAnalysis({
table: sheetInfo.value.tableName,
database: sheetInfo.value.databaseName,
analysisReportUrl: res.data,
analysisReportUrl: res.data?.signedUrl,
analysisReportName: analysisReportName,
databaseChName: sheetInfo.value.databaseChName
}).then((res: any) => {
dialogInfo1.value.footer.btns[1].loading = false;
if (res.code == proxy.$passCode) {
// ElMessage.success("保存成功")
ElMessage({
......@@ -584,13 +594,19 @@ const pageSave = () => {
})
}
})
}).catch((res) => {
} else {
ElMessage({
type: "error",
message: res.msg,
appendTo: lineageGraph.value[0].containerRef
})
appendTo: lineageGraph.value.containerRef
})
}
}).catch((res) => {
ElMessage.error(res.msg)
});
}).catch((res) => {
ElMessage.error(res.msg)
});
}
const formItems1: any = ref([
......@@ -638,7 +654,7 @@ const dialogInfo1 = ref({
footer: {
btns: [
{ type: "default", label: "取消", value: "cancel" },
{ type: "primary", label: "保存", value: "submit" },
{ type: "primary", label: "保存", value: "submit", loading: false },
],
},
});
......
......@@ -16,6 +16,9 @@ import TableTools from "@/components/Tools/table_tools.vue";
import Table from "@/components/Table/index.vue";
import Dialog from "@/components/Dialog/index.vue";
import { getParamsList } from "@/api/modules/dataAsset";
import {
changeNum,
} from "@/utils/common";
const { proxy } = getCurrentInstance() as any;
const router = useRouter();
......@@ -212,7 +215,8 @@ const toPatn = (type) => {
router.push({
name: "productListingDetail",
query: {
type
type,
groundingPick: '门户数据专区'
},
});
} else {
......@@ -226,6 +230,17 @@ const toPatn = (type) => {
});
}
}
const toPatn1 = (type, type1) => {
if (type == 'add') {
router.push({
name: "productListingDetail",
query: {
type,
type1
},
});
}
}
const tablePageChange = (info) => {
page.value.curr = Number(info.curr);
......@@ -298,6 +313,16 @@ onBeforeMount(() => {
})
})
const defaultItemLogo = new URL('@/assets/images/home-finance-product.png', import.meta.url).href
const demandListData: any = ref([
{ companyName: '北数所', listedNum: 16, processNum: 1235 },
{ companyName: '深数所', listedNum: 16, processNum: 1235 },
{ companyName: '苏数所', listedNum: 16, processNum: 1235 },
]);
const btnClick = (btn) => {
}
</script>
<template>
......@@ -306,6 +331,32 @@ onBeforeMount(() => {
<TableTools :searchItems="searchItemList" :searchId="'data-source-search'" @search="toSearch" />
<div class="tools_btns">
<el-button type="primary" @click="toPatn('add')" v-preReClick>新建</el-button>
<el-button type="primary" @click="toPatn1('add', 'add1')" v-preReClick>新建</el-button>
</div>
</div>
<div class="list-content">
<div class="card-content" v-for="item in demandListData" :key="item.guid">
<div class="header">
<img class="left-img" :src="(item.picUrl && typeof item.picUrl == 'string') ? item.picUrl : defaultItemLogo"
alt="" />
<div class="right-main">
<div class="title">{{ item.companyName ?? '--' }}</div>
<div class="count-group">
<div class="count-item">
<div class="item-label">已上架产品数</div>
<div class="item-num">{{ changeNum(item.listedNum) }}</div>
</div>
<div class="count-item">
<div class="item-label">审批中产品数</div>
<div class="item-num">{{ changeNum(item.processNum) }}</div>
</div>
</div>
</div>
</div>
<div class="operator-btn">
<div class="left-btn borderRight" @click="btnClick(item)">更新模板</div>
<div class="left-btn" @click="btnClick(item)">资产登记</div>
</div>
</div>
</div>
<div class="table_panel_wrap">
......@@ -328,7 +379,87 @@ onBeforeMount(() => {
.table_panel_wrap {
width: 100%;
height: calc(100% - 84px);
height: calc(100% - 270px);
padding: 0px 8px 0;
}
.list-content {
display: flex;
justify-content: space-between;
flex-wrap: wrap;
margin-bottom: 8px;
padding: 0 8px;
.card-content {
width: calc(33.33% - 10px);
padding: 16px;
box-shadow: 0 0 0 1px #d9d9d9;
.header {
display: flex;
margin-bottom: 16px;
img {
width: 80px;
margin-right: 16px;
}
.title {
font-size: 16px;
color: #212121;
font-weight: 600;
margin-bottom: 8px;
}
.right-main {
width: calc(100% - 96px);
display: flex;
flex-direction: column;
justify-content: space-between;
.count-group {
display: flex;
justify-content: space-between;
.item-num {
font-size: 20px;
font-weight: 600;
color: #212121;
margin-top: 8px;
}
}
}
}
.operator-btn {
display: flex;
justify-content: space-between;
align-items: center;
box-shadow: 0 0 0 1px #d9d9d9;
position: relative;
&::after {
content: '';
width: 0;
height: 100%;
border-left: 1px solid #d9d9d9;
position: absolute;
left: 50%;
transform: translateX(-50%);
}
>.left-btn {
width: 50%;
height: 40px;
line-height: 40px;
text-align: center;
cursor: pointer;
&:hover {
color: #4fa1a4;
}
}
}
}
}
</style>
......
......@@ -15,7 +15,7 @@ import { changeNum } from '@/utils/common';
import { onUploadFilePreview, onUploadFileDownload } from '@/api/modules/common';
import { getAreaData, getServiceTenants } from "@/api/modules/queryService";
import { getApproveList, getTenantApprove, registerApproveAllow, registerApproveBackup, getParamsList, getServiceDetail } from "@/api/modules/dataAsset";
import { getProductList, getAddedProductList, getListingDetail, listingSave, listingUpdate, getParamsDataList } from "@/api/modules/dataProduct";
import { getProductList, getAddedProductList, getListingDetail, listingSave, listingUpdate, listingSavePortal, getParamsDataList } from "@/api/modules/dataProduct";
import { getMatchDetail } from "@/api/modules/dataFinance";
import { useValidator } from '@/hooks/useValidator';
......@@ -153,20 +153,31 @@ const formInfo = ref({
clearable: true,
required: true,
}, {
label: "产品类型",
label: "资产类型",
type: "select",
placeholder: "请选择",
field: "damType",
default: '',
options: damTypes.value,
props: {
value: 'paramValue',
label: 'paramName'
value: 'value',
label: 'label'
},
disabled: true,
required: true,
},
{
label: '证书编号',
type: 'input',
maxlength: 50,
placeholder: '请输入',
field: 'damCode',
default: '',
disabled: true,
required: true,
visible: true
},
{
label: "数据时间范围",
type: "date-picker",
field: "dateRange",
......@@ -194,16 +205,7 @@ const formInfo = ref({
// default: '',
// required: true
// },
// {
// label: '证书编号',
// type: 'input',
// maxlength: 50,
// placeholder: '请输入',
// field: 'damCode',
// default: '',
// disabled: true,
// required: true,
// },
{
label: '数据规模(条)',
type: 'input',
......@@ -212,7 +214,7 @@ const formInfo = ref({
maxlength: 19,
regexp: /\D/g,
default: '',
disabled: true,
disabled: false,
required: true
}, {
label: '病例总数(例)',
......@@ -220,7 +222,7 @@ const formInfo = ref({
placeholder: '请输入',
field: 'caseNumber',
default: '',
disabled: true,
disabled: false,
required: false
}, {
label: '数据覆盖地域',
......@@ -298,6 +300,7 @@ const formInfo = ref({
field: 'productPrice',
default: '',
disabled: false,
inputType: 'moneyNumber',
required: true
},
{
......@@ -360,25 +363,26 @@ const formInfo = ref({
// clearable: false,
// required: true,
// },
// {
// label: "上架交易所",
// type: "select",
// placeholder: "请选择",
// field: "exchangeGuids",
// default: [],
// options: exchangeList.value,
// props: {
// value: "guid",
// label: "tenantName",
// },
// filterable: true,
// clearable: true,
// multiple: true,
// tagsTooltip: true,
// collapse: true,
// disabled: false,
// required: true,
// },
{
label: "上架交易所",
type: "select",
placeholder: "请选择",
field: "exchangeGuids",
default: [],
options: exchangeList.value,
props: {
value: "guid",
label: "tenantName",
},
filterable: true,
clearable: true,
multiple: true,
tagsTooltip: true,
collapse: true,
disabled: false,
required: true,
visible: true
},
{
label: '产品描述',
type: 'textarea-rich',
......@@ -411,9 +415,125 @@ const formInfo = ref({
field: 'productImg',
default: [],
limit: 1,
block: false,
required: false,
},
{
label: '登记证',
tip: '支持扩展名:.jpg .png .jpeg',
accept: '.jpg, .png, .jpeg ',
type: 'upload-file',
placeholder: '请选择',
field: 'registerImg',
default: [],
limit: 1,
block: false,
required: false,
visible: true
},
{
label: '质量评估报告',
tip: '支持扩展名:.png .pdf',
accept: '.png, .pdf',
type: 'upload-file',
placeholder: '请选择',
field: 'qualityReport',
default: [],
limit: 1,
block: false,
required: false,
visible: true
},
{
label: "质量评估机构",
type: "select",
placeholder: "请选择",
field: "qualityOrg",
default: '',
options: [],
props: {
value: 'value',
label: 'label'
},
filterable: true,
clearable: true,
disabled: false,
required: true,
visible: true
},
{
label: '价值评估报告',
tip: '支持扩展名:.png .pdf',
accept: '.png, .pdf',
type: 'upload-file',
placeholder: '请选择',
field: 'valueReport',
default: [],
limit: 1,
block: false,
required: false,
visible: true
},
{
label: "价值评估机构",
type: "select",
placeholder: "请选择",
field: "valueOrg",
default: '',
options: [],
props: {
value: 'value',
label: 'label'
},
filterable: true,
clearable: true,
disabled: false,
required: true,
visible: true
},
{
label: '承诺函',
tip: '支持扩展名:.png .pdf',
accept: '.png, .pdf',
type: 'upload-file',
placeholder: '请选择',
field: 'commitment',
templateUrl: 'http://www.baidu.com',
default: [],
limit: 1,
block: true,
required: false,
}, {
visible: true
},
{
label: '授权文件',
tip: '支持扩展名:.png .pdf',
accept: '.png, .pdf',
type: 'upload-file',
placeholder: '请选择',
field: 'authorization',
templateUrl: 'http://www.baidu.com',
default: [],
limit: 1,
block: true,
required: false,
visible: true
},
{
label: '商品详细介绍(签章版)',
tip: '支持扩展名:.png .pdf',
accept: '.png, .pdf',
type: 'upload-file',
placeholder: '请选择',
field: 'productDetail',
templateUrl: 'http://www.baidu.com',
default: [],
limit: 1,
block: true,
required: false,
visible: true
},
{
label: "",
type: "input",
placeholder: "请输入",
......@@ -669,11 +789,17 @@ const submitForm = (btn, formEl, tosub = false) => {
// if (params.content) {
// params.productDesc = truncateHTML(params.content, 400);
// }
params.dataScale = formInfo.value.items.at(4).defaultValue;
params.caseNumber = formInfo.value.items.at(5).defaultValue;
console.log(params, formInfo.value.items.at(4).defaultValue, formInfo.value, '-----------------');
params.dataScale = formInfo.value.items.at(4).defaultValue || formInfo.value.items.at(4).default;
params.caseNumber = formInfo.value.items.at(5).defaultValue || formInfo.value.items.at(4).default;
params.timeAreaStart = params.dateRange ? params.dateRange[0] : '';
params.timeAreaEnd = params.dateRange ? params.dateRange[1] : '';
params.groundingPick = [route.query.groundingPick];
// 删除dateRange字段
delete params.dateRange;
flowDetailLoading.value = true;
if (detailType == 'add') {
listingSave(params).then((res: any) => {
listingSavePortal(params).then((res: any) => {
if (res.code == proxy.$passCode) {
ElMessage({
type: "success",
......@@ -996,6 +1122,14 @@ onActivated(() => {
};
})
onBeforeMount(() => {
if (route.query.type == 'add' && !route.query.type1) {
formInfo.value.items.forEach(item => {
if (item.field == 'damCode' || item.field == 'exchangeGuids' || item.field == 'registerImg' || item.field == 'qualityReport' || item.field == 'qualityOrg' || item.field == 'valueReport' || item.field == 'valueOrg' || item.field == 'commitment' || item.field == 'authorization' || item.field == 'productDetail') {
item.visible = false;
}
})
}
getParentAreaPromise.value = getAreaData({ parentId: null }).then((res: any) => {
if (res?.code == proxy.$passCode) {
parentAreaData.value = res.data ?? [];
......@@ -1009,7 +1143,7 @@ onBeforeMount(() => {
}
}
getApproveData();
getParamsDataList({ dictType: '字段类型' }).then((res: any) => {
getParamsDataList({ dictType: '资产类型' }).then((res: any) => {
if (res.code == proxy.$passCode) {
damTypes.value = res.data || [];
let item = formInfo.value.items.find(item => item.field == 'damType');
......@@ -1021,9 +1155,8 @@ onBeforeMount(() => {
getParamsDataList({ dictType: '交付方式' }).then((res: any) => {
if (res.code == proxy.$passCode) {
deliveryWayList.value = res.data || [];
// let item = formInfo.value.items.find(item => item.field == 'deliveryWay');
// item && (item.options = deliveryWayList.value);
formInfo.value.items[6].options = res.data || [];
let item = formInfo.value.items.find(item => item.field == 'deliveryWay');
item && (item.options = deliveryWayList.value);
} else {
proxy.$ElMessage.error(res.msg);
}
......@@ -1031,10 +1164,8 @@ onBeforeMount(() => {
getParamsDataList({ dictType: '定价方式' }).then((res: any) => {
if (res.code == proxy.$passCode) {
pricingMethodList.value = res.data || [];
formInfo.value.items[7].options = res.data || [];
// let item = formInfo.value.items.find(item => item.field == 'deliveryWay');
// item && (item.options = deliveryWayList.value);
// formInfo.value.items[7].options = res.data || [];
let item = formInfo.value.items.find(item => item.field == 'pricingWay');
item && (item.options = pricingMethodList.value);
} else {
proxy.$ElMessage.error(res.msg);
}
......@@ -1042,10 +1173,8 @@ onBeforeMount(() => {
getParamsDataList({ dictType: '价格单位' }).then((res: any) => {
if (res.code == proxy.$passCode) {
priceUnitList.value = res.data || [];
formInfo.value.items[9].options = res.data || [];
// let item = formInfo.value.items.find(item => item.field == 'deliveryWay');
// item && (item.options = deliveryWayList.value);
// formInfo.value.items[7].options = res.data || [];
let item = formInfo.value.items.find(item => item.field == 'priceUnit');
item && (item.options = priceUnitList.value);
} else {
proxy.$ElMessage.error(res.msg);
}
......
......@@ -238,12 +238,12 @@ const rulesDetailTableBtnClick = (scope, btn) => {
label: row.ruleName
}];
smallCategoryList.value = [{
paramValue: detailInfo.value.smallCategory,
paramName: row.smallCategory
value: detailInfo.value.smallCategory,
label: row.smallCategory
}];
largeCategoryList.value = [{
paramValue: detailInfo.value.largeCategory,
paramName: row.largeCategory
value: detailInfo.value.largeCategory,
label: row.largeCategory
}];
oneRulesDetailDialogVisible.value = true;
} else {
......@@ -268,12 +268,12 @@ const rulesDetailTableBtnClick = (scope, btn) => {
label: row.ruleName
}];
smallCategoryList.value = [{
paramValue: detailInfo.value.smallCategory,
paramName: row.smallCategory
value: detailInfo.value.smallCategory,
label: row.smallCategory
}];
largeCategoryList.value = [{
paramValue: detailInfo.value.largeCategory,
paramName: row.largeCategory
value: detailInfo.value.largeCategory,
label: row.largeCategory
}];
} else {
ElMessage.error(res.msg);
......
......@@ -328,6 +328,20 @@ onBeforeMount(() => {
});
onActivated(() => {
let tab: any = userStore.tabbar.find((tab: any) => tab.fullPath === fullPath);
if (tab) {
if (route.query.detail) {
tab.meta.title = `新建规则(${route.query.planName})`;
if (fullPath === route.fullPath) {
document.title = tab.meta.title;
}
} else if (route.query.planName) {
tab.meta.title = `方案编辑-${route.query.planName}`;
if (fullPath === route.fullPath) {
document.title = tab.meta.title;
}
}
}
if (modelGuid.value || groupGuid.value) {
return;
}
......
......@@ -255,10 +255,12 @@ const groupTableInfo = ref({
label: "操作",
type: "btn",
width: 92,
btns: [
{ label: "编辑", value: "edit" },
{ label: "删除", value: "delete" },
],
btns: (scope) => {
return [
{ label: "编辑", value: "edit", disabled: scope.row.dataSource != '5' },
{ label: "删除", value: "delete", disabled: scope.row.dataSource != '5' },
]
},
}
});
......@@ -402,7 +404,8 @@ const tableBtnClick = (scope, btn) => {
name: 'ruleTemplate',
query: {
modelGuid: row.guid,
name: row.name
name: row.name,
dataSource: row.dataSource
}
});
} else if (type == "delete") {
......@@ -429,9 +432,12 @@ const open = (msg, type, isBatch = false) => {
if (res.code == proxy.$passCode) {
page.value.curr = 1;
getTableData();
getQualityGroupTreeData();
nextTick(() => {
let node = qualityModelTreeRef.value.treeRef.store.nodesMap[currTableData.value.modelGroupGuid];
node.loaded = false;
node.expand();
})
ElMessage.success('删除成功');
} else {
ElMessage.error(res.msg);
......@@ -489,6 +495,7 @@ const groupTableBtnClick = (scope, btn) => {
type: "success",
message: "删除分组成功",
});
getQualityGroupTreeData();
} else {
ElMessage({
type: "error",
......@@ -594,7 +601,7 @@ const ruleTableBtnClick = (scope, btn) => {
}
});
} else if (type == "delete") {
ruleOpen("此操作将永久删除该质检, 是否继续?", "warning");
ruleOpen("此操作将永久删除该质检规则, 是否继续?", "warning");
}
};
......@@ -611,7 +618,7 @@ const ruleOpen = (msg, type, isBatch = false) => {
let node = qualityModelTreeRef.value.treeRef.store.nodesMap[lastSelectNode.value.data.guid];
node.loaded = false;
node.expand();
ElMessage.success('删除质检成功');
ElMessage.success('删除质检规则成功');
} else {
ElMessage.error(res.msg);
}
......@@ -639,7 +646,8 @@ const clickCreateTable = () => {
name: 'ruleModel',
query: {
groupGuid: page.value.modelGroupGuid,
name: lastSelectNode.value.data.name
name: lastSelectNode.value.data.name,
dataSource: lastSelectNode.value.data.dataSource
}
});
}
......@@ -650,7 +658,8 @@ const clickCreateRule = () => {
name: 'ruleTemplate',
query: {
modelGuid: lastSelectNode.value.data.guid,
name: lastSelectNode.value.data.name
name: lastSelectNode.value.data.name,
dataSource: lastSelectNode.value.parent.data.dataSource
}
});
}
......@@ -744,6 +753,7 @@ let editSubmitPromise: any = ref(null);
/** 新建分组对话框确定。 */
const dialogBtnClick = (btn, info) => {
if (btn.value == 'submit') {
info.dataSource = '5';
if (dialogInfo.value.type == 'add') {
if (submitPromise.value) {
return;
......@@ -753,6 +763,7 @@ const dialogBtnClick = (btn, info) => {
if (res.code == proxy.$passCode) {
groupPage.value.curr = 1;
getGroupTableData();
getQualityGroupTreeData();
ElMessage({
type: 'success',
message: '新建分组成功'
......@@ -779,6 +790,7 @@ const dialogBtnClick = (btn, info) => {
type: 'success',
message: '编辑分组成功'
})
getQualityGroupTreeData();
dialogInfo.value.visible = false;
} else {
ElMessage({
......@@ -862,8 +874,9 @@ onActivated(async () => {
if (lastSelectNode.value && lastSelectNode.value.data.guid == dataQualityStore.modelGroupGuid) {
getTableData();
}
let node = qualityModelTreeRef.value.treeRef.store.nodesMap[dataQualityStore.modelGroupGuid];
node?.expand();
// let node = qualityModelTreeRef.value.treeRef.store.nodesMap[dataQualityStore.modelGroupGuid];
// node?.expand();
getQualityGroupTreeData();
dataQualityStore.set(null);
});
} else {
......@@ -871,8 +884,11 @@ onActivated(async () => {
if (lastSelectNode.value && lastSelectNode.value.data.guid == dataQualityStore.modelGroupGuid) {
getTableData();
}
getQualityGroupTreeData();
nextTick(() => {
let node = qualityModelTreeRef.value.treeRef.store.nodesMap[dataQualityStore.modelGroupGuid];
node.expand();
})
dataQualityStore.set(null);
}
}
......@@ -908,7 +924,7 @@ onBeforeMount(() => {
d.label = d.ruleName;
d.value = d.ruleCode;
return d;
}) || [];
})?.filter(d => d.ruleCode != 'rows_check' && d.ruleCode != 'volatility_check') || [];
searchItemList.value[2].options = ruleTypeList.value;
} else {
ElMessage.error(res.msg);
......
......@@ -6,8 +6,12 @@ import {
getSubjectFields,
getSubjectTableTree,
getSubjectTableByDomain,
getCheckRulesList
getCheckRulesList,
getInventoryDsDir
} from '@/api/modules/dataQuality';
import {
getMetaTreeData
} from '@/api/modules/dataMetaService';
import Table from "@/components/Table/index.vue";
import Form from "@/components/Form/index.vue";
import { ElMessage } from "element-plus";
......@@ -48,7 +52,11 @@ const props = defineProps({
readonly: {
type: Boolean,
default: false
}
},
dataSource: {
type: String,
default: ''
},
});
watch(() => props.toSubjectTables, (val: any[]) => {
......@@ -135,18 +143,18 @@ const rulesListByType: any = computed(() => {
return {};
}
return {
char: checkRulesList.value.filter(r => r.paramValue == 'length_rule' || r.paramValue == 'ch_rule' || r.paramValue == 'en_rule' || r.paramValue == 'num_value_rule' || r.paramValue == 'custom_regular_rule'),
varchar: checkRulesList.value.filter(r => r.paramValue == 'length_rule' || r.paramValue == 'id_card_rule' || r.paramValue == 'phone_number_rule' || r.paramValue == 'ch_rule' || r.paramValue == 'en_rule' || r.paramValue == 'num_value_rule' || r.paramValue == 'custom_regular_rule'),
int: checkRulesList.value.filter(r => r.paramValue == 'length_rule' || r.paramValue == 'num_value_rule' || r.paramValue == 'custom_regular_rule'),
date: checkRulesList.value.filter(r => r.paramValue == 'date_format_rule' || r.paramValue == 'custom_regular_rule'),
datetime: checkRulesList.value.filter(r => r.paramValue == 'date_format_rule' || r.paramValue == 'custom_regular_rule'),
timestamp: checkRulesList.value.filter(r => r.paramValue == 'custom_regular_rule' || r.paramValue == 'custom_regular_rule'),
// text: checkRulesList.value.filter(r => r.paramValue == ''),
decimal: checkRulesList.value.filter(r => r.paramValue == 'length_rule' || r.paramValue == 'precision_rule' || r.paramValue == 'num_value_rule' || r.paramValue == 'custom_regular_rule'),
// json: checkRulesList.value.filter(r => r.paramValue == ''),
tinyint: checkRulesList.value.filter(r => r.paramValue == 'length_rule' || r.paramValue == 'num_value_rule' || r.paramValue == 'custom_regular_rule'),
time: checkRulesList.value.filter(r => r.paramValue == 'custom_regular_rule'),
bit: checkRulesList.value.filter(r => r.paramValue == 'ch_rule' || r.paramValue == 'en_rule' || r.paramValue == 'custom_regular_rule'),
char: checkRulesList.value.filter(r => r.value == 'length_rule' || r.value == 'ch_rule' || r.value == 'en_rule' || r.value == 'num_value_rule' || r.value == 'custom_regular_rule'),
varchar: checkRulesList.value.filter(r => r.value == 'length_rule' || r.value == 'id_card_rule' || r.value == 'phone_number_rule' || r.value == 'ch_rule' || r.value == 'en_rule' || r.value == 'num_value_rule' || r.value == 'custom_regular_rule'),
int: checkRulesList.value.filter(r => r.value == 'length_rule' || r.value == 'num_value_rule' || r.value == 'custom_regular_rule'),
date: checkRulesList.value.filter(r => r.value == 'length_rule' || r.value == 'date_format_rule' || r.value == 'custom_regular_rule'),
datetime: checkRulesList.value.filter(r => r.value == 'length_rule' || r.value == 'date_format_rule' || r.value == 'custom_regular_rule'),
timestamp: checkRulesList.value.filter(r => r.value == 'length_rule' || r.value == 'custom_regular_rule' || r.value == 'custom_regular_rule'),
// text: checkRulesList.value.filter(r => r.value == ''),
decimal: checkRulesList.value.filter(r => r.value == 'length_rule' || r.value == 'precision_rule' || r.value == 'num_value_rule' || r.value == 'custom_regular_rule'),
// json: checkRulesList.value.filter(r => r.value == ''),
tinyint: checkRulesList.value.filter(r => r.value == 'length_rule' || r.value == 'num_value_rule' || r.value == 'custom_regular_rule'),
time: checkRulesList.value.filter(r => r.value == 'length_rule' || r.value == 'custom_regular_rule'),
bit: checkRulesList.value.filter(r => r.value == 'length_rule' || r.value == 'ch_rule' || r.value == 'en_rule' || r.value == 'custom_regular_rule'),
}
});
......@@ -238,8 +246,8 @@ const panelList: any = ref([
default: '1',
options: props.largeCategoryList,
props: {
label: 'paramName',
value: 'paramValue'
label: 'label',
value: 'value'
},
required: true,
visible: true
......@@ -249,8 +257,8 @@ const panelList: any = ref([
placeholder: '请选择',
field: 'smallCategory',
props: {
label: 'paramName',
value: 'paramValue'
label: 'label',
value: 'value'
},
default: '',
options: props.smallCategoryList.slice(6),
......@@ -615,12 +623,52 @@ const submit = () => {
}
const getSubjectTableTreeData = () => {
return getSubjectTableTree({}).then((res: any) => {
if (props.dataSource == '4' || props.value.dataSource == '4') {
return getInventoryDsDir().then((res: any) => {
if (res.code == proxy.$passCode) {
contrastSubjects.value = res.data?.map(d => {
d.parentGuid = 0;
d.guid = d.databaseGuid;
d.name = d.databaseChName;
d.label = d.databaseChName + `(${d.database})`;
d.children = d.children?.map(child => {
child.parentGuid = d.guid;
child.label = child.tableChName + `(${child.tableName})`;
child.guid = child.tableGuid;
child.isLeaf = true;
child.dataServerName = d.database;
child.dataSourceGuid = d.databaseGuid;
child.parentGuid = d.databaseGuid;
return child;
})
return d;
}) || [];
}
})
} else {
return getMetaTreeData({ isImportCreate: 'N' }).then((res: any) => {
if (res.code == proxy.$passCode) {
contrastSubjects.value = res.data || [];
return res.data || [];
contrastSubjects.value = res.data?.children?.map(d => {
d.parentGuid = 0;
d.label = d.name;
d.children = d.children?.map(child => {
child.label = child.name + `(${child.tableName})`;
child.isLeaf = true;
child.dataServerName = d.name;
child.dataSourceGuid = d.guid;
return child;
})
return d;
}) || [];
}
})
}
// return getSubjectTableTree({}).then((res: any) => {
// if (res.code == proxy.$passCode) {
// contrastSubjects.value = res.data || [];
// return res.data || [];
// }
// })
}
const formBtnClick = (btn) => {
......@@ -633,7 +681,7 @@ const formBtnClick = (btn) => {
nullSelectFields.value = cloneDeep(panelList.value[index].defaultValue);
if (props.toSubjectTables[0]?.guid) {
nullTableInfo.value.loading = true;
getSubjectFields(props.toSubjectTables[0]?.guid).then((res: any) => {
getSubjectFields(props.toSubjectTables[0]?.guid, props.dataSource || props.value.dataSource).then((res: any) => {
nullTableInfo.value.loading = false;
if (res.code == proxy.$passCode) {
nullTableInfo.value.data = res.data || [];
......@@ -673,7 +721,7 @@ const formBtnClick = (btn) => {
tableInfo.value.data = [];
if (props.toSubjectTables[0]?.guid) {
tableInfo.value.loading = true;
getSubjectFields(props.toSubjectTables[0]?.guid).then((res: any) => {
getSubjectFields(props.toSubjectTables[0]?.guid, props.dataSource || props.value.dataSource).then((res: any) => {
tableInfo.value.loading = false;
if (res.code == proxy.$passCode) {
tableInfo.value.data = res.data || [];
......@@ -704,7 +752,7 @@ const formBtnClick = (btn) => {
sqlTableFieldInfo.value.data = [];
if (props.toSubjectTables[0]?.guid) {
sqlTableFieldInfo.value.loading = true;
getSubjectFields(props.toSubjectTables[0]?.guid).then((res: any) => {
getSubjectFields(props.toSubjectTables[0]?.guid, props.dataSource || props.value.dataSource).then((res: any) => {
sqlTableFieldInfo.value.loading = false;
if (res.code == proxy.$passCode) {
sqlTableFieldInfo.value.data = res.data || [];
......@@ -734,7 +782,7 @@ const formBtnClick = (btn) => {
valueRangeTableListData.value[dialogSelectSubjectTable.value.enName] = [];
if (props.toSubjectTables[0]?.guid) {
valueRangeTableListLoading.value[dialogSelectSubjectTable.value.enName] = true;
getSubjectFields(props.toSubjectTables[0]?.guid).then((res: any) => {
getSubjectFields(props.toSubjectTables[0]?.guid, props.dataSource || props.value.dataSource).then((res: any) => {
valueRangeTableListLoading.value[dialogSelectSubjectTable.value.enName] = false;
if (res.code == proxy.$passCode) {
let data = res.data || [];
......@@ -792,7 +840,7 @@ const formBtnClick = (btn) => {
normCheckTableListData.value[dialogSelectSubjectTable.value.enName] = [];
if (props.toSubjectTables[0]?.guid) {
normCheckTableListLoading.value[dialogSelectSubjectTable.value.enName] = true;
getSubjectFields(props.toSubjectTables[0]?.guid).then((res: any) => {
getSubjectFields(props.toSubjectTables[0]?.guid, props.dataSource || props.value.dataSource).then((res: any) => {
normCheckTableListLoading.value[dialogSelectSubjectTable.value.enName] = false;
if (res.code == proxy.$passCode) {
let data = res.data || [];
......@@ -1006,7 +1054,7 @@ const setPanelListValue = (item, isSelectChange = false, init = false, radioGrou
}
}
if (isSelectChange) {
val['smallCategory'] = panelList.value[2].options[0]?.paramValue;
val['smallCategory'] = panelList.value[2].options[0]?.value;
} else if (!val['smallCategory']) {
val['smallCategory'] = getDefaultSmallCategory(formItems.value[0].default);
} else if (radioGroupChange && !init) {//切换规则类型。
......@@ -1017,7 +1065,6 @@ const setPanelListValue = (item, isSelectChange = false, init = false, radioGrou
}
});
formItems.value[0].children = panelList.value;
console.log(panelList.value);
}
const radioGroupChange = (val, inlineValue, init) => {
......@@ -1099,7 +1146,7 @@ const listItemClick = (data) => {
if (ruleType.value === 'custom_sql') {
sqlTableFilters.value[dialogSelectSubjectTable.value.enName] = sqlTableFilters.value[dialogSelectSubjectTable.value.enName] || "";
sqlTableFieldInfo.value.loading = true;
getSubjectFields(data.guid).then((res: any) => {
getSubjectFields(data.guid, props.dataSource || props.value.dataSource).then((res: any) => {
sqlTableFieldInfo.value.loading = false;
if (res.code == proxy.$passCode) {
sqlTableFieldInfo.value.data = res.data || [];
......@@ -1110,7 +1157,7 @@ const listItemClick = (data) => {
} else if (ruleType.value === 'logic_check') {
tableFilters.value[dialogSelectSubjectTable.value.enName] = tableFilters.value[dialogSelectSubjectTable.value.enName] || "";
tableInfo.value.loading = true;
getSubjectFields(data.guid).then((res: any) => {
getSubjectFields(data.guid, props.dataSource || props.value.dataSource).then((res: any) => {
tableInfo.value.loading = false;
if (res.code == proxy.$passCode) {
tableInfo.value.data = res.data || [];
......@@ -1120,7 +1167,7 @@ const listItemClick = (data) => {
})
} else if (ruleType.value == 'null_value_check' || ruleType.value == 'repeate_data_check') {
nullTableInfo.value.loading = true;
getSubjectFields(data.guid).then((res: any) => {
getSubjectFields(data.guid, props.dataSource || props.value.dataSource).then((res: any) => {
nullTableInfo.value.loading = false;
if (res.code == proxy.$passCode) {
nullTableInfo.value.data = res.data || [];
......@@ -1143,7 +1190,7 @@ const listItemClick = (data) => {
}
let defaultValue = panelList.value[12].defaultValue;
valueRangeTableListLoading.value[dialogSelectSubjectTable.value.enName] = true;
getSubjectFields(data.guid).then((res: any) => {
getSubjectFields(data.guid, props.dataSource || props.value.dataSource).then((res: any) => {
valueRangeTableListLoading.value[dialogSelectSubjectTable.value.enName] = false;
if (res.code == proxy.$passCode) {
let data = res.data || [];
......@@ -1178,7 +1225,7 @@ const listItemClick = (data) => {
}
let defaultValue = panelList.value[14].defaultValue;
normCheckTableListLoading.value[dialogSelectSubjectTable.value.enName] = true;
getSubjectFields(data.guid).then((res: any) => {
getSubjectFields(data.guid, props.dataSource || props.value.dataSource).then((res: any) => {
normCheckTableListLoading.value[dialogSelectSubjectTable.value.enName] = false;
if (res.code == proxy.$passCode) {
let data = res.data || [];
......@@ -1226,7 +1273,7 @@ const tableInfo: any = ref({
fields: [
{ label: "字段名", field: "enName", width: 140, type: 'text_btn', value: 'enName', columClass: 'text_btn' },
{ label: "注释", field: "chName", width: 120 },
{ label: "数据类型", field: "dataTypeChName", width: 100 },
{ label: "数据类型", field: "dataTypeName", width: 100 },
],
data: [],
showPage: false,
......@@ -1440,7 +1487,7 @@ const sqlTableFieldInfo: any = ref({
fields: [
{ label: "字段名", field: "enName", width: 140, type: 'text_btn', value: 'enName', columClass: 'text_btn' },
{ label: "注释", field: "chName", width: 120 },
{ label: "数据类型", field: "dataTypeChName", width: 100 },
{ label: "数据类型", field: "dataTypeName", width: 100 },
],
data: [],
showPage: false,
......@@ -1584,7 +1631,7 @@ const nullTableInfo: any = ref({
fields: [
{ label: "字段名", field: "enName", width: 140 },
{ label: "注释", field: "chName", width: 120 },
{ label: "数据类型", field: "dataTypeChName", width: 100 },
{ label: "数据类型", field: "dataTypeName", width: 100 },
],
data: [],
showPage: false,
......@@ -1680,7 +1727,7 @@ const getSubjectTableByDomainData = (guid) => {
}
const defaultExpandedKeys = computed(() => {
return props.value && contrastSubjects.value?.length ? [contrastSubjects.value.find(c => c.children?.some(cc => cc.guid == props.value.contrastSubjectDomainGuid)).guid, props.value.contrastSubjectDomainGuid] : [];
return props.value && contrastSubjects.value?.length ? [props.value.contrastSubjectDomainGuid] : [];
})
const contrastSubjectInputFilterMethod = (v, data) => {
......@@ -1731,14 +1778,14 @@ const submitValueRange = () => {
let valueTableFields = valueRangeTableListData.value[table];
let ruleFields: any = []
for (const field of valueTableFields) {
if (field.startValue != null && field.endValue == null || (field.endValue != null && field.startValue == null)) {
if (field.startValue == null && field.endValue == null) {
if (dialogSelectSubjectTable.value.enName != table) {
valueCheckFormListRef.value.setSelectList(table, 'enName');
}
ElMessage.error(`表【${table}】的字段【${field.enName}】设置了值域,但范围未填写完整`);
return;
}
if (field.startValue) {
if (field.startValue != null || field.endValue != null) {
ruleFields.push(field);
} else if (field.dataRange) {
ruleFields.push(field);
......@@ -1788,7 +1835,7 @@ const compareTableFields = ref({}); //选择对比表对应的字段列表
/** 主表下拉选择变化 */
const tableInteMainSelectChange = (val) => {
mainTableFields.value[val] = [];
getSubjectFields(val).then((res: any) => {
getSubjectFields(val, props.dataSource || props.value.dataSource).then((res: any) => {
if (res.code == proxy.$passCode) {
mainTableFields.value[val] = res.data?.map(d => {
return Object.assign({}, d, {
......@@ -1804,7 +1851,7 @@ const tableInteMainSelectChange = (val) => {
/** 对比表下拉选择变化 */
const tableInteCompareSelectChange = (val) => {
compareTableFields.value[val] = [];
getSubjectFields(val).then((res: any) => {
getSubjectFields(val, props.dataSource || props.value.dataSource).then((res: any) => {
if (res.code == proxy.$passCode) {
compareTableFields.value[val] = res.data?.map(d => {
return Object.assign({}, d, {
......@@ -2165,26 +2212,23 @@ defineExpose({
</el-table-column>
<el-table-column prop="chName" label="注释" width="120px" align="left" show-overflow-tooltip>
</el-table-column>
<el-table-column prop="dataTypeChName" label="数据类型" width="100px" show-overflow-tooltip>
<el-table-column prop="dataTypeName" label="数据类型" width="100px" show-overflow-tooltip>
<template #default="scope">
<span>{{ scope.row["dataTypeChName"] || '--' }}</span>
<span>{{ scope.row["dataTypeName"] || '--' }}</span>
</template>
</el-table-column>
<el-table-column label="值域" width="280px" align="left" fixed="right">
<template #default="scope">
<span
v-if="scope.row.dataType == 'json' || scope.row.dataType == 'text' || !scope.row.dataType || scope.row.dataType == 'string'">--</span>
<template v-else>
<el-input
v-show="scope.row.dataType == 'varchar' || scope.row.dataType == 'char' || scope.row.dataType == 'bit'"
v-show="!scope.row.dataType || scope.row.dataType == 'varchar' || scope.row.dataType == 'char' || scope.row.dataType == 'bit' || scope.row.dataType == 'json' || scope.row.dataType == 'text' || !scope.row.dataType || scope.row.dataType == 'string' || scope.row.dataType == 'numeric'"
v-model.trim="scope.row.dataRange" clearable placeholder="多值按照分号;分隔"> </el-input>
<div class="range-sum" v-show="scope.row.dataType == 'datetime' || scope.row.dataType == 'date'">
<!-- <div class="range-sum" v-show="scope.row.dataType == 'datetime' || scope.row.dataType == 'date'">
<el-date-picker v-model="scope.row.dateValueRange" type="daterange" range-separator="至"
start-placeholder="开始日期" end-placeholder="结束日期" format="YYYY-MM-DD" value-format="YYYY-MM-DD"
:unlink-panels="false" :disabled="props.readonly" />
</div>
</div> -->
<div class="range-sum"
v-show="scope.row.dataType == 'int' || scope.row.dataType == 'decimal' || scope.row.dataType == 'tinyint' || scope.row.dataType == 'timestamp' || scope.row.dataType == 'time'">
v-show="scope.row.dataType == 'datetime' || scope.row.dataType == 'date' || scope.row.dataType == 'int' || scope.row.dataType == 'decimal' || scope.row.dataType == 'tinyint' || scope.row.dataType == 'timestamp' || scope.row.dataType == 'time'">
<el-input :disabled="props.readonly" v-model.trim="scope.row.startValue" placeholder="请输入" clearable>
</el-input>
<span class="text"></span>
......@@ -2192,7 +2236,6 @@ defineExpose({
</el-input>
</div>
</template>
</template>
</el-table-column>
</el-table>
</div>
......@@ -2236,12 +2279,12 @@ defineExpose({
<template #default="scope">
<el-tree-select v-if="!props.readonly" ref="compareTreeSelectRef" filterable clearable
@change="tableInteCompareSelectChange" v-model="scope.row['compareTableGuid']" node-key="guid"
:data="contrastSubjects" placeholder="请选择" lazy :load="(node, resolve) => treeSelectLoad(node, resolve)"
:default-expanded-keys="contrastSubjects?.length ? [contrastSubjects.find(c => c.children?.some(cc => cc.guid == scope.row['compareSubjectDomainGuid'])).guid, scope.row.compareSubjectDomainGuid] : []"
:data="contrastSubjects" placeholder="请选择"
:default-expanded-keys="contrastSubjects?.length ? [scope.row.compareSubjectDomainGuid] : []"
:auto-expand-parent="true" :default-checked-keys="[scope.row['compareTableGuid']]"
:filter-node-method="contrastSubjectInputFilterMethod" :props="{
value: 'guid',
label: 'name',
label: 'label',
children: 'children',
isLeaf: 'isLeaf'
}">
......@@ -2297,17 +2340,17 @@ defineExpose({
</el-table-column>
<el-table-column prop="chName" label="注释" width="120px" align="left" show-overflow-tooltip>
</el-table-column>
<el-table-column prop="dataTypeChName" label="数据类型" width="100px" show-overflow-tooltip>
<el-table-column prop="dataTypeName" label="数据类型" width="100px" show-overflow-tooltip>
<template #default="scope">
<span>{{ scope.row["dataTypeChName"] || '--' }}</span>
<span>{{ scope.row["dataTypeName"] || '--' }}</span>
</template>
</el-table-column>
<el-table-column prop="checkRule" label="选择检验规则" width="150px" align="left" show-overflow-tooltip>
<template #default="scope">
<el-select v-if="!props.readonly || (scope.row.dataType == 'text' || scope.row.dataType == 'json')"
v-model="scope.row['checkRule']" placeholder="请选择" filterable clearable>
<el-option v-for="opt in rulesListByType[scope.row.dataType]" :key="opt['paramValue']"
:label="opt['paramName']" :value="opt['paramValue']" />
<el-option v-for="opt in (rulesListByType[scope.row.dataType] || checkRulesList)" :key="opt['value']"
:label="opt['label']" :value="opt['value']" />
</el-select>
<span v-else>{{ scope.row.checkRuleName ?? '--' }}</span>
</template>
......@@ -2378,8 +2421,7 @@ defineExpose({
<el-table-column prop="contrastSubjectGuid" label="选择对比表" width="200px" align="left" show-overflow-tooltip>
<template #default="scope">
<el-tree-select v-if="!props.readonly" ref="treeSelectRef" filterable clearable
v-model="scope.row['contrastSubjectGuid']" node-key="guid" :data="contrastSubjects" placeholder="请选择" lazy
:load="(node, resolve) => treeSelectLoad(node, resolve)" :default-expanded-keys="defaultExpandedKeys"
v-model="scope.row['contrastSubjectGuid']" node-key="guid" :data="contrastSubjects" placeholder="请选择" :default-expanded-keys="defaultExpandedKeys"
:auto-expand-parent="true" :default-checked-keys="[props.value.contrastSubjectGuid]"
:filter-node-method="contrastSubjectInputFilterMethod" :props="{
value: 'guid',
......
......@@ -9,13 +9,16 @@ import { ElMessage, ElMessageBox } from "element-plus";
import StepBar from "@/components/StepBar/index.vue";
import TreeTransfer from "@/components/TreeTransfer/index.vue";
import {
getSubjectTableTree,
getInventoryDsDir,
getSubjectTableByDomain,
saveQualityTable,
getRuleTypeList,
getSmallCategoryList,
getLargeCategoryList,
} from '@/api/modules/dataQuality';
import {
getMetaTreeData
} from '@/api/modules/dataMetaService';
import ruleForm from "../data_quality/ruleForm.vue";
import useUserStore from "@/store/modules/user";
import useDataQualityStore from "@/store/modules/dataQuality";
......@@ -60,15 +63,46 @@ const toSubjectTables: any = ref([]);
const getSubjectTableTreeData = () => {
dsFromTreeDataLoading.value = true;
getSubjectTableTree({}).then((res: any) => {
if (route.query.dataSource == '4') {
getInventoryDsDir().then((res: any) => {
dsFromTreeDataLoading.value = false;
if (res.code == proxy.$passCode) {
dsFromTreeData.value = res.data?.map(d => {
d.parentGuid = 0;
d.guid = d.databaseGuid;
d.name = d.databaseChName;
d.label = d.databaseChName + `(${d.database})`;
d.children = d.children?.map(child => {
child.parentGuid = d.guid;
child.label = child.tableChName + `(${child.tableName})`;
child.guid = child.tableGuid;
child.dataServerName = d.database;
child.dataSourceGuid = d.databaseGuid;
child.parentGuid = d.databaseGuid;
return child;
})
return d;
}) || [];
}
})
} else {
getMetaTreeData({ isImportCreate: 'N' }).then((res: any) => {
dsFromTreeDataLoading.value = false;
if (res.code == proxy.$passCode) {
dsFromTreeData.value = res.data?.children?.map(d => {
d.parentGuid = 0;
d.label = d.name;
d.children = d.children?.map(child => {
child.label = child.name + `(${child.tableName})`;
child.dataServerName = d.name;
child.dataSourceGuid = d.guid;
return child;
})
return d;
}) || [];
}
})
}
}
const getSubjectTableByDomainData = (guid) => {
......@@ -124,7 +158,7 @@ onBeforeMount(() => {
d.label = d.ruleName;
d.value = d.ruleCode;
return d;
}) || [];
})?.filter(d => d.ruleCode != 'rows_check' && d.ruleCode != 'volatility_check') || [];
} else {
ElMessage.error(res.msg);
}
......@@ -155,12 +189,14 @@ const changeStep = (val, skip = false) => {
}
toSubjectTables.value = [];
dsToTreeData.value.forEach(d => {
d.children.forEach(c => {
c.children.forEach(child => {
child.label = `${child.enName}(${child.chName})`;
d.children.forEach(child => {
child.guid = child.tableGuid || child.guid;
child.enName = child.tableName;
child.chName = child.tableChName || child.name;
child.dataSourceGuid = child.parentGuid;
child.databaseName = child.databaseName,
toSubjectTables.value.push(child);
})
})
});
step.value = val - 1;
stepsInfo.value.step = val - 1
......@@ -208,6 +244,7 @@ const transformRulesInfo = (info: any) => {
subjectGuid: tableInfo.guid,
dataSourceGuid: tableInfo.dataSourceGuid,
databaseName: tableInfo.dataServerName,
dataSource: route.query.dataSource ? parseInt(<string>route.query.dataSource) : null,
modelRuleConfList: [Object.assign({}, info, {
qualityModelGuid: modelGuid
})]
......@@ -226,6 +263,7 @@ const transformRulesInfo = (info: any) => {
subjectGuid: tableInfo.guid,
dataSourceGuid: tableInfo.dataSourceGuid,
databaseName: tableInfo.dataServerName,
dataSource: route.query.dataSource ? parseInt(<string>route.query.dataSource) : null,
modelRuleConfList: [Object.assign({}, info, {
ruleField: fields?.map(f => {
return {
......@@ -249,6 +287,7 @@ const transformRulesInfo = (info: any) => {
subjectGuid: tableInfo.guid,
dataSourceGuid: tableInfo.dataSourceGuid,
databaseName: tableInfo.dataServerName,
dataSource: route.query.dataSource ? parseInt(<string>route.query.dataSource) : null,
modelRuleConfList: [Object.assign({}, info, {
ruleField: [{
guid: fields.guid,
......@@ -273,6 +312,7 @@ const transformRulesInfo = (info: any) => {
subjectGuid: tableInfo.guid,
dataSourceGuid: tableInfo.dataSourceGuid,
databaseName: tableInfo.dataServerName,
dataSource: route.query.dataSource ? parseInt(<string>route.query.dataSource) : null,
modelRuleConfList: [Object.assign({}, info, {
ruleField: fields?.map(f => {
return {
......@@ -297,6 +337,7 @@ const transformRulesInfo = (info: any) => {
subjectGuid: tableInfo.guid,
dataSourceGuid: tableInfo.dataSourceGuid,
databaseName: tableInfo.dataServerName,
dataSource: route.query.dataSource ? parseInt(<string>route.query.dataSource) : null,
modelRuleConfList: [Object.assign({}, info, {
differenceRange: row.differenceRange,
rows: [],
......@@ -316,6 +357,7 @@ const transformRulesInfo = (info: any) => {
subjectGuid: tableInfo.guid,
dataSourceGuid: tableInfo.dataSourceGuid,
databaseName: tableInfo.dataServerName,
dataSource: route.query.dataSource ? parseInt(<string>route.query.dataSource) : null,
modelRuleConfList: [Object.assign({}, info, {
ruleField: fields.map(f => {
return {
......@@ -344,6 +386,7 @@ const transformRulesInfo = (info: any) => {
subjectGuid: tableInfo.guid,
dataSourceGuid: tableInfo.dataSourceGuid,
databaseName: tableInfo.dataServerName,
dataSource: route.query.dataSource ? parseInt(<string>route.query.dataSource) : null,
modelRuleConfList: [Object.assign({}, info, {
ruleField: fields.map(f => {
return {
......@@ -379,11 +422,19 @@ const transformRulesInfo = (info: any) => {
subjectGuid: tableInfo.guid,
dataSourceGuid: tableInfo.dataSourceGuid,
databaseName: tableInfo.dataServerName,
dataSource: route.query.dataSource ? parseInt(<string>route.query.dataSource) : null,
modelRuleConfList: [Object.assign({}, info, {
ruleField: info.ruleFields.map(row => {
return {
// guid: row.mainTable,
enName: row.mainTableField,
//chName: row.chName,
compareTableGuid: row.compareTableGuid,
compareTableName: row.compareTableName,
compareEnName: row.compareEnName
}
}),
ruleFields: ''
})]
}));
}
......@@ -428,18 +479,18 @@ const save = () => {
<div class="operator_panel is-block">
<div class="panel_title">
<div class="title_text">
<span>选择主题表</span>
<span class="tips_text">选择需要添加质检规则的主题表</span>
<span>选择表</span>
<span class="tips_text">{{ route.query.dataSource == '5' ?
'选择需要添加质检规则的表,请确保数据库为脱产环境,避免数据质检影响您的生产环境,且允许在该脱产环境建脏数据的库,请知晓!' : '选择需要添加质检规则的表' }}</span>
</div>
</div>
<TreeTransfer mode="transfer" :title="['主题表', '已选表']" pid="parentGuid"
:from-tree-data-loading="dsFromTreeDataLoading" :lazy="true" :checkOnClickNode="true"
<TreeTransfer mode="transfer" :title="[route.query.dataSource == '5' ? '可选元数据目录表' : '可选盘点数据库目录表', '已选表']"
pid="parentGuid" :from-tree-data-loading="dsFromTreeDataLoading" :checkOnClickNode="true"
:from_checked_all="false" :from_data="dsFromTreeData" :to_data="dsToTreeData" node_key="guid"
:transferOpenNode="true" width="70%" :defaultProps="{
label: 'name',
label: 'label',
value: 'guid'
}" :lazyFn="handleSubjectTableLazyFn" @left-check-change="handleSubjectCheckedChange"
height="calc(100% - 64px)">
}" height="calc(100% - 64px)">
</TreeTransfer>
</div>
</div>
......@@ -454,7 +505,8 @@ const save = () => {
<div class="panel_content">
<div class="form_panel">
<ruleForm ref="ruleFormRef" :toSubjectTables="toSubjectTables" :ruleTypeList="ruleTypeList"
:largeCategoryList="largeCategoryList" :smallCategoryList="smallCategoryList"></ruleForm>
:data-source="route.query.dataSource as string" :largeCategoryList="largeCategoryList"
:smallCategoryList="smallCategoryList"></ruleForm>
</div>
</div>
</div>
......
......@@ -241,7 +241,7 @@ onBeforeMount(() => {
d.label = d.ruleName;
d.value = d.ruleCode;
return d;
}) || [];
})?.filter(d => d.ruleCode != 'rows_check' && d.ruleCode != 'volatility_check') || [];
} else {
ElMessage.error(res.msg);
}
......@@ -262,6 +262,16 @@ onBeforeMount(() => {
})
})
onActivated(() => {
let tab: any = userStore.tabbar.find((tab: any) => tab.fullPath === fullPath);
if (tab && detailInfo.value?.ruleConfName) {
tab.meta.title = `编辑-${detailInfo.value.ruleConfName}(${detailInfo.value.subjectZhName})`
if (fullPath === route.fullPath) {
document.title = tab.meta.title;
}
}
});
</script>
<template>
......
......@@ -204,15 +204,14 @@ const save = () => {
subjectGuid: modelDetailInfo.value.subjectGuid,
subjectName: modelDetailInfo.value.subjectName,
dataSourceGuid: modelDetailInfo.value.dataSourceGuid,
modelRuleConfList: submitInfos
modelRuleConfList: submitInfos,
dataSource: route.query.dataSource ? parseInt(<string>route.query.dataSource) : null,
}]).then((res: any) => {
fullScreenLoading.value = false;
if (res.code == proxy.$passCode) {
ElMessage.success('新建规则保存成功');
router.push({
name: 'qualityRules'
});
userStore.setTabbar(userStore.tabbar.filter((tab: any) => tab.fullPath !== fullPath));
router.go(-1);
dataQualityStore.setModelGuid(modelGuid);
} else {
ElMessage.error(res.msg);
......@@ -249,7 +248,7 @@ onBeforeMount(() => {
d.label = d.ruleName;
d.value = d.ruleCode;
return d;
}) || [];
})?.filter(d => d.ruleCode != 'rows_check' && d.ruleCode != 'volatility_check') || []; //先隐藏掉表行数检查和表行数波动率
} else {
ElMessage.error(res.msg);
}
......@@ -270,6 +269,16 @@ onBeforeMount(() => {
})
})
onActivated(() => {
let tab: any = userStore.tabbar.find((tab: any) => tab.fullPath === fullPath);
if (tab && route.query.name) {
tab.meta.title = `新建规则(${route.query.name})`;
if (fullPath === route.fullPath) {
document.title = tab.meta.title;
}
}
});
const cancel = () => {
ElMessageBox.confirm(
"当前页面尚未保存,确定放弃修改吗?",
......@@ -317,7 +326,7 @@ const cancel = () => {
</div>
<div class="panel_content" v-show="item.open">
<div class="form_panel">
<ruleForm ref="ruleFormRef" :toSubjectTables="toSubjectTables" :ruleTypeList="ruleTypeList"
<ruleForm ref="ruleFormRef" :toSubjectTables="toSubjectTables" :ruleTypeList="ruleTypeList" :dataSource="route.query.dataSource as string"
:largeCategoryList="largeCategoryList" :smallCategoryList="smallCategoryList" :isSingle="true">
</ruleForm>
</div>
......
......@@ -221,7 +221,7 @@ const tableBtnClick = async (scope, btn) => {
const row = scope.row;
currTableData.value = row;
if (type == "export_file") {
const refSignInfo: any = await getDownFileSignByUrl(parseAndDecodeUrl(row.filePath).decodedPath);
const refSignInfo: any = await getDownFileSignByUrl(parseAndDecodeUrl(row.filePath).fileName);
if (!refSignInfo?.data) {
refSignInfo?.msg && ElMessage.error(refSignInfo?.msg);
return;
......@@ -236,7 +236,7 @@ const tableBtnClick = async (scope, btn) => {
//downFile(row.filePath, row.fileName)
} else if (type == 'export_abnormal_data') {
//downFile(row.errorFilePath, '')
const refSignInfo: any = await getDownFileSignByUrl(parseAndDecodeUrl(row.errorFilePath).decodedPath);
const refSignInfo: any = await getDownFileSignByUrl(parseAndDecodeUrl(row.errorFilePath).fileName);
if (!refSignInfo?.data) {
refSignInfo?.msg && ElMessage.error(refSignInfo?.msg);
return;
......
Styling with Markdown is supported
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!