You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

335 lines
9.5 KiB

3 years ago
<template>
<view class="power-box">
<lay-tab type="card" v-model="tabIndex" class="tab-box" @change="_changeTab">
<lay-tab-item title="菜单权限" id="1">
<lay-collapse v-model="openKeys1" v-for="(mIdv,mIdx) in menuList" :key="mIdx">
<lay-collapse-item :title="mIdv.FName" :id="mIdv.FID">
<lay-checkbox name="menu" skin="primary" v-model="mIdv.FIsChose" :value="mIdv.FID" label="全部"
@change="_changeMenu(mIdv,null,1)"></lay-checkbox>
<lay-checkbox name="menu" skin="primary" v-model="cIdv.FIsChose" :value="cIdv.FID"
:label="cIdv.FName" v-for="(cIdv,cIdx) in mIdv.FChild" :key="cIdx"
@change="_changeMenu(mIdv,cIdv,2)"></lay-checkbox>
</lay-collapse-item>
</lay-collapse>
</lay-tab-item>
<lay-tab-item title="事项权限" id="2">
<lay-collapse v-model="openKeys2" v-for="(mIdv,mIdx) in termList" :key="mIdx">
<lay-collapse-item :title="mIdv.FName" :id="mIdv.FID">
<lay-checkbox name="menu" skin="primary" v-model="mIdv.FIsChose" :value="mIdv.FID" label="全部"
@change="_changeMenu(mIdv,null,1)"></lay-checkbox>
<lay-checkbox name="menu" skin="primary" v-model="cIdv.FIsChose" :value="cIdv.FID"
:label="cIdv.FName" v-for="(cIdv,cIdx) in mIdv.FChild" :key="cIdx"
@change="_changeMenu(mIdv,cIdv,2)"></lay-checkbox>
</lay-collapse-item>
</lay-collapse>
</lay-tab-item>
<lay-tab-item title="视图权限" id="3">
<lay-collapse v-model="openKeys3" v-for="(mIdv,mIdx) in viemList" :key="mIdx">
<lay-collapse-item :title="mIdv.FName" :id="mIdv.FID">
<lay-checkbox name="menu" skin="primary" v-model="mIdv.FIsChose" :value="mIdv.FID" label="全部"
@change="_changeMenu(mIdv,null,1)"></lay-checkbox>
<lay-checkbox name="menu" skin="primary" v-model="cIdv.FIsChose" :value="cIdv.FID"
:label="cIdv.FName" v-for="(cIdv,cIdx) in mIdv.FChild" :key="cIdx"
@change="_changeMenu(mIdv,cIdv,2)"></lay-checkbox>
</lay-collapse-item>
</lay-collapse>
</lay-tab-item>
<lay-tab-item title="物料视图编辑" id="4">
<lay-collapse v-model="openKeys4" v-for="(mIdv,mIdx) in termEditList" :key="mIdx">
3 years ago
<lay-collapse-item v-if="mIdv.FName != '物料编辑视图'" :title="mIdv.FName" :id="mIdv.FID">
3 years ago
<lay-checkbox name="menu" skin="primary" v-model="mIdv.FIsChose" :value="mIdv.FID" label="全部"
@change="_changeMenu(mIdv,null,1)"></lay-checkbox>
<lay-checkbox name="menu" skin="primary" v-model="cIdv.FIsChose" :value="cIdv.FID"
:label="cIdv.FName" v-for="(cIdv,cIdx) in mIdv.FChild" :key="cIdx"
@change="_changeMenu(mIdv,cIdv,2)"></lay-checkbox>
</lay-collapse-item>
</lay-collapse>
</lay-tab-item>
</lay-tab>
<view :class="'menuBtn mb'">
3 years ago
<lay-button type="normal" @click="submitMenuClick"></lay-button>
<lay-button @click="cancelClick"></lay-button>
</view>
</view>
</template>
<style scoped>
.power-box {
display: block;
height: 75vh;
}
.tab-box {
max-width: 96%;
margin: 20px auto 0;
}
.menuBtn {
display: block;
text-align: center;
width: 96%;
position: absolute;
bottom: 38px;
}
.mb {
position: relative;
margin-top: 70px;
}
3 years ago
.mb4,
.mb5 {
position: relative;
margin-top: 70px;
}
.view-box {
padding-left: 16px;
display: block;
}
.layui-checkbox {
margin-bottom: 16px;
display: inline-block;
}
</style>
<script>
import {
ref
} from 'vue';
import {
updateRoleModel,
insertRoleModel,
getMenuList,
saveRolePower,
getBasicRoleList
} from "/src/api/api/user";
export default {
setup() {
const roleInfo = ref({});
const tabIndex = ref("1");
const menuList = ref([]);
const viemList = ref([]);
const termList = ref([]);
const termEditList = ref([]);
const termEditList2 = ref([]);
const openKeys1 = ref([]);
const openKeys2 = ref([]);
const openKeys3 = ref([]);
const openKeys4 = ref([]);
const openKeys5 = ref([]);
return {
roleInfo,
tabIndex,
menuList,
viemList,
termList,
termEditList,
termEditList2,
openKeys1,
openKeys2,
openKeys3,
openKeys4,
openKeys5
}
},
props: {
roleInfoObj: {
type: Object,
default: () => {},
}
},
mounted() {
let roleInfo = JSON.parse(JSON.stringify(this.roleInfoObj));
this.roleInfo = roleInfo;
this._getMenuList();
},
methods: {
//当前页面关闭
cancelClick() {
this.$emit('cancelClick', false);
},
_changeTab() {
if (this.tabIndex == 2) {
if (this.openKeys2.length == 0) this._getBasicRoleList(36);
} else if (this.tabIndex == 3) {
if (this.openKeys3.length == 0) this._getBasicRoleList(39);
} else if (this.tabIndex == 4) {
// 20230328 注释
// if (this.openKeys4.length == 0) this._getBasicRoleList(40);
// 20230328 修改
// 参数传84后台同时取40物料视图和44基础视图
if (this.openKeys4.length == 0) this._getBasicRoleList(84);
} else if (this.tabIndex == 5) {
if (this.openKeys5.length == 0) this._getBasicRoleList(44);
}
},
//获取菜单权限
async _getMenuList() {
let result = await getMenuList({
FRoleId: this.roleInfo.FID,
FRoleSet: "1"
}) || [];
this.openKeys1 = [];
result.forEach((item) => {
item.FIsChose = item.FChild.filter(s => s.FIsChose == true).length == item.FChild.length;
this.openKeys1.push(item.FID);
})
this.menuList = result;
},
//获取权限信息(非菜单)
async _getBasicRoleList(roleType) {
let result = await getBasicRoleList({
FRoleId: this.roleInfo.FID,
FRoleSet: "1",
FRoleType: roleType
}) || [];
let card = this.__cardingData(result);
if (roleType == 36) {
this.termList = card.Data;
this.openKeys2 = card.Open;
} else if (roleType == 39) {
this.viemList = card.Data;
this.openKeys3 = card.Open;
} else if (roleType == 40) {
this.termEditList = card.Data;
this.openKeys4 = card.Open;
} else if (roleType == 44) {
this.termEditList2 = card.Data;
this.openKeys5 = card.Open;
} else if (roleType == 84) {
this.termEditList = card.Data;
this.openKeys4 = card.Open;
}
},
//梳理数据
__cardingData(result) {
let viemList = [];
let openKey = [];
result.forEach((item) => {
let parent = viemList.find(s => s.FName == item.FRemark) || null;
if (parent == null) {
parent = {
FID: -2 * (viemList.length + 1),
FChild: [],
FIsChose: false,
FName: item.FRemark
}
viemList.push(parent);
}
parent.FChild.push(item);
});
viemList.forEach((item) => {
item.FIsChose = item.FChild.filter(s => s.FIsChose == true).length == item.FChild.length;
openKey.push(item.FID);
});
return {
Data: viemList,
Open: openKey
}
},
//菜单权限点击联动
_changeMenu(parent, child, type) {
if (type == 1) {
parent.FChild.forEach((item) => {
item.FIsChose = !parent.FIsChose
});
} else {
let tCount = parent.FChild.filter(s => s.FIsChose == true).length;
tCount += child.FIsChose ? -1 : 1;
parent.FIsChose = tCount == parent.FChild.length;
}
},
//保存菜单权限
async submitMenuClick() {
function getIds(list) {
let ids = [];
list.forEach((item) => {
let has = item.FIsChose;
if (item.FChild) {
has = item.FChild.length == 0;
item.FChild.forEach((child) => {
if (child.FIsChose == true) {
ids.push(child.FCode || child.FID);
has = true;
}
});
}
if (has) {
let val = item.FCode || item.FID;
if (val > 0) ids.push(val);
}
});
return ids;
}
/*
* 20230329 需求变更
* 新增物料视图处理逻辑
* 当tabIndex == 4将termEditList里的内容拆分成FEditId和FEditId2termEditList在取值时已将40和44两种类型同时取出
*/
function getIdsWl(list, type) {
let ids = [];
list.forEach((item) => {
let has = item.FIsChose;
if (item.FChild) {
let childList = [];
if (type == 5) {
childList = item.FChild.filter(s => s.FType == 44)
}
if (type == 4) {
childList = item.FChild.filter(s => s.FType == 40)
}
if (childList && childList.length > 0) {
has = childList == 0;
childList.forEach((child) => {
if (child.FIsChose == true) {
ids.push(child.FCode || child.FID);
has = true;
}
});
}
if (has) {
let val = item.FCode || item.FID;
if (val > 0) ids.push(val);
}
}
});
return ids;
}
let result = await saveRolePower({
FRoleId: this.roleInfo.FID,
FMenuId: this.tabIndex == 1 ? getIds(this.menuList).join(',') : null,
FViewId: this.tabIndex == 3 ? getIds(this.viemList).join(',') : null,
FTermId: this.tabIndex == 2 ? getIds(this.termList).join(',') : null,
// 20230329 需求变更 注释
// FEditId: this.tabIndex == 4 ? getIds(this.termEditList).join(',') : null,
// FEditId2: this.tabIndex == 5 ? getIds(this.termEditList2).join(',') : null
// 20230329 需求变更 物料视图合并
FEditId: this.tabIndex == 4 ? getIdsWl(this.termEditList, 4).join(',') : null,
FEditId2: this.tabIndex == 4 ? getIdsWl(this.termEditList, 5).join(',') : null
});
if (result > 0) {
layer.msg("操作成功", {
time: 1000,
icon: 1
});
} else {
layer.msg("操作失败", {
time: 1000,
icon: 2
});
}
}
}
}
</script>