Procházet zdrojové kódy

Merge remote-tracking branch 'origin/master'

yuhongqi před 21 hodinami
rodič
revize
c18164ca5f

+ 11 - 1
src/api/company/companyMenu.js

@@ -55,9 +55,19 @@ export function exportCompanyMenu(query) {
 
 
 // 查询菜单下拉树结构
-export function treeselect() {
+export function companyTreeselect() {
   return request({
     url: '/company/companyMenu/treeselect',
     method: 'get'
   })
 }
+
+
+
+// 根据角色ID查询菜单下拉树结构
+export function companyRoleMenuTreeselect(roleId) {
+  return request({
+    url: '/company/companyMenu/roleMenuTreeselect/' + roleId,
+    method: 'get'
+  })
+}

+ 11 - 1
src/api/company/companyRole.js

@@ -35,6 +35,16 @@ export function updateCompanyRole(data) {
   })
 }
 
+
+// 角色数据权限
+export function dataScope(data) {
+  return request({
+    url: '/company/companyRole/dataScope',
+    method: 'put',
+    data: data
+  })
+}
+
 // 删除角色信息
 export function delCompanyRole(roleId) {
   return request({
@@ -50,4 +60,4 @@ export function exportCompanyRole(query) {
     method: 'get',
     params: query
   })
-}
+}

+ 24 - 0
src/api/company/companyUserAll.js

@@ -190,3 +190,27 @@ export function updateBatchUserRoles(data) {
     data: data
   })
 }
+
+export function getAllNotVoiceList(query) {
+  return request({
+    url: '/company/CompanyUserAll/getAllNotVoiceList',
+    method: 'get',
+    params: query
+  })
+}
+
+export function getAllVoiceList(query) {
+  return request({
+    url: '/company/CompanyUserAll/getAllVoiceList' ,
+    method: 'get',
+    params: query
+  })
+}
+
+export function transferVoiceCompanyUserId(data) {
+  return request({
+    url: '/company/CompanyUserAll/transferVoiceCompanyUserId',
+    method: 'post',
+    data: data
+  })
+}

+ 430 - 179
src/views/company/companyRole/index.vue

@@ -1,196 +1,172 @@
 <template>
   <div class="app-container">
-    <el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="68px">
-      <el-form-item label="角色名称" prop="roleName">
-        <el-input
-          v-model="queryParams.roleName"
-          placeholder="请输入角色名称"
-          clearable
-          size="small"
-          @keyup.enter.native="handleQuery"
-        />
-      </el-form-item>
-      <el-form-item label="角色权限字符串" prop="roleKey">
-        <el-input
-          v-model="queryParams.roleKey"
-          placeholder="请输入角色权限字符串"
-          clearable
-          size="small"
-          @keyup.enter.native="handleQuery"
-        />
-      </el-form-item>
-      <el-form-item label="显示顺序" prop="roleSort">
-        <el-input
-          v-model="queryParams.roleSort"
-          placeholder="请输入显示顺序"
-          clearable
-          size="small"
-          @keyup.enter.native="handleQuery"
-        />
-      </el-form-item>
-      <el-form-item label="数据范围" prop="dataScope">
-        <el-input
-          v-model="queryParams.dataScope"
-          placeholder="请输入数据范围"
-          clearable
-          size="small"
-          @keyup.enter.native="handleQuery"
-        />
-      </el-form-item>
-      <el-form-item label="菜单树选择项是否关联显示" prop="menuCheckStrictly">
-        <el-input
-          v-model="queryParams.menuCheckStrictly"
-          placeholder="请输入菜单树选择项是否关联显示"
-          clearable
-          size="small"
-          @keyup.enter.native="handleQuery"
-        />
-      </el-form-item>
-      <el-form-item label="部门树选择项是否关联显示" prop="deptCheckStrictly">
-        <el-input
-          v-model="queryParams.deptCheckStrictly"
-          placeholder="请输入部门树选择项是否关联显示"
-          clearable
-          size="small"
-          @keyup.enter.native="handleQuery"
-        />
-      </el-form-item>
-      <el-form-item label="角色状态" prop="status">
-        <el-select v-model="queryParams.status" placeholder="请选择角色状态" clearable size="small">
-          <el-option label="请选择字典生成" value="" />
-        </el-select>
-      </el-form-item>
-      <el-form-item label="角色状态" prop="companyId">
-        <el-input
-          v-model="queryParams.companyId"
-          placeholder="请输入角色状态"
-          clearable
-          size="small"
-          @keyup.enter.native="handleQuery"
-        />
-      </el-form-item>
-      <el-form-item>
+    <el-row :gutter="20">
+      <!--部门数据-->
+      <el-col :span="3" :xs="24">
+        <div class="head-container">
+          <el-input v-model="deptName" placeholder="请输入部门名称" clearable size="small" prefix-icon="el-icon-search" style="margin-bottom: 20px" />
+        </div>
+        <div class="head-container">
+          <el-tree :data="deptOptions" :props="defaultProps" :expand-on-click-node="false" :filter-node-method="filterNode" ref="tree"  @node-click="handleNodeClick" />
+        </div>
+      </el-col>
+      <el-col :span="21" :xs="24">
+        <el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="68px">
+        <el-form-item label="角色名称" prop="roleName">
+          <el-input
+            v-model="queryParams.roleName"
+            placeholder="请输入角色名称"
+            clearable
+            size="small"
+            @keyup.enter.native="handleQuery"
+          />
+        </el-form-item>
+        <el-form-item label="角色权限字符串" prop="roleKey">
+          <el-input
+            v-model="queryParams.roleKey"
+            placeholder="请输入角色权限字符串"
+            clearable
+            size="small"
+            @keyup.enter.native="handleQuery"
+          />
+        </el-form-item>
+        <el-form-item label="状态" prop="status">
+              <el-select
+                v-model="queryParams.status"
+                placeholder="角色状态"
+                clearable
+                size="small"
+
+              >
+                <el-option
+                  v-for="dict in statusOptions"
+                  :key="dict.dictValue"
+                  :label="dict.dictLabel"
+                  :value="dict.dictValue"
+                />
+              </el-select>
+            </el-form-item>
+        <el-form-item>
         <el-button type="cyan" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
         <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
-      </el-form-item>
-    </el-form>
+        </el-form-item>
+        </el-form>
+        <el-row :gutter="10" class="mb8">
+          <el-col :span="1.5">
+            <el-button
+              type="primary"
+              icon="el-icon-plus"
+              size="mini"
+              @click="handleAdd"
+              v-hasPermi="['company:companyRole:add']"
+            >新增</el-button>
+          </el-col>
+          <el-col :span="1.5">
+            <el-button
+              type="success"
+              icon="el-icon-edit"
+              size="mini"
+              :disabled="single"
+              @click="handleUpdate"
+              v-hasPermi="['company:companyRole:edit']"
+            >修改</el-button>
+          </el-col>
+          <el-col :span="1.5">
+            <el-button
+              type="danger"
+              icon="el-icon-delete"
+              size="mini"
+              :disabled="multiple"
+              @click="handleDelete"
+              v-hasPermi="['company:companyRole:remove']"
+            >删除</el-button>
+          </el-col>
+          <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
+        </el-row>
+        <el-table v-loading="loading" :data="companyRoleList" @selection-change="handleSelectionChange">
+          <el-table-column type="selection" width="55" align="center" />
+          <el-table-column label="角色ID" align="center" prop="roleId" />
+          <el-table-column label="角色名称" align="center" prop="roleName" />
+          <el-table-column label="角色权限字符串" align="center" prop="roleKey" />
+          <el-table-column label="显示顺序" align="center" prop="roleSort" />
+          <el-table-column label="数据范围" align="center" prop="dataScope" />
+          <el-table-column label="菜单树选择项是否关联显示" align="center" prop="menuCheckStrictly" />
+          <el-table-column label="部门树选择项是否关联显示" align="center" prop="deptCheckStrictly" />
+          <el-table-column label="角色状态" align="center" prop="status" />
+          <el-table-column label="备注" align="center" prop="remark" />
+          <el-table-column label="备注" align="center" prop="companyId" />
+          <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
+            <template slot-scope="scope">
+              <el-button
+                size="mini"
+                type="text"
+                icon="el-icon-edit"
+                @click="handleUpdate(scope.row)"
+                v-hasPermi="['company:companyRole:edit']"
+              >修改</el-button>
+              <el-button
+                size="mini"
+                type="text"
+                icon="el-icon-delete"
+                @click="handleDelete(scope.row)"
+                v-hasPermi="['company:companyRole:remove']"
+              >删除</el-button>
+            </template>
+          </el-table-column>
+        </el-table>
+
+        <pagination
+          v-show="total>0"
+          :total="total"
+          :page.sync="queryParams.pageNum"
+          :limit.sync="queryParams.pageSize"
+          @pagination="getList"
+        />
 
-    <el-row :gutter="10" class="mb8">
-      <el-col :span="1.5">
-        <el-button
-          type="primary"
-          icon="el-icon-plus"
-          size="mini"
-          @click="handleAdd"
-          v-hasPermi="['company:companyRole:add']"
-        >新增</el-button>
-      </el-col>
-      <el-col :span="1.5">
-        <el-button
-          type="success"
-          icon="el-icon-edit"
-          size="mini"
-          :disabled="single"
-          @click="handleUpdate"
-          v-hasPermi="['company:companyRole:edit']"
-        >修改</el-button>
-      </el-col>
-      <el-col :span="1.5">
-        <el-button
-          type="danger"
-          icon="el-icon-delete"
-          size="mini"
-          :disabled="multiple"
-          @click="handleDelete"
-          v-hasPermi="['company:companyRole:remove']"
-        >删除</el-button>
-      </el-col>
-      <el-col :span="1.5">
-        <el-button
-          type="warning"
-          icon="el-icon-download"
-          size="mini"
-          @click="handleExport"
-          v-hasPermi="['company:companyRole:export']"
-        >导出</el-button>
       </el-col>
-	  <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
+
     </el-row>
 
-    <el-table v-loading="loading" :data="companyRoleList" @selection-change="handleSelectionChange">
-      <el-table-column type="selection" width="55" align="center" />
-      <el-table-column label="角色ID" align="center" prop="roleId" />
-      <el-table-column label="角色名称" align="center" prop="roleName" />
-      <el-table-column label="角色权限字符串" align="center" prop="roleKey" />
-      <el-table-column label="显示顺序" align="center" prop="roleSort" />
-      <el-table-column label="数据范围" align="center" prop="dataScope" />
-      <el-table-column label="菜单树选择项是否关联显示" align="center" prop="menuCheckStrictly" />
-      <el-table-column label="部门树选择项是否关联显示" align="center" prop="deptCheckStrictly" />
-      <el-table-column label="角色状态" align="center" prop="status" />
-      <el-table-column label="备注" align="center" prop="remark" />
-      <el-table-column label="备注" align="center" prop="companyId" />
-      <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
-        <template slot-scope="scope">
-          <el-button
-            size="mini"
-            type="text"
-            icon="el-icon-edit"
-            @click="handleUpdate(scope.row)"
-            v-hasPermi="['company:companyRole:edit']"
-          >修改</el-button>
-          <el-button
-            size="mini"
-            type="text"
-            icon="el-icon-delete"
-            @click="handleDelete(scope.row)"
-            v-hasPermi="['company:companyRole:remove']"
-          >删除</el-button>
-        </template>
-      </el-table-column>
-    </el-table>
-    
-    <pagination
-      v-show="total>0"
-      :total="total"
-      :page.sync="queryParams.pageNum"
-      :limit.sync="queryParams.pageSize"
-      @pagination="getList"
-    />
 
-    <!-- 添加或修改角色信息对话框 -->
+
+    <!-- 添加或修改角色配置对话框 -->
     <el-dialog :title="title" :visible.sync="open" width="500px" append-to-body>
       <el-form ref="form" :model="form" :rules="rules" label-width="80px">
         <el-form-item label="角色名称" prop="roleName">
           <el-input v-model="form.roleName" placeholder="请输入角色名称" />
         </el-form-item>
-        <el-form-item label="角色权限字符串" prop="roleKey">
-          <el-input v-model="form.roleKey" placeholder="请输入角色权限字符串" />
-        </el-form-item>
-        <el-form-item label="显示顺序" prop="roleSort">
-          <el-input v-model="form.roleSort" placeholder="请输入显示顺序" />
+        <el-form-item label="权限字符" prop="roleKey">
+          <el-input v-model="form.roleKey" placeholder="请输入权限字符" />
         </el-form-item>
-        <el-form-item label="数据范围" prop="dataScope">
-          <el-input v-model="form.dataScope" placeholder="请输入数据范围" />
+        <el-form-item label="角色顺序" prop="roleSort">
+          <el-input-number v-model="form.roleSort" controls-position="right" :min="0" />
         </el-form-item>
-        <el-form-item label="菜单树选择项是否关联显示" prop="menuCheckStrictly">
-          <el-input v-model="form.menuCheckStrictly" placeholder="请输入菜单树选择项是否关联显示" />
-        </el-form-item>
-        <el-form-item label="部门树选择项是否关联显示" prop="deptCheckStrictly">
-          <el-input v-model="form.deptCheckStrictly" placeholder="请输入部门树选择项是否关联显示" />
-        </el-form-item>
-        <el-form-item label="角色状态">
+        <el-form-item label="状态">
           <el-radio-group v-model="form.status">
-            <el-radio label="1">请选择字典生成</el-radio>
+            <el-radio
+              v-for="dict in statusOptions"
+              :key="dict.dictValue"
+              :label="dict.dictValue"
+            >{{dict.dictLabel}}</el-radio>
           </el-radio-group>
         </el-form-item>
-        <el-form-item label="删除标志" prop="delFlag">
-          <el-input v-model="form.delFlag" placeholder="请输入删除标志" />
-        </el-form-item>
-        <el-form-item label="备注" prop="remark">
-          <el-input v-model="form.remark" type="textarea" placeholder="请输入内容" />
+        <el-form-item label="菜单权限">
+          <el-checkbox v-model="menuExpand" @change="handleCheckedTreeExpand($event, 'menu')">展开/折叠</el-checkbox>
+          <el-checkbox v-model="menuNodeAll" @change="handleCheckedTreeNodeAll($event, 'menu')">全选/全不选</el-checkbox>
+          <el-checkbox v-model="form.menuCheckStrictly" @change="handleCheckedTreeConnect($event, 'menu')">父子联动</el-checkbox>
+          <el-tree
+            class="tree-border"
+            :data="menuOptions"
+            show-checkbox
+            ref="menu"
+            node-key="id"
+            :check-strictly="!form.menuCheckStrictly"
+            empty-text="加载中,请稍后"
+            :props="defaultProps"
+          ></el-tree>
         </el-form-item>
-        <el-form-item label="备注" prop="companyId">
-          <el-input v-model="form.companyId" placeholder="请输入备注" />
+        <el-form-item label="备注">
+          <el-input v-model="form.remark" type="textarea" placeholder="请输入内容"></el-input>
         </el-form-item>
       </el-form>
       <div slot="footer" class="dialog-footer">
@@ -198,11 +174,78 @@
         <el-button @click="cancel">取 消</el-button>
       </div>
     </el-dialog>
+
+    <!-- 分配角色数据权限对话框 -->
+    <el-dialog :title="title" :visible.sync="openDataScope" width="500px" append-to-body>
+      <el-form :model="form" label-width="80px">
+        <el-form-item label="角色名称">
+          <el-input v-model="form.roleName" :disabled="true" />
+        </el-form-item>
+        <el-form-item label="权限字符">
+          <el-input v-model="form.roleKey" :disabled="true" />
+        </el-form-item>
+        <el-form-item label="权限范围">
+          <el-select v-model="form.dataScope">
+            <el-option
+              v-for="item in dataScopeOptions"
+              :key="item.value"
+              :label="item.label"
+              :value="item.value"
+            ></el-option>
+          </el-select>
+        </el-form-item>
+        <el-form-item label="数据权限" v-show="form.dataScope == 2">
+          <el-checkbox v-model="deptExpand" @change="handleCheckedTreeExpand($event, 'dept')">展开/折叠</el-checkbox>
+          <el-checkbox v-model="deptNodeAll" @change="handleCheckedTreeNodeAll($event, 'dept')">全选/全不选</el-checkbox>
+          <el-checkbox v-model="form.deptCheckStrictly" @change="handleCheckedTreeConnect($event, 'dept')">父子联动</el-checkbox>
+          <el-tree
+            class="tree-border"
+            :data="deptOptions"
+            show-checkbox
+            default-expand-all
+            ref="dept"
+            node-key="id"
+            :check-strictly="!form.deptCheckStrictly"
+            empty-text="加载中,请稍后"
+            :props="defaultProps"
+          ></el-tree>
+        </el-form-item>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button type="primary" @click="submitDataScope">确 定</el-button>
+        <el-button @click="cancelDataScope">取 消</el-button>
+      </div>
+    </el-dialog>
+
+    <el-dialog title="请选择要新增的销售公司" :visible.sync="companyIdOpen.open" width="400px" append-to-body>
+      <el-form>
+        <el-form-item label="公司名" prop="companyId">
+          <el-select filterable  v-model="companyIdOpen.companyId" placeholder="请选择公司名"  clearable size="small">
+            <el-option
+              v-for="item in companys"
+              :key="item.companyId"
+              :label="item.companyName"
+              :value="item.companyId"
+            />
+          </el-select>
+        </el-form-item>
+        <el-form-item>
+          <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQueryCompanyId">确定</el-button>
+          <el-button icon="el-icon-refresh" size="mini" @click="resetQueryCompanyId">取消</el-button>
+        </el-form-item>
+      </el-form>
+
+    </el-dialog>
+
   </div>
 </template>
 
 <script>
-import { listCompanyRole, getCompanyRole, delCompanyRole, addCompanyRole, updateCompanyRole, exportCompanyRole } from "@/api/company/companyRole";
+import { listCompanyRole, getCompanyRole, delCompanyRole, addCompanyRole, updateCompanyRole, exportCompanyRole,dataScope} from "@/api/company/companyRole";
+import { treeselect } from '@/api/company/companyDept'
+import { getCompanyList } from '@/api/company/company'
+import { addInfo } from '@/api/company/companyUserAll'
+import { companyRoleMenuTreeselect, companyTreeselect } from '@/api/company/companyMenu'
 
 export default {
   name: "CompanyRole",
@@ -237,7 +280,8 @@ export default {
         menuCheckStrictly: null,
         deptCheckStrictly: null,
         status: null,
-        companyId: null
+        companyId: null,
+        deptId: null,
       },
       // 表单参数
       form: {},
@@ -255,13 +299,115 @@ export default {
         status: [
           { required: true, message: "角色状态不能为空", trigger: "blur" }
         ],
-      }
+      },
+      // 部门名称
+      deptName: undefined,
+      // 部门树选项
+      deptOptions: undefined,
+      deptOptionsByCompanyId: undefined,
+      companyIdOpen:{
+        open:null,
+        companyId:null,
+      },
+      companys:[],
+      defaultProps: {
+        children: "children",
+        label: "label",
+      },
+      // 是否显示弹出层(数据权限)
+      openDataScope: false,
+      // 数据范围选项
+      dataScopeOptions: [
+        {
+          value: "1",
+          label: "全部数据权限"
+        },
+        {
+          value: "2",
+          label: "自定数据权限"
+        },
+        {
+          value: "3",
+          label: "本部门数据权限"
+        },
+        {
+          value: "4",
+          label: "本部门及以下数据权限"
+        },
+        {
+          value: "5",
+          label: "仅本人数据权限"
+        }
+      ],
+      deptExpand: true,
+      menuExpand: false,
+      menuNodeAll: false,
+      deptNodeAll: false,
+      // 菜单列表
+      menuOptions: [],
+      // 状态数据字典
+      statusOptions: [],
     };
   },
   created() {
     this.getList();
+    this.getTreeselect();
+    getCompanyList().then(response => {
+      this.companys = response.data;
+    });
+    this.getDicts("sys_normal_disable").then(response => {
+      this.statusOptions = response.data;
+    });
   },
   methods: {
+
+    /** 查询菜单树结构 */
+    getMenuTreeselect() {
+      companyTreeselect().then(response => {
+        this.menuOptions = response.data;
+      });
+    },
+
+    // 节点单击事件
+    handleNodeClick(data) {
+      this.queryParams.deptId = data.id;
+      this.queryParams.companyId=data.companyId;
+      this.getList();
+    },
+
+    // 筛选节点
+    filterNode(value, data) {
+      if (!value) return true;
+      return data.label.indexOf(value) !== -1;
+    },
+
+    /** 搜索按钮操作 */
+    handleQueryCompanyId() {
+      if (this.companyIdOpen.companyId == null) {
+        return this.$message.warning("请选择公司");
+      }
+      this.reset();
+      this.getTreeselectByCompanyId(this.companyIdOpen.companyId);
+      this.getMenuTreeselect();
+      this.open = true;
+      this.title = "添加角色信息";
+      this.form.companyId = this.companyIdOpen.companyId;
+    },
+
+    /** 查询部门下拉树结构 */
+    getTreeselect() {
+      treeselect().then((response) => {
+        this.deptOptions = response.data;
+      });
+    },
+
+    getTreeselectByCompanyId(companyId) {
+      treeselect({companyId}).then((response) => {
+        this.deptOptionsByCompanyId = response.data;
+      });
+    },
+
+
     /** 查询角色信息列表 */
     getList() {
       this.loading = true;
@@ -276,8 +422,86 @@ export default {
       this.open = false;
       this.reset();
     },
+    // 取消按钮(数据权限)
+    cancelDataScope() {
+      this.openDataScope = false;
+      this.reset();
+    },
+
+    /** 重置按钮操作 */
+    resetQueryCompanyId() {
+      this.companyIdOpen.companyId=null;
+      this.companyIdOpen.open=false;
+    },
+
+    /** 分配数据权限操作 */
+    handleDataScope(row) {
+      this.reset();
+      const roleDeptTreeselect = this.getRoleDeptTreeselect(row.roleId);
+      getCompanyRole(row.roleId).then(response => {
+        this.form = response.data;
+        this.openDataScope = true;
+        this.$nextTick(() => {
+          roleDeptTreeselect.then(res => {
+            this.$refs.dept.setCheckedKeys(res.checkedKeys);
+          });
+        });
+        this.title = "分配数据权限";
+      });
+    },
+
+    /** 提交按钮(数据权限) */
+    submitDataScope: function() {
+      if (this.form.roleId != undefined) {
+        this.form.deptIds = this.getDeptAllCheckedKeys();
+        dataScope(this.form).then(response => {
+          if (response.code === 200) {
+            this.msgSuccess("修改成功");
+            this.openDataScope = false;
+            this.getList();
+          }
+        });
+      }
+    },
+    // 树权限(展开/折叠)
+    handleCheckedTreeExpand(value, type) {
+      if (type == 'menu') {
+        let treeList = this.menuOptions;
+        for (let i = 0; i < treeList.length; i++) {
+          this.$refs.menu.store.nodesMap[treeList[i].id].expanded = value;
+        }
+      } else if (type == 'dept') {
+        let treeList = this.deptOptions;
+        for (let i = 0; i < treeList.length; i++) {
+          this.$refs.dept.store.nodesMap[treeList[i].id].expanded = value;
+        }
+      }
+    },
+    // 树权限(全选/全不选)
+    handleCheckedTreeNodeAll(value, type) {
+      if (type == 'menu') {
+        this.$refs.menu.setCheckedNodes(value ? this.menuOptions: []);
+      } else if (type == 'dept') {
+        this.$refs.dept.setCheckedNodes(value ? this.deptOptions: []);
+      }
+    },
+    // 树权限(父子联动)
+    handleCheckedTreeConnect(value, type) {
+      if (type == 'menu') {
+        this.form.menuCheckStrictly = value ? true: false;
+      } else if (type == 'dept') {
+        this.form.deptCheckStrictly = value ? true: false;
+      }
+    },
     // 表单重置
     reset() {
+      if (this.$refs.menu != undefined) {
+        this.$refs.menu.setCheckedKeys([]);
+      }
+      this.menuExpand = false,
+      this.menuNodeAll = false,
+      this.deptExpand = true,
+      this.deptNodeAll = false,
       this.form = {
         roleId: null,
         roleName: null,
@@ -315,37 +539,54 @@ export default {
     },
     /** 新增按钮操作 */
     handleAdd() {
-      this.reset();
-      this.open = true;
-      this.title = "添加角色信息";
+      this.companyIdOpen.open=true;
     },
     /** 修改按钮操作 */
     handleUpdate(row) {
       this.reset();
       const roleId = row.roleId || this.ids
+      this.getTreeselectByCompanyId(row.companyId);
+      const roleMenu = this.getRoleMenuTreeselect(roleId);
       getCompanyRole(roleId).then(response => {
         this.form = response.data;
         this.open = true;
+        this.$nextTick(() => {
+          roleMenu.then(res => {
+            this.$refs.menu.setCheckedKeys(res.checkedKeys);
+          });
+        });
         this.title = "修改角色信息";
       });
     },
+
+    /** 根据角色ID查询菜单树结构 */
+    getRoleMenuTreeselect(roleId) {
+      return companyRoleMenuTreeselect(roleId).then(response => {
+        this.menuOptions = response.menus;
+        return response;
+      });
+    },
     /** 提交按钮 */
     submitForm() {
       this.$refs["form"].validate(valid => {
         if (valid) {
           if (this.form.roleId != null) {
+            this.form.menuIds = this.getMenuAllCheckedKeys();
             updateCompanyRole(this.form).then(response => {
               if (response.code === 200) {
                 this.msgSuccess("修改成功");
                 this.open = false;
+                this.companyIdOpen.open=false;
                 this.getList();
               }
             });
           } else {
+            this.form.menuIds = this.getMenuAllCheckedKeys();
             addCompanyRole(this.form).then(response => {
               if (response.code === 200) {
                 this.msgSuccess("新增成功");
                 this.open = false;
+                this.companyIdOpen.open=false;
                 this.getList();
               }
             });
@@ -353,6 +594,16 @@ export default {
         }
       });
     },
+
+    // 所有菜单节点数据
+    getMenuAllCheckedKeys() {
+      // 目前被选中的菜单节点
+      let checkedKeys = this.$refs.menu.getHalfCheckedKeys();
+      // 半选中的菜单节点
+      let halfCheckedKeys = this.$refs.menu.getCheckedKeys();
+      checkedKeys.unshift.apply(checkedKeys, halfCheckedKeys);
+      return checkedKeys;
+    },
     /** 删除按钮操作 */
     handleDelete(row) {
       const roleIds = row.roleId || this.ids;

+ 212 - 4
src/views/company/companyUser/indexAll.vue

@@ -36,6 +36,13 @@
           <el-form-item>
             <el-button  icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
             <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
+            <el-button
+              type="warning"
+              plain
+              size="mini"
+              @click="handleVoiceTransfer"
+              v-hasPermi="['company:user:transferVoice']"
+            >语音席位转接</el-button>
           </el-form-item>
         </el-form>
 
@@ -112,6 +119,7 @@
               v-hasPermi="['company:user:addCodeUrl']"
             >生成注册/绑定销售二维码</el-button>
           </el-col>
+
           <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
         </el-row>
 
@@ -185,9 +193,17 @@
           </el-table-column>
           <el-table-column label="区域" align="center" prop="addressId">
           </el-table-column>
-          <el-table-column label="创建时间"  sortable align="center" prop="createTime" width="160">
+
+          <el-table-column label="是否开通语音" align="center" prop="isBindVoiceSeat" width="80px">
             <template slot-scope="scope">
-              <span>{{ parseTime(scope.row.createTime) }}</span>
+              <el-tag
+                :type="scope.row.isBindVoiceSeat === 1 ? 'success' : 'info'">{{scope.row.isBindVoiceSeat === 1 ? '是' : '否' }}</el-tag>
+            </template>
+          </el-table-column>
+          <el-table-column label="是否录制音色" align="center" prop="isRecordVoiceSeat" width="80px">
+            <template slot-scope="scope">
+              <el-tag
+                :type="scope.row.isRecordVoiceSeat === 1 ? 'success' : 'info'">{{scope.row.isRecordVoiceSeat === 1 ? '是' : '否' }}</el-tag>
             </template>
           </el-table-column>
           <el-table-column label="是否单独注册会员" align="center" prop="isNeedRegisterMember" width="80px">
@@ -202,6 +218,7 @@
                 :type="scope.row.isAllowedAllRegister === 1 ? 'success' : 'info'">{{scope.row.isAllowedAllRegister === 1 ? '是' : '否' }}</el-tag>
             </template>
           </el-table-column>
+          <el-table-column label="账号过期时间"  sortable align="center" prop="expirationTime" width="160"/>
           <el-table-column label="操作" align="center" width="160" class-name="small-padding fixed-width">
             <template slot-scope="scope">
               <el-button
@@ -659,6 +676,66 @@
 
     </el-dialog>
 
+    <!-- 语音席位转接弹窗 -->
+    <el-dialog title="语音席位转接" :visible.sync="voiceTransfer.open" width="800px" append-to-body>
+      <el-form ref="voiceTransferForm" :model="voiceTransfer" :rules="voiceTransferRules" label-width="100px">
+        <el-row :gutter="20">
+          <el-col :span="12">
+            <el-form-item label="被转接员工" prop="companyUserIdOld">
+              <el-select
+                v-model="voiceTransfer.companyUserIdOld"
+                filterable
+                remote
+                reserve-keyword
+                placeholder="请输入被转接员工"
+                :remote-method="searchOldEmployee"
+                :loading="voiceTransfer.oldLoading"
+                clearable
+                style="width: 100%"
+                @change="handleOldSelect"
+                @visible-change="onOldVisibleChange"
+              >
+                <el-option
+                  v-for="item in voiceTransfer.oldOptions"
+                  :key="item.companyUserId"
+                  :label="item.companyUserId+item.userName + '(' + item.nickName + ')'"
+                  :value="item.companyUserId"
+                />
+              </el-select>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="转接员工" prop="companyUserIdNew">
+              <el-select
+                v-model="voiceTransfer.companyUserIdNew"
+                filterable
+                remote
+                reserve-keyword
+                placeholder="请输入转接员工"
+                :remote-method="searchNewEmployee"
+                :loading="voiceTransfer.newLoading"
+                clearable
+                style="width: 100%"
+                @change="handleNewSelect"
+                @visible-change="onNewVisibleChange"
+              >
+                <el-option
+                  v-for="item in voiceTransfer.newOptions"
+                  :key="item.companyUserId"
+                  :label="item.companyUserId+item.userName + '(' + item.nickName + ')'"
+                  :value="item.companyUserId"
+                />
+              </el-select>
+            </el-form-item>
+          </el-col>
+        </el-row>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button type="primary" @click="submitVoiceTransfer" :loading="voiceTransfer.submitLoading">确 定</el-button>
+        <el-button @click="voiceTransfer.open = false">取 消</el-button>
+      </div>
+    </el-dialog>
+
   </div>
 </template>
 
@@ -677,7 +754,8 @@ import {
   generateSubDomain,
   setIsRegisterMember,
   updateCompanyUserAreaList,
-  isAllowedAllRegister, unBindDoctorId, bindDoctorId, updateBatchUserRoles, addCodeUrl, addInfo
+  isAllowedAllRegister, unBindDoctorId, bindDoctorId, updateBatchUserRoles, addCodeUrl, addInfo,
+  getAllVoiceList, getAllNotVoiceList, transferVoiceCompanyUserId
 } from '@/api/company/companyUserAll'
 import { getToken } from "@/utils/auth";
 import { treeselect } from "@/api/company/companyDept";
@@ -899,6 +977,25 @@ export default {
         userIds: [],
         roleIds: []
       },
+      // 语音席位转接
+      voiceTransfer: {
+        open: false,
+        companyUserIdOld: null,
+        companyUserIdNew: null,
+        oldOptions: [],
+        newOptions: [],
+        oldLoading: false,
+        newLoading: false,
+        submitLoading: false,
+      },
+      voiceTransferRules: {
+        companyUserIdOld: [
+          { required: true, message: '请选择被转接员工', trigger: 'change' }
+        ],
+        companyUserIdNew: [
+          { required: true, message: '请选择转接员工', trigger: 'change' }
+        ],
+      },
     };
   },
   watch: {
@@ -1477,7 +1574,7 @@ export default {
     /** 导出按钮操作 */
     handleExport() {
       const queryParams = this.queryParams;
-      this.$confirm("是否确认导出所有用户数据项?", "警告", {
+      this.$confirm("是否确认所有用户数据项?", "警告", {
         confirmButtonText: "确定",
         cancelButtonText: "取消",
         type: "warning",
@@ -1705,6 +1802,117 @@ export default {
         this.getList();
       })
     },
+    /** 语音席位转接 */
+    handleVoiceTransfer() {
+      this.voiceTransfer.open = true;
+      this.voiceTransfer.companyUserIdOld = null;
+      this.voiceTransfer.companyUserIdNew = null;
+      this.voiceTransfer.oldOptions = [];
+      this.voiceTransfer.newOptions = [];
+      this.$nextTick(() => {
+        if (this.$refs.voiceTransferForm) {
+          this.$refs.voiceTransferForm.clearValidate();
+        }
+      });
+      // 初始加载第一页10条数据
+      this.initOldEmployeeList();
+      this.initNewEmployeeList();
+    },
+    /** 初始化被转接员工列表 */
+    initOldEmployeeList() {
+      this.voiceTransfer.oldLoading = true;
+      getAllVoiceList({ companyUserId: '', pageNum: 1, pageSize: 10 }).then(res => {
+        this.voiceTransfer.oldOptions = res.rows || res.data || [];
+        this.voiceTransfer.oldLoading = false;
+      }).catch(() => {
+        this.voiceTransfer.oldLoading = false;
+      });
+    },
+    /** 初始化转接员工列表 */
+    initNewEmployeeList() {
+      this.voiceTransfer.newLoading = true;
+      getAllNotVoiceList({ companyUserId: '', pageNum: 1, pageSize: 10 }).then(res => {
+        this.voiceTransfer.newOptions = res.rows || res.data || [];
+        this.voiceTransfer.newLoading = false;
+      }).catch(() => {
+        this.voiceTransfer.newLoading = false;
+      });
+    },
+    /** 搜索被转接员工(有语音席位的) */
+    searchOldEmployee(query) {
+      if (query !== '') {
+        this.voiceTransfer.oldLoading = true;
+        getAllVoiceList({companyUserId:query,  pageNum: 1, pageSize: 10 }).then(res => {
+          this.voiceTransfer.oldOptions = res.rows || res.data || [];
+          this.voiceTransfer.oldLoading = false;
+        }).catch(() => {
+          this.voiceTransfer.oldLoading = false;
+        });
+      } else {
+        this.voiceTransfer.oldOptions = [];
+      }
+    },
+    /** 搜索转接员工(没有语音席位的) */
+    searchNewEmployee(query) {
+      if (query !== '') {
+        this.voiceTransfer.newLoading = true;
+        getAllNotVoiceList({ companyUserId: query, pageNum: 1, pageSize: 10 }).then(res => {
+          this.voiceTransfer.newOptions = res.rows || res.data || [];
+          this.voiceTransfer.newLoading = false;
+        }).catch(() => {
+          this.voiceTransfer.newLoading = false;
+        });
+      } else {
+        this.voiceTransfer.newOptions = [];
+      }
+    },
+    handleOldSelect(val) {
+      this.voiceTransfer.companyUserIdOld = val;
+    },
+    handleNewSelect(val) {
+      this.voiceTransfer.companyUserIdNew = val;
+    },
+    /** 被转接员工下拉展开时,若无搜索关键词则加载初始数据 */
+    onOldVisibleChange(visible) {
+      if (visible && this.voiceTransfer.oldOptions.length === 0) {
+        this.initOldEmployeeList();
+      }
+    },
+    /** 转接员工下拉展开时,若无搜索关键词则加载初始数据 */
+    onNewVisibleChange(visible) {
+      if (visible && this.voiceTransfer.newOptions.length === 0) {
+        this.initNewEmployeeList();
+      }
+    },
+    /** 提交语音席位转接 */
+    submitVoiceTransfer() {
+      this.$refs.voiceTransferForm.validate((valid) => {
+        if (valid) {
+          if (this.voiceTransfer.companyUserIdOld === this.voiceTransfer.companyUserIdNew) {
+            this.$message.warning('被转接员工和转接员工不能相同');
+            return;
+          }
+          this.voiceTransfer.submitLoading = true;
+          transferVoiceCompanyUserId({
+            companyUserIdOld: this.voiceTransfer.companyUserIdOld,
+            companyUserIdNew: this.voiceTransfer.companyUserIdNew
+          }).then(res => {
+            if (res.code === 200) {
+              this.$message.success('语音席位转接成功');
+              this.voiceTransfer.companyUserIdNew=null;
+              this.voiceTransfer.companyUserIdOld=null;
+              this.getList();
+            } else {
+              this.$message.error(res.msg || '转接失败');
+            }
+          }).catch(() => {
+            this.$message.error('转接失败');
+          }).finally(() => {
+            this.voiceTransfer.submitLoading = false;
+          });
+        }
+      });
+    },
   },
 }
 </script>

+ 9 - 2
src/views/components/course/userCourseCatalogDetails.vue

@@ -150,8 +150,8 @@
         <el-form-item label="视频标题" prop="title">
           <el-input v-model="form.title" placeholder="请输入内容"/>
         </el-form-item>
-        <el-form-item label="视频描述" prop="description">
-          <el-input v-model="form.description" type="textarea" :rows="2" placeholder="请输入内容"/>
+        <el-form-item label="课节标签" prop="description">
+          <el-input v-model="form.description" type="textarea" :rows="2" placeholder="请输入内容"   @blur="trimInput('description', form)" />
         </el-form-item>
         <el-form-item label="课程排序" prop="courseSort">
           <el-input-number v-model="form.courseSort" :min="1"></el-input-number>
@@ -977,6 +977,13 @@ export default {
   },
   methods: {
 
+    trimInput(key, obj) {
+      const target = obj || this;
+      if (target[key] && typeof target[key] === 'string') {
+        target[key] = target[key].trim();
+      }
+    },
+
     getAllCompanyList(){
       getCompanyList().then(res=>{
         this.companyList=res.data

+ 1 - 0
src/views/fastGpt/fastgptEventLogTotal/index.vue

@@ -340,6 +340,7 @@ export default {
     },
     /** 导出按钮操作 */
     handleExport() {
+
       const queryParams = this.queryParams;
 
       if(this.selectedCompanyList != null && this.selectedCompanyList.length > 0) {

+ 2 - 1
src/views/his/medicatedFood/index.vue

@@ -207,7 +207,7 @@
 
             <el-select v-model="form.indications" placeholder="请选择疾病">
                   <el-option
-                      v-for="dict in foodOptions"
+                      v-for="dict in indicationOptions"
                       :key="dict.dictValue"
                       :label="dict.dictLabel"
                       :value="dict.dictValue"
@@ -377,6 +377,7 @@ export default {
     this.getDicts("sys_medicated_food").then(response => {
       this.foodOptions = response.data;
     });
+
     this.getDicts("sys_medicated_food_action").then(response => {
       this.actionOptions = response.data;
     });

+ 2 - 2
src/views/system/config/companyMenuConfig.vue

@@ -32,7 +32,7 @@ import Editor from '@/components/Editor/wang';
 import {   getConfigByKey,updateConfigByKey, clearCache } from "@/api/system/config";
 import {   listCompany } from "@/api/company/company";
 import Material from '@/components/Material'
-import {treeselect as menuTreeselect} from "@/api/company/companyMenu";
+import {companyTreeselect} from "@/api/company/companyMenu";
 export default {
   name: "Config",
   components: {
@@ -77,7 +77,7 @@ export default {
     },
     /** 查询菜单树结构 */
     getMenuTreeselect() {
-      menuTreeselect().then(response => {
+      companyTreeselect().then(response => {
         this.menuOptions = response.data;
       });
     },