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>
......
......@@ -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>
......
......@@ -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);
......
......@@ -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!