960ee981 by lihua

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

1 parent 5ea29ddf
...@@ -27,7 +27,7 @@ const mainSidebarActualWidth = computed(() => { ...@@ -27,7 +27,7 @@ const mainSidebarActualWidth = computed(() => {
27 // 侧边栏次导航当前实际宽度 27 // 侧边栏次导航当前实际宽度
28 const subSidebarActualWidth = computed(() => { 28 const subSidebarActualWidth = computed(() => {
29 let actualWidth = parseInt(getComputedStyle(document.documentElement).getPropertyValue('--g-sub-sidebar-width')) 29 let actualWidth = parseInt(getComputedStyle(document.documentElement).getPropertyValue('--g-sub-sidebar-width'))
30 if (settingsStore.settings.menu.subMenuCollapse || route.path == '/data-asset-index') { 30 if (settingsStore.settings.menu.subMenuCollapse || route.path == '/data-asset-index' || route.path == '/trusted-space-index' || route.path == '/down-delivery-file') {
31 actualWidth = 0 31 actualWidth = 0
32 } 32 }
33 return `${actualWidth}px` 33 return `${actualWidth}px`
......
...@@ -207,7 +207,7 @@ export const getCertificateDetail = (params) => request({ ...@@ -207,7 +207,7 @@ export const getCertificateDetail = (params) => request({
207 207
208 /** 获取登记证件管理的资产列表 */ 208 /** 获取登记证件管理的资产列表 */
209 export const getRegisterSelectList = () => request({ 209 export const getRegisterSelectList = () => request({
210 url: `${import.meta.env.VITE_API_NEW_PORTAL}/register-base/register-select`, 210 url: `${import.meta.env.VITE_API_NEW_PORTAL}/register-document/document-select`,
211 method: 'get' 211 method: 'get'
212 }) 212 })
213 213
...@@ -510,6 +510,14 @@ export const getApiInvokeCount = (data) => request({ ...@@ -510,6 +510,14 @@ export const getApiInvokeCount = (data) => request({
510 data 510 data
511 }) 511 })
512 512
513 /** 获取当前用户接收方和合同信息接口 */
514 export const getDataReceiveContract = () => request({
515 // url:`${import.meta.env.VITE_APP_SERVICE_BASEURL}/api-base-info/detail`,
516 // url: `http://localhost:9000/circulation/ms-data-circulation-portal-service/enterprise/detail-by-name`,
517 // url: `http://localhost:9000/delivery/ms-daop-jgjf-data-open-service/api-base-info/detail/${params}`,
518 url: `https://daop-lt-test.zgsjzc.com/circulation/ms-data-circulation-tx-mgr-service/data-contract/get-data-receive-and-contract`,
519 method: 'get',
520 })
513 521
514 // export const getTenantInfo = (params) => request({ 522 // export const getTenantInfo = (params) => request({
515 // // url: `${import.meta.env.VITE_APP_PERSONAL_URL}/tenant/getByGuid/${params}`, 523 // // url: `${import.meta.env.VITE_APP_PERSONAL_URL}/tenant/getByGuid/${params}`,
...@@ -524,3 +532,23 @@ export const chTransformEn =(params)=> request({ ...@@ -524,3 +532,23 @@ export const chTransformEn =(params)=> request({
524 method: "post", 532 method: "post",
525 data: params, 533 data: params,
526 }); 534 });
535
536 export const saveDataReceiveContract = (params) => request({
537 url: `${import.meta.env.VITE_API_NEW_PORTAL}/dam-delivery-main/save`,
538 method: 'post',
539 data: params
540 });
541
542 /** 获取数据交付物详情 */
543 export const getDataReceiveContractDetail = (damGuid) => request({
544 url: `${import.meta.env.VITE_API_NEW_PORTAL}/dam-delivery-main/list-by-dam-guid?damGuid=${damGuid}`,
545 method: 'get'
546 });
547
548
549 // 数据合同详情
550 export const getContractDetail = (params) => request({
551 url: `https://daop-lt-test.zgsjzc.com/circulation/ms-data-circulation-tx-mgr-service/data-contract/detail`,
552 method: 'get',
553 params
554 })
...\ No newline at end of file ...\ No newline at end of file
......
1 import request from "@/utils/request";
2
3 /** 获取首页组织机构信息 */
4 export const getReleaseYears = () => request({
5 url: `${import.meta.env.VITE_API_NEW_PORTAL}/dam-delivery-main/release-year`,
6 method: 'get',
7 })
8
9 export const getParamsList = (params) => request({
10 url: `${import.meta.env.VITE_APP_CONFIG_URL}/dict/data/get-by-dictType`,
11 method: 'get',
12 params
13 })
14
15 export const getSubjectDomainDataTree = () => request({
16 url: `${import.meta.env.VITE_API_NEW_PORTAL}/dam-delivery-main/delivery-data-tree`,
17 method: 'get',
18 })
19
20 export const getReleaseListData = (params) => request({
21 url: `${import.meta.env.VITE_API_NEW_PORTAL}/dam-delivery-main/list-all`,
22 method: 'post',
23 data: params
24 })
25
26 /** 获取资产登记详情 */
27 export const getReleaseDataCertiDetail = (guid) => request({
28 url: `${import.meta.env.VITE_API_NEW_PORTAL}/register-document/detail-by-dam-guid?damGuid=${guid}`,
29 method: 'get'
30 })
31
32 /** 获取交付物下载附件 */
33 export const getDeliveryFileDetail = (guid) => request({
34 url: `${import.meta.env.VITE_API_NEW_PORTAL}/dam-delivery-main/detail?guid=${guid}`,
35 method: 'get'
36 })
...@@ -25,3 +25,11 @@ export const updateComplianceInfo = (params) => { ...@@ -25,3 +25,11 @@ export const updateComplianceInfo = (params) => {
25 data: params 25 data: params
26 }) 26 })
27 } 27 }
28
29 /** 获取资产合规目录详情 */
30 export const getComplianceDetail = (guid) => {
31 return request({
32 url: `${import.meta.env.VITE_API_NEW_PORTAL}/dam-catalog-table/compliance-info/detail?damGuid=${guid}`,
33 method: 'get'
34 })
35 }
...\ No newline at end of file ...\ No newline at end of file
......
...@@ -51,7 +51,7 @@ const defaultMenuActive = computed(() => { ...@@ -51,7 +51,7 @@ const defaultMenuActive = computed(() => {
51 <div 51 <div
52 v-if="['side', 'head', 'single'].includes(settingsStore.settings.menu.menuMode) || settingsStore.mode === 'mobile'" 52 v-if="['side', 'head', 'single'].includes(settingsStore.settings.menu.menuMode) || settingsStore.mode === 'mobile'"
53 class="sub-sidebar-container" 53 class="sub-sidebar-container"
54 :class="{ 'is-collapse': settingsStore.mode === 'pc' && (settingsStore.settings.menu.subMenuCollapse || defaultMenuActive == '/data-asset-index') }" 54 :class="{ 'is-collapse': settingsStore.mode === 'pc' && (settingsStore.settings.menu.subMenuCollapse || defaultMenuActive == '/data-asset-index' || defaultMenuActive == '/trusted-space-index' || defaultMenuActive == '/down-delivery-file') }"
55 @scroll="onSidebarScroll"> 55 @scroll="onSidebarScroll">
56 <Logo :show-logo="settingsStore.settings.menu.menuMode === 'single'" class="sidebar-logo" :class="{ 56 <Logo :show-logo="settingsStore.settings.menu.menuMode === 'single'" class="sidebar-logo" :class="{
57 'sidebar-logo-bg': settingsStore.settings.menu.menuMode === 'single', 57 'sidebar-logo-bg': settingsStore.settings.menu.menuMode === 'single',
...@@ -60,7 +60,7 @@ const defaultMenuActive = computed(() => { ...@@ -60,7 +60,7 @@ const defaultMenuActive = computed(() => {
60 <!-- 侧边栏模式(无主导航) --> 60 <!-- 侧边栏模式(无主导航) -->
61 <el-menu :unique-opened="settingsStore.settings.menu.subMenuUniqueOpened" 61 <el-menu :unique-opened="settingsStore.settings.menu.subMenuUniqueOpened"
62 :default-openeds="menuStore.defaultOpenedPaths" :default-active="defaultMenuActive" 62 :default-openeds="menuStore.defaultOpenedPaths" :default-active="defaultMenuActive"
63 :collapse="settingsStore.mode === 'pc' && (settingsStore.settings.menu.subMenuCollapse || defaultMenuActive == '/data-asset-index')" 63 :collapse="settingsStore.mode === 'pc' && (settingsStore.settings.menu.subMenuCollapse || defaultMenuActive == '/data-asset-index' || defaultMenuActive == '/trusted-space-index' || defaultMenuActive == '/down-delivery-file')"
64 :collapse-transition="false" :class="{ 64 :collapse-transition="false" :class="{
65 'is-collapse-without-logo': settingsStore.settings.menu.menuMode !== 'single' && settingsStore.settings.menu.subMenuCollapse, 65 'is-collapse-without-logo': settingsStore.settings.menu.menuMode !== 'single' && settingsStore.settings.menu.subMenuCollapse,
66 }"> 66 }">
......
...@@ -127,6 +127,18 @@ const routes: RouteRecordRaw[] = [ ...@@ -127,6 +127,18 @@ const routes: RouteRecordRaw[] = [
127 } 127 }
128 }, 128 },
129 { 129 {
130 path: 'register-catalog-contract-detail',
131 name: 'registerCatalogContractDetail',
132 component: () => import('@/views/data_asset/registerCatalogContractDetail.vue'),
133 meta: {
134 title: '详情-',
135 sidebar: false,
136 breadcrumb: false,
137 cache: true,
138 reuse: true
139 }
140 },
141 {
130 path: 'damTableDataView', 142 path: 'damTableDataView',
131 name: 'damTableDataView', 143 name: 'damTableDataView',
132 component: () => import('@/views/data_asset/damTableDataView.vue'), 144 component: () => import('@/views/data_asset/damTableDataView.vue'),
......
...@@ -173,7 +173,19 @@ const routes: RouteRecordRaw[] = [ ...@@ -173,7 +173,19 @@ const routes: RouteRecordRaw[] = [
173 cache: true, 173 cache: true,
174 reuse: true 174 reuse: true
175 } 175 }
176 },
177 {
178 path: 'register-catalog-detail',
179 name: 'certiCatalogDetail',
180 component: () => import('@/views/data_asset/registerCatalogDetail.vue'),
181 meta: {
182 title: '详情-',
183 sidebar: false,
184 breadcrumb: false,
185 cache: true,
186 reuse: true
176 } 187 }
188 },
177 ], 189 ],
178 }, 190 },
179 { 191 {
......
1 import type { RouteRecordRaw } from 'vue-router'
2 function Layout() {
3 return import('@/layouts/index.vue')
4 }
5
6 const routes: RouteRecordRaw[] = [
7 {
8 path: '/trusted-space-index',
9 component: Layout,
10 meta: {
11 title: '可信空间',
12 icon: 'sidebar-videos',
13 },
14 children: [
15 {
16 path: '',
17 name: 'trustedSpaceIndex',
18 component: () => import('@/views/data_trusted/trustedSpaceIndex.vue'),
19 meta: {
20 title: '可信空间',
21 sidebar: false,
22 breadcrumb: false,
23 cache: true
24 },
25 },
26 {
27 path: '/down-delivery-file',
28 name: 'downDeliveryFile',
29 component: () => import('@/views/data_trusted/downDeliveryFile.vue'),
30 meta: {
31 title: '交付物下载',
32 sidebar: false,
33 breadcrumb: false,
34 cache: true,
35 reuse: true
36 },
37 beforeEnter: (to, from) => {
38 if (to.query.damName) {
39 to.meta.title = `交付物下载-${to.query.damName}`;
40 }
41 }
42 },
43 ]
44 }]
45
46 export default routes
...\ No newline at end of file ...\ No newline at end of file
...@@ -6,11 +6,11 @@ import DataMeta from './modules/dataMeta'; ...@@ -6,11 +6,11 @@ import DataMeta from './modules/dataMeta';
6 import DataQuality from './modules/dataQuality'; 6 import DataQuality from './modules/dataQuality';
7 import DataInventory from './modules/dataInventory'; 7 import DataInventory from './modules/dataInventory';
8 import AssetIndex from './modules/assetIndex'; 8 import AssetIndex from './modules/assetIndex';
9 import DataTrustedSpace from './modules/dataTrustedSpace';
9 import DataAssetRegistry from './modules/dataAssetRegistry'; 10 import DataAssetRegistry from './modules/dataAssetRegistry';
10 import DataEntry from './modules/dataEntry'; 11 import DataEntry from './modules/dataEntry';
11 import SecurityMenu from './modules/securityMenu'; 12 import SecurityMenu from './modules/securityMenu';
12 13
13 import type { Route } from '#/global'
14 import useSettingsStore from '@/store/modules/settings' 14 import useSettingsStore from '@/store/modules/settings'
15 15
16 /** 路由配置的meta信息接口注释。 */ 16 /** 路由配置的meta信息接口注释。 */
...@@ -112,6 +112,7 @@ const asyncRoutes: RouteRecordRaw[] = [ ...@@ -112,6 +112,7 @@ const asyncRoutes: RouteRecordRaw[] = [
112 ...DataMeta, 112 ...DataMeta,
113 ...DataQuality, 113 ...DataQuality,
114 ...DataInventory, 114 ...DataInventory,
115 ...DataTrustedSpace
115 ] 116 ]
116 117
117 const constantRoutesByFilesystem = generatedRoutes.filter((item) => { 118 const constantRoutesByFilesystem = generatedRoutes.filter((item) => {
......
...@@ -12,8 +12,12 @@ import { ...@@ -12,8 +12,12 @@ import {
12 updateCertificate, 12 updateCertificate,
13 getRegisterSelectList, 13 getRegisterSelectList,
14 saveCertificate, 14 saveCertificate,
15 delCertificate 15 delCertificate,
16 getParamsList
16 } from "@/api/modules/dataAsset"; 17 } from "@/api/modules/dataAsset";
18 import {
19 getSingleList
20 } from "@/api/modules/queryService";
17 import useUserStore from "@/store/modules/user"; 21 import useUserStore from "@/store/modules/user";
18 import useDataAssetStore from "@/store/modules/dataAsset"; 22 import useDataAssetStore from "@/store/modules/dataAsset";
19 import { useValidator } from '@/hooks/useValidator'; 23 import { useValidator } from '@/hooks/useValidator';
...@@ -29,8 +33,14 @@ const userData = JSON.parse(userStore.userData); ...@@ -29,8 +33,14 @@ const userData = JSON.parse(userStore.userData);
29 /** 是否时企业端。不是企业端,则是服务端,需要显示企业名称。 */ 33 /** 是否时企业端。不是企业端,则是服务端,需要显示企业名称。 */
30 const isCompanyPlatform = ref(userData.tenantType == 1); 34 const isCompanyPlatform = ref(userData.tenantType == 1);
31 35
36 /** 登记证件类别,知识产权和数据产权 */
37 const documentCategoryList = ref([]);
38
32 const registerSelectData: any = ref([]); 39 const registerSelectData: any = ref([]);
33 40
41 /** 发证主体的下拉数据选择 */
42 const serviceTenants: any = ref([]);
43
34 onBeforeMount(() => { 44 onBeforeMount(() => {
35 if (isCompanyPlatform.value) { 45 if (isCompanyPlatform.value) {
36 tableInfo.value.fields = tableFields.value; 46 tableInfo.value.fields = tableFields.value;
...@@ -38,6 +48,25 @@ onBeforeMount(() => { ...@@ -38,6 +48,25 @@ onBeforeMount(() => {
38 tableFields.value.splice(4, 0, { label: "企业名称", field: "tenantName", width: 240, align: "left" }) 48 tableFields.value.splice(4, 0, { label: "企业名称", field: "tenantName", width: 240, align: "left" })
39 tableInfo.value.fields = tableFields.value; 49 tableInfo.value.fields = tableFields.value;
40 } 50 }
51 getParamsList({ dictType: '登记证件类别' }).then((res: any) => {
52 if (res.code == proxy.$passCode) {
53 documentCategoryList.value = res.data || [];
54 let item = formItems.value.at(-2);
55 item && (item.options = documentCategoryList.value);
56 } else {
57 proxy.$ElMessage.error(res.msg);
58 }
59 })
60 getSingleList({ pageIndex: -1, pageSize: -1, tenantType: "130" }).then((res: any) => {
61 if (res.code == proxy.$passCode) {
62 const data = res.data.records ?? [];
63 serviceTenants.value = data;
64 let formItem = formItems.value.find(f => f.field === 'issuingEntityGuid');
65 formItem && (formItem.options = serviceTenants.value);
66 } else {
67 proxy.$ElMessage.error(res.msg);
68 }
69 })
41 }) 70 })
42 71
43 onActivated(() => { 72 onActivated(() => {
...@@ -145,11 +174,12 @@ const tableFields = ref([ ...@@ -145,11 +174,12 @@ const tableFields = ref([
145 //{ label: "企业名称", field: "tenantName", width: 240, align: "left" }, 174 //{ label: "企业名称", field: "tenantName", width: 240, align: "left" },
146 { label: "发证主体", field: "issuingEntityName", width: 250, align: "left" }, 175 { label: "发证主体", field: "issuingEntityName", width: 250, align: "left" },
147 { 176 {
148 label: "类型", field: "documentType", width: 96, align: "left", getName: (scope) => { 177 label: "类型", field: "documentType", width: 80, align: "left", getName: (scope) => {
149 let type = scope.row.documentType; 178 let type = scope.row.documentType;
150 return type == 1 ? 'A证' : (type == 2 ? 'B证' : 'C证'); 179 return type == 1 ? 'A证' : (type == 2 ? 'B证' : 'C证');
151 } 180 }
152 }, 181 },
182 { label: "类别", field: "documentCategoryName", width: 90, align: "left" },
153 { label: "状态", field: "state", type: "tag", width: 96, align: 'center' }, 183 { label: "状态", field: "state", type: "tag", width: 96, align: 'center' },
154 ]); 184 ]);
155 185
...@@ -205,6 +235,8 @@ const tableBtnClick = (scope, btn) => { ...@@ -205,6 +235,8 @@ const tableBtnClick = (scope, btn) => {
205 item.default = row[item.field]; 235 item.default = row[item.field];
206 }) 236 })
207 formItems.value[0].options = registerSelectData.value; 237 formItems.value[0].options = registerSelectData.value;
238 let item = formItems.value.at(-2);
239 item && (item.options = documentCategoryList.value);
208 getRegisterSelectList().then((res: any) => { 240 getRegisterSelectList().then((res: any) => {
209 if (res.code == proxy.$passCode) { 241 if (res.code == proxy.$passCode) {
210 registerSelectData.value = res.data || []; 242 registerSelectData.value = res.data || [];
...@@ -228,10 +260,17 @@ const tableBtnClick = (scope, btn) => { ...@@ -228,10 +260,17 @@ const tableBtnClick = (scope, btn) => {
228 proxy.$ElMessage.info("已取消删除"); 260 proxy.$ElMessage.info("已取消删除");
229 }); 261 });
230 } else if (type === 'path_detail') { // 详情 262 } else if (type === 'path_detail') { // 详情
263 if (row.registerGuid) {
231 router.push({ 264 router.push({
232 name: 'certificateDetail', 265 name: 'certificateDetail',
233 query: { guid: row.registerGuid, certificateGuid: row.guid, type: 'certificate', tenantGuid: row.tenantGuid } 266 query: { guid: row.registerGuid, certificateGuid: row.guid, type: 'certificate', tenantGuid: row.tenantGuid }
234 }); 267 });
268 } else {
269 router.push({
270 name: 'certiCatalogDetail',
271 query: { guid: row.damGuid, tenantGuid: row.tenantGuid, type: 'certificate', certificateGuid: row.guid }
272 });
273 }
235 } 274 }
236 }; 275 };
237 276
...@@ -245,12 +284,12 @@ const formItems = ref([{ ...@@ -245,12 +284,12 @@ const formItems = ref([{
245 label: "资产名称", 284 label: "资产名称",
246 type: "select", 285 type: "select",
247 placeholder: "请选择", 286 placeholder: "请选择",
248 field: "registerGuid", 287 field: "damGuid",
249 default: '', 288 default: '',
250 options: registerSelectData.value, 289 options: registerSelectData.value,
251 props: { 290 props: {
252 label: 'daName', 291 label: 'daName',
253 value: 'guid' 292 value: 'damGuid'
254 }, 293 },
255 disabled: false, 294 disabled: false,
256 clearable: true, 295 clearable: true,
...@@ -282,7 +321,7 @@ const formItems = ref([{ ...@@ -282,7 +321,7 @@ const formItems = ref([{
282 clearable: true, 321 clearable: true,
283 unlink: true, 322 unlink: true,
284 disabled: false, 323 disabled: false,
285 required: false, 324 required: true,
286 visible: true 325 visible: true
287 }, { 326 }, {
288 label: '', 327 label: '',
...@@ -304,18 +343,24 @@ const formItems = ref([{ ...@@ -304,18 +343,24 @@ const formItems = ref([{
304 visible: true 343 visible: true
305 }, { 344 }, {
306 label: '发证主体', 345 label: '发证主体',
307 type: 'input', 346 type: 'select',
308 placeholder: '请输入', 347 placeholder: '请输入',
309 field: 'issuingEntityName', 348 field: 'issuingEntityGuid',
310 default: '', 349 default: '',
311 disabled: true, 350 options: registerSelectData.value,
312 required: false, 351 props: {
352 value: "guid",
353 label: "tenantName",
354 },
355 filterable: true,
356 disabled: false,
357 required: true,
313 visible: true 358 visible: true
314 }, { 359 }, {
315 label: '', 360 label: '',
316 type: 'input', 361 type: 'input',
317 placeholder: '请输入', 362 placeholder: '请输入',
318 field: 'issuingEntityGuid', 363 field: 'issuingEntityName',
319 default: '', 364 default: '',
320 disabled: true, 365 disabled: true,
321 required: false, 366 required: false,
...@@ -340,6 +385,16 @@ const formItems = ref([{ ...@@ -340,6 +385,16 @@ const formItems = ref([{
340 { label: 'C证', value: 3 }], 385 { label: 'C证', value: 3 }],
341 disabled: false, 386 disabled: false,
342 clearable: true, 387 clearable: true,
388 required: false,
389 }, {
390 label: "证件类别",
391 type: "select",
392 placeholder: "请选择",
393 field: "documentCategory",
394 default: '2',
395 options: documentCategoryList.value,
396 disabled: false,
397 clearable: true,
343 required: true, 398 required: true,
344 }, { 399 }, {
345 label: '证件上传', 400 label: '证件上传',
...@@ -355,10 +410,11 @@ const formItems = ref([{ ...@@ -355,10 +410,11 @@ const formItems = ref([{
355 }]); 410 }]);
356 411
357 const formRules = ref({ 412 const formRules = ref({
358 registerGuid: [required('请选择资产名称')], 413 damGuid: [required('请选择资产名称')],
359 registerTime: [required('请选择登记时间')], 414 registerTime: [required('请选择登记时间')],
360 effectiveDate: [required('请选择有效期')], 415 effectiveDate: [required('请选择有效期')],
361 documentType: [required('请选择证件类型')], 416 //documentType: [required('请选择证件类型')],
417 documentCategory: [required('请选择证件类别')],
362 daCode: [required('请输入证件编码')], 418 daCode: [required('请输入证件编码')],
363 documentFile: [{ 419 documentFile: [{
364 validator: (rule: any, value: any, callback: any) => { 420 validator: (rule: any, value: any, callback: any) => {
...@@ -443,8 +499,8 @@ const dialogBtnClick = (btn, info) => { ...@@ -443,8 +499,8 @@ const dialogBtnClick = (btn, info) => {
443 }; 499 };
444 500
445 const handleDialogSelectChange = (val, row, info) => { 501 const handleDialogSelectChange = (val, row, info) => {
446 if (row.field == 'registerGuid') { 502 if (row.field == 'damGuid') {
447 let register = val && registerSelectData.value.find(r => r.guid == val); 503 let register = val && registerSelectData.value.find(r => r.damGuid == val);
448 formItems.value.forEach(item => { 504 formItems.value.forEach(item => {
449 item.default = info[item.field]; 505 item.default = info[item.field];
450 if (item.field == 'daName' || item.field == 'tenantGuid' || item.field == 'tenantName') { 506 if (item.field == 'daName' || item.field == 'tenantGuid' || item.field == 'tenantName') {
...@@ -467,6 +523,8 @@ const handleCreate = () => { ...@@ -467,6 +523,8 @@ const handleCreate = () => {
467 ElMessage.error(res.msg); 523 ElMessage.error(res.msg);
468 } 524 }
469 }) 525 })
526 let item = formItems.value.at(-2);
527 item && (item.options = documentCategoryList.value);
470 dialogInfo.value.visible = true; 528 dialogInfo.value.visible = true;
471 dialogInfo.value.type = 'add'; 529 dialogInfo.value.type = 'add';
472 dialogInfo.value.header.title = '新增'; 530 dialogInfo.value.header.title = '新增';
...@@ -474,10 +532,12 @@ const handleCreate = () => { ...@@ -474,10 +532,12 @@ const handleCreate = () => {
474 item.default = ''; 532 item.default = '';
475 if (item.field == 'documentType') { 533 if (item.field == 'documentType') {
476 item.default = 3; 534 item.default = 3;
535 } else if (item.field == 'documentCategory') {
536 item.default = '2';
477 } else if (item.field == 'documentFile') { 537 } else if (item.field == 'documentFile') {
478 item.default = []; 538 item.default = [];
479 } 539 }
480 if (item.field == 'registerGuid' || item.field == 'daCode') { 540 if (item.field == 'damGuid' || item.field == 'daCode') {
481 item.disabled = false; 541 item.disabled = false;
482 } 542 }
483 }) 543 })
...@@ -489,7 +549,7 @@ const handleCreate = () => { ...@@ -489,7 +549,7 @@ const handleCreate = () => {
489 <div class="container_wrap"> 549 <div class="container_wrap">
490 <div class="table_tool_wrap"> 550 <div class="table_tool_wrap">
491 <TableTools :searchItems="searchItemList" :searchId="'register-data-search'" @search="toSearch" :init="true" /> 551 <TableTools :searchItems="searchItemList" :searchId="'register-data-search'" @search="toSearch" :init="true" />
492 <div class="tools_btns"> 552 <div class="tools_btns" style="padding-top: 0px;">
493 <el-button type="primary" @click="handleCreate">新增登记证件</el-button> 553 <el-button type="primary" @click="handleCreate">新增登记证件</el-button>
494 </div> 554 </div>
495 </div> 555 </div>
...@@ -505,7 +565,7 @@ const handleCreate = () => { ...@@ -505,7 +565,7 @@ const handleCreate = () => {
505 padding: 0 16px; 565 padding: 0 16px;
506 566
507 .table_panel_wrap { 567 .table_panel_wrap {
508 height: calc(100% - 44px); 568 height: calc(100% - 84px);
509 } 569 }
510 } 570 }
511 571
......
1 <template>
2 <Dialog :dialogInfo="dialogInfo" @btnClick="dialogBtnClick">
3 <div class="first-row">
4 <div class="data-accept-left">
5 <div class="title">选择数据接收方</div>
6 <div class="data-list">
7 <el-checkbox-group v-model="userReceiveCheckList">
8 <div
9 :class="userReceiveSelectInfo.dataReceiveGuid == item.dataReceiveGuid ? 'data-check-item selected' : 'data-check-item'"
10 v-for="item in props.listData" :key="item.dataReceiveGuid" @click="handleClickItem(item)">
11 <el-checkbox :label="item.dataReceiveGuid">{{ '' }}
12 </el-checkbox>
13 <div class="text-label">
14 <ellipsis-tooltip :content="item.dataReceiveName" class-name="w100f"
15 :refName="'tooltipOver' + item.dataReceiveGuid"></ellipsis-tooltip>
16 </div>
17 </div>
18 </el-checkbox-group>
19 </div>
20 </div>
21 <div class="data-contract-right">
22 <div class="title">{{ '选择' + (userReceiveSelectInfo.dataReceiveName || '数据接收方') + '的合同' }}</div>
23 <div class="data-list contract">
24 <el-checkbox-group v-show="userReceiveSelectInfo.dataReceiveContractRSVOS?.length"
25 v-model="userReceiveContractCheckList[userReceiveSelectInfo.dataReceiveGuid]">
26 <el-checkbox v-for="item in userReceiveSelectInfo.dataReceiveContractRSVOS" :key="item.dataContractGuid"
27 :label="item.dataContractGuid">
28 <ellipsis-tooltip :content="item.dataContractName" class-name="w100f"
29 :refName="'tooltipOver' + item.dataContractGuid"></ellipsis-tooltip>
30 </el-checkbox>
31 </el-checkbox-group>
32 </div>
33 </div>
34 </div>
35 <el-upload ref="uploadRef" action="#" class="upload-delivery" drag :file-list="fileList"
36 :http-request="(file) => uploadFile(file)">
37 <el-icon class="el-icon--upload" style="margin-bottom: 4px;">
38 <Plus />
39 </el-icon>
40 <div class="el-upload__text">
41 点击或拖拽上传
42 </div>
43 <template #file="{ file }">
44 <div class="file-operate">
45 <template
46 v-if="file.name.substring(file.name.lastIndexOf('.') + 1).toLowerCase() == 'xls' || file.name.substring(file.name.lastIndexOf('.') + 1).toLowerCase() == 'xlsx'">
47 <img class="file-img" src="../../../assets/images/excel.png" />
48 </template>
49 <template
50 v-else-if="file.name.substring(file.name.lastIndexOf('.') + 1).toLowerCase() == 'doc' || file.name.substring(file.name.lastIndexOf('.') + 1).toLowerCase() == 'docx'">
51 <img class="file-img" src="../../../assets/images/word.png" />
52 </template>
53 <template v-else-if="file.name.substring(file.name.lastIndexOf('.') + 1).toLowerCase() == 'zip'">
54 <img class="file-img" src="../../../assets/images/zip.png" />
55 </template>
56 <template v-else-if="file.name.substring(file.name.lastIndexOf('.') + 1).toLowerCase() == 'rar'">
57 <img class="file-img" src="../../../assets/images/RAR.png" />
58 </template>
59 <template v-else-if="file.name.substring(file.name.lastIndexOf('.') + 1).toLowerCase() == 'pdf'">
60 <img class="file-img" src="../../../assets/images/PDF.png" />
61 </template>
62 <template v-else-if="file.name.substring(file.name.lastIndexOf('.') + 1).toLowerCase() == 'png'">
63 <img class="file-img" src="../../../assets/images/png.png" />
64 </template>
65 <template
66 v-else-if="file.name.substring(file.name.lastIndexOf('.') + 1).toLowerCase() == 'jpg' || file.name.substring(file.name.lastIndexOf('.') + 1).toLowerCase() == 'jpeg'">
67 <img class="file-img" src="../../../assets/images/jpg.png" />
68 </template>
69 <div class="file-name"
70 :style="{ width: ['pdf', 'png', 'jpg', 'jpeg'].includes(file?.name?.substring(file.name.lastIndexOf('.') + 1).toLowerCase() ?? '') ? 'calc(100% - 300px)' : 'calc(100% - 290px)' }">
71 <ellipsis-tooltip :content="file.name" class-name="w100f"
72 :refName="'tooltipOver' + file.name"></ellipsis-tooltip>
73 </div>
74 <div class="upload-time" :style="{ right: 32 }" v-if="uploadTime"> {{ '上传时间:' + uploadTime }} </div>
75 <div :style="{ right: 0 }" class="file-preview" @click="handleUploadFileRemove(file)">删除
76 </div>
77 </div>
78 </template>
79 </el-upload>
80 </Dialog>
81 </template>
82
83 <script setup lang="ts" name="deliverUploadDialog">
84 import {
85 Plus
86 } from "@element-plus/icons-vue";
87 import {
88 getUpFileSignByUrl,
89 obsUploadRequest,
90 getPathUrl
91 } from "@/api/modules/obsService";
92 import {
93 saveDataReceiveContract
94 } from "@/api/modules/dataAsset";
95 import { ElMessage } from "element-plus";
96 import Moment from "moment";
97
98 const { proxy } = getCurrentInstance() as any;
99
100 const props = defineProps({
101 listData: { //数据接收方和合同列表
102 type: Array<any>,
103 default: [{
104 dataReceiveGuid: '1',
105 dataReceiveName: '北京传世博润科技有限公司',
106 dataReceiveContractRSVOS: [{
107 dataContractGuid: '1',
108 dataContractName: '合同1'
109 }, {
110 dataContractGuid: '2',
111 dataContractName: '合同2'
112 }]
113 }, {
114 dataReceiveGuid: '2',
115 dataReceiveName: 'xx2',
116 dataReceiveContractRSVOS: [{
117 dataContractGuid: '2',
118 dataContractName: '合同2'
119 }]
120 }]
121 },
122 uploadDeliverItem: {
123 type: Object,
124 default: {}
125 },
126 visible: {
127 type: Boolean,
128 default: false
129 },
130 })
131
132
133 const emits = defineEmits(['close'])
134
135 watch(() => props.visible, (val) => {
136 dialogInfo.value.visible = val;
137 if (val) {
138 userReceiveCheckList.value = [];
139 fileList.value = [];
140 uploadTime.value = null;
141 userReceiveSelectInfo.value = props.listData[0] || {};
142 userReceiveContractCheckList.value = {};
143 props.listData.forEach(list => {
144 userReceiveContractCheckList.value[list.dataReceiveGuid] = [];
145 })
146 }
147 })
148
149 const fileList: any = ref([]);
150
151 /** 文件上传时间 */
152 const uploadTime: any = ref(null);
153
154 const userReceiveCheckList = ref([]);
155
156 /** 记录接收方对应勾选的合同 */
157 const userReceiveContractCheckList: any = ref({});
158
159 /** 记录当前选中的高亮合同 */
160 const userReceiveSelectInfo: any = ref({});
161
162 const dialogInfo = ref({
163 visible: false,
164 size: 800,
165 direction: "column",
166 header: {
167 title: "交付物上传",
168 },
169 type: '',//标识是否是重新提交
170 contents: [],
171 footer: {
172 btns: [
173 { type: "default", label: "取消", value: "cancel" },
174 { type: "primary", label: "确定", value: "submit", loading: false },
175 ],
176 },
177 });
178
179 const dialogBtnClick = (btn, info) => {
180 console.log('btn', btn, info);
181 if (btn.value == 'submit') {
182 if (!userReceiveCheckList.value.length) {
183 ElMessage.error('请勾选数据接收方');
184 return;
185 }
186 if (!fileList.value.length) {
187 ElMessage.error('请点击或拖拽上传交付物文件');
188 return;
189 }
190 let jsonValue: any = [];
191 for (const u of userReceiveCheckList.value) {
192 if (!userReceiveContractCheckList.value[u]?.length) {
193 ElMessage.error(`【` + props.listData.find(l => l.dataReceiveGuid == u)?.dataReceiveName + '】' + '未选择合同');
194 return;
195 }
196 jsonValue.push({
197 dataReceiveGuid: u,
198 contractInfo: userReceiveContractCheckList.value[u]?.map(c => {
199 return {
200 dataContractGuid: c,
201 dataContractName: props.listData.find(l => l.dataReceiveGuid == u).dataReceiveContractRSVOS.find(d => d.dataContractGuid == c).dataContractName
202 }
203 })
204 })
205 }
206 dialogInfo.value.footer.btns[1].loading = true;
207 let params = {
208 damGuid: props.uploadDeliverItem.guid,
209 dataDelivery: fileList.value?.map(f => {
210 return {
211 name: f.name,
212 url: f.url
213 }
214 }),
215 uploadTime: uploadTime.value,
216 dataReceiveRQVOS: jsonValue
217 };
218 saveDataReceiveContract(params).then((res: any) => {
219 if (res.code == proxy.$passCode) {
220 proxy.$ElMessage.success('上传交付物成功');
221 dialogInfo.value.footer.btns[1].loading = false;
222 dialogInfo.value.visible = false;
223 emits('close', props.uploadDeliverItem.guid);
224 } else {
225 proxy.$ElMessage.error(res.msg);
226 }
227 })
228 } else if (btn.value == 'cancel') {
229 dialogInfo.value.visible = false;
230 emits('close')
231 }
232 }
233
234 const handleClickItem = (item) => {
235 userReceiveSelectInfo.value = item;
236 }
237
238 const uploadRef = ref();
239
240 const uploadFile = (file) => {
241 return getUpFileSignByUrl({ fileName: file.file.name })
242 .then((res: any) => {
243 obsUploadRequest({
244 signedUrl: res.data.signedUrl,
245 file: file.file,
246 actualSignedRequestHeaders: res.data.actualSignedRequestHeaders
247 }).then(() => {
248 if (res.code == '00000') {
249 file.file.url = res.data.signedUrl && getPathUrl(res.data.signedUrl);
250 let fileItem = {
251 name: file.file.name,
252 url: res.data.signedUrl,
253 file: file.file
254 };
255 fileList.value = [fileItem];
256 uploadTime.value = Moment(Date.now()).format('YYYY-MM-DD HH:mm:ss');
257 ElMessage.success('上传成功');
258 } else {
259 uploadRef.value.handleRemove(file);
260 ElMessage.error('上传失败,请重新上传!');
261 }
262 })
263 })
264 .catch(() => {
265 uploadRef.value.handleRemove(file);
266 ElMessage.error('上传失败,请重新上传');
267 });
268 }
269
270 const handleUploadFileRemove = (file) => {
271 fileList.value = [];
272 uploadRef.value.handleRemove(file);
273 }
274 </script>
275
276 <style lang="scss" scoped>
277 .first-row {
278 display: flex;
279 justify-content: space-between;
280 height: 202px;
281 margin-top: 16px;
282 }
283
284 .data-contract-right,
285 .data-accept-left {
286 width: calc(50% - 6px);
287
288 .title {
289 line-height: 21px;
290 color: #666;
291 margin-bottom: 4px;
292 }
293
294 .data-list {
295 border: 1px solid #d9d9d9;
296 height: 178px;
297 padding: 8px 12px;
298
299 .data-check-item {
300 display: flex;
301 padding-left: 12px;
302
303 &.selected {
304 background-color: #ebf6f7;
305 }
306
307 .text-label {
308 width: calc(100% - 36px);
309 line-height: 32px;
310 cursor: pointer;
311 font-size: 14px;
312 }
313 }
314 }
315 }
316
317 :deep(.data-list) {
318 .el-checkbox-group {
319 margin-left: -12px;
320 margin-right: -12px;
321 }
322 }
323
324 :deep(.data-list.contract) {
325 .el-checkbox {
326 width: 100%;
327 margin-right: 0px;
328 padding-left: 12px;
329
330 .el-checkbox__label {
331 width: calc(100% - 22px);
332 }
333 }
334 }
335
336 .upload-delivery {
337 margin-top: 16px;
338
339 .file-operate {
340 display: flex;
341 align-items: center;
342 position: relative;
343 width: 100%;
344
345 .file-img {
346 width: 30px;
347 height: 30px;
348 }
349
350 &:hover {
351 background-color: #f5f5f5;
352 }
353 }
354
355 .file-name {
356 color: var(--el-color-regular);
357 margin-left: 4px;
358 margin-right: 4px;
359 width: calc(100% - 130px);
360 }
361
362 .file-preview {
363 position: absolute;
364 cursor: pointer;
365 color: var(--el-color-primary);
366 margin-right: 8px;
367 }
368 }
369
370 :deep(.el-upload.is-drag) {
371
372 .el-upload-dragger {
373 height: 160px;
374 align-items: center;
375 display: flex;
376 flex-direction: column;
377 justify-content: center;
378 }
379 }
380
381 :deep(.el-upload-list) {
382 margin-top: 16px;
383 }
384
385 .upload-time {
386 right: 46px;
387 position: absolute;
388 color: #999;
389 }
390 </style>
...\ No newline at end of file ...\ No newline at end of file
1 <route lang="yaml">
2 name: registerCatalogContractDetail //合同详情
3 </route>
4
5 <script lang="ts" setup name="registerCatalogContractDetail">
6 import { ref, onMounted } from "vue";
7 import { useRouter, useRoute } from "vue-router";
8 import { ElMessage, ElMessageBox } from "element-plus";
9 import useUserStore from "@/store/modules/user";
10 import useDataAssetStore from "@/store/modules/dataAsset";
11 import { getCamundaDeploymentId } from "@/api/modules/workFlowService"
12 import { getContractDetail } from "@/api/modules/dataAsset";
13 import { onUploadFilePreview, onUploadFileDownload } from '@/api/modules/common';
14
15 const { proxy } = getCurrentInstance() as any;
16 const router = useRouter();
17 const route = useRoute();
18 const userStore = useUserStore();
19 const fullPath = route.fullPath;
20 const assetStore = useDataAssetStore();
21 const guid = route.query.guid;
22 const detailType = route.query.type;
23 const tenantGuid = route.query.tenantGuid;
24 const userData = JSON.parse(localStorage.userData);
25 const damName = route.query.name as string || '';
26
27 const loading = ref(false);
28 const flowDetail: any = ref({});
29 const expand1 = ref(true)
30 const expand2 = ref(true)
31 const expand3 = ref(true)
32 const expand4 = ref(true)
33 const deploymentId = ref('');
34 const processInstanceId = ref('');
35 const flowState = ref(0);
36 const approveState = ref('');
37 const isShowCancel = ref(false);
38 const approvalProcessRef = ref();
39
40 //合同内容
41 const contractContentFormItems = ref([
42 {
43 label: '合同类型',
44 field: 'dataContractType',
45 },
46 {
47 label: '甲方名称',
48 field: 'apartyGuid',
49 },
50 {
51 label: '乙方名称',
52 field: 'bpartyGuid',
53 },
54 {
55 label: '合同名称',
56 field: 'contractName',
57 },
58 {
59 label: '签约时间',
60 field: 'signContractDate',
61 },
62 {
63 label: '生效日期',
64 field: 'effectiveDate',
65 },
66 {
67 label: '终止日期',
68 field: 'terminationDate',
69 },
70 {
71 label: '原始合同金额',
72 placeholder: '请输入',
73 field: 'originalTradingAmount',
74 },
75 {
76 label: '合同金额(元)',
77 field: 'tradingAmount',
78 },
79 {
80 label: '关联销售合同',
81 field: 'relatedSalesContract',
82 block: true,
83 },
84 {
85 label: '合同附件',
86 field: 'contractAttachments',
87 type: 'upload-file',
88 block: true,
89 },
90 {
91 label: '合同说明',
92 field: 'contractInstructions',
93 block: true
94 },
95 ])
96
97 // 合同签署方
98 const contractSignatoryFormItems: any = ref([
99 {
100 label: '丙方名称',
101 type: 'select',
102 placeholder: '请选择',
103 field: 'cpartyGuid',
104 default: '',
105 options: [],
106 props: {
107 label: 'tenantName',
108 value: 'guid'
109 },
110 filterable: true,
111 clearable: true,
112 },
113 {
114 label: '丁方名称',
115 type: 'select',
116 placeholder: '请选择',
117 field: 'dpartyGuid',
118 default: '',
119 options: [],
120 props: {
121 label: 'tenantName',
122 value: 'guid'
123 },
124 filterable: true,
125 clearable: true,
126 },
127 ])
128 // 付款方式
129 const payPlan = ref(false);
130
131
132 // 获取详情
133 const getTaskDetail = () => {
134 loading.value = true;
135 getContractDetail({ serviceTenantGuid: tenantGuid, guid }).then((res: any) => {
136 if (res.code == proxy.$passCode) {
137 loading.value = false;
138 deploymentId.value = '';
139 processInstanceId.value = '';
140 flowState.value = 0;
141 isShowCancel.value = false;
142 const data = res.data || {};
143 flowDetail.value = { ...data, demandPic: data.contractAttachments ? data.contractAttachments[0] : {}, contractAttachPic: data.sealContractAttachments ? data.sealContractAttachments[0] : {} };
144 let { approveVO } = data;
145 if (approveVO) {
146 deploymentId.value = approveVO.camundaDeploymentId;
147 processInstanceId.value = approveVO.camundaInstanceId;
148 approveState.value = approveVO.approveState;
149 if (approveVO.approveState == 'A' && approveVO.approveStaffGuids.indexOf(userData.staffGuid) > -1) {
150 flowState.value = 2;
151 }
152 if ((approveVO.approveState == 'C' || approveVO.approveState == 'R') && approveVO.staffGuid == userData.staffGuid) {
153 flowState.value = 3;
154 }
155 (approveVO.approveState == 'A' && approveVO.staffGuid == userData.staffGuid) && (isShowCancel.value = true);
156 } else {
157 getCamundaDeploymentId('10020', userData.tenantGuid, userData.staffGuid).then((res: any) => {
158 if (res.code == proxy.$passCode) {
159 deploymentId.value = res.data;
160 } else {
161 ElMessage.error(res.msg);
162 }
163 })
164 }
165 }
166 }).catch(() => {
167 loading.value = false;
168 })
169 }
170
171 const toPath = () => {
172 userStore.setTabbar(userStore.tabbar.filter((tab: any) => tab.fullPath !== fullPath));
173 assetStore.set(true);
174 router.push({
175 name: 'contractManagement',
176 })
177 }
178
179 const btnClick = async (btn) => {
180 const type = btn.value;
181 if (type == 'cancel') {
182 toPath()
183 }
184 }
185
186 onActivated(() => {
187 let tab: any = userStore.tabbar.find((tab: any) => tab.fullPath === router.currentRoute.value.fullPath);
188 if (tab) {
189 switch (detailType) {
190 case 'detail':
191 tab.meta.title = `详情-${damName}`;
192 document.title = `详情-${damName}`;
193 break;
194 }
195 }
196 })
197
198 onBeforeMount(() => {
199 if (guid) {
200 getTaskDetail()
201 } else {
202 getCamundaDeploymentId('10020', userData.tenantGuid, userData.staffGuid).then((res: any) => {
203 if (res.code == proxy.$passCode) {
204 deploymentId.value = res.data;
205 } else {
206 ElMessage.error(res.msg);
207 }
208 })
209 }
210 })
211
212 onMounted(() => {
213 })
214 </script>
215
216 <template>
217 <div class="container_wrap full" v-loading="loading">
218 <div class="content_main panel">
219 <ContentWrap id="contract-content-wrap" title="合同内容信息" expandSwicth style="margin-top: 15px" :isExpand="expand1"
220 @expand="(v) => expand1 = v">
221 <div class="list_panel">
222 <template v-for="item in contractContentFormItems" :key="item.field">
223 <div class="list_item" :class="{ 'is_block': item.block }"
224 v-if="item.type != 'upload-file'">
225 <span class="item_label">{{ item.label }}:</span>
226 <span class="item_value" v-if="item.field == 'dataContractType'">{{ flowDetail.dataContractTypeName ||
227 '--' }}</span>
228 <span class="item_value" v-else-if="item.field == 'apartyGuid'">{{ flowDetail.apartyName || '--' }}</span>
229 <span class="item_value" v-else-if="item.field == 'bpartyGuid'">{{ flowDetail.bpartyName || '--' }}</span>
230 <span class="item_value" v-else-if="item.field == 'originalTradingAmount'">{{
231 flowDetail.originalTradingAmount ?
232 `${flowDetail.originalTradingAmount}(${flowDetail.originalTradingUnitName})`
233 : '--' }}</span>
234 <span class="item_value"
235 v-else-if="item.field == 'relatedSalesContract' && (flowDetail.dataContractTypeName && flowDetail.dataContractTypeName.indexOf('采购') > -1)">{{
236 flowDetail.relatedSalesContractName ||
237 '--' }}</span>
238 <span class="item_value" v-else>{{ flowDetail[item.field] || '--' }}</span>
239 </div>
240 <div class="list_item" :class="{ 'is_block': item.block }" v-else>
241 <div class="file_item" v-if="flowDetail.demandPic && flowDetail.demandPic.name">
242 <span class="item_label">合同附件:</span>
243 <span class="item_value">
244 <div class="file-operate">
245 <template
246 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'">
247 <img class="file-img" src="../../assets/images/excel.png" />
248 </template>
249 <template
250 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'">
251 <img class="file-img" src="../../assets/images/word.png" />
252 </template>
253 <template
254 v-else-if="flowDetail.demandPic.name.substring(flowDetail.demandPic.name.lastIndexOf('.') + 1).toLowerCase() == 'zip'">
255 <img class="file-img" src="../../assets/images/zip.png" />
256 </template>
257 <template
258 v-else-if="flowDetail.demandPic.name.substring(flowDetail.demandPic.name.lastIndexOf('.') + 1).toLowerCase() == 'rar'">
259 <img class="file-img" src="../../assets/images/RAR.png" />
260 </template>
261 <template
262 v-else-if="flowDetail.demandPic.name.substring(flowDetail.demandPic.name.lastIndexOf('.') + 1).toLowerCase() == 'pdf'">
263 <img class="file-img" src="../../assets/images/PDF.png" />
264 </template>
265 <template
266 v-else-if="flowDetail.demandPic.name.substring(flowDetail.demandPic.name.lastIndexOf('.') + 1).toLowerCase() == 'png'">
267 <img class="file-img" src="../../assets/images/png.png" />
268 </template>
269 <template
270 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'">
271 <img class="file-img" src="../../assets/images/jpg.png" />
272 </template>
273 <div class="file-name"><ellipsis-tooltip :content="flowDetail.demandPic.name ?? ''" class-name="w100f"
274 refName="tooltipOver"></ellipsis-tooltip></div>
275 <div :style="{ right: '36px' }"
276 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'"
277 class="file-preview" @click="onUploadFilePreview(flowDetail.demandPic)">查看</div>
278 <div :style="{ right: '0px' }" class="file-preview"
279 @click="onUploadFileDownload(flowDetail.demandPic)">下载</div>
280 </div>
281 </span>
282 </div>
283 </div>
284 </template>
285 <div class="list_item is_block" v-if="flowDetail.contractAttachPic && flowDetail.contractAttachPic.name">
286 <div class="file_item">
287 <span class="item_label">盖章合同附件:</span>
288 <span class="item_value">
289 <div class="file-operate">
290 <template
291 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'">
292 <img class="file-img" src="../../assets/images/excel.png" />
293 </template>
294 <template
295 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'">
296 <img class="file-img" src="../../assets/images/word.png" />
297 </template>
298 <template
299 v-else-if="flowDetail.contractAttachPic.name.substring(flowDetail.contractAttachPic.name.lastIndexOf('.') + 1).toLowerCase() == 'zip'">
300 <img class="file-img" src="../../assets/images/zip.png" />
301 </template>
302 <template
303 v-else-if="flowDetail.contractAttachPic.name.substring(flowDetail.contractAttachPic.name.lastIndexOf('.') + 1).toLowerCase() == 'rar'">
304 <img class="file-img" src="../../assets/images/RAR.png" />
305 </template>
306 <template
307 v-else-if="flowDetail.contractAttachPic.name.substring(flowDetail.contractAttachPic.name.lastIndexOf('.') + 1).toLowerCase() == 'pdf'">
308 <img class="file-img" src="../../assets/images/PDF.png" />
309 </template>
310 <template
311 v-else-if="flowDetail.contractAttachPic.name.substring(flowDetail.contractAttachPic.name.lastIndexOf('.') + 1).toLowerCase() == 'png'">
312 <img class="file-img" src="../../assets/images/png.png" />
313 </template>
314 <template
315 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'">
316 <img class="file-img" src="../../assets/images/jpg.png" />
317 </template>
318 <div class="file-name"><ellipsis-tooltip :content="flowDetail.contractAttachPic.name ?? ''" class-name="w100f"
319 refName="tooltipOver"></ellipsis-tooltip></div>
320 <div :style="{ right: '36px' }"
321 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'"
322 class="file-preview" @click="onUploadFilePreview(flowDetail.contractAttachPic)">查看</div>
323 <div :style="{ right: '0px' }" class="file-preview"
324 @click="onUploadFileDownload(flowDetail.contractAttachPic)">
325 下载</div>
326 </div>
327 </span>
328 </div>
329 </div>
330 </div>
331 </ContentWrap>
332 <ContentWrap id="contract-signatory-wrap" title="合同签署方" expandSwicth style="margin-top: 15px" :isExpand="expand2"
333 @expand="(v) => expand2 = v">
334 <!-- <el-button type="primary" @click="btnClick({ value: 'add-signatory' })">新增</el-button> -->
335 <div class="list_panel">
336 <template v-for="item in contractSignatoryFormItems" :key="item.field">
337 <div class="list_item" :class="{ 'is_block': item.block }" v-if="item.visible ?? true">
338 <span class="item_label">{{ item.label }}:</span>
339 <span class="item_value" v-if="item.field == 'cpartyGuid'">{{ flowDetail.cpartyName || '--' }}</span>
340 <span class="item_value" v-else>{{ flowDetail.dpartyName || '--' }}</span>
341 </div>
342 </template>
343 </div>
344 </ContentWrap>
345 <ContentWrap id="payment-wrap" title="付款方式" expandSwicth style="margin-top: 15px" :isExpand="expand3"
346 @expand="(v) => expand3 = v">
347 <div class="list_panel">
348 <div class="list_item" :class="[payPlan ? 'is_block' : 'mr8']">
349 <span class="item_label">付款方式:</span>
350 <span class="item_value">{{ flowDetail.paymentWayName || '--' }}</span>
351 </div>
352 <div class="list_item mr8" v-if="!payPlan">
353 <span class="item_label">付款值:</span>
354 <span class="item_value">{{ flowDetail.paymentAmount ?
355 `${flowDetail.paymentAmount}(${flowDetail.paymentUnitName})` :
356 '--' }}</span>
357 </div>
358 <template v-else>
359 <template v-for="item in (flowDetail.phasePaymentRecordRSVOS || [])" :key="item.guid">
360 <div class="list_item mr8">
361 <span class="item_label">阶段内容:</span>
362 <span class="item_value">{{ item.phaseContent || '--' }}</span>
363 </div>
364 <div class="list_item mr8">
365 <span class="item_label">付款值:</span>
366 <span class="item_value">{{ item.paymentAmount ?
367 `${item.paymentAmount}(${item.paymentUnitName})` : '--' }}</span>
368 </div>
369 </template>
370 </template>
371 </div>
372 </ContentWrap>
373 <ContentWrap id="id-approveInfo" title="流程审批" expandSwicth style="margin-top: 15px" :isExpand="expand4"
374 @expand="(v) => expand4 = v">
375 <ApprovalProcess ref="approvalProcessRef" v-if="deploymentId" :deploymentId="deploymentId"
376 :processInstanceId="processInstanceId">
377 </ApprovalProcess>
378 </ContentWrap>
379 </div>
380 <div class="tool_btns">
381 <div class="btns">
382 <el-button @click="btnClick({ value: 'cancel' })" v-if="detailType == 'detail'">关闭</el-button>
383 </div>
384 </div>
385 </div>
386 </template>
387
388 <style scoped lang="scss">
389 .container_wrap {
390 overflow: hidden;
391
392 .content_main {
393 height: calc(100% - 45px);
394 overflow: hidden auto;
395
396 &.panel {
397 padding: 0 16px 16px;
398 }
399
400 &.full {
401 height: 100%;
402 }
403
404 .template_panel {
405 display: flex;
406 flex-wrap: wrap;
407 padding: 16px 16px 8px;
408
409 .title_item {
410 display: flex;
411 margin-bottom: 8px;
412
413 +.title_item {
414 margin-left: 40px;
415 }
416
417 .title_label {
418 display: block;
419 width: 80px;
420 line-height: 1.5;
421 }
422
423 .title_text {
424 line-height: 1.5;
425 }
426
427 &.is_block {
428 width: 100%;
429 margin-left: 0;
430
431 .title_text {
432 display: block;
433 width: calc(100% - 80px);
434 text-align: justify;
435 }
436 }
437 }
438 }
439
440 .panel_content {
441 height: 100%;
442 display: flex;
443 flex: 1;
444 border-top: 1px solid #d9d9d9;
445
446 .box_left {
447 width: 200px;
448 height: 100%;
449 border-right: 1px solid #d9d9d9;
450
451 .aside_title {
452 padding: 0 8px;
453 height: 40px;
454 line-height: 40px;
455 font-size: 14px;
456 color: #212121;
457 font-weight: 600;
458 }
459
460 .tree_panel {
461 height: 100%;
462 }
463 }
464
465 .box_right {
466 width: calc(100% - 200px);
467 padding-top: 8px;
468
469 .el-breadcrumb {
470 padding: 0 12px;
471 line-height: 40px;
472 }
473 }
474 }
475
476 .table_panel_wrap {
477 width: 100%;
478 height: 100%;
479 padding: 0 12px;
480
481 &.full {
482 padding: 0;
483 }
484 }
485 }
486
487 .list_panel {
488 display: flex;
489 flex-wrap: wrap;
490
491 .list_item {
492 width: 33.33%;
493 line-height: 32px;
494 font-size: 14px;
495 color: #666666;
496 display: flex;
497 justify-content: space-between;
498
499 .item_label {
500 width: 100px;
501 text-align: right;
502 }
503
504 .file_item {
505 width: 50%;
506 display: flex;
507 justify-content: space-between;
508 }
509
510 .item_value {
511 color: var(--el-color-regular);
512 padding: 0 16px;
513 flex: 1;
514 text-align: justify;
515 min-width: 0;
516
517 .file-operate {
518 display: flex;
519 align-items: center;
520 position: relative;
521
522 .file-img {
523 width: 24px;
524 height: 24px;
525 }
526
527 &:hover {
528 background-color: #f5f5f5;
529 }
530
531 .file-name {
532 color: var(--el-color-regular);
533 margin-left: 4px;
534 width: calc(100% - 108px);
535 }
536
537 .file-preview {
538 position: absolute;
539 cursor: pointer;
540 color: var(--el-color-primary);
541 margin-right: 8px;
542 }
543 }
544
545 .area_text+.area_text {
546 &::before {
547 content: '、',
548 }
549 }
550 }
551
552 &.is_block {
553 width: 100%;
554
555 .file_item {
556 width: 100%;
557 }
558
559 .item_value {
560 white-space: pre-wrap;
561 }
562 }
563
564 &.mr8 {
565 margin-right: 8px;
566 }
567 }
568
569 :deep(.el-form) {
570 width: 100%;
571 }
572
573 :deep(.panel_body) {
574 box-shadow: none;
575 }
576
577 &.label_auto {
578 .list_item {
579 .item_label {
580 width: auto;
581 }
582
583 .item_value {
584 padding-left: 0;
585 }
586 }
587 }
588 }
589
590 :deep(.el-form) {
591 .el-form-item .el-input__validateIcon {
592 display: none;
593 }
594 }
595
596 .tool_btns {
597 height: 44px;
598 margin: 0 -8px;
599 display: flex;
600 justify-content: center;
601 align-items: center;
602 border-top: 1px solid #d9d9d9;
603 }
604 }
605 </style>
...@@ -14,7 +14,9 @@ import { ...@@ -14,7 +14,9 @@ import {
14 costAssessAllow, 14 costAssessAllow,
15 getRegisterCatalogTableDetail, 15 getRegisterCatalogTableDetail,
16 getEvaDetail, 16 getEvaDetail,
17 getCostDetail 17 getCostDetail,
18 getDataReceiveContractDetail,
19 getCertificateDetail
18 } from "@/api/modules/dataAsset"; 20 } from "@/api/modules/dataAsset";
19 import { changeNum } from '@/utils/common' 21 import { changeNum } from '@/utils/common'
20 import { ElMessage, ElMessageBox } from "element-plus"; 22 import { ElMessage, ElMessageBox } from "element-plus";
...@@ -25,10 +27,12 @@ const router = useRouter(); ...@@ -25,10 +27,12 @@ const router = useRouter();
25 const route = useRoute(); 27 const route = useRoute();
26 const userStore = useUserStore(); 28 const userStore = useUserStore();
27 const userData = JSON.parse(userStore.userData) 29 const userData = JSON.parse(userStore.userData)
30 const assetStore = useDataAssetStore();
28 const fullPath = route.fullPath; 31 const fullPath = route.fullPath;
29 const catalogGuid = route.query.guid; 32 const catalogGuid = route.query.guid;
30 const evaGuid = route.query.evaGuid; 33 const evaGuid = route.query.evaGuid;
31 const costAssessGuid = route.query.costAssessGuid; 34 const costAssessGuid = route.query.costAssessGuid;
35 const certificateGuid = route.query.certificateGuid;
32 const detailType = ref(route.query.type); 36 const detailType = ref(route.query.type);
33 37
34 const { proxy } = getCurrentInstance() as any; 38 const { proxy } = getCurrentInstance() as any;
...@@ -40,6 +44,9 @@ const fullscreenLoading = ref(false); ...@@ -40,6 +44,9 @@ const fullscreenLoading = ref(false);
40 const isTruncated = ref(false); 44 const isTruncated = ref(false);
41 const isExpanded = ref(false); 45 const isExpanded = ref(false);
42 46
47 /** 交付物结果数据 */
48 const deliveryDetailInfo: any = ref([]);
49
43 const baseInfoFormItems = ref([ 50 const baseInfoFormItems = ref([
44 { 51 {
45 label: '资源描述', 52 label: '资源描述',
...@@ -79,6 +86,8 @@ const evaDetailInfo: any = ref({}); ...@@ -79,6 +86,8 @@ const evaDetailInfo: any = ref({});
79 86
80 const costAssessDetail: any = ref({}); 87 const costAssessDetail: any = ref({});
81 88
89 const certificateDetail: any = ref({});
90
82 const deploymentId = ref(''); 91 const deploymentId = ref('');
83 92
84 const processInstanceId = ref(''); 93 const processInstanceId = ref('');
...@@ -102,7 +111,34 @@ const getDetailInfo = () => { ...@@ -102,7 +111,34 @@ const getDetailInfo = () => {
102 tab.meta.title = `详情-${data.damName}`; 111 tab.meta.title = `详情-${data.damName}`;
103 } 112 }
104 isTextTruncated(); 113 isTextTruncated();
114 if (detailInfo.value.isRegister == 'Y') {
115 getDataReceiveContractDetail(catalogGuid).then((res: any) => {
116 if (res.code == proxy.$passCode) {
117 fullscreenLoading.value = false;
118 let dataInfo = res.data || [];
119 deliveryDetailInfo.value = [];
120 dataInfo.forEach(d => {
121 if (d.dataReceiveRSVOS?.length) {
122 d.dataReceiveRSVOS.forEach((rece, index) => {
123 deliveryDetailInfo.value.push({
124 uploadTime: d.uploadTime,
125 dataReceiveName: rece.dataReceiveName,
126 dataReceiveGuid: rece.dataReceiveGuid,
127 contractInfo: rece.contractInfo || [],
128 dataDeliveryName: d.dataDelivery[0].name,
129 rowspan: index + 1,
130 });
131 })
132 }
133 })
134 } else {
135 fullscreenLoading.value = false;
136 proxy.$ElMessage.error(res.msg);
137 }
138 });
139 } else {
105 fullscreenLoading.value = false; 140 fullscreenLoading.value = false;
141 }
106 } else { 142 } else {
107 fullscreenLoading.value = false; 143 fullscreenLoading.value = false;
108 proxy.$ElMessage.error(res.msg); 144 proxy.$ElMessage.error(res.msg);
...@@ -133,10 +169,22 @@ const getDetailInfo = () => { ...@@ -133,10 +169,22 @@ const getDetailInfo = () => {
133 } 169 }
134 }) 170 })
135 } 171 }
172 if (certificateGuid) {
173 getCertificateDetail({ guid: certificateGuid, serviceTenantGuid: route.query.tenantGuid }).then((res: any) => {
174 if (res.code == proxy.$passCode) {
175 const data = res.data || {};
176 certificateDetail.value = data;
177 } else {
178 ElMessage.error(res.msg);
179 }
180 })
181 }
136 } 182 }
137 183
138 onBeforeMount(() => { 184 onBeforeMount(() => {
185 if (!assetStore.isRefreshDamCatalog) {
139 getDetailInfo(); 186 getDetailInfo();
187 }
140 }); 188 });
141 189
142 onActivated(() => { 190 onActivated(() => {
...@@ -145,6 +193,10 @@ onActivated(() => { ...@@ -145,6 +193,10 @@ onActivated(() => {
145 document.title = `详情-${detailInfo.value?.damName}`; 193 document.title = `详情-${detailInfo.value?.damName}`;
146 } 194 }
147 } 195 }
196 if (assetStore.isRefreshDamCatalog) {
197 getDetailInfo();
198 assetStore.setDamCatalogRefresh(false);
199 }
148 }); 200 });
149 201
150 onMounted(() => { 202 onMounted(() => {
...@@ -891,6 +943,36 @@ const handleClick = () => { ...@@ -891,6 +943,36 @@ const handleClick = () => {
891 } 943 }
892 }; 944 };
893 945
946 const deliverySpanMethod = ({
947 row,
948 column,
949 rowIndex,
950 columnIndex,
951 }) => {
952 if (columnIndex === 0 || columnIndex === 1 || columnIndex === 4) {
953 let currentSpan = deliveryDetailInfo.value[rowIndex].rowspan;
954 let rowspan = deliveryDetailInfo.value[rowIndex + 1]?.rowspan
955 if (rowspan && rowspan > 1) {
956 return { rowspan: rowspan, colspan: 1 };
957 } else {
958 return { rowspan: currentSpan == 1 ? 1 : 0, colspan: currentSpan == 1 ? 1 : 0 }
959 }
960 } else {
961 return { rowspan: 1, colspan: 1 }
962 }
963 }
964
965 const clickContractDetail = (item) => {
966 router.push({
967 name: 'registerCatalogContractDetail',
968 query: {
969 guid: item.dataContractGuid,
970 name: item.dataContractName,
971 type: 'detail',
972 tenantGuid: userData.tenantGuid
973 }
974 })
975 }
894 976
895 </script> 977 </script>
896 978
...@@ -913,8 +995,8 @@ const handleClick = () => { ...@@ -913,8 +995,8 @@ const handleClick = () => {
913 </div> 995 </div>
914 <div class="applicationScenarios" 996 <div class="applicationScenarios"
915 :style="{ 'margin-right': (isTruncated && !isExpanded) ? '30px' : '0px', WebkitLineClamp: (!isTruncated ? 'inherit' : (isExpanded ? 'inherit' : 1)), WebkitBoxOrient: 'vertical' }"> 997 :style="{ 'margin-right': (isTruncated && !isExpanded) ? '30px' : '0px', WebkitLineClamp: (!isTruncated ? 'inherit' : (isExpanded ? 'inherit' : 1)), WebkitBoxOrient: 'vertical' }">
916 {{ '覆盖地域:' + (detailInfo.coverageArea?.[0]?.[0] == 'all' ? '全国' : (detailInfo.coverageAreaName?.map(c => 998 {{'覆盖地域:' + (detailInfo.coverageArea?.[0]?.[0] == 'all' ? '全国' : (detailInfo.coverageAreaName?.map(c =>
917 c.join('/')).join(',') ?? '--')) }}<span v-if="isTruncated" class="text_btn expand_btn" 999 c.join('/')).join(',') ?? '--'))}}<span v-if="isTruncated" class="text_btn expand_btn"
918 :style="{ position: isExpanded ? 'inherit' : 'absolute', 'margin-left': isExpanded ? '4px' : '0px' }" 1000 :style="{ position: isExpanded ? 'inherit' : 'absolute', 'margin-left': isExpanded ? '4px' : '0px' }"
919 @click="handleExpand()" v-preReClick>{{ 1001 @click="handleExpand()" v-preReClick>{{
920 isExpanded 1002 isExpanded
...@@ -925,7 +1007,8 @@ const handleClick = () => { ...@@ -925,7 +1007,8 @@ const handleClick = () => {
925 <ContentWrap id="id-assetContent" title="基础信息" description="" style="margin: 0 16px"> 1007 <ContentWrap id="id-assetContent" title="基础信息" description="" style="margin: 0 16px">
926 <Form ref="baseInfoFormRef" :itemList="baseInfoFormItems" formId="base-info-form" /> 1008 <Form ref="baseInfoFormRef" :itemList="baseInfoFormItems" formId="base-info-form" />
927 </ContentWrap> 1009 </ContentWrap>
928 <ContentWrap id="id-table" title="资源表" v-if="detailInfo.damCatalogTableInfo?.length" description="" style="margin: 16px 16px 16px"> 1010 <ContentWrap id="id-table" title="资源表" v-if="detailInfo.damCatalogTableInfo?.length" description=""
1011 style="margin: 16px 16px 16px">
929 <el-table v-show="!fullscreenLoading" ref="tableRef" :data="detailInfo.damCatalogTableInfo" 1012 <el-table v-show="!fullscreenLoading" ref="tableRef" :data="detailInfo.damCatalogTableInfo"
930 :highlight-current-row="true" stripe border @expand-change="handleTableExpandChange" height="100%" 1013 :highlight-current-row="true" stripe border @expand-change="handleTableExpandChange" height="100%"
931 tooltip-effect="light" row-key="guid" :style="{ 1014 tooltip-effect="light" row-key="guid" :style="{
...@@ -1017,8 +1100,9 @@ const handleClick = () => { ...@@ -1017,8 +1100,9 @@ const handleClick = () => {
1017 </el-table-column> 1100 </el-table-column>
1018 </el-table> 1101 </el-table>
1019 </ContentWrap> 1102 </ContentWrap>
1020 <ContentWrap v-if="(route.query.type == 'qualityEvaluate' && evaDetailInfo?.qualityEvaluationFile?.length > 0) || (route.query.type == 'costAssess' && costAssessDetail?.costAssessmentFile?.length > 0)" id="id-assetContent" 1103 <ContentWrap
1021 title="附件信息" description="" style="margin: 16px 16px 16px"> 1104 v-if="(route.query.type == 'qualityEvaluate' && evaDetailInfo?.qualityEvaluationFile?.length > 0) || (route.query.type == 'costAssess' && costAssessDetail?.costAssessmentFile?.length > 0)"
1105 id="id-assetContent" title="附件信息" description="" style="margin: 16px 16px 16px">
1022 <div class="list_panel mt4"> 1106 <div class="list_panel mt4">
1023 <div class="list_item isFile" v-if="evaDetailInfo?.qualityEvaluationFile?.length" :style="{ width: '40%' }"> 1107 <div class="list_item isFile" v-if="evaDetailInfo?.qualityEvaluationFile?.length" :style="{ width: '40%' }">
1024 <span class="item_label" :style="{ width: 'auto', 'text-align': 'left' }">数据质量评价收集</span> 1108 <span class="item_label" :style="{ width: 'auto', 'text-align': 'left' }">数据质量评价收集</span>
...@@ -1160,11 +1244,110 @@ const handleClick = () => { ...@@ -1160,11 +1244,110 @@ const handleClick = () => {
1160 </div> 1244 </div>
1161 </ContentWrap> 1245 </ContentWrap>
1162 1246
1163 <ContentWrap v-if="(route.query.type == 'qualityEvaluate' && evaDetailInfo.approveVO && evaDetailInfo.isApprove !='N') || (route.query.type == 'costAssess' && costAssessDetail.approveVO && costAssessDetail.isApprove !='N')" id="id-approveInfo" 1247 <ContentWrap id="id-certificate" title="证件信息" v-if="route.query.type == 'certificate'" style="margin: 16px 16px 16px" >
1164 title="审批信息" description="" style="margin: 16px 16px 16px"> 1248 <div class="list_panel">
1165 <ApprovalProcess ref="approvalProcessRef" v-if="deploymentId" :deploymentId="deploymentId" :processInstanceId="processInstanceId"> 1249 <div class="list_item">
1250 <span class="item_label">证件编码:</span>
1251 <span class="item_value">{{ certificateDetail.daCode ?? '--' }}</span>
1252 </div>
1253 <div class="list_item">
1254 <span class="item_label">登记时间:</span>
1255 <span class="item_value">{{ certificateDetail.registerTime ?? '--' }}</span>
1256 </div>
1257 <div class="list_item">
1258 <span class="item_label">有效期:</span>
1259 <span class="item_value">{{ certificateDetail.effectiveDate ?? '--' }}</span>
1260 </div>
1261 <div class="list_item">
1262 <span class="item_label">发证主体:</span>
1263 <span class="item_value"><ellipsis-tooltip :content="certificateDetail.issuingEntityName ?? '--'"
1264 class-name="w100f mr8-i" :refName="'tooltipOver' + 'issuingEntityName'"></ellipsis-tooltip></span>
1265 </div>
1266 <div class="list_item">
1267 <span class="item_label">证件类型:</span>
1268 <span class="item_value">{{ certificateDetail.documentType == 1 ? 'A证' : (certificateDetail.documentType == 2 ? 'B证' :
1269 'C证') }}</span>
1270 </div>
1271 <div class="list_item">
1272 <span class="item_label">证件类别:</span>
1273 <span class="item_value">{{ certificateDetail.documentCategoryName ?? '--' }}</span>
1274 </div>
1275 <div class="list_item is_block" v-if="certificateDetail.documentFile?.length" :style="{ 'max-width': '700px' }">
1276 <span class="item_label">证件:</span>
1277 <span class="item_value">
1278 <div class="file-operate">
1279 <template
1280 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'">
1281 <img class="file-img" src="../../assets/images/excel.png" />
1282 </template>
1283 <template
1284 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'">
1285 <img class="file-img" src="../../assets/images/word.png" />
1286 </template>
1287 <template
1288 v-else-if="certificateDetail.documentFile?.[0]?.name.substring(certificateDetail.documentFile?.[0]?.name.lastIndexOf('.') + 1).toLowerCase() == 'zip'">
1289 <img class="file-img" src="../../assets/images/zip.png" />
1290 </template>
1291 <template
1292 v-else-if="certificateDetail.documentFile?.[0]?.name.substring(certificateDetail.documentFile?.[0]?.name.lastIndexOf('.') + 1).toLowerCase() == 'rar'">
1293 <img class="file-img" src="../../assets/images/RAR.png" />
1294 </template>
1295 <template
1296 v-else-if="certificateDetail.documentFile?.[0]?.name.substring(certificateDetail.documentFile?.[0]?.name.lastIndexOf('.') + 1).toLowerCase() == 'pdf'">
1297 <img class="file-img" src="../../assets/images/PDF.png" />
1298 </template>
1299 <template
1300 v-else-if="certificateDetail.documentFile?.[0]?.name.substring(certificateDetail.documentFile?.[0]?.name.lastIndexOf('.') + 1).toLowerCase() == 'png'">
1301 <img class="file-img" src="../../assets/images/png.png" />
1302 </template>
1303 <template
1304 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'">
1305 <img class="file-img" src="../../assets/images/jpg.png" />
1306 </template>
1307 <div class="file-name"><ellipsis-tooltip :content="certificateDetail.documentFile[0].name ?? ''"
1308 class-name="w100f" refName="tooltipOver"></ellipsis-tooltip></div>
1309 <div :style="{ right: '36px' }" class="file-preview"
1310 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'"
1311 @click="onUploadFilePreview(certificateDetail.documentFile?.[0])">查看</div>
1312 <div :style="{ right: '0px' }" class="file-preview"
1313 @click="onUploadFileDownload(certificateDetail.documentFile?.[0])">下载</div>
1314 </div>
1315 </span>
1316 </div>
1317 </div>
1318 </ContentWrap>
1319
1320 <ContentWrap
1321 v-if="(route.query.type == 'qualityEvaluate' && evaDetailInfo.approveVO && evaDetailInfo.isApprove != 'N') || (route.query.type == 'costAssess' && costAssessDetail.approveVO && costAssessDetail.isApprove != 'N')"
1322 id="id-approveInfo" title="审批信息" description="" style="margin: 16px 16px 16px">
1323 <ApprovalProcess ref="approvalProcessRef" v-if="deploymentId" :deploymentId="deploymentId"
1324 :processInstanceId="processInstanceId">
1166 </ApprovalProcess> 1325 </ApprovalProcess>
1167 </ContentWrap> 1326 </ContentWrap>
1327
1328 <ContentWrap v-if="route.query.type == 'asset' && deliveryDetailInfo.length" id="id-deliverFile" title="交付物" description=""
1329 style="margin: 16px 16px 16px">
1330 <el-table ref="deliveryTableRef" :data="deliveryDetailInfo" :highlight-current-row="true" stripe border
1331 height="100%" :span-method="deliverySpanMethod" tooltip-effect="light" row-key="guid" :style="{
1332 width: '100%',
1333 display: 'inline-block',
1334 }">
1335 <el-table-column label="序号" type="index" width="56px" align="center" >
1336 </el-table-column>
1337 <el-table-column prop="dataDeliveryName" label="数据交付物" width="240px" align="left" >
1338 </el-table-column>
1339 <el-table-column prop="dataReceiveName" label="数据接收方" width="240px" align="left">
1340 </el-table-column>
1341 <el-table-column prop="contract" label="合同" min-width="200px" align="left">
1342 <template #default="scope">
1343 <a v-for="item in scope.row.contractInfo" underline="hover" style="margin-right: 12px;cursor: pointer;" @click="clickContractDetail(item)">{{
1344 item.dataContractName }}</a>
1345 </template>
1346 </el-table-column>
1347 <el-table-column prop="uploadTime" label="上传时间" width="180px" align="left">
1348 </el-table-column>
1349 </el-table>
1350 </ContentWrap>
1168 </div> 1351 </div>
1169 <div class="tool_btns" 1352 <div class="tool_btns"
1170 v-if="toolBtns.length && (route.query.type == 'qualityEvaluate' || route.query.type == 'costAssess' || route.query.type == 'asset')"> 1353 v-if="toolBtns.length && (route.query.type == 'qualityEvaluate' || route.query.type == 'costAssess' || route.query.type == 'asset')">
......
...@@ -12,11 +12,13 @@ import { ...@@ -12,11 +12,13 @@ import {
12 getParamsList, 12 getParamsList,
13 getDamCatalogTable, 13 getDamCatalogTable,
14 registerCatalogDelete, 14 registerCatalogDelete,
15 getDamTypesList 15 getDamTypesList,
16 getDataReceiveContract
16 } from "@/api/modules/dataAsset"; 17 } from "@/api/modules/dataAsset";
17 import { commonPageConfig } from "@/utils/enum"; 18 import { commonPageConfig } from "@/utils/enum";
18 import useDataAssetStore from "@/store/modules/dataAsset"; 19 import useDataAssetStore from "@/store/modules/dataAsset";
19 import useUserStore from "@/store/modules/user"; 20 import useUserStore from "@/store/modules/user";
21 import deliverUploadDialog from "./components/deliverUploadDialog.vue";
20 22
21 const userStore = useUserStore(); 23 const userStore = useUserStore();
22 const userData = JSON.parse(userStore.userData); 24 const userData = JSON.parse(userStore.userData);
...@@ -115,8 +117,6 @@ const searchItemList = ref([ ...@@ -115,8 +117,6 @@ const searchItemList = ref([
115 }, 117 },
116 ]); 118 ]);
117 119
118
119
120 const pageInfo = ref({ 120 const pageInfo = ref({
121 ...commonPageConfig, 121 ...commonPageConfig,
122 rows: 0, 122 rows: 0,
...@@ -353,6 +353,46 @@ const handleWindowResize = () => { ...@@ -353,6 +353,46 @@ const handleWindowResize = () => {
353 }); 353 });
354 }; 354 };
355 355
356 /** 上传交付物相关逻辑 */
357 const deliverUploadVisible = ref(false);
358
359 const deliverDataReceiveContract = ref([]);
360
361 const getReceivePromise: any = ref(null);
362
363 const uploadDeliverItem: any = ref({});
364
365 const handleClickUploadBtn = (item) => {
366 if (getReceivePromise.value) {
367 return;
368 }
369 uploadDeliverItem.value = item;
370 getReceivePromise.value = getDataReceiveContract().then((res: any) => {
371 getReceivePromise.value = null
372 if (res.code == proxy.$passCode) {
373 deliverDataReceiveContract.value = res.data || [];
374 if (!deliverDataReceiveContract.value?.length) {
375 proxy.$ElMessage.error('没有可选择的数据接收方和合同,无法上传交付物');
376 } else {
377 deliverUploadVisible.value = true;
378 }
379 } else {
380 proxy.$ElMessage.error(res.msg);
381 }
382 })
383 }
384
385 const handleUploadClose = (itemGuid) => {
386 deliverUploadVisible.value = false
387 if (itemGuid) {
388 assetStore.setDamCatalogRefresh(true);
389 router.push({
390 name: "registerCatalogDetail",
391 query: { guid: itemGuid, type: "asset" },
392 });
393 }
394 }
395
356 </script> 396 </script>
357 397
358 <template> 398 <template>
...@@ -445,6 +485,7 @@ const handleWindowResize = () => { ...@@ -445,6 +485,7 @@ const handleWindowResize = () => {
445 <el-button plain v-if="!(item.isRegister == 'Y' || item.foundMode == 2) && item.foundMode != 3" 485 <el-button plain v-if="!(item.isRegister == 'Y' || item.foundMode == 2) && item.foundMode != 3"
446 @click.stop="tableBtnClick(item, 'delete')">删除</el-button> 486 @click.stop="tableBtnClick(item, 'delete')">删除</el-button>
447 <el-button plain v-if="!(item.isRegister == 'Y') && item.foundMode != 3" @click.stop="handleDataClick(item)">编辑</el-button> 487 <el-button plain v-if="!(item.isRegister == 'Y') && item.foundMode != 3" @click.stop="handleDataClick(item)">编辑</el-button>
488 <el-button plain @click.stop="handleClickUploadBtn(item)" v-if="item.isRegister == 'Y'">上传交付物</el-button>
448 <el-button plain @click.stop="handleDataClick(item)" v-if="(item.isRegister == 'Y' || item.foundMode == 3)">详情</el-button> 489 <el-button plain @click.stop="handleDataClick(item)" v-if="(item.isRegister == 'Y' || item.foundMode == 3)">详情</el-button>
449 </div> 490 </div>
450 </div> 491 </div>
...@@ -457,6 +498,7 @@ const handleWindowResize = () => { ...@@ -457,6 +498,7 @@ const handleWindowResize = () => {
457 498
458 </div> 499 </div>
459 <PageNav :class="[pageInfo.type]" :pageInfo="pageInfo" @pageChange="pageChange" /> 500 <PageNav :class="[pageInfo.type]" :pageInfo="pageInfo" @pageChange="pageChange" />
501 <deliverUploadDialog :uploadDeliverItem="uploadDeliverItem" :visible="deliverUploadVisible" :listData="deliverDataReceiveContract" @close="handleUploadClose"></deliverUploadDialog>
460 </div> 502 </div>
461 503
462 </template> 504 </template>
......
...@@ -1760,10 +1760,14 @@ const passCommonDialogBtnClick = (btn, info) => { ...@@ -1760,10 +1760,14 @@ const passCommonDialogBtnClick = (btn, info) => {
1760 class-name="w100f mr8-i" :refName="'tooltipOver' + 'issuingEntityName'"></ellipsis-tooltip></span> 1760 class-name="w100f mr8-i" :refName="'tooltipOver' + 'issuingEntityName'"></ellipsis-tooltip></span>
1761 </div> 1761 </div>
1762 <div class="list_item"> 1762 <div class="list_item">
1763 <span class="item_label">类型:</span> 1763 <span class="item_label">证件类型:</span>
1764 <span class="item_value">{{ detailInfo.documentType == 1 ? 'A证' : (detailInfo.documentType == 2 ? 'B证' : 1764 <span class="item_value">{{ detailInfo.documentType == 1 ? 'A证' : (detailInfo.documentType == 2 ? 'B证' :
1765 'C证') }}</span> 1765 'C证') }}</span>
1766 </div> 1766 </div>
1767 <div class="list_item">
1768 <span class="item_label">证件类别:</span>
1769 <span class="item_value">{{ detailInfo.documentCategoryName ?? '--' }}</span>
1770 </div>
1767 <div class="list_item is_block" v-if="detailInfo.documentFile?.length" :style="{ 'max-width': '700px' }"> 1771 <div class="list_item is_block" v-if="detailInfo.documentFile?.length" :style="{ 'max-width': '700px' }">
1768 <span class="item_label">证件:</span> 1772 <span class="item_label">证件:</span>
1769 <span class="item_value"> 1773 <span class="item_value">
......
1 <template>
2 <div class="content_main">
3 <div class="loading-main" v-show="loadingProcess">
4 <div class="row-main">
5 <img class="loading-img" src="../../assets/images/loading.gif" />
6 <div class="title-first" style=" margin-left: 22px;">正在检测您的账号安全状态,请稍后……</div>
7 </div>
8 <div class="row-main mt15">
9 <el-icon style="width: 30px;height: 24px;" color="#1ba854" class="small">
10 <CircleCheckFilled />
11 </el-icon>
12 <div class="title-desc">IP认证成功</div>
13 </div>
14 <div class="row-main mt15">
15 <div class="circle-main">
16 <div class="circle"></div>
17 </div>
18 <div class="title-desc">通行密钥认证</div>
19 </div>
20 </div>
21
22 <div class="loading-main" v-show="!loadingProcess">
23 <div class="row-main">
24 <el-icon style="width: 32px;height: 32px;" color="#1ba854" class="big">
25 <CircleCheckFilled />
26 </el-icon>
27 <div class="title-first" style=" margin-left: 22px;">认证通过</div>
28 </div>
29 <div class="row-main mt15">
30 <el-icon style="width: 30px;height: 24px;" color="#1ba854" class="small">
31 <CircleCheckFilled />
32 </el-icon>
33 <div class="title-desc">IP认证成功</div>
34 </div>
35 <div class="row-main mt15">
36 <el-icon style="width: 30px;height: 24px;" color="#1ba854" class="small">
37 <CircleCheckFilled />
38 </el-icon>
39 <div class="title-desc">通行密钥认证</div>
40 </div>
41 </div>
42
43 <div class="file-down" v-if="!loadingProcess && file.name">
44 <div class="title-first">交付物下载</div>
45 <div class="file-row-main">
46 <div class="file-operate">
47 <template
48 v-if="file.name.substring(file.name.lastIndexOf('.') + 1).toLowerCase() == 'xls' || file.name.substring(file.name.lastIndexOf('.') + 1).toLowerCase() == 'xlsx'">
49 <img class="file-img" src="../../assets/images/excel.png" />
50 </template>
51 <template
52 v-else-if="file.name.substring(file.name.lastIndexOf('.') + 1).toLowerCase() == 'doc' || file.name.substring(file.name.lastIndexOf('.') + 1).toLowerCase() == 'docx'">
53 <img class="file-img" src="../../assets/images/word.png" />
54 </template>
55 <template v-else-if="file.name.substring(file.name.lastIndexOf('.') + 1).toLowerCase() == 'zip'">
56 <img class="file-img" src="../../assets/images/zip.png" />
57 </template>
58 <template v-else-if="file.name.substring(file.name.lastIndexOf('.') + 1).toLowerCase() == 'rar'">
59 <img class="file-img" src="../../assets/images/RAR.png" />
60 </template>
61 <template v-else-if="file.name.substring(file.name.lastIndexOf('.') + 1).toLowerCase() == 'pdf'">
62 <img class="file-img" src="../../assets/images/PDF.png" />
63 </template>
64 <template v-else-if="file.name.substring(file.name.lastIndexOf('.') + 1).toLowerCase() == 'png'">
65 <img class="file-img" src="../../assets/images/png.png" />
66 </template>
67 <template
68 v-else-if="file.name.substring(file.name.lastIndexOf('.') + 1).toLowerCase() == 'jpg' || file.name.substring(file.name.lastIndexOf('.') + 1).toLowerCase() == 'jpeg'">
69 <img class="file-img" src="../../assets/images/jpg.png" />
70 </template>
71 <div class="file-name"
72 :style="{ width: ['pdf', 'png', 'jpg', 'jpeg'].includes(file?.name?.substring(file.name.lastIndexOf('.') + 1).toLowerCase() ?? '') ? 'calc(100% - 300px)' : 'calc(100% - 290px)' }">
73 <ellipsis-tooltip :content="file.name" class-name="w100f"
74 :refName="'tooltipOver' + file.name"></ellipsis-tooltip>
75 </div>
76 <div class="upload-time" :style="{ right: 32 }" v-if="uploadTime"> {{ '上传时间:' + uploadTime }} </div>
77 <div :style="{ right: 0 }" class="file-preview" @click="onUploadFileDownload(file)">下载
78 </div>
79 </div>
80 </div>
81 </div>
82 </div>
83 </template>
84
85 <script lang="ts" setup name="downDeliveryFile">
86 import { onUploadFileDownload } from '@/api/modules/common';
87 import {
88 CircleCheckFilled
89 } from "@element-plus/icons-vue";
90 import {
91 getDeliveryFileDetail
92 } from '@/api/modules/dataTrustedSpace';
93
94 const { proxy } = getCurrentInstance() as any;
95
96 const route = useRoute()
97
98 const file = ref({
99 name: '',
100 url: ''
101 });
102
103 const uploadTime = ref('');
104
105 const loadingProcess = ref(true);
106
107 onActivated(() => {
108 loadingProcess.value = true;
109 getDeliveryFileDetail(route.query.guid).then((res: any) => {
110 if (res.code == proxy.$passCode) {
111 file.value = res.data?.dataDelivery?.[0] || {
112 name: '',
113 url: ''
114 };
115 uploadTime.value = res.data?.uploadTime || '';
116 setTimeout(() => {
117 loadingProcess.value = false;
118 }, 1000)
119 } else {
120 proxy.$ElMessage.error(res.msg);
121 }
122 })
123 })
124
125 onBeforeMount(() => {
126 })
127
128 </script>
129
130 <style lang="scss" scoped>
131 .content_main {
132 display: flex;
133 background-color: #f5f5f6;
134 padding: 24px 120px 0px;
135 height: 100%;
136 width: 100%;
137 flex-direction: column;
138 }
139
140 .loading-main {
141 height: 162px;
142 background: #F2F9FF;
143 border: 1px solid rgba(182, 213, 241, 1);
144 padding: 30px 56px;
145 width: 100%;
146
147 .title-desc {
148 font-size: 14px;
149 color: #212121;
150 line-height: 24px;
151 font-weight: 400;
152 margin-left: 22px;
153 }
154 }
155
156
157 .title-first {
158 font-size: 20px;
159 color: #212121;
160 line-height: 30px;
161 font-weight: 600;
162 }
163
164 .row-main {
165 display: flex;
166 }
167
168 .loading-img {
169 width: 28px;
170 height: 28px;
171 }
172
173 :deep(.el-icon.small) {
174 svg {
175 width: 20px;
176 height: 20px;
177 }
178 }
179
180 :deep(.el-icon.big) {
181 svg {
182 width: 32px;
183 height: 32px;
184 }
185 }
186
187 .circle-main {
188 width: 30px;
189 height: 24px;
190 display: flex;
191 justify-content: center;
192 align-items: center;
193 }
194
195 .circle {
196 border-radius: 100%;
197 border: 1px solid #b2b2b2;
198 width: 16px;
199 height: 16px;
200 }
201
202 .mt15 {
203 margin-top: 12px;
204 }
205
206 .file-down {
207 padding: 24px;
208 display: flex;
209 flex-direction: column;
210 border: 1px solid #d9d9d9;
211 background-color: #fff;
212 margin-top: 22px;
213
214 .file-row-main {
215 height: 48px;
216 background-color: #f5f5f5;
217 padding: 8px 24px;
218 margin-top: 12px;
219 justify-content: center;
220 display: flex;
221 }
222 }
223
224 .file-operate {
225 display: flex;
226 align-items: center;
227 position: relative;
228 width: 100%;
229
230 .file-img {
231 width: 30px;
232 height: 30px;
233 }
234
235 &:hover {
236 background-color: #f5f5f5;
237 }
238 }
239
240 .file-name {
241 margin-left: 4px;
242 margin-right: 4px;
243 width: calc(100% - 130px);
244 color: #212121;
245 font-size: 14px;
246 }
247
248 .upload-time {
249 color: #212121;
250 font-size: 14px;
251 }
252
253 .file-preview {
254 position: absolute;
255 cursor: pointer;
256 color: var(--el-color-primary);
257 margin-right: 8px;
258 font-size: 14px;
259 }
260 </style>
...\ No newline at end of file ...\ No newline at end of file
1 <template>
2 <div class="home-full-wrap" v-loading="fullscreenLoading">
3 <div v-show="releaseYears.length" class="home-dam-circule-main">
4 <div class="home-dam-main">
5 <div class="row-search-main">
6 <div class="row">
7 <span class="arg-name">交付年份</span>
8 <span class="value-per" v-for="(item) in [{ paramValue: 0, paramName: '全部' }].concat(releaseYears)"
9 :class="{ 'isActive': releaseYear == item.paramValue }" @click="releaseYear = item.paramValue">{{
10 item.paramName
11 }}</span>
12 </div>
13 <div class="row">
14 <span class="arg-name">产品分类</span>
15 <span class="value-per" v-for="(item) in [{ paramValue: '0', paramName: '全部' }].concat(damTypes)"
16 :class="{ 'isActive': damType == item.paramValue }" @click="damType = item.paramValue">{{ item.paramName
17 }}</span>
18 </div>
19 <div class="row">
20 <span class="arg-name">主题</span>
21 <span class="value-per" v-for="(item) in subjectDomainList"
22 :class="{ 'isActive': subjectDomainFirst == item.paramValue }"
23 @click="subjectDomainFirst = item.paramValue">{{
24 item.paramName }}</span>
25 </div>
26 <!-- <div class="btn-clear" @click="handleClickClear">
27 <el-icon :size="18" color="#b2b2b2">
28 <Delete />
29 </el-icon>
30 清除
31 </div> -->
32 </div>
33 <div style="min-height: 250px;" v-loading="listDataLoading">
34 <template v-for="(tenantName) in Object.keys(productListData)">
35 <div class="data-header-input">
36 <div>{{ '数据交付方:' + tenantName }}</div>
37 </div>
38 <div class="data-content">
39 <div :class="selectDataInfo.guid == item.guid ? 'selected card-content' : 'card-content'"
40 v-for="(item, index) in productListData[tenantName]" :key="item.guid"
41 @click="handleDataClick(item, index)">
42 <div class="header">
43 <img class="left-img"
44 :src="damTypes.find(d => d.paramValue == item['damType'])?.iconPath && JSON.parse(damTypes.find(d => d.paramValue == item['damType'])?.iconPath).url || defaultItemLogo"
45 alt="" />
46 <div class="right-main">
47 <div class="title1">{{ item['damName'] ?? '--' }}</div>
48 <div class="label-main">
49 <div class="dataLabel" v-if="item.subjectDomain">{{ ((subjectDomainFirst == '1' ?
50 item.subjectDomainName :
51 item.departmentName)) || '--' }}</div>
52 <div class="dataLabel ml-4px">{{damTypes.find(d => d.paramValue == item['damType'])?.paramName}}
53 </div>
54 <div class="dataCount" v-if="item.caseNumber != null">{{ changeNum(item.caseNumber, 0) + '例'
55 }}</div>
56 </div>
57 </div>
58 </div>
59 <div class="description"
60 style="height: 42px; display: -webkit-box; -webkit-line-clamp: 2; line-clamp: 2; -webkit-box-orient: vertical;margin-top: 16px;">
61 {{ item['propertyDescription'] ?? '--' }}</div>
62 <div class="description" style="margin-top: 12px;">
63 {{ '交付时间:' + (item['uploadTime'] ?? '--') }}
64 </div>
65 </div>
66 </div>
67 </template>
68 <div v-if="!listDataLoading && !Object.keys(productListData).length" class="full-noData"
69 style="margin: 24px;width: calc(100% - 48px);">
70 <img :src="getAssetsImages('no-data.png')" :style="{ width: '96px', height: '96px' }" />
71 <span>暂无数据</span>
72 </div>
73 </div>
74 </div>
75 <div class="dam-detail-right" v-loading="detailLoading">
76 <div v-show="!selectDataInfo.guid" class="full-noData">
77 <img :src="getAssetsImages('no-data.png')" :style="{ width: '96px', height: '96px' }" />
78 <span>暂无数据</span>
79 </div>
80 <div v-show="selectDataInfo.guid" class="dam-detail">
81 <div class="title-header">{{ selectDataInfo['damName'] }}</div>
82 <div class="description" style="margin-top: 12px;">{{ selectDataInfo['propertyDescription'] ?? '--' }}</div>
83 <div class="description" style="margin-top: 24px;">
84 {{ '交付时间:' + (selectDataInfo['uploadTime'] ?? '--') }}
85 </div>
86 <el-button class="down-btn" :icon="Download" @click="handleDownFile">立即下载</el-button>
87 </div>
88 <div class="header-row" v-show="certificateListInfo.length">
89 <div class="line-column"></div>
90 <span class="title">{{ '确权信息' }} </span>
91 </div>
92 <div class="info-content" v-for="item in certificateListInfo">
93 <div class="list_item">{{ '类别:' + item.documentCategoryName }}</div>
94 <div class="list_item">{{ '登记机构:' + item.tenantName }}</div>
95 <div class="list_item">{{ item.documentCategory == '1' ? ('登记日期:' + item.registerTime) : ('有效期:' +
96 item.createTime +
97 '至' + item.effectiveDate) }}</div>
98 <div class="list_item">{{ '登记名称:' + item.daName }}</div>
99 <div class="list_item">{{ '登记主体:' + item.issuingEntityName }}</div>
100 <div class="list_item"><span>{{ '证书:' }}</span>
101 <div class="file-operate" style="width: calc(100% - 42px);">
102 <template
103 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'">
104 <img class="file-img" src="../../assets/images/excel.png" />
105 </template>
106 <template
107 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'">
108 <img class="file-img" src="../../assets/images/word.png" />
109 </template>
110 <template
111 v-else-if="item.file.name.substring(item.file.name.lastIndexOf('.') + 1).toLowerCase() == 'zip'">
112 <img class="file-img" src="../../assets/images/zip.png" />
113 </template>
114 <template
115 v-else-if="item.file.name.substring(item.file.name.lastIndexOf('.') + 1).toLowerCase() == 'rar'">
116 <img class="file-img" src="../../assets/images/RAR.png" />
117 </template>
118 <template
119 v-else-if="item.file.name.substring(item.file.name.lastIndexOf('.') + 1).toLowerCase() == 'pdf'">
120 <img class="file-img" src="../../assets/images/PDF.png" />
121 </template>
122 <template
123 v-else-if="item.file.name.substring(item.file.name.lastIndexOf('.') + 1).toLowerCase() == 'png'">
124 <img class="file-img" src="../../assets/images/png.png" />
125 </template>
126 <template
127 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'">
128 <img class="file-img" src="../../assets/images/jpg.png" />
129 </template>
130 <div class="file-name"><ellipsis-tooltip :content="item.file.name ?? ''" class-name="w100f"
131 refName="tooltipOver"></ellipsis-tooltip></div>
132 <div :style="{ right: '0px' }"
133 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'"
134 class="file-preview" @click="onUploadFilePreview(item.file)">查看</div>
135 <!-- <div :style="{ right: '0px' }" class="file-preview"
136 @click="onUploadFileDownload(item.file)">下载</div> -->
137 </div>
138 </div>
139 </div>
140 <div class="header-row" v-show="complianceListInfo.length">
141 <div class="line-column"></div>
142 <span class="title">{{ '合规信息' }} </span>
143 </div>
144 <div class="info-content" v-for="item in complianceListInfo">
145 <div class="list_item">{{ '类别:' + item.type }}</div>
146 <div class="list_item">{{ '出具机构:' + item.institution }}</div>
147 <div class="list_item">{{ '出具日期:' + item.issueTime }}</div>
148 <div class="list_item"><span>{{ item.type + ':' }}</span>
149 <div class="file-operate">
150 <template
151 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'">
152 <img class="file-img" src="../../assets/images/excel.png" />
153 </template>
154 <template
155 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'">
156 <img class="file-img" src="../../assets/images/word.png" />
157 </template>
158 <template
159 v-else-if="item.file.name.substring(item.file.name.lastIndexOf('.') + 1).toLowerCase() == 'zip'">
160 <img class="file-img" src="../../assets/images/zip.png" />
161 </template>
162 <template
163 v-else-if="item.file.name.substring(item.file.name.lastIndexOf('.') + 1).toLowerCase() == 'rar'">
164 <img class="file-img" src="../../assets/images/RAR.png" />
165 </template>
166 <template
167 v-else-if="item.file.name.substring(item.file.name.lastIndexOf('.') + 1).toLowerCase() == 'pdf'">
168 <img class="file-img" src="../../assets/images/PDF.png" />
169 </template>
170 <template
171 v-else-if="item.file.name.substring(item.file.name.lastIndexOf('.') + 1).toLowerCase() == 'png'">
172 <img class="file-img" src="../../assets/images/png.png" />
173 </template>
174 <template
175 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'">
176 <img class="file-img" src="../../assets/images/jpg.png" />
177 </template>
178 <div class="file-name"><ellipsis-tooltip :content="item.file.name ?? ''" class-name="w100f"
179 refName="tooltipOver"></ellipsis-tooltip></div>
180 <div :style="{ right: '0px' }"
181 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'"
182 class="file-preview" @click="onUploadFilePreview(item.file)">查看</div>
183 <!-- <div :style="{ right: '0px' }" class="file-preview"
184 @click="onUploadFileDownload(item.file)">下载</div> -->
185 </div>
186 </div>
187 </div>
188 </div>
189 </div>
190 <div v-show="!releaseYears.length" class="full-noData">
191 <img :src="getAssetsImages('no-data.png')" :style="{ width: '96px', height: '96px' }" />
192 <span>暂无数据</span>
193 </div>
194 </div>
195 </template>
196
197 <script lang="ts" setup name="trustedSpaceIndex">
198 import { ref } from "vue";
199 import {
200 getParamsList,
201 getReleaseYears,
202 getSubjectDomainDataTree,
203 getReleaseListData,
204 getReleaseDataCertiDetail
205 } from '@/api/modules/dataTrustedSpace';
206 import {
207 Download
208 } from "@element-plus/icons-vue";
209 import {
210 getComplianceDetail
211 } from '@/api/modules/securityMenu';
212 import { cloneDeep } from "lodash-es";
213 import { changeNum } from "@/utils/common";
214 import useUserStore from '@/store/modules/user';
215 import { onUploadFilePreview, onUploadFileDownload } from '@/api/modules/common';
216 import router from "@/router";
217
218 const defaultItemLogo = getAssetsImages('dam-catalog-detail.png')
219 const userStore = useUserStore();
220 const { proxy } = getCurrentInstance() as any;
221
222 function getAssetsImages(name) {
223 return new URL(`../../assets/images/${name}`, import.meta.url).href;
224 }
225
226 const fullscreenLoading = ref(false);
227
228 const detailLoading = ref(false);
229
230 const releaseYears: any = ref([]);
231
232 const damTypes: any = ref([]);
233
234 const damType = ref('0');
235
236 const releaseYear = ref(0);
237
238 const subjectDomainList: any = ref([]);
239 /** 记录主题第一级的选中值 */
240 const subjectDomainFirst = ref('2');
241
242 const pageInfo = ref({
243 size: -1,
244 curr: 1,
245 limit: 12,
246 rows: 0,
247 type: "normal",
248 name: "",
249 pageSizeShow: false,
250 });
251
252 /** 确权信息数据 */
253 const certificateListInfo: any = ref([]);
254
255 /** 合规信息数据 */
256 const complianceListInfo: any = ref([]);
257
258 const selectDataInfo: any = ref({});
259
260 const productListData: any = ref({});
261 const listDataLoading = ref(false);
262
263 /** 当前正在获取列表数据的参数 */
264 const queryCache: any = ref(null);
265
266 const getDataPromise = ref();
267 const getTableData = () => {
268 listDataLoading.value = true;
269 let v = {
270 releaseYear: releaseYear.value == 0 ? null : releaseYear.value,
271 damType: damType.value == '0' ? null : damType.value,
272 subjectDomain: subjectDomainFirst.value
273 };
274 if (queryCache.value?.damType == v.damType && queryCache.value?.subjectDomain == v.subjectDomain && queryCache.value?.releaseYear === v.releaseYear) {
275 return Promise.resolve();
276 }
277 let lastGetDataPromise: any = null;
278 queryCache.value = cloneDeep(v);
279 return getDataPromise.value = lastGetDataPromise = getReleaseListData({
280 pageSize: -1,
281 pageIndex: pageInfo.value.curr,
282 damType: queryCache.value.damType,
283 subjectDomain: queryCache.value.subjectDomain ? [queryCache.value.subjectDomain] : null,
284 releaseYear: queryCache.value.releaseYear
285 }).then((res: any) => {
286 if (getDataPromise.value != lastGetDataPromise) {
287 return;
288 }
289 getDataPromise.value = null;
290 queryCache.value = null;
291 listDataLoading.value = false;
292 fullscreenLoading.value = false;
293 if (res === undefined) {
294 return;
295 }
296 if (res.code == proxy.$passCode) {
297 const data = res.data || {}
298 productListData.value = data;
299 // productListData.value['北京'] = data['北京传世博润科技有限公司'];
300 let keys = Object.keys(productListData.value);
301 if (keys.length) {
302 selectDataInfo.value = productListData.value[keys[0]]?.[0] || {};
303 } else {
304 selectDataInfo.value = {};
305 }
306 } else {
307 proxy.$ElMessage.error(res.msg);
308 }
309 });
310 }
311
312 const showDetailItem: any = ref(null);
313
314 const oldScrollTop = ref(0);
315
316 // 回到顶部
317 function toTop(className: string) {
318 requestAnimationFrame(() => {
319 let dom = document.getElementsByClassName(className)[0]
320 dom.scrollIntoView({
321 block: 'start',
322 behavior: 'instant',
323 })
324 })
325 }
326 const handleDataClick = (item, index) => {
327 selectDataInfo.value = item;
328 }
329
330 function clearPageInfo() {
331 pageInfo.value.curr = 1;
332 }
333
334 watch(() => damType.value, () => {
335 clearPageInfo()
336 getTableData();
337 })
338
339 watch(() => releaseYear.value, () => {
340 clearPageInfo()
341 getTableData();
342 })
343
344 watch(() => selectDataInfo.value.damGuid, (val) => {
345 if (!val) {
346 complianceListInfo.value = [];
347 certificateListInfo.value = [];
348 return;
349 }
350 let ps: any = [];
351 detailLoading.value = true;
352 ps.push(getReleaseDataCertiDetail(val).then((res: any) => {
353 if (res.code == proxy.$passCode) {
354 certificateListInfo.value = res.data?.map(d => {
355 d.file = d.documentFile?.[0];
356 return d;
357 }) || [];
358 } else {
359 detailLoading.value = false;
360 proxy.$ElMessage.error(res.msg);
361 }
362 }))
363 ps.push(getComplianceDetail(val).then((res: any) => {
364 if (res.code == proxy.$passCode) {
365 let data = res.data || {};
366 complianceListInfo.value = [];
367 if (data.complianceEvaluateReport?.length) {
368 complianceListInfo.value.push({
369 type: '合规评估报告',
370 file: data.complianceEvaluateReport[0],
371 institution: data.reportIssuingInstitution,
372 issueTime: data.reportIssuingTime
373 });
374 }
375 if (data.complianceLegalOpinion?.length) {
376 complianceListInfo.value.push({
377 type: '合规法律意见书',
378 file: data.complianceLegalOpinion[0],
379 institution: data.opinionIssuingInstitution,
380 issueTime: data.opinionIssuingTime
381 });
382 }
383 if (data.entryComplianceProgram?.length) {
384 complianceListInfo.value.push({
385 type: '入表合规方案',
386 file: data.entryComplianceProgram[0],
387 institution: data.planIssuingInstitution,
388 issueTime: data.planIssuingTime
389 });
390 }
391 } else {
392 detailLoading.value = false;
393 proxy.$ElMessage.error(res.msg);
394 }
395 }))
396 Promise.all(ps).then(() => {
397 detailLoading.value = false;
398 })
399 }, {
400 immediate: true,
401 deep: true
402 })
403
404 onBeforeMount(() => {
405 fullscreenLoading.value = true;
406 let ps: any = [];
407 ps.push(getReleaseYears().then((res: any) => {
408 if (res.code == proxy.$passCode) {
409 releaseYears.value = res.data?.map(d => {
410 return {
411 paramValue: d,
412 paramName: d
413 }
414 }) || [];
415 } else {
416 fullscreenLoading.value = false;
417 proxy.$ElMessage.error(res.msg);
418 }
419 }));
420 ps.push(getParamsList({ dictType: '资产类型' }).then((resp: any) => {
421 if (resp.code == '00000') {
422 damTypes.value = resp.data || [];
423 damTypes.value.forEach(item => {
424 item.paramValue = item.value;
425 item.paramName = item.label;
426 })
427 } else {
428 fullscreenLoading.value = false;
429 proxy.$ElMessage.error(resp.msg);
430 }
431 }));
432 ps.push(getSubjectDomainDataTree().then((res: any) => {
433 if (res.code == '00000') {
434 subjectDomainList.value = res.data || [];
435 subjectDomainFirst.value = subjectDomainList?.[0]?.paramValue || '2';
436 } else {
437 fullscreenLoading.value = false;
438 proxy.$ElMessage.error(res.msg);
439 }
440 }));
441 Promise.all(ps).then((res) => {
442 getTableData().then(() => {
443 fullscreenLoading.value = false;
444 })
445 })
446 })
447
448 onMounted(() => {
449 })
450
451 const handleDownFile = () => {
452 router.push({
453 name: 'downDeliveryFile',
454 query: {
455 damName: selectDataInfo.value.damName,
456 guid: selectDataInfo.value.guid
457 }
458 });
459 }
460
461 </script>
462
463
464 <style lang="scss" scoped>
465 .home-full-wrap {
466 height: 100%;
467 width: 100%;
468 overflow-y: auto;
469 overflow-x: hidden;
470 background-color: #f5f5f6;
471 }
472
473 .home-dam-circule-main {
474 // height: 100%;
475 display: flex;
476 justify-content: space-between;
477
478 .home-dam-main {
479 background-color: #fff;
480 width: calc(100% - 456px);
481 min-height: 600px;
482 }
483 }
484
485 .row-search-main {
486 position: relative;
487 height: auto;
488 margin: 20px 24px;
489 background-color: #fff;
490
491 .arg-name {
492 display: inline-block;
493 width: 84px;
494 text-align: left;
495 flex-shrink: 0;
496 color: #666666;
497 }
498
499 .row {
500 margin-bottom: 18px;
501
502 &.check {
503 display: flex;
504 align-items: flex-start;
505 margin-bottom: 12px;
506 }
507 }
508
509 .value-per {
510 margin-right: 12px;
511 cursor: pointer;
512 font-size: 14px;
513 padding: 4px 8px;
514 line-height: 21px;
515 color: #212121;
516
517 &.isActive {
518 background: #ebf6f7;
519 border: 1px solid #4fa1a4;
520 border-radius: 2px;
521 color: #4fa1a4;
522 }
523 }
524
525 .checkbox-group {
526 display: inline-block;
527 }
528
529 .checkbox-group-wrap {
530 background: #FAFAFA;
531 border: 1px solid #eeeeee;
532 padding: 8px 12px;
533 margin-top: 4px;
534 }
535
536 :deep(.el-checkbox-group) {
537
538 .el-checkbox__label {
539 color: #212121;
540 }
541
542 .el-checkbox__input.is-checked .el-checkbox__inner {
543 background-color: #4fa1a4;
544 border-color: #4fa1a4;
545 }
546
547 .el-checkbox__inner:hover {
548 border-color: #4fa1a4;
549 }
550
551 .el-checkbox input:focus-visible+.el-checkbox__inner {
552 outline: none;
553 }
554 }
555 }
556
557 .btn-clear {
558 position: absolute;
559 right: 40px;
560 top: 24px;
561 display: flex;
562 font-size: 14px;
563 color: #666666;
564 letter-spacing: 0;
565 line-height: 21px;
566 align-items: center;
567 cursor: pointer;
568
569 &:hover {
570 .el-icon {
571 --color: #FB2323 !important;
572 }
573 }
574
575 :deep(.el-icon) {
576 margin-right: 4px;
577
578 svg {
579 width: 1em;
580 height: 1em;
581 }
582 }
583 }
584
585 .data-header-input {
586 background: #fff;
587 padding: 0px 24px 20px;
588 display: flex;
589 align-items: center;
590 justify-content: space-between;
591 font-size: 16px;
592 color: #212121;
593 line-height: 24px;
594 font-weight: 600;
595
596 .el-input {
597 width: 230px;
598 }
599 }
600
601 .data-content {
602 min-height: 200px;
603 display: flex;
604 flex-wrap: wrap;
605 align-content: flex-start;
606 row-gap: 24px;
607 column-gap: 24px;
608 background: #fff;
609 padding: 0px 24px 24px;
610
611 .card-noData {
612 height: 240px;
613 width: 100%;
614 background: #fafafa;
615 display: flex;
616 flex-direction: column;
617 justify-content: center;
618 align-items: center;
619 color: #909399;
620 font-size: 14px;
621 }
622
623 .card-content {
624 width: calc(50% - 12px);
625 min-width: 200px;
626 padding: 20px 24px;
627 height: auto;
628 background: #fff;
629 border: 1px solid var(--el-border-color-regular);
630 cursor: pointer;
631
632 &:hover {
633 border: 1px solid var(--el-color-primary);
634 }
635
636 &.selected {
637 background: #F6FEFF;
638 border: 1px solid var(--el-color-primary);
639 }
640
641 .header {
642 height: 68px;
643 display: inline-flex;
644 width: 100%;
645 border-bottom: 1px solid #D9D9D9;
646
647 .left-img {
648 width: 48px;
649 height: 48px;
650 background-size: 100% 100%;
651 background-position: center right;
652 background-repeat: no-repeat;
653 }
654
655 .right-main {
656 width: calc(100% - 60px);
657 position: relative;
658 margin-left: 12px;
659
660 .title1 {
661 font-size: 16px;
662 color: #212121;
663 letter-spacing: 0;
664 line-height: 24px;
665 font-weight: 600;
666 white-space: nowrap;
667 overflow: hidden;
668 text-overflow: ellipsis;
669 }
670
671 .label-main {
672 display: flex;
673 margin: 8px 0px;
674 position: relative;
675 }
676
677 .dataLabel {
678 background: #FFFFFF;
679 border: 1px solid rgba(217, 217, 217, 1);
680 border-radius: 2px;
681 font-size: 12px;
682 // color: #0E5FD8;
683 letter-spacing: 0;
684 text-align: center;
685 line-height: 18px;
686 font-weight: 400;
687 padding: 0 8px;
688 }
689
690 .dataCount {
691 color: #212121;
692 position: absolute;
693 right: 0;
694 line-height: 21px;
695 }
696 }
697 }
698
699 .description {
700 font-size: 14px;
701 color: #999999;
702 line-height: 21px;
703 overflow: hidden;
704 }
705 }
706 }
707
708 .dam-detail-right {
709 width: 450px;
710 background-color: #fff;
711
712 .dam-detail {
713 padding: 24px;
714
715 .title-header {
716 font-size: 24px;
717 color: #212121;
718 line-height: 36px;
719 font-weight: 600;
720 }
721
722 .description {
723 font-size: 14px;
724 color: #666;
725 line-height: 21px;
726 }
727
728 .down-btn {
729 margin-top: 24px;
730 background-image: linear-gradient(116deg, #0C48F5 0%, #23D6D1 95%);
731 border-radius: 2px;
732 line-height: 32px;
733 font-size: 14px;
734 color: #FFFFFF;
735 padding: 4px 8px;
736 }
737 }
738
739 .header-row {
740 height: 44px;
741 display: flex;
742 align-items: center;
743 background: #F2F9FF;
744 margin: 0px 16px;
745 width: calc(100% - 32px);
746
747 .line-column {
748 margin-left: 8px;
749 height: 24px;
750 width: 4px;
751 background: #276FF5;
752 }
753
754 .title {
755 font-size: 14px;
756 color: #212121;
757 line-height: 21px;
758 font-weight: 600;
759 margin-left: 12px;
760 }
761 }
762
763 .info-content {
764 padding: 0px 24px;
765 margin-bottom: 20px;
766 }
767 }
768
769 .full-noData {
770 height: 100%;
771 width: 100%;
772 background: #fafafa;
773 display: flex;
774 flex-direction: column;
775 justify-content: center;
776 align-items: center;
777 color: #909399;
778 font-size: 14px;
779 min-height: 250px;
780 }
781
782 .ml-4px {
783 margin-left: 4px;
784 }
785
786 .list_item {
787 line-height: 21px;
788 padding-top: 12px;
789 display: flex;
790 }
791
792 .file-operate {
793 display: flex;
794 align-items: center;
795 position: relative;
796 width: calc(100% - 114px);
797
798 .file-img {
799 width: 24px;
800 height: 24px;
801 }
802
803 &:hover {
804 background-color: #f5f5f5;
805 }
806
807 .file-name {
808 color: var(--el-color-regular);
809 margin-left: 4px;
810 width: calc(100% - 60px);
811 }
812
813 .file-preview {
814 position: absolute;
815 cursor: pointer;
816 color: var(--el-color-primary);
817 // margin-right: 8px;
818 }
819 }
820 </style>
...\ No newline at end of file ...\ No newline at end of file
...@@ -114,7 +114,11 @@ const tableInfo = ref({ ...@@ -114,7 +114,11 @@ const tableInfo = ref({
114 label: "详情", value: "detail", click: (scope) => { 114 label: "详情", value: "detail", click: (scope) => {
115 tableTempValue.value = scope.row; 115 tableTempValue.value = scope.row;
116 formItems.value.forEach((item) => { 116 formItems.value.forEach((item) => {
117 if (['complianceEvaluateReport', 'complianceLegalOpinion', 'entryComplianceProgram'].includes(item.field)) {
117 item.default = scope.row[item.field] || []; 118 item.default = scope.row[item.field] || [];
119 } else {
120 item.default = scope.row[item.field] || '';
121 }
118 }); 122 });
119 dialogInfo.value.visible = true; 123 dialogInfo.value.visible = true;
120 }, 124 },
...@@ -126,7 +130,11 @@ const tableInfo = ref({ ...@@ -126,7 +130,11 @@ const tableInfo = ref({
126 label: "上传", value: "upload", click: (scope) => { 130 label: "上传", value: "upload", click: (scope) => {
127 tableTempValue.value = scope.row; 131 tableTempValue.value = scope.row;
128 formItems.value.forEach((item) => { 132 formItems.value.forEach((item) => {
133 if (['complianceEvaluateReport', 'complianceLegalOpinion', 'entryComplianceProgram'].includes(item.field)) {
129 item.default = scope.row[item.field] || []; 134 item.default = scope.row[item.field] || [];
135 } else {
136 item.default = scope.row[item.field] || '';
137 }
130 }); 138 });
131 dialogInfo.value.visible = true; 139 dialogInfo.value.visible = true;
132 }, 140 },
...@@ -168,6 +176,25 @@ const formItems = ref([ ...@@ -168,6 +176,25 @@ const formItems = ref([
168 limit: 1, 176 limit: 1,
169 }, 177 },
170 { 178 {
179 label: '出具机构',
180 type: 'input',
181 placeholder: '请输入',
182 field: 'reportIssuingInstitution',
183 default: '',
184 required: false,
185 visible: true
186 },
187 {
188 label: '出具日期',
189 type: 'date',
190 placeholder: '请选择',
191 field: 'reportIssuingTime',
192 default: "",
193 unlink: true,
194 clearable: true,
195 required: false
196 },
197 {
171 label: '合规法律意见书', 198 label: '合规法律意见书',
172 tip: '支持格式:pdf,单个文件不能超过10MB ', 199 tip: '支持格式:pdf,单个文件不能超过10MB ',
173 type: 'upload-file', 200 type: 'upload-file',
...@@ -181,6 +208,25 @@ const formItems = ref([ ...@@ -181,6 +208,25 @@ const formItems = ref([
181 limit: 1, 208 limit: 1,
182 }, 209 },
183 { 210 {
211 label: '出具机构',
212 type: 'input',
213 placeholder: '请输入',
214 field: 'opinionIssuingInstitution',
215 default: '',
216 required: false,
217 visible: true
218 },
219 {
220 label: '出具日期',
221 type: 'date',
222 placeholder: '请选择',
223 field: 'opinionIssuingTime',
224 default: "",
225 unlink: true,
226 clearable: true,
227 required: false
228 },
229 {
184 label: '入表合规方案', 230 label: '入表合规方案',
185 tip: '支持格式:pdf,单个文件不能超过10MB ', 231 tip: '支持格式:pdf,单个文件不能超过10MB ',
186 type: 'upload-file', 232 type: 'upload-file',
...@@ -193,6 +239,25 @@ const formItems = ref([ ...@@ -193,6 +239,25 @@ const formItems = ref([
193 default: [], 239 default: [],
194 limit: 1, 240 limit: 1,
195 }, 241 },
242 {
243 label: '出具机构',
244 type: 'input',
245 placeholder: '请输入',
246 field: 'planIssuingInstitution',
247 default: '',
248 required: false,
249 visible: true
250 },
251 {
252 label: '出具日期',
253 type: 'date',
254 placeholder: '请选择',
255 field: 'planIssuingTime',
256 default: "",
257 unlink: true,
258 clearable: true,
259 required: false
260 },
196 ]); 261 ]);
197 262
198 const formRules = ref({ 263 const formRules = ref({
...@@ -230,7 +295,6 @@ const tableTempValue = ref<any>(''); ...@@ -230,7 +295,6 @@ const tableTempValue = ref<any>('');
230 const dialogBtnClick = (btn, info) => { 295 const dialogBtnClick = (btn, info) => {
231 console.log('currTableData', info); 296 console.log('currTableData', info);
232 if (btn.value == 'submit') { 297 if (btn.value == 'submit') {
233 tableInfo.value.loading = true;
234 let params: any = { 298 let params: any = {
235 damGuid: tableTempValue.value.guid, 299 damGuid: tableTempValue.value.guid,
236 complianceEvaluateReport: info.complianceEvaluateReport?.map(file => { 300 complianceEvaluateReport: info.complianceEvaluateReport?.map(file => {
...@@ -239,19 +303,56 @@ const dialogBtnClick = (btn, info) => { ...@@ -239,19 +303,56 @@ const dialogBtnClick = (btn, info) => {
239 url: file.url 303 url: file.url
240 } 304 }
241 }) || [], 305 }) || [],
306 reportIssuingInstitution: info.reportIssuingInstitution,
307 reportIssuingTime: info.reportIssuingTime,
242 complianceLegalOpinion: info.complianceLegalOpinion?.map(file => { 308 complianceLegalOpinion: info.complianceLegalOpinion?.map(file => {
243 return { 309 return {
244 name: file.name, 310 name: file.name,
245 url: file.url 311 url: file.url
246 } 312 }
247 }) || [], 313 }) || [],
314 opinionIssuingInstitution: info.opinionIssuingInstitution,
315 opinionIssuingTime: info.opinionIssuingTime,
248 entryComplianceProgram: info.entryComplianceProgram?.map(file => { 316 entryComplianceProgram: info.entryComplianceProgram?.map(file => {
249 return { 317 return {
250 name: file.name, 318 name: file.name,
251 url: file.url 319 url: file.url
252 } 320 }
253 }) || [], 321 }) || [],
322 planIssuingInstitution: info.planIssuingInstitution,
323 planIssuingTime: info.planIssuingTime
254 } 324 }
325 if (params.complianceEvaluateReport?.length) {
326 if (!params.reportIssuingInstitution) {
327 ElMessage.error('请输入合规评估报告的出具机构');
328 return;
329 }
330 if (!params.reportIssuingTime) {
331 ElMessage.error('请输入合规评估报告的出具日期');
332 return;
333 }
334 }
335 if (params.complianceLegalOpinion?.length) {
336 if (!params.opinionIssuingInstitution) {
337 ElMessage.error('请输入合规法律意见书的出具机构');
338 return;
339 }
340 if (!params.opinionIssuingTime) {
341 ElMessage.error('请输入合规法律意见书的出具日期');
342 return;
343 }
344 }
345 if (params.entryComplianceProgram?.length) {
346 if (!params.planIssuingInstitution) {
347 ElMessage.error('请输入入表合规方案的出具机构');
348 return;
349 }
350 if (!params.planIssuingTime) {
351 ElMessage.error('请输入入表合规方案的出具日期');
352 return;
353 }
354 }
355 tableInfo.value.loading = true;
255 updateComplianceInfo(params).then((res: any) => { 356 updateComplianceInfo(params).then((res: any) => {
256 tableInfo.value.loading = false; 357 tableInfo.value.loading = false;
257 if (res?.code == proxy.$passCode) { 358 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!