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.
528 lines
18 KiB
528 lines
18 KiB
<template>
|
|
<div class="user-add-or-update">
|
|
<el-dialog
|
|
width="530px"
|
|
:title="!dataForm.id ? buttons.add :buttons.edit"
|
|
:close-on-click-modal="false"
|
|
:visible.sync="visible">
|
|
<!-- 取消 :rules="dataRule"-->
|
|
<el-form :inline="true" :model="dataForm" label-position="top" ref="dataForm"
|
|
@keyup.enter.native="dataFormSubmit()"
|
|
label-width="80px">
|
|
<el-form>
|
|
<el-form-item :label="buttons.username||'用户账号'" prop="userName">
|
|
<el-input v-model="dataForm.userName" style="width: 150px;" placeholder="登录帐号"></el-input>
|
|
</el-form-item>
|
|
<el-form-item :label="buttons.password||'密码'" prop="password" :class="{ 'is-required': !dataForm.id }">
|
|
<el-input v-model="dataForm.password" style="width: 150px;" type="password" ></el-input>
|
|
</el-form-item>
|
|
<el-form-item :label="buttons.comfirmPassword||'确认密码'" prop="comfirmPassword" :class="{ 'is-required': !dataForm.id }">
|
|
<el-input v-model="dataForm.comfirmPassword" style="width: 150px;" type="password"
|
|
></el-input>
|
|
</el-form-item>
|
|
</el-form>
|
|
<el-form>
|
|
<el-form-item :label="buttons.userDisplay||'用户名'" prop="email">
|
|
<el-input v-model="dataForm.userDisplay" style="width: 150px;" ></el-input>
|
|
</el-form-item>
|
|
<el-form-item :label="buttons.domainAccount||'域控账号'" prop="domainAccount">
|
|
<el-input v-model="dataForm.domainAccount" style="width: 150px;" placeholder="域控账号"></el-input>
|
|
</el-form-item>
|
|
<el-form-item :label="buttons.email||'邮箱'" prop="email">
|
|
<el-input v-model="dataForm.email" style="width: 150px;" ></el-input>
|
|
</el-form-item>
|
|
<el-form-item :label="buttons.mobile||'手机号'" prop="mobile">
|
|
<el-input v-model="dataForm.mobile" style="width: 150px;" placeholder="手机号"></el-input>
|
|
</el-form-item>
|
|
<el-form-item :label="buttons.language||'语言'" prop="languageDefault">
|
|
<el-select filterable v-model="dataForm.languageDefault" clearable style="width: 150px;">
|
|
<el-option :label="item.languageName" :value="item.languageCode" v-for="(item,index) in languageList "
|
|
:key="index"></el-option>
|
|
</el-select>
|
|
</el-form-item>
|
|
</el-form>
|
|
<el-form>
|
|
<el-form-item :label="buttons.site||'工厂'" size="mini">
|
|
<el-checkbox-group v-model="selectedSiteIds" @change="handleSiteSelectionChange">
|
|
<el-checkbox v-for="site in siteOptions" :key="site.key" :label="site.key">{{
|
|
site.label
|
|
}}
|
|
</el-checkbox>
|
|
</el-checkbox-group>
|
|
</el-form-item>
|
|
<el-form-item :label="''" size="mini" prop="siteList" class="site-auth-form-item">
|
|
<div v-if="selectedSiteIds.length > 0" class="site-auth-panel">
|
|
<div v-if="getSubSiteOptions(siteId).length > 0" v-for="siteId in selectedSiteIds" :key="siteId" class="site-auth-group">
|
|
<div class="site-auth-group__header">
|
|
<span class="site-auth-group__title">{{ getSiteDisplayName(siteId) }}</span>
|
|
</div>
|
|
<el-checkbox-group
|
|
class="site-auth-subsite-group"
|
|
v-model="subSiteCheckedMap[siteId]"
|
|
@change="handleSubSiteSelectionChange(siteId)">
|
|
<el-checkbox
|
|
v-for="subSite in getSubSiteOptions(siteId)"
|
|
:key="siteId + '_' + subSite.subSiteId"
|
|
:label="subSite.subSiteId"
|
|
class="site-auth-subsite-item">
|
|
{{ subSite.subSiteId }}
|
|
</el-checkbox>
|
|
</el-checkbox-group>
|
|
</div>
|
|
</div>
|
|
</el-form-item>
|
|
</el-form>
|
|
<el-form>
|
|
<el-form-item label="角色" size="mini" prop="roleIdList">
|
|
<el-checkbox-group v-model="dataForm.roleIdList">
|
|
<el-checkbox v-for="role in roleList" :key="role.roleId" :label="role.roleId">{{
|
|
role.roleName
|
|
}}
|
|
</el-checkbox>
|
|
</el-checkbox-group>
|
|
</el-form-item>
|
|
</el-form>
|
|
<el-form>
|
|
<el-form-item label="状态" size="mini" prop="status">
|
|
<el-radio-group v-model="dataForm.status">
|
|
<el-radio :label="0">{{buttons.disable||'禁用'}}</el-radio>
|
|
<el-radio :label="1">{{buttons.normal||'正常'}}</el-radio>
|
|
</el-radio-group>
|
|
</el-form-item>
|
|
</el-form>
|
|
</el-form>
|
|
<span slot="footer" class="dialog-footer">
|
|
<el-button type="primary" @click="dataFormSubmit()">{{buttons.submit||'确定'}}</el-button>
|
|
<el-button @click="visible = false">{{buttons.close||'取消'}}</el-button>
|
|
</span>
|
|
</el-dialog>
|
|
|
|
<Chooselist ref="baseList" @getBaseData="getBaseData"></Chooselist>
|
|
</div>
|
|
|
|
</template>
|
|
|
|
<script>
|
|
import Chooselist from '@/views/modules/common/Chooselist'
|
|
import { getActiveSubSiteOptions, getUserAuthorizedSiteAccess } from '@/api/factory/accessSite.js'
|
|
import { searchFunctionButtonList, searchSysLanguage } from '@/api/sysLanguage.js'
|
|
export default {
|
|
components: {
|
|
Chooselist
|
|
},
|
|
data() {
|
|
return {
|
|
tagNo:'',
|
|
visible: false,
|
|
roleList: [],
|
|
factorys: [],
|
|
languageList: [],
|
|
siteOptions: [], // 工厂选项列表
|
|
selectedSiteIds: [], // 选中的父site
|
|
subSiteOptionsMap: {}, // 子site选项映射,key=siteId
|
|
subSiteCheckedMap: {}, // 已选子site映射,key=siteId
|
|
dataForm: {
|
|
id: 0,
|
|
userName: '',
|
|
password: '',
|
|
comfirmPassword: '',
|
|
languageDefault: 'cn',
|
|
salt: '',
|
|
email: '',
|
|
mobile: '',
|
|
roleIdList: [],
|
|
status: 1,
|
|
site: '', // 保持兼容性
|
|
siteList: [], // 父site编码列表(兼容旧接口)
|
|
siteAccessList: [], // 工厂+子site授权结构(新接口)
|
|
userDisplay: '',
|
|
domainAccount: ''
|
|
},
|
|
buttons: {
|
|
add: this.$t('sys.common.add'), edit: this.$t('sys.common.edit'), username: this.$t('sys.user.account'), userDisplay: this.$t('sys.user.userName'),
|
|
domainAccount: this.$t('sys.user.domainAccount'), email: this.$t('sys.user.email'), mobile: this.$t('sys.user.mobile'), status: this.$t('sys.user.status'),
|
|
disable: this.$t('sys.user.disabled'), normal: this.$t('sys.user.normal'), password: this.$t('sys.user.password'), comfirmPassword: this.$t('sys.user.confirmPassword'),
|
|
submit: this.$t('sys.common.confirm'), close: this.$t('sys.common.cancel'), site: this.$t('sys.user.factory'), subSite: this.$t('sys.user.subSite'), language: this.$t('sys.user.language')
|
|
},
|
|
}
|
|
},
|
|
methods: {
|
|
getFunctionButtonList() {
|
|
let queryButton = {
|
|
functionId: this.$route.meta.menuId,
|
|
tableId: '*',
|
|
languageCode: this.$i18n.locale,
|
|
objectType: 'button'
|
|
}
|
|
searchFunctionButtonList(queryButton).then(({data}) => {
|
|
if (data.code == 0 && data.data) {
|
|
this.buttons = data.data
|
|
}
|
|
})
|
|
},
|
|
getBaseData(val){
|
|
if (this.tagNo === 93){
|
|
this.dataForm.site = val.SiteID
|
|
}
|
|
},
|
|
// 获取基础数据列表
|
|
getBaseList(val){
|
|
this.tagNo = val
|
|
this.$nextTick(() => {
|
|
let strVal = "";
|
|
if (val === 93){
|
|
strVal = this.dataForm.site
|
|
}
|
|
this.$refs.baseList.init(val,strVal)
|
|
})
|
|
},
|
|
// 获取多语言列表
|
|
getLanguageList() {
|
|
let queryLanguage = { languageCode: this.$i18n.locale}
|
|
searchSysLanguage(queryLanguage).then(({data}) => {
|
|
this.languageList = data.rows
|
|
})
|
|
},
|
|
|
|
|
|
init(id) {
|
|
this.dataForm.id = id || 0
|
|
|
|
// 如果是新增模式,清空表单数据
|
|
if (!this.dataForm.id) {
|
|
this.dataForm = {
|
|
id: 0,
|
|
userName: '',
|
|
password: '',
|
|
comfirmPassword: '',
|
|
languageDefault: 'cn',
|
|
salt: '',
|
|
email: '',
|
|
mobile: '',
|
|
roleIdList: [],
|
|
status: 1,
|
|
site: '',
|
|
siteList: [],
|
|
siteAccessList: [],
|
|
userDisplay: '',
|
|
domainAccount: ''
|
|
}
|
|
}
|
|
this.selectedSiteIds = []
|
|
this.subSiteOptionsMap = {}
|
|
this.subSiteCheckedMap = {}
|
|
|
|
// this.factoryList();
|
|
this.getLanguageList();
|
|
this.getSiteOptions(); // 获取工厂选项
|
|
this.$http({
|
|
url: this.$http.adornUrl('/sys/role/select'),
|
|
method: 'get',
|
|
params: this.$http.adornParams()
|
|
}).then(({data}) => {
|
|
this.roleList = data && data.code === 0 ? data.list : []
|
|
}).then(() => {
|
|
this.visible = true
|
|
this.$nextTick(() => {
|
|
this.$refs['dataForm'].resetFields()
|
|
})
|
|
}).then(() => {
|
|
if (this.dataForm.id) {
|
|
// 编辑模式:加载用户数据
|
|
this.$http({
|
|
url: this.$http.adornUrl(`/sys/user/info/${this.dataForm.id}`),
|
|
method: 'get',
|
|
params: this.$http.adornParams()
|
|
}).then(({data}) => {
|
|
if (data && data.code === 0) {
|
|
this.dataForm.userName = data.user.username
|
|
this.dataForm.salt = data.user.salt
|
|
this.dataForm.email = data.user.email
|
|
this.dataForm.mobile = data.user.mobile
|
|
this.dataForm.roleIdList = data.user.roleIdList
|
|
this.dataForm.status = data.user.status
|
|
this.dataForm.languageDefault = data.user.languageDefault
|
|
this.dataForm.site = data.user.site.toString()
|
|
this.dataForm.userDisplay = data.user.userDisplay
|
|
this.dataForm.domainAccount = data.user.domainAccount
|
|
// 获取用户工厂权限
|
|
this.getUserSiteAccess(data.user.username)
|
|
}
|
|
})
|
|
}
|
|
})
|
|
},
|
|
// 表单提交
|
|
dataFormSubmit() {
|
|
const needSubSiteSelect = this.selectedSiteIds.find(siteId => {
|
|
return this.getSubSiteOptions(siteId).length > 0 && (!this.subSiteCheckedMap[siteId] || this.subSiteCheckedMap[siteId].length === 0)
|
|
})
|
|
if (needSubSiteSelect) {
|
|
this.$message.warning(this.$t('sys.user.selectSubSiteFirst') || '请选择子site')
|
|
return
|
|
}
|
|
this.buildSiteAccessData()
|
|
this.$refs['dataForm'].validate((valid) => {
|
|
if (valid) {
|
|
// 保存用户信息和工厂授权(在一个事务中)
|
|
this.$http({
|
|
url: this.$http.adornUrl(`/sys/user/${!this.dataForm.id ? 'save' : 'update'}`),
|
|
method: 'post',
|
|
data: this.$http.adornData({
|
|
'userId': this.dataForm.id || undefined,
|
|
'username': this.dataForm.userName,
|
|
'password': this.dataForm.password,
|
|
'salt': this.dataForm.salt,
|
|
'email': this.dataForm.email,
|
|
'mobile': this.dataForm.mobile,
|
|
'status': this.dataForm.status,
|
|
'roleIdList': this.dataForm.roleIdList,
|
|
'languageDefault': this.dataForm.languageDefault,
|
|
'site': this.dataForm.site,
|
|
'userDisplay': this.dataForm.userDisplay,
|
|
'domainAccount': this.dataForm.domainAccount,
|
|
'siteList': this.dataForm.siteList || [], // 兼容旧接口
|
|
'siteAccessList': this.dataForm.siteAccessList || [] // 工厂+子site授权结构
|
|
})
|
|
}).then(({data}) => {
|
|
if (data && data.code === 0) {
|
|
this.$message.success('操作成功')
|
|
this.visible = false
|
|
this.$emit('refreshDataList')
|
|
} else {
|
|
let msg = data.msg.split('<br>')[0]
|
|
this.$message.error( this.$t(`${msg}`))
|
|
}
|
|
})
|
|
}
|
|
})
|
|
},
|
|
// 获取工厂选项列表
|
|
getSiteOptions() {
|
|
getActiveSubSiteOptions({}).then(({data}) => {
|
|
if (data && data.code === 0) {
|
|
const rows = data.data || []
|
|
const siteOptionMap = {}
|
|
const subSiteOptionMap = {}
|
|
|
|
rows.forEach(item => {
|
|
const siteId = item.siteId
|
|
if (!siteId) {
|
|
return
|
|
}
|
|
|
|
if (!siteOptionMap[siteId]) {
|
|
siteOptionMap[siteId] = {
|
|
key: siteId,
|
|
label: item.siteName || siteId
|
|
}
|
|
}
|
|
|
|
if (item.subSiteId) {
|
|
if (!subSiteOptionMap[siteId]) {
|
|
subSiteOptionMap[siteId] = []
|
|
}
|
|
if (!subSiteOptionMap[siteId].some(subSite => subSite.subSiteId === item.subSiteId)) {
|
|
subSiteOptionMap[siteId].push({
|
|
subSiteId: item.subSiteId
|
|
})
|
|
}
|
|
}
|
|
})
|
|
|
|
this.siteOptions = Object.values(siteOptionMap)
|
|
this.subSiteOptionsMap = subSiteOptionMap
|
|
}
|
|
}).catch(() => {
|
|
this.$message.error('获取工厂子site列表失败')
|
|
})
|
|
},
|
|
// 获取工厂显示名称
|
|
getSiteDisplayName(siteId) {
|
|
const site = this.siteOptions.find(item => item.key === siteId)
|
|
return site ? `${site.label}` : siteId
|
|
},
|
|
// 获取指定工厂的子site列表
|
|
getSubSiteOptions(siteId) {
|
|
return this.subSiteOptionsMap[siteId] || []
|
|
},
|
|
// 选择父site后联动子site
|
|
handleSiteSelectionChange() {
|
|
const selectedSet = new Set(this.selectedSiteIds)
|
|
Object.keys(this.subSiteCheckedMap).forEach(siteId => {
|
|
if (!selectedSet.has(siteId)) {
|
|
this.$delete(this.subSiteCheckedMap, siteId)
|
|
}
|
|
})
|
|
this.selectedSiteIds.forEach(siteId => {
|
|
if (!this.subSiteCheckedMap[siteId]) {
|
|
// 新勾选父site时,默认勾选该site下全部子site
|
|
const defaultCheckedSubSites = this.getSubSiteOptions(siteId)
|
|
.map(subSite => subSite.subSiteId)
|
|
.filter(Boolean)
|
|
this.$set(this.subSiteCheckedMap, siteId, defaultCheckedSubSites)
|
|
}
|
|
})
|
|
this.buildSiteAccessData()
|
|
},
|
|
// 选择子site后同步授权结构
|
|
handleSubSiteSelectionChange(siteId) {
|
|
const checkedList = this.subSiteCheckedMap[siteId] || []
|
|
this.$set(this.subSiteCheckedMap, siteId, Array.from(new Set(checkedList)))
|
|
this.buildSiteAccessData()
|
|
},
|
|
// 组装提交给后端的授权结构
|
|
buildSiteAccessData() {
|
|
const siteAccessList = []
|
|
const siteList = []
|
|
this.selectedSiteIds.forEach(siteId => {
|
|
const subSiteOptions = this.getSubSiteOptions(siteId)
|
|
const checkedList = this.subSiteCheckedMap[siteId] || []
|
|
if (subSiteOptions.length === 0) {
|
|
siteAccessList.push({
|
|
userId: this.dataForm.userName,
|
|
site: siteId,
|
|
subSiteId: ''
|
|
})
|
|
siteList.push(siteId)
|
|
return
|
|
}
|
|
checkedList.forEach(subSiteId => {
|
|
if (!subSiteId) {
|
|
return
|
|
}
|
|
siteAccessList.push({
|
|
userId: this.dataForm.userName,
|
|
site: siteId,
|
|
subSiteId: subSiteId
|
|
})
|
|
siteList.push(siteId)
|
|
})
|
|
})
|
|
this.dataForm.siteAccessList = siteAccessList
|
|
this.dataForm.siteList = Array.from(new Set(siteList))
|
|
// 用户主站点仍保持兼容:默认取第一个父site
|
|
if (!this.dataForm.site && this.dataForm.siteList.length > 0) {
|
|
this.dataForm.site = this.dataForm.siteList[0]
|
|
}
|
|
},
|
|
// 获取用户工厂权限
|
|
getUserSiteAccess(username) {
|
|
if (!username) return
|
|
getUserAuthorizedSiteAccess({ userName: username }).then(({data}) => {
|
|
if (data && data.code === 0) {
|
|
const accessRows = data.data || []
|
|
const selectedSiteIds = []
|
|
const checkedMap = {}
|
|
|
|
accessRows.forEach(item => {
|
|
let siteId = item.siteId || item.siteCode || ''
|
|
if (!siteId) {
|
|
return
|
|
}
|
|
const subSiteId = item.subSiteId || ''
|
|
|
|
if (!checkedMap[siteId]) {
|
|
checkedMap[siteId] = []
|
|
selectedSiteIds.push(siteId)
|
|
}
|
|
if (subSiteId && checkedMap[siteId].indexOf(subSiteId) === -1) {
|
|
checkedMap[siteId].push(subSiteId)
|
|
}
|
|
})
|
|
|
|
this.selectedSiteIds = selectedSiteIds
|
|
this.subSiteCheckedMap = {}
|
|
selectedSiteIds.forEach(siteId => {
|
|
this.$set(this.subSiteCheckedMap, siteId, checkedMap[siteId] || [])
|
|
})
|
|
this.buildSiteAccessData()
|
|
}
|
|
}).catch(() => {
|
|
this.$message.error('获取用户工厂权限失败')
|
|
})
|
|
}
|
|
},
|
|
created() {
|
|
//this.getFunctionButtonList()
|
|
}
|
|
}
|
|
</script>
|
|
<style lang="scss" scoped>
|
|
.site-auth-form-item {
|
|
width: 100%;
|
|
}
|
|
|
|
.site-auth-panel {
|
|
max-height: 200px;
|
|
overflow-y: auto;
|
|
padding-right: 4px;
|
|
}
|
|
|
|
.site-auth-placeholder {
|
|
color: #909399;
|
|
line-height: 20px;
|
|
padding: 8px 10px;
|
|
border: 1px dashed #dcdfe6;
|
|
border-radius: 4px;
|
|
background: #fafafa;
|
|
}
|
|
|
|
.site-auth-group {
|
|
margin-bottom: 10px;
|
|
padding: 8px 10px;
|
|
border: 1px solid #ebeef5;
|
|
border-radius: 4px;
|
|
background: #fff;
|
|
}
|
|
|
|
.site-auth-group:last-child {
|
|
margin-bottom: 0;
|
|
}
|
|
|
|
.site-auth-group__header {
|
|
display: flex;
|
|
justify-content: space-between;
|
|
align-items: center;
|
|
margin-bottom: 8px;
|
|
}
|
|
|
|
.site-auth-group__title {
|
|
color: #303133;
|
|
font-weight: 500;
|
|
line-height: 20px;
|
|
}
|
|
|
|
.site-auth-group__meta {
|
|
color: #909399;
|
|
font-size: 12px;
|
|
line-height: 20px;
|
|
}
|
|
|
|
.site-auth-empty-subsite {
|
|
display: flex;
|
|
align-items: center;
|
|
color: #e6a23c;
|
|
line-height: 20px;
|
|
padding: 6px 8px;
|
|
border: 1px solid #faecd8;
|
|
border-radius: 4px;
|
|
background: #fdf6ec;
|
|
}
|
|
|
|
.site-auth-empty-subsite .el-icon-info {
|
|
margin-right: 6px;
|
|
font-size: 14px;
|
|
}
|
|
|
|
.site-auth-subsite-group {
|
|
display: flex;
|
|
flex-wrap: wrap;
|
|
margin-bottom: -6px;
|
|
}
|
|
|
|
.site-auth-subsite-item {
|
|
margin-right: 16px;
|
|
margin-bottom: 6px;
|
|
}
|
|
</style>
|