123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549 |
- <template>
- <a-spin :spinning="confirmLoading">
- <j-form-container :disabled="formDisabled">
- <a-form-model ref="form" :model="model" :rules="validatorRules" slot="detail">
- <a-row>
- <a-col :span="24">
- <a-form-model-item :labelCol="labelCol" :wrapperCol="wrapperCol" prop="username">
- <span slot="label">
- 用户名称
- <a-tooltip title="用户名称为邮箱格式">
- <a-icon type="question-circle-o" />
- </a-tooltip>
- </span>
- <a-input v-model="model.username" placeholder="请输入用户名称" :disabled="userDisabled" ></a-input>
- </a-form-model-item>
- </a-col>
- <a-col :span="24">
- <a-form-model-item label="描述" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="remark">
- <a-input v-model="model.remark" placeholder="请输入描述" ></a-input>
- </a-form-model-item>
- </a-col>
- <a-col :span="24">
- <a-form-model-item label="是否为系统管理员" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="role">
- <a-switch v-model="model.isSystem" checked-children="是" un-checked-children="否" @change="roleChange" :disabled="model.isSsoAdmin"/>
- </a-form-model-item>
- </a-col>
- <a-col :span="24">
- <a-form-model-item label="所拥有的权限" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="role">
- <a-table
- v-if="tpmTreeData && tpmTreeData.length"
- ref="table"
- size="middle"
- :scroll="{x:true}"
- bordered
- rowKey="interlockSystemId"
- :columns="columns"
- :dataSource="tpmTreeData"
- :loading="loading"
- :pagination="false"
- defaultExpandAllRows
- class="interlock-user-limit"
- >
- <!-- class="j-table-force-nowrap" -->
- <!-- @change="handleTableChange" -->
- <span slot="manageTitle">
- <a-checkbox v-model="manageHeader" :indeterminate="indeterminateManageHeader" :disabled="model.isSystem" @change="changeManageHeader"/>
- <div>管理</div>
- </span>
- <span slot="manage" slot-scope="text, record">
- <!-- <span v-if="record.interlockType === '0' && !record.children">-</span> -->
- <!-- <a-checkbox v-else v-model="record.manage" :indeterminate="record.indeterminateManage" :disabled="model.isSystem"/> -->
- <a-checkbox v-model="record.manage" :indeterminate="record.indeterminateManage" :disabled="model.isSystem"/>
- </span>
- <span slot="viewTitle">
- <a-checkbox v-model="viewHeader" :indeterminate="indeterminateViewHeader" :disabled="model.isSystem" @change="changeViewHeader"/>
- <div>查看</div>
- </span>
- <span slot="view" slot-scope="text, record">
- <!-- <span v-if="record.interlockType === '0' && !record.children">-</span> -->
- <!-- <a-checkbox v-else v-model="record.view" :indeterminate="record.indeterminateView" :disabled="model.isSystem"/> -->
- <a-checkbox v-model="record.view" :indeterminate="record.indeterminateView" :disabled="model.isSystem"/>
- </span>
- </a-table>
- </a-form-model-item>
- </a-col>
- </a-row>
- </a-form-model>
- </j-form-container>
- </a-spin>
- </template>
- <script>
- import { httpAction, getAction } from '@/api/manage'
- import { validateDuplicateValue } from '@/utils/util'
- import cookie from 'js-cookie'
- export default {
- name: 'InterlockUserForm',
- components: {
- },
- props: {
- //表单禁用
- disabled: {
- type: Boolean,
- default: false,
- required: false
- }
- },
- data () {
- return {
- userDisabled: false, // 修改时用户名不可修改
- model:{
- },
- labelCol: {
- xs: { span: 24 },
- sm: { span: 5 },
- },
- wrapperCol: {
- xs: { span: 24 },
- sm: { span: 16 },
- },
- confirmLoading: false,
- validatorRules: {
- username: [
- { required: true, message: '请输入用户名称!', },
- { validator: (rule, value, callback) => validateDuplicateValue('interlock_user', 'username', value, this.model.id, callback)},
- {
- pattern: /^[a-zA-Z0-9_.-]+@[a-zA-Z0-9-]+(\.[a-zA-Z0-9-]+)*\.[a-zA-Z0-9]{2,6}$/,
- message: '邮箱格式不正确'
- },
- ],
- },
- url: {
- add: "/interlockUser/interlockUser/addUser",
- edit: "/interlockUser/interlockUser/editUser",
- queryById: "/interlockUser/interlockUser/queryUserById"
- },
- // 权限树-装置系统
- loading: false,
- tpmTreeData: [],
- expandedRowKeys: [],
- columns: [
- {
- title:'',
- dataIndex: 'interlockName'
- },
- {
- // title:'管理',
- align:"center",
- dataIndex: 'manage',
- width:147,
- slots: { title: 'manageTitle' },
- scopedSlots: { customRender: 'manage' },
- customCell: (record, index)=>{ return this.customCell(record, index, 'manage')}
- },
- {
- // title:'查看',
- align:"center",
- dataIndex: 'view',
- width:147,
- slots: { title: 'viewTitle' },
- scopedSlots: { customRender: 'view' },
- customCell: (record, index)=>{ return this.customCell(record, index, 'view')}
- },
- ],
- manageHeader: false,
- indeterminateManageHeader: false,
- viewHeader: false,
- indeterminateViewHeader: false,
- }
- },
- computed: {
- formDisabled(){
- return this.disabled
- },
- // isSsoManage(){
- // return cookie.get('SSORole') === 'globalAdmin'
- // // return this.$store.getters.userInfo.role === '0'
- // },
- },
- created () {
- //备份model原始值
- this.modelDefault = JSON.parse(JSON.stringify(this.model));
- },
- methods: {
- // 新增
- async add () {
- this.confirmLoading = true
- await getAction(`/base/interlockBase/list`).then(res=>{
- // 重组数据
- var arr = res.map(item => {
- var reValue = {}
- reValue.interlockName = item.interlockName
- reValue.interlockApparatusId = item.pid
- reValue.interlockSystemId = item.id
- reValue.interlockType = item.interlockType
- reValue.iotedgeGroupId = item.iotedgeGroupId
- reValue.limitType = ''
- reValue.manage = false
- reValue.view = false
- reValue.indeterminateManage = false
- reValue.indeterminateView = false
- return reValue
- })
- // arr.push({
- // interlockName: '所有',
- // interlockApparatusId: '',
- // interlockSystemId: '0',
- // manage: false,
- // view: false,
- // indeterminateManage: false,
- // indeterminateView: false,
- // })
- this.tpmTreeData = this.handleTree(arr, "interlockSystemId", "interlockApparatusId")
- this.confirmLoading = false
- })
- },
- // 编辑
- async edit (record) {
- this.confirmLoading = true
- var interlockOrgData = []
- // 获取装置设置数据
- await getAction(`/base/interlockBase/list`).then(res=>{
- interlockOrgData = res
- })
- // 获取当前选择账户的详情以及权限等
- getAction(this.url.queryById, {id: record.id}).then(response => {
- this.model = Object.assign({}, response.result);
- this.model.isSystem = this.model.role === '0' ? true : false
- // console.log('model', this.model)
- var systemLimitList = response.result.systemLimitList
- // 重组数据
- var arr = interlockOrgData.map(ele => {
- var value = systemLimitList.find(item => item.interlockSystemId === ele.id)
- // console.log(value)
- var reValue = {}
- if(value){reValue.id = value.id}
- reValue.interlockName = ele.interlockName
- reValue.interlockApparatusId = ele.pid
- reValue.interlockSystemId = ele.id
- reValue.interlockType = ele.interlockType
- reValue.iotedgeGroupId = ele.iotedgeGroupId
- reValue.limitType = ''
- reValue.manage = false
- reValue.view = false
- reValue.indeterminateManage = false
- reValue.indeterminateView = false
- if(this.model.role === '0'){
- reValue.manage = true
- }
- if(this.model.role !== '0' && value){
- // reValue.id = value.id
- reValue.limitType = value.limitType
- reValue.manage = value.limitType === '0' ? true : false
- reValue.view = value.limitType === '1' ? true : false
- }
- return reValue
- })
- // console.log(arr)
- this.tpmTreeData = this.handleTree(arr, "interlockSystemId", "interlockApparatusId")
- // console.log(this.tpmTreeData)
- // 根据子系统回显父装置的多选框样式
- this.tpmTreeData.forEach(ele => {
- if(ele.children && ele.children.length > 0){
- // 设置每一个父装置管理选择框样式
- var chooseLengthM = ele.children.filter(item => item.manage).length
- ele.indeterminateManage = !!chooseLengthM && chooseLengthM < ele.children.length
- ele.manage = chooseLengthM === ele.children.length
- // 设置每一个父装置查看选择框样式
- var chooseLengthV = ele.children.filter(item => item.view).length
- ele.indeterminateView = !!chooseLengthV && chooseLengthV < ele.children.length
- ele.view = chooseLengthV === ele.children.length
- }
- })
- // 根据装置设置总管理/查看的多选框样式
- // 设置总的管理/查看多选框样式
- var chooseLengthMH = this.tpmTreeData.filter(item => item.manage || (!item.manage && item.indeterminateManage)).length
- this.indeterminateManageHeader = !!chooseLengthMH && chooseLengthMH < this.tpmTreeData.length
- this.manageHeader = chooseLengthMH === this.tpmTreeData.length
- var chooseLengthVH = this.tpmTreeData.filter(item => item.view || (!item.view && item.indeterminateView)).length
- this.indeterminateViewHeader = !!chooseLengthVH && chooseLengthVH < this.tpmTreeData.length
- this.viewHeader = chooseLengthVH === this.tpmTreeData.length
- this.visible = true;
- this.confirmLoading = false
- })
- },
- // 表头管理多选框切换选择时
- changeManageHeader(e){
- // console.log(e.target.checked)
- if(e.target.checked){
- // 自身样式相应改变
- this.viewHeader = false
- this.indeterminateViewHeader = false
- this.indeterminateManageHeader = false
- for (let i = 0; i < this.tpmTreeData.length; i++) {
- // 父装置样式改变
- const element = this.tpmTreeData[i];
- element.manage = true
- element.indeterminateManage = false
- element.view = false
- element.indeterminateView = false
- if(element.children && element.children.length > 0){
- element.children.forEach(item => {
- // 子系统样式改变
- item.manage = true
- item.view = false
- })
- }
- }
- } else {
- for (let i = 0; i < this.tpmTreeData.length; i++) {
- const element = this.tpmTreeData[i];
- element.manage = false
- element.view = false
- if(element.children && element.children.length > 0){
- element.children.forEach(item => {
- item.manage = false
- item.view = false
- })
- }
- }
- }
- },
- // 表头查看多选框切换选择时
- changeViewHeader(e){
- if(e.target.checked){
- this.manageHeader = false
- this.indeterminateManageHeader = false
- this.indeterminateViewHeader = false
- for (let i = 0; i < this.tpmTreeData.length; i++) {
- // 父装置样式改变
- const element = this.tpmTreeData[i];
- element.view = true
- element.indeterminateManage = false
- element.manage = false
- element.indeterminateView = false
- if(element.children && element.children.length > 0){
- element.children.forEach(item => {
- // 子系统样式改变
- item.view = true
- item.manage = false
- })
- }
- }
- } else {
- for (let i = 0; i < this.tpmTreeData.length; i++) {
- const element = this.tpmTreeData[i];
- element.view = false
- element.manage = false
- if(element.children && element.children.length > 0){
- element.children.forEach(item => {
- item.view = false
- item.manage = false
- })
- }
- }
- }
- },
- // 角色切换时
- roleChange(e){
- // this.$set(this.model, 'isSystem', e)
- this.model = {...this.model}
- if(e){
- // 当前为管理员
- this.manageHeader = true
- this.indeterminateViewHeader = false
- this.indeterminateManageHeader = false
- for (let i = 0; i < this.tpmTreeData.length; i++) {
- const element = this.tpmTreeData[i];
- element.manage = true
- element.indeterminateManage = false
- element.indeterminateView = false
- if(element.children && element.children.length > 0){
- element.children.forEach(item => {
- item.manage = true
- item.view = false
- })
- }
- }
- } else {
- // 当前为管理员
- this.manageHeader = false
- for (let i = 0; i < this.tpmTreeData.length; i++) {
- const element = this.tpmTreeData[i];
- element.manage = false
- if(element.children && element.children.length > 0){
- element.children.forEach(item => {
- item.manage = false
- item.view = false
- })
- }
- }
- }
- },
- customCell(record, rowIndex, value){
- return {
- props: {
- },
- on: { // 事件
- click: (event) => {
- // console.log(event)
- // console.log(event.target.checked)
- // console.log(record, rowIndex, value)
- // 当前点击为装置且点击为装置选择框
- if(record.interlockType === '0' && event.target.type === 'checkbox'){
- // 全选管理
- if(value === 'manage' && event.target.checked){
- // 当前父装置多选框样式以及管理查看取反设置
- record.indeterminateView = false
- record.indeterminateManage = false
- record.manage = true
- record.view = false
- // 根据装置选择情况判断子系统的选择状态
- if(record.children && record.children.length > 0){
- record.children.forEach(ele => {
- ele.manage = true
- ele.view = false
- })
- }
- }
- // 全选查看
- if(value === 'view' && event.target.checked){
- // 当前父装置多选框样式以及管理查看取反设置
- record.indeterminateManage = false
- record.indeterminateView = false
- record.view = true
- record.manage = false
- // 根据装置选择情况判断子系统的选择状态
- if(record.children && record.children.length > 0){
- record.children.forEach(ele => {
- ele.view = true
- ele.manage = false
- })
- }
- }
- // 取消全选
- if(!event.target.checked){
- record.indeterminateManage = false
- record.indeterminateView = false
- record.view = false
- record.manage = false
- if(record.children && record.children.length > 0){
- record.children.forEach(ele => {
- ele.manage = false
- ele.view = false
- })
- }
- }
- }
- // 当前点击为装置且点击为系统选择框
- if(record.interlockType === '1' && event.target.type === 'checkbox'){
- console.log(record, rowIndex, value)
- // 管理和查看相互取反,并设置对应父装置的多选框样式
- // interlockApparatusId相当于pid,interlockSystemId相当于id
- // 某系统选择管理时
- if(value === 'manage'){
- // 取反
- // if(event.target.checked){record.view = false}
- record.view = event.target.checked ? !event.target.checked : record.view
- // 设置为true/false是为了下面判断length
- record.manage = event.target.checked
- var pidValue = this.tpmTreeData.find(item => item.interlockSystemId === record.interlockApparatusId)
- // 设置当前子系统父装置管理选择框样式
- var chooseLengthM = pidValue.children.filter(item => item.manage).length
- pidValue.indeterminateManage = !!chooseLengthM && chooseLengthM < pidValue.children.length
- pidValue.manage = chooseLengthM === pidValue.children.length
- // 设置当前子系统父装置查看选择框样式
- var chooseLengthV = pidValue.children.filter(item => item.view).length
- pidValue.indeterminateView = !!chooseLengthV && chooseLengthV < pidValue.children.length
- pidValue.view = chooseLengthV === pidValue.children.length
- }
- if(value === 'view'){
- // 取反
- record.manage = event.target.checked ? !event.target.checked : record.manage
- // 设置为true/false是为了下面判断length
- record.view = event.target.checked
- // 设置当前子系统父装置查看选择框样式
- var pidValue = this.tpmTreeData.find(item => item.interlockSystemId === record.interlockApparatusId)
- var chooseLengthV = pidValue.children.filter(item => item.view).length
- pidValue.indeterminateView = !!chooseLengthV && chooseLengthV < pidValue.children.length
- pidValue.view = chooseLengthV === pidValue.children.length
- // 设置当前子系统父装置管理选择框样式
- var chooseLengthM = pidValue.children.filter(item => item.manage).length
- pidValue.indeterminateManage = !!chooseLengthM && chooseLengthM < pidValue.children.length
- pidValue.manage = chooseLengthM === pidValue.children.length
- }
- }
- // 设置总的管理/查看多选框样式
- // console.log(this.tpmTreeData)
- // 管理选择但没完全选择样式
- var hasChooseLengthMH = this.tpmTreeData.filter(item => item.manage || (!item.manage && item.indeterminateManage)).length
- // 管理全选样式
- var chooseAllLengthMH = this.tpmTreeData.filter(item => item.manage).length
- this.indeterminateManageHeader = !!hasChooseLengthMH && hasChooseLengthMH <= this.tpmTreeData.length && chooseAllLengthMH !== this.tpmTreeData.length
- this.manageHeader = chooseAllLengthMH === this.tpmTreeData.length
- // 查看选择但没完全选择样式
- var hasChooseLengthVH = this.tpmTreeData.filter(item => item.view || (!item.view && item.indeterminateView)).length
- // 查看全选样式
- var chooseAllLengthVH = this.tpmTreeData.filter(item => item.view).length
- this.indeterminateViewHeader = !!hasChooseLengthVH && hasChooseLengthVH <= this.tpmTreeData.length && chooseAllLengthVH !== this.tpmTreeData.length
- this.viewHeader = chooseAllLengthVH === this.tpmTreeData.length
- },
- },
- };
- },
- submitForm () {
- const that = this;
- // 触发表单验证
- this.$refs.form.validate(valid => {
- if (valid) {
- // console.log(this.tpmTreeData)
- // 二维转一维
- var arr = []
- this.tpmTreeData.forEach(item => {
- if(item.children){
- arr.push(...item.children)
- }
- })
- // console.log(arr)
- this.model.systemLimitList = arr.map(item => {
- if(item.manage){item.limitType = '0'}
- if(item.view){item.limitType = '1'}
- if(!item.manage && !item.view){item.limitType = ''}
- return item
- })
- this.model.role = this.model.isSystem ? '0' : '1'
- // console.log(su)
- that.confirmLoading = true;
- let httpurl = '';
- let method = '';
- if(!this.model.id){
- httpurl+=this.url.add;
- method = 'post';
- }else{
- httpurl+=this.url.edit;
- method = 'put';
- }
- // 1820384671259701250 -- 联锁系统管理员
- // 1820343133955698689 -- 联锁普通SSO用户
- this.model.roleId = this.model.isSystem ? '1820384671259701250' : '1820343133955698689'
- httpAction(httpurl,this.model,method).then((res)=>{
- if(res.success){
- that.$message.success(res.message);
- that.$emit('ok');
- }else{
- that.$message.warning(res.message);
- }
- }).finally(() => {
- that.confirmLoading = false;
- })
- }
-
- })
- },
- }
- }
- </script>
- <style lang="less">
- .interlock-user-limit{
- tr{
- td{
- padding: 5px 8px !important;
- }
- }
- }
- </style>
|