feat:年前第一次正式存档以及全部修改
This commit is contained in:
parent
8636778f9d
commit
d7e9e51ebf
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@ -241,5 +241,21 @@ export default {
|
||||
EDIT_CHART_COMMONLY_USED: {
|
||||
url: '/custom/common/updateChartCommon',
|
||||
method: 'post'
|
||||
},
|
||||
GET_USER_INFO :{
|
||||
url: '/custom/xdapDeptUsersPojo/getUserInfo',
|
||||
method: 'get'
|
||||
},
|
||||
GET_YC_TODO_LIST: {
|
||||
url: '/custom/YcTaskResult/getTodoById',
|
||||
method: 'get'
|
||||
},
|
||||
GET_YC_MY_SEND_LIST: {
|
||||
url: '/custom/YcTaskResult/getInitiatorById',
|
||||
method: 'get'
|
||||
},
|
||||
GET_YC_MY_DONE_LIST: {
|
||||
url: '/custom/YcTaskResult/getCompletedById',
|
||||
method: 'get'
|
||||
}
|
||||
}
|
||||
|
||||
47
src/assets/scss/apaas-custom-hello.css
Normal file
47
src/assets/scss/apaas-custom-hello.css
Normal file
@ -0,0 +1,47 @@
|
||||
{
|
||||
font-size: 14px;
|
||||
}
|
||||
|
||||
.app-loading {
|
||||
position: absolute;
|
||||
top: 42%;
|
||||
left: 50%;
|
||||
transform: translate(-50%, -50%);
|
||||
display: flex;
|
||||
flex-flow: column;
|
||||
align-items: center;
|
||||
}
|
||||
|
||||
.app-loading .loading-gif {
|
||||
width: 60%;
|
||||
height: 60%;
|
||||
}
|
||||
|
||||
.app-ie :not(font) {
|
||||
font-family: Avenir, Helvetica, Arial, sans-serif;
|
||||
-webkit-font-smoothing: antialiased;
|
||||
-moz-osx-font-smoothing: grayscale;
|
||||
}{
|
||||
font-size: 14px;
|
||||
}
|
||||
|
||||
.app-loading {
|
||||
position: absolute;
|
||||
top: 42%;
|
||||
left: 50%;
|
||||
transform: translate(-50%, -50%);
|
||||
display: flex;
|
||||
flex-flow: column;
|
||||
align-items: center;
|
||||
}
|
||||
|
||||
.app-loading .loading-gif {
|
||||
width: 60%;
|
||||
height: 60%;
|
||||
}
|
||||
|
||||
.app-ie :not(font) {
|
||||
font-family: Avenir, Helvetica, Arial, sans-serif;
|
||||
-webkit-font-smoothing: antialiased;
|
||||
-moz-osx-font-smoothing: grayscale;
|
||||
}
|
||||
@ -138,7 +138,14 @@
|
||||
|
||||
<template slot="empty">
|
||||
<div class="table-empty">
|
||||
<x-empty-page></x-empty-page>
|
||||
<template v-if="canViewData">
|
||||
<x-empty-page></x-empty-page>
|
||||
</template>
|
||||
<template v-else>
|
||||
<div style="padding: 40px 0; text-align: center; color: #909399;">
|
||||
<div style="font-size: 14px;">无权限查看</div>
|
||||
</div>
|
||||
</template>
|
||||
</div>
|
||||
</template>
|
||||
</x-vxe-table>
|
||||
@ -221,7 +228,8 @@ export default {
|
||||
opinion: ''
|
||||
},
|
||||
approvalSubmitting: false,
|
||||
currentApprovalRow: null
|
||||
currentApprovalRow: null,
|
||||
canViewData: false // 是否有查看数据的权限
|
||||
}
|
||||
},
|
||||
computed: {
|
||||
@ -267,11 +275,80 @@ export default {
|
||||
}
|
||||
}
|
||||
},
|
||||
created() {
|
||||
mounted() {
|
||||
// 先检查 localStorage 中是否已有权限数据,如果有则先检查权限
|
||||
if (this.hasViewPermission()) {
|
||||
this.canViewData = true
|
||||
this.loadData()
|
||||
} else {
|
||||
this.canViewData = false
|
||||
this.tableData = []
|
||||
}
|
||||
// 同时加载最新的权限数据
|
||||
this.loadUserSelfRole()
|
||||
this.loadData()
|
||||
.then(() => {
|
||||
// 权限加载完成后重新检查权限
|
||||
if (this.hasViewPermission()) {
|
||||
this.canViewData = true
|
||||
// 如果之前没有权限,现在有权限了,则加载数据
|
||||
if (this.tableData.length === 0) {
|
||||
this.loadData()
|
||||
}
|
||||
} else {
|
||||
this.canViewData = false
|
||||
// 无权限时不加载数据,显示空列表
|
||||
this.tableData = []
|
||||
}
|
||||
})
|
||||
.catch(() => {
|
||||
// 如果加载权限失败,保持当前状态
|
||||
console.error('加载权限数据失败')
|
||||
})
|
||||
},
|
||||
methods: {
|
||||
// 检查是否是管理员(isAdmin === 1)
|
||||
isAdmin() {
|
||||
try {
|
||||
const permissionDataStr = localStorage.getItem('user_self_role')
|
||||
if (!permissionDataStr) {
|
||||
return false
|
||||
}
|
||||
const permissionData = JSON.parse(permissionDataStr)
|
||||
if (!Array.isArray(permissionData)) {
|
||||
return false
|
||||
}
|
||||
// 检查是否有 isAdmin === 1 的记录
|
||||
return permissionData.some((perm) => perm.isAdmin === 1 || perm.isAdmin === '1')
|
||||
} catch (err) {
|
||||
console.error('检查管理员权限失败:', err)
|
||||
return false
|
||||
}
|
||||
},
|
||||
// 检查是否有查看数据的权限
|
||||
hasViewPermission() {
|
||||
// 1. 如果是管理员,拥有全部权限
|
||||
if (this.isAdmin()) {
|
||||
return true
|
||||
}
|
||||
try {
|
||||
const permissionDataStr = localStorage.getItem('user_self_role')
|
||||
if (!permissionDataStr) {
|
||||
return false
|
||||
}
|
||||
const permissionData = JSON.parse(permissionDataStr)
|
||||
if (!Array.isArray(permissionData)) {
|
||||
return false
|
||||
}
|
||||
// 2. 检查是否有 permissionPath 包括 "参数模板审批流程" 的权限
|
||||
return permissionData.some((perm) => {
|
||||
const permissionPath = perm.permissionPath || ''
|
||||
return permissionPath.includes('参数模板审批流程')
|
||||
})
|
||||
} catch (err) {
|
||||
console.error('检查查看权限失败:', err)
|
||||
return false
|
||||
}
|
||||
},
|
||||
// 加载用户自身角色权限
|
||||
loadUserSelfRole() {
|
||||
const request = {
|
||||
@ -281,20 +358,27 @@ export default {
|
||||
},
|
||||
disableSuccessMsg: true
|
||||
}
|
||||
this.$request(request)
|
||||
.asyncThen((resp) => {
|
||||
if (resp && resp.data) {
|
||||
// 将权限数据存储到 localStorage
|
||||
try {
|
||||
localStorage.setItem('user_self_role', JSON.stringify(resp.data))
|
||||
} catch (err) {
|
||||
console.error('存储权限数据到 localStorage 失败:', err)
|
||||
return new Promise((resolve, reject) => {
|
||||
this.$request(request)
|
||||
.asyncThen((resp) => {
|
||||
if (resp && resp.data) {
|
||||
// 将权限数据存储到 localStorage
|
||||
try {
|
||||
localStorage.setItem('user_self_role', JSON.stringify(resp.data))
|
||||
resolve(resp.data)
|
||||
} catch (err) {
|
||||
console.error('存储权限数据到 localStorage 失败:', err)
|
||||
reject(err)
|
||||
}
|
||||
} else {
|
||||
resolve(null)
|
||||
}
|
||||
}
|
||||
})
|
||||
.asyncErrorCatch((err) => {
|
||||
console.error('获取用户自身角色失败:', err)
|
||||
})
|
||||
})
|
||||
.asyncErrorCatch((err) => {
|
||||
console.error('获取用户自身角色失败:', err)
|
||||
reject(err)
|
||||
})
|
||||
})
|
||||
},
|
||||
pageSizeChange(size) {
|
||||
this.pagination.pageSize = size
|
||||
|
||||
@ -683,14 +683,14 @@ export default {
|
||||
// 加载部门树数据(用于根据部门名称查找部门ID)
|
||||
loadDepartmentTree() {
|
||||
const request = {
|
||||
...api.QUERY_ORG_TREE,
|
||||
...api.GET_DEPT_OF_USER,
|
||||
disableSuccessMsg: true
|
||||
}
|
||||
this.$request(request)
|
||||
.asyncThen((resp) => {
|
||||
let result = []
|
||||
if (resp && resp.data) {
|
||||
result = resp.data.result || resp.data.data || resp.data || []
|
||||
result = resp.data.data || resp.data || []
|
||||
}
|
||||
this.departmentTreeData = this.formatDepartmentTreeData(result)
|
||||
})
|
||||
|
||||
@ -162,7 +162,16 @@
|
||||
|
||||
<template slot="empty">
|
||||
<div class="table-empty">
|
||||
<x-empty-page></x-empty-page>
|
||||
<template v-if="canViewData">
|
||||
<x-empty-page></x-empty-page>
|
||||
</template>
|
||||
<template v-else>
|
||||
<div style="padding: 40px 0; text-align: center; color: #909399;">
|
||||
<div style="font-size: 14px;">
|
||||
无权限查看
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
</div>
|
||||
</template>
|
||||
</x-vxe-table>
|
||||
@ -509,7 +518,8 @@ export default {
|
||||
currentApprovalRow: null,
|
||||
showReportDetail: false,
|
||||
currentReportDetail: null,
|
||||
downloadingRowId: ''
|
||||
downloadingRowId: '',
|
||||
canViewData: false // 是否有查看数据的权限
|
||||
}
|
||||
},
|
||||
computed: {
|
||||
@ -555,10 +565,137 @@ export default {
|
||||
}
|
||||
}
|
||||
},
|
||||
created() {
|
||||
this.loadData()
|
||||
mounted() {
|
||||
// 先检查 localStorage 中是否已有权限数据,如果有则先检查权限
|
||||
if (this.hasViewPermission()) {
|
||||
this.canViewData = true
|
||||
this.loadData()
|
||||
} else {
|
||||
this.canViewData = false
|
||||
this.tableData = []
|
||||
}
|
||||
// 同时加载最新的权限数据
|
||||
this.loadUserSelfRole()
|
||||
.then(() => {
|
||||
// 权限加载完成后重新检查权限
|
||||
if (this.hasViewPermission()) {
|
||||
this.canViewData = true
|
||||
// 如果之前没有权限,现在有权限了,则加载数据
|
||||
if (this.tableData.length === 0) {
|
||||
this.loadData()
|
||||
}
|
||||
} else {
|
||||
this.canViewData = false
|
||||
// 无权限时不加载数据,显示空列表
|
||||
this.tableData = []
|
||||
}
|
||||
})
|
||||
.catch(() => {
|
||||
// 如果加载权限失败,保持当前状态
|
||||
console.error('加载权限数据失败')
|
||||
})
|
||||
},
|
||||
methods: {
|
||||
// 检查是否是管理员(isAdmin === 1)
|
||||
isAdmin() {
|
||||
try {
|
||||
const permissionDataStr = localStorage.getItem('user_self_role')
|
||||
if (!permissionDataStr) {
|
||||
return false
|
||||
}
|
||||
const permissionData = JSON.parse(permissionDataStr)
|
||||
if (!Array.isArray(permissionData)) {
|
||||
return false
|
||||
}
|
||||
// 检查是否有 isAdmin === 1 的记录
|
||||
return permissionData.some((perm) => perm.isAdmin === 1 || perm.isAdmin === '1')
|
||||
} catch (err) {
|
||||
console.error('检查管理员权限失败:', err)
|
||||
return false
|
||||
}
|
||||
},
|
||||
// 检查是否有查看数据的权限
|
||||
hasViewPermission() {
|
||||
// 1. 如果是管理员,拥有全部权限
|
||||
if (this.isAdmin()) {
|
||||
return true
|
||||
}
|
||||
try {
|
||||
const permissionDataStr = localStorage.getItem('user_self_role')
|
||||
if (!permissionDataStr) {
|
||||
return false
|
||||
}
|
||||
const permissionData = JSON.parse(permissionDataStr)
|
||||
if (!Array.isArray(permissionData)) {
|
||||
return false
|
||||
}
|
||||
// 2. 检查是否有 permissionPath 包括 "对标报告" 的权限
|
||||
return permissionData.some((perm) => {
|
||||
const permissionPath = perm.permissionPath || ''
|
||||
return permissionPath.includes('对标报告')
|
||||
})
|
||||
} catch (err) {
|
||||
console.error('检查查看权限失败:', err)
|
||||
return false
|
||||
}
|
||||
},
|
||||
// 检查是否有报告的编辑权限
|
||||
hasReportEditPermission() {
|
||||
// 如果是管理员,拥有全部权限
|
||||
if (this.isAdmin()) {
|
||||
return true
|
||||
}
|
||||
try {
|
||||
const permissionDataStr = localStorage.getItem('user_self_role')
|
||||
if (!permissionDataStr) {
|
||||
return false
|
||||
}
|
||||
const permissionData = JSON.parse(permissionDataStr)
|
||||
if (!Array.isArray(permissionData)) {
|
||||
return false
|
||||
}
|
||||
// 检查是否有 permissionPath 为 "对标报告" 且 parameterPer 是编辑的权限
|
||||
return permissionData.some((perm) => {
|
||||
const permissionPath = perm.permissionPath || ''
|
||||
const parameterPer = perm.parameterPer || ''
|
||||
return permissionPath === '对标报告' && parameterPer === '编辑'
|
||||
})
|
||||
} catch (err) {
|
||||
console.error('检查报告编辑权限失败:', err)
|
||||
return false
|
||||
}
|
||||
},
|
||||
// 加载用户自身角色权限
|
||||
loadUserSelfRole() {
|
||||
const request = {
|
||||
...api.GET_USER_SELF_ROLE,
|
||||
params: {
|
||||
userOrDepID: getUserId()
|
||||
},
|
||||
disableSuccessMsg: true
|
||||
}
|
||||
return new Promise((resolve, reject) => {
|
||||
this.$request(request)
|
||||
.asyncThen((resp) => {
|
||||
if (resp && resp.data) {
|
||||
// 将权限数据存储到 localStorage
|
||||
try {
|
||||
localStorage.setItem('user_self_role', JSON.stringify(resp.data))
|
||||
resolve(resp.data)
|
||||
} catch (err) {
|
||||
console.error('存储权限数据到 localStorage 失败:', err)
|
||||
reject(err)
|
||||
}
|
||||
} else {
|
||||
resolve(null)
|
||||
}
|
||||
})
|
||||
.asyncErrorCatch((err) => {
|
||||
console.error('获取用户自身角色失败:', err)
|
||||
reject(err)
|
||||
})
|
||||
})
|
||||
},
|
||||
handleCreate() {
|
||||
this.dialogMode = 'create'
|
||||
this.currentRestartRow = null
|
||||
|
||||
@ -997,7 +997,9 @@ export default {
|
||||
|
||||
const request = {
|
||||
...api.GET_CHECK_DATA_Y_DATA,
|
||||
params: {},
|
||||
params: {
|
||||
userId: getUserId()
|
||||
},
|
||||
disableSuccessMsg: true
|
||||
}
|
||||
this.$request(request)
|
||||
|
||||
@ -53,9 +53,15 @@
|
||||
>
|
||||
<el-option v-for="ver in versions" :key="ver.id" :label="ver.label" :value="ver.id" />
|
||||
</el-select> -->
|
||||
<el-button size="small" @click="handleSyncVersion">
|
||||
<el-button size="small" v-if="hasAnyEditPermission() && detail &&( detail.distributeStatus === '已完成' || detail.distributeStatus === '未分发')" @click="handleSyncVersion">
|
||||
同步参数版本
|
||||
</el-button>
|
||||
<el-button
|
||||
v-if="hasAnyEditPermission() && detail && detail.distributeStatus === '已完成'"
|
||||
size="small"
|
||||
@click="handleEdit">
|
||||
编辑
|
||||
</el-button>
|
||||
<el-button
|
||||
v-if="!isEditMode && !isJustCheckMode"
|
||||
size="small"
|
||||
@ -101,6 +107,17 @@
|
||||
{{ shouldShowResendButton ? '发起' : '发起审批' }}
|
||||
</el-button>
|
||||
</template>
|
||||
<!-- 查看模式下,如果状态是已完成,显示编辑按钮或发起审批按钮 -->
|
||||
<template v-if="!isEditMode && detail && detail.distributeStatus === '已完成'">
|
||||
|
||||
<el-button
|
||||
v-if="hasSavedInCheckMode"
|
||||
type="primary"
|
||||
size="small"
|
||||
@click="handleInitiateApproval"
|
||||
>发起审批</el-button
|
||||
>
|
||||
</template>
|
||||
<template v-else-if="isEditMode">
|
||||
<el-button size="small" @click="handleSaveEdit">保存编辑</el-button>
|
||||
<el-button size="small" @click="handleCancelEdit">取消</el-button>
|
||||
@ -242,6 +259,7 @@
|
||||
size="small"
|
||||
placeholder="请输入"
|
||||
class="param-input"
|
||||
:disabled="!hasParameterEditPermission(row.parameterName, row.subsystemName, row.partsName)"
|
||||
/>
|
||||
<span v-else-if="!isEditMode && !isDispatchMode && filledBy">{{
|
||||
row.minorVersion || row.parameterValue || '/'
|
||||
@ -606,6 +624,7 @@ export default {
|
||||
approvalChangeData: [], // 审批变更数据
|
||||
resending: false, // 直送提交loading状态
|
||||
isResendMode: false, // 是否为重新发起模式
|
||||
hasSavedInCheckMode: false, // 在查看模式下是否保存过编辑
|
||||
resendApprovalData: {
|
||||
nodeList: [],
|
||||
processTitle: '',
|
||||
@ -671,6 +690,36 @@ export default {
|
||||
isJustCheckMode() {
|
||||
return this.dispatchType === 'justCheck'
|
||||
},
|
||||
// 判断在查看模式下是否应该显示编辑按钮(状态为已完成时显示)
|
||||
shouldShowEditInCheckMode() {
|
||||
// 必须是从查看按钮进入的(isJustCheckMode 为 true 且 !hideOperations)
|
||||
if (!this.isJustCheckMode || this.hideOperations) {
|
||||
return false
|
||||
}
|
||||
// 检查状态是否为"已完成"
|
||||
// 可能的状态字段:status, distributeStatus, approvalStatus
|
||||
const status = this.detail?.status || ''
|
||||
const distributeStatus = this.detail?.distributeStatus || ''
|
||||
const approvalStatus = this.detail?.approvalStatus || ''
|
||||
|
||||
// 判断是否已完成:status 为 'COMPLETE' 或 distributeStatus 为 '已分发'
|
||||
// 或者审批流程已完成(所有节点都通过)
|
||||
if (status === 'COMPLETE' || distributeStatus === '已分发') {
|
||||
return true
|
||||
}
|
||||
|
||||
// 检查审批流程是否已完成(所有节点都通过)
|
||||
if (this.flowNodes && this.flowNodes.length > 0) {
|
||||
const allPassed = this.flowNodes.every(
|
||||
(node) => node.result === 'PASS' || node.result === 'APPROVE' || node.result === '通过'
|
||||
)
|
||||
if (allPassed) {
|
||||
return true
|
||||
}
|
||||
}
|
||||
|
||||
return false
|
||||
},
|
||||
// 检查是否选中了"整车参数"节点
|
||||
isWholeEngineParamsSelected() {
|
||||
if (!this.checkedKeys || this.checkedKeys.length === 0) {
|
||||
@ -832,11 +881,11 @@ export default {
|
||||
if (this.isApprovalMode) {
|
||||
// 重新发起状态下,使用 detail.createdBy
|
||||
if (this.detail?.flowId && this.shouldShowResendButton) {
|
||||
return this.detail?.createdBy || '--'
|
||||
return this.detail?.createdBy || this.userInfo?.username || this.userInfo?.userName || '--'
|
||||
}
|
||||
// 普通发起审批状态下,使用 detail.currentProcessor
|
||||
// 普通发起审批状态下(已完成状态),优先使用 userInfo.username
|
||||
if (!this.detail?.flowId) {
|
||||
return this.detail?.currentProcessor || '--'
|
||||
return this.userInfo?.username || this.userInfo?.userName || this.detail?.currentProcessor || '--'
|
||||
}
|
||||
}
|
||||
// 其他情况使用 detail.createBy
|
||||
@ -881,7 +930,7 @@ export default {
|
||||
if (this.isApprovalMode) {
|
||||
// 发起审批状态(包括普通发起和重新发起)下,使用 detail.currentProcessor
|
||||
if (!this.detail?.flowId || (this.detail?.flowId && this.shouldShowResendButton)) {
|
||||
return this.detail?.currentProcessor || '--'
|
||||
return this.detail?.currentProcessor || this.userInfo?.userName || '--'
|
||||
}
|
||||
}
|
||||
// 其他情况使用 currentProcessor
|
||||
@ -912,6 +961,7 @@ export default {
|
||||
}
|
||||
},
|
||||
created() {
|
||||
this.getUserInfo()
|
||||
// // 获取 engineModelID,优先使用 props,其次使用 route query
|
||||
// if (
|
||||
// !this.engineModelID &&
|
||||
@ -942,6 +992,25 @@ export default {
|
||||
// this.loadEngineDetailInfo()
|
||||
},
|
||||
methods: {
|
||||
getUserInfo() {
|
||||
const request = {
|
||||
...api.GET_USER_INFO,
|
||||
params: {
|
||||
userId: getUserId()
|
||||
},
|
||||
disableSuccessMsg: true
|
||||
}
|
||||
this.$request(request)
|
||||
.asyncThen((resp) => {
|
||||
if (resp && resp.data) {
|
||||
console.log('resp.data', resp.data)
|
||||
this.userInfo = resp.data
|
||||
}
|
||||
})
|
||||
.asyncErrorCatch((err) => {
|
||||
console.error('获取用户信息失败:', err)
|
||||
})
|
||||
},
|
||||
getversions() {
|
||||
// 使用 props 的 engineModelID 作为 modelId
|
||||
if (!this.engineModelID) {
|
||||
@ -1059,10 +1128,11 @@ export default {
|
||||
},
|
||||
// 获取当前页面对应的 menuPath(根据 model 或其他信息判断)
|
||||
getMenuPath() {
|
||||
// 根据 model 或其他信息判断是玉柴还是竞品
|
||||
// 这里可以根据实际业务逻辑调整
|
||||
// 暂时返回通用的路径,或者根据实际需求调整
|
||||
return '玉柴发动机数据' // 或者 '竞品发动机数据',需要根据实际情况判断
|
||||
// 根据 detail 或其他信息判断是玉柴还是竞品
|
||||
// 可以从 detail 中获取 ycOrOth 字段,或者根据其他信息判断
|
||||
// 如果 detail 中有 ycOrOth 字段,使用它;否则默认为玉柴
|
||||
const engineType = this.detail?.ycOrOth || this.detail?.ycOrOt || '玉柴'
|
||||
return engineType === '竞品' ? '竞品发动机数据' : '玉柴发动机数据'
|
||||
},
|
||||
// 检查是否有管理员权限(isAdmin === 1)
|
||||
hasAdminPermission() {
|
||||
@ -1166,19 +1236,19 @@ export default {
|
||||
const menuPath = this.getMenuPath()
|
||||
return this.checkPermission(menuPath, subsystem, '编辑')
|
||||
},
|
||||
// 检查参数是否有编辑权限(根据parameterName匹配)
|
||||
hasParameterEditPermission(parameterName, subsystemName = null) {
|
||||
// 如果有管理员权限,拥有全部权限
|
||||
// 检查参数是否有编辑权限(根据新的权限规则)
|
||||
// parameterName: 参数名称
|
||||
// subsystemName: 子系统名称
|
||||
// partsName: 零部件名称
|
||||
hasParameterEditPermission(parameterName, subsystemName = null, partsName = null) {
|
||||
// 第一种:isAdmin 值为 1 的,全部可以编辑
|
||||
if (this.hasAdminPermission()) {
|
||||
return true
|
||||
}
|
||||
// 如果有全局编辑权限,拥有全部权限
|
||||
if (this.hasGlobalEditPermission()) {
|
||||
return true
|
||||
}
|
||||
if (!parameterName) {
|
||||
return false
|
||||
}
|
||||
|
||||
// 获取当前发动机类型对应的 permissionPath 前缀
|
||||
const engineTypePath = this.getMenuPath() // '玉柴发动机数据' 或 '竞品发动机数据'
|
||||
|
||||
try {
|
||||
const permissionDataStr = localStorage.getItem('user_self_role')
|
||||
if (!permissionDataStr) {
|
||||
@ -1189,31 +1259,86 @@ export default {
|
||||
return false
|
||||
}
|
||||
|
||||
const menuPath = this.getMenuPath()
|
||||
|
||||
// 查找匹配的权限:menuPath匹配,subsystem匹配(如果提供),parameterName匹配,且parameterPer为"编辑"
|
||||
const matchedPermissions = permissionData.filter((perm) => {
|
||||
// 检查 menuPath 是否匹配
|
||||
const menuMatch =
|
||||
perm.menuPath && (perm.menuPath.includes(menuPath) || menuPath.includes(perm.menuPath))
|
||||
if (!menuMatch) {
|
||||
return false
|
||||
}
|
||||
|
||||
// 如果提供了 subsystemName,检查是否匹配
|
||||
if (subsystemName && perm.subsystem !== subsystemName) {
|
||||
return false
|
||||
}
|
||||
|
||||
// 检查 parameterName 是否匹配
|
||||
if (perm.parameterName !== parameterName) {
|
||||
return false
|
||||
}
|
||||
|
||||
// 检查权限类型是否为"编辑"
|
||||
return perm.parameterPer === '编辑'
|
||||
// 第二种:permissionPath 是"玉柴发动机数据"或"竞品发动机数据"且 parameterPer 是"编辑"的才能全编辑
|
||||
const hasGlobalEdit = permissionData.some((perm) => {
|
||||
const permissionPath = perm.permissionPath || ''
|
||||
const parameterPer = perm.parameterPer || ''
|
||||
// 精准匹配:permissionPath 等于 engineTypePath 且 parameterPer 为"编辑"
|
||||
return permissionPath === engineTypePath && parameterPer === '编辑'
|
||||
})
|
||||
return matchedPermissions.length > 0
|
||||
|
||||
if (hasGlobalEdit) {
|
||||
return true
|
||||
}
|
||||
|
||||
// 第三种:permissionPath 的值匹配参数所属的子系统和零部件名称
|
||||
// 格式:玉柴发动机数据/点火子系统/点火线圈
|
||||
// 先提取所有编辑权限
|
||||
const editPermissions = permissionData.filter((perm) => {
|
||||
const permissionPath = perm.permissionPath || ''
|
||||
const parameterPer = perm.parameterPer || ''
|
||||
// 必须是编辑权限,且 permissionPath 以 engineTypePath 开头
|
||||
return parameterPer === '编辑' && permissionPath.startsWith(engineTypePath + '/')
|
||||
})
|
||||
|
||||
// 如果没有编辑权限,返回 false
|
||||
if (editPermissions.length === 0) {
|
||||
return false
|
||||
}
|
||||
|
||||
// 遍历编辑权限,检查是否匹配
|
||||
for (const perm of editPermissions) {
|
||||
const permissionPath = perm.permissionPath || ''
|
||||
// 分割路径:玉柴发动机数据/点火子系统/点火线圈
|
||||
const pathParts = permissionPath.split('/').filter((part) => part.trim() !== '')
|
||||
|
||||
// 路径格式应该是:engineTypePath/子系统名称/零部件名称 或 engineTypePath/子系统名称
|
||||
if (pathParts.length < 2) {
|
||||
continue
|
||||
}
|
||||
|
||||
const permEngineType = pathParts[0] // 玉柴发动机数据 或 竞品发动机数据
|
||||
|
||||
// 检查发动机类型是否匹配
|
||||
if (permEngineType !== engineTypePath) {
|
||||
continue
|
||||
}
|
||||
|
||||
// 如果路径只有两部分:engineTypePath/子系统名称
|
||||
if (pathParts.length === 2) {
|
||||
const permSubsystem = pathParts[1] // 子系统名称
|
||||
|
||||
// 检查子系统是否匹配(必须提供 subsystemName)
|
||||
if (subsystemName && permSubsystem === subsystemName) {
|
||||
// 如果 partsName 是 '/' 或 null,表示该子系统下没有具体零部件,匹配成功
|
||||
if (!partsName || partsName === '/') {
|
||||
return true
|
||||
}
|
||||
}
|
||||
} else if (pathParts.length >= 3) {
|
||||
// 路径格式:engineTypePath/子系统名称/零部件名称
|
||||
const permSubsystem = pathParts[1] // 子系统名称
|
||||
const permPartsName = pathParts[2] // 零部件名称
|
||||
|
||||
// 检查子系统是否匹配(必须提供 subsystemName)
|
||||
if (!subsystemName || permSubsystem !== subsystemName) {
|
||||
continue
|
||||
}
|
||||
|
||||
// 检查零部件名称是否匹配
|
||||
// 如果 partsName 是 '/' 或 null,不匹配(因为权限路径中有具体零部件名称)
|
||||
if (!partsName || partsName === '/') {
|
||||
continue
|
||||
}
|
||||
|
||||
// 检查零部件名称是否匹配
|
||||
if (permPartsName === partsName) {
|
||||
return true
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return false
|
||||
} catch (err) {
|
||||
console.error('检查参数权限失败:', err)
|
||||
return false
|
||||
@ -1246,16 +1371,16 @@ export default {
|
||||
return false
|
||||
}
|
||||
},
|
||||
// 检查是否有任意子系统的编辑权限
|
||||
// 检查是否有任意子系统的编辑权限(与参数编辑权限使用相同的逻辑)
|
||||
hasAnyEditPermission() {
|
||||
// 如果有管理员权限,拥有全部权限
|
||||
// 第一种:isAdmin 值为 1 的,全部可以编辑
|
||||
if (this.hasAdminPermission()) {
|
||||
return true
|
||||
}
|
||||
// 如果有全局编辑权限,拥有全部权限
|
||||
if (this.hasGlobalEditPermission()) {
|
||||
return true
|
||||
}
|
||||
|
||||
// 获取当前发动机类型对应的 permissionPath 前缀
|
||||
const engineTypePath = this.getMenuPath() // '玉柴发动机数据' 或 '竞品发动机数据'
|
||||
|
||||
try {
|
||||
const permissionDataStr = localStorage.getItem('user_self_role')
|
||||
if (!permissionDataStr) {
|
||||
@ -1266,16 +1391,28 @@ export default {
|
||||
return false
|
||||
}
|
||||
|
||||
const menuPath = this.getMenuPath()
|
||||
|
||||
// 检查是否有任意子系统的编辑权限
|
||||
const matchedPermissions = permissionData.filter((perm) => {
|
||||
const menuMatch =
|
||||
perm.menuPath && (perm.menuPath.includes(menuPath) || menuPath.includes(perm.menuPath))
|
||||
return menuMatch && perm.parameterPer === '编辑'
|
||||
// 第二种:permissionPath 是"玉柴发动机数据"或"竞品发动机数据"且 parameterPer 是"编辑"的才能全编辑
|
||||
const hasGlobalEdit = permissionData.some((perm) => {
|
||||
const permissionPath = perm.permissionPath || ''
|
||||
const parameterPer = perm.parameterPer || ''
|
||||
// 精准匹配:permissionPath 等于 engineTypePath 且 parameterPer 为"编辑"
|
||||
return permissionPath === engineTypePath && parameterPer === '编辑'
|
||||
})
|
||||
|
||||
return matchedPermissions.length > 0
|
||||
if (hasGlobalEdit) {
|
||||
return true
|
||||
}
|
||||
|
||||
// 第三种:检查是否有任何编辑权限(permissionPath 以 engineTypePath + '/' 开头且 parameterPer 是"编辑")
|
||||
// 格式:玉柴发动机数据/点火子系统/点火线圈 或 玉柴发动机数据/点火子系统
|
||||
const hasAnyEdit = permissionData.some((perm) => {
|
||||
const permissionPath = perm.permissionPath || ''
|
||||
const parameterPer = perm.parameterPer || ''
|
||||
// 必须是编辑权限,且 permissionPath 以 engineTypePath 开头(包含 '/' 分隔符)
|
||||
return parameterPer === '编辑' && permissionPath.startsWith(engineTypePath + '/')
|
||||
})
|
||||
|
||||
return hasAnyEdit
|
||||
} catch (err) {
|
||||
console.error('检查编辑权限失败:', err)
|
||||
return false
|
||||
@ -1953,6 +2090,11 @@ export default {
|
||||
this.originalData = null
|
||||
this.changeData = [] // 清空修改数据
|
||||
|
||||
// 如果在查看模式下保存编辑,标记为已保存,以便显示发起审批按钮
|
||||
if (this.isJustCheckMode) {
|
||||
this.hasSavedInCheckMode = true
|
||||
}
|
||||
|
||||
// 重新加载数据
|
||||
this.loadEngineDetail()
|
||||
this.$message({
|
||||
@ -1987,6 +2129,7 @@ export default {
|
||||
this.isEditMode = false
|
||||
this.originalData = null
|
||||
this.changeData = [] // 清空修改数据
|
||||
// 取消编辑时,如果在查看模式下,不重置 hasSavedInCheckMode(保持已保存状态)
|
||||
},
|
||||
handleBatchModifyResponsible() {
|
||||
// 直接打开弹窗,弹窗内部会处理数据加载
|
||||
@ -2284,6 +2427,7 @@ export default {
|
||||
...api.GET_ENGINE_TABLE_DETAIL,
|
||||
params: {
|
||||
modelID: this.detail.id,
|
||||
userID: getUserId(),
|
||||
parameterVersion: this.currentVersionId || 1 // 默认版本为1
|
||||
},
|
||||
disableSuccessMsg: true
|
||||
@ -2399,24 +2543,11 @@ export default {
|
||||
|
||||
const secondLevelData = data[firstLevelKey]
|
||||
if (typeof secondLevelData === 'object' && !Array.isArray(secondLevelData)) {
|
||||
// 检查是否有管理员权限
|
||||
const isAdmin = this.hasAdminPermission()
|
||||
|
||||
// 遍历第二级(子系统名称,如 "整车参数"、"起动子系统")
|
||||
Object.keys(secondLevelData).forEach((subsystemName, secondIdx) => {
|
||||
const secondLevelId = `${firstLevelId}-${secondIdx}`
|
||||
const isWholeEngineParams = subsystemName === '整车参数'
|
||||
|
||||
// 权限判断:如果有管理员权限,全部显示;否则检查子系统权限
|
||||
// "整车参数"始终显示
|
||||
if (!isWholeEngineParams && !isAdmin) {
|
||||
// 检查子系统是否有权限
|
||||
if (!this.hasSubsystemPermission(subsystemName)) {
|
||||
// 没有权限,跳过该子系统
|
||||
return
|
||||
}
|
||||
}
|
||||
|
||||
const thirdLevelParams = secondLevelData[subsystemName] || []
|
||||
const thirdLevelChildren = []
|
||||
|
||||
@ -3299,7 +3430,11 @@ export default {
|
||||
this.isApprovalMode = true
|
||||
// 重置表单数据,设置流程主题默认值
|
||||
const productModel = this.detail?.modelName || '产品型号'
|
||||
const statusCode = this.detail?.productNumber || '状态代号'
|
||||
// 从整车参数中获取状态代号的值
|
||||
const wholeEngineParams = this.wholeEngineParamsData['整车参数'] || []
|
||||
const statusCodeParam = wholeEngineParams.find(param => param.parameterName === '状态代号' || param.parameterName === '产品代号')
|
||||
const statusCode = statusCodeParam?.parameterValue || this.detail?.productNumber || '状态代号'
|
||||
console.log('statusCode', statusCode,statusCodeParam)
|
||||
this.approvalFormData = {
|
||||
processTitle: `${productModel}-${statusCode}发起审批`,
|
||||
description: ''
|
||||
@ -3424,7 +3559,10 @@ export default {
|
||||
this.isApprovalMode = true
|
||||
// 重置表单数据,设置流程主题默认值
|
||||
const productModel = this.detail?.modelName || '产品型号'
|
||||
const statusCode = this.detail?.productNumber || '状态代号'
|
||||
const wholeEngineParams = this.wholeEngineParamsData['整车参数'] || []
|
||||
const statusCodeParam = wholeEngineParams.find(param => param.parameterName === '状态代号' || param.parameterName === '产品代号')
|
||||
const statusCode = statusCodeParam?.parameterValue || this.detail?.productNumber || '状态代号'
|
||||
console.log('statusCode', statusCode,statusCodeParam)
|
||||
this.approvalFormData = {
|
||||
processTitle: `${productModel}-${statusCode}发起审批`,
|
||||
description: ''
|
||||
@ -3542,6 +3680,7 @@ export default {
|
||||
loading: false
|
||||
}
|
||||
]
|
||||
// 取消审批时,如果在查看模式下,不重置 hasSavedInCheckMode(保持已保存状态,可以再次发起审批)
|
||||
},
|
||||
// 检查是否可以直送
|
||||
canResendApproval() {
|
||||
@ -3925,6 +4064,10 @@ export default {
|
||||
})
|
||||
this.approvalSubmitting = false
|
||||
this.isApprovalMode = false
|
||||
// 审批提交成功后,重置查看模式下的保存标志
|
||||
if (this.isJustCheckMode) {
|
||||
this.hasSavedInCheckMode = false
|
||||
}
|
||||
this.handleBack()
|
||||
})
|
||||
.asyncErrorCatch((err) => {
|
||||
@ -3959,6 +4102,10 @@ export default {
|
||||
})
|
||||
this.approvalSubmitting = false
|
||||
this.isApprovalMode = false
|
||||
// 审批提交成功后,重置查看模式下的保存标志
|
||||
if (this.isJustCheckMode) {
|
||||
this.hasSavedInCheckMode = false
|
||||
}
|
||||
this.handleBack()
|
||||
})
|
||||
.asyncErrorCatch((err) => {
|
||||
@ -4010,6 +4157,10 @@ export default {
|
||||
})
|
||||
this.approvalSubmitting = false
|
||||
this.isApprovalMode = false
|
||||
// 审批提交成功后,重置查看模式下的保存标志
|
||||
if (this.isJustCheckMode) {
|
||||
this.hasSavedInCheckMode = false
|
||||
}
|
||||
this.handleBack()
|
||||
})
|
||||
.asyncErrorCatch((err) => {
|
||||
|
||||
@ -5,7 +5,7 @@
|
||||
<div class="title">
|
||||
责任人管理
|
||||
</div>
|
||||
<div>
|
||||
<div v-if="hasEditPermission()">
|
||||
<el-button type="primary" @click="handleAdd">
|
||||
新增
|
||||
</el-button>
|
||||
@ -61,6 +61,7 @@
|
||||
align="center"
|
||||
/>
|
||||
<el-table-column
|
||||
v-if="hasEditPermission()"
|
||||
label="操作"
|
||||
width="200"
|
||||
align="center"
|
||||
@ -83,6 +84,24 @@
|
||||
</a>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<template slot="empty">
|
||||
<div class="table-empty">
|
||||
<template v-if="canViewData">
|
||||
<div style="padding: 40px 0; text-align: center; color: #909399;">
|
||||
<div style="font-size: 14px;">
|
||||
暂无数据
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
<template v-else>
|
||||
<div style="padding: 40px 0; text-align: center; color: #909399;">
|
||||
<div style="font-size: 14px;">
|
||||
无权限查看
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
</div>
|
||||
</template>
|
||||
</el-table>
|
||||
<div class="pagination-section">
|
||||
<el-pagination
|
||||
@ -312,7 +331,8 @@ export default {
|
||||
importDialogVisible: false, // 导入弹窗显示状态
|
||||
importFileList: [], // 导入文件列表
|
||||
selectedImportFile: null, // 选中的导入文件
|
||||
importing: false // 导入中状态
|
||||
importing: false, // 导入中状态
|
||||
canViewData: false // 是否有查看数据的权限
|
||||
}
|
||||
},
|
||||
computed: {
|
||||
@ -327,9 +347,36 @@ export default {
|
||||
},
|
||||
mounted() {
|
||||
this.loadDepartmentList()
|
||||
this.loadManagerData()
|
||||
this.isResponsible()
|
||||
this.loadSubsystemList()
|
||||
// 先检查 localStorage 中是否已有权限数据,如果有则先检查权限
|
||||
if (this.hasViewPermission()) {
|
||||
this.canViewData = true
|
||||
this.loadManagerData()
|
||||
} else {
|
||||
this.canViewData = false
|
||||
this.tableData = []
|
||||
}
|
||||
// 同时加载最新的权限数据
|
||||
this.loadUserSelfRole()
|
||||
.then(() => {
|
||||
// 权限加载完成后重新检查权限
|
||||
if (this.hasViewPermission()) {
|
||||
this.canViewData = true
|
||||
// 如果之前没有权限,现在有权限了,则加载数据
|
||||
if (this.tableData.length === 0) {
|
||||
this.loadManagerData()
|
||||
}
|
||||
} else {
|
||||
this.canViewData = false
|
||||
// 无权限时不加载数据,显示空列表
|
||||
this.tableData = []
|
||||
}
|
||||
})
|
||||
.catch(() => {
|
||||
// 如果加载权限失败,保持当前状态
|
||||
console.error('加载权限数据失败')
|
||||
})
|
||||
},
|
||||
beforeDestroy() {
|
||||
// 清理定时器和请求
|
||||
@ -340,6 +387,111 @@ export default {
|
||||
this.currentRequest = null
|
||||
},
|
||||
methods: {
|
||||
// 检查是否是管理员(isAdmin === 1)
|
||||
isAdmin() {
|
||||
try {
|
||||
const permissionDataStr = localStorage.getItem('user_self_role')
|
||||
if (!permissionDataStr) {
|
||||
return false
|
||||
}
|
||||
const permissionData = JSON.parse(permissionDataStr)
|
||||
if (!Array.isArray(permissionData)) {
|
||||
return false
|
||||
}
|
||||
// 检查是否有 isAdmin === 1 的记录
|
||||
return permissionData.some((perm) => perm.isAdmin === 1 || perm.isAdmin === '1')
|
||||
} catch (err) {
|
||||
console.error('检查管理员权限失败:', err)
|
||||
return false
|
||||
}
|
||||
},
|
||||
// 检查是否有查看数据的权限
|
||||
hasViewPermission() {
|
||||
// 1. 如果是管理员,拥有全部权限
|
||||
if (this.isAdmin()) {
|
||||
return true
|
||||
}
|
||||
try {
|
||||
const permissionDataStr = localStorage.getItem('user_self_role')
|
||||
if (!permissionDataStr) {
|
||||
return false
|
||||
}
|
||||
const permissionData = JSON.parse(permissionDataStr)
|
||||
if (!Array.isArray(permissionData)) {
|
||||
return false
|
||||
}
|
||||
// 2. 检查是否有 permissionPath 等于 "基础管理模块" 的权限(查看或编辑)
|
||||
return permissionData.some((perm) => {
|
||||
const permissionPath = perm.permissionPath || ''
|
||||
return permissionPath === '基础管理模块'
|
||||
})
|
||||
} catch (err) {
|
||||
console.error('检查查看权限失败:', err)
|
||||
return false
|
||||
}
|
||||
},
|
||||
// 检查是否有编辑权限
|
||||
hasEditPermission() {
|
||||
// 1. 如果是管理员,拥有全部权限
|
||||
if (this.isAdmin()) {
|
||||
return true
|
||||
}
|
||||
try {
|
||||
const permissionDataStr = localStorage.getItem('user_self_role')
|
||||
if (!permissionDataStr) {
|
||||
return false
|
||||
}
|
||||
const permissionData = JSON.parse(permissionDataStr)
|
||||
if (!Array.isArray(permissionData)) {
|
||||
return false
|
||||
}
|
||||
// 2. 检查是否有 permissionPath 等于 "基础管理模块" 且 parameterPer 是 "编辑" 的权限
|
||||
// 检查所有 user-self-role,只要有一个是编辑权限就返回 true
|
||||
return permissionData.some((perm) => {
|
||||
const permissionPath = perm.permissionPath || ''
|
||||
const parameterPer = perm.parameterPer || ''
|
||||
// 检查 permissionPath 是否等于 "基础管理模块" 且 parameterPer 是 "编辑" 或 2
|
||||
return (
|
||||
permissionPath === '基础管理模块' &&
|
||||
(parameterPer === '编辑' || parameterPer === 2 || parameterPer === '2')
|
||||
)
|
||||
})
|
||||
} catch (err) {
|
||||
console.error('检查编辑权限失败:', err)
|
||||
return false
|
||||
}
|
||||
},
|
||||
// 加载用户自身角色权限
|
||||
loadUserSelfRole() {
|
||||
const request = {
|
||||
...api.GET_USER_SELF_ROLE,
|
||||
params: {
|
||||
userOrDepID: getUserId()
|
||||
},
|
||||
disableSuccessMsg: true
|
||||
}
|
||||
return new Promise((resolve, reject) => {
|
||||
this.$request(request)
|
||||
.asyncThen((resp) => {
|
||||
if (resp && resp.data) {
|
||||
// 将权限数据存储到 localStorage
|
||||
try {
|
||||
localStorage.setItem('user_self_role', JSON.stringify(resp.data))
|
||||
resolve(resp.data)
|
||||
} catch (err) {
|
||||
console.error('存储权限数据到 localStorage 失败:', err)
|
||||
reject(err)
|
||||
}
|
||||
} else {
|
||||
resolve(null)
|
||||
}
|
||||
})
|
||||
.asyncErrorCatch((err) => {
|
||||
console.error('获取用户自身角色失败:', err)
|
||||
reject(err)
|
||||
})
|
||||
})
|
||||
},
|
||||
loadSubsystemList() {
|
||||
const request = {
|
||||
...api.GET_SUBSYSTEM_LIST,
|
||||
@ -418,20 +570,17 @@ export default {
|
||||
},
|
||||
loadDepartmentList() {
|
||||
const request = {
|
||||
...api.QUERY_ORG_TREE,
|
||||
// params: {
|
||||
// departmentId: this.formData.departmentId
|
||||
// },
|
||||
...api.GET_DEPT_OF_USER,
|
||||
disableSuccessMsg: true
|
||||
}
|
||||
this.$request(request)
|
||||
.asyncThen((resp) => {
|
||||
// 处理返回的数据,确保格式为 { id, name, children }
|
||||
// 处理返回的数据,确保格式为 { id, name }
|
||||
let result = []
|
||||
if (resp && resp.data) {
|
||||
result = resp.data.result || resp.data.data || resp.data || []
|
||||
result = resp.data
|
||||
}
|
||||
// 格式化数据为级联选择器需要的格式
|
||||
// 格式化数据为树形结构需要的格式(只有一级树)
|
||||
this.departmentList = this.formatDepartmentTreeData(result)
|
||||
})
|
||||
.asyncErrorCatch((err) => {
|
||||
@ -439,29 +588,17 @@ export default {
|
||||
this.departmentList = []
|
||||
})
|
||||
},
|
||||
// 格式化部门树数据为级联选择器格式
|
||||
// 格式化部门树数据为树形结构格式(只有一级树)
|
||||
formatDepartmentTreeData(data) {
|
||||
if (!Array.isArray(data)) {
|
||||
return []
|
||||
}
|
||||
|
||||
// 递归格式化数据,确保每个节点都有 id 和 name 字段
|
||||
const formatNode = (node) => {
|
||||
const formatted = {
|
||||
id: node.id,
|
||||
name: node.name || node.label || '',
|
||||
children: undefined
|
||||
}
|
||||
|
||||
// 如果有子节点,递归格式化
|
||||
if (node.children && Array.isArray(node.children) && node.children.length > 0) {
|
||||
formatted.children = node.children.map(child => formatNode(child))
|
||||
}
|
||||
|
||||
return formatted
|
||||
}
|
||||
|
||||
return data.map(node => formatNode(node))
|
||||
// 格式化数据,确保每个节点都有 id 和 name 字段(只有一级,不需要递归)
|
||||
return data.map((node) => ({
|
||||
id: node.id,
|
||||
name: node.name
|
||||
}))
|
||||
},
|
||||
handleAdd() {
|
||||
this.dialogMode = 'add'
|
||||
|
||||
@ -160,33 +160,42 @@
|
||||
@close="handleAddModelDialogClose"
|
||||
>
|
||||
<div class="model-select-dialog">
|
||||
<el-input
|
||||
v-model="modelSearchText"
|
||||
placeholder="请输入产品型号,状态代号/产品编号,平台,系列搜索"
|
||||
prefix-icon="el-icon-search"
|
||||
clearable
|
||||
class="model-search-input"
|
||||
></el-input>
|
||||
<div class="model-list-wrapper">
|
||||
<el-table
|
||||
ref="modelTable"
|
||||
:data="filteredModelList"
|
||||
height="400"
|
||||
@selection-change="handleModelSelectionChange"
|
||||
>
|
||||
<el-table-column type="selection" width="55" />
|
||||
<el-table-column prop="modelName" label="产品型号" min-width="150" />
|
||||
<el-table-column prop="parameterVersion" label="机型版本" min-width="70"
|
||||
<template v-if="!isUserPermissionsEmpty()">
|
||||
<el-input
|
||||
v-model="modelSearchText"
|
||||
placeholder="请输入产品型号,状态代号/产品编号,平台,系列搜索"
|
||||
prefix-icon="el-icon-search"
|
||||
clearable
|
||||
class="model-search-input"
|
||||
></el-input>
|
||||
<div class="model-list-wrapper">
|
||||
<el-table
|
||||
ref="modelTable"
|
||||
:data="filteredModelList"
|
||||
height="400"
|
||||
@selection-change="handleModelSelectionChange"
|
||||
>
|
||||
<template slot-scope="scope">
|
||||
<span>V{{ scope.row.parameterVersion }}</span>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column prop="productNumber" label="状态代号/产品编号" min-width="100" />
|
||||
<el-table-column prop="platform" label="平台" min-width="70" />
|
||||
<el-table-column prop="series" label="系列" min-width="70" />
|
||||
</el-table>
|
||||
</div>
|
||||
<el-table-column type="selection" width="55" />
|
||||
<el-table-column prop="modelName" label="产品型号" min-width="150" />
|
||||
<el-table-column prop="parameterVersion" label="机型版本" min-width="70"
|
||||
>
|
||||
<template slot-scope="scope">
|
||||
<span>V{{ scope.row.parameterVersion }}</span>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column prop="productNumber" label="状态代号/产品编号" min-width="100" />
|
||||
<el-table-column prop="platform" label="平台" min-width="70" />
|
||||
<el-table-column prop="series" label="系列" min-width="70" />
|
||||
</el-table>
|
||||
</div>
|
||||
</template>
|
||||
<template v-else>
|
||||
<div style="padding: 40px 0; text-align: center; color: #909399;">
|
||||
<div style="font-size: 14px;">
|
||||
无权限查看
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
</div>
|
||||
<span slot="footer" class="dialog-footer">
|
||||
<el-button @click="handleAddModelDialogClose">取消</el-button>
|
||||
@ -292,6 +301,7 @@
|
||||
<script>
|
||||
import api from '@/api'
|
||||
import { getUserId } from '@/utils'
|
||||
import '@/assets/scss/apaas-custom-hello.css'
|
||||
|
||||
export default {
|
||||
name: 'ModelQuery',
|
||||
@ -342,7 +352,9 @@ export default {
|
||||
// 保存完整的参数数据(不受常用配置影响,用于树节点选中时展示)
|
||||
savedAllParametersData: {}, // 格式:{ "子系统名称": [{ parameterName, parameterId, ... }] }
|
||||
// 是否使用常用配置过滤(当选中常用时为 true,当用户再次选中树节点时为 false)
|
||||
useCommonFilter: false
|
||||
useCommonFilter: false,
|
||||
// 用户权限数据
|
||||
userPermissions: [] // 从 localStorage 中获取的权限数据
|
||||
}
|
||||
},
|
||||
computed: {
|
||||
@ -596,13 +608,183 @@ export default {
|
||||
if (this.$refs.paramTree && this.treeFilterText) {
|
||||
this.$refs.paramTree.filter(this.treeFilterText)
|
||||
}
|
||||
},
|
||||
// 监听权限数据变化,权限更新后强制重新渲染
|
||||
userPermissions: {
|
||||
handler() {
|
||||
// 权限数据更新后,强制重新渲染参数值
|
||||
this.$nextTick(() => {
|
||||
this.$forceUpdate()
|
||||
})
|
||||
},
|
||||
deep: true
|
||||
}
|
||||
},
|
||||
mounted() {
|
||||
// 加载用户权限数据
|
||||
this.loadUserSelfRole()
|
||||
// 加载树数据(参数完成后会自动调用 loadFavoritesList)
|
||||
console.log('加载树数据')
|
||||
this.loadTreeData()
|
||||
},
|
||||
methods: {
|
||||
// 加载用户自身角色权限
|
||||
loadUserSelfRole() {
|
||||
// 先从 localStorage 读取(快速显示)
|
||||
try {
|
||||
const permissionDataStr = localStorage.getItem('user_self_role')
|
||||
if (permissionDataStr) {
|
||||
this.userPermissions = JSON.parse(permissionDataStr)
|
||||
}
|
||||
} catch (err) {
|
||||
console.error('从 localStorage 加载用户权限数据失败:', err)
|
||||
}
|
||||
|
||||
// 然后从 API 加载最新数据
|
||||
const request = {
|
||||
...api.GET_USER_SELF_ROLE,
|
||||
params: {
|
||||
userOrDepID: getUserId()
|
||||
},
|
||||
disableSuccessMsg: true
|
||||
}
|
||||
this.$request(request)
|
||||
.asyncThen((resp) => {
|
||||
if (resp && resp.data) {
|
||||
this.userPermissions = resp.data
|
||||
// 同时更新 localStorage
|
||||
try {
|
||||
localStorage.setItem('user_self_role', JSON.stringify(resp.data))
|
||||
} catch (err) {
|
||||
console.error('存储权限数据到 localStorage 失败:', err)
|
||||
}
|
||||
// 权限数据加载完成后,强制重新渲染(确保权限检查生效)
|
||||
this.$nextTick(() => {
|
||||
this.$forceUpdate()
|
||||
})
|
||||
}
|
||||
})
|
||||
.asyncErrorCatch((err) => {
|
||||
console.error('获取用户自身角色失败:', err)
|
||||
})
|
||||
},
|
||||
// 检查是否是管理员(isAdmin === 1)
|
||||
isAdmin() {
|
||||
if (!this.userPermissions || !Array.isArray(this.userPermissions)) {
|
||||
return false
|
||||
}
|
||||
return this.userPermissions.some((perm) => perm.isAdmin === 1 || perm.isAdmin === '1')
|
||||
},
|
||||
// 检查用户权限是否为空数组
|
||||
isUserPermissionsEmpty() {
|
||||
return !this.userPermissions || !Array.isArray(this.userPermissions) || this.userPermissions.length === 0
|
||||
},
|
||||
// 检查是否有权限查看参数值
|
||||
// model: 机型对象,包含 id, parameterVersion
|
||||
// param: 参数对象,包含 subsystemName, partsName
|
||||
hasParamPermission(model, param) {
|
||||
// 1. 如果是管理员,拥有全部权限
|
||||
if (this.isAdmin()) {
|
||||
return true
|
||||
}
|
||||
|
||||
if (!this.userPermissions || !Array.isArray(this.userPermissions) || this.userPermissions.length === 0) {
|
||||
// 如果没有权限数据,显示 `-`
|
||||
return false
|
||||
}
|
||||
|
||||
// 获取机型的 ycOrOth 值
|
||||
const modelKey = `${model.id}_${model.parameterVersion || 1}`
|
||||
const modelRawData = this.allModelRawData[modelKey]
|
||||
const ycOrOth = (modelRawData && modelRawData.ycOrOth) || ''
|
||||
|
||||
// 判断机型类型:玉柴还是竞品
|
||||
// ycOrOth 的值可能是 "玉柴"、"YC"、"竞品" 等
|
||||
const isYuchai = ycOrOth === '玉柴' || ycOrOth === 'YC' || ycOrOth === 'yc'
|
||||
const engineType = isYuchai ? '玉柴发动机数据' : '竞品发动机数据'
|
||||
|
||||
// 获取参数的子系统和零部件名称
|
||||
const subsystemName = param.subsystemName || ''
|
||||
// partsName 可能为空或为 '/',需要处理
|
||||
let partsName = param.partsName || ''
|
||||
// 如果 partsName 为空或为 '/',使用空字符串进行匹配
|
||||
if (partsName === '/') {
|
||||
partsName = ''
|
||||
}
|
||||
|
||||
// 收集所有相关的权限路径(包含对应发动机数据类型的权限)
|
||||
const relevantPermissions = this.userPermissions.filter((perm) => {
|
||||
const permissionPath = perm.permissionPath || ''
|
||||
// 检查是否包含对应的发动机数据类型
|
||||
return permissionPath.includes(engineType)
|
||||
})
|
||||
|
||||
if (relevantPermissions.length === 0) {
|
||||
// 规则3:如果没有任何相关权限,全部参数值显示 `-`
|
||||
return false
|
||||
}
|
||||
|
||||
// 检查是否有精确权限(三级路径:玉柴发动机数据/子系统/零部件)
|
||||
const exactPermissions = relevantPermissions.filter((perm) => {
|
||||
const permissionPath = perm.permissionPath || ''
|
||||
if (permissionPath.startsWith(engineType + '/')) {
|
||||
const pathParts = permissionPath.split('/')
|
||||
return pathParts.length >= 3
|
||||
}
|
||||
return false
|
||||
})
|
||||
|
||||
// 规则2:检查是否有通用权限(permissionPath 只包含"玉柴发动机数据"或"竞品发动机数据",或只有两级)
|
||||
// 如果没有任何精确权限,只要有通用权限就允许查看所有参数
|
||||
if (exactPermissions.length === 0) {
|
||||
// 检查是否有通用权限(只有菜单名,或只有菜单名/子系统)
|
||||
const hasGeneralPermission = relevantPermissions.some((perm) => {
|
||||
const permissionPath = perm.permissionPath || ''
|
||||
// 只有菜单名,或只有菜单名/子系统(两级),都表示对该类型的所有参数都有权限
|
||||
const pathParts = permissionPath.split('/')
|
||||
return permissionPath === engineType || (permissionPath.startsWith(engineType + '/') && pathParts.length === 2)
|
||||
})
|
||||
|
||||
if (hasGeneralPermission) {
|
||||
// 规则2:如果有通用权限,对应的机型不做调整,正常显示所有参数
|
||||
return true
|
||||
} else {
|
||||
// 规则3:如果不在规则1和规则2中,全部参数值显示 `-`
|
||||
return false
|
||||
}
|
||||
}
|
||||
|
||||
// 规则4:如果有精确权限,需要精确匹配
|
||||
// 检查是否有精确匹配的权限路径(格式:玉柴发动机数据/子系统/零部件)
|
||||
// 需要精确匹配:机型类型、子系统、零部件名称
|
||||
const hasExactPermission = exactPermissions.some((perm) => {
|
||||
const permissionPath = perm.permissionPath || ''
|
||||
if (permissionPath.startsWith(engineType + '/')) {
|
||||
const pathParts = permissionPath.split('/')
|
||||
if (pathParts.length >= 3) {
|
||||
const permSubsystem = pathParts[1] || ''
|
||||
const permPartsName = pathParts[2] || ''
|
||||
// 精确匹配子系统和零部件名称
|
||||
// 如果 partsName 为空,需要特殊处理(可能表示整个子系统)
|
||||
if (partsName === '' && permPartsName === '') {
|
||||
// 如果参数没有零部件名称,权限也没有零部件名称,只要子系统匹配即可
|
||||
return permSubsystem === subsystemName
|
||||
}
|
||||
// 精确匹配子系统和零部件
|
||||
return permSubsystem === subsystemName && permPartsName === partsName
|
||||
}
|
||||
}
|
||||
return false
|
||||
})
|
||||
|
||||
if (hasExactPermission) {
|
||||
// 规则4:如果有精确匹配的权限,正常显示
|
||||
return true
|
||||
}
|
||||
|
||||
// 规则3:如果不在规则1和规则2中,且没有精确匹配,全部参数值显示 `-`
|
||||
return false
|
||||
},
|
||||
filterTreeNode(value, data) {
|
||||
if (!value) return true
|
||||
const searchValue = value.toLowerCase()
|
||||
@ -659,7 +841,7 @@ export default {
|
||||
this.reloadModelDetailsForCheckedNodes()
|
||||
},
|
||||
getParamValue(model, param) {
|
||||
// param 是 { parameterName, subsystemName, parameterId }
|
||||
// param 是 { parameterName, subsystemName, parameterId, partsName }
|
||||
if (!model || !model.id || !param) {
|
||||
return '-'
|
||||
}
|
||||
@ -668,6 +850,12 @@ export default {
|
||||
const parameterVersion = model.parameterVersion || 1
|
||||
const modelKey = `${model.id}_${parameterVersion}`
|
||||
|
||||
// 在页面渲染完成后,根据权限调整参数值显示
|
||||
// 检查是否有权限查看该参数值
|
||||
if (!this.hasParamPermission(model, param)) {
|
||||
return '-'
|
||||
}
|
||||
|
||||
// 如果是"整车参数"子系统,且是特定的参数,直接从机型原始数据中获取
|
||||
if (param.subsystemName === '整车参数') {
|
||||
const paramNameToFieldMap = {
|
||||
@ -830,6 +1018,7 @@ export default {
|
||||
productNumber: model.productNumber || '',
|
||||
plate: model.plate || '',
|
||||
platform: model.platform || '',
|
||||
ycOrOth: model.ycOrOth || '',
|
||||
series: model.series || '',
|
||||
marketSegment: model.marketSegment || '',
|
||||
projectName: model.projectName || '',
|
||||
@ -1001,7 +1190,7 @@ export default {
|
||||
}
|
||||
}
|
||||
|
||||
// 确保 allModelRawData 中有该机型的原始数据(用于整车参数显示)
|
||||
// 确保 allModelRawData 中有该机型的原始数据(用于整车参数显示和权限判断)
|
||||
const modelKey = `${modelId}_${parameterVersion}`
|
||||
if (!this.allModelRawData[modelKey]) {
|
||||
this.$set(this.allModelRawData, modelKey, {
|
||||
@ -1009,12 +1198,18 @@ export default {
|
||||
productNumber: modelData.productNumber || '',
|
||||
plate: modelData.plate || '',
|
||||
platform: modelData.platform || '',
|
||||
ycOrOth: modelData.ycOrOth || '',
|
||||
series: modelData.series || '',
|
||||
marketSegment: modelData.marketSegment || '',
|
||||
projectName: modelData.projectName || '',
|
||||
projectNumber: modelData.projectNumber || '',
|
||||
parameterNum: modelData.parameterNum || ''
|
||||
})
|
||||
} else {
|
||||
// 如果已存在,确保 ycOrOth 值已保存
|
||||
if (!this.allModelRawData[modelKey].ycOrOth && modelData.ycOrOth) {
|
||||
this.$set(this.allModelRawData[modelKey], 'ycOrOth', modelData.ycOrOth)
|
||||
}
|
||||
}
|
||||
|
||||
// 重新加载该机型的参数数据
|
||||
@ -1358,6 +1553,7 @@ export default {
|
||||
},
|
||||
// 根据可显示的参数更新树节点选中状态(不改变树数据)
|
||||
updateCheckedKeysByDisplayParams() {
|
||||
console.log('根据可显示的参数更新树节点选中状态(不改变树数据)');
|
||||
// 确保使用完整的树数据和节点映射
|
||||
this.treeData = JSON.parse(JSON.stringify(this.allTreeData))
|
||||
this.nodeMap = JSON.parse(JSON.stringify(this.allNodeMap))
|
||||
@ -1557,7 +1753,6 @@ export default {
|
||||
if (subsystemNames.length === 0 && parameterTypes.length === 0) {
|
||||
return
|
||||
}
|
||||
|
||||
// 构建常用配置中的参数映射:subsystem -> Set<parameterKey>
|
||||
// parameterKey 格式:优先使用 parameterId,如果没有则使用 parameterName
|
||||
// 对于 isGlobal === 1 的参数,归类到"整车参数"子系统
|
||||
@ -2104,13 +2299,15 @@ export default {
|
||||
},
|
||||
// 加载树数据
|
||||
loadTreeData() {
|
||||
console.log('加载树数据,调用接口获取树数据')
|
||||
// 先加载所有参数数据,然后根据参数数据构建树结构(包括"整车参数")
|
||||
this.loadAllParametersData().then(() => {
|
||||
// 加载树结构数据
|
||||
const request = {
|
||||
...api.GET_ENGINE_DETAIL_QUERY,
|
||||
params: {
|
||||
tcData: 'tc'
|
||||
tcData: 'tc',
|
||||
userId: getUserId()
|
||||
},
|
||||
disableSuccessMsg: true
|
||||
}
|
||||
@ -2131,16 +2328,20 @@ export default {
|
||||
|
||||
// 根据接口返回的"整车参数"参数数据构建树结构
|
||||
const wholeEngineParamsNode = this.buildWholeEngineParamsNode()
|
||||
console.log('根据接口返回的"整车参数"参数数据构建树结构', wholeEngineParamsNode);
|
||||
|
||||
// 将"整车参数"节点放在第一位,其他节点放在后面
|
||||
treeDataResult = [wholeEngineParamsNode, ...treeDataResult]
|
||||
console.log('将"整车参数"节点放在第一位,其他节点放在后面', treeDataResult);
|
||||
|
||||
// 保存完整的树数据(未过滤)
|
||||
this.allTreeData = JSON.parse(JSON.stringify(treeDataResult))
|
||||
this.allNodeMap = JSON.parse(JSON.stringify(this.nodeMap))
|
||||
console.log('保存完整的树数据(未过滤)', this.allTreeData);
|
||||
|
||||
// 始终使用完整的树数据
|
||||
this.treeData = JSON.parse(JSON.stringify(this.allTreeData))
|
||||
console.log('始终使用完整的树数据', this.treeData);
|
||||
|
||||
// 如果已选择常用配置,根据可显示的参数更新选中状态
|
||||
if (this.currentCommonConfig) {
|
||||
@ -2149,10 +2350,14 @@ export default {
|
||||
this.updateCheckedKeysByDisplayParams()
|
||||
// 2. 然后比较当前显示的参数和常用配置中的参数,找出不在常用中的参数,隐藏它们
|
||||
this.$nextTick(() => {
|
||||
console.log('比较当前显示的参数和常用配置中的参数,找出不在常用中的参数,隐藏它们');
|
||||
|
||||
this.hideParamsNotInCommonByDisplayParams()
|
||||
})
|
||||
})
|
||||
} else {
|
||||
console.log('否则全选');
|
||||
|
||||
// 否则全选
|
||||
const allKeys = this.getAllNodeKeys(this.treeData)
|
||||
this.defaultExpandedKeys = allKeys
|
||||
|
||||
@ -301,13 +301,7 @@ export default {
|
||||
minWidth: '150',
|
||||
align: 'center'
|
||||
},
|
||||
{
|
||||
prop: 'orderNum',
|
||||
label: '排序号',
|
||||
showOverflowTooltip: true,
|
||||
minWidth: '80',
|
||||
align: 'center'
|
||||
},
|
||||
|
||||
{
|
||||
prop: 'status',
|
||||
customSlot: 'status',
|
||||
@ -951,6 +945,9 @@ export default {
|
||||
this.errorList = err.message || '导入失败,请稍后重试'
|
||||
}
|
||||
this.errorDialogVisible = true
|
||||
setTimeout(() => {
|
||||
this.loadData()
|
||||
}, 1000)
|
||||
})
|
||||
.finally(() => {
|
||||
// 确保 loading 在所有情况下都能关闭
|
||||
|
||||
@ -1468,7 +1468,10 @@ export default {
|
||||
this.isResendMode = false
|
||||
this.resendApprovalData = null
|
||||
this.getApprovalChange()
|
||||
this.$message.warning('获取原审批流程信息失败,将使用空的人员列表')
|
||||
this.$message({
|
||||
type: 'warning',
|
||||
message: '获取原审批流程信息失败,将使用空的人员列表'
|
||||
})
|
||||
})
|
||||
},
|
||||
// 检查是否有查看权限(用于模板管理页面,根据templateName匹配subsystem)
|
||||
@ -1827,7 +1830,10 @@ export default {
|
||||
}
|
||||
}
|
||||
if (!this.selectedDepartmentNode) {
|
||||
this.$message.warning('请选择一个部门')
|
||||
this.$message({
|
||||
type: 'warning',
|
||||
message: '请选择一个部门'
|
||||
})
|
||||
return
|
||||
}
|
||||
// 获取部门路径名称
|
||||
@ -2018,7 +2024,10 @@ export default {
|
||||
handleImportConfirm() {
|
||||
if (this.importing || !this.selectedImportFile) {
|
||||
if (!this.selectedImportFile) {
|
||||
this.$message.warning('请先选择要导入的文件')
|
||||
this.$message({
|
||||
type: 'warning',
|
||||
message: '请先选择要导入的文件'
|
||||
})
|
||||
}
|
||||
return
|
||||
}
|
||||
@ -2544,6 +2553,7 @@ export default {
|
||||
this.resendFlowId = null
|
||||
this.isProcessTitleEditing = false
|
||||
this.originalProcessTitle = ''
|
||||
this.handleSearch()
|
||||
},
|
||||
// 编辑审批环节
|
||||
handleEditStep(stepIndex) {
|
||||
@ -2567,7 +2577,10 @@ export default {
|
||||
}
|
||||
const userIds = (step.handlers || []).filter(Boolean)
|
||||
if (userIds.length === 0) {
|
||||
this.$message.warning('请至少选择一位处理人')
|
||||
this.$message({
|
||||
type: 'warning',
|
||||
message: '请至少选择一位处理人'
|
||||
})
|
||||
return
|
||||
}
|
||||
// 获取 flowId:优先从 detail 中获取,如果没有则从 resendFlowId 中获取
|
||||
@ -2578,7 +2591,10 @@ export default {
|
||||
flowId = this.resendFlowId
|
||||
}
|
||||
if (!flowId) {
|
||||
this.$message.error('缺少流程ID,无法保存')
|
||||
this.$message({
|
||||
type: 'error',
|
||||
message: '缺少流程ID,无法保存'
|
||||
})
|
||||
return
|
||||
}
|
||||
const request = {
|
||||
@ -2784,7 +2800,10 @@ export default {
|
||||
handleSaveProcessTitle() {
|
||||
const newTitle = (this.approvalFormData.processTitle || '').trim()
|
||||
if (!newTitle) {
|
||||
this.$message.warning('流程主题不能为空')
|
||||
this.$message({
|
||||
type: 'warning',
|
||||
message: '流程主题不能为空'
|
||||
})
|
||||
return
|
||||
}
|
||||
// 获取 flowId:优先从 detail 中获取,如果没有则从 resendFlowId 中获取
|
||||
@ -2873,7 +2892,21 @@ export default {
|
||||
handleApprovalFormSubmit() {
|
||||
const processTitle = (this.approvalFormData.processTitle || '').trim()
|
||||
if (!processTitle) {
|
||||
this.$message.warning('请填写流程主题')
|
||||
this.$message({
|
||||
type: 'warning',
|
||||
message: '请填写流程主题'
|
||||
})
|
||||
return
|
||||
}
|
||||
// 检查必填的审批环节是否都选择了处理人
|
||||
const missingRequiredSteps = this.approvalWorkflowSteps.filter(
|
||||
(step) => step.required && (!step.handlers || step.handlers.length === 0)
|
||||
)
|
||||
if (missingRequiredSteps.length > 0) {
|
||||
this.$message({
|
||||
type: 'warning',
|
||||
message: '请为必填环节"校对、审核、批准"选择处理人'
|
||||
})
|
||||
return
|
||||
}
|
||||
// 统一使用去除首尾空格的值
|
||||
@ -2909,7 +2942,10 @@ export default {
|
||||
// 获取模板ID
|
||||
const templateRowId = this.getDetailTemplateId()
|
||||
if (!templateRowId) {
|
||||
this.$message.error('缺少模板ID,无法发起审批')
|
||||
this.$message({
|
||||
type: 'error',
|
||||
message: '缺少模板ID,无法发起审批'
|
||||
})
|
||||
return
|
||||
}
|
||||
const processTitle = (this.approvalFormData.processTitle || '').trim()
|
||||
@ -3361,13 +3397,19 @@ export default {
|
||||
// 批量删除
|
||||
handleBatchDelete() {
|
||||
if (!this.selectedRows || this.selectedRows.length === 0) {
|
||||
this.$message.warning('请先选择要删除的参数')
|
||||
this.$message({
|
||||
type: 'warning',
|
||||
message: '请先选择要删除的参数'
|
||||
})
|
||||
return
|
||||
}
|
||||
// 过滤掉已标记为删除的行
|
||||
const validSelectedRows = this.selectedRows.filter((row) => row.operation !== 'delete')
|
||||
if (validSelectedRows.length === 0) {
|
||||
this.$message.warning('选中的参数中已包含已删除的项,请重新选择')
|
||||
this.$message({
|
||||
type: 'warning',
|
||||
message: '选中的参数中已包含已删除的项,请重新选择'
|
||||
})
|
||||
return
|
||||
}
|
||||
this.$confirm(`确定要删除选中的 ${validSelectedRows.length} 个参数吗?`, '提示', {
|
||||
@ -3390,7 +3432,10 @@ export default {
|
||||
this.$refs.vxeTable.clearSelection()
|
||||
}
|
||||
if (deleteCount > 0) {
|
||||
this.$message.success(`已标记 ${deleteCount} 个参数为删除`)
|
||||
this.$message({
|
||||
type: 'success',
|
||||
message: `已标记 ${deleteCount} 个参数为删除`
|
||||
})
|
||||
}
|
||||
})
|
||||
.catch(() => {
|
||||
@ -3400,13 +3445,19 @@ export default {
|
||||
// 批量修改部门
|
||||
handleBatchModifyDepartment() {
|
||||
if (!this.selectedRows || this.selectedRows.length === 0) {
|
||||
this.$message.warning('请先选择要修改部门的参数')
|
||||
this.$message({
|
||||
type: 'warning',
|
||||
message: '请先选择要修改部门的参数'
|
||||
})
|
||||
return
|
||||
}
|
||||
// 过滤掉已标记为删除的行
|
||||
const validSelectedRows = this.selectedRows.filter((row) => row.operation !== 'delete')
|
||||
if (validSelectedRows.length === 0) {
|
||||
this.$message.warning('选中的参数中已包含已删除的项,请重新选择')
|
||||
this.$message({
|
||||
type: 'warning',
|
||||
message: '选中的参数中已包含已删除的项,请重新选择'
|
||||
})
|
||||
return
|
||||
}
|
||||
// 打开部门选择弹窗(批量修改模式)
|
||||
@ -3446,13 +3497,19 @@ export default {
|
||||
}
|
||||
}
|
||||
if (!this.selectedDepartmentNode) {
|
||||
this.$message.warning('请选择一个部门')
|
||||
this.$message({
|
||||
type: 'warning',
|
||||
message: '请选择一个部门'
|
||||
})
|
||||
return
|
||||
}
|
||||
// 过滤掉已标记为删除的行
|
||||
const validSelectedRows = this.selectedRows.filter((row) => row.operation !== 'delete')
|
||||
if (validSelectedRows.length === 0) {
|
||||
this.$message.warning('选中的参数中已包含已删除的项,请重新选择')
|
||||
this.$message({
|
||||
type: 'warning',
|
||||
message: '选中的参数中已包含已删除的项,请重新选择'
|
||||
})
|
||||
this.handleDepartmentDialogClose()
|
||||
return
|
||||
}
|
||||
@ -3490,9 +3547,15 @@ export default {
|
||||
// 关闭弹窗
|
||||
this.handleDepartmentDialogClose()
|
||||
if (updateCount > 0) {
|
||||
this.$message.success(`已批量修改 ${updateCount} 个参数的部门`)
|
||||
this.$message({
|
||||
type: 'success',
|
||||
message: `已批量修改 ${updateCount} 个参数的部门`
|
||||
})
|
||||
} else {
|
||||
this.$message.warning('没有可修改的参数')
|
||||
this.$message({
|
||||
type: 'warning',
|
||||
message: '没有可修改的参数'
|
||||
})
|
||||
}
|
||||
},
|
||||
getRowClassName({ row }) {
|
||||
|
||||
@ -185,6 +185,8 @@ export default {
|
||||
},
|
||||
mounted() {
|
||||
this.loadData()
|
||||
// 检查URL中是否有flowId参数
|
||||
this.checkFlowIdFromUrl()
|
||||
},
|
||||
methods: {
|
||||
pageSizeChange(size) {
|
||||
@ -366,6 +368,35 @@ export default {
|
||||
console.error('日期格式化错误:', error)
|
||||
return cellValue
|
||||
}
|
||||
},
|
||||
checkFlowIdFromUrl() {
|
||||
// 检查URL中是否有flowId参数
|
||||
const flowId = this.$route && this.$route.query && this.$route.query.flowId
|
||||
if (flowId) {
|
||||
const request = {
|
||||
...api.GET_YC_MY_DONE_LIST,
|
||||
params: {
|
||||
flowId: flowId
|
||||
},
|
||||
disableSuccessMsg: true
|
||||
}
|
||||
this.$request(request)
|
||||
.asyncThen((resp) => {
|
||||
// 根据返回值触发handleRowView
|
||||
if (resp && resp.data) {
|
||||
// 尝试多种可能的数据结构
|
||||
const rowData = resp.data.result || resp.data.data || resp.data
|
||||
// 确保rowData有必要的字段
|
||||
if (rowData && (rowData.dataType || rowData.documentNo || rowData.modelId)) {
|
||||
this.handleRowView(rowData)
|
||||
}
|
||||
}
|
||||
})
|
||||
.asyncErrorCatch((err) => {
|
||||
console.error('根据flowId获取经办数据失败:', err)
|
||||
this.$message.error('获取经办数据失败')
|
||||
})
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -203,6 +203,8 @@ export default {
|
||||
},
|
||||
mounted() {
|
||||
this.loadData()
|
||||
// 检查URL中是否有flowId参数
|
||||
this.checkFlowIdFromUrl()
|
||||
},
|
||||
methods: {
|
||||
pageSizeChange(size) {
|
||||
@ -494,6 +496,35 @@ export default {
|
||||
})
|
||||
}
|
||||
console.warn(row)
|
||||
},
|
||||
checkFlowIdFromUrl() {
|
||||
// 检查URL中是否有flowId参数
|
||||
const flowId = this.$route && this.$route.query && this.$route.query.flowId
|
||||
if (flowId) {
|
||||
const request = {
|
||||
...api.GET_YC_MY_SEND_LIST,
|
||||
params: {
|
||||
flowId: flowId
|
||||
},
|
||||
disableSuccessMsg: true
|
||||
}
|
||||
this.$request(request)
|
||||
.asyncThen((resp) => {
|
||||
// 根据返回值触发handleRowView
|
||||
if (resp && resp.data) {
|
||||
// 尝试多种可能的数据结构
|
||||
const rowData = resp.data.result || resp.data.data || resp.data
|
||||
// 确保rowData有必要的字段
|
||||
if (rowData && (rowData.dataType || rowData.documentNo || rowData.modelId)) {
|
||||
this.handleRowView(rowData)
|
||||
}
|
||||
}
|
||||
})
|
||||
.asyncErrorCatch((err) => {
|
||||
console.error('根据flowId获取发起数据失败:', err)
|
||||
this.$message.error('获取发起数据失败')
|
||||
})
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -113,7 +113,14 @@
|
||||
|
||||
<template slot="empty">
|
||||
<div class="table-empty">
|
||||
<x-empty-page></x-empty-page>
|
||||
<template v-if="canViewData">
|
||||
<x-empty-page></x-empty-page>
|
||||
</template>
|
||||
<template v-else>
|
||||
<div style="padding: 40px 0; text-align: center; color: #909399;">
|
||||
<div style="font-size: 14px;">无权限查看</div>
|
||||
</div>
|
||||
</template>
|
||||
</div>
|
||||
</template>
|
||||
</x-vxe-table>
|
||||
@ -209,7 +216,8 @@ export default {
|
||||
// 申请人搜索相关
|
||||
applicantOptions: [],
|
||||
applicantLoading: false,
|
||||
applicantSearchTimer: null // 防抖定时器
|
||||
applicantSearchTimer: null, // 防抖定时器
|
||||
canViewData: false // 是否有查看数据的权限
|
||||
}
|
||||
},
|
||||
computed: {
|
||||
@ -276,9 +284,35 @@ export default {
|
||||
}
|
||||
}
|
||||
},
|
||||
created() {
|
||||
mounted() {
|
||||
// 先检查 localStorage 中是否已有权限数据,如果有则先检查权限
|
||||
if (this.hasViewPermission()) {
|
||||
this.canViewData = true
|
||||
this.loadData()
|
||||
} else {
|
||||
this.canViewData = false
|
||||
this.tableData = []
|
||||
}
|
||||
// 同时加载最新的权限数据
|
||||
this.loadUserSelfRole()
|
||||
this.loadData()
|
||||
.then(() => {
|
||||
// 权限加载完成后重新检查权限
|
||||
if (this.hasViewPermission()) {
|
||||
this.canViewData = true
|
||||
// 如果之前没有权限,现在有权限了,则加载数据
|
||||
if (this.tableData.length === 0) {
|
||||
this.loadData()
|
||||
}
|
||||
} else {
|
||||
this.canViewData = false
|
||||
// 无权限时不加载数据,显示空列表
|
||||
this.tableData = []
|
||||
}
|
||||
})
|
||||
.catch(() => {
|
||||
// 如果加载权限失败,保持当前状态
|
||||
console.error('加载权限数据失败')
|
||||
})
|
||||
},
|
||||
beforeDestroy() {
|
||||
// 清理定时器
|
||||
@ -350,6 +384,49 @@ export default {
|
||||
// 如果是提交人,就可以显示撤回按钮
|
||||
return this.isApplicant(row)
|
||||
},
|
||||
// 检查是否是管理员(isAdmin === 1)
|
||||
isAdmin() {
|
||||
try {
|
||||
const permissionDataStr = localStorage.getItem('user_self_role')
|
||||
if (!permissionDataStr) {
|
||||
return false
|
||||
}
|
||||
const permissionData = JSON.parse(permissionDataStr)
|
||||
if (!Array.isArray(permissionData)) {
|
||||
return false
|
||||
}
|
||||
// 检查是否有 isAdmin === 1 的记录
|
||||
return permissionData.some((perm) => perm.isAdmin === 1 || perm.isAdmin === '1')
|
||||
} catch (err) {
|
||||
console.error('检查管理员权限失败:', err)
|
||||
return false
|
||||
}
|
||||
},
|
||||
// 检查是否有查看数据的权限
|
||||
hasViewPermission() {
|
||||
// 1. 如果是管理员,拥有全部权限
|
||||
if (this.isAdmin()) {
|
||||
return true
|
||||
}
|
||||
try {
|
||||
const permissionDataStr = localStorage.getItem('user_self_role')
|
||||
if (!permissionDataStr) {
|
||||
return false
|
||||
}
|
||||
const permissionData = JSON.parse(permissionDataStr)
|
||||
if (!Array.isArray(permissionData)) {
|
||||
return false
|
||||
}
|
||||
// 2. 检查是否有 permissionPath 包括 "竞品发动机数据审批流程" 的权限
|
||||
return permissionData.some((perm) => {
|
||||
const permissionPath = perm.permissionPath || ''
|
||||
return permissionPath.includes('竞品发动机数据审批流程')
|
||||
})
|
||||
} catch (err) {
|
||||
console.error('检查查看权限失败:', err)
|
||||
return false
|
||||
}
|
||||
},
|
||||
// 加载用户自身角色权限
|
||||
loadUserSelfRole() {
|
||||
const request = {
|
||||
@ -359,20 +436,27 @@ export default {
|
||||
},
|
||||
disableSuccessMsg: true
|
||||
}
|
||||
this.$request(request)
|
||||
.asyncThen((resp) => {
|
||||
if (resp && resp.data) {
|
||||
// 将权限数据存储到 localStorage
|
||||
try {
|
||||
localStorage.setItem('user_self_role', JSON.stringify(resp.data))
|
||||
} catch (err) {
|
||||
console.error('存储权限数据到 localStorage 失败:', err)
|
||||
return new Promise((resolve, reject) => {
|
||||
this.$request(request)
|
||||
.asyncThen((resp) => {
|
||||
if (resp && resp.data) {
|
||||
// 将权限数据存储到 localStorage
|
||||
try {
|
||||
localStorage.setItem('user_self_role', JSON.stringify(resp.data))
|
||||
resolve(resp.data)
|
||||
} catch (err) {
|
||||
console.error('存储权限数据到 localStorage 失败:', err)
|
||||
reject(err)
|
||||
}
|
||||
} else {
|
||||
resolve(null)
|
||||
}
|
||||
}
|
||||
})
|
||||
.asyncErrorCatch((err) => {
|
||||
console.error('获取用户自身角色失败:', err)
|
||||
})
|
||||
})
|
||||
.asyncErrorCatch((err) => {
|
||||
console.error('获取用户自身角色失败:', err)
|
||||
reject(err)
|
||||
})
|
||||
})
|
||||
},
|
||||
pageSizeChange(size) {
|
||||
this.pagination.pageSize = size
|
||||
|
||||
@ -56,6 +56,7 @@
|
||||
<el-option label="已分发" value="已分发" />
|
||||
<el-option label="部分分发" value="部分分发" />
|
||||
<el-option label="未分发" value="未分发" />
|
||||
<el-option label="已完成" value="已完成" />
|
||||
</el-select>
|
||||
</div>
|
||||
<div class="search-actions">
|
||||
@ -139,6 +140,9 @@
|
||||
<span v-else-if="row[colConfig.prop] === '未分发'" class="status-tag status-pending">
|
||||
未分发
|
||||
</span>
|
||||
<span v-else-if="row[colConfig.prop] === '已完成'" class="status-tag status-done">
|
||||
已完成
|
||||
</span>
|
||||
</div>
|
||||
<div v-if="colConfig.customSlot === 'versionNumber'" :key="index + '' + rowIndex">
|
||||
V{{ row[colConfig.prop] || '' }}
|
||||
@ -147,7 +151,14 @@
|
||||
|
||||
<template slot="empty">
|
||||
<div class="table-empty">
|
||||
<x-empty-page></x-empty-page>
|
||||
<template v-if="canViewData">
|
||||
<x-empty-page></x-empty-page>
|
||||
</template>
|
||||
<template v-else>
|
||||
<div style="padding: 40px 0; text-align: center; color: #909399;">
|
||||
<div style="font-size: 14px;">无权限查看</div>
|
||||
</div>
|
||||
</template>
|
||||
</div>
|
||||
</template>
|
||||
</x-vxe-table>
|
||||
@ -249,7 +260,8 @@ export default {
|
||||
importing: false,
|
||||
selectedImportFile: null,
|
||||
importFileList: [],
|
||||
downloadingTemplate: false
|
||||
downloadingTemplate: false,
|
||||
canViewData: false // 是否有查看数据的权限
|
||||
}
|
||||
},
|
||||
computed: {
|
||||
@ -349,13 +361,35 @@ export default {
|
||||
}
|
||||
}
|
||||
},
|
||||
created() {
|
||||
this.loadUserSelfRole()
|
||||
this.loadData()
|
||||
},
|
||||
mounted() {
|
||||
// 先检查 localStorage 中是否已有权限数据,如果有则先检查权限
|
||||
if (this.hasViewPermission()) {
|
||||
this.canViewData = true
|
||||
this.loadData()
|
||||
} else {
|
||||
this.canViewData = false
|
||||
this.tableData = []
|
||||
}
|
||||
// 同时加载最新的权限数据
|
||||
this.loadUserSelfRole()
|
||||
this.loadData()
|
||||
.then(() => {
|
||||
// 权限加载完成后重新检查权限
|
||||
if (this.hasViewPermission()) {
|
||||
this.canViewData = true
|
||||
// 如果之前没有权限,现在有权限了,则加载数据
|
||||
if (this.tableData.length === 0) {
|
||||
this.loadData()
|
||||
}
|
||||
} else {
|
||||
this.canViewData = false
|
||||
// 无权限时不加载数据,显示空列表
|
||||
this.tableData = []
|
||||
}
|
||||
})
|
||||
.catch(() => {
|
||||
// 如果加载权限失败,保持当前状态
|
||||
console.error('加载权限数据失败')
|
||||
})
|
||||
},
|
||||
methods: {
|
||||
// 检查是否是管理员(isAdmin === 1)
|
||||
@ -376,6 +410,31 @@ export default {
|
||||
return false
|
||||
}
|
||||
},
|
||||
// 检查是否有查看数据的权限
|
||||
hasViewPermission() {
|
||||
// 1. 如果是管理员,拥有全部权限
|
||||
if (this.isAdmin()) {
|
||||
return true
|
||||
}
|
||||
try {
|
||||
const permissionDataStr = localStorage.getItem('user_self_role')
|
||||
if (!permissionDataStr) {
|
||||
return false
|
||||
}
|
||||
const permissionData = JSON.parse(permissionDataStr)
|
||||
if (!Array.isArray(permissionData)) {
|
||||
return false
|
||||
}
|
||||
// 2. 检查是否有 permissionPath 包括 "竞品发动机数据" 的权限
|
||||
return permissionData.some((perm) => {
|
||||
const permissionPath = perm.permissionPath || ''
|
||||
return permissionPath.includes('竞品发动机数据')
|
||||
})
|
||||
} catch (err) {
|
||||
console.error('检查查看权限失败:', err)
|
||||
return false
|
||||
}
|
||||
},
|
||||
// 检查是否有玉柴发动机数据的编辑权限
|
||||
hasEngineDataEditPermission() {
|
||||
// 如果是管理员,拥有全部权限
|
||||
@ -411,20 +470,27 @@ export default {
|
||||
},
|
||||
disableSuccessMsg: true
|
||||
}
|
||||
this.$request(request)
|
||||
.asyncThen((resp) => {
|
||||
if (resp && resp.data) {
|
||||
// 将权限数据存储到 localStorage
|
||||
try {
|
||||
localStorage.setItem('user_self_role', JSON.stringify(resp.data))
|
||||
} catch (err) {
|
||||
console.error('存储权限数据到 localStorage 失败:', err)
|
||||
return new Promise((resolve, reject) => {
|
||||
this.$request(request)
|
||||
.asyncThen((resp) => {
|
||||
if (resp && resp.data) {
|
||||
// 将权限数据存储到 localStorage
|
||||
try {
|
||||
localStorage.setItem('user_self_role', JSON.stringify(resp.data))
|
||||
resolve(resp.data)
|
||||
} catch (err) {
|
||||
console.error('存储权限数据到 localStorage 失败:', err)
|
||||
reject(err)
|
||||
}
|
||||
} else {
|
||||
resolve(null)
|
||||
}
|
||||
}
|
||||
})
|
||||
.asyncErrorCatch((err) => {
|
||||
console.error('获取用户自身角色失败:', err)
|
||||
})
|
||||
})
|
||||
.asyncErrorCatch((err) => {
|
||||
console.error('获取用户自身角色失败:', err)
|
||||
reject(err)
|
||||
})
|
||||
})
|
||||
},
|
||||
handleRowDispatch(row, rowIndex) {
|
||||
// 跳转到详情页面,设置为分发模式(分发责任人)
|
||||
|
||||
@ -118,7 +118,9 @@
|
||||
>
|
||||
查看
|
||||
</el-checkbox>
|
||||
<!-- 审批流程菜单项只有查看权限,没有编辑权限 -->
|
||||
<el-checkbox
|
||||
v-if="!isApprovalFlowMenu(data.label)"
|
||||
v-model="data.permissions.edit"
|
||||
size="small"
|
||||
@change="handleNodePermissionChange(data, 'edit')"
|
||||
@ -341,11 +343,13 @@ export default {
|
||||
addRoleMode: 'add', // 'add' 或 'edit'
|
||||
addRoleFormData: {
|
||||
roleName: '',
|
||||
roleCode: '',
|
||||
roleDescription: '',
|
||||
roleId: '' // 编辑时使用
|
||||
},
|
||||
addRoleFormRules: {
|
||||
roleName: [{ required: true, message: '请输入角色名称', trigger: 'blur' }],
|
||||
roleCode: [{ required: true, message: '请输入角色代码', trigger: 'blur' }],
|
||||
roleDescription: [{ required: true, message: '请输入角色描述', trigger: 'blur' }]
|
||||
},
|
||||
// 菜单树数据
|
||||
@ -360,7 +364,7 @@ export default {
|
||||
// 待应用的权限数据(用于懒加载模式下延迟应用权限)
|
||||
pendingPermissions: [],
|
||||
// 固定的父级菜单列表
|
||||
menuList: ['参数模板管理', '玉柴发动机数据', '竞品发动机数据', '对标报告'],
|
||||
menuList: ['参数模板管理', '玉柴发动机数据', '竞品发动机数据', '对标报告','参数模板审批流程','玉柴发动机数据审批流程','竞品发动机数据审批流程','对标报告审批流程','基础管理模块'],
|
||||
// 模板列表数据(用于参数模板管理的二级节点)
|
||||
templateList: [],
|
||||
// 人员配置相关
|
||||
@ -476,6 +480,16 @@ export default {
|
||||
this.currentPersonRequest = null
|
||||
},
|
||||
methods: {
|
||||
// 判断是否是审批流程菜单项(只有查看权限,没有编辑权限)
|
||||
isApprovalFlowMenu(menuName) {
|
||||
const approvalFlowMenus = [
|
||||
'参数模板审批流程',
|
||||
'玉柴发动机数据审批流程',
|
||||
'竞品发动机数据审批流程',
|
||||
'对标报告审批流程'
|
||||
]
|
||||
return approvalFlowMenus.includes(menuName)
|
||||
},
|
||||
getUserSelfRole() {
|
||||
const request = {
|
||||
...api.GET_USER_SELF_ROLE,
|
||||
@ -573,13 +587,21 @@ export default {
|
||||
// 遍历固定的菜单列表,即使子系统列表为空,也要构建菜单节点
|
||||
this.menuList.forEach((menuName, menuIdx) => {
|
||||
const menuId = `menu-${menuIdx}`
|
||||
// 定义没有子级的菜单项(叶子节点)
|
||||
const leafMenus = [
|
||||
'对标报告',
|
||||
'参数模板审批流程',
|
||||
'玉柴发动机数据审批流程',
|
||||
'竞品发动机数据审批流程',
|
||||
'对标报告审批流程'
|
||||
]
|
||||
const menuNode = {
|
||||
id: menuId,
|
||||
label: menuName,
|
||||
type: 'menu',
|
||||
children: null, // 初始为 null,懒加载时加载
|
||||
// 对标报告没有子级,自己这一级就带有权限
|
||||
isLeaf: menuName === '对标报告',
|
||||
// 这些菜单项没有子级,自己这一级就带有权限
|
||||
isLeaf: leafMenus.includes(menuName),
|
||||
permissions: {
|
||||
view: false,
|
||||
edit: false
|
||||
@ -611,8 +633,16 @@ export default {
|
||||
}
|
||||
// 如果节点是菜单类型
|
||||
if (node.data.type === 'menu') {
|
||||
// 对标报告没有子级,直接返回空数组
|
||||
if (node.data.label === '对标报告') {
|
||||
// 这些菜单项没有子级,直接返回空数组
|
||||
const leafMenus = [
|
||||
'对标报告',
|
||||
'参数模板审批流程',
|
||||
'玉柴发动机数据审批流程',
|
||||
'竞品发动机数据审批流程',
|
||||
'对标报告审批流程',
|
||||
'基础管理模块'
|
||||
]
|
||||
if (leafMenus.includes(node.data.label)) {
|
||||
resolve([])
|
||||
return
|
||||
}
|
||||
@ -639,7 +669,7 @@ export default {
|
||||
...api.GET_MODEL_LIST,
|
||||
params: {
|
||||
pageNumber: 1,
|
||||
pageSize: 999
|
||||
pageSize: 9999
|
||||
},
|
||||
disableSuccessMsg: true
|
||||
}
|
||||
@ -861,6 +891,16 @@ export default {
|
||||
},
|
||||
// 统一的节点权限变更处理
|
||||
handleNodePermissionChange(data, permissionType) {
|
||||
// 审批流程菜单项只有查看权限,没有编辑权限
|
||||
if (permissionType === 'edit' && data.type === 'menu' && this.isApprovalFlowMenu(data.label)) {
|
||||
// 如果是审批流程菜单项,不允许设置编辑权限,强制设置为 false
|
||||
this.$set(data.permissions, 'edit', false)
|
||||
if (data.id && this.nodeMap[data.id]) {
|
||||
this.$set(this.nodeMap[data.id].permissions, 'edit', false)
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
// 如果选中编辑权限,自动选中查看权限
|
||||
if (permissionType === 'edit' && data.permissions && data.permissions.edit === true) {
|
||||
// 确保权限对象存在
|
||||
@ -910,6 +950,16 @@ export default {
|
||||
const isChecked = menuNode.permissions[permissionType]
|
||||
const menuName = menuNode.label || ''
|
||||
|
||||
// 审批流程菜单项只有查看权限,没有编辑权限
|
||||
if (permissionType === 'edit' && this.isApprovalFlowMenu(menuName)) {
|
||||
// 如果是审批流程菜单项,不允许设置编辑权限,强制设置为 false
|
||||
this.$set(menuNode.permissions, 'edit', false)
|
||||
if (menuNode.id && this.nodeMap[menuNode.id]) {
|
||||
this.$set(this.nodeMap[menuNode.id].permissions, 'edit', false)
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
// 如果选中编辑权限,自动选中查看权限
|
||||
if (permissionType === 'edit' && isChecked) {
|
||||
this.$set(menuNode.permissions, 'view', true)
|
||||
@ -1004,8 +1054,12 @@ export default {
|
||||
}
|
||||
})
|
||||
})
|
||||
} else if (menuName === '对标报告') {
|
||||
// 对标报告:没有子节点,只有菜单本身
|
||||
} else if (menuName === '对标报告' ||
|
||||
menuName === '参数模板审批流程' ||
|
||||
menuName === '玉柴发动机数据审批流程' ||
|
||||
menuName === '竞品发动机数据审批流程' ||
|
||||
menuName === '对标报告审批流程') {
|
||||
// 这些菜单项:没有子节点,只有菜单本身
|
||||
const menuPath = this.buildPermissionPath(menuNode)
|
||||
if (menuPath) {
|
||||
const existingPerm = this.pendingPermissions.find(
|
||||
@ -1059,7 +1113,11 @@ export default {
|
||||
}
|
||||
})
|
||||
})
|
||||
} else if (menuName === '对标报告') {
|
||||
} else if (menuName === '对标报告' ||
|
||||
menuName === '参数模板审批流程' ||
|
||||
menuName === '玉柴发动机数据审批流程' ||
|
||||
menuName === '竞品发动机数据审批流程' ||
|
||||
menuName === '对标报告审批流程') {
|
||||
const menuPath = this.buildPermissionPath(menuNode)
|
||||
if (menuPath) {
|
||||
const existingPerm = this.pendingPermissions.find(
|
||||
@ -1079,14 +1137,23 @@ export default {
|
||||
// 如果取消选中,需要从 pendingPermissions 中移除该菜单下所有子节点的权限
|
||||
if (this.pendingPermissions) {
|
||||
const parameterPer = permissionType === 'view' ? 1 : 2
|
||||
// 定义没有子级的菜单项
|
||||
const leafMenus = [
|
||||
'对标报告',
|
||||
'参数模板审批流程',
|
||||
'玉柴发动机数据审批流程',
|
||||
'竞品发动机数据审批流程',
|
||||
'对标报告审批流程'
|
||||
]
|
||||
|
||||
// 移除该菜单下所有子节点的权限
|
||||
this.pendingPermissions = this.pendingPermissions.filter((perm) => {
|
||||
// 如果权限路径以菜单名开头,且权限类型匹配,则移除
|
||||
if (perm.permissionPath && perm.permissionPath.startsWith(menuName + '/')) {
|
||||
return perm.parameterPer !== parameterPer
|
||||
}
|
||||
// 对标报告没有子节点,直接匹配菜单路径
|
||||
if (menuName === '对标报告' && perm.permissionPath === menuName) {
|
||||
// 这些菜单项没有子节点,直接匹配菜单路径
|
||||
if (leafMenus.includes(menuName) && perm.permissionPath === menuName) {
|
||||
return perm.parameterPer !== parameterPer
|
||||
}
|
||||
return true
|
||||
@ -1099,7 +1166,7 @@ export default {
|
||||
if (perm.permissionPath && perm.permissionPath.startsWith(menuName + '/')) {
|
||||
return perm.parameterPer !== viewParameterPer
|
||||
}
|
||||
if (menuName === '对标报告' && perm.permissionPath === menuName) {
|
||||
if (leafMenus.includes(menuName) && perm.permissionPath === menuName) {
|
||||
return perm.parameterPer !== viewParameterPer
|
||||
}
|
||||
return true
|
||||
@ -1278,6 +1345,7 @@ export default {
|
||||
this.addRoleDialogVisible = true
|
||||
this.addRoleFormData = {
|
||||
roleName: '',
|
||||
roleCode: '',
|
||||
roleDescription: '',
|
||||
roleId: ''
|
||||
}
|
||||
@ -1336,6 +1404,7 @@ export default {
|
||||
this.addRoleMode = 'add'
|
||||
this.addRoleFormData = {
|
||||
roleName: '',
|
||||
roleCode: '',
|
||||
roleDescription: '',
|
||||
roleId: ''
|
||||
}
|
||||
@ -1493,7 +1562,7 @@ export default {
|
||||
// 加载部门列表
|
||||
loadDepartmentList() {
|
||||
const request = {
|
||||
...api.QUERY_ORG_TREE,
|
||||
...api.GET_DEPT_OF_USER,
|
||||
disableSuccessMsg: true
|
||||
}
|
||||
this.$request(request)
|
||||
@ -1501,7 +1570,7 @@ export default {
|
||||
// 处理返回的数据,确保格式为 { id, name, children }
|
||||
let result = []
|
||||
if (resp && resp.data) {
|
||||
result = resp.data.result || resp.data.data || resp.data || []
|
||||
result = resp.data
|
||||
}
|
||||
// 格式化数据为级联选择器需要的格式
|
||||
this.departmentList = this.formatDepartmentTreeData(result)
|
||||
@ -1854,6 +1923,7 @@ export default {
|
||||
this.addRoleDialogVisible = true
|
||||
this.addRoleFormData = {
|
||||
roleName: row.roleName || '',
|
||||
roleCode: row.roleCode || '',
|
||||
roleDescription: row.roleDescription || '',
|
||||
roleId: row.rowId || row.id || ''
|
||||
}
|
||||
@ -1915,9 +1985,12 @@ export default {
|
||||
|
||||
const permData = permissionMap.get(permissionPath)
|
||||
// parameterPer 是数字:1是查看,2是编辑
|
||||
// 审批流程菜单项只有查看权限,没有编辑权限
|
||||
const isApprovalFlow = this.isApprovalFlowMenu(permissionPath)
|
||||
if (perm.parameterPer === 1 || perm.parameterPer === '1' || perm.parameterPer === '查看') {
|
||||
permData.view = true
|
||||
} else if (perm.parameterPer === 2 || perm.parameterPer === '2' || perm.parameterPer === '编辑') {
|
||||
} else if ((perm.parameterPer === 2 || perm.parameterPer === '2' || perm.parameterPer === '编辑') && !isApprovalFlow) {
|
||||
// 只有非审批流程菜单项才设置编辑权限
|
||||
permData.edit = true
|
||||
}
|
||||
})
|
||||
@ -1942,6 +2015,10 @@ export default {
|
||||
view: permData.view || false,
|
||||
edit: permData.edit || false
|
||||
}
|
||||
// 审批流程菜单项只有查看权限,没有编辑权限
|
||||
if (node.type === 'menu' && this.isApprovalFlowMenu(node.label)) {
|
||||
newPermissions.edit = false
|
||||
}
|
||||
// 如果只有编辑权限,自动添加查看权限
|
||||
if (newPermissions.edit && !newPermissions.view) {
|
||||
newPermissions.view = true
|
||||
@ -2042,6 +2119,11 @@ export default {
|
||||
hasView = true
|
||||
}
|
||||
|
||||
// 审批流程菜单项只有查看权限,没有编辑权限
|
||||
if (node.type === 'menu' && this.isApprovalFlowMenu(node.label)) {
|
||||
hasEdit = false
|
||||
}
|
||||
|
||||
// 使用 $set 确保响应式更新,直接替换整个权限对象
|
||||
const newPermissions = {
|
||||
view: hasView,
|
||||
@ -2150,8 +2232,8 @@ export default {
|
||||
permissions.push(perm)
|
||||
}
|
||||
|
||||
// 收集编辑权限
|
||||
if (nodePermissions.edit) {
|
||||
// 收集编辑权限(审批流程菜单项只有查看权限,没有编辑权限)
|
||||
if (nodePermissions.edit && !(node.type === 'menu' && this.isApprovalFlowMenu(node.label))) {
|
||||
const perm = {
|
||||
permissionPath: permissionPath,
|
||||
parameterPer: 2, // 2是编辑
|
||||
|
||||
@ -232,7 +232,14 @@
|
||||
|
||||
<template slot="empty">
|
||||
<div class="table-empty">
|
||||
<x-empty-page></x-empty-page>
|
||||
<template v-if="canViewData">
|
||||
<x-empty-page></x-empty-page>
|
||||
</template>
|
||||
<template v-else>
|
||||
<div style="padding: 40px 0; text-align: center; color: #909399;">
|
||||
<div style="font-size: 14px;">无权限查看</div>
|
||||
</div>
|
||||
</template>
|
||||
</div>
|
||||
</template>
|
||||
</x-vxe-table>
|
||||
@ -721,7 +728,8 @@ export default {
|
||||
currentApprovalRow: null,
|
||||
showReportDetail: false,
|
||||
currentReportDetail: null,
|
||||
downloadingRowId: ''
|
||||
downloadingRowId: '',
|
||||
canViewData: false // 是否有查看数据的权限
|
||||
}
|
||||
},
|
||||
computed: {
|
||||
@ -767,13 +775,35 @@ export default {
|
||||
}
|
||||
}
|
||||
},
|
||||
created() {
|
||||
this.loadUserSelfRole()
|
||||
this.loadData()
|
||||
},
|
||||
mounted() {
|
||||
// 先检查 localStorage 中是否已有权限数据,如果有则先检查权限
|
||||
if (this.hasViewPermission()) {
|
||||
this.canViewData = true
|
||||
this.loadData()
|
||||
} else {
|
||||
this.canViewData = false
|
||||
this.tableData = []
|
||||
}
|
||||
// 同时加载最新的权限数据
|
||||
this.loadUserSelfRole()
|
||||
this.loadData()
|
||||
.then(() => {
|
||||
// 权限加载完成后重新检查权限
|
||||
if (this.hasViewPermission()) {
|
||||
this.canViewData = true
|
||||
// 如果之前没有权限,现在有权限了,则加载数据
|
||||
if (this.tableData.length === 0) {
|
||||
this.loadData()
|
||||
}
|
||||
} else {
|
||||
this.canViewData = false
|
||||
// 无权限时不加载数据,显示空列表
|
||||
this.tableData = []
|
||||
}
|
||||
})
|
||||
.catch(() => {
|
||||
// 如果加载权限失败,保持当前状态
|
||||
console.error('加载权限数据失败')
|
||||
})
|
||||
},
|
||||
methods: {
|
||||
// 检查是否是管理员(isAdmin === 1)
|
||||
@ -794,6 +824,31 @@ export default {
|
||||
return false
|
||||
}
|
||||
},
|
||||
// 检查是否有查看数据的权限
|
||||
hasViewPermission() {
|
||||
// 1. 如果是管理员,拥有全部权限
|
||||
if (this.isAdmin()) {
|
||||
return true
|
||||
}
|
||||
try {
|
||||
const permissionDataStr = localStorage.getItem('user_self_role')
|
||||
if (!permissionDataStr) {
|
||||
return false
|
||||
}
|
||||
const permissionData = JSON.parse(permissionDataStr)
|
||||
if (!Array.isArray(permissionData)) {
|
||||
return false
|
||||
}
|
||||
// 2. 检查是否有 permissionPath 包括 "对标报告" 的权限
|
||||
return permissionData.some((perm) => {
|
||||
const permissionPath = perm.permissionPath || ''
|
||||
return permissionPath.includes('对标报告')
|
||||
})
|
||||
} catch (err) {
|
||||
console.error('检查查看权限失败:', err)
|
||||
return false
|
||||
}
|
||||
},
|
||||
// 检查是否有报告的编辑权限
|
||||
hasReportEditPermission() {
|
||||
// 如果是管理员,拥有全部权限
|
||||
@ -829,20 +884,27 @@ export default {
|
||||
},
|
||||
disableSuccessMsg: true
|
||||
}
|
||||
this.$request(request)
|
||||
.asyncThen((resp) => {
|
||||
if (resp && resp.data) {
|
||||
// 将权限数据存储到 localStorage
|
||||
try {
|
||||
localStorage.setItem('user_self_role', JSON.stringify(resp.data))
|
||||
} catch (err) {
|
||||
console.error('存储权限数据到 localStorage 失败:', err)
|
||||
return new Promise((resolve, reject) => {
|
||||
this.$request(request)
|
||||
.asyncThen((resp) => {
|
||||
if (resp && resp.data) {
|
||||
// 将权限数据存储到 localStorage
|
||||
try {
|
||||
localStorage.setItem('user_self_role', JSON.stringify(resp.data))
|
||||
resolve(resp.data)
|
||||
} catch (err) {
|
||||
console.error('存储权限数据到 localStorage 失败:', err)
|
||||
reject(err)
|
||||
}
|
||||
} else {
|
||||
resolve(null)
|
||||
}
|
||||
}
|
||||
})
|
||||
.asyncErrorCatch((err) => {
|
||||
console.error('获取用户自身角色失败:', err)
|
||||
})
|
||||
})
|
||||
.asyncErrorCatch((err) => {
|
||||
console.error('获取用户自身角色失败:', err)
|
||||
reject(err)
|
||||
})
|
||||
})
|
||||
},
|
||||
handleCreate() {
|
||||
this.dialogMode = 'create'
|
||||
|
||||
@ -183,7 +183,14 @@
|
||||
|
||||
<template slot="empty">
|
||||
<div class="table-empty">
|
||||
<x-empty-page></x-empty-page>
|
||||
<template v-if="canViewData">
|
||||
<x-empty-page></x-empty-page>
|
||||
</template>
|
||||
<template v-else>
|
||||
<div style="padding: 40px 0; text-align: center; color: #909399;">
|
||||
<div style="font-size: 14px;">无权限查看</div>
|
||||
</div>
|
||||
</template>
|
||||
</div>
|
||||
</template>
|
||||
</x-vxe-table>
|
||||
@ -568,7 +575,8 @@ export default {
|
||||
currentApprovalRow: null,
|
||||
showReportDetail: false,
|
||||
currentReportDetail: null,
|
||||
downloadingRowId: ''
|
||||
downloadingRowId: '',
|
||||
canViewData: false // 是否有查看数据的权限
|
||||
}
|
||||
},
|
||||
computed: {
|
||||
@ -607,10 +615,111 @@ export default {
|
||||
}
|
||||
}
|
||||
},
|
||||
created() {
|
||||
this.loadData()
|
||||
mounted() {
|
||||
// 先检查 localStorage 中是否已有权限数据,如果有则先检查权限
|
||||
if (this.hasViewPermission()) {
|
||||
this.canViewData = true
|
||||
this.loadData()
|
||||
} else {
|
||||
this.canViewData = false
|
||||
this.tableData = []
|
||||
}
|
||||
// 同时加载最新的权限数据
|
||||
this.loadUserSelfRole()
|
||||
.then(() => {
|
||||
// 权限加载完成后重新检查权限
|
||||
if (this.hasViewPermission()) {
|
||||
this.canViewData = true
|
||||
// 如果之前没有权限,现在有权限了,则加载数据
|
||||
if (this.tableData.length === 0) {
|
||||
this.loadData()
|
||||
}
|
||||
} else {
|
||||
this.canViewData = false
|
||||
// 无权限时不加载数据,显示空列表
|
||||
this.tableData = []
|
||||
}
|
||||
})
|
||||
.catch(() => {
|
||||
// 如果加载权限失败,保持当前状态
|
||||
console.error('加载权限数据失败')
|
||||
})
|
||||
},
|
||||
methods: {
|
||||
// 检查是否是管理员(isAdmin === 1)
|
||||
isAdmin() {
|
||||
try {
|
||||
const permissionDataStr = localStorage.getItem('user_self_role')
|
||||
if (!permissionDataStr) {
|
||||
return false
|
||||
}
|
||||
const permissionData = JSON.parse(permissionDataStr)
|
||||
if (!Array.isArray(permissionData)) {
|
||||
return false
|
||||
}
|
||||
// 检查是否有 isAdmin === 1 的记录
|
||||
return permissionData.some((perm) => perm.isAdmin === 1 || perm.isAdmin === '1')
|
||||
} catch (err) {
|
||||
console.error('检查管理员权限失败:', err)
|
||||
return false
|
||||
}
|
||||
},
|
||||
// 检查是否有查看数据的权限
|
||||
hasViewPermission() {
|
||||
// 1. 如果是管理员,拥有全部权限
|
||||
if (this.isAdmin()) {
|
||||
return true
|
||||
}
|
||||
try {
|
||||
const permissionDataStr = localStorage.getItem('user_self_role')
|
||||
if (!permissionDataStr) {
|
||||
return false
|
||||
}
|
||||
const permissionData = JSON.parse(permissionDataStr)
|
||||
if (!Array.isArray(permissionData)) {
|
||||
return false
|
||||
}
|
||||
// 2. 检查是否有 permissionPath 包括 "对标报告审批流程" 的权限
|
||||
return permissionData.some((perm) => {
|
||||
const permissionPath = perm.permissionPath || ''
|
||||
return permissionPath.includes('对标报告审批流程')
|
||||
})
|
||||
} catch (err) {
|
||||
console.error('检查查看权限失败:', err)
|
||||
return false
|
||||
}
|
||||
},
|
||||
// 加载用户自身角色权限
|
||||
loadUserSelfRole() {
|
||||
const request = {
|
||||
...api.GET_USER_SELF_ROLE,
|
||||
params: {
|
||||
userOrDepID: getUserId()
|
||||
},
|
||||
disableSuccessMsg: true
|
||||
}
|
||||
return new Promise((resolve, reject) => {
|
||||
this.$request(request)
|
||||
.asyncThen((resp) => {
|
||||
if (resp && resp.data) {
|
||||
// 将权限数据存储到 localStorage
|
||||
try {
|
||||
localStorage.setItem('user_self_role', JSON.stringify(resp.data))
|
||||
resolve(resp.data)
|
||||
} catch (err) {
|
||||
console.error('存储权限数据到 localStorage 失败:', err)
|
||||
reject(err)
|
||||
}
|
||||
} else {
|
||||
resolve(null)
|
||||
}
|
||||
})
|
||||
.asyncErrorCatch((err) => {
|
||||
console.error('获取用户自身角色失败:', err)
|
||||
reject(err)
|
||||
})
|
||||
})
|
||||
},
|
||||
handleCreate() {
|
||||
this.dialogMode = 'create'
|
||||
this.currentRestartRow = null
|
||||
|
||||
@ -113,7 +113,14 @@
|
||||
|
||||
<template slot="empty">
|
||||
<div class="table-empty">
|
||||
<x-empty-page></x-empty-page>
|
||||
<template v-if="canViewData">
|
||||
<x-empty-page></x-empty-page>
|
||||
</template>
|
||||
<template v-else>
|
||||
<div style="padding: 40px 0; text-align: center; color: #909399;">
|
||||
<div style="font-size: 14px;">无权限查看</div>
|
||||
</div>
|
||||
</template>
|
||||
</div>
|
||||
</template>
|
||||
</x-vxe-table>
|
||||
@ -209,7 +216,8 @@ export default {
|
||||
// 申请人搜索相关
|
||||
applicantOptions: [],
|
||||
applicantLoading: false,
|
||||
applicantSearchTimer: null // 防抖定时器
|
||||
applicantSearchTimer: null, // 防抖定时器
|
||||
canViewData: false // 是否有查看数据的权限
|
||||
}
|
||||
},
|
||||
computed: {
|
||||
@ -276,9 +284,35 @@ export default {
|
||||
}
|
||||
}
|
||||
},
|
||||
created() {
|
||||
mounted() {
|
||||
// 先检查 localStorage 中是否已有权限数据,如果有则先检查权限
|
||||
if (this.hasViewPermission()) {
|
||||
this.canViewData = true
|
||||
this.loadData()
|
||||
} else {
|
||||
this.canViewData = false
|
||||
this.tableData = []
|
||||
}
|
||||
// 同时加载最新的权限数据
|
||||
this.loadUserSelfRole()
|
||||
this.loadData()
|
||||
.then(() => {
|
||||
// 权限加载完成后重新检查权限
|
||||
if (this.hasViewPermission()) {
|
||||
this.canViewData = true
|
||||
// 如果之前没有权限,现在有权限了,则加载数据
|
||||
if (this.tableData.length === 0) {
|
||||
this.loadData()
|
||||
}
|
||||
} else {
|
||||
this.canViewData = false
|
||||
// 无权限时不加载数据,显示空列表
|
||||
this.tableData = []
|
||||
}
|
||||
})
|
||||
.catch(() => {
|
||||
// 如果加载权限失败,保持当前状态
|
||||
console.error('加载权限数据失败')
|
||||
})
|
||||
},
|
||||
beforeDestroy() {
|
||||
// 清理定时器
|
||||
@ -350,6 +384,49 @@ export default {
|
||||
// 如果是提交人,就可以显示撤回按钮
|
||||
return this.isApplicant(row)
|
||||
},
|
||||
// 检查是否是管理员(isAdmin === 1)
|
||||
isAdmin() {
|
||||
try {
|
||||
const permissionDataStr = localStorage.getItem('user_self_role')
|
||||
if (!permissionDataStr) {
|
||||
return false
|
||||
}
|
||||
const permissionData = JSON.parse(permissionDataStr)
|
||||
if (!Array.isArray(permissionData)) {
|
||||
return false
|
||||
}
|
||||
// 检查是否有 isAdmin === 1 的记录
|
||||
return permissionData.some((perm) => perm.isAdmin === 1 || perm.isAdmin === '1')
|
||||
} catch (err) {
|
||||
console.error('检查管理员权限失败:', err)
|
||||
return false
|
||||
}
|
||||
},
|
||||
// 检查是否有查看数据的权限
|
||||
hasViewPermission() {
|
||||
// 1. 如果是管理员,拥有全部权限
|
||||
if (this.isAdmin()) {
|
||||
return true
|
||||
}
|
||||
try {
|
||||
const permissionDataStr = localStorage.getItem('user_self_role')
|
||||
if (!permissionDataStr) {
|
||||
return false
|
||||
}
|
||||
const permissionData = JSON.parse(permissionDataStr)
|
||||
if (!Array.isArray(permissionData)) {
|
||||
return false
|
||||
}
|
||||
// 2. 检查是否有 permissionPath 包括 "玉柴发动机数据审批流程" 的权限
|
||||
return permissionData.some((perm) => {
|
||||
const permissionPath = perm.permissionPath || ''
|
||||
return permissionPath.includes('玉柴发动机数据审批流程')
|
||||
})
|
||||
} catch (err) {
|
||||
console.error('检查查看权限失败:', err)
|
||||
return false
|
||||
}
|
||||
},
|
||||
// 加载用户自身角色权限
|
||||
loadUserSelfRole() {
|
||||
const request = {
|
||||
@ -359,20 +436,27 @@ export default {
|
||||
},
|
||||
disableSuccessMsg: true
|
||||
}
|
||||
this.$request(request)
|
||||
.asyncThen((resp) => {
|
||||
if (resp && resp.data) {
|
||||
// 将权限数据存储到 localStorage
|
||||
try {
|
||||
localStorage.setItem('user_self_role', JSON.stringify(resp.data))
|
||||
} catch (err) {
|
||||
console.error('存储权限数据到 localStorage 失败:', err)
|
||||
return new Promise((resolve, reject) => {
|
||||
this.$request(request)
|
||||
.asyncThen((resp) => {
|
||||
if (resp && resp.data) {
|
||||
// 将权限数据存储到 localStorage
|
||||
try {
|
||||
localStorage.setItem('user_self_role', JSON.stringify(resp.data))
|
||||
resolve(resp.data)
|
||||
} catch (err) {
|
||||
console.error('存储权限数据到 localStorage 失败:', err)
|
||||
reject(err)
|
||||
}
|
||||
} else {
|
||||
resolve(null)
|
||||
}
|
||||
}
|
||||
})
|
||||
.asyncErrorCatch((err) => {
|
||||
console.error('获取用户自身角色失败:', err)
|
||||
})
|
||||
})
|
||||
.asyncErrorCatch((err) => {
|
||||
console.error('获取用户自身角色失败:', err)
|
||||
reject(err)
|
||||
})
|
||||
})
|
||||
},
|
||||
pageSizeChange(size) {
|
||||
this.pagination.pageSize = size
|
||||
|
||||
@ -56,6 +56,7 @@
|
||||
<el-option label="已分发" value="已分发" />
|
||||
<el-option label="部分分发" value="部分分发" />
|
||||
<el-option label="未分发" value="未分发" />
|
||||
<el-option label="已完成" value="已完成" />
|
||||
</el-select>
|
||||
</div>
|
||||
<div class="search-actions">
|
||||
@ -139,6 +140,9 @@
|
||||
<span v-else-if="row[colConfig.prop] === '未分发'" class="status-tag status-pending">
|
||||
未分发
|
||||
</span>
|
||||
<span v-else-if="row[colConfig.prop] === '已完成'" class="status-tag status-done">
|
||||
已完成
|
||||
</span>
|
||||
</div>
|
||||
<div v-if="colConfig.customSlot === 'versionNumber'" :key="index + '' + rowIndex">
|
||||
V{{ row[colConfig.prop] || '' }}
|
||||
@ -147,7 +151,14 @@
|
||||
|
||||
<template slot="empty">
|
||||
<div class="table-empty">
|
||||
<x-empty-page></x-empty-page>
|
||||
<template v-if="canViewData">
|
||||
<x-empty-page></x-empty-page>
|
||||
</template>
|
||||
<template v-else>
|
||||
<div style="padding: 40px 0; text-align: center; color: #909399;">
|
||||
<div style="font-size: 14px;">无权限查看</div>
|
||||
</div>
|
||||
</template>
|
||||
</div>
|
||||
</template>
|
||||
</x-vxe-table>
|
||||
@ -249,7 +260,8 @@ export default {
|
||||
importing: false,
|
||||
selectedImportFile: null,
|
||||
importFileList: [],
|
||||
downloadingTemplate: false
|
||||
downloadingTemplate: false,
|
||||
canViewData: false // 是否有查看数据的权限
|
||||
}
|
||||
},
|
||||
computed: {
|
||||
@ -349,13 +361,35 @@ export default {
|
||||
}
|
||||
}
|
||||
},
|
||||
created() {
|
||||
this.loadUserSelfRole()
|
||||
this.loadData()
|
||||
},
|
||||
mounted() {
|
||||
// 先检查 localStorage 中是否已有权限数据,如果有则先检查权限
|
||||
if (this.hasViewPermission()) {
|
||||
this.canViewData = true
|
||||
this.loadData()
|
||||
} else {
|
||||
this.canViewData = false
|
||||
this.tableData = []
|
||||
}
|
||||
// 同时加载最新的权限数据
|
||||
this.loadUserSelfRole()
|
||||
this.loadData()
|
||||
.then(() => {
|
||||
// 权限加载完成后重新检查权限
|
||||
if (this.hasViewPermission()) {
|
||||
this.canViewData = true
|
||||
// 如果之前没有权限,现在有权限了,则加载数据
|
||||
if (this.tableData.length === 0) {
|
||||
this.loadData()
|
||||
}
|
||||
} else {
|
||||
this.canViewData = false
|
||||
// 无权限时不加载数据,显示空列表
|
||||
this.tableData = []
|
||||
}
|
||||
})
|
||||
.catch(() => {
|
||||
// 如果加载权限失败,保持当前状态
|
||||
console.error('加载权限数据失败')
|
||||
})
|
||||
},
|
||||
methods: {
|
||||
// 检查是否是管理员(isAdmin === 1)
|
||||
@ -376,6 +410,31 @@ export default {
|
||||
return false
|
||||
}
|
||||
},
|
||||
// 检查是否有查看数据的权限
|
||||
hasViewPermission() {
|
||||
// 1. 如果是管理员,拥有全部权限
|
||||
if (this.isAdmin()) {
|
||||
return true
|
||||
}
|
||||
try {
|
||||
const permissionDataStr = localStorage.getItem('user_self_role')
|
||||
if (!permissionDataStr) {
|
||||
return false
|
||||
}
|
||||
const permissionData = JSON.parse(permissionDataStr)
|
||||
if (!Array.isArray(permissionData)) {
|
||||
return false
|
||||
}
|
||||
// 2. 检查是否有 permissionPath 包括 "玉柴发动机数据" 的权限
|
||||
return permissionData.some((perm) => {
|
||||
const permissionPath = perm.permissionPath || ''
|
||||
return permissionPath.includes('玉柴发动机数据')
|
||||
})
|
||||
} catch (err) {
|
||||
console.error('检查查看权限失败:', err)
|
||||
return false
|
||||
}
|
||||
},
|
||||
// 检查是否有玉柴发动机数据的编辑权限
|
||||
hasEngineDataEditPermission() {
|
||||
// 如果是管理员,拥有全部权限
|
||||
@ -411,20 +470,27 @@ export default {
|
||||
},
|
||||
disableSuccessMsg: true
|
||||
}
|
||||
this.$request(request)
|
||||
.asyncThen((resp) => {
|
||||
if (resp && resp.data) {
|
||||
// 将权限数据存储到 localStorage
|
||||
try {
|
||||
localStorage.setItem('user_self_role', JSON.stringify(resp.data))
|
||||
} catch (err) {
|
||||
console.error('存储权限数据到 localStorage 失败:', err)
|
||||
return new Promise((resolve, reject) => {
|
||||
this.$request(request)
|
||||
.asyncThen((resp) => {
|
||||
if (resp && resp.data) {
|
||||
// 将权限数据存储到 localStorage
|
||||
try {
|
||||
localStorage.setItem('user_self_role', JSON.stringify(resp.data))
|
||||
resolve(resp.data)
|
||||
} catch (err) {
|
||||
console.error('存储权限数据到 localStorage 失败:', err)
|
||||
reject(err)
|
||||
}
|
||||
} else {
|
||||
resolve(null)
|
||||
}
|
||||
}
|
||||
})
|
||||
.asyncErrorCatch((err) => {
|
||||
console.error('获取用户自身角色失败:', err)
|
||||
})
|
||||
})
|
||||
.asyncErrorCatch((err) => {
|
||||
console.error('获取用户自身角色失败:', err)
|
||||
reject(err)
|
||||
})
|
||||
})
|
||||
},
|
||||
handleRowDispatch(row, rowIndex) {
|
||||
// 跳转到详情页面,设置为分发模式(分发责任人)
|
||||
|
||||
@ -88,8 +88,8 @@
|
||||
:visible="showEngineCheck"
|
||||
:engine-type="engineType"
|
||||
:from-todo="fromTodo"
|
||||
@refresh="handleBackFromCheck"
|
||||
class="engine-check-wrapper"
|
||||
@refresh="handleBackFromCheck"
|
||||
@close="handleBackFromCheck"
|
||||
/>
|
||||
|
||||
@ -224,6 +224,8 @@ export default {
|
||||
mounted() {
|
||||
this.loadData()
|
||||
this.filterTemplateManagementPermissions()
|
||||
// 检查URL中是否有flowId参数
|
||||
this.checkFlowIdFromUrl()
|
||||
},
|
||||
methods: {
|
||||
pageSizeChange(size) {
|
||||
@ -567,6 +569,35 @@ export default {
|
||||
console.error('日期格式化错误:', error)
|
||||
return cellValue
|
||||
}
|
||||
},
|
||||
checkFlowIdFromUrl() {
|
||||
// 检查URL中是否有flowId参数
|
||||
const flowId = this.$route && this.$route.query && this.$route.query.flowId
|
||||
if (flowId) {
|
||||
const request = {
|
||||
...api.GET_YC_TODO_LIST,
|
||||
params: {
|
||||
flowId: flowId
|
||||
},
|
||||
disableSuccessMsg: true
|
||||
}
|
||||
this.$request(request)
|
||||
.asyncThen((resp) => {
|
||||
// 根据返回值触发handleRowView
|
||||
if (resp && resp.data) {
|
||||
// 尝试多种可能的数据结构
|
||||
const rowData = resp.data.result || resp.data.data || resp.data
|
||||
// 确保rowData有必要的字段
|
||||
if (rowData && (rowData.dataType || rowData.documentNo || rowData.modelId)) {
|
||||
this.handleRowView(rowData)
|
||||
}
|
||||
}
|
||||
})
|
||||
.asyncErrorCatch((err) => {
|
||||
console.error('根据flowId获取待办数据失败:', err)
|
||||
this.$message.error('获取待办数据失败')
|
||||
})
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user