Commit 20133f32 by liuyong

修改bug

2 parents 4c32f942 dedd7eee
Showing with 3841 additions and 376 deletions
/* guo
架构督查 api
*/
import { EADC_ARRCHITECTURE, EADC_KNOWLEDGE_POOL } from '@/config/micromodule'
// 收集资料配置 查询
export const collectDataSearch = EADC_ARRCHITECTURE + '/Collect/CollectInformation/'
// 弹框内表格查询 prjCode: 不传 查全部 选择传,拼接的id
export const collectDataConfiguration = EADC_ARRCHITECTURE + '/Collect/information/'
// 督查材料收集 查询
export const supervisionData = EADC_ARRCHITECTURE + '/Collect/supervisionData/'
// 架构督查分析 查询 tab1 tab2
export const architectureInspectionAnalysis = EADC_ARRCHITECTURE + '/supervIndex/selectSupervIndex'
export const selectSupervAnalysis = EADC_ARRCHITECTURE + '/supervAnalysis/selectSupervAnalysis'
// 详情 tab1 tab2
export const architectureDetail = EADC_ARRCHITECTURE + '/supervIndex/selectSupervIndex'
// 政策 查询 添加查询
export const artPolicyExamine = EADC_ARRCHITECTURE + '/klTechPolicyCheck/'
export const artPolicyExamineAdd = EADC_KNOWLEDGE_POOL + '/kl-tech-policy/'
// 审查 查询
export const examineSearch = EADC_ARRCHITECTURE + '/prj-info/'
......@@ -661,6 +661,14 @@ export function getQWordTable(params) {
export function getQWordPic_(params) {
return post(EADC_ARRCHITECTURE + '/prel-des-inspecte/qWordPic', params)
}
// 概设材料审查-查询概设材料解析内容
export function analysisQryContent(params) {
return post(EADC_ARRCHITECTURE + '/ads-parser-content/qryContent', params)
}
// 概设材料审查-概设材料解析
export function analysisConceptual(params) {
return post(EADC_ARRCHITECTURE + '/ads-parser-content/adsParser', params)
}
// 获取评审片段img
export function getQWordPic(params) {
return post(EADC_ARRCHITECTURE + '/prel-des-rvw/qWordPic', params)
......@@ -728,10 +736,54 @@ export function editFeedback(params) {
return post(EADC_ARRCHITECTURE + '/prj-need-file/upd', params)
}
// 架构督查-督查通报管理
// 架构督查-督查通报管理更新
export function updReportManage(params) {
return post(EADC_ARRCHITECTURE + '/reportManage/upd', params)
}
// 架构督查-督查通报管理删除
export function delReportManage(params) {
return post(EADC_ARRCHITECTURE + '/reportManage/del', params)
}
// 架构督查-督查问题整改-更新
export function updRectifyReform(params) {
return post(EADC_ARRCHITECTURE + '/rectifyReform/fb', params)
}
// 概设评审基础管理 --新增事项
export function addMatterInfo(params) {
return post(EADC_ARRCHITECTURE + '/int-info/ad', params)
}
// 概设评审基础管理 --修改事项
export function updMatterInfo(params) {
return post(EADC_ARRCHITECTURE + '/int-info/upd', params)
}
// 概设评审基础管理 --新增组织机构
export function addOrgInfo(params) {
return post(EADC_ARRCHITECTURE + '/org-info/ad', params)
}
// 概设评审基础管理 --修改组织机构
export function updOrgInfo(params) {
return post(EADC_ARRCHITECTURE + '/org-info/upd', params)
}
// 架构遵从检查-保存评审意见
export function saveArchitectureFollows(params) {
return post(EADC_ARRCHITECTURE + '/architectureFollows/ad', params)
}
// 架构遵从检查-查询评审意见
export function viewArchitectureFollows(params) {
return post(EADC_ARRCHITECTURE + '/architectureFollows/qReview', params)
}
// 架构遵从检查-查询对应架构视图
export function qViewArchitectureFollows(params) {
return post(EADC_ARRCHITECTURE + '/architectureFollows/qView', params)
}
// 项目信息管理-查看项目详情
export function getPrjInfoDetail(params) {
return post(EADC_ARRCHITECTURE + '/prj-info/qryPrj', params)
}
// 系统信息管理-查看系统详情
export function getSystemInfoDetail(params) {
return post(EADC_ARRCHITECTURE + '/app-info/dApp', params)
}
export function postRequest(url, params) {
return post(EADC_ARRCHITECTURE + url, params)
}
......@@ -30,5 +30,10 @@ export const querySupervisionNotifyManagement =
export const querySupervisionProblem =
EADC_ARRCHITECTURE + '/rectifyReform/selectRectifyReform'
// 概设评审基础管理
// 概设评审基础管理-集成管理
export const queryConceptualBaseManagement = EADC_ARRCHITECTURE + '/int-info/'
// 概设评审基础管理-组织机构管理
export const queryConceptualBaseOrg = EADC_ARRCHITECTURE + '/org-info/'
// 架构遵从检查列表
export const queryArchitectureFollowExamine =
EADC_ARRCHITECTURE + '/architectureFollows/'
......@@ -4,7 +4,7 @@
* @Autor: pan
* @Date: 2024-03-12 14:55:59
* @LastEditors: pan
* @LastEditTime: 2024-03-26 15:54:50
* @LastEditTime: 2024-03-27 09:47:20
-->
<!-- /**
* 搜索栏公共组件
......@@ -158,6 +158,9 @@ export default {
flex-shrink: 0;
color: #000;
}
/deep/ .el-form-item__content {
text-align: left;
}
// el-input宽度
/deep/ .form-item {
.el-input,
......
......@@ -4,7 +4,7 @@
* @Autor: pan
* @Date: 2024-03-12 14:01:57
* @LastEditors: pan
* @LastEditTime: 2024-03-15 14:24:23
* @LastEditTime: 2024-03-29 20:23:32
-->
<template>
<div class="list-page">
......@@ -52,5 +52,8 @@ export default {
flex: 1;
min-height: 180px;
}
.formWrap {
border-bottom: 1px solid #e2e2e2;
}
}
</style>
......@@ -4,7 +4,7 @@
* @Autor: pan
* @Date: 2024-03-12 14:55:59
* @LastEditors: pan
* @LastEditTime: 2024-03-18 09:56:15
* @LastEditTime: 2024-03-28 17:01:26
-->
<!-- /**
* 搜索栏公共组件
......@@ -47,6 +47,7 @@
class="btn-search"
icon="el-icon-search"
@click="onSearch"
v-preventReClick
>查询</el-button
>
<el-button
......
......@@ -4,7 +4,7 @@
* @Autor: pan
* @Date: 2024-03-11 14:53:40
* @LastEditors: pan
* @LastEditTime: 2024-03-22 17:17:18
* @LastEditTime: 2024-03-27 17:22:37
-->
<!-- 示例
columns: [{ label: '头像', prop: 'avatar', align: 'center', __slotName: 'avatar',callback: (row, title) => {
......@@ -97,7 +97,12 @@
</template>
<!-- 字典值匹配 如后端给state: 0 页面要渲染成已停用-->
<template v-else-if="item.collectionType" #default="scope">
<span> {{ handleToText(item, scope.row[item.prop]) }}</span>
<span
:class="item.class ? item.class(scope.row) : null"
@click="item?.callback(scope.row)"
>
{{ handleToText(item, scope.row[item.prop]) }}</span
>
</template>
</el-table-column>
</template>
......
......@@ -161,11 +161,12 @@ export default {
},
mounted() {
let url = this.documentServerUrl
console.log('url', url)
if (!url.endsWith('/')) {
url += '/'
}
const docApiUrl = `${url}web-apps/apps/api/documents/api.js`
console.log('docApiUrl', docApiUrl)
loadScript(docApiUrl, 'onlyoffice-api-script')
.then(() => this.onLoad())
.catch((err) => console.error(err))
......
// onlyoffice 文档url
export const documentServerUrl = 'http://192.168.0.120/'
export const documentServerUrl2 = 'http://192.168.0.120:18050/'
export default function initDirective(vue) {
/** 节流 */
vue.directive('throttle', {
inserted: function (el, binding) {
let stop = false;
let stop = false
el.addEventListener(binding.arg, (e) => {
if (stop) return;
if (stop) return
binding.value(e)
stop = true;
stop = true
setTimeout(() => {
stop = false
}, 500)
})
}
},
})
/** 防抖 */
vue.directive('debounce', {
inserted: function (el, binding) {
let stopTime;
let stopTime
el.addEventListener(binding.arg, (e) => {
clearTimeout(stopTime);
clearTimeout(stopTime)
stopTime = setTimeout(binding.value, 1000, e)
})
}
},
})
vue.directive('no-backslash', {
......@@ -31,21 +30,36 @@ export default function initDirective(vue) {
// 绑定 @input 监听方法
el.addEventListener('input', function (event) {
// 获取输入的值
const value = event.target.value;
const value = event.target.value
// 使用正则表达式检测特殊字(根据需要匹配相应限制字符)
const regex = /(?:')|(?:-- )|(\/\*(?:.|[\n\r])*?\*\/)|(\b(select|update|and|or|delete|insert|truncate|char|into|substr|ascii|declare|exec|count|master|into|drop|execute)\b)/i;
// const regex =
// /(?:')|(?:-- )|(\/\*(?:.|[\n\r])*?\*\/)|(\b(select|update|and|or|delete|insert|truncate|char|into|substr|ascii|declare|exec|count|master|into|drop|execute)\b)/i
const regex = /[<>?!]|(select\s[\w|*]+\sfrom)/i
// 如果输入值包含特殊字符,则替换为空格
if (regex.test(value)) {
// 使用 replace 方法替换特殊字为空格
const newValue = value.replace(regex, ' ');
const newValue = value.replace(regex, ' ')
// 将新值设置回输入框
event.target.value = newValue;
event.target.value = newValue
// 触发 @input 事件,使其更新组件中的数据
vnode.componentInstance.$emit('input', newValue);
vnode.componentInstance.$emit('input', newValue)
}
});
})
},
});
}
})
vue.directive('preventReClick', {
inserted: function (el, binding) {
el.addEventListener('click', () => {
if (!el.disabled) {
el.disabled = true
setTimeout(() => {
el.disabled = false
}, binding.value || 1500)
}
})
},
})
}
......@@ -8,10 +8,12 @@ import 'element-ui/lib/theme-chalk/index.css'
import './styles/element-variables.scss'
import initDirective from './directive'
import { postRequest } from '@/api/index'
initDirective(Vue)
Vue.prototype.$echarts = echarts
Vue.config.productionTip = false
Vue.prototype.$postRequest = postRequest
Vue.use(ElementUI)
Date.prototype.format = function (fmt) {
......
......@@ -69,6 +69,9 @@ const routes = [
{
path: '/main/metaModelListDetails', //元模型管理详情
name: 'metaModelListDetails',
meta: {
showGoBack: true,
},
component: () => import('@/views/meta-model-list/details.vue'),
},
{
......@@ -127,6 +130,9 @@ const routes = [
{
path: '/main/archiViewManageDetails', //架构视图管理详情
name: 'archiViewManageDetails',
meta: {
showGoBack: true,
},
component: () => import('@/views/archi-view-manage/details.vue'),
},
{
......@@ -182,11 +188,17 @@ const routes = [
{
path: '/main/systemArchiViewDesignDetails', //系统架构视图设计详情
name: 'systemArchiViewDesignDetails',
meta: {
showGoBack: true,
},
component: () => import('@/views/systemArchiViewDesign/details.vue'),
},
{
path: '/main/documentEdit', //文档编辑
name: 'documentEdit',
meta: {
showGoBack: true,
},
component: () => import('@/views/documentEdit/index.vue'),
},
{
......@@ -197,6 +209,9 @@ const routes = [
{
path: '/main/summaryArchiDesignDetails', //概设阶段视图设计详情
name: 'summaryArchiDesignDetails',
meta: {
showGoBack: true,
},
component: () => import('@/views/summaryArchiDesign/details.vue'),
},
{
......@@ -207,6 +222,9 @@ const routes = [
{
path: '/main/otherArchiDesignDetails', //其他视图设计详情
name: 'otherArchiDesignDetails',
meta: {
showGoBack: true,
},
component: () => import('@/views/otherArchiDesign/details.vue'),
},
{
......@@ -217,6 +235,9 @@ const routes = [
{
path: '/main/reviewSituationDetails', //评审情况(概要设计),详情
name: 'reviewSituationDetails',
meta: {
showGoBack: true,
},
component: () => import('@/views/reviewSituation/details.vue'),
},
{
......@@ -227,6 +248,9 @@ const routes = [
{
path: '/main/reviewArchiFollowCheckDetails', //概设架构遵从审查,详情
name: 'reviewArchiFollowCheckDetails',
meta: {
showGoBack: true,
},
component: () => import('@/views/reviewArchiFollowCheck/details.vue'),
},
{
......@@ -237,6 +261,9 @@ const routes = [
{
path: '/main/reviewArchiPoliticeCheckDetails', //概设架构政策审查,详情
name: 'reviewArchiPoliticeCheckDetails',
meta: {
showGoBack: true,
},
component: () => import('@/views/reviewArchiPoliticeCheck/details.vue'),
},
{
......@@ -252,6 +279,9 @@ const routes = [
{
path: '/main/conceptualExamine', // 概设材料审查页面
name: 'conceptualExamine',
meta: {
showGoBack: true,
},
component: () => import('@/views/conceptualReview/Examine.vue'),
},
{
......@@ -272,6 +302,9 @@ const routes = [
{
path: '/main/onlineReview', // 评审意见编制- 在线辅助审核
name: 'onlineReview',
meta: {
showGoBack: true,
},
component: () => import('@/views/conceptualViewOrg/OnlineReview.vue'),
},
{
......@@ -296,10 +329,41 @@ const routes = [
component: () => import('@/views/architectureFollowExamine/index.vue'),
},
{
path: '/main/architectureFollowExamineDetails', // 架构督查 - 架构遵从检查-详情
name: 'architectureFollowExamineDetails',
meta: {
showGoBack: true,
},
component: () =>
import('@/views/architectureFollowExamine/details.vue'),
},
{
path: '/main/artPolicyExamine', // 架构督查-技术政策审查
name: 'artPolicyExamine',
component: () => import('@/views/artPolicyExamine/index.vue'),
},
{
path: '/main/collectDataConfiguration', // 架构督查 - 收集资料配置
name: 'collectDataConfiguration',
component: () => import('@/views/collectDataConfiguration/index.vue'),
},
{
path: '/main/supervisionDatacollection', // 架构督查 - 督查资料收集
name: 'supervisionDataCollection',
component: () => import('@/views/supervisionDataCollection/index.vue'),
},
{
path: '/main/architectureInspectionAnalysis', // 架构督查 - 架构督查分析
name: 'architectureInspectionAnalysis',
component: () =>
import('@/views/architectureInspectionAnalysis/index.vue'),
},
{
path: '/main/examine', // 架构督查 - 架构督查分析
name: 'examine',
component: () => import('@/views/artPolicyExamine/Examine.vue'),
},
],
},
]
......
......@@ -2,16 +2,15 @@ import Vue from 'vue'
import Vuex from 'vuex'
Vue.use(Vuex)
import { getAllBreadcrumbList } from '@/utils'
import { menuOptions } from '@/views/Main/menu'
export default new Vuex.Store({
state: {
},
state: {},
getters: {
// 递归处理后的所有面包屑导航列表
breadcrumbListGet: (state) => getAllBreadcrumbList(menuOptions),
},
mutations: {
},
actions: {
},
modules: {
}
mutations: {},
actions: {},
modules: {},
})
$color-primary: #0d867f;
$color-primary: #0d857f;
/deep/ .el-dialog__header {
background-color: $color-primary;
text-align: left;
......@@ -17,3 +17,9 @@ $color-primary: #0d867f;
/deep/ .el-dialog__headerbtn:hover .el-dialog__close {
color: #fff;
}
/deep/ .el-table th.el-table__cell {
background-color: #f2f9f9 !important;
font-weight: bold;
// font-size: 16px;
color: #333333;
}
/* 面包屑动画 */
.breadcrumb-enter-active,
.breadcrumb-leave-active {
transition: all 0.5s;
}
.breadcrumb-enter,
.breadcrumb-leave-active {
opacity: 0;
transform: translateX(20px);
}
.breadcrumb-move {
transition: all 0.5s;
}
.breadcrumb-leave-active {
position: absolute;
}
/*
架构督查 收集资料配置
*/
// 状态
export const stateCode = [
{ label: '未发布', value: 0 },
{ label: '已发布', value: 1 },
]
// 指标级别
export const indexLevel = [
{ label: '一级指标', value: '1' },
{ label: '二级指标', value: '2' },
{ label: '三级指标', value: '3' },
]
// 材料类型
export const materialTypeList = [
{ label: '项目可行性研究报告', value: '0'},
{ label: '技术规范书', value: '1'},
{ label: '项目启动文件', value: '2'},
{ label: '业务需求说明书', value: '3'},
{ label: '软件需求说明书', value: '4'},
{ label: '概要设计说明书', value: '5'},
{ label: '详细设计说明书', value: '6'},
{ label: '数据库设计说明书', value: '7'},
{ label: '实施方案', value: '8'},
{ label: '安全防护方案', value: '9'},
{ label: '系统部署方案', value: '10'},
{ label: '系统应急预案及快速恢复方案', value: '11'},
]
export const superStateCode = [
{ label: '未发布', value: 0 },
{ label: '已发布', value: 1 },
]
\ No newline at end of file
......@@ -78,3 +78,49 @@ export const completionStatus = [
{ label: '未完成', value: 0 },
{ label: '已完成', value: 1 },
]
export const subjectType = [
{ label: '总部', value: 1 },
{ label: '省公司', value: 2 },
]
export const collectState = [
{ label: '已停用', value: 0 },
{ label: '已发布', value: 1 },
{ label: '暂存', value: 2 },
]
export const whether = [
{ label: '否', value: 0 },
{ label: '是', value: 1 },
]
export const analysisState = [
{ label: '未解析', value: 0 },
{ label: '已解析', value: 1 },
{ label: '解析失败', value: 2 },
]
export const architectureFollowsReviewEnum = [
{
label: '业务架构遵从',
value: 'BUSINESS_ARCHITECTURE_CONFORMANCE_SUPERVISE',
},
{
label: '应用架构遵从',
value: 'APPLICATION_ARCHITECTURE_CONFORMANCE_SUPERVISE',
},
{
label: '技术架构遵从',
value: 'TECHNICAL_ARCHITECTURE_CONFORMANCE_SUPERVISE',
},
{ label: '数据架构遵从', value: 'DATA_ARCHITECTURE_CONFORMANCE_SUPERVISE' },
{
label: '安全架构遵从',
value: 'SECURITY_ARCHITECTURE_CONFORMANCE_SUPERVISE',
},
]
export const rectificationState = [
{ label: '待整改', value: 0 },
{ label: '已整改', value: 1 },
{ label: '整改未通过', value: 2 },
{ label: '已关闭', value: 3 },
]
import { getDianXingAnLiSelectData } from '@/api/index.js'
export const base64ToBlob = function (base64Data) {
// const arr = base64Data.split(',')
// const fileType = arr[0].match(/:(.*?);/)[1]
const bstr = atob(base64Data)
let l = bstr.length
const u8Arr = new Uint8Array(l)
while (l--) {
u8Arr[l] = bstr.charCodeAt(l)
}
return new Blob([u8Arr], {
type: 'image',
})
}
/**
* @description 使用递归找出所有面包屑存储到 vuex 中
* @param {Array} menuList 菜单列表
* @param {Array} parent 父级菜单
* @param {Object} result 处理后的结果
* @returns {Object}
*/
export const getAllBreadcrumbList = (menuList, parent = [], result = {}) => {
for (const item of menuList) {
result[item.path] = [...parent, item]
if (item.children)
getAllBreadcrumbList(item.children, result[item.path], result)
}
return result
}
/**
* @description: 获取字典方法
* @param {String} key 查询字典的key
* @return {Array} 对应字典集合
* @author: pan
*/
export async function getDictTypeOptions(key) {
var dictTypeOptions = []
var storedDic = localStorage.getItem('dic_' + key)
if (storedDic) {
dictTypeOptions = JSON.parse(storedDic)
} else {
const params = { key }
const res = await getDianXingAnLiSelectData(params)
if (res.code !== 200) return
dictTypeOptions = res.data
const jsonStr = JSON.stringify(res.data)
localStorage.setItem('dic_' + key, jsonStr)
}
// console.log('dictTypeOptions', dictTypeOptions)
return dictTypeOptions
}
.isActive {
color: $color-primary !important;
}
.goBack {
cursor: pointer;
}
.main {
height: 100%;
}
.top_menu_container {
/* margin-bottom: 20px; */
height: 125px;
}
.left_menu_and_drawio_container {
display: flex;
height: calc(100% - 178px);
width: calc(100% - 40px);
margin: 30px 20px 20px 20px;
border-top: 6px solid #0d867f;
box-shadow: 10px 10px 30px 30px rgba(201, 226, 225, 1);
}
.el-breadcrumb {
height: 30px;
margin-left: 20px;
line-height: 30px;
}
/* .left_menu_container{
width: 6%;
} */
.logo_title_container {
height: 64px;
display: flex;
align-items: center;
background-color: rgb(13, 134, 127);
color: #fff;
justify-content: space-between;
}
.left_container {
display: flex;
align-items: center;
}
.logo_title {
font-weight: bold;
font-size: 25px;
}
.system_logo {
width: 42px;
margin-left: 20px;
margin-right: 20px;
}
.operate_menu {
width: 350px;
height: 35px;
font-size: 14px;
font-weight: 500;
display: flex;
background-color: rgba(255, 255, 255, 0.2);
border-radius: 19px 19px 19px 19px;
margin-right: 24px;
justify-content: space-around;
align-items: center;
}
.line {
height: 16px;
border: 0.5px solid #fff;
}
.operate_title {
margin-left: 6px;
}
.menu_title {
font-size: 18px;
font-weight: bold;
color: #666;
position: relative;
&::before {
content: '';
position: absolute;
// background: url('@/assets/main/4icon_default.png') no-repeat center;
background-size: cover;
width: 20px;
height: 20px;
position: absolute;
left: -25px;
top: 9%;
}
&:hover {
color: $color-primary;
}
&_0::before {
background: url('@/assets/main/4icon_default.png') no-repeat center;
background-size: cover;
}
&_0:hover {
&::before {
background: url('@/assets/main/4icon_press.png') no-repeat center;
background-size: cover;
}
}
&_1::before {
background: url('@/assets/main/1icon_default.png') no-repeat center;
background-size: cover;
}
&_1:hover {
&::before {
background: url('@/assets/main/1icon_press.png') no-repeat center;
background-size: cover;
}
}
&_2::before {
background: url('@/assets/main/2icon_default.png') no-repeat center;
background-size: cover;
}
&_2:hover {
&::before {
background: url('@/assets/main/2icon_press.png') no-repeat center;
background-size: cover;
}
}
&_3::before {
background: url('@/assets/main/3icon_default.png') no-repeat center;
background-size: cover;
}
&_3:hover {
&::before {
background: url('@/assets/main/3icon_press.png') no-repeat center;
background-size: cover;
}
}
&_4::before {
background: url('@/assets/main/5icon_default.png') no-repeat center;
background-size: cover;
}
&_4:hover {
&::before {
background: url('@/assets/main/5icon_press.png') no-repeat center;
background-size: cover;
}
}
&.isActive {
&::after {
content: '';
position: absolute;
bottom: -17px;
left: -20px;
width: calc(100% + 20px);
height: 4px;
background-color: $color-primary;
}
}
&_0.isActive::before {
background: url('@/assets/main/4icon_press.png') no-repeat center;
background-size: cover;
}
&_1.isActive::before {
background: url('@/assets/main/1icon_press.png') no-repeat center;
background-size: cover;
}
&_2.isActive::before {
background: url('@/assets/main/2icon_press.png') no-repeat center;
background-size: cover;
}
&_3.isActive::before {
background: url('@/assets/main/3icon_press.png') no-repeat center;
background-size: cover;
}
&_4.isActive::before {
background: url('@/assets/main/5icon_press.png') no-repeat center;
background-size: cover;
}
}
.under_line {
position: absolute;
bottom: -25px;
left: 0;
width: 100%;
height: 6px;
background-color: #0d867f;
display: none;
}
.operate_menu_item {
display: flex;
align-items: center;
cursor: pointer;
}
/deep/ .is-leaf {
background-color: rgb(245, 246, 250) !important;
}
.menu_icon {
width: 20px;
height: 20px;
position: absolute;
left: -25px;
top: 9%;
}
.menu_icon_active {
width: 20px;
height: 20px;
position: absolute;
left: -25px;
top: 9%;
display: none;
}
.menu_container {
display: flex;
align-items: center;
justify-content: center;
height: 60px;
}
.menu_1_container {
display: flex;
justify-content: space-around;
}
.menu_1_item_line {
width: 1px;
height: 240px;
}
.menu_1_item_title {
color: #666;
font-weight: bold;
font-size: 16px;
display: flex;
align-items: center;
margin-bottom: 10px;
}
.menu_1_item_subtitle {
display: flex;
align-items: center;
margin-bottom: 10px;
cursor: pointer;
}
.menu_1_item_subtitle:hover {
color: #0d867f;
}
......@@ -36,7 +36,7 @@
ref="popoverRef"
>
<div slot="reference">
<img
<!-- <img
class="menu_icon"
src="@/assets/main/4icon_default.png"
alt=""
......@@ -45,10 +45,16 @@
class="menu_icon_active"
src="@/assets/main/4icon_press.png"
alt=""
/>
<span class="menu_title">{{ item.name }}</span>
<p class="under_line"></p>
/> -->
<span
class="menu_title"
:class="[
{ isActive: isTopMenuActive(index) },
`menu_title_${index}`,
]"
>{{ item.name }}</span
>
<!-- <p class="under_line"></p> -->
</div>
<div class="menu_1_container">
<div
......@@ -77,7 +83,11 @@
:key="index3"
>
<img src="@/assets/main/3img.png" alt="" />
<span style="margin-left: 5px">{{ item3.name }}</span>
<span
style="margin-left: 5px"
:class="{ isActive: isActive(item3.path) }"
>{{ item3.name }}</span
>
</div>
</div>
<img
......@@ -91,13 +101,15 @@
</div>
</el-popover>
</div>
<div class="flex-b-c">
<el-breadcrumb separator="/">
<el-breadcrumb-item>{{ breadcrumb1 }}</el-breadcrumb-item>
<!-- <el-breadcrumb-item>{{ breadcrumb1 }}</el-breadcrumb-item>
<el-breadcrumb-item>{{ breadcrumb2 }}</el-breadcrumb-item>
<el-breadcrumb-item>{{ breadcrumb3 }}</el-breadcrumb-item>
<!-- <el-breadcrumb-item
<el-breadcrumb-item>{{ breadcrumb3 }}</el-breadcrumb-item> -->
<transition-group name="breadcrumb">
<el-breadcrumb-item
v-for="(item, index) in breadcrumbList"
:key="item.path"
:key="item.name"
class="flex"
>
<div
......@@ -106,8 +118,28 @@
>
<span class="breadcrumb-title">{{ item.name }}</span>
</div>
</el-breadcrumb-item> -->
</el-breadcrumb-item>
</transition-group>
</el-breadcrumb>
<div class="flex-c m-r-20 goBack" v-if="showGoBack" @click="fnGoBack()">
<svg
t="1711716188307"
class="icon"
viewBox="0 0 1024 1024"
version="1.1"
xmlns="http://www.w3.org/2000/svg"
p-id="4258"
width="16"
height="16"
>
<path
d="M927.2 610.5c0 143-116.3 259.4-259.3 259.4H196.1c-12.9 0-23.4-10.4-23.4-23.4 0-12.9 10.4-23.4 23.4-23.4h471.7c117.2 0 212.6-95.4 212.6-212.6S785 397.8 667.8 397.8h-458l199.6 199.6c9.1 9.1 9.1 23.9 0 33-4.6 4.6-10.5 6.8-16.5 6.8s-11.9-2.3-16.5-6.8L137 391.1c-9.1-9.1-9.1-23.9 0-33l239.6-239.5c9.1-9.1 23.9-9.1 33 0s9.1 23.9 0 33L210 351.2h457.9c143 0 259.3 116.3 259.3 259.3z"
p-id="4259"
></path>
</svg>
<span>返回目录</span>
</div>
</div>
</div>
<div class="left_menu_and_drawio_container">
<!-- <div class="left_menu_container">
......@@ -118,7 +150,7 @@
</div>
</template>
<script>
import $ from 'jquery'
// import $ from 'jquery'
import { menuOptions } from './menu'
export default {
components: {},
......@@ -136,20 +168,20 @@ export default {
}
},
mounted() {
$('.menu_item').hover(
function () {
$(this).find('.menu_title').css('color', '#0D867F')
$(this).find('.menu_icon').css('display', 'none')
$(this).find('.menu_icon_active').css('display', 'inline-block')
$(this).find('.under_line').css('display', 'block')
},
function () {
$(this).find('.menu_title').css('color', '#666')
$(this).find('.menu_icon').css('display', 'inline-block')
$(this).find('.menu_icon_active').css('display', 'none')
$(this).find('.under_line').css('display', 'none')
},
)
// $('.menu_item').hover(
// function () {
// $(this).find('.menu_title').css('color', '#0D867F')
// $(this).find('.menu_icon').css('display', 'none')
// $(this).find('.menu_icon_active').css('display', 'inline-block')
// $(this).find('.under_line').css('display', 'block')
// },
// function () {
// $(this).find('.menu_title').css('color', '#666')
// $(this).find('.menu_icon').css('display', 'inline-block')
// $(this).find('.menu_icon_active').css('display', 'none')
// $(this).find('.under_line').css('display', 'none')
// },
// )
},
computed: {
breadcrumbList() {
......@@ -159,8 +191,29 @@ export default {
] || []
)
},
showGoBack() {
return this.$route.meta.showGoBack
},
},
methods: {
fnGoBack() {
this.$router.go(-1)
},
isTopMenuActive(index) {
if (
JSON.stringify(this.menuOptions[index]).includes(this.$route.path) &&
this.$route.path != '/main'
) {
return true
}
},
isActive(path) {
if (path === this.$route.path) {
return true
} else {
return false
}
},
onBreadcrumbClick(item, index) {
if (index !== this.breadcrumbList.length - 1) this.$router.push(item.path)
},
......@@ -439,135 +492,7 @@ export default {
<style lang="scss" scoped>
@import '@/styles/common.scss';
.main {
height: 100%;
}
.top_menu_container {
/* margin-bottom: 20px; */
height: 125px;
}
.left_menu_and_drawio_container {
display: flex;
height: calc(100% - 178px);
width: calc(100% - 40px);
margin: 30px 20px 20px 20px;
border-top: 6px solid #0d867f;
box-shadow: 10px 10px 30px 30px rgba(201, 226, 225, 1);
}
.el-breadcrumb {
height: 30px;
margin-left: 20px;
line-height: 30px;
}
/* .left_menu_container{
width: 6%;
} */
.logo_title_container {
height: 64px;
display: flex;
align-items: center;
background-color: rgb(13, 134, 127);
color: #fff;
justify-content: space-between;
}
.left_container {
display: flex;
align-items: center;
}
.logo_title {
font-weight: bold;
font-size: 25px;
}
.system_logo {
width: 42px;
margin-left: 20px;
margin-right: 20px;
}
.operate_menu {
width: 350px;
height: 35px;
font-size: 14px;
font-weight: 500;
display: flex;
background-color: rgba(255, 255, 255, 0.2);
border-radius: 19px 19px 19px 19px;
margin-right: 24px;
justify-content: space-around;
align-items: center;
}
.line {
height: 16px;
border: 0.5px solid #fff;
}
.operate_title {
margin-left: 6px;
}
.menu_title {
font-size: 18px;
font-weight: bold;
color: #666;
}
.under_line {
position: absolute;
bottom: -25px;
left: 0;
width: 100%;
height: 6px;
background-color: #0d867f;
display: none;
}
.operate_menu_item {
display: flex;
align-items: center;
cursor: pointer;
}
/deep/ .is-leaf {
background-color: rgb(245, 246, 250) !important;
}
.menu_icon {
width: 20px;
height: 20px;
position: absolute;
left: -25px;
top: 9%;
}
.menu_icon_active {
width: 20px;
height: 20px;
position: absolute;
left: -25px;
top: 9%;
display: none;
}
.menu_container {
display: flex;
align-items: center;
justify-content: center;
height: 60px;
}
.menu_1_container {
display: flex;
justify-content: space-around;
}
.menu_1_item_line {
width: 1px;
height: 240px;
}
.menu_1_item_title {
color: #666;
font-weight: bold;
font-size: 16px;
display: flex;
align-items: center;
margin-bottom: 10px;
}
.menu_1_item_subtitle {
display: flex;
align-items: center;
margin-bottom: 10px;
cursor: pointer;
}
.menu_1_item_subtitle:hover {
color: #0d867f;
}
@import '@/styles/transition.scss';
@import '@/styles/elementui.scss';
@import './index.scss';
</style>
......@@ -53,6 +53,12 @@ export const menuOptions = [
{
name: '元模型管理',
path: '/main/metaModelList',
children: [
{
name: '元模型管理详情',
path: '/main/metaModelListDetails',
},
],
},
{
name: '架构视图配置',
......@@ -74,6 +80,12 @@ export const menuOptions = [
{
name: '架构视图管理',
path: '/main/archiViewManage',
children: [
{
name: '架构视图管理详情',
path: '/main/archiViewManageDetails',
},
],
},
{
name: '企业中台服务清单',
......@@ -126,14 +138,32 @@ export const menuOptions = [
{
name: '系统架构视图设计',
path: '/main/systemArchiViewDesign',
children: [
{
name: '系统架构视图设计详情',
path: '/main/systemArchiViewDesignDetails',
},
],
},
{
name: '概设阶段架构设计',
path: '/main/summaryArchiDesign',
children: [
{
name: '概设阶段视图设计详情',
path: '/main/summaryArchiDesignDetails',
},
],
},
{
name: '其他视图设计',
path: '/main/otherArchiDesign',
children: [
{
name: '其他视图设计详情',
path: '/main/otherArchiDesignDetails',
},
],
},
],
},
......@@ -143,14 +173,32 @@ export const menuOptions = [
{
name: '评审情况(概要设计)',
path: '/main/reviewSituation',
children: [
{
name: '评审情况',
path: '/main/reviewSituationDetails',
},
],
},
{
name: '概设架构遵从检查',
path: '/main/reviewArchiFollowCheck',
children: [
{
name: '审查',
path: '/main/reviewArchiFollowCheckDetails',
},
],
},
{
name: '概设架构政策审查',
path: '/main/reviewArchiPoliticeCheck',
children: [
{
name: '审查',
path: '/main/reviewArchiPoliticeCheckDetails',
},
],
},
],
},
......@@ -178,6 +226,12 @@ export const menuOptions = [
{
name: '概设材料意见编制',
path: '/main/conceptualViewOrg',
children: [
{
name: '在线辅助审核',
path: '/main/onlineReview',
},
],
},
{
name: '概设关联业务管理',
......@@ -194,15 +248,15 @@ export const menuOptions = [
children: [
{
name: '收集资料配置',
path: '',
path: '/main/collectDataConfiguration',
},
{
name: '督查材料收集',
path: '',
path: '/main/supervisionDataCollection',
},
{
name: '架构督查分析',
path: '',
path: '/main/architectureInspectionAnalysis',
},
{
name: '督查通报管理',
......@@ -215,6 +269,12 @@ export const menuOptions = [
{
name: '架构遵从检查',
path: '/main/architectureFollowExamine',
children: [
{
name: '遵从检查',
path: '/main/architectureFollowExamineDetails',
},
],
},
{
name: '技术政策审查',
......@@ -279,6 +339,12 @@ export const menuOptions = [
{
name: '报告模板关联使用',
path: '/main/reportTemplateRelativeUse',
children: [
{
path: '/main/documentEdit',
name: '编辑文档',
},
],
},
],
},
......
<!--
* @Description: 架构督查-架构遵从检查
* @Version: 2.0
* @Autor: pan
* @Date: 2024-03-26 18:27:18
* @LastEditors: pan
* @LastEditTime: 2024-03-28 14:18:52
-->
<template>
<div class="architectureFollowExamine">
<el-tabs class="m-lr-10" v-model="activeName">
<el-tab-pane
:label="item.label"
:name="item.name"
v-for="item in tabOptions"
:key="item.name"
lazy
>
<keep-alive>
<component :is="item.componentTag"></component>
</keep-alive>
</el-tab-pane>
</el-tabs>
</div>
</template>
<script>
import Tab1 from './tab1.vue'
import Tab2 from './tab2.vue'
import Tab3 from './tab3.vue'
import Tab4 from './tab4.vue'
import Tab5 from './tab5.vue'
import { getArchiViewManage } from '@/api/index.js'
export default {
name: 'architectureFollowExamine',
data() {
return {
activeName: '1',
tabOptions: [
{ label: '业务架构遵从', name: '1', componentTag: 'Tab1' },
{ label: '应用架构遵从', name: '2', componentTag: 'Tab2' },
{ label: '数据架构遵从', name: '3', componentTag: 'Tab3' },
{ label: '技术架构遵从', name: '4', componentTag: 'Tab4' },
{ label: '安全数据架构遵从', name: '5', componentTag: 'Tab5' },
],
componentTag: '',
leftSelectOptions: [],
rightSelectOptions: [],
leftSelect: undefined,
rightSelect: undefined,
}
},
components: {
Tab1,
Tab2,
Tab3,
Tab4,
Tab5,
},
created() {
// this.getLeftTree()
// this.getRightTree()
},
methods: {
getLeftTree() {
getArchiViewManage({ archiStage: 2 }).then((res) => {
if (res.code === 200) {
this.leftSelectOptions = res.data
this.leftSelect = this.leftSelectOptions[0].viewId
}
})
},
getRightTree() {
getArchiViewManage({ archiStage: 3 }).then((res) => {
if (res.code === 200) {
this.rightSelectOptions = res.data
this.rightSelect = this.rightSelectOptions[0].viewId
}
})
},
},
}
</script>
<style scoped lang="scss">
@import '@/styles/common.scss';
.architectureFollowExamine {
width: 100%;
& > div {
height: 100%;
}
::v-deep .el-tabs__content {
height: calc(100% - 55px);
.el-tab-pane {
height: 100%;
}
}
}
</style>
<!--
* @Description: 架构督查-架构遵从检查
* @Description: 架构督查-架构遵从检查列表
* @Version: 2.0
* @Autor: pan
* @Date: 2024-03-26 18:27:18
* @Date: 2024-03-26 19:31:32
* @LastEditors: pan
* @LastEditTime: 2024-03-26 19:08:43
* @LastEditTime: 2024-03-28 09:44:32
-->
<template>
<div class="architectureFollowExamine">
<el-tabs class="m-lr-10" v-model="activeName" @tab-click="handleClick">
<el-tab-pane
:label="item.label"
:name="item.name"
v-for="item in tabOptions"
:key="item.name"
lazy
<div class="searchTable">
<list-page>
<!-- 查询表单插槽 -->
<template #formWrap>
<SearchForm @onSearch="querySearch" :form-options="formOptions" />
</template>
<!-- 表格插槽 -->
<template #tableWrap>
<table-config
ref="searchTable"
:query="query"
:columns="columns"
id-key="elementId"
>
<keep-alive>
<component :is="item.componentTag"></component>
</keep-alive>
</el-tab-pane>
</el-tabs>
</table-config>
</template>
</list-page>
</div>
</template>
<script>
import Tab1 from './tab1.vue'
import Tab2 from './tab2.vue'
import Tab3 from './tab3.vue'
import Tab4 from './tab4.vue'
import Tab5 from './tab5.vue'
import ListPage from '@/components/ListPage.vue'
import SearchForm from '@/components/SearchForm.vue'
import TableConfig from '@/components/TableConfig.vue'
import { updReportManage, delReportManage } from '@/api/index.js'
import { queryArchitectureFollowExamine } from '@/api/interface'
import { buildType } from '@/utils/dictionary'
export default {
name: 'architectureFollowExamine',
components: {
ListPage,
SearchForm,
TableConfig,
},
data() {
return {
activeName: '1',
tabOptions: [
{ label: '业务架构遵从', name: '1', componentTag: 'Tab1' },
{ label: '应用架构遵从', name: '2', componentTag: 'Tab2' },
{ label: '数据架构遵从', name: '3', componentTag: 'Tab3' },
{ label: '技术架构遵从', name: '4', componentTag: 'Tab4' },
{ label: '安全数据架构遵从', name: '5', componentTag: 'Tab5' },
selectRows: [],
query: {
url: queryArchitectureFollowExamine,
method: 'post',
queryParam: {},
},
visible: false,
rowData: {},
dialogTitle: '',
approvalVisible: false,
}
},
computed: {
formOptions() {
return [
{
label: '项目名称', // label文字
prop: 'prjName', // 字段名
element: 'el-input', // 指定elementui组件
placeholder: '请输入内容', // elementui组件属性
},
{
label: '建设类型',
width: '100px',
prop: 'buildType',
element: 'el-select', // 指定elementui组件
dictType: 'build_type',
placeholder: '请选择', // elementui组件属性
},
]
},
columns() {
return [
{ label: '序号', type: 'index', width: '80px' },
{
label: '系统名称',
prop: 'appName',
},
{
label: '建设类型', // label文字
prop: 'buildType', // 字段名
options: buildType,
collectionType: true,
width: '120px',
},
{
label: '项目名称',
prop: 'projectName',
},
{
label: '承建单位',
prop: 'buildOrgName',
},
{
label: '项目经理',
prop: 'projectManager',
},
{
label: '创建人',
prop: 'createMan',
},
{
label: '创建时间',
prop: 'createTime',
},
{
label: '操作',
type: 'operation',
width: '240px',
actionButtons: [
{
title: '遵从检查',
type: 'primary',
size: 'mini',
plain: true,
icon: 'el-icon-edit',
},
],
componentTag: '',
callback: (row, title) => {
this.fnOperation(row, title)
},
},
]
},
},
created() {},
methods: {
querySearch(data) {
this.query.queryParam = {
...this.query.queryParam,
...data,
}
this.$refs.searchTable.queryData()
},
/**
* @description: 操作按钮
* @param {Object} row 当前操作行数据
* @param {String} title 当前操作按钮名称
* @author: pan
*/
fnOperation(row, title) {
this.$router.push({
path: '/main/architectureFollowExamineDetails',
query: {
row: JSON.stringify(row),
},
})
},
},
components: {
Tab1,
Tab2,
Tab3,
Tab4,
Tab5,
},
mounted() {},
methods: {},
}
</script>
<style scoped lang="scss">
@import '@/styles/common.scss';
.architectureFollowExamine {
width: 100%;
& > div {
height: 100%;
}
::v-deep .el-tabs__content {
height: calc(100% - 55px);
.el-tab-pane {
height: 100%;
}
}
}
</style>
......@@ -3,15 +3,34 @@
<div class="content flex">
<div class="left_container m-r-10 flex-column">
<div class="left_container_title">
<div class="flex">
<i class="el-icon-caret-right icon"></i>
<span>系统业务架构视图</span>
</div>
<div class="left_container_content flex-1">
<el-select
class="select-title"
@change="leftSelectChange"
v-model="leftSelect"
>
<el-option
:label="item.viewName"
:value="item.viewId"
v-for="item in leftSelectOptions"
:key="item.viewId"
></el-option>
</el-select>
</div>
<div
class="left_container_content flex-1"
v-loading="leftLoading"
element-loading-text="加载中"
>
<img
v-for="(item, idx) in leftBaseOptions"
:key="idx"
:src="item"
alt=""
class="w-100 h-100"
/>
</div>
</div>
......@@ -21,13 +40,26 @@
<i class="el-icon-caret-right icon"></i>
<span>概设阶段业务架构视图</span>
</div>
<el-select class="select-title" v-model="rightSelect">
<el-option
:label="item.viewName"
:value="item.viewId"
v-for="item in rightSelectOptions"
:key="item.viewId"
></el-option>
</el-select>
</div>
<div class="right_container_content flex-1">
<div
class="right_container_content flex-1"
v-loading="rightLoading"
element-loading-text="加载中"
>
<img
v-for="(item, idx) in rightBaseOptions"
:key="idx"
:src="item"
alt=""
class="w-100 h-100"
/>
</div>
</div>
......@@ -55,8 +87,10 @@
<script>
import {
saveReviewArchiFollowCheckRightSuggestion,
queryReviewArchiFollowCheckRightSuggestionDetails,
saveArchitectureFollows,
viewArchitectureFollows,
qViewArchitectureFollows,
getArchiViewManage,
} from '@/api/index.js'
export default {
name: 'tab1',
......@@ -66,37 +100,106 @@ export default {
resultContent: '',
leftBaseOptions: [],
rightBaseOptions: [],
leftLoading: false,
rightLoading: false,
leftSelect: undefined,
leftSelectOptions: [],
rightSelect: undefined,
rightSelectOptions: [],
row: {},
}
},
created() {
this.row = JSON.parse(this.$route.query.row)
this.getLeftTree().then((res) => {
this.getDetail()
})
this.getRightTree()
this.getLeftQview()
this.getRightQview()
},
methods: {
leftSelectChange() {
this.getDetail()
},
commonParams() {
return {
reviewEnum: 'BUSINESS_ARCHITECTURE_CONFORMANCE_SUPERVISE',
appId: this.row.appId,
reviewState: 0,
}
},
getDetail() {
const params = {
reviewEnum: 'OPERATIONAL_SAFETY_COMPLIANCE_REVIEW',
prjId: this.$route.query.prjId,
...this.commonParams(),
subViewId: this.leftSelect,
}
queryReviewArchiFollowCheckRightSuggestionDetails(params).then((res) => {
viewArchitectureFollows(params).then((res) => {
if (res.code === 200) {
this.resultContent = res.data.reviewSuggestion
this.isMeet = res.data.reviewState
}
})
},
getLeftTree() {
return getArchiViewManage({ archiStage: 2 }).then((res) => {
if (res.code === 200) {
this.leftSelectOptions = res.data
this.leftSelect = this.leftSelectOptions[0].viewId
}
})
},
getRightTree() {
getArchiViewManage({ archiStage: 3 }).then((res) => {
if (res.code === 200) {
this.rightSelectOptions = res.data
this.rightSelect = this.rightSelectOptions[0].viewId
}
})
},
getLeftQview() {
const params = {
appId: this.row.appId,
archiBelongId: 1,
archiStage: 2,
}
this.leftLoading = true
qViewArchitectureFollows(params).then((res) => {
this.leftLoading = false
if (res.code === 200) {
this.leftBaseOptions = res.data.map(
(v) => v.metaModelSvg && `data:image/png;base64,${v.metaModelSvg}`,
)
}
})
},
getRightQview() {
const params = {
appId: this.row.appId,
archiBelongId: 1,
archiStage: 3,
}
this.rightLoading = true
qViewArchitectureFollows(params).then((res) => {
this.rightLoading = false
if (res.code === 200) {
this.rightBaseOptions = res.data.map(
(v) => v.metaModelSvg && `data:image/png;base64,${v.metaModelSvg}`,
)
}
})
},
handleSave() {
const params = {
reviewEnum: 'OPERATIONAL_SAFETY_COMPLIANCE_REVIEW',
prjId: this.$route.query.prjId,
reviewState: this.isMeet,
...this.commonParams(),
reviewSuggestion: this.resultContent,
subViewId: this.leftSelect,
}
const loading = this.$loading({
lock: true,
text: '保存中',
spinner: 'el-icon-loading',
})
saveReviewArchiFollowCheckRightSuggestion(params).then((res) => {
saveArchitectureFollows(params).then((res) => {
loading.close()
if (res.code == 200) {
this.$message.success('保存成功')
......
......@@ -3,15 +3,34 @@
<div class="content flex">
<div class="left_container m-r-10 flex-column">
<div class="left_container_title">
<div class="flex">
<i class="el-icon-caret-right icon"></i>
<span>系统应用架构视图</span>
<span>系统业务架构视图</span>
</div>
<el-select
class="select-title"
@change="leftSelectChange"
v-model="leftSelect"
>
<el-option
:label="item.viewName"
:value="item.viewId"
v-for="item in leftSelectOptions"
:key="item.viewId"
></el-option>
</el-select>
</div>
<div class="left_container_content flex-1">
<div
class="left_container_content flex-1"
v-loading="leftLoading"
element-loading-text="加载中"
>
<img
v-for="(item, idx) in leftBaseOptions"
:key="idx"
:src="item"
alt=""
class="w-100 h-100"
/>
</div>
</div>
......@@ -19,15 +38,28 @@
<div class="right_container_title flex-b-c">
<div class="flex">
<i class="el-icon-caret-right icon"></i>
<span>概设阶段应用架构视图</span>
<span>概设阶段业务架构视图</span>
</div>
<el-select class="select-title" v-model="rightSelect">
<el-option
:label="item.viewName"
:value="item.viewId"
v-for="item in rightSelectOptions"
:key="item.viewId"
></el-option>
</el-select>
</div>
<div class="right_container_content flex-1">
<div
class="right_container_content flex-1"
v-loading="rightLoading"
element-loading-text="加载中"
>
<img
v-for="(item, idx) in rightBaseOptions"
:key="idx"
:src="item"
alt=""
class="w-100 h-100"
/>
</div>
</div>
......@@ -55,8 +87,10 @@
<script>
import {
saveReviewArchiFollowCheckRightSuggestion,
queryReviewArchiFollowCheckRightSuggestionDetails,
saveArchitectureFollows,
viewArchitectureFollows,
qViewArchitectureFollows,
getArchiViewManage,
} from '@/api/index.js'
export default {
name: 'tab2',
......@@ -66,37 +100,106 @@ export default {
resultContent: '',
leftBaseOptions: [],
rightBaseOptions: [],
leftLoading: false,
rightLoading: false,
leftSelect: undefined,
leftSelectOptions: [],
rightSelect: undefined,
rightSelectOptions: [],
row: {},
}
},
created() {
this.row = JSON.parse(this.$route.query.row)
this.getLeftTree().then((res) => {
this.getDetail()
})
this.getRightTree()
this.getLeftQview()
this.getRightQview()
},
methods: {
leftSelectChange() {
this.getDetail()
},
commonParams() {
return {
reviewEnum: 'APPLICATION_ARCHITECTURE_CONFORMANCE_SUPERVISE',
appId: this.row.appId,
reviewState: 0,
}
},
getDetail() {
const params = {
reviewEnum: 'FUNCTIONAL_SATISFACTION_REVIEW',
prjId: this.$route.query.prjId,
...this.commonParams(),
subViewId: this.leftSelect,
}
queryReviewArchiFollowCheckRightSuggestionDetails(params).then((res) => {
viewArchitectureFollows(params).then((res) => {
if (res.code === 200) {
this.resultContent = res.data.reviewSuggestion
this.isMeet = res.data.reviewState
}
})
},
getLeftTree() {
return getArchiViewManage({ archiStage: 2 }).then((res) => {
if (res.code === 200) {
this.leftSelectOptions = res.data
this.leftSelect = this.leftSelectOptions[0].viewId
}
})
},
getRightTree() {
getArchiViewManage({ archiStage: 3 }).then((res) => {
if (res.code === 200) {
this.rightSelectOptions = res.data
this.rightSelect = this.rightSelectOptions[0].viewId
}
})
},
getLeftQview() {
const params = {
appId: this.row.appId,
archiBelongId: 2,
archiStage: 2,
}
this.leftLoading = true
qViewArchitectureFollows(params).then((res) => {
this.leftLoading = false
if (res.code === 200) {
this.leftBaseOptions = res.data.map(
(v) => v.metaModelSvg && `data:image/png;base64,${v.metaModelSvg}`,
)
}
})
},
getRightQview() {
const params = {
appId: this.row.appId,
archiBelongId: 2,
archiStage: 3,
}
this.rightLoading = true
qViewArchitectureFollows(params).then((res) => {
this.rightLoading = false
if (res.code === 200) {
this.rightBaseOptions = res.data.map(
(v) => v.metaModelSvg && `data:image/png;base64,${v.metaModelSvg}`,
)
}
})
},
handleSave() {
const params = {
reviewEnum: 'FUNCTIONAL_SATISFACTION_REVIEW',
prjId: this.$route.query.prjId,
reviewState: '0',
...this.commonParams(),
reviewSuggestion: this.resultContent,
subViewId: this.leftSelect,
}
const loading = this.$loading({
lock: true,
text: '保存中',
spinner: 'el-icon-loading',
})
saveReviewArchiFollowCheckRightSuggestion(params).then((res) => {
saveArchitectureFollows(params).then((res) => {
loading.close()
if (res.code == 200) {
this.$message.success('保存成功')
......
......@@ -3,15 +3,34 @@
<div class="content flex">
<div class="left_container m-r-10 flex-column">
<div class="left_container_title">
<div class="flex">
<i class="el-icon-caret-right icon"></i>
<span>系统数据架构视图</span>
<span>系统业务架构视图</span>
</div>
<el-select
class="select-title"
@change="leftSelectChange"
v-model="leftSelect"
>
<el-option
:label="item.viewName"
:value="item.viewId"
v-for="item in leftSelectOptions"
:key="item.viewId"
></el-option>
</el-select>
</div>
<div class="left_container_content flex-1">
<div
class="left_container_content flex-1"
v-loading="leftLoading"
element-loading-text="加载中"
>
<img
v-for="(item, idx) in leftBaseOptions"
:key="idx"
:src="item"
alt=""
class="w-100 h-100"
/>
</div>
</div>
......@@ -19,15 +38,28 @@
<div class="right_container_title flex-b-c">
<div class="flex">
<i class="el-icon-caret-right icon"></i>
<span>概设阶段数据架构视图</span>
<span>概设阶段业务架构视图</span>
</div>
<el-select class="select-title" v-model="rightSelect">
<el-option
:label="item.viewName"
:value="item.viewId"
v-for="item in rightSelectOptions"
:key="item.viewId"
></el-option>
</el-select>
</div>
<div class="right_container_content flex-1">
<div
class="right_container_content flex-1"
v-loading="rightLoading"
element-loading-text="加载中"
>
<img
v-for="(item, idx) in rightBaseOptions"
:key="idx"
:src="item"
alt=""
class="w-100 h-100"
/>
</div>
</div>
......@@ -55,8 +87,10 @@
<script>
import {
saveReviewArchiFollowCheckRightSuggestion,
queryReviewArchiFollowCheckRightSuggestionDetails,
saveArchitectureFollows,
viewArchitectureFollows,
qViewArchitectureFollows,
getArchiViewManage,
} from '@/api/index.js'
export default {
name: 'tab3',
......@@ -66,37 +100,106 @@ export default {
resultContent: '',
leftBaseOptions: [],
rightBaseOptions: [],
leftLoading: false,
rightLoading: false,
leftSelect: undefined,
leftSelectOptions: [],
rightSelect: undefined,
rightSelectOptions: [],
row: {},
}
},
created() {
this.row = JSON.parse(this.$route.query.row)
this.getLeftTree().then((res) => {
this.getDetail()
})
this.getRightTree()
this.getLeftQview()
this.getRightQview()
},
methods: {
leftSelectChange() {
this.getDetail()
},
commonParams() {
return {
reviewEnum: 'TECHNICAL_ARCHITECTURE_CONFORMANCE_SUPERVISE',
appId: this.row.appId,
reviewState: 0,
}
},
getDetail() {
const params = {
reviewEnum: 'OPERATIONAL_RELIABILITY_REVIEW',
prjId: this.$route.query.prjId,
...this.commonParams(),
subViewId: this.leftSelect,
}
queryReviewArchiFollowCheckRightSuggestionDetails(params).then((res) => {
viewArchitectureFollows(params).then((res) => {
if (res.code === 200) {
this.resultContent = res.data.reviewSuggestion
this.isMeet = res.data.reviewState
}
})
},
getLeftTree() {
return getArchiViewManage({ archiStage: 2 }).then((res) => {
if (res.code === 200) {
this.leftSelectOptions = res.data
this.leftSelect = this.leftSelectOptions[0].viewId
}
})
},
getRightTree() {
getArchiViewManage({ archiStage: 3 }).then((res) => {
if (res.code === 200) {
this.rightSelectOptions = res.data
this.rightSelect = this.rightSelectOptions[0].viewId
}
})
},
getLeftQview() {
const params = {
appId: this.row.appId,
archiBelongId: 3,
archiStage: 2,
}
this.leftLoading = true
qViewArchitectureFollows(params).then((res) => {
this.leftLoading = false
if (res.code === 200) {
this.leftBaseOptions = res.data.map(
(v) => v.metaModelSvg && `data:image/png;base64,${v.metaModelSvg}`,
)
}
})
},
getRightQview() {
const params = {
appId: this.row.appId,
archiBelongId: 3,
archiStage: 3,
}
this.rightLoading = true
qViewArchitectureFollows(params).then((res) => {
this.rightLoading = false
if (res.code === 200) {
this.rightBaseOptions = res.data.map(
(v) => v.metaModelSvg && `data:image/png;base64,${v.metaModelSvg}`,
)
}
})
},
handleSave() {
const params = {
reviewEnum: 'OPERATIONAL_RELIABILITY_REVIEW',
prjId: this.$route.query.prjId,
reviewState: '0',
...this.commonParams(),
reviewSuggestion: this.resultContent,
subViewId: this.leftSelect,
}
const loading = this.$loading({
lock: true,
text: '保存中',
spinner: 'el-icon-loading',
})
saveReviewArchiFollowCheckRightSuggestion(params).then((res) => {
saveArchitectureFollows(params).then((res) => {
loading.close()
if (res.code == 200) {
this.$message.success('保存成功')
......
......@@ -3,15 +3,34 @@
<div class="content flex">
<div class="left_container m-r-10 flex-column">
<div class="left_container_title">
<div class="flex">
<i class="el-icon-caret-right icon"></i>
<span>系统技术架构视图</span>
<span>系统业务架构视图</span>
</div>
<el-select
class="select-title"
@change="leftSelectChange"
v-model="leftSelect"
>
<el-option
:label="item.viewName"
:value="item.viewId"
v-for="item in leftSelectOptions"
:key="item.viewId"
></el-option>
</el-select>
</div>
<div class="left_container_content flex-1">
<div
class="left_container_content flex-1"
v-loading="leftLoading"
element-loading-text="加载中"
>
<img
v-for="(item, idx) in leftBaseOptions"
:key="idx"
:src="item"
alt=""
class="w-100 h-100"
/>
</div>
</div>
......@@ -19,15 +38,28 @@
<div class="right_container_title flex-b-c">
<div class="flex">
<i class="el-icon-caret-right icon"></i>
<span>概设阶段技术架构视图</span>
<span>概设阶段业务架构视图</span>
</div>
<el-select class="select-title" v-model="rightSelect">
<el-option
:label="item.viewName"
:value="item.viewId"
v-for="item in rightSelectOptions"
:key="item.viewId"
></el-option>
</el-select>
</div>
<div class="right_container_content flex-1">
<div
class="right_container_content flex-1"
v-loading="rightLoading"
element-loading-text="加载中"
>
<img
v-for="(item, idx) in rightBaseOptions"
:key="idx"
:src="item"
alt=""
class="w-100 h-100"
/>
</div>
</div>
......@@ -55,8 +87,10 @@
<script>
import {
saveReviewArchiFollowCheckRightSuggestion,
queryReviewArchiFollowCheckRightSuggestionDetails,
saveArchitectureFollows,
viewArchitectureFollows,
qViewArchitectureFollows,
getArchiViewManage,
} from '@/api/index.js'
export default {
name: 'tab4',
......@@ -66,37 +100,106 @@ export default {
resultContent: '',
leftBaseOptions: [],
rightBaseOptions: [],
leftLoading: false,
rightLoading: false,
leftSelect: undefined,
leftSelectOptions: [],
rightSelect: undefined,
rightSelectOptions: [],
row: {},
}
},
created() {
this.row = JSON.parse(this.$route.query.row)
this.getLeftTree().then((res) => {
this.getDetail()
})
this.getRightTree()
this.getLeftQview()
this.getRightQview()
},
methods: {
leftSelectChange() {
this.getDetail()
},
commonParams() {
return {
reviewEnum: 'DATA_ARCHITECTURE_CONFORMANCE_SUPERVISE',
appId: this.row.appId,
reviewState: 0,
}
},
getDetail() {
const params = {
reviewEnum: 'SYSTEM_PRACTICALITY_REVIEW',
prjId: this.$route.query.prjId,
...this.commonParams(),
subViewId: this.leftSelect,
}
queryReviewArchiFollowCheckRightSuggestionDetails(params).then((res) => {
viewArchitectureFollows(params).then((res) => {
if (res.code === 200) {
this.resultContent = res.data.reviewSuggestion
this.isMeet = res.data.reviewState
}
})
},
getLeftTree() {
return getArchiViewManage({ archiStage: 2 }).then((res) => {
if (res.code === 200) {
this.leftSelectOptions = res.data
this.leftSelect = this.leftSelectOptions[0].viewId
}
})
},
getRightTree() {
getArchiViewManage({ archiStage: 3 }).then((res) => {
if (res.code === 200) {
this.rightSelectOptions = res.data
this.rightSelect = this.rightSelectOptions[0].viewId
}
})
},
getLeftQview() {
const params = {
appId: this.row.appId,
archiBelongId: 4,
archiStage: 2,
}
this.leftLoading = true
qViewArchitectureFollows(params).then((res) => {
this.leftLoading = false
if (res.code === 200) {
this.leftBaseOptions = res.data.map(
(v) => v.metaModelSvg && `data:image/png;base64,${v.metaModelSvg}`,
)
}
})
},
getRightQview() {
const params = {
appId: this.row.appId,
archiBelongId: 4,
archiStage: 3,
}
this.rightLoading = true
qViewArchitectureFollows(params).then((res) => {
this.rightLoading = false
if (res.code === 200) {
this.rightBaseOptions = res.data.map(
(v) => v.metaModelSvg && `data:image/png;base64,${v.metaModelSvg}`,
)
}
})
},
handleSave() {
const params = {
reviewEnum: 'SYSTEM_PRACTICALITY_REVIEW',
prjId: this.$route.query.prjId,
reviewState: '0',
...this.commonParams(),
reviewSuggestion: this.resultContent,
subViewId: this.leftSelect,
}
const loading = this.$loading({
lock: true,
text: '保存中',
spinner: 'el-icon-loading',
})
saveReviewArchiFollowCheckRightSuggestion(params).then((res) => {
saveArchitectureFollows(params).then((res) => {
loading.close()
if (res.code == 200) {
this.$message.success('保存成功')
......
......@@ -3,15 +3,34 @@
<div class="content flex">
<div class="left_container m-r-10 flex-column">
<div class="left_container_title">
<div class="flex">
<i class="el-icon-caret-right icon"></i>
<span>系统安全架构视图</span>
<span>系统业务架构视图</span>
</div>
<el-select
class="select-title"
@change="leftSelectChange"
v-model="leftSelect"
>
<el-option
:label="item.viewName"
:value="item.viewId"
v-for="item in leftSelectOptions"
:key="item.viewId"
></el-option>
</el-select>
</div>
<div class="left_container_content flex-1">
<div
class="left_container_content flex-1"
v-loading="leftLoading"
element-loading-text="加载中"
>
<img
v-for="(item, idx) in leftBaseOptions"
:key="idx"
:src="item"
alt=""
class="w-100 h-100"
/>
</div>
</div>
......@@ -19,15 +38,28 @@
<div class="right_container_title flex-b-c">
<div class="flex">
<i class="el-icon-caret-right icon"></i>
<span>概设阶段安全架构视图</span>
<span>概设阶段业务架构视图</span>
</div>
<el-select class="select-title" v-model="rightSelect">
<el-option
:label="item.viewName"
:value="item.viewId"
v-for="item in rightSelectOptions"
:key="item.viewId"
></el-option>
</el-select>
</div>
<div class="right_container_content flex-1">
<div
class="right_container_content flex-1"
v-loading="rightLoading"
element-loading-text="加载中"
>
<img
v-for="(item, idx) in rightBaseOptions"
:key="idx"
:src="item"
alt=""
class="w-100 h-100"
/>
</div>
</div>
......@@ -55,8 +87,10 @@
<script>
import {
saveReviewArchiFollowCheckRightSuggestion,
queryReviewArchiFollowCheckRightSuggestionDetails,
saveArchitectureFollows,
viewArchitectureFollows,
qViewArchitectureFollows,
getArchiViewManage,
} from '@/api/index.js'
export default {
name: 'tab5',
......@@ -66,37 +100,106 @@ export default {
resultContent: '',
leftBaseOptions: [],
rightBaseOptions: [],
leftLoading: false,
rightLoading: false,
leftSelect: undefined,
leftSelectOptions: [],
rightSelect: undefined,
rightSelectOptions: [],
row: {},
}
},
created() {
this.row = JSON.parse(this.$route.query.row)
this.getLeftTree().then((res) => {
this.getDetail()
})
this.getRightTree()
this.getLeftQview()
this.getRightQview()
},
methods: {
leftSelectChange() {
this.getDetail()
},
commonParams() {
return {
reviewEnum: 'SECURITY_ARCHITECTURE_CONFORMANCE_SUPERVISE',
appId: this.row.appId,
reviewState: 0,
}
},
getDetail() {
const params = {
reviewEnum: 'SYSTEM_SECURITY_REVIEW',
prjId: this.$route.query.prjId,
...this.commonParams(),
subViewId: this.leftSelect,
}
queryReviewArchiFollowCheckRightSuggestionDetails(params).then((res) => {
viewArchitectureFollows(params).then((res) => {
if (res.code === 200) {
this.resultContent = res.data.reviewSuggestion
this.isMeet = res.data.reviewState
}
})
},
getLeftTree() {
return getArchiViewManage({ archiStage: 2 }).then((res) => {
if (res.code === 200) {
this.leftSelectOptions = res.data
this.leftSelect = this.leftSelectOptions[0].viewId
}
})
},
getRightTree() {
getArchiViewManage({ archiStage: 3 }).then((res) => {
if (res.code === 200) {
this.rightSelectOptions = res.data
this.rightSelect = this.rightSelectOptions[0].viewId
}
})
},
getLeftQview() {
const params = {
appId: this.row.appId,
archiBelongId: 5,
archiStage: 2,
}
this.leftLoading = true
qViewArchitectureFollows(params).then((res) => {
this.leftLoading = false
if (res.code === 200) {
this.leftBaseOptions = res.data.map(
(v) => v.metaModelSvg && `data:image/png;base64,${v.metaModelSvg}`,
)
}
})
},
getRightQview() {
const params = {
appId: this.row.appId,
archiBelongId: 5,
archiStage: 3,
}
this.rightLoading = true
qViewArchitectureFollows(params).then((res) => {
this.rightLoading = false
if (res.code === 200) {
this.rightBaseOptions = res.data.map(
(v) => v.metaModelSvg && `data:image/png;base64,${v.metaModelSvg}`,
)
}
})
},
handleSave() {
const params = {
reviewEnum: 'SYSTEM_SECURITY_REVIEW',
prjId: this.$route.query.prjId,
reviewState: '0',
...this.commonParams(),
reviewSuggestion: this.resultContent,
subViewId: this.leftSelect,
}
const loading = this.$loading({
lock: true,
text: '保存中',
spinner: 'el-icon-loading',
})
saveReviewArchiFollowCheckRightSuggestion(params).then((res) => {
saveArchitectureFollows(params).then((res) => {
loading.close()
if (res.code == 200) {
this.$message.success('保存成功')
......
<template>
<el-dialog
:title="title"
:visible.sync="showDialog"
:close-on-click-modal="false"
width="42%"
@close="handleClose()"
@open="handleOpen"
>
<el-form :inline="true" id="addForm" ref="addForm" :rules="rules" :model="formInfo" label-width="auto" style="text-align: left;">
<template v-if="title == '新增督查指标' || rowData.tab == 'one'">
<el-form-item label="督查方案" prop="supervCode">
<el-select v-model="formInfo.supervCode" size="small" placeholder="请选择" @change="changeSupervCode" :disabled='!display' clearable>
<el-option v-for="item in supervNameList" :key="item.text" :label="item.value" :value="item.text">
</el-option>
</el-select>
</el-form-item>
<el-form-item label="权重" prop="weight">
<el-input type="number" min="0" v-model="formInfo.weight" size="small" placeholder="请输入内容" > </el-input>
</el-form-item>
<br />
<el-form-item label="督查指标" prop="indexName">
<el-radio-group v-model="formInfo.indexLevel" @change="changeRadio" >
<el-radio v-for="item in radioList" :key="item.value" :label="item.value" :disabled='!display'>{{ item.label }}</el-radio >
</el-radio-group>
<br />
<el-select v-if="(formInfo.indexLevel == '2' || formInfo.indexLevel == '3') && display" v-model="formInfo.zhibiao1" size="small" placeholder="请选择" clearable @change="getZhibiaoList('3')">
<el-option v-for="item in zhibiaoList1" :key="item.text" :label="item.value" :value="item.text">
</el-option>
</el-select>
<el-select v-if="formInfo.indexLevel == '3' && display" v-model="formInfo.zhibiao2" size="small" placeholder="请选择" clearable>
<el-option v-for="item in zhibiaoList2" :key="item.text" :label="item.value" :value="item.text">
</el-option>
</el-select>
<el-input v-model="formInfo.indexName" size="small" placeholder="请输入内容" > </el-input>
</el-form-item>
</template>
<template v-if="rowData.tab == 'two'">
<el-form-item label="督查指标名称" prop="indexName">
<el-input v-model="formInfo.indexName" size="small" placeholder="请输入内容" > </el-input>
</el-form-item>
<el-form-item label="评分" prop="score" class="scoreClass">
<el-input type="number" min="1" max='5' v-model="formInfo.score" size="small" placeholder="请输入内容" > </el-input>
</el-form-item>
<br />
<el-form-item label="评审意见" prop="opinion" class="textarea">
<el-input type="textarea" v-model="formInfo.opinion" :rows="3" show-word-limit placeholder="请输入内容" ></el-input>
</el-form-item>
</template>
</el-form>
<span slot="footer" class="dialog-footer">
<el-button type="primary" @click="handleSubmit" size="mini" >保 存</el-button >
<el-button @click="handleClose()" size="mini">取 消</el-button>
</span>
</el-dialog>
</template>
<script>
import Form from '@/views/collectDataConfiguration/Form.vue'
export default {
components: { Form },
props: {
title: {
type: String,
default: '',
},
visible: {
type: Boolean,
default: false,
},
rowData: {
type: Object,
default: () => {},
},
edit:{
type: Boolean,
default: false
}
},
computed: {
showDialog: {
get() {
return this.visible
},
set(value) {
this.$emit('update:visible', value)
},
},
},
data(){
return {
supervNameList: [],
formInfo: {},
zhibiaoList1: [],
zhibiaoList2: [],
radioList: [
{ value: '1', label: '一级指标' },
{ value: '2', label: '二级指标' },
{ value: '3', label: '三级指标' },
],
display: true,
rules: {
supervCode: [{ required: true, message: '必填项', trigger: 'change' }],
weight: [{ required: true, message: '必填项', trigger: 'blur' }],
indexName: [{ required: true, message: '必填项', trigger: 'blur' }],
score: [{ required: true, message: '必填项', trigger: 'blur' }],
}
}
},
methods: {
getSupervNameList(){
this.$postRequest('/supervIndex/selectDrop', {}).then(res => {
if (res.code === 200) {
this.supervNameList = res.data
} else {
this.supervNameList = []
}
})
},
changeSupervCode(){
// this.changeRadio(this.selectRadio)
this.formInfo.indexLevel = '1'
},
changeRadio(v){
this.selectRadio = v
if(v != '1'){
if(!!this.formInfo.supervCode){
this.getZhibiaoList('2')
}else{
this.$message.warning('请选择督查方案')
}
}
},
getZhibiaoList(level){
this.$postRequest('/supervIndex/selectIndexLevelDrop', {indexLevel: level, supervCode: this.formInfo.supervCode}).then(res => {
if (res.code === 200) {
if(level == '2'){
this.zhibiaoList1 = res.data
}else{
this.zhibiaoList2 = res.data
}
} else {
this.zhibiaoList1 = []
this.zhibiaoList2 = []
}
})
},
handleSubmit() {
this.$refs.addForm.validate((valid) => {
if (valid) {
const loading = this.$loading({
lock: true,
text: '保存中',
spinner: 'el-icon-loading',
})
let supervName = this.supervNameList.find(item => item.text == this.formInfo.supervCode).value
let upIndex = this.formInfo.indexLevel - 1 == 0 ? '' : this.formInfo.indexLevel - 1 + ''
let params = this.rowData.tab == 'two' ? {
supervCode: this.formInfo.supervCode,
opinion: this.formInfo.opinion,
score: this.formInfo.score,
id: this.formInfo.id
} : {
...this.formInfo,
supervName,
upIndex
}
let url = this.display ? '/supervIndex/ad' : this.rowData.tab == 'two' ? '/supervIndex/updPf' : '/supervIndex/upd' // 编辑
console.log(params, 'params', url);
this.$postRequest(url, params).then(res => {
if (res.code === 200) {
loading.close()
this.$message.success('保存成功')
this.handleClose()
this.$emit('querySearch', this.display)
}
})
}
})
},
handleClose() {
this.showDialog = false
},
async handleOpen() {
this.getSupervNameList()
if (Object.keys(this.rowData).length) {
this.formInfo = JSON.parse(JSON.stringify(this.rowData))
this.display = false
} else {
this.$nextTick(() => {
this.display = true
this.addInitValue()
this.$refs.addForm.resetFields()
})
}
},
// 添加初始值
addInitValue() {
this.formInfo = {
supervCode: '',
weight: 0,
indexLevel: '1',
// zhibiao1: '',
// zhibiao2: '',
indexName: '',
}
},
}
}
</script>
<style lang="scss" scoped>
@import '@/styles/elementui.scss';
/deep/ .scoreClass {
.el-input {
width: 160px ;
}
}
/deep/ .textarea{
width: 60%;
white-space: nowrap;
.el-form-item__content{
width: 100%;
}
}
.zhibiao1{
float: left;
}
</style>
\ No newline at end of file
<template>
<el-dialog
:title="'指标清单'"
:visible.sync="showDialog"
width="90%"
@close="showDialog = false"
>
<table-config
ref="searchTable"
:query="query"
:columns="columns"
id-key="elementId"
>
</table-config>
</el-dialog>
</template>
<script>
import { architectureDetail } from '@/api/architectureInspection'
import TableConfig from '@/views/collectDataConfiguration/TableConfig.vue'
import { stateCode, indexLevel } from '@/utils/architectureInspectionDis'
export default {
components: { TableConfig },
props: {
title: {
type: String,
default: '',
},
prjCodeDetail: {
type: String,
default: '',
},
visible: {
type: Boolean,
default: false,
},
},
watch: {
visible: {
handler(v){
if(v){
this.search()
}
}
},
},
data(){
return {
query: {
url: architectureDetail,
method: 'post',
queryParam: {
supervCode: '',
},
},
}
},
computed: {
columns() {
let arr = [
{ label: '序号', type: 'index', width: '80px' },
{ label: '督查方案名称', prop: 'supervName'},
{ label: '督查编码', prop: 'supervCode', width: '150px' },
{ label: '指标名称', prop: 'indexName',width: '150px' },
{ label: '指标级别', prop: 'indexLevel', width: '100px',collectionType: 'indexLevel',
options: indexLevel,
},
{ label: '指标权重', prop: 'weight', width: '100px'},
{ label: '创建时间', prop: 'createTime', width: '100px'},
{ label: '状态', prop: 'state', width: '100px', collectionType: 'stateCode',
options: stateCode,},
]
let operation = [
{
label: '操作', type: 'operation', width: '200px',
actionButtons: [
{
title: '编辑',
type: 'primary',
size: 'mini',
plain: true,
icon: 'el-icon-edit',
},
{
title: '删除',
type: 'danger',
size: 'mini',
plain: true,
icon: 'el-icon-delete',
},
],
callback: (row, title) => {
this.fnOperation(row, title)
},
},
]
if(this.title == '指标清单'){
return [...arr, ...operation]
}else{
return [...arr,
{ label: '评分', prop: 'score', width: '100px' },
{ label: '评审意见', prop: 'opinion', width: '150px'},
...operation]
}
},
showDialog: {
get() {
return this.visible
},
set(value) {
this.$emit('update:visible', value)
},
}
},
methods: {
async search(){
if(this.title == '督查名称'){
this.query.queryParam = {
supervCode: this.prjCodeDetail,
state: "1",
indexLevel: "3"
}
}else{
this.query.queryParam = {
supervCode: this.prjCodeDetail,
}
}
this.$nextTick(() => {
this.$refs.searchTable.queryData()
})
},
/**
* @description: 操作按钮
* @param {Object} row 当前操作行数据
* @param {String} title 当前操作按钮名称
* @author: pan
*/
fnOperation(row, title) {
switch (title) {
case '编辑':
this.fnEdit(row)
break
case '删除':
this.fnDel(row)
break
default:
break
}
},
// 删除
fnDel(row) {
this.$confirm('是否确认删除?', '提示', {
confirmButtonText: '确认',
cancelButtonText: '取消',
type: 'warning',
})
.then(() => {
this.$postRequest('/supervIndex/del', {id: row.id}).then(res => {
if (res.code === 200) {
this.$message.success('删除成功')
this.$refs.searchTable.queryData()
} else {
this.$message.error(res.msg)
}
})
})
.catch(() => {})
},
// 编辑
fnEdit(row) {
this.rowData = row
this.$emit('editClick', row, this.title)
},
}
}
</script>
<style lang="scss" scoped>
@import '@/styles/elementui.scss';
::v-deep .el-dialog__body{
height: 58vh;
}
</style>
\ No newline at end of file
<template>
<el-dialog
:title="'指标清单'"
:visible.sync="showDialog"
width="90%"
@close="showDialog = false"
@open="handleOpen"
>
<el-form :inline="true" id="addForm" ref="addForm" :model="formInfo" label-width="auto" style="text-align: left;">
<el-form-item label="政策名称" prop="policyName">
<el-input v-model="formInfo.policyName" size="small" placeholder="请输入内容" > </el-input>
</el-form-item>
<el-form-item label="" prop="">
<el-button type="primary" @click="querySearch" size="mini" >查询</el-button >
</el-form-item>
</el-form>
<table-config
ref="searchTable"
:query="query"
:columns="columns"
id-key="elementId"
@selection-change="selectionChange"
>
</table-config>
<span slot="footer" class="dialog-footer">
<el-button type="primary" @click="handleSubmit" size="mini" >保 存</el-button >
<el-button @click="handleClose()" size="mini">取 消</el-button>
</span>
</el-dialog>
</template>
<script>
import TableConfig from '@/views/collectDataConfiguration/TableConfig.vue'
import { artPolicyExamineAdd } from '@/api/architectureInspection'
export default {
components: { TableConfig },
props: {
title: {
type: String,
default: '',
},
prjCodeDetail: {
type: String,
default: '',
},
visible: {
type: Boolean,
default: false,
},
},
computed: {
columns() {
let arr = [
{ type: 'selection',prop: 'selection', width: '55px' },
{ label: '序号', type: 'index', width: '80px' },
{ label: '政策名称', prop: 'policyName', width: '100px' },
{ label: '政策描述', prop: 'policyContent', },
{ label: '适用范围', prop: 'scope_', },
{ label: '发布部门', prop: 'deptName', },
{ label: '级别', prop: 'level_', },
{ label: '启用时间', prop: 'startTime', },
{ label: '创建人', prop: 'createMan', },
{ label: '创建时间', prop: 'createTime', },
]
return arr
},
showDialog: {
get() {
return this.visible
},
set(value) {
this.$emit('update:visible', value)
},
}
},
data(){
return {
formInfo: {
policyName: '',
},
query: {
url: artPolicyExamineAdd,
method: 'post',
queryParam: {
policyName: '',
state: '1'
},
},
selectId: '',
}
},
methods: {
querySearch(data) {
this.query.queryParam = {
...this.query.queryParam,
...data,
}
this.query.queryParam.policyName = this.forEach.policyName
this.$refs.searchTable.queryData()
},
selectionChange(data) {
let idArr = []
data.forEach(item => {
idArr.push(item.policyCode)
})
this.selectId = idArr.join(',')
},
handleSubmit(){
const loading = this.$loading({
lock: true,
text: '保存中',
spinner: 'el-icon-loading',
})
this.$postRequest('/klTechPolicyCheck/ad/', {policyCode: this.selectId, state: '1'}).then(res => {
if (res.code === 200) {
loading.close()
this.$message.success('保存成功')
this.handleClose()
this.$emit('querySearch')
}
})
},
handleClose() {
this.showDialog = false
},
async handleOpen() {
this.$nextTick(() => {
this.$refs.searchTable.clearSelection()
})
},
}
}
</script>
<style lang="scss" scoped>
@import '@/styles/elementui.scss';
::v-deep .el-dialog__body{
height: 58vh;
}
</style>
\ No newline at end of file
<template>
<div class="tab-component flex-column h-100 searchTable">
<div class="content flex">
<div class="left_container m-r-10 flex-column">
<div class="left_container_title">
<i class="el-icon-caret-right icon"></i>
<span>评审标准</span>
</div>
<div class="left_container_content flex-1">
<div class="office w-100 h-100">
<vab-only-office
id="office-preview-tab1-1"
:documentServerUrl="documentServerUrl"
:config="config"
/>
</div>
</div>
</div>
<div class="right_container flex-column">
<div class="right_container_title flex-b-c">
<div class="flex">
<i class="el-icon-caret-right icon"></i>
<span>评审内容</span>
</div>
<el-select class="select-title" v-model="select">
<el-option label="概要设计说明书.doc" value="1"></el-option>
</el-select>
<el-button type="primary" size='mini' class="backBtn" @click="backRoute">返回</el-button>
</div>
<div class="right_container_content flex-1">
<div class="office w-100 h-100">
<vab-only-office
id="office-preview-tab1-2"
:documentServerUrl="documentServerUrl"
:config="config"
/>
</div>
</div>
</div>
</div>
<div class="bottom_container">
<div class="flex-b-c p-r-20 m-tb-15">
<div class="flex-c">
<span class="m-r-50 p-l-20 bottom_container_title">评审结果</span>
<div class="label m-r-10">是否满足接入要求:</div>
<el-select v-model="isMeet" class="leftSelect">
<el-option
v-for="item in selectOptions"
:key="item.value"
:label="item.label"
:value="item.value"
></el-option>
</el-select>
</div>
<el-button type="primary" size="medium" @click="handleSave"
>保存结果</el-button
>
</div>
<el-input
type="textarea"
:rows="4"
v-model="resultContent"
v-no-backslash
class="w-100"
placeholder="请输入"
></el-input>
</div>
</div>
</template>
<script>
import vabOnlyOffice from '@/components/onlyOffice/index.vue'
import {
saveReviewArchiFollowCheckRightSuggestion,
queryReviewArchiFollowCheckRightSuggestionDetails,
} from '@/api/index.js'
export default {
name: 'tab1',
components: { vabOnlyOffice },
data() {
return {
resultContent: '',
isMeet: null,
selectOptions: [
{
label: '是',
value: 1,
},
{
label: '否',
value: 0,
},
],
select: '1',
documentServerUrl: 'http://192.168.0.120:18050/',
config: {
document: {
fileType: 'docx',
// 给服务端用的唯一id,同一个id就会获取服务器缓存里的文件(有这个key,就会先根据它去缓存里找),这项如果最开始只是先试用,可以先给个空字符串
key: '71df19fbd1',
// 文件名
title: '65f90a662c18a9e9f1878156.docx',
//相关权限
// permissions: {
// copy: true, //定义内容是否可以复制到剪贴板。如果该参数设置为false,则只能在当前文档编辑器中粘贴内容。默认值为true。
// download: true, //定义文档是可以下载还是只能在线查看或编辑。如果下载权限设置为“假”的下载为...菜单选项将是缺席的文件菜单。默认值为true。
// edit: true, //定义文档是可以编辑还是只能查看。如果编辑权限设置为“true”,则文件菜单将包含编辑文档菜单选项;请注意,如果编辑权限设置为“false”,文档将在查看器中打开,即使模式参数设置为edit,您也无法将其切换到编辑器。默认值为true。
// print: true, //定义是否可以打印文档。如果打印权限设置为“false”的打印菜单选项将是缺席的文件菜单。默认值为true
// },
// 所要渲染的文件的绝对路径,这个参数很重要,它传的不是文件的本地地址,而是需要把文件传到项目所依赖的服务器,然后拿到文件在服务器的url地址(这个一般情况需要后端支持)才可以用,这个参数决定了能不能实例化出来onlyoffice对象
url: 'http://192.168.0.120:7005/downloadFile/29',
},
documentType: 'word',
height: '100%',
width: '100%',
editorConfig: {
//语言:zh-CN简体中文/en英文
lang: 'zh-CN',
//阅读状态 view/edit
mode: 'edit',
customization: {
//是否显示插件
plugins: false,
forcesave: true,
},
user: {
// 当前正在view/edit此文档的用户信息
name: '',
},
// 指定文档存储服务器的绝对路径
callbackUrl: 'http://192.168.0.120:7005/callback?fileId=29',
},
},
}
},
created() {
this.getDetail()
},
methods: {
getDetail() {
const params = {
reviewEnum: 'OPERATIONAL_SAFETY_COMPLIANCE_REVIEW',
prjId: this.$route.query.prjId,
}
queryReviewArchiFollowCheckRightSuggestionDetails(params).then((res) => {
if (res.code === 200) {
this.resultContent = res.data.reviewSuggestion
this.isMeet = res.data.reviewState
}
})
},
handleSave() {
const params = {
reviewEnum: 'OPERATIONAL_SAFETY_COMPLIANCE_REVIEW',
prjId: this.$route.query.prjId,
reviewState: this.isMeet,
reviewSuggestion: this.resultContent,
}
const loading = this.$loading({
lock: true,
text: '保存中',
spinner: 'el-icon-loading',
})
saveReviewArchiFollowCheckRightSuggestion(params).then((res) => {
loading.close()
if (res.code == 200) {
this.$message.success('保存成功')
} else {
this.$message.error(res.msg)
}
})
},
backRoute(){
this.$router.push({path: '/main/artPolicyExamine', query: {activeName: '2'}})
},
},
}
</script>
<style lang="scss" scoped>
@import '@/styles/common.scss';
@import '@/views/reviewArchiPoliticeCheck/index.scss';
.backBtn{
position: absolute;
right: 10px;
top: 10px;
}
</style>
<!--
* @Description: 架构督查-技术政策审查
* @Version: 2.0
* @Autor: pan
* @Date: 2024-03-26 18:27:18
* @LastEditors: pan
* @LastEditTime: 2024-03-26 19:26:03
-->
<template>
<div class="searchTable">
<list-page>
<template #tabWrap>
<el-tabs v-model="activeName" @tab-click="handleClick">
<el-tab-pane
:label="item.label"
:name="item.name"
v-for="item in tabOptions"
:key="item.name"
>
</el-tab-pane>
</el-tabs>
</template>
<!-- 查询表单插槽 -->
<template #formWrap>
<SearchForm @onSearch="querySearch" :form-options="formOptions" />
<SearchForm ref="SearchForm" @onSearch="querySearch" :form-options="formOptions" />
</template>
<!-- 中部操作按钮 -->
<template #operationWrap v-if="activeName == '1'">
<el-button type="primary" icon="el-icon-document-add" size="medium" plain @click="fnAdd" >添加</el-button >
</template>
<!-- 表格插槽 -->
<template #tableWrap>
......@@ -24,6 +31,10 @@
</table-config>
</template>
</list-page>
<AddTabelList
@querySearch="querySearch"
:visible.sync="visible"
:title="dialogTitle"/>
</div>
</template>
......@@ -31,90 +42,101 @@
import ListPage from '@/components/ListPage.vue'
import SearchForm from '@/components/SearchForm.vue'
import TableConfig from '@/components/TableConfig.vue'
import { updReportManage, delReportManage } from '@/api/index.js'
import { querySupervisionNotifyManagement } from '@/api/interface'
import { buildType } from '@/utils/dictionary'
import AddTabelList from './AddTabelList.vue'
import { artPolicyExamine, examineSearch } from '@/api/architectureInspection'
export default {
name: 'supervisionNotifyManagement',
components: {
ListPage,
SearchForm,
TableConfig,
},
name: 'artPolicyExamine',
components: { ListPage, SearchForm, TableConfig, AddTabelList },
data() {
return {
selectRows: [],
query: {
url: querySupervisionNotifyManagement,
url: this.$route.query.activeName ? examineSearch : artPolicyExamine,
method: 'post',
queryParam: {},
},
activeName: this.$route.query.activeName ? this.$route.query.activeName : '1',
tabOptions: [
{ label: '技术政策', name: '1' },
{ label: '审查', name: '2' },
],
visible: false,
rowData: {},
dialogTitle: '',
approvalVisible: false,
}
},
computed: {
formOptions() {
if(this.activeName == '2'){
return [
{
label: '年度', // label文字
prop: 'year', // 字段名
type: 'year',
valueFormat: 'yyyy',
element: 'el-date-picker', // 指定elementui组件
placeholder: '请选择', // elementui组件属性
},
{
label: '建设类型',
width: '100px',
prop: 'buildType',
element: 'el-select', // 指定elementui组件
dictType: 'build_type',
placeholder: '请选择', // elementui组件属性
},
{
label: '项目名称', // label文字
prop: 'prjName', // 字段名
element: 'el-input', // 指定elementui组件
placeholder: '请输入内容', // elementui组件属性
},
]
},
columns() {
}else{
return [
// { label: '序号', type: 'index', width: '80px' },
{ label: '年份', prop: 'year', width: '100px' },
{
label: '建设类型', // label文字
prop: 'buildType', // 字段名
options: buildType,
collectionType: true,
width: '120px',
label: '政策名称', // label文字
prop: 'policyName', // 字段名
element: 'el-input', // 指定elementui组件
placeholder: '请输入内容', // elementui组件属性
},
{
label: '项目名称',
prop: 'prjName',
]
}
},
columns() {
if(this.activeName == '2'){
return [
{ label: '序号', type: 'index', width: '80px' },
{ label: '单位', prop: 'manageOrgId', width: '100px' },
{ label: '部门', prop: 'manageDeptId', width: '100px' },
{ label: '系统名称', prop: 'appName' },
{ label: '建设类型', prop: 'buildType', width: '100px' },
{ label: '项目名称', prop: 'prjName' },
{ label: '项目类型', prop: 'prjPlanClass', width: '100px' },
{ label: '承建单位', prop: 'buildOrg', width: '100px' },
{ label: '项目经理', prop: 'projectManager', width: '100px' },
{ label: '创建人', prop: 'createMan', width: '100px' },
{ label: '创建时间', prop: 'createTime', width: '100px' },
{
label: '操作',
type: 'operation',
width: '240px',
label: '操作', type: 'operation', width: '200px',
actionButtons: [
{
title: '审查',
type: 'primary',
size: 'mini',
plain: true,
icon: 'el-icon-edit',
icon: 'el-icon-view',
},
],
callback: (row, title) => {
this.fnOperation(row, title)
},
},
]
}else{
return [
{ label: '序号', type: 'index', width: '80px' },
{ label: '政策名称', prop: 'policyName', width: '100px' },
{ label: '政策描述', prop: 'policyContent', },
{ label: '适用范围', prop: 'scope_', },
{ label: '发布部门', prop: 'deptName', },
{ label: '级别', prop: 'level_', },
{ label: '启用时间', prop: 'startTime', },
{ label: '创建人', prop: 'createMan', },
{ label: '创建时间', prop: 'createTime', },
{
title: '查看结果',
type: 'primary',
label: '操作', type: 'operation', width: '200px',
actionButtons: [
{
title: '删除',
type: 'danger',
size: 'mini',
plain: true,
icon: 'el-icon-view',
icon: 'el-icon-delete',
},
],
callback: (row, title) => {
......@@ -122,17 +144,38 @@ export default {
},
},
]
}
},
},
created() {},
methods: {
querySearch(data) {
if(this.activeName == '1'){
this.query.url = artPolicyExamine
this.query.queryParam = {
policyName: undefined
}
}else{
this.query.url = examineSearch
this.query.queryParam = {
prjName: undefined
}
}
this.query.queryParam = {
...this.query.queryParam,
...data,
}
this.$refs.searchTable.queryData()
},
fnAdd() {
this.visible = true
// this.rowData = {}
this.dialogTitle = '新增督查指标'
},
handleClick(tab, event) {
this.$refs.SearchForm.onReset()
// this.query.queryParam = {}
this.querySearch()
},
/**
* @description: 操作按钮
* @param {Object} row 当前操作行数据
......@@ -142,16 +185,36 @@ export default {
fnOperation(row, title) {
switch (title) {
case '审查':
// this.fnEdit(row)
this.fnSubmit(row)
break
case '查看结果':
// this.fnEdit(row)
case '删除':
this.fnDel(row)
break
default:
break
}
},
fnSubmit(row){
this.$router.push('/main/examine')
},
fnDel(row){
this.$confirm('是否确认删除?', '提示', {
confirmButtonText: '确认',
cancelButtonText: '取消',
type: 'warning',
})
.then(() => {
this.$postRequest('/klTechPolicyCheck/del/', {id: row.id}).then(res => {
if (res.code === 200) {
this.$message.success('删除成功')
this.$refs.searchTable.queryData()
} else {
this.$message.error(res.msg)
}
})
})
.catch(() => {})
}
},
}
</script>
......
......@@ -63,8 +63,8 @@ export default {
prop: 'createMan', // 字段名
element: 'el-input', // 指定elementui组件
initValue: '', // 字段初始值
placeholder: '请输入内容', // elementui组件属性
rules: [],
// placeholder: '请输入内容', // elementui组件属性
readonly: true,
},
{
label: '创建时间', // label文字
......@@ -74,6 +74,7 @@ export default {
element: 'el-date-picker', // 指定elementui组件
initValue: new Date().format('yyyy-MM-dd'), // 字段初始值
placeholder: '请选择', // elementui组件属性
readonly: true,
},
{
label: '年度', // label文字
......@@ -100,7 +101,6 @@ export default {
element: 'el-input', // 指定elementui组件
placeholder: '请输入内容', // elementui组件属性
span: 24,
rules: [{ required: true, trigger: 'blur', message: '不能为空' }],
},
]
},
......
<template>
<el-dialog
:title="title"
:visible.sync="showDialog"
:close-on-click-modal="false"
width="80%"
@close="handleClose()"
@open="handleOpen"
>
<Form
ref="addForm"
:form-options="formOptions"
label-width="120px"
>
<!-- 收集材料类型自定义 -->
<template slot="materialType" slot-scope="{ data }">
<el-checkbox-group v-model="formInfo.materialType">
<el-checkbox v-for="item in materialTypeList" :key="item.label" :label="item.value">{{item.label}}</el-checkbox>
</el-checkbox-group>
</template>
<template slot="supervision" slot-scope="{ data }">
<el-button v-if="Object.keys(rowData).length != 0" class="addBtn" type="primary" size="mini" @click="addTabelList">添加</el-button >
<table-config
ref="searchTable"
@selection-change="selectionChange"
:query="query"
:columns="columns"
id-key="elementId"
>
</table-config>
</template>
</Form>
<span slot="footer" class="dialog-footer">
<el-button type="primary" @click="handleSubmit" size="mini" >保 存</el-button >
<el-button @click="handleClose()" size="mini">取 消</el-button>
</span></el-dialog>
</template>
<script>
import Form from './Form.vue'
import TableConfig from '@/components/TableConfig.vue'
import AddTabelList from './AddTabelList.vue'
import { materialTypeList } from '@/utils/architectureInspectionDis'
import { collectDataConfiguration } from '@/api/architectureInspection'
export default {
components: { Form, TableConfig, AddTabelList },
props: {
title: {
type: String,
default: '',
},
visible: {
type: Boolean,
default: false,
},
rowData: {
type: Object,
default: () => {},
},
edit:{
type: Boolean,
default: false
}
},
data() {
return {
formInfo: {
materialType: [],
},
materialTypeList,
query: {
url: collectDataConfiguration,
method: 'post',
queryParam: {
prjCode: ''
},
},
selectId: '',
prjCodeDetail: '',
isDetail: true
}
},
watch: {
rowData: {
handler(v){
this.query.queryParam.prjCode = v.supervision ? v.supervision : ''
this.$nextTick(() => {
this.$refs.searchTable.queryData()
})
},
deep: true
},
},
computed: {
formOptions() {
return [
{
label: '督查方案名称', // label文字
prop: 'supervName', // 字段名
element: 'el-input', // 指定elementui组件
placeholder: '请输入内容', // elementui组件属性
// rules: [{ required: true, trigger: 'blur', message: '不能为空' }],
},
{
label: '收集材料类型', // label文字
prop: 'materialType', // 字段名
__slotName: 'materialType',
// rules: [{ required: true, trigger: 'change', message: '不能为空' }],
},
{
label: '开始时间', // label文字
prop: 'createTime', // 字段名
type: 'date',
valueFormat: 'yyyy-MM-dd',
element: 'el-date-picker', // 指定elementui组件
initValue: new Date().format('yyyy-MM-dd'), // 字段初始值
placeholder: '请选择', // elementui组件属性
},
{
label: '截止时间', // label文字
prop: 'endTime', // 字段名
type: 'date',
valueFormat: 'yyyy-MM-dd',
element: 'el-date-picker', // 指定elementui组件
initValue: new Date().format('yyyy-MM-dd'), // 字段初始值
placeholder: '请选择', // elementui组件属性
},
{
label: '督查清单', // label文字
prop: 'supervision', // 字段名
__slotName: 'supervision',
// rules: [{ required: true, trigger: 'change', message: '不能为空' }],
},
{
label: '备注', // label文字
prop: 'notes', // 字段名
type: 'textarea',
element: 'el-input', // 指定elementui组件
placeholder: '请输入内容', // elementui组件属性
span: 24,
// rules: [{ required: true, trigger: 'blur', message: '不能为空' }],
},
]
},
showDialog: {
get() {
return this.visible
},
set(value) {
this.$emit('update:visible', value)
},
},
isEdit() {
if (this.title === '修改批次计划') {
return true
} else {
return false
}
},
columns() {
let arr = [
{ label: '序号', type: 'index', prop: '序号', width: '80px' },
{ label: '单位', prop: 'manageDeptId', width: '150px' },
{ label: '项目名称', prop: 'prjName', },
{ label: '项目经理', prop: 'projectManager', width: '200px' },
{ label: '创建人', prop: 'createMan', width: '150px' },
]
if(Object.keys(this.rowData).length != 0){
arr = [
{ label: '序号', type: 'index', prop: '序号', width: '80px' },
{ label: '单位', prop: 'manageDeptId', width: '150px' },
{ label: '项目名称', prop: 'prjName', },
{ label: '项目经理', prop: 'projectManager', width: '200px' },
{ label: '创建人', prop: 'createMan', width: '150px' },
]
}else{
arr = [
{ type: 'selection', prop: 'selection', width: '55px' },
...arr
]
}
return [...arr]
},
},
mounted() {},
methods: {
handleSubmit() {
this.$refs['addForm'].onValidate(() => {
const loading = this.$loading({
lock: true,
text: '保存中',
spinner: 'el-icon-loading',
})
const formInfo = this.$refs['addForm'].getData()
let materialType = this.formInfo.materialType.filter(item => !!item).join(',')
let params = !this.edit ? {
...formInfo,
materialType,
supervision: this.selectId
} : {
...this.rowData,
...formInfo,
materialType,
supervision: this.rowData.supervision
}
let url = !this.edit ? '/Collect/ad' : '/Collect/upd' // 编辑
this.$postRequest(url, params).then(res => {
if (res.code === 200) {
loading.close()
this.$message.success('保存成功')
this.showDialog = false
this.handleClose()
this.$emit('querySearch')
}
})
})
},
handleClose() {
this.showDialog = false
this.formOptions.forEach((v) => {
if (v.prop === 'createTime' || v.prop === 'endTime' ) {
v.initValue = new Date().format('yyyy-MM-dd')
}
})
this.$refs['addForm'].addInitValue()
this.$refs['addForm'].onReset()
},
handleOpen() {
if (Object.keys(this.rowData).length) {
this.formOptions.forEach((v) => {
v.initValue = this.rowData[v.prop]
if(v.label == "收集材料类型"){
let val = this.rowData["materialType"]
this.formInfo.materialType = val.split(',')
}
if(v.label == "督查清单"){
this.selectId = v.initValue
}
})
this.$nextTick(() => {
this.$refs['addForm'].addInitValue()
})
} else {
this.$nextTick(() => {
this.$refs['addForm'].onReset()
this.$refs['addForm'].addInitValue()
this.formInfo.materialType = []
})
}
},
addTabelList() {
this.$emit('addList')
},
selectionChange(data) {
this.selectRows = data
let idArr = []
data.forEach(item => {
idArr.push(item.prjCode)
})
this.selectId = idArr.join(',')
},
},
}
</script>
<style scoped lang="scss">
@import '@/styles/elementui.scss';
::v-deep .el-checkbox-group{
text-align: left;
}
.iconAdd{
color: #0d867f;
}
.addBtn{
float: left;
margin-bottom: 10px;
}
::v-deep .el-form{
.el-form-item:nth-last-child(2){
.el-form-item__content{
height: 32vh !important;
}
}
}
</style>
<template>
<div :class="{'addTabelList': isDetail}">
<table-config
ref="searchTable"
@selection-change="selectionChange"
:query="query"
:columns="columns"
id-key="elementId"
>
</table-config>
</div>
</template>
<script>
import TableConfig from '@/components/TableConfig.vue'
import { collectDataConfiguration } from '@/api/architectureInspection'
export default {
components: { TableConfig },
props: {
prjCode: {
type: String,
default: '',
},
isEdit: {
type: Boolean,
default: false
},
isDetail: {
type: Boolean,
default: false
}
},
watch: {
prjCode: {
handler(v){
console.log(v, 'prjCode');
this.query.queryParam.prjCode = v
this.$refs.searchTable.queryData()
},
deep: true
},
isEdit: {
handler(v){
if(v){
this.columns = [
{ label: '序号', type: 'index', width: '80px' },
{ label: '单位', prop: 'manageDeptId', width: '150px' },
{ label: '项目名称', prop: 'prjName', },
{ label: '项目经理', prop: 'projectManager', width: '200px' },
{ label: '创建人', prop: 'createMan', width: '150px' },
]
}else{
this.columns = [
{ type: 'selection', width: '55px' },
{ label: '序号', type: 'index', width: '80px' },
{ label: '单位', prop: 'manageDeptId', width: '150px' },
{ label: '项目名称', prop: 'prjName', },
{ label: '项目经理', prop: 'projectManager', width: '200px' },
{ label: '创建人', prop: 'createMan', width: '150px' },
]
}
},
}
},
data(){
return {
query: {
url: collectDataConfiguration,
method: 'post',
queryParam: {
prjCode: this.prjCode
},
},
columns: [],
}
},
methods: {
// 表格勾选的数据
selectionChange(data) {
this.selectRows = data
this.$emit('selectRows', data)
},
search(){
this.$refs.searchTable.queryData()
}
}
}
</script>
<style lang="scss" scoped>
.addTabelList{
height: 38vh;
}
</style>
\ No newline at end of file
<template>
<el-dialog
:title="title"
:visible.sync="showDialog"
width="80%"
@close="handleClose()"
>
<table-config
ref="searchTable"
:query="query"
:columns="columns"
id-key="elementId"
@selection-change="selectionChange"
>
</table-config>
<span slot="footer" class="dialog-footer">
<el-button v-if="title == '督查清单'" type="primary" @click="handleSubmit" size="mini" >保 存</el-button >
<el-button @click="handleClose()" size="mini">取 消</el-button>
</span>
</el-dialog>
</template>
<script>
import { collectDataConfiguration } from '@/api/architectureInspection'
import TableConfig from './TableConfig.vue'
export default {
components: { TableConfig },
props: {
prjCodeDetail: {
type: String,
default: '',
},
title: {
type: String,
default: '',
},
visible: {
type: Boolean,
default: false,
},
},
watch: {
prjCodeDetail(v){
this.query.queryParam.prjCode = v
this.search()
},
},
data(){
return {
query: {
url: collectDataConfiguration,
method: 'post',
queryParam: {
prjCode: ''
},
},
selectId: ''
}
},
computed: {
columns() {
let arr = [
{ label: '序号', type: 'index', prop: '序号',width: '80px' },
{ label: '单位', prop: 'manageDeptId', width: '150px' },
{ label: '项目名称', prop: 'prjName', },
{ label: '项目经理', prop: 'projectManager', width: '200px' },
{ label: '创建人', prop: 'createMan', width: '150px' },
]
if(this.title != '督查清单'){
arr = [
{ label: '序号', type: 'index',prop: '序号', width: '80px' },
{ label: '单位', prop: 'manageDeptId', width: '150px' },
{ label: '项目名称', prop: 'prjName', },
{ label: '项目经理', prop: 'projectManager', width: '200px' },
{ label: '创建人', prop: 'createMan', width: '150px' },
]
}else{
arr = [
{ type: 'selection',prop: 'selection', width: '55px' },
...arr,
]
}
return [...arr]
},
showDialog: {
get() {
return this.visible
},
set(value) {
this.$emit('update:visible', value)
},
}
},
methods: {
handleClose() {
this.showDialog = false
},
async search(){
this.$nextTick(() => {
this.$refs.searchTable.queryData()
})
},
selectionChange(data) {
let idArr = []
data.forEach(item => {
idArr.push(item.prjCode)
})
this.selectId = idArr.join(',')
},
handleSubmit(){
this.$emit('selectTabel', this.selectId)
this.handleClose()
}
}
}
</script>
<style lang="scss" scoped>
@import '@/styles/elementui.scss';
::v-deep .el-dialog__body{
height: 36vh;
}
</style>
\ No newline at end of file
<!--
* @Description: 表单组件
* @Version: 2.0
* @Autor: pan
* @Date: 2024-03-12 14:55:59
* @LastEditors: pan
* @LastEditTime: 2024-03-20 09:29:25
-->
<!-- /**
* 搜索栏公共组件
*/ -->
<template>
<div class="form-box">
<el-form
:model="formData"
ref="formRef"
:label-width="labelWidth"
:label-position="labelPosition"
>
<el-form-item v-for="(item, index) in formOptions"
:key="newKeys[index]" :prop="item.prop" :label="item.label" :rules="item.rules">
<!-- 自定义插槽,可用于特殊表单块 -->
<template v-if="item.__slotName">
<slot :name="item.__slotName" :data="item"></slot>
</template>
<SearchFormItem
v-else
v-model="formData[item.prop]"
:itemOptions="item"
/>
</el-form-item>
</el-form>
</div>
</template>
<script>
import SearchFormItem from '@/components/SearchFormItem.vue'
export default {
props: {
/**
* 表单配置
* 示例:
* [{
* label: '用户名', // label文字
* prop: 'username', // 字段名
* element: 'el-input', // 指定elementui组件
* initValue: '阿黄', // 字段初始值
* placeholder: '请输入用户名', // elementui组件属性
* rules: [{ required: true, message: '必填项', trigger: 'blur' }], // elementui组件属性
* events: { // elementui组件方法
* input (val) {
* console.log(val)
* },
* ...... // 可添加任意elementui组件支持的方法
* }
* ...... // 可添加任意elementui组件支持的属性
* }]
*/
formOptions: {
type: Array,
required: true,
default() {
return []
},
},
labelWidth: {
type: String,
default: '80px',
},
labelPosition: {
type: String,
default: 'right',
},
},
data() {
return {
formData: {},
}
},
computed: {
newKeys() {
return this.formOptions.map((v) => {
return this.createUniqueString()
})
},
},
created() {
this.addInitValue()
},
methods: {
createUniqueString() {
const timestamp = +new Date() + ''
const randomNum = parseInt((1 + Math.random()) * 65536) + ''
return (+(randomNum + timestamp)).toString(32)
},
// 校验
onValidate(callback) {
this.$refs.formRef.validate((valid) => {
if (valid) {
console.log(this.formData)
callback()
}
})
},
// 获取表单数据
getData() {
return this.formData
// this.onValidate(() => {
// this.$emit('getData', this.formData)
// })
},
// 导出
onExport() {
this.onValidate(() => {
this.$emit('onExport', this.formData)
})
},
onReset() {
this.$refs.formRef.resetFields()
},
// 添加初始值
addInitValue() {
const obj = {}
this.formOptions.forEach((v) => {
if (v.initValue !== undefined) {
obj[v.prop] = v.initValue
}
})
this.formData = obj
},
},
components: { SearchFormItem },
}
</script>
<style lang="scss" scoped>
.form-box {
margin-top: 10px;
.btn-box {
display: flex;
height: 38px;
}
.el-form {
// display: flex;
flex-wrap: wrap;
/deep/ .el-form-item__label {
flex-shrink: 0;
color: #000;
}
// el-input宽度
/deep/ .form-item {
text-align: left;
.el-input,
.el-select {
width: 30% !important;
}
}
}
}
</style>
<!--
* @Description: elementui表格组件二次封装
* @Version: 2.0
* @Autor: pan
* @Date: 2024-03-11 14:53:40
* @LastEditors: pan
* @LastEditTime: 2024-03-22 17:17:18
-->
<!-- 示例
columns: [{ label: '头像', prop: 'avatar', align: 'center', __slotName: 'avatar',callback: (row, title) => {
// console.log(row)
if (title) {
switch (title) {
case "查看":
return this.dialogShow(row);
}
}
},
}]
使用TableConfig组件
<table-config @fetchData="fetchData" :query="query" :columns="columns">
<template slot="icon" v-slot="scope">
<img slot="icon" width="40" :src="scope.data.row.avatar" />
</template>
</table-config> -->
<template>
<div class="tableConfig">
<el-table
ref="tableConfig"
class="config-table"
v-loading="loading"
v-bind="$attrs"
v-on="listeners"
:data="tableData"
:row-key="idKey"
stripe
border
height="100%"
:row-class-name="tableRowClass"
>
<!-- <el-table-column
v-if="isCheck"
align="center"
width="70"
type="selection"
:reserve-selection="isCheckMemory"
>
</el-table-column> -->
<template v-for="item in columns">
<!-- v-html存在安全问题暂时弃用 -->
<!-- 如果接口返回的内容需要我们解析出来并渲染到页面中 比如:0 代表 已停用 1 代表 已发布 2 代表 暂存 -->
<!-- <el-table-column
v-if="item.type === 'function'"
v-bind="item"
:key="item.prop"
align="center"
>
<template slot-scope="scope">
<span v-html="item.callback && item.callback(scope.row)"></span>
</template>
</el-table-column> -->
<!-- 操作列 -->
<el-table-column
v-if="item.type === 'operation'"
:key="item.prop"
v-bind="item"
align="center"
>
<template #default="scope">
<el-button
class="btn"
v-for="items in item.actionButtons"
:key="items.title"
v-bind="items"
:disabled="
items.disabledCallback
? items.disabledCallback(scope.row, items.title)
: false
"
@click="item.callback(scope.row, items.title)"
><span v-if="!items.circle">{{ items.title }}</span></el-button
>
</template>
</el-table-column>
<!-- 普通渲染 -->
<el-table-column
v-else
:key="item.prop"
v-bind="item"
show-overflow-tooltip
align="center"
>
<!-- 自定义插槽 -->
<template v-if="item.__slotName" #default="scope">
<slot :name="item.__slotName" :data="scope"></slot>
</template>
<!-- 字典值匹配 如后端给state: 0 页面要渲染成已停用-->
<template v-else-if="item.collectionType" #default="scope">
<span> {{ handleToText(item, scope.row[item.prop]) }}</span>
</template>
</el-table-column>
</template>
</el-table>
<div class="config-pagenation">
<el-pagination
class="pagination"
background
v-if="hasPagination"
@size-change="sizeChange"
@current-change="currentChange"
:total="pagination.totalRow"
:current-page="pagination.current"
:page-size="pagination.pageSize"
:page-sizes="pageSizes"
:layout="layout"
>
</el-pagination>
</div>
</div>
</template>
<script>
import { get, post } from '@/utils/http'
export default {
name: 'tableConfig',
props: {
// columns: [{ label: '头像', prop: 'avatar', align: 'center', __slotName: 'avatar' }]
// 配置项
columns: {
type: Array,
default: () => [],
},
/**
* 分页需要传入后台的字段
*/
pageParam: {
type: Object,
default() {
return {
pageOffset: 'current',
pageSize: 'pageSize',
}
},
},
// 接口参数
query: {
type: Object,
default() {
return {
url: '',
method: '',
queryParam: {},
}
},
},
/**
* 是否需要跨页勾选
*/
// isCheckMemory: {
// type: Boolean,
// default: false,
// },
// /**
// * 表格行数据的唯一键
// */
idKey: {
type: String,
default: 'id',
},
// 是否显示分页组件
hasPagination: {
type: Boolean,
default: true,
},
layout: {
type: String,
default: 'total, sizes, prev, pager, next, jumper',
},
pageSizes: {
type: Array,
default() {
return [10, 20, 50, 100, 200]
},
},
},
data() {
return {
tableData: [],
pagination: {
current: 1,
pageSize: 10,
totalRow: 0,
},
loading: false,
}
},
computed: {
listeners: function () {
var vm = this
return Object.assign({}, this.$listeners, {
'selection-change': function (val) {
// dosomething
vm.selectData = val
vm.$emit('selection-change', val)
},
})
},
},
created() {
this.queryData()
},
methods: {
clearSelection() {
this.$refs.tableConfig.clearSelection()
},
handleToText(item, state='') {
if(!state) return
if(state.indexOf(',') > -1){
let stateVal = state.split(',')
let labelValue = ''
stateVal.forEach(valItem => {
const arr = item.options.find((v) => v.value == valItem) || {}
labelValue += `,${arr.label}`
});
return labelValue.slice(1, labelValue.length)
}{
let val = state
// if (!val) {
// val = item.emptyToNum || 0
// }
// let obj = item.options.find(item => item.value == val)
const obj = item.options.find((v) => v.value == val) || {}
return obj['label']
}
},
/**
* 切换分页数量
* @param { Number } pageSize 页数
*/
sizeChange(pageSize) {
this.pagination.current = 1
this.pagination.pageSize = pageSize
this.queryData()
},
/**
* 切换页码
* @param { Number } current 页码
*/
currentChange(current) {
this.pagination.current = current
this.queryData(true)
},
async queryData(isReset) {
if (this.query && this.query.url) {
this.tableData = []
this.loading = true
this.pagination.current = isReset ? this.pagination.current : 1
let param = Object.assign({}, this.query.queryParam, {
[this.pageParam.pageOffset]: this.pagination.current,
[this.pageParam.pageSize]: this.pagination.pageSize,
})
// if (this.order.sortName && this.order.sortOrder) {
// param.sortName = this.order.sortName
// param.sortOrder = this.order.sortOrder
// }
let result = null
try {
switch (this.query.method) {
case 'get':
result = await get(this.query.url, param)
break
case 'post':
result = await post(this.query.url, param)
break
default:
result = await get(this.query.url, param)
break
}
} catch (e) {
console.warn(e)
} finally {
this.loading = false
// console.log('result', result)
if(result.data){
const { data } = result
if (result && result.code === 200) {
this.pagination.totalRow = data.total
this.tableData = data.records
this.$emit('fetchData', data)
} else {
this.$message({
type: 'warning',
message: result ? result.msg : '查询失败!',
})
this.tableData = []
this.pagination.current = 1
this.pagination.totalRow = 0
}
}else{
const data = result
this.pagination.totalRow = data.total
this.tableData = data.records
this.$emit('fetchData', data)
}
// console.log();
// if (result && result.code === 200) {
// this.pagination.totalRow = data.total
// this.tableData = data.records
// this.$emit('fetchData', data)
// } else {
// this.$message({
// type: 'warning',
// message: result ? result.msg : '查询失败!',
// })
// this.tableData = []
// this.pagination.current = 1
// this.pagination.totalRow = 0
// }
}
}
},
tableRowClass(val){
// console.log(val, 'tableRowClass');
if(val.row.remind && val.row.remind == '1'){
return 'remindRed'
}
},
},
}
</script>
<style lang="scss" scoped>
.tableConfig {
width: 100%;
height: 100%;
display: flex;
flex-direction: column;
.config-table {
flex: 1;
}
.config-pagenation {
margin-top: 20px;
margin-bottom: 30px;
}
/deep/ .remindRed{
color: red !important;
}
}
</style>
<template>
<!-- 新增 -->
<el-dialog
:title="title"
:visible.sync="showDialog"
:close-on-click-modal="false"
width="80%"
@close="handleClose()"
>
<AddTabelList @selectRows='selectRows' />
<span slot="footer" class="dialog-footer">
<el-button type="primary" @click="handleSubmit" size="mini" >保 存</el-button >
<el-button @click="handleClose()" size="mini">取 消</el-button>
</span></el-dialog>
</template>
<script>
import AddTabelList from './AddTabelList.vue'
export default {
components: { AddTabelList },
props: {
title: {
type: String,
default: '',
},
visible: {
type: Boolean,
default: false,
},
},
computed: {
showDialog: {
get() {
return this.visible
},
set(value) {
this.$emit('update:visible', value)
},
},
selectRows() {
return (rows) => {
let idArr = []
rows.forEach(item => {
idArr.push(item.prjCode)
})
this.selectId = idArr.join(',')
}
}
},
data(){
return {
selectId: '',
}
},
methods: {
handleClose() {
this.showDialog = false
},
// selectRows(v){
// console.log(v);
// },
handleSubmit() {
const loading = this.$loading({
lock: true,
text: '保存中',
spinner: 'el-icon-loading',
})
// const formInfo = this.$refs['addForm'].getData()
// const typeApi = this.isEdit ? editBatchPlan : addBatchPlan
// const params = {
// ...this.rowData,
// ...formInfo,
// state: 1,
// }
// typeApi(params).then((res) => {
// if (res.code === 200) {
// loading.close()
// this.$message.success('保存成功')
// this.showDialog = false
// this.handleClose()
// this.$emit('querySearch')
// }
// })
},
}
}
</script>
<style>
</style>
\ No newline at end of file
<template>
<div class="searchTable">
<list-page>
<!-- 查询表单插槽 -->
<template #formWrap>
<SearchForm @onSearch="querySearch" :form-options="formOptions" />
</template>
<!-- 中部操作按钮 -->
<template #operationWrap>
<el-button type="primary" icon="el-icon-document-add" size="medium" plain @click="fnAdd">新建</el-button >
</template>
<!-- 表格插槽 -->
<template #tableWrap>
<table-config
ref="searchTable"
:query="query"
:columns="columns"
id-key="elementId"
>
<template #supervision="{ data }">
<el-button v-if="data.row.supervision" class="detailBtn" size="medium" @click="detailBtn( data.row)">{{data.row.supervision}}</el-button >
<span v-else>{{data.row.supervision}}</span>
</template>
</table-config>
</template>
</list-page>
<!-- 新增弹窗 -->
<Add
@querySearch="querySearch"
:visible.sync="visible"
:row-data="rowData"
:title="dialogTitle"
@addList='addList'
:edit='isEdit'
></Add>
<!-- 详情 -->
<Detail ref="Detail" :prjCodeDetail='detailPrjCode' :visible.sync="visibleDetail" @selectTabel='selectTabel' :title="detailTitle"/>
</div>
</template>
<script>
import AddTabelList from './AddTabelList.vue'
import ListPage from '@/components/ListPage.vue'
import SearchForm from '@/components/SearchForm.vue'
import TableConfig from './TableConfig.vue'
import { collectDataSearch } from '@/api/architectureInspection'
import Add from './Add.vue'
import Detail from './Detail.vue'
import { materialTypeList, stateCode } from '@/utils/architectureInspectionDis'
export default {
name: 'collectDataConfiguration',
components: { ListPage, SearchForm, TableConfig, Add, AddTabelList, Detail },
computed: {
formOptions() {
return [
{
label: '督查方案名称', // label文字
prop: 'prjCode', // 字段名
element: 'el-input', // 指定elementui组件
placeholder: '请输入内容', // elementui组件属性
},
]
},
columns() {
return [
{ label: '序号', type: 'index', width: '80px' },
{ label: '督查方案名称', prop: 'supervName', },
{ label: '创建时间', prop: 'createTime', width: '120px' },
{ label: '材料类型', prop: 'materialType',
collectionType: 'materialTypeList',
options: materialTypeList
},
{ label: '截止时间', prop: 'endTime', width: '120px' },
{ label: '督查清单', prop: 'supervision', __slotName: 'supervision', },
{
label: '状态',
prop: 'state',
width: '120px',
collectionType: 'stateCode',
options: stateCode,
},
{ label: '备注', prop: 'notes', width: '100px' },
{
label: '操作',
type: 'operation',
width: '360px',
actionButtons: [
{
title: '编辑',
type: 'primary',
size: 'mini',
plain: true,
icon: 'el-icon-edit',
// disabledCallback: (row, title) => {
// return row.state == '1' ? true : false
// },
},
{
title: '删除',
type: 'danger',
size: 'mini',
plain: true,
icon: 'el-icon-delete',
disabledCallback: (row, title) => {
return row.state == '1' ? true : false
},
},
{
title: '发布',
size: 'mini',
icon: 'el-icon-circle-check',
type: 'primary',
plain: true,
disabledCallback: (row, title) => {
return row.state == '1' ? true : false
},
},
],
callback: (row, title) => {
this.fnOperation(row, title)
},
},
]
},
},
data(){
return {
query: {
url: collectDataSearch,
method: 'post',
queryParam: {
supervName: ''
},
},
visible: false,
rowData: {},
dialogTitle: '',
approvalVisible: false,
selectRows: [],
selectId: '',
prjCode: '',
detailTitle: '详情',
visibleDetail: false,
detailPrjCode: '',
isEdit: false
}
},
methods: {
querySearch(data) {
this.query.queryParam = {
...this.query.queryParam,
...data,
}
this.$refs.searchTable.queryData()
},
fnAdd() {
this.visible = true
this.rowData = {}
this.dialogTitle = '收集资料配置'
this.isEdit = false
},
/**
* @description: 操作按钮
* @param {Object} row 当前操作行数据
* @param {String} title 当前操作按钮名称
* @author: pan
*/
fnOperation(row, title) {
console.log('1111');
switch (title) {
case '编辑':
this.fnEdit(row)
break
case '删除':
this.fnDel(row)
break
case '发布':
this.fnSubmit(row)
default:
break
}
},
fnSubmit(row) {
this.$confirm('是否确认发布?', '提示', {
confirmButtonText: '确认',
cancelButtonText: '取消',
type: 'warning',
})
.then(() => {
const params = {
...row,
state: 2,
}
this.$postRequest('/Collect/fb', {...row}).then(res => {
if (res.code === 200) {
this.$message.success('发布成功')
this.$refs.searchTable.queryData()
} else {
this.$message.error(res.msg)
}
})
})
.catch(() => {})
},
fnDel(row) {
this.$confirm('是否确认删除?', '提示', {
confirmButtonText: '确认',
cancelButtonText: '取消',
type: 'warning',
})
.then(() => {
const params = {
...row,
delFlag: 1,
}
this.$postRequest('/Collect/del', {supervId: row.supervId}).then(res => {
if (res.code === 200) {
this.$message.success('删除成功')
this.$refs.searchTable.queryData()
} else {
this.$message.error('删除失败')
}
})
})
.catch(() => {})
},
fnEdit(row) {
this.dialogTitle = '收集资料配置'
this.rowData = row
this.visible = true
this.isEdit = true
},
addList(){
this.detailTitle = '督查清单'
this.detailPrjCode = ''
this.visibleDetail = true
},
// 督查清单 详情
detailBtn(v){
this.detailTitle = '详情'
this.detailPrjCode = v.supervision
this.visibleDetail = true
},
selectTabel(v){
let id = this.rowData.supervision
let arrV = v.split(',')
let arrId = id.split(',')
let arr = [...arrV, ...arrId]
this.rowData.supervision = !!v ? Array.from(new Set(arr)).join(',') : id
// this.rowData.supervision = !!v ? v +','+id : id
},
}
}
</script>
<style lang="scss" scoped>
.detailBtn{
border: none;
background: none;
color: #0d867f;
width: 100%;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
</style>
\ No newline at end of file
Markdown is supported
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!