960ee981 by lihua

可信空间页面;产品目录上传交付物

1 parent 5ea29ddf
......@@ -27,7 +27,7 @@ const mainSidebarActualWidth = computed(() => {
// 侧边栏次导航当前实际宽度
const subSidebarActualWidth = computed(() => {
let actualWidth = parseInt(getComputedStyle(document.documentElement).getPropertyValue('--g-sub-sidebar-width'))
if (settingsStore.settings.menu.subMenuCollapse || route.path == '/data-asset-index') {
if (settingsStore.settings.menu.subMenuCollapse || route.path == '/data-asset-index' || route.path == '/trusted-space-index' || route.path == '/down-delivery-file') {
actualWidth = 0
}
return `${actualWidth}px`
......
......@@ -207,7 +207,7 @@ export const getCertificateDetail = (params) => request({
/** 获取登记证件管理的资产列表 */
export const getRegisterSelectList = () => request({
url: `${import.meta.env.VITE_API_NEW_PORTAL}/register-base/register-select`,
url: `${import.meta.env.VITE_API_NEW_PORTAL}/register-document/document-select`,
method: 'get'
})
......@@ -510,6 +510,14 @@ export const getApiInvokeCount = (data) => request({
data
})
/** 获取当前用户接收方和合同信息接口 */
export const getDataReceiveContract = () => request({
// url:`${import.meta.env.VITE_APP_SERVICE_BASEURL}/api-base-info/detail`,
// url: `http://localhost:9000/circulation/ms-data-circulation-portal-service/enterprise/detail-by-name`,
// url: `http://localhost:9000/delivery/ms-daop-jgjf-data-open-service/api-base-info/detail/${params}`,
url: `https://daop-lt-test.zgsjzc.com/circulation/ms-data-circulation-tx-mgr-service/data-contract/get-data-receive-and-contract`,
method: 'get',
})
// export const getTenantInfo = (params) => request({
// // url: `${import.meta.env.VITE_APP_PERSONAL_URL}/tenant/getByGuid/${params}`,
......@@ -524,3 +532,23 @@ export const chTransformEn =(params)=> request({
method: "post",
data: params,
});
export const saveDataReceiveContract = (params) => request({
url: `${import.meta.env.VITE_API_NEW_PORTAL}/dam-delivery-main/save`,
method: 'post',
data: params
});
/** 获取数据交付物详情 */
export const getDataReceiveContractDetail = (damGuid) => request({
url: `${import.meta.env.VITE_API_NEW_PORTAL}/dam-delivery-main/list-by-dam-guid?damGuid=${damGuid}`,
method: 'get'
});
// 数据合同详情
export const getContractDetail = (params) => request({
url: `https://daop-lt-test.zgsjzc.com/circulation/ms-data-circulation-tx-mgr-service/data-contract/detail`,
method: 'get',
params
})
\ No newline at end of file
......
import request from "@/utils/request";
/** 获取首页组织机构信息 */
export const getReleaseYears = () => request({
url: `${import.meta.env.VITE_API_NEW_PORTAL}/dam-delivery-main/release-year`,
method: 'get',
})
export const getParamsList = (params) => request({
url: `${import.meta.env.VITE_APP_CONFIG_URL}/dict/data/get-by-dictType`,
method: 'get',
params
})
export const getSubjectDomainDataTree = () => request({
url: `${import.meta.env.VITE_API_NEW_PORTAL}/dam-delivery-main/delivery-data-tree`,
method: 'get',
})
export const getReleaseListData = (params) => request({
url: `${import.meta.env.VITE_API_NEW_PORTAL}/dam-delivery-main/list-all`,
method: 'post',
data: params
})
/** 获取资产登记详情 */
export const getReleaseDataCertiDetail = (guid) => request({
url: `${import.meta.env.VITE_API_NEW_PORTAL}/register-document/detail-by-dam-guid?damGuid=${guid}`,
method: 'get'
})
/** 获取交付物下载附件 */
export const getDeliveryFileDetail = (guid) => request({
url: `${import.meta.env.VITE_API_NEW_PORTAL}/dam-delivery-main/detail?guid=${guid}`,
method: 'get'
})
......@@ -25,3 +25,11 @@ export const updateComplianceInfo = (params) => {
data: params
})
}
/** 获取资产合规目录详情 */
export const getComplianceDetail = (guid) => {
return request({
url: `${import.meta.env.VITE_API_NEW_PORTAL}/dam-catalog-table/compliance-info/detail?damGuid=${guid}`,
method: 'get'
})
}
\ No newline at end of file
......
......@@ -51,7 +51,7 @@ const defaultMenuActive = computed(() => {
<div
v-if="['side', 'head', 'single'].includes(settingsStore.settings.menu.menuMode) || settingsStore.mode === 'mobile'"
class="sub-sidebar-container"
:class="{ 'is-collapse': settingsStore.mode === 'pc' && (settingsStore.settings.menu.subMenuCollapse || defaultMenuActive == '/data-asset-index') }"
:class="{ 'is-collapse': settingsStore.mode === 'pc' && (settingsStore.settings.menu.subMenuCollapse || defaultMenuActive == '/data-asset-index' || defaultMenuActive == '/trusted-space-index' || defaultMenuActive == '/down-delivery-file') }"
@scroll="onSidebarScroll">
<Logo :show-logo="settingsStore.settings.menu.menuMode === 'single'" class="sidebar-logo" :class="{
'sidebar-logo-bg': settingsStore.settings.menu.menuMode === 'single',
......@@ -60,7 +60,7 @@ const defaultMenuActive = computed(() => {
<!-- 侧边栏模式(无主导航) -->
<el-menu :unique-opened="settingsStore.settings.menu.subMenuUniqueOpened"
:default-openeds="menuStore.defaultOpenedPaths" :default-active="defaultMenuActive"
:collapse="settingsStore.mode === 'pc' && (settingsStore.settings.menu.subMenuCollapse || defaultMenuActive == '/data-asset-index')"
:collapse="settingsStore.mode === 'pc' && (settingsStore.settings.menu.subMenuCollapse || defaultMenuActive == '/data-asset-index' || defaultMenuActive == '/trusted-space-index' || defaultMenuActive == '/down-delivery-file')"
:collapse-transition="false" :class="{
'is-collapse-without-logo': settingsStore.settings.menu.menuMode !== 'single' && settingsStore.settings.menu.subMenuCollapse,
}">
......
......@@ -127,6 +127,18 @@ const routes: RouteRecordRaw[] = [
}
},
{
path: 'register-catalog-contract-detail',
name: 'registerCatalogContractDetail',
component: () => import('@/views/data_asset/registerCatalogContractDetail.vue'),
meta: {
title: '详情-',
sidebar: false,
breadcrumb: false,
cache: true,
reuse: true
}
},
{
path: 'damTableDataView',
name: 'damTableDataView',
component: () => import('@/views/data_asset/damTableDataView.vue'),
......
......@@ -173,7 +173,19 @@ const routes: RouteRecordRaw[] = [
cache: true,
reuse: true
}
},
{
path: 'register-catalog-detail',
name: 'certiCatalogDetail',
component: () => import('@/views/data_asset/registerCatalogDetail.vue'),
meta: {
title: '详情-',
sidebar: false,
breadcrumb: false,
cache: true,
reuse: true
}
},
],
},
{
......
import type { RouteRecordRaw } from 'vue-router'
function Layout() {
return import('@/layouts/index.vue')
}
const routes: RouteRecordRaw[] = [
{
path: '/trusted-space-index',
component: Layout,
meta: {
title: '可信空间',
icon: 'sidebar-videos',
},
children: [
{
path: '',
name: 'trustedSpaceIndex',
component: () => import('@/views/data_trusted/trustedSpaceIndex.vue'),
meta: {
title: '可信空间',
sidebar: false,
breadcrumb: false,
cache: true
},
},
{
path: '/down-delivery-file',
name: 'downDeliveryFile',
component: () => import('@/views/data_trusted/downDeliveryFile.vue'),
meta: {
title: '交付物下载',
sidebar: false,
breadcrumb: false,
cache: true,
reuse: true
},
beforeEnter: (to, from) => {
if (to.query.damName) {
to.meta.title = `交付物下载-${to.query.damName}`;
}
}
},
]
}]
export default routes
\ No newline at end of file
......@@ -6,11 +6,11 @@ import DataMeta from './modules/dataMeta';
import DataQuality from './modules/dataQuality';
import DataInventory from './modules/dataInventory';
import AssetIndex from './modules/assetIndex';
import DataTrustedSpace from './modules/dataTrustedSpace';
import DataAssetRegistry from './modules/dataAssetRegistry';
import DataEntry from './modules/dataEntry';
import SecurityMenu from './modules/securityMenu';
import type { Route } from '#/global'
import useSettingsStore from '@/store/modules/settings'
/** 路由配置的meta信息接口注释。 */
......@@ -112,6 +112,7 @@ const asyncRoutes: RouteRecordRaw[] = [
...DataMeta,
...DataQuality,
...DataInventory,
...DataTrustedSpace
]
const constantRoutesByFilesystem = generatedRoutes.filter((item) => {
......
......@@ -12,8 +12,12 @@ import {
updateCertificate,
getRegisterSelectList,
saveCertificate,
delCertificate
delCertificate,
getParamsList
} from "@/api/modules/dataAsset";
import {
getSingleList
} from "@/api/modules/queryService";
import useUserStore from "@/store/modules/user";
import useDataAssetStore from "@/store/modules/dataAsset";
import { useValidator } from '@/hooks/useValidator';
......@@ -29,8 +33,14 @@ const userData = JSON.parse(userStore.userData);
/** 是否时企业端。不是企业端,则是服务端,需要显示企业名称。 */
const isCompanyPlatform = ref(userData.tenantType == 1);
/** 登记证件类别,知识产权和数据产权 */
const documentCategoryList = ref([]);
const registerSelectData: any = ref([]);
/** 发证主体的下拉数据选择 */
const serviceTenants: any = ref([]);
onBeforeMount(() => {
if (isCompanyPlatform.value) {
tableInfo.value.fields = tableFields.value;
......@@ -38,6 +48,25 @@ onBeforeMount(() => {
tableFields.value.splice(4, 0, { label: "企业名称", field: "tenantName", width: 240, align: "left" })
tableInfo.value.fields = tableFields.value;
}
getParamsList({ dictType: '登记证件类别' }).then((res: any) => {
if (res.code == proxy.$passCode) {
documentCategoryList.value = res.data || [];
let item = formItems.value.at(-2);
item && (item.options = documentCategoryList.value);
} else {
proxy.$ElMessage.error(res.msg);
}
})
getSingleList({ pageIndex: -1, pageSize: -1, tenantType: "130" }).then((res: any) => {
if (res.code == proxy.$passCode) {
const data = res.data.records ?? [];
serviceTenants.value = data;
let formItem = formItems.value.find(f => f.field === 'issuingEntityGuid');
formItem && (formItem.options = serviceTenants.value);
} else {
proxy.$ElMessage.error(res.msg);
}
})
})
onActivated(() => {
......@@ -145,11 +174,12 @@ const tableFields = ref([
//{ label: "企业名称", field: "tenantName", width: 240, align: "left" },
{ label: "发证主体", field: "issuingEntityName", width: 250, align: "left" },
{
label: "类型", field: "documentType", width: 96, align: "left", getName: (scope) => {
label: "类型", field: "documentType", width: 80, align: "left", getName: (scope) => {
let type = scope.row.documentType;
return type == 1 ? 'A证' : (type == 2 ? 'B证' : 'C证');
}
},
{ label: "类别", field: "documentCategoryName", width: 90, align: "left" },
{ label: "状态", field: "state", type: "tag", width: 96, align: 'center' },
]);
......@@ -205,6 +235,8 @@ const tableBtnClick = (scope, btn) => {
item.default = row[item.field];
})
formItems.value[0].options = registerSelectData.value;
let item = formItems.value.at(-2);
item && (item.options = documentCategoryList.value);
getRegisterSelectList().then((res: any) => {
if (res.code == proxy.$passCode) {
registerSelectData.value = res.data || [];
......@@ -228,10 +260,17 @@ const tableBtnClick = (scope, btn) => {
proxy.$ElMessage.info("已取消删除");
});
} else if (type === 'path_detail') { // 详情
if (row.registerGuid) {
router.push({
name: 'certificateDetail',
query: { guid: row.registerGuid, certificateGuid: row.guid, type: 'certificate', tenantGuid: row.tenantGuid }
});
} else {
router.push({
name: 'certiCatalogDetail',
query: { guid: row.damGuid, tenantGuid: row.tenantGuid, type: 'certificate', certificateGuid: row.guid }
});
}
}
};
......@@ -245,12 +284,12 @@ const formItems = ref([{
label: "资产名称",
type: "select",
placeholder: "请选择",
field: "registerGuid",
field: "damGuid",
default: '',
options: registerSelectData.value,
props: {
label: 'daName',
value: 'guid'
value: 'damGuid'
},
disabled: false,
clearable: true,
......@@ -282,7 +321,7 @@ const formItems = ref([{
clearable: true,
unlink: true,
disabled: false,
required: false,
required: true,
visible: true
}, {
label: '',
......@@ -304,18 +343,24 @@ const formItems = ref([{
visible: true
}, {
label: '发证主体',
type: 'input',
type: 'select',
placeholder: '请输入',
field: 'issuingEntityName',
field: 'issuingEntityGuid',
default: '',
disabled: true,
required: false,
options: registerSelectData.value,
props: {
value: "guid",
label: "tenantName",
},
filterable: true,
disabled: false,
required: true,
visible: true
}, {
label: '',
type: 'input',
placeholder: '请输入',
field: 'issuingEntityGuid',
field: 'issuingEntityName',
default: '',
disabled: true,
required: false,
......@@ -340,6 +385,16 @@ const formItems = ref([{
{ label: 'C证', value: 3 }],
disabled: false,
clearable: true,
required: false,
}, {
label: "证件类别",
type: "select",
placeholder: "请选择",
field: "documentCategory",
default: '2',
options: documentCategoryList.value,
disabled: false,
clearable: true,
required: true,
}, {
label: '证件上传',
......@@ -355,10 +410,11 @@ const formItems = ref([{
}]);
const formRules = ref({
registerGuid: [required('请选择资产名称')],
damGuid: [required('请选择资产名称')],
registerTime: [required('请选择登记时间')],
effectiveDate: [required('请选择有效期')],
documentType: [required('请选择证件类型')],
//documentType: [required('请选择证件类型')],
documentCategory: [required('请选择证件类别')],
daCode: [required('请输入证件编码')],
documentFile: [{
validator: (rule: any, value: any, callback: any) => {
......@@ -443,8 +499,8 @@ const dialogBtnClick = (btn, info) => {
};
const handleDialogSelectChange = (val, row, info) => {
if (row.field == 'registerGuid') {
let register = val && registerSelectData.value.find(r => r.guid == val);
if (row.field == 'damGuid') {
let register = val && registerSelectData.value.find(r => r.damGuid == val);
formItems.value.forEach(item => {
item.default = info[item.field];
if (item.field == 'daName' || item.field == 'tenantGuid' || item.field == 'tenantName') {
......@@ -467,6 +523,8 @@ const handleCreate = () => {
ElMessage.error(res.msg);
}
})
let item = formItems.value.at(-2);
item && (item.options = documentCategoryList.value);
dialogInfo.value.visible = true;
dialogInfo.value.type = 'add';
dialogInfo.value.header.title = '新增';
......@@ -474,10 +532,12 @@ const handleCreate = () => {
item.default = '';
if (item.field == 'documentType') {
item.default = 3;
} else if (item.field == 'documentCategory') {
item.default = '2';
} else if (item.field == 'documentFile') {
item.default = [];
}
if (item.field == 'registerGuid' || item.field == 'daCode') {
if (item.field == 'damGuid' || item.field == 'daCode') {
item.disabled = false;
}
})
......@@ -489,7 +549,7 @@ const handleCreate = () => {
<div class="container_wrap">
<div class="table_tool_wrap">
<TableTools :searchItems="searchItemList" :searchId="'register-data-search'" @search="toSearch" :init="true" />
<div class="tools_btns">
<div class="tools_btns" style="padding-top: 0px;">
<el-button type="primary" @click="handleCreate">新增登记证件</el-button>
</div>
</div>
......@@ -505,7 +565,7 @@ const handleCreate = () => {
padding: 0 16px;
.table_panel_wrap {
height: calc(100% - 44px);
height: calc(100% - 84px);
}
}
......
<template>
<Dialog :dialogInfo="dialogInfo" @btnClick="dialogBtnClick">
<div class="first-row">
<div class="data-accept-left">
<div class="title">选择数据接收方</div>
<div class="data-list">
<el-checkbox-group v-model="userReceiveCheckList">
<div
:class="userReceiveSelectInfo.dataReceiveGuid == item.dataReceiveGuid ? 'data-check-item selected' : 'data-check-item'"
v-for="item in props.listData" :key="item.dataReceiveGuid" @click="handleClickItem(item)">
<el-checkbox :label="item.dataReceiveGuid">{{ '' }}
</el-checkbox>
<div class="text-label">
<ellipsis-tooltip :content="item.dataReceiveName" class-name="w100f"
:refName="'tooltipOver' + item.dataReceiveGuid"></ellipsis-tooltip>
</div>
</div>
</el-checkbox-group>
</div>
</div>
<div class="data-contract-right">
<div class="title">{{ '选择' + (userReceiveSelectInfo.dataReceiveName || '数据接收方') + '的合同' }}</div>
<div class="data-list contract">
<el-checkbox-group v-show="userReceiveSelectInfo.dataReceiveContractRSVOS?.length"
v-model="userReceiveContractCheckList[userReceiveSelectInfo.dataReceiveGuid]">
<el-checkbox v-for="item in userReceiveSelectInfo.dataReceiveContractRSVOS" :key="item.dataContractGuid"
:label="item.dataContractGuid">
<ellipsis-tooltip :content="item.dataContractName" class-name="w100f"
:refName="'tooltipOver' + item.dataContractGuid"></ellipsis-tooltip>
</el-checkbox>
</el-checkbox-group>
</div>
</div>
</div>
<el-upload ref="uploadRef" action="#" class="upload-delivery" drag :file-list="fileList"
:http-request="(file) => uploadFile(file)">
<el-icon class="el-icon--upload" style="margin-bottom: 4px;">
<Plus />
</el-icon>
<div class="el-upload__text">
点击或拖拽上传
</div>
<template #file="{ file }">
<div class="file-operate">
<template
v-if="file.name.substring(file.name.lastIndexOf('.') + 1).toLowerCase() == 'xls' || file.name.substring(file.name.lastIndexOf('.') + 1).toLowerCase() == 'xlsx'">
<img class="file-img" src="../../../assets/images/excel.png" />
</template>
<template
v-else-if="file.name.substring(file.name.lastIndexOf('.') + 1).toLowerCase() == 'doc' || file.name.substring(file.name.lastIndexOf('.') + 1).toLowerCase() == 'docx'">
<img class="file-img" src="../../../assets/images/word.png" />
</template>
<template v-else-if="file.name.substring(file.name.lastIndexOf('.') + 1).toLowerCase() == 'zip'">
<img class="file-img" src="../../../assets/images/zip.png" />
</template>
<template v-else-if="file.name.substring(file.name.lastIndexOf('.') + 1).toLowerCase() == 'rar'">
<img class="file-img" src="../../../assets/images/RAR.png" />
</template>
<template v-else-if="file.name.substring(file.name.lastIndexOf('.') + 1).toLowerCase() == 'pdf'">
<img class="file-img" src="../../../assets/images/PDF.png" />
</template>
<template v-else-if="file.name.substring(file.name.lastIndexOf('.') + 1).toLowerCase() == 'png'">
<img class="file-img" src="../../../assets/images/png.png" />
</template>
<template
v-else-if="file.name.substring(file.name.lastIndexOf('.') + 1).toLowerCase() == 'jpg' || file.name.substring(file.name.lastIndexOf('.') + 1).toLowerCase() == 'jpeg'">
<img class="file-img" src="../../../assets/images/jpg.png" />
</template>
<div class="file-name"
:style="{ width: ['pdf', 'png', 'jpg', 'jpeg'].includes(file?.name?.substring(file.name.lastIndexOf('.') + 1).toLowerCase() ?? '') ? 'calc(100% - 300px)' : 'calc(100% - 290px)' }">
<ellipsis-tooltip :content="file.name" class-name="w100f"
:refName="'tooltipOver' + file.name"></ellipsis-tooltip>
</div>
<div class="upload-time" :style="{ right: 32 }" v-if="uploadTime"> {{ '上传时间:' + uploadTime }} </div>
<div :style="{ right: 0 }" class="file-preview" @click="handleUploadFileRemove(file)">删除
</div>
</div>
</template>
</el-upload>
</Dialog>
</template>
<script setup lang="ts" name="deliverUploadDialog">
import {
Plus
} from "@element-plus/icons-vue";
import {
getUpFileSignByUrl,
obsUploadRequest,
getPathUrl
} from "@/api/modules/obsService";
import {
saveDataReceiveContract
} from "@/api/modules/dataAsset";
import { ElMessage } from "element-plus";
import Moment from "moment";
const { proxy } = getCurrentInstance() as any;
const props = defineProps({
listData: { //数据接收方和合同列表
type: Array<any>,
default: [{
dataReceiveGuid: '1',
dataReceiveName: '北京传世博润科技有限公司',
dataReceiveContractRSVOS: [{
dataContractGuid: '1',
dataContractName: '合同1'
}, {
dataContractGuid: '2',
dataContractName: '合同2'
}]
}, {
dataReceiveGuid: '2',
dataReceiveName: 'xx2',
dataReceiveContractRSVOS: [{
dataContractGuid: '2',
dataContractName: '合同2'
}]
}]
},
uploadDeliverItem: {
type: Object,
default: {}
},
visible: {
type: Boolean,
default: false
},
})
const emits = defineEmits(['close'])
watch(() => props.visible, (val) => {
dialogInfo.value.visible = val;
if (val) {
userReceiveCheckList.value = [];
fileList.value = [];
uploadTime.value = null;
userReceiveSelectInfo.value = props.listData[0] || {};
userReceiveContractCheckList.value = {};
props.listData.forEach(list => {
userReceiveContractCheckList.value[list.dataReceiveGuid] = [];
})
}
})
const fileList: any = ref([]);
/** 文件上传时间 */
const uploadTime: any = ref(null);
const userReceiveCheckList = ref([]);
/** 记录接收方对应勾选的合同 */
const userReceiveContractCheckList: any = ref({});
/** 记录当前选中的高亮合同 */
const userReceiveSelectInfo: any = ref({});
const dialogInfo = ref({
visible: false,
size: 800,
direction: "column",
header: {
title: "交付物上传",
},
type: '',//标识是否是重新提交
contents: [],
footer: {
btns: [
{ type: "default", label: "取消", value: "cancel" },
{ type: "primary", label: "确定", value: "submit", loading: false },
],
},
});
const dialogBtnClick = (btn, info) => {
console.log('btn', btn, info);
if (btn.value == 'submit') {
if (!userReceiveCheckList.value.length) {
ElMessage.error('请勾选数据接收方');
return;
}
if (!fileList.value.length) {
ElMessage.error('请点击或拖拽上传交付物文件');
return;
}
let jsonValue: any = [];
for (const u of userReceiveCheckList.value) {
if (!userReceiveContractCheckList.value[u]?.length) {
ElMessage.error(`【` + props.listData.find(l => l.dataReceiveGuid == u)?.dataReceiveName + '】' + '未选择合同');
return;
}
jsonValue.push({
dataReceiveGuid: u,
contractInfo: userReceiveContractCheckList.value[u]?.map(c => {
return {
dataContractGuid: c,
dataContractName: props.listData.find(l => l.dataReceiveGuid == u).dataReceiveContractRSVOS.find(d => d.dataContractGuid == c).dataContractName
}
})
})
}
dialogInfo.value.footer.btns[1].loading = true;
let params = {
damGuid: props.uploadDeliverItem.guid,
dataDelivery: fileList.value?.map(f => {
return {
name: f.name,
url: f.url
}
}),
uploadTime: uploadTime.value,
dataReceiveRQVOS: jsonValue
};
saveDataReceiveContract(params).then((res: any) => {
if (res.code == proxy.$passCode) {
proxy.$ElMessage.success('上传交付物成功');
dialogInfo.value.footer.btns[1].loading = false;
dialogInfo.value.visible = false;
emits('close', props.uploadDeliverItem.guid);
} else {
proxy.$ElMessage.error(res.msg);
}
})
} else if (btn.value == 'cancel') {
dialogInfo.value.visible = false;
emits('close')
}
}
const handleClickItem = (item) => {
userReceiveSelectInfo.value = item;
}
const uploadRef = ref();
const uploadFile = (file) => {
return getUpFileSignByUrl({ fileName: file.file.name })
.then((res: any) => {
obsUploadRequest({
signedUrl: res.data.signedUrl,
file: file.file,
actualSignedRequestHeaders: res.data.actualSignedRequestHeaders
}).then(() => {
if (res.code == '00000') {
file.file.url = res.data.signedUrl && getPathUrl(res.data.signedUrl);
let fileItem = {
name: file.file.name,
url: res.data.signedUrl,
file: file.file
};
fileList.value = [fileItem];
uploadTime.value = Moment(Date.now()).format('YYYY-MM-DD HH:mm:ss');
ElMessage.success('上传成功');
} else {
uploadRef.value.handleRemove(file);
ElMessage.error('上传失败,请重新上传!');
}
})
})
.catch(() => {
uploadRef.value.handleRemove(file);
ElMessage.error('上传失败,请重新上传');
});
}
const handleUploadFileRemove = (file) => {
fileList.value = [];
uploadRef.value.handleRemove(file);
}
</script>
<style lang="scss" scoped>
.first-row {
display: flex;
justify-content: space-between;
height: 202px;
margin-top: 16px;
}
.data-contract-right,
.data-accept-left {
width: calc(50% - 6px);
.title {
line-height: 21px;
color: #666;
margin-bottom: 4px;
}
.data-list {
border: 1px solid #d9d9d9;
height: 178px;
padding: 8px 12px;
.data-check-item {
display: flex;
padding-left: 12px;
&.selected {
background-color: #ebf6f7;
}
.text-label {
width: calc(100% - 36px);
line-height: 32px;
cursor: pointer;
font-size: 14px;
}
}
}
}
:deep(.data-list) {
.el-checkbox-group {
margin-left: -12px;
margin-right: -12px;
}
}
:deep(.data-list.contract) {
.el-checkbox {
width: 100%;
margin-right: 0px;
padding-left: 12px;
.el-checkbox__label {
width: calc(100% - 22px);
}
}
}
.upload-delivery {
margin-top: 16px;
.file-operate {
display: flex;
align-items: center;
position: relative;
width: 100%;
.file-img {
width: 30px;
height: 30px;
}
&:hover {
background-color: #f5f5f5;
}
}
.file-name {
color: var(--el-color-regular);
margin-left: 4px;
margin-right: 4px;
width: calc(100% - 130px);
}
.file-preview {
position: absolute;
cursor: pointer;
color: var(--el-color-primary);
margin-right: 8px;
}
}
:deep(.el-upload.is-drag) {
.el-upload-dragger {
height: 160px;
align-items: center;
display: flex;
flex-direction: column;
justify-content: center;
}
}
:deep(.el-upload-list) {
margin-top: 16px;
}
.upload-time {
right: 46px;
position: absolute;
color: #999;
}
</style>
\ No newline at end of file
<route lang="yaml">
name: registerCatalogContractDetail //合同详情
</route>
<script lang="ts" setup name="registerCatalogContractDetail">
import { ref, onMounted } from "vue";
import { useRouter, useRoute } from "vue-router";
import { ElMessage, ElMessageBox } from "element-plus";
import useUserStore from "@/store/modules/user";
import useDataAssetStore from "@/store/modules/dataAsset";
import { getCamundaDeploymentId } from "@/api/modules/workFlowService"
import { getContractDetail } from "@/api/modules/dataAsset";
import { onUploadFilePreview, onUploadFileDownload } from '@/api/modules/common';
const { proxy } = getCurrentInstance() as any;
const router = useRouter();
const route = useRoute();
const userStore = useUserStore();
const fullPath = route.fullPath;
const assetStore = useDataAssetStore();
const guid = route.query.guid;
const detailType = route.query.type;
const tenantGuid = route.query.tenantGuid;
const userData = JSON.parse(localStorage.userData);
const damName = route.query.name as string || '';
const loading = ref(false);
const flowDetail: any = ref({});
const expand1 = ref(true)
const expand2 = ref(true)
const expand3 = ref(true)
const expand4 = ref(true)
const deploymentId = ref('');
const processInstanceId = ref('');
const flowState = ref(0);
const approveState = ref('');
const isShowCancel = ref(false);
const approvalProcessRef = ref();
//合同内容
const contractContentFormItems = ref([
{
label: '合同类型',
field: 'dataContractType',
},
{
label: '甲方名称',
field: 'apartyGuid',
},
{
label: '乙方名称',
field: 'bpartyGuid',
},
{
label: '合同名称',
field: 'contractName',
},
{
label: '签约时间',
field: 'signContractDate',
},
{
label: '生效日期',
field: 'effectiveDate',
},
{
label: '终止日期',
field: 'terminationDate',
},
{
label: '原始合同金额',
placeholder: '请输入',
field: 'originalTradingAmount',
},
{
label: '合同金额(元)',
field: 'tradingAmount',
},
{
label: '关联销售合同',
field: 'relatedSalesContract',
block: true,
},
{
label: '合同附件',
field: 'contractAttachments',
type: 'upload-file',
block: true,
},
{
label: '合同说明',
field: 'contractInstructions',
block: true
},
])
// 合同签署方
const contractSignatoryFormItems: any = ref([
{
label: '丙方名称',
type: 'select',
placeholder: '请选择',
field: 'cpartyGuid',
default: '',
options: [],
props: {
label: 'tenantName',
value: 'guid'
},
filterable: true,
clearable: true,
},
{
label: '丁方名称',
type: 'select',
placeholder: '请选择',
field: 'dpartyGuid',
default: '',
options: [],
props: {
label: 'tenantName',
value: 'guid'
},
filterable: true,
clearable: true,
},
])
// 付款方式
const payPlan = ref(false);
// 获取详情
const getTaskDetail = () => {
loading.value = true;
getContractDetail({ serviceTenantGuid: tenantGuid, guid }).then((res: any) => {
if (res.code == proxy.$passCode) {
loading.value = false;
deploymentId.value = '';
processInstanceId.value = '';
flowState.value = 0;
isShowCancel.value = false;
const data = res.data || {};
flowDetail.value = { ...data, demandPic: data.contractAttachments ? data.contractAttachments[0] : {}, contractAttachPic: data.sealContractAttachments ? data.sealContractAttachments[0] : {} };
let { approveVO } = data;
if (approveVO) {
deploymentId.value = approveVO.camundaDeploymentId;
processInstanceId.value = approveVO.camundaInstanceId;
approveState.value = approveVO.approveState;
if (approveVO.approveState == 'A' && approveVO.approveStaffGuids.indexOf(userData.staffGuid) > -1) {
flowState.value = 2;
}
if ((approveVO.approveState == 'C' || approveVO.approveState == 'R') && approveVO.staffGuid == userData.staffGuid) {
flowState.value = 3;
}
(approveVO.approveState == 'A' && approveVO.staffGuid == userData.staffGuid) && (isShowCancel.value = true);
} else {
getCamundaDeploymentId('10020', userData.tenantGuid, userData.staffGuid).then((res: any) => {
if (res.code == proxy.$passCode) {
deploymentId.value = res.data;
} else {
ElMessage.error(res.msg);
}
})
}
}
}).catch(() => {
loading.value = false;
})
}
const toPath = () => {
userStore.setTabbar(userStore.tabbar.filter((tab: any) => tab.fullPath !== fullPath));
assetStore.set(true);
router.push({
name: 'contractManagement',
})
}
const btnClick = async (btn) => {
const type = btn.value;
if (type == 'cancel') {
toPath()
}
}
onActivated(() => {
let tab: any = userStore.tabbar.find((tab: any) => tab.fullPath === router.currentRoute.value.fullPath);
if (tab) {
switch (detailType) {
case 'detail':
tab.meta.title = `详情-${damName}`;
document.title = `详情-${damName}`;
break;
}
}
})
onBeforeMount(() => {
if (guid) {
getTaskDetail()
} else {
getCamundaDeploymentId('10020', userData.tenantGuid, userData.staffGuid).then((res: any) => {
if (res.code == proxy.$passCode) {
deploymentId.value = res.data;
} else {
ElMessage.error(res.msg);
}
})
}
})
onMounted(() => {
})
</script>
<template>
<div class="container_wrap full" v-loading="loading">
<div class="content_main panel">
<ContentWrap id="contract-content-wrap" title="合同内容信息" expandSwicth style="margin-top: 15px" :isExpand="expand1"
@expand="(v) => expand1 = v">
<div class="list_panel">
<template v-for="item in contractContentFormItems" :key="item.field">
<div class="list_item" :class="{ 'is_block': item.block }"
v-if="item.type != 'upload-file'">
<span class="item_label">{{ item.label }}:</span>
<span class="item_value" v-if="item.field == 'dataContractType'">{{ flowDetail.dataContractTypeName ||
'--' }}</span>
<span class="item_value" v-else-if="item.field == 'apartyGuid'">{{ flowDetail.apartyName || '--' }}</span>
<span class="item_value" v-else-if="item.field == 'bpartyGuid'">{{ flowDetail.bpartyName || '--' }}</span>
<span class="item_value" v-else-if="item.field == 'originalTradingAmount'">{{
flowDetail.originalTradingAmount ?
`${flowDetail.originalTradingAmount}(${flowDetail.originalTradingUnitName})`
: '--' }}</span>
<span class="item_value"
v-else-if="item.field == 'relatedSalesContract' && (flowDetail.dataContractTypeName && flowDetail.dataContractTypeName.indexOf('采购') > -1)">{{
flowDetail.relatedSalesContractName ||
'--' }}</span>
<span class="item_value" v-else>{{ flowDetail[item.field] || '--' }}</span>
</div>
<div class="list_item" :class="{ 'is_block': item.block }" v-else>
<div class="file_item" v-if="flowDetail.demandPic && flowDetail.demandPic.name">
<span class="item_label">合同附件:</span>
<span class="item_value">
<div class="file-operate">
<template
v-if="flowDetail.demandPic.name.substring(flowDetail.demandPic.name.lastIndexOf('.') + 1).toLowerCase() == 'xls' || flowDetail.demandPic.name.substring(flowDetail.demandPic.name.lastIndexOf('.') + 1).toLowerCase() == 'xlsx' || flowDetail.demandPic.name.substring(flowDetail.demandPic.name.lastIndexOf('.') + 1).toLowerCase() == 'csv'">
<img class="file-img" src="../../assets/images/excel.png" />
</template>
<template
v-else-if="flowDetail.demandPic.name.substring(flowDetail.demandPic.name.lastIndexOf('.') + 1).toLowerCase() == 'doc' || flowDetail.demandPic.name.substring(flowDetail.demandPic.name.lastIndexOf('.') + 1).toLowerCase() == 'docx'">
<img class="file-img" src="../../assets/images/word.png" />
</template>
<template
v-else-if="flowDetail.demandPic.name.substring(flowDetail.demandPic.name.lastIndexOf('.') + 1).toLowerCase() == 'zip'">
<img class="file-img" src="../../assets/images/zip.png" />
</template>
<template
v-else-if="flowDetail.demandPic.name.substring(flowDetail.demandPic.name.lastIndexOf('.') + 1).toLowerCase() == 'rar'">
<img class="file-img" src="../../assets/images/RAR.png" />
</template>
<template
v-else-if="flowDetail.demandPic.name.substring(flowDetail.demandPic.name.lastIndexOf('.') + 1).toLowerCase() == 'pdf'">
<img class="file-img" src="../../assets/images/PDF.png" />
</template>
<template
v-else-if="flowDetail.demandPic.name.substring(flowDetail.demandPic.name.lastIndexOf('.') + 1).toLowerCase() == 'png'">
<img class="file-img" src="../../assets/images/png.png" />
</template>
<template
v-else-if="flowDetail.demandPic.name.substring(flowDetail.demandPic.name.lastIndexOf('.') + 1).toLowerCase() == 'jpg' || flowDetail.demandPic.name.substring(flowDetail.demandPic.name.lastIndexOf('.') + 1).toLowerCase() == 'jpeg'">
<img class="file-img" src="../../assets/images/jpg.png" />
</template>
<div class="file-name"><ellipsis-tooltip :content="flowDetail.demandPic.name ?? ''" class-name="w100f"
refName="tooltipOver"></ellipsis-tooltip></div>
<div :style="{ right: '36px' }"
v-if="flowDetail.demandPic.name.substring(flowDetail.demandPic.name.lastIndexOf('.') + 1).toLowerCase() == 'pdf' || flowDetail.demandPic.name.substring(flowDetail.demandPic.name.lastIndexOf('.') + 1).toLowerCase() == 'png' || flowDetail.demandPic.name.substring(flowDetail.demandPic.name.lastIndexOf('.') + 1).toLowerCase() == 'jpg' || flowDetail.demandPic.name.substring(flowDetail.demandPic.name.lastIndexOf('.') + 1).toLowerCase() == 'jpeg'"
class="file-preview" @click="onUploadFilePreview(flowDetail.demandPic)">查看</div>
<div :style="{ right: '0px' }" class="file-preview"
@click="onUploadFileDownload(flowDetail.demandPic)">下载</div>
</div>
</span>
</div>
</div>
</template>
<div class="list_item is_block" v-if="flowDetail.contractAttachPic && flowDetail.contractAttachPic.name">
<div class="file_item">
<span class="item_label">盖章合同附件:</span>
<span class="item_value">
<div class="file-operate">
<template
v-if="flowDetail.contractAttachPic.name.substring(flowDetail.contractAttachPic.name.lastIndexOf('.') + 1).toLowerCase() == 'xls' || flowDetail.contractAttachPic.name.substring(flowDetail.contractAttachPic.name.lastIndexOf('.') + 1).toLowerCase() == 'xlsx' || flowDetail.contractAttachPic.name.substring(flowDetail.contractAttachPic.name.lastIndexOf('.') + 1).toLowerCase() == 'csv'">
<img class="file-img" src="../../assets/images/excel.png" />
</template>
<template
v-else-if="flowDetail.contractAttachPic.name.substring(flowDetail.contractAttachPic.name.lastIndexOf('.') + 1).toLowerCase() == 'doc' || flowDetail.contractAttachPic.name.substring(flowDetail.contractAttachPic.name.lastIndexOf('.') + 1).toLowerCase() == 'docx'">
<img class="file-img" src="../../assets/images/word.png" />
</template>
<template
v-else-if="flowDetail.contractAttachPic.name.substring(flowDetail.contractAttachPic.name.lastIndexOf('.') + 1).toLowerCase() == 'zip'">
<img class="file-img" src="../../assets/images/zip.png" />
</template>
<template
v-else-if="flowDetail.contractAttachPic.name.substring(flowDetail.contractAttachPic.name.lastIndexOf('.') + 1).toLowerCase() == 'rar'">
<img class="file-img" src="../../assets/images/RAR.png" />
</template>
<template
v-else-if="flowDetail.contractAttachPic.name.substring(flowDetail.contractAttachPic.name.lastIndexOf('.') + 1).toLowerCase() == 'pdf'">
<img class="file-img" src="../../assets/images/PDF.png" />
</template>
<template
v-else-if="flowDetail.contractAttachPic.name.substring(flowDetail.contractAttachPic.name.lastIndexOf('.') + 1).toLowerCase() == 'png'">
<img class="file-img" src="../../assets/images/png.png" />
</template>
<template
v-else-if="flowDetail.contractAttachPic.name.substring(flowDetail.contractAttachPic.name.lastIndexOf('.') + 1).toLowerCase() == 'jpg' || flowDetail.contractAttachPic.name.substring(flowDetail.contractAttachPic.name.lastIndexOf('.') + 1).toLowerCase() == 'jpeg'">
<img class="file-img" src="../../assets/images/jpg.png" />
</template>
<div class="file-name"><ellipsis-tooltip :content="flowDetail.contractAttachPic.name ?? ''" class-name="w100f"
refName="tooltipOver"></ellipsis-tooltip></div>
<div :style="{ right: '36px' }"
v-if="flowDetail.contractAttachPic.name.substring(flowDetail.contractAttachPic.name.lastIndexOf('.') + 1).toLowerCase() == 'pdf' || flowDetail.contractAttachPic.name.substring(flowDetail.contractAttachPic.name.lastIndexOf('.') + 1).toLowerCase() == 'png' || flowDetail.contractAttachPic.name.substring(flowDetail.contractAttachPic.name.lastIndexOf('.') + 1).toLowerCase() == 'jpg' || flowDetail.contractAttachPic.name.substring(flowDetail.contractAttachPic.name.lastIndexOf('.') + 1).toLowerCase() == 'jpeg'"
class="file-preview" @click="onUploadFilePreview(flowDetail.contractAttachPic)">查看</div>
<div :style="{ right: '0px' }" class="file-preview"
@click="onUploadFileDownload(flowDetail.contractAttachPic)">
下载</div>
</div>
</span>
</div>
</div>
</div>
</ContentWrap>
<ContentWrap id="contract-signatory-wrap" title="合同签署方" expandSwicth style="margin-top: 15px" :isExpand="expand2"
@expand="(v) => expand2 = v">
<!-- <el-button type="primary" @click="btnClick({ value: 'add-signatory' })">新增</el-button> -->
<div class="list_panel">
<template v-for="item in contractSignatoryFormItems" :key="item.field">
<div class="list_item" :class="{ 'is_block': item.block }" v-if="item.visible ?? true">
<span class="item_label">{{ item.label }}:</span>
<span class="item_value" v-if="item.field == 'cpartyGuid'">{{ flowDetail.cpartyName || '--' }}</span>
<span class="item_value" v-else>{{ flowDetail.dpartyName || '--' }}</span>
</div>
</template>
</div>
</ContentWrap>
<ContentWrap id="payment-wrap" title="付款方式" expandSwicth style="margin-top: 15px" :isExpand="expand3"
@expand="(v) => expand3 = v">
<div class="list_panel">
<div class="list_item" :class="[payPlan ? 'is_block' : 'mr8']">
<span class="item_label">付款方式:</span>
<span class="item_value">{{ flowDetail.paymentWayName || '--' }}</span>
</div>
<div class="list_item mr8" v-if="!payPlan">
<span class="item_label">付款值:</span>
<span class="item_value">{{ flowDetail.paymentAmount ?
`${flowDetail.paymentAmount}(${flowDetail.paymentUnitName})` :
'--' }}</span>
</div>
<template v-else>
<template v-for="item in (flowDetail.phasePaymentRecordRSVOS || [])" :key="item.guid">
<div class="list_item mr8">
<span class="item_label">阶段内容:</span>
<span class="item_value">{{ item.phaseContent || '--' }}</span>
</div>
<div class="list_item mr8">
<span class="item_label">付款值:</span>
<span class="item_value">{{ item.paymentAmount ?
`${item.paymentAmount}(${item.paymentUnitName})` : '--' }}</span>
</div>
</template>
</template>
</div>
</ContentWrap>
<ContentWrap id="id-approveInfo" title="流程审批" expandSwicth style="margin-top: 15px" :isExpand="expand4"
@expand="(v) => expand4 = v">
<ApprovalProcess ref="approvalProcessRef" v-if="deploymentId" :deploymentId="deploymentId"
:processInstanceId="processInstanceId">
</ApprovalProcess>
</ContentWrap>
</div>
<div class="tool_btns">
<div class="btns">
<el-button @click="btnClick({ value: 'cancel' })" v-if="detailType == 'detail'">关闭</el-button>
</div>
</div>
</div>
</template>
<style scoped lang="scss">
.container_wrap {
overflow: hidden;
.content_main {
height: calc(100% - 45px);
overflow: hidden auto;
&.panel {
padding: 0 16px 16px;
}
&.full {
height: 100%;
}
.template_panel {
display: flex;
flex-wrap: wrap;
padding: 16px 16px 8px;
.title_item {
display: flex;
margin-bottom: 8px;
+.title_item {
margin-left: 40px;
}
.title_label {
display: block;
width: 80px;
line-height: 1.5;
}
.title_text {
line-height: 1.5;
}
&.is_block {
width: 100%;
margin-left: 0;
.title_text {
display: block;
width: calc(100% - 80px);
text-align: justify;
}
}
}
}
.panel_content {
height: 100%;
display: flex;
flex: 1;
border-top: 1px solid #d9d9d9;
.box_left {
width: 200px;
height: 100%;
border-right: 1px solid #d9d9d9;
.aside_title {
padding: 0 8px;
height: 40px;
line-height: 40px;
font-size: 14px;
color: #212121;
font-weight: 600;
}
.tree_panel {
height: 100%;
}
}
.box_right {
width: calc(100% - 200px);
padding-top: 8px;
.el-breadcrumb {
padding: 0 12px;
line-height: 40px;
}
}
}
.table_panel_wrap {
width: 100%;
height: 100%;
padding: 0 12px;
&.full {
padding: 0;
}
}
}
.list_panel {
display: flex;
flex-wrap: wrap;
.list_item {
width: 33.33%;
line-height: 32px;
font-size: 14px;
color: #666666;
display: flex;
justify-content: space-between;
.item_label {
width: 100px;
text-align: right;
}
.file_item {
width: 50%;
display: flex;
justify-content: space-between;
}
.item_value {
color: var(--el-color-regular);
padding: 0 16px;
flex: 1;
text-align: justify;
min-width: 0;
.file-operate {
display: flex;
align-items: center;
position: relative;
.file-img {
width: 24px;
height: 24px;
}
&:hover {
background-color: #f5f5f5;
}
.file-name {
color: var(--el-color-regular);
margin-left: 4px;
width: calc(100% - 108px);
}
.file-preview {
position: absolute;
cursor: pointer;
color: var(--el-color-primary);
margin-right: 8px;
}
}
.area_text+.area_text {
&::before {
content: '、',
}
}
}
&.is_block {
width: 100%;
.file_item {
width: 100%;
}
.item_value {
white-space: pre-wrap;
}
}
&.mr8 {
margin-right: 8px;
}
}
:deep(.el-form) {
width: 100%;
}
:deep(.panel_body) {
box-shadow: none;
}
&.label_auto {
.list_item {
.item_label {
width: auto;
}
.item_value {
padding-left: 0;
}
}
}
}
:deep(.el-form) {
.el-form-item .el-input__validateIcon {
display: none;
}
}
.tool_btns {
height: 44px;
margin: 0 -8px;
display: flex;
justify-content: center;
align-items: center;
border-top: 1px solid #d9d9d9;
}
}
</style>
......@@ -14,7 +14,9 @@ import {
costAssessAllow,
getRegisterCatalogTableDetail,
getEvaDetail,
getCostDetail
getCostDetail,
getDataReceiveContractDetail,
getCertificateDetail
} from "@/api/modules/dataAsset";
import { changeNum } from '@/utils/common'
import { ElMessage, ElMessageBox } from "element-plus";
......@@ -25,10 +27,12 @@ const router = useRouter();
const route = useRoute();
const userStore = useUserStore();
const userData = JSON.parse(userStore.userData)
const assetStore = useDataAssetStore();
const fullPath = route.fullPath;
const catalogGuid = route.query.guid;
const evaGuid = route.query.evaGuid;
const costAssessGuid = route.query.costAssessGuid;
const certificateGuid = route.query.certificateGuid;
const detailType = ref(route.query.type);
const { proxy } = getCurrentInstance() as any;
......@@ -40,6 +44,9 @@ const fullscreenLoading = ref(false);
const isTruncated = ref(false);
const isExpanded = ref(false);
/** 交付物结果数据 */
const deliveryDetailInfo: any = ref([]);
const baseInfoFormItems = ref([
{
label: '资源描述',
......@@ -79,6 +86,8 @@ const evaDetailInfo: any = ref({});
const costAssessDetail: any = ref({});
const certificateDetail: any = ref({});
const deploymentId = ref('');
const processInstanceId = ref('');
......@@ -102,7 +111,34 @@ const getDetailInfo = () => {
tab.meta.title = `详情-${data.damName}`;
}
isTextTruncated();
if (detailInfo.value.isRegister == 'Y') {
getDataReceiveContractDetail(catalogGuid).then((res: any) => {
if (res.code == proxy.$passCode) {
fullscreenLoading.value = false;
let dataInfo = res.data || [];
deliveryDetailInfo.value = [];
dataInfo.forEach(d => {
if (d.dataReceiveRSVOS?.length) {
d.dataReceiveRSVOS.forEach((rece, index) => {
deliveryDetailInfo.value.push({
uploadTime: d.uploadTime,
dataReceiveName: rece.dataReceiveName,
dataReceiveGuid: rece.dataReceiveGuid,
contractInfo: rece.contractInfo || [],
dataDeliveryName: d.dataDelivery[0].name,
rowspan: index + 1,
});
})
}
})
} else {
fullscreenLoading.value = false;
proxy.$ElMessage.error(res.msg);
}
});
} else {
fullscreenLoading.value = false;
}
} else {
fullscreenLoading.value = false;
proxy.$ElMessage.error(res.msg);
......@@ -133,10 +169,22 @@ const getDetailInfo = () => {
}
})
}
if (certificateGuid) {
getCertificateDetail({ guid: certificateGuid, serviceTenantGuid: route.query.tenantGuid }).then((res: any) => {
if (res.code == proxy.$passCode) {
const data = res.data || {};
certificateDetail.value = data;
} else {
ElMessage.error(res.msg);
}
})
}
}
onBeforeMount(() => {
if (!assetStore.isRefreshDamCatalog) {
getDetailInfo();
}
});
onActivated(() => {
......@@ -145,6 +193,10 @@ onActivated(() => {
document.title = `详情-${detailInfo.value?.damName}`;
}
}
if (assetStore.isRefreshDamCatalog) {
getDetailInfo();
assetStore.setDamCatalogRefresh(false);
}
});
onMounted(() => {
......@@ -891,6 +943,36 @@ const handleClick = () => {
}
};
const deliverySpanMethod = ({
row,
column,
rowIndex,
columnIndex,
}) => {
if (columnIndex === 0 || columnIndex === 1 || columnIndex === 4) {
let currentSpan = deliveryDetailInfo.value[rowIndex].rowspan;
let rowspan = deliveryDetailInfo.value[rowIndex + 1]?.rowspan
if (rowspan && rowspan > 1) {
return { rowspan: rowspan, colspan: 1 };
} else {
return { rowspan: currentSpan == 1 ? 1 : 0, colspan: currentSpan == 1 ? 1 : 0 }
}
} else {
return { rowspan: 1, colspan: 1 }
}
}
const clickContractDetail = (item) => {
router.push({
name: 'registerCatalogContractDetail',
query: {
guid: item.dataContractGuid,
name: item.dataContractName,
type: 'detail',
tenantGuid: userData.tenantGuid
}
})
}
</script>
......@@ -913,8 +995,8 @@ const handleClick = () => {
</div>
<div class="applicationScenarios"
:style="{ 'margin-right': (isTruncated && !isExpanded) ? '30px' : '0px', WebkitLineClamp: (!isTruncated ? 'inherit' : (isExpanded ? 'inherit' : 1)), WebkitBoxOrient: 'vertical' }">
{{ '覆盖地域:' + (detailInfo.coverageArea?.[0]?.[0] == 'all' ? '全国' : (detailInfo.coverageAreaName?.map(c =>
c.join('/')).join(',') ?? '--')) }}<span v-if="isTruncated" class="text_btn expand_btn"
{{'覆盖地域:' + (detailInfo.coverageArea?.[0]?.[0] == 'all' ? '全国' : (detailInfo.coverageAreaName?.map(c =>
c.join('/')).join(',') ?? '--'))}}<span v-if="isTruncated" class="text_btn expand_btn"
:style="{ position: isExpanded ? 'inherit' : 'absolute', 'margin-left': isExpanded ? '4px' : '0px' }"
@click="handleExpand()" v-preReClick>{{
isExpanded
......@@ -925,7 +1007,8 @@ const handleClick = () => {
<ContentWrap id="id-assetContent" title="基础信息" description="" style="margin: 0 16px">
<Form ref="baseInfoFormRef" :itemList="baseInfoFormItems" formId="base-info-form" />
</ContentWrap>
<ContentWrap id="id-table" title="资源表" v-if="detailInfo.damCatalogTableInfo?.length" description="" style="margin: 16px 16px 16px">
<ContentWrap id="id-table" title="资源表" v-if="detailInfo.damCatalogTableInfo?.length" description=""
style="margin: 16px 16px 16px">
<el-table v-show="!fullscreenLoading" ref="tableRef" :data="detailInfo.damCatalogTableInfo"
:highlight-current-row="true" stripe border @expand-change="handleTableExpandChange" height="100%"
tooltip-effect="light" row-key="guid" :style="{
......@@ -1017,8 +1100,9 @@ const handleClick = () => {
</el-table-column>
</el-table>
</ContentWrap>
<ContentWrap v-if="(route.query.type == 'qualityEvaluate' && evaDetailInfo?.qualityEvaluationFile?.length > 0) || (route.query.type == 'costAssess' && costAssessDetail?.costAssessmentFile?.length > 0)" id="id-assetContent"
title="附件信息" description="" style="margin: 16px 16px 16px">
<ContentWrap
v-if="(route.query.type == 'qualityEvaluate' && evaDetailInfo?.qualityEvaluationFile?.length > 0) || (route.query.type == 'costAssess' && costAssessDetail?.costAssessmentFile?.length > 0)"
id="id-assetContent" title="附件信息" description="" style="margin: 16px 16px 16px">
<div class="list_panel mt4">
<div class="list_item isFile" v-if="evaDetailInfo?.qualityEvaluationFile?.length" :style="{ width: '40%' }">
<span class="item_label" :style="{ width: 'auto', 'text-align': 'left' }">数据质量评价收集</span>
......@@ -1160,11 +1244,110 @@ const handleClick = () => {
</div>
</ContentWrap>
<ContentWrap v-if="(route.query.type == 'qualityEvaluate' && evaDetailInfo.approveVO && evaDetailInfo.isApprove !='N') || (route.query.type == 'costAssess' && costAssessDetail.approveVO && costAssessDetail.isApprove !='N')" id="id-approveInfo"
title="审批信息" description="" style="margin: 16px 16px 16px">
<ApprovalProcess ref="approvalProcessRef" v-if="deploymentId" :deploymentId="deploymentId" :processInstanceId="processInstanceId">
<ContentWrap id="id-certificate" title="证件信息" v-if="route.query.type == 'certificate'" style="margin: 16px 16px 16px" >
<div class="list_panel">
<div class="list_item">
<span class="item_label">证件编码:</span>
<span class="item_value">{{ certificateDetail.daCode ?? '--' }}</span>
</div>
<div class="list_item">
<span class="item_label">登记时间:</span>
<span class="item_value">{{ certificateDetail.registerTime ?? '--' }}</span>
</div>
<div class="list_item">
<span class="item_label">有效期:</span>
<span class="item_value">{{ certificateDetail.effectiveDate ?? '--' }}</span>
</div>
<div class="list_item">
<span class="item_label">发证主体:</span>
<span class="item_value"><ellipsis-tooltip :content="certificateDetail.issuingEntityName ?? '--'"
class-name="w100f mr8-i" :refName="'tooltipOver' + 'issuingEntityName'"></ellipsis-tooltip></span>
</div>
<div class="list_item">
<span class="item_label">证件类型:</span>
<span class="item_value">{{ certificateDetail.documentType == 1 ? 'A证' : (certificateDetail.documentType == 2 ? 'B证' :
'C证') }}</span>
</div>
<div class="list_item">
<span class="item_label">证件类别:</span>
<span class="item_value">{{ certificateDetail.documentCategoryName ?? '--' }}</span>
</div>
<div class="list_item is_block" v-if="certificateDetail.documentFile?.length" :style="{ 'max-width': '700px' }">
<span class="item_label">证件:</span>
<span class="item_value">
<div class="file-operate">
<template
v-if="certificateDetail.documentFile?.[0]?.name.substring(certificateDetail.documentFile?.[0]?.name.lastIndexOf('.') + 1).toLowerCase() == 'xls' || certificateDetail.documentFile?.[0]?.name.substring(certificateDetail.documentFile?.[0]?.name.lastIndexOf('.') + 1).toLowerCase() == 'xlsx'">
<img class="file-img" src="../../assets/images/excel.png" />
</template>
<template
v-else-if="certificateDetail.documentFile?.[0]?.name.substring(certificateDetail.documentFile?.[0]?.name.lastIndexOf('.') + 1).toLowerCase() == 'doc' || certificateDetail.documentFile?.[0]?.name.substring(certificateDetail.documentFile?.[0]?.name.lastIndexOf('.') + 1).toLowerCase() == 'docx'">
<img class="file-img" src="../../assets/images/word.png" />
</template>
<template
v-else-if="certificateDetail.documentFile?.[0]?.name.substring(certificateDetail.documentFile?.[0]?.name.lastIndexOf('.') + 1).toLowerCase() == 'zip'">
<img class="file-img" src="../../assets/images/zip.png" />
</template>
<template
v-else-if="certificateDetail.documentFile?.[0]?.name.substring(certificateDetail.documentFile?.[0]?.name.lastIndexOf('.') + 1).toLowerCase() == 'rar'">
<img class="file-img" src="../../assets/images/RAR.png" />
</template>
<template
v-else-if="certificateDetail.documentFile?.[0]?.name.substring(certificateDetail.documentFile?.[0]?.name.lastIndexOf('.') + 1).toLowerCase() == 'pdf'">
<img class="file-img" src="../../assets/images/PDF.png" />
</template>
<template
v-else-if="certificateDetail.documentFile?.[0]?.name.substring(certificateDetail.documentFile?.[0]?.name.lastIndexOf('.') + 1).toLowerCase() == 'png'">
<img class="file-img" src="../../assets/images/png.png" />
</template>
<template
v-else-if="certificateDetail.documentFile?.[0]?.name.substring(certificateDetail.documentFile?.[0]?.name.lastIndexOf('.') + 1).toLowerCase() == 'jpg' || certificateDetail.documentFile?.[0]?.name.substring(certificateDetail.documentFile?.[0]?.name.lastIndexOf('.') + 1).toLowerCase() == 'jpeg'">
<img class="file-img" src="../../assets/images/jpg.png" />
</template>
<div class="file-name"><ellipsis-tooltip :content="certificateDetail.documentFile[0].name ?? ''"
class-name="w100f" refName="tooltipOver"></ellipsis-tooltip></div>
<div :style="{ right: '36px' }" class="file-preview"
v-if="certificateDetail.documentFile?.[0]?.name.substring(certificateDetail.documentFile?.[0]?.name.lastIndexOf('.') + 1).toLowerCase() == 'pdf' || certificateDetail.documentFile?.[0]?.name.substring(certificateDetail.documentFile?.[0]?.name.lastIndexOf('.') + 1).toLowerCase() == 'png' || certificateDetail.documentFile?.[0]?.name.substring(certificateDetail.documentFile?.[0]?.name.lastIndexOf('.') + 1).toLowerCase() == 'jpg' || certificateDetail.documentFile?.[0]?.name.substring(certificateDetail.documentFile?.[0]?.name.lastIndexOf('.') + 1).toLowerCase() == 'jpeg'"
@click="onUploadFilePreview(certificateDetail.documentFile?.[0])">查看</div>
<div :style="{ right: '0px' }" class="file-preview"
@click="onUploadFileDownload(certificateDetail.documentFile?.[0])">下载</div>
</div>
</span>
</div>
</div>
</ContentWrap>
<ContentWrap
v-if="(route.query.type == 'qualityEvaluate' && evaDetailInfo.approveVO && evaDetailInfo.isApprove != 'N') || (route.query.type == 'costAssess' && costAssessDetail.approveVO && costAssessDetail.isApprove != 'N')"
id="id-approveInfo" title="审批信息" description="" style="margin: 16px 16px 16px">
<ApprovalProcess ref="approvalProcessRef" v-if="deploymentId" :deploymentId="deploymentId"
:processInstanceId="processInstanceId">
</ApprovalProcess>
</ContentWrap>
<ContentWrap v-if="route.query.type == 'asset' && deliveryDetailInfo.length" id="id-deliverFile" title="交付物" description=""
style="margin: 16px 16px 16px">
<el-table ref="deliveryTableRef" :data="deliveryDetailInfo" :highlight-current-row="true" stripe border
height="100%" :span-method="deliverySpanMethod" tooltip-effect="light" row-key="guid" :style="{
width: '100%',
display: 'inline-block',
}">
<el-table-column label="序号" type="index" width="56px" align="center" >
</el-table-column>
<el-table-column prop="dataDeliveryName" label="数据交付物" width="240px" align="left" >
</el-table-column>
<el-table-column prop="dataReceiveName" label="数据接收方" width="240px" align="left">
</el-table-column>
<el-table-column prop="contract" label="合同" min-width="200px" align="left">
<template #default="scope">
<a v-for="item in scope.row.contractInfo" underline="hover" style="margin-right: 12px;cursor: pointer;" @click="clickContractDetail(item)">{{
item.dataContractName }}</a>
</template>
</el-table-column>
<el-table-column prop="uploadTime" label="上传时间" width="180px" align="left">
</el-table-column>
</el-table>
</ContentWrap>
</div>
<div class="tool_btns"
v-if="toolBtns.length && (route.query.type == 'qualityEvaluate' || route.query.type == 'costAssess' || route.query.type == 'asset')">
......
......@@ -12,11 +12,13 @@ import {
getParamsList,
getDamCatalogTable,
registerCatalogDelete,
getDamTypesList
getDamTypesList,
getDataReceiveContract
} from "@/api/modules/dataAsset";
import { commonPageConfig } from "@/utils/enum";
import useDataAssetStore from "@/store/modules/dataAsset";
import useUserStore from "@/store/modules/user";
import deliverUploadDialog from "./components/deliverUploadDialog.vue";
const userStore = useUserStore();
const userData = JSON.parse(userStore.userData);
......@@ -115,8 +117,6 @@ const searchItemList = ref([
},
]);
const pageInfo = ref({
...commonPageConfig,
rows: 0,
......@@ -353,6 +353,46 @@ const handleWindowResize = () => {
});
};
/** 上传交付物相关逻辑 */
const deliverUploadVisible = ref(false);
const deliverDataReceiveContract = ref([]);
const getReceivePromise: any = ref(null);
const uploadDeliverItem: any = ref({});
const handleClickUploadBtn = (item) => {
if (getReceivePromise.value) {
return;
}
uploadDeliverItem.value = item;
getReceivePromise.value = getDataReceiveContract().then((res: any) => {
getReceivePromise.value = null
if (res.code == proxy.$passCode) {
deliverDataReceiveContract.value = res.data || [];
if (!deliverDataReceiveContract.value?.length) {
proxy.$ElMessage.error('没有可选择的数据接收方和合同,无法上传交付物');
} else {
deliverUploadVisible.value = true;
}
} else {
proxy.$ElMessage.error(res.msg);
}
})
}
const handleUploadClose = (itemGuid) => {
deliverUploadVisible.value = false
if (itemGuid) {
assetStore.setDamCatalogRefresh(true);
router.push({
name: "registerCatalogDetail",
query: { guid: itemGuid, type: "asset" },
});
}
}
</script>
<template>
......@@ -445,6 +485,7 @@ const handleWindowResize = () => {
<el-button plain v-if="!(item.isRegister == 'Y' || item.foundMode == 2) && item.foundMode != 3"
@click.stop="tableBtnClick(item, 'delete')">删除</el-button>
<el-button plain v-if="!(item.isRegister == 'Y') && item.foundMode != 3" @click.stop="handleDataClick(item)">编辑</el-button>
<el-button plain @click.stop="handleClickUploadBtn(item)" v-if="item.isRegister == 'Y'">上传交付物</el-button>
<el-button plain @click.stop="handleDataClick(item)" v-if="(item.isRegister == 'Y' || item.foundMode == 3)">详情</el-button>
</div>
</div>
......@@ -457,6 +498,7 @@ const handleWindowResize = () => {
</div>
<PageNav :class="[pageInfo.type]" :pageInfo="pageInfo" @pageChange="pageChange" />
<deliverUploadDialog :uploadDeliverItem="uploadDeliverItem" :visible="deliverUploadVisible" :listData="deliverDataReceiveContract" @close="handleUploadClose"></deliverUploadDialog>
</div>
</template>
......
......@@ -1760,10 +1760,14 @@ const passCommonDialogBtnClick = (btn, info) => {
class-name="w100f mr8-i" :refName="'tooltipOver' + 'issuingEntityName'"></ellipsis-tooltip></span>
</div>
<div class="list_item">
<span class="item_label">类型:</span>
<span class="item_label">证件类型:</span>
<span class="item_value">{{ detailInfo.documentType == 1 ? 'A证' : (detailInfo.documentType == 2 ? 'B证' :
'C证') }}</span>
</div>
<div class="list_item">
<span class="item_label">证件类别:</span>
<span class="item_value">{{ detailInfo.documentCategoryName ?? '--' }}</span>
</div>
<div class="list_item is_block" v-if="detailInfo.documentFile?.length" :style="{ 'max-width': '700px' }">
<span class="item_label">证件:</span>
<span class="item_value">
......
<template>
<div class="content_main">
<div class="loading-main" v-show="loadingProcess">
<div class="row-main">
<img class="loading-img" src="../../assets/images/loading.gif" />
<div class="title-first" style=" margin-left: 22px;">正在检测您的账号安全状态,请稍后……</div>
</div>
<div class="row-main mt15">
<el-icon style="width: 30px;height: 24px;" color="#1ba854" class="small">
<CircleCheckFilled />
</el-icon>
<div class="title-desc">IP认证成功</div>
</div>
<div class="row-main mt15">
<div class="circle-main">
<div class="circle"></div>
</div>
<div class="title-desc">通行密钥认证</div>
</div>
</div>
<div class="loading-main" v-show="!loadingProcess">
<div class="row-main">
<el-icon style="width: 32px;height: 32px;" color="#1ba854" class="big">
<CircleCheckFilled />
</el-icon>
<div class="title-first" style=" margin-left: 22px;">认证通过</div>
</div>
<div class="row-main mt15">
<el-icon style="width: 30px;height: 24px;" color="#1ba854" class="small">
<CircleCheckFilled />
</el-icon>
<div class="title-desc">IP认证成功</div>
</div>
<div class="row-main mt15">
<el-icon style="width: 30px;height: 24px;" color="#1ba854" class="small">
<CircleCheckFilled />
</el-icon>
<div class="title-desc">通行密钥认证</div>
</div>
</div>
<div class="file-down" v-if="!loadingProcess && file.name">
<div class="title-first">交付物下载</div>
<div class="file-row-main">
<div class="file-operate">
<template
v-if="file.name.substring(file.name.lastIndexOf('.') + 1).toLowerCase() == 'xls' || file.name.substring(file.name.lastIndexOf('.') + 1).toLowerCase() == 'xlsx'">
<img class="file-img" src="../../assets/images/excel.png" />
</template>
<template
v-else-if="file.name.substring(file.name.lastIndexOf('.') + 1).toLowerCase() == 'doc' || file.name.substring(file.name.lastIndexOf('.') + 1).toLowerCase() == 'docx'">
<img class="file-img" src="../../assets/images/word.png" />
</template>
<template v-else-if="file.name.substring(file.name.lastIndexOf('.') + 1).toLowerCase() == 'zip'">
<img class="file-img" src="../../assets/images/zip.png" />
</template>
<template v-else-if="file.name.substring(file.name.lastIndexOf('.') + 1).toLowerCase() == 'rar'">
<img class="file-img" src="../../assets/images/RAR.png" />
</template>
<template v-else-if="file.name.substring(file.name.lastIndexOf('.') + 1).toLowerCase() == 'pdf'">
<img class="file-img" src="../../assets/images/PDF.png" />
</template>
<template v-else-if="file.name.substring(file.name.lastIndexOf('.') + 1).toLowerCase() == 'png'">
<img class="file-img" src="../../assets/images/png.png" />
</template>
<template
v-else-if="file.name.substring(file.name.lastIndexOf('.') + 1).toLowerCase() == 'jpg' || file.name.substring(file.name.lastIndexOf('.') + 1).toLowerCase() == 'jpeg'">
<img class="file-img" src="../../assets/images/jpg.png" />
</template>
<div class="file-name"
:style="{ width: ['pdf', 'png', 'jpg', 'jpeg'].includes(file?.name?.substring(file.name.lastIndexOf('.') + 1).toLowerCase() ?? '') ? 'calc(100% - 300px)' : 'calc(100% - 290px)' }">
<ellipsis-tooltip :content="file.name" class-name="w100f"
:refName="'tooltipOver' + file.name"></ellipsis-tooltip>
</div>
<div class="upload-time" :style="{ right: 32 }" v-if="uploadTime"> {{ '上传时间:' + uploadTime }} </div>
<div :style="{ right: 0 }" class="file-preview" @click="onUploadFileDownload(file)">下载
</div>
</div>
</div>
</div>
</div>
</template>
<script lang="ts" setup name="downDeliveryFile">
import { onUploadFileDownload } from '@/api/modules/common';
import {
CircleCheckFilled
} from "@element-plus/icons-vue";
import {
getDeliveryFileDetail
} from '@/api/modules/dataTrustedSpace';
const { proxy } = getCurrentInstance() as any;
const route = useRoute()
const file = ref({
name: '',
url: ''
});
const uploadTime = ref('');
const loadingProcess = ref(true);
onActivated(() => {
loadingProcess.value = true;
getDeliveryFileDetail(route.query.guid).then((res: any) => {
if (res.code == proxy.$passCode) {
file.value = res.data?.dataDelivery?.[0] || {
name: '',
url: ''
};
uploadTime.value = res.data?.uploadTime || '';
setTimeout(() => {
loadingProcess.value = false;
}, 1000)
} else {
proxy.$ElMessage.error(res.msg);
}
})
})
onBeforeMount(() => {
})
</script>
<style lang="scss" scoped>
.content_main {
display: flex;
background-color: #f5f5f6;
padding: 24px 120px 0px;
height: 100%;
width: 100%;
flex-direction: column;
}
.loading-main {
height: 162px;
background: #F2F9FF;
border: 1px solid rgba(182, 213, 241, 1);
padding: 30px 56px;
width: 100%;
.title-desc {
font-size: 14px;
color: #212121;
line-height: 24px;
font-weight: 400;
margin-left: 22px;
}
}
.title-first {
font-size: 20px;
color: #212121;
line-height: 30px;
font-weight: 600;
}
.row-main {
display: flex;
}
.loading-img {
width: 28px;
height: 28px;
}
:deep(.el-icon.small) {
svg {
width: 20px;
height: 20px;
}
}
:deep(.el-icon.big) {
svg {
width: 32px;
height: 32px;
}
}
.circle-main {
width: 30px;
height: 24px;
display: flex;
justify-content: center;
align-items: center;
}
.circle {
border-radius: 100%;
border: 1px solid #b2b2b2;
width: 16px;
height: 16px;
}
.mt15 {
margin-top: 12px;
}
.file-down {
padding: 24px;
display: flex;
flex-direction: column;
border: 1px solid #d9d9d9;
background-color: #fff;
margin-top: 22px;
.file-row-main {
height: 48px;
background-color: #f5f5f5;
padding: 8px 24px;
margin-top: 12px;
justify-content: center;
display: flex;
}
}
.file-operate {
display: flex;
align-items: center;
position: relative;
width: 100%;
.file-img {
width: 30px;
height: 30px;
}
&:hover {
background-color: #f5f5f5;
}
}
.file-name {
margin-left: 4px;
margin-right: 4px;
width: calc(100% - 130px);
color: #212121;
font-size: 14px;
}
.upload-time {
color: #212121;
font-size: 14px;
}
.file-preview {
position: absolute;
cursor: pointer;
color: var(--el-color-primary);
margin-right: 8px;
font-size: 14px;
}
</style>
\ No newline at end of file
<template>
<div class="home-full-wrap" v-loading="fullscreenLoading">
<div v-show="releaseYears.length" class="home-dam-circule-main">
<div class="home-dam-main">
<div class="row-search-main">
<div class="row">
<span class="arg-name">交付年份</span>
<span class="value-per" v-for="(item) in [{ paramValue: 0, paramName: '全部' }].concat(releaseYears)"
:class="{ 'isActive': releaseYear == item.paramValue }" @click="releaseYear = item.paramValue">{{
item.paramName
}}</span>
</div>
<div class="row">
<span class="arg-name">产品分类</span>
<span class="value-per" v-for="(item) in [{ paramValue: '0', paramName: '全部' }].concat(damTypes)"
:class="{ 'isActive': damType == item.paramValue }" @click="damType = item.paramValue">{{ item.paramName
}}</span>
</div>
<div class="row">
<span class="arg-name">主题</span>
<span class="value-per" v-for="(item) in subjectDomainList"
:class="{ 'isActive': subjectDomainFirst == item.paramValue }"
@click="subjectDomainFirst = item.paramValue">{{
item.paramName }}</span>
</div>
<!-- <div class="btn-clear" @click="handleClickClear">
<el-icon :size="18" color="#b2b2b2">
<Delete />
</el-icon>
清除
</div> -->
</div>
<div style="min-height: 250px;" v-loading="listDataLoading">
<template v-for="(tenantName) in Object.keys(productListData)">
<div class="data-header-input">
<div>{{ '数据交付方:' + tenantName }}</div>
</div>
<div class="data-content">
<div :class="selectDataInfo.guid == item.guid ? 'selected card-content' : 'card-content'"
v-for="(item, index) in productListData[tenantName]" :key="item.guid"
@click="handleDataClick(item, index)">
<div class="header">
<img class="left-img"
:src="damTypes.find(d => d.paramValue == item['damType'])?.iconPath && JSON.parse(damTypes.find(d => d.paramValue == item['damType'])?.iconPath).url || defaultItemLogo"
alt="" />
<div class="right-main">
<div class="title1">{{ item['damName'] ?? '--' }}</div>
<div class="label-main">
<div class="dataLabel" v-if="item.subjectDomain">{{ ((subjectDomainFirst == '1' ?
item.subjectDomainName :
item.departmentName)) || '--' }}</div>
<div class="dataLabel ml-4px">{{damTypes.find(d => d.paramValue == item['damType'])?.paramName}}
</div>
<div class="dataCount" v-if="item.caseNumber != null">{{ changeNum(item.caseNumber, 0) + '例'
}}</div>
</div>
</div>
</div>
<div class="description"
style="height: 42px; display: -webkit-box; -webkit-line-clamp: 2; line-clamp: 2; -webkit-box-orient: vertical;margin-top: 16px;">
{{ item['propertyDescription'] ?? '--' }}</div>
<div class="description" style="margin-top: 12px;">
{{ '交付时间:' + (item['uploadTime'] ?? '--') }}
</div>
</div>
</div>
</template>
<div v-if="!listDataLoading && !Object.keys(productListData).length" class="full-noData"
style="margin: 24px;width: calc(100% - 48px);">
<img :src="getAssetsImages('no-data.png')" :style="{ width: '96px', height: '96px' }" />
<span>暂无数据</span>
</div>
</div>
</div>
<div class="dam-detail-right" v-loading="detailLoading">
<div v-show="!selectDataInfo.guid" class="full-noData">
<img :src="getAssetsImages('no-data.png')" :style="{ width: '96px', height: '96px' }" />
<span>暂无数据</span>
</div>
<div v-show="selectDataInfo.guid" class="dam-detail">
<div class="title-header">{{ selectDataInfo['damName'] }}</div>
<div class="description" style="margin-top: 12px;">{{ selectDataInfo['propertyDescription'] ?? '--' }}</div>
<div class="description" style="margin-top: 24px;">
{{ '交付时间:' + (selectDataInfo['uploadTime'] ?? '--') }}
</div>
<el-button class="down-btn" :icon="Download" @click="handleDownFile">立即下载</el-button>
</div>
<div class="header-row" v-show="certificateListInfo.length">
<div class="line-column"></div>
<span class="title">{{ '确权信息' }} </span>
</div>
<div class="info-content" v-for="item in certificateListInfo">
<div class="list_item">{{ '类别:' + item.documentCategoryName }}</div>
<div class="list_item">{{ '登记机构:' + item.tenantName }}</div>
<div class="list_item">{{ item.documentCategory == '1' ? ('登记日期:' + item.registerTime) : ('有效期:' +
item.createTime +
'至' + item.effectiveDate) }}</div>
<div class="list_item">{{ '登记名称:' + item.daName }}</div>
<div class="list_item">{{ '登记主体:' + item.issuingEntityName }}</div>
<div class="list_item"><span>{{ '证书:' }}</span>
<div class="file-operate" style="width: calc(100% - 42px);">
<template
v-if="item.file.name.substring(item.file.name.lastIndexOf('.') + 1).toLowerCase() == 'xls' || item.file.name.substring(item.file.name.lastIndexOf('.') + 1).toLowerCase() == 'xlsx' || item.file.name.substring(item.file.name.lastIndexOf('.') + 1).toLowerCase() == 'csv'">
<img class="file-img" src="../../assets/images/excel.png" />
</template>
<template
v-else-if="item.file.name.substring(item.file.name.lastIndexOf('.') + 1).toLowerCase() == 'doc' || item.file.name.substring(item.file.name.lastIndexOf('.') + 1).toLowerCase() == 'docx'">
<img class="file-img" src="../../assets/images/word.png" />
</template>
<template
v-else-if="item.file.name.substring(item.file.name.lastIndexOf('.') + 1).toLowerCase() == 'zip'">
<img class="file-img" src="../../assets/images/zip.png" />
</template>
<template
v-else-if="item.file.name.substring(item.file.name.lastIndexOf('.') + 1).toLowerCase() == 'rar'">
<img class="file-img" src="../../assets/images/RAR.png" />
</template>
<template
v-else-if="item.file.name.substring(item.file.name.lastIndexOf('.') + 1).toLowerCase() == 'pdf'">
<img class="file-img" src="../../assets/images/PDF.png" />
</template>
<template
v-else-if="item.file.name.substring(item.file.name.lastIndexOf('.') + 1).toLowerCase() == 'png'">
<img class="file-img" src="../../assets/images/png.png" />
</template>
<template
v-else-if="item.file.name.substring(item.file.name.lastIndexOf('.') + 1).toLowerCase() == 'jpg' || item.file.name.substring(item.file.name.lastIndexOf('.') + 1).toLowerCase() == 'jpeg'">
<img class="file-img" src="../../assets/images/jpg.png" />
</template>
<div class="file-name"><ellipsis-tooltip :content="item.file.name ?? ''" class-name="w100f"
refName="tooltipOver"></ellipsis-tooltip></div>
<div :style="{ right: '0px' }"
v-if="item.file.name.substring(item.file.name.lastIndexOf('.') + 1).toLowerCase() == 'pdf' || item.file.name.substring(item.file.name.lastIndexOf('.') + 1).toLowerCase() == 'png' || item.file.name.substring(item.file.name.lastIndexOf('.') + 1).toLowerCase() == 'jpg' || item.file.name.substring(item.file.name.lastIndexOf('.') + 1).toLowerCase() == 'jpeg'"
class="file-preview" @click="onUploadFilePreview(item.file)">查看</div>
<!-- <div :style="{ right: '0px' }" class="file-preview"
@click="onUploadFileDownload(item.file)">下载</div> -->
</div>
</div>
</div>
<div class="header-row" v-show="complianceListInfo.length">
<div class="line-column"></div>
<span class="title">{{ '合规信息' }} </span>
</div>
<div class="info-content" v-for="item in complianceListInfo">
<div class="list_item">{{ '类别:' + item.type }}</div>
<div class="list_item">{{ '出具机构:' + item.institution }}</div>
<div class="list_item">{{ '出具日期:' + item.issueTime }}</div>
<div class="list_item"><span>{{ item.type + ':' }}</span>
<div class="file-operate">
<template
v-if="item.file.name.substring(item.file.name.lastIndexOf('.') + 1).toLowerCase() == 'xls' || item.file.name.substring(item.file.name.lastIndexOf('.') + 1).toLowerCase() == 'xlsx' || item.file.name.substring(item.file.name.lastIndexOf('.') + 1).toLowerCase() == 'csv'">
<img class="file-img" src="../../assets/images/excel.png" />
</template>
<template
v-else-if="item.file.name.substring(item.file.name.lastIndexOf('.') + 1).toLowerCase() == 'doc' || item.file.name.substring(item.file.name.lastIndexOf('.') + 1).toLowerCase() == 'docx'">
<img class="file-img" src="../../assets/images/word.png" />
</template>
<template
v-else-if="item.file.name.substring(item.file.name.lastIndexOf('.') + 1).toLowerCase() == 'zip'">
<img class="file-img" src="../../assets/images/zip.png" />
</template>
<template
v-else-if="item.file.name.substring(item.file.name.lastIndexOf('.') + 1).toLowerCase() == 'rar'">
<img class="file-img" src="../../assets/images/RAR.png" />
</template>
<template
v-else-if="item.file.name.substring(item.file.name.lastIndexOf('.') + 1).toLowerCase() == 'pdf'">
<img class="file-img" src="../../assets/images/PDF.png" />
</template>
<template
v-else-if="item.file.name.substring(item.file.name.lastIndexOf('.') + 1).toLowerCase() == 'png'">
<img class="file-img" src="../../assets/images/png.png" />
</template>
<template
v-else-if="item.file.name.substring(item.file.name.lastIndexOf('.') + 1).toLowerCase() == 'jpg' || item.file.name.substring(item.file.name.lastIndexOf('.') + 1).toLowerCase() == 'jpeg'">
<img class="file-img" src="../../assets/images/jpg.png" />
</template>
<div class="file-name"><ellipsis-tooltip :content="item.file.name ?? ''" class-name="w100f"
refName="tooltipOver"></ellipsis-tooltip></div>
<div :style="{ right: '0px' }"
v-if="item.file.name.substring(item.file.name.lastIndexOf('.') + 1).toLowerCase() == 'pdf' || item.file.name.substring(item.file.name.lastIndexOf('.') + 1).toLowerCase() == 'png' || item.file.name.substring(item.file.name.lastIndexOf('.') + 1).toLowerCase() == 'jpg' || item.file.name.substring(item.file.name.lastIndexOf('.') + 1).toLowerCase() == 'jpeg'"
class="file-preview" @click="onUploadFilePreview(item.file)">查看</div>
<!-- <div :style="{ right: '0px' }" class="file-preview"
@click="onUploadFileDownload(item.file)">下载</div> -->
</div>
</div>
</div>
</div>
</div>
<div v-show="!releaseYears.length" class="full-noData">
<img :src="getAssetsImages('no-data.png')" :style="{ width: '96px', height: '96px' }" />
<span>暂无数据</span>
</div>
</div>
</template>
<script lang="ts" setup name="trustedSpaceIndex">
import { ref } from "vue";
import {
getParamsList,
getReleaseYears,
getSubjectDomainDataTree,
getReleaseListData,
getReleaseDataCertiDetail
} from '@/api/modules/dataTrustedSpace';
import {
Download
} from "@element-plus/icons-vue";
import {
getComplianceDetail
} from '@/api/modules/securityMenu';
import { cloneDeep } from "lodash-es";
import { changeNum } from "@/utils/common";
import useUserStore from '@/store/modules/user';
import { onUploadFilePreview, onUploadFileDownload } from '@/api/modules/common';
import router from "@/router";
const defaultItemLogo = getAssetsImages('dam-catalog-detail.png')
const userStore = useUserStore();
const { proxy } = getCurrentInstance() as any;
function getAssetsImages(name) {
return new URL(`../../assets/images/${name}`, import.meta.url).href;
}
const fullscreenLoading = ref(false);
const detailLoading = ref(false);
const releaseYears: any = ref([]);
const damTypes: any = ref([]);
const damType = ref('0');
const releaseYear = ref(0);
const subjectDomainList: any = ref([]);
/** 记录主题第一级的选中值 */
const subjectDomainFirst = ref('2');
const pageInfo = ref({
size: -1,
curr: 1,
limit: 12,
rows: 0,
type: "normal",
name: "",
pageSizeShow: false,
});
/** 确权信息数据 */
const certificateListInfo: any = ref([]);
/** 合规信息数据 */
const complianceListInfo: any = ref([]);
const selectDataInfo: any = ref({});
const productListData: any = ref({});
const listDataLoading = ref(false);
/** 当前正在获取列表数据的参数 */
const queryCache: any = ref(null);
const getDataPromise = ref();
const getTableData = () => {
listDataLoading.value = true;
let v = {
releaseYear: releaseYear.value == 0 ? null : releaseYear.value,
damType: damType.value == '0' ? null : damType.value,
subjectDomain: subjectDomainFirst.value
};
if (queryCache.value?.damType == v.damType && queryCache.value?.subjectDomain == v.subjectDomain && queryCache.value?.releaseYear === v.releaseYear) {
return Promise.resolve();
}
let lastGetDataPromise: any = null;
queryCache.value = cloneDeep(v);
return getDataPromise.value = lastGetDataPromise = getReleaseListData({
pageSize: -1,
pageIndex: pageInfo.value.curr,
damType: queryCache.value.damType,
subjectDomain: queryCache.value.subjectDomain ? [queryCache.value.subjectDomain] : null,
releaseYear: queryCache.value.releaseYear
}).then((res: any) => {
if (getDataPromise.value != lastGetDataPromise) {
return;
}
getDataPromise.value = null;
queryCache.value = null;
listDataLoading.value = false;
fullscreenLoading.value = false;
if (res === undefined) {
return;
}
if (res.code == proxy.$passCode) {
const data = res.data || {}
productListData.value = data;
// productListData.value['北京'] = data['北京传世博润科技有限公司'];
let keys = Object.keys(productListData.value);
if (keys.length) {
selectDataInfo.value = productListData.value[keys[0]]?.[0] || {};
} else {
selectDataInfo.value = {};
}
} else {
proxy.$ElMessage.error(res.msg);
}
});
}
const showDetailItem: any = ref(null);
const oldScrollTop = ref(0);
// 回到顶部
function toTop(className: string) {
requestAnimationFrame(() => {
let dom = document.getElementsByClassName(className)[0]
dom.scrollIntoView({
block: 'start',
behavior: 'instant',
})
})
}
const handleDataClick = (item, index) => {
selectDataInfo.value = item;
}
function clearPageInfo() {
pageInfo.value.curr = 1;
}
watch(() => damType.value, () => {
clearPageInfo()
getTableData();
})
watch(() => releaseYear.value, () => {
clearPageInfo()
getTableData();
})
watch(() => selectDataInfo.value.damGuid, (val) => {
if (!val) {
complianceListInfo.value = [];
certificateListInfo.value = [];
return;
}
let ps: any = [];
detailLoading.value = true;
ps.push(getReleaseDataCertiDetail(val).then((res: any) => {
if (res.code == proxy.$passCode) {
certificateListInfo.value = res.data?.map(d => {
d.file = d.documentFile?.[0];
return d;
}) || [];
} else {
detailLoading.value = false;
proxy.$ElMessage.error(res.msg);
}
}))
ps.push(getComplianceDetail(val).then((res: any) => {
if (res.code == proxy.$passCode) {
let data = res.data || {};
complianceListInfo.value = [];
if (data.complianceEvaluateReport?.length) {
complianceListInfo.value.push({
type: '合规评估报告',
file: data.complianceEvaluateReport[0],
institution: data.reportIssuingInstitution,
issueTime: data.reportIssuingTime
});
}
if (data.complianceLegalOpinion?.length) {
complianceListInfo.value.push({
type: '合规法律意见书',
file: data.complianceLegalOpinion[0],
institution: data.opinionIssuingInstitution,
issueTime: data.opinionIssuingTime
});
}
if (data.entryComplianceProgram?.length) {
complianceListInfo.value.push({
type: '入表合规方案',
file: data.entryComplianceProgram[0],
institution: data.planIssuingInstitution,
issueTime: data.planIssuingTime
});
}
} else {
detailLoading.value = false;
proxy.$ElMessage.error(res.msg);
}
}))
Promise.all(ps).then(() => {
detailLoading.value = false;
})
}, {
immediate: true,
deep: true
})
onBeforeMount(() => {
fullscreenLoading.value = true;
let ps: any = [];
ps.push(getReleaseYears().then((res: any) => {
if (res.code == proxy.$passCode) {
releaseYears.value = res.data?.map(d => {
return {
paramValue: d,
paramName: d
}
}) || [];
} else {
fullscreenLoading.value = false;
proxy.$ElMessage.error(res.msg);
}
}));
ps.push(getParamsList({ dictType: '资产类型' }).then((resp: any) => {
if (resp.code == '00000') {
damTypes.value = resp.data || [];
damTypes.value.forEach(item => {
item.paramValue = item.value;
item.paramName = item.label;
})
} else {
fullscreenLoading.value = false;
proxy.$ElMessage.error(resp.msg);
}
}));
ps.push(getSubjectDomainDataTree().then((res: any) => {
if (res.code == '00000') {
subjectDomainList.value = res.data || [];
subjectDomainFirst.value = subjectDomainList?.[0]?.paramValue || '2';
} else {
fullscreenLoading.value = false;
proxy.$ElMessage.error(res.msg);
}
}));
Promise.all(ps).then((res) => {
getTableData().then(() => {
fullscreenLoading.value = false;
})
})
})
onMounted(() => {
})
const handleDownFile = () => {
router.push({
name: 'downDeliveryFile',
query: {
damName: selectDataInfo.value.damName,
guid: selectDataInfo.value.guid
}
});
}
</script>
<style lang="scss" scoped>
.home-full-wrap {
height: 100%;
width: 100%;
overflow-y: auto;
overflow-x: hidden;
background-color: #f5f5f6;
}
.home-dam-circule-main {
// height: 100%;
display: flex;
justify-content: space-between;
.home-dam-main {
background-color: #fff;
width: calc(100% - 456px);
min-height: 600px;
}
}
.row-search-main {
position: relative;
height: auto;
margin: 20px 24px;
background-color: #fff;
.arg-name {
display: inline-block;
width: 84px;
text-align: left;
flex-shrink: 0;
color: #666666;
}
.row {
margin-bottom: 18px;
&.check {
display: flex;
align-items: flex-start;
margin-bottom: 12px;
}
}
.value-per {
margin-right: 12px;
cursor: pointer;
font-size: 14px;
padding: 4px 8px;
line-height: 21px;
color: #212121;
&.isActive {
background: #ebf6f7;
border: 1px solid #4fa1a4;
border-radius: 2px;
color: #4fa1a4;
}
}
.checkbox-group {
display: inline-block;
}
.checkbox-group-wrap {
background: #FAFAFA;
border: 1px solid #eeeeee;
padding: 8px 12px;
margin-top: 4px;
}
:deep(.el-checkbox-group) {
.el-checkbox__label {
color: #212121;
}
.el-checkbox__input.is-checked .el-checkbox__inner {
background-color: #4fa1a4;
border-color: #4fa1a4;
}
.el-checkbox__inner:hover {
border-color: #4fa1a4;
}
.el-checkbox input:focus-visible+.el-checkbox__inner {
outline: none;
}
}
}
.btn-clear {
position: absolute;
right: 40px;
top: 24px;
display: flex;
font-size: 14px;
color: #666666;
letter-spacing: 0;
line-height: 21px;
align-items: center;
cursor: pointer;
&:hover {
.el-icon {
--color: #FB2323 !important;
}
}
:deep(.el-icon) {
margin-right: 4px;
svg {
width: 1em;
height: 1em;
}
}
}
.data-header-input {
background: #fff;
padding: 0px 24px 20px;
display: flex;
align-items: center;
justify-content: space-between;
font-size: 16px;
color: #212121;
line-height: 24px;
font-weight: 600;
.el-input {
width: 230px;
}
}
.data-content {
min-height: 200px;
display: flex;
flex-wrap: wrap;
align-content: flex-start;
row-gap: 24px;
column-gap: 24px;
background: #fff;
padding: 0px 24px 24px;
.card-noData {
height: 240px;
width: 100%;
background: #fafafa;
display: flex;
flex-direction: column;
justify-content: center;
align-items: center;
color: #909399;
font-size: 14px;
}
.card-content {
width: calc(50% - 12px);
min-width: 200px;
padding: 20px 24px;
height: auto;
background: #fff;
border: 1px solid var(--el-border-color-regular);
cursor: pointer;
&:hover {
border: 1px solid var(--el-color-primary);
}
&.selected {
background: #F6FEFF;
border: 1px solid var(--el-color-primary);
}
.header {
height: 68px;
display: inline-flex;
width: 100%;
border-bottom: 1px solid #D9D9D9;
.left-img {
width: 48px;
height: 48px;
background-size: 100% 100%;
background-position: center right;
background-repeat: no-repeat;
}
.right-main {
width: calc(100% - 60px);
position: relative;
margin-left: 12px;
.title1 {
font-size: 16px;
color: #212121;
letter-spacing: 0;
line-height: 24px;
font-weight: 600;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
.label-main {
display: flex;
margin: 8px 0px;
position: relative;
}
.dataLabel {
background: #FFFFFF;
border: 1px solid rgba(217, 217, 217, 1);
border-radius: 2px;
font-size: 12px;
// color: #0E5FD8;
letter-spacing: 0;
text-align: center;
line-height: 18px;
font-weight: 400;
padding: 0 8px;
}
.dataCount {
color: #212121;
position: absolute;
right: 0;
line-height: 21px;
}
}
}
.description {
font-size: 14px;
color: #999999;
line-height: 21px;
overflow: hidden;
}
}
}
.dam-detail-right {
width: 450px;
background-color: #fff;
.dam-detail {
padding: 24px;
.title-header {
font-size: 24px;
color: #212121;
line-height: 36px;
font-weight: 600;
}
.description {
font-size: 14px;
color: #666;
line-height: 21px;
}
.down-btn {
margin-top: 24px;
background-image: linear-gradient(116deg, #0C48F5 0%, #23D6D1 95%);
border-radius: 2px;
line-height: 32px;
font-size: 14px;
color: #FFFFFF;
padding: 4px 8px;
}
}
.header-row {
height: 44px;
display: flex;
align-items: center;
background: #F2F9FF;
margin: 0px 16px;
width: calc(100% - 32px);
.line-column {
margin-left: 8px;
height: 24px;
width: 4px;
background: #276FF5;
}
.title {
font-size: 14px;
color: #212121;
line-height: 21px;
font-weight: 600;
margin-left: 12px;
}
}
.info-content {
padding: 0px 24px;
margin-bottom: 20px;
}
}
.full-noData {
height: 100%;
width: 100%;
background: #fafafa;
display: flex;
flex-direction: column;
justify-content: center;
align-items: center;
color: #909399;
font-size: 14px;
min-height: 250px;
}
.ml-4px {
margin-left: 4px;
}
.list_item {
line-height: 21px;
padding-top: 12px;
display: flex;
}
.file-operate {
display: flex;
align-items: center;
position: relative;
width: calc(100% - 114px);
.file-img {
width: 24px;
height: 24px;
}
&:hover {
background-color: #f5f5f5;
}
.file-name {
color: var(--el-color-regular);
margin-left: 4px;
width: calc(100% - 60px);
}
.file-preview {
position: absolute;
cursor: pointer;
color: var(--el-color-primary);
// margin-right: 8px;
}
}
</style>
\ No newline at end of file
......@@ -114,7 +114,11 @@ const tableInfo = ref({
label: "详情", value: "detail", click: (scope) => {
tableTempValue.value = scope.row;
formItems.value.forEach((item) => {
if (['complianceEvaluateReport', 'complianceLegalOpinion', 'entryComplianceProgram'].includes(item.field)) {
item.default = scope.row[item.field] || [];
} else {
item.default = scope.row[item.field] || '';
}
});
dialogInfo.value.visible = true;
},
......@@ -126,7 +130,11 @@ const tableInfo = ref({
label: "上传", value: "upload", click: (scope) => {
tableTempValue.value = scope.row;
formItems.value.forEach((item) => {
if (['complianceEvaluateReport', 'complianceLegalOpinion', 'entryComplianceProgram'].includes(item.field)) {
item.default = scope.row[item.field] || [];
} else {
item.default = scope.row[item.field] || '';
}
});
dialogInfo.value.visible = true;
},
......@@ -168,6 +176,25 @@ const formItems = ref([
limit: 1,
},
{
label: '出具机构',
type: 'input',
placeholder: '请输入',
field: 'reportIssuingInstitution',
default: '',
required: false,
visible: true
},
{
label: '出具日期',
type: 'date',
placeholder: '请选择',
field: 'reportIssuingTime',
default: "",
unlink: true,
clearable: true,
required: false
},
{
label: '合规法律意见书',
tip: '支持格式:pdf,单个文件不能超过10MB ',
type: 'upload-file',
......@@ -181,6 +208,25 @@ const formItems = ref([
limit: 1,
},
{
label: '出具机构',
type: 'input',
placeholder: '请输入',
field: 'opinionIssuingInstitution',
default: '',
required: false,
visible: true
},
{
label: '出具日期',
type: 'date',
placeholder: '请选择',
field: 'opinionIssuingTime',
default: "",
unlink: true,
clearable: true,
required: false
},
{
label: '入表合规方案',
tip: '支持格式:pdf,单个文件不能超过10MB ',
type: 'upload-file',
......@@ -193,6 +239,25 @@ const formItems = ref([
default: [],
limit: 1,
},
{
label: '出具机构',
type: 'input',
placeholder: '请输入',
field: 'planIssuingInstitution',
default: '',
required: false,
visible: true
},
{
label: '出具日期',
type: 'date',
placeholder: '请选择',
field: 'planIssuingTime',
default: "",
unlink: true,
clearable: true,
required: false
},
]);
const formRules = ref({
......@@ -230,7 +295,6 @@ const tableTempValue = ref<any>('');
const dialogBtnClick = (btn, info) => {
console.log('currTableData', info);
if (btn.value == 'submit') {
tableInfo.value.loading = true;
let params: any = {
damGuid: tableTempValue.value.guid,
complianceEvaluateReport: info.complianceEvaluateReport?.map(file => {
......@@ -239,19 +303,56 @@ const dialogBtnClick = (btn, info) => {
url: file.url
}
}) || [],
reportIssuingInstitution: info.reportIssuingInstitution,
reportIssuingTime: info.reportIssuingTime,
complianceLegalOpinion: info.complianceLegalOpinion?.map(file => {
return {
name: file.name,
url: file.url
}
}) || [],
opinionIssuingInstitution: info.opinionIssuingInstitution,
opinionIssuingTime: info.opinionIssuingTime,
entryComplianceProgram: info.entryComplianceProgram?.map(file => {
return {
name: file.name,
url: file.url
}
}) || [],
planIssuingInstitution: info.planIssuingInstitution,
planIssuingTime: info.planIssuingTime
}
if (params.complianceEvaluateReport?.length) {
if (!params.reportIssuingInstitution) {
ElMessage.error('请输入合规评估报告的出具机构');
return;
}
if (!params.reportIssuingTime) {
ElMessage.error('请输入合规评估报告的出具日期');
return;
}
}
if (params.complianceLegalOpinion?.length) {
if (!params.opinionIssuingInstitution) {
ElMessage.error('请输入合规法律意见书的出具机构');
return;
}
if (!params.opinionIssuingTime) {
ElMessage.error('请输入合规法律意见书的出具日期');
return;
}
}
if (params.entryComplianceProgram?.length) {
if (!params.planIssuingInstitution) {
ElMessage.error('请输入入表合规方案的出具机构');
return;
}
if (!params.planIssuingTime) {
ElMessage.error('请输入入表合规方案的出具日期');
return;
}
}
tableInfo.value.loading = true;
updateComplianceInfo(params).then((res: any) => {
tableInfo.value.loading = false;
if (res?.code == proxy.$passCode) {
......
Styling with Markdown is supported
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!