Просмотр исходного кода

Merge branch 'master' of http://1.14.104.71:10880/root/ylrz_his_scrm_adminUI

caoliqin 1 неделя назад
Родитель
Сommit
4a5f916642

+ 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) {

+ 27 - 1
src/views/his/integralGoods/index.vue

@@ -228,6 +228,23 @@
         <el-form-item label="库存" prop="stock">
           <el-input-number v-model="form.stock"  :min="0"  label="库存"></el-input-number>
         </el-form-item>
+        <el-form-item label="运费模板" prop="tempId">
+          <el-select
+            style="width: 240px"
+            v-model="form.tempId"
+            filterable
+            clearable
+            placeholder="请选择运费模板"
+            size="small"
+          >
+            <el-option
+              v-for="(item, index) in templateList"
+              :key="index"
+              :value="item.id"
+              :label="item.name"
+            />
+          </el-select>
+        </el-form-item>
         <el-form-item label="状态">
           <el-radio-group v-model="form.status">
             <el-radio
@@ -327,6 +344,7 @@ import Editor from '@/components/Editor/wang';
 import { getToken } from "@/utils/auth";
 import integralGoodsDetails from '../../components/his/integralGoodsDetails';
 import { list as getAppMallOptions } from '@/api/course/coursePlaySourceConfig'
+import { getAllShippingTemplates } from "@/api/hisStore/shippingTemplates";
 export default {
   name: "IntegralGoods",
   components: {Material,Editor,integralGoodsDetails},
@@ -345,6 +363,7 @@ export default {
       visibleScopeArr: ['app', 'mini'],
       // 小程序列表
       appMallOptions:[],
+      templateList: [],
 
       show:{
               open:false,
@@ -454,6 +473,7 @@ export default {
 
     // 查询小程序
     this.getAppMallOptions();
+    this.loadShippingTemplates();
 
     this.getList();
     this.getDicts("sys_integral_goods_type").then(response => {
@@ -464,6 +484,11 @@ export default {
     });
   },
   methods: {
+    loadShippingTemplates() {
+      getAllShippingTemplates().then(response => {
+        this.templateList = response.data || [];
+      });
+    },
 
     getAppMallOptions() {
       getAppMallOptions({pageNum:1,pageSize:100}).then(response => {
@@ -537,7 +562,8 @@ export default {
         stock: null,
         descs: null,
         createTime: null,
-        visibleScope: 'app,mini'
+        visibleScope: 'app,mini',
+        tempId: null
       };
       this.appIds = [];
       this.visibleScopeArr = ['app', 'mini'];

+ 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;
     });

+ 27 - 1
src/views/hisStore/integralGoods/index.vue

@@ -231,6 +231,23 @@
         <el-form-item label="库存" prop="stock">
           <el-input-number v-model="form.stock"  :min="0"  label="库存"></el-input-number>
         </el-form-item>
+        <el-form-item label="运费模板" prop="tempId">
+          <el-select
+            style="width: 240px"
+            v-model="form.tempId"
+            filterable
+            clearable
+            placeholder="请选择运费模板"
+            size="small"
+          >
+            <el-option
+              v-for="(item, index) in templateList"
+              :key="index"
+              :value="item.id"
+              :label="item.name"
+            />
+          </el-select>
+        </el-form-item>
         <el-form-item label="可见范围" prop="visibleScopeArr">
           <el-select style="width: 240px" v-model="visibleScopeArr" placeholder="请选择可见范围" size="small" multiple>
             <el-option label="APP" value="app" />
@@ -308,6 +325,7 @@ import Editor from '@/components/Editor/wang';
 import { getToken } from "@/utils/auth";
 import integralGoodsDetails from '../components/integralGoodsDetails';
 import { list as getAppMallOptions } from '@/api/course/coursePlaySourceConfig'
+import { getAllShippingTemplates } from "@/api/hisStore/shippingTemplates";
 export default {
   name: "HisIntegralGoods",
   components: {Material,Editor,integralGoodsDetails},
@@ -326,6 +344,7 @@ export default {
       visibleScopeArr: ['app', 'mini'],
       // 小程序列表
       appMallOptions:[],
+      templateList: [],
 
       show:{
               open:false,
@@ -399,6 +418,7 @@ export default {
 
     // 查询小程序
     this.getAppMallOptions();
+    this.loadShippingTemplates();
 
     this.getDicts("sys_integral_goods_type").then(response => {
       this.goodsTypeOptions = response.data;
@@ -408,6 +428,11 @@ export default {
     });
   },
   methods: {
+    loadShippingTemplates() {
+      getAllShippingTemplates().then(response => {
+        this.templateList = response.data || [];
+      });
+    },
     formatVisibleScope(visibleScope) {
       if (!visibleScope) {
         return 'APP、小程序';
@@ -486,7 +511,8 @@ export default {
         stock: null,
         descs: null,
         createTime: null,
-        visibleScope: 'app,mini'
+        visibleScope: 'app,mini',
+        tempId: null
       };
       this.imageArr = [];
       this.photoArr = [];

+ 24 - 2
src/views/hisStore/storeOrder/healthStoreList.vue

@@ -134,6 +134,24 @@
           @keyup.enter.native="handleQuery"
         />
       </el-form-item>
+      <el-form-item label="商品分类" prop="cateName">
+        <el-input
+          v-model="queryParams.cateName"
+          clearable
+          placeholder="请输入商品分类"
+          size="small"
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="微信昵称" prop="nickname">
+        <el-input
+          v-model="queryParams.nickname"
+          clearable
+          placeholder="请输入微信昵称"
+          size="small"
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
       <el-form-item label="订单类型" prop="orderType">
         <el-select v-model="queryParams.orderType" placeholder="请选择订单类型" clearable size="small">
           <el-option label="商城订单" value="0" />
@@ -463,7 +481,7 @@
       <el-table-column label="所属公司" align="center" prop="companyName" min-width="140" show-overflow-tooltip />
       <el-table-column label="所属员工" align="center" prop="companyUserNickName" width="120" show-overflow-tooltip />
       <el-table-column label="小程序名称" align="center" prop="miniProgramName"/>
-      <el-table-column label="用户昵称" align="center" prop="nickname" width="150px" >
+      <el-table-column label="微信昵称" align="center" prop="userNickName" width="150px" >
         <template slot-scope="scope">
           <span>{{scope.row.userNickName}} </span>
         </template>
@@ -512,7 +530,7 @@
        <el-table-column label="实付金额" align="center" prop="payMoney"  v-if="showFinanceTableField"/>
       <el-table-column label="额外运费" align="center" prop="payPostage" v-if="showFinanceTableField"/>
       <el-table-column label="商品编码" align="center" prop="barCode"  v-if="showFinanceTableField"/>
-      <el-table-column label="商品分类" align="center" prop="cateName" v-if="showFinanceTableField"/>
+      <el-table-column label="商品分类" align="center" prop="cateName" width="120px"/>
       <el-table-column align="center" label="下单时间" prop="createTime"/>
       <!-- <el-table-column label="支付状态" align="center" prop="paid" /> -->
       <el-table-column align="center" label="支付时间" prop="payTime" width="180">
@@ -1119,6 +1137,8 @@ export default {
         { key: 'payType', label: '支付方式', checked: true },
         { key: 'status', label: '订单状态', checked: true },
         { key: 'barCode', label: '商品编码', checked: false },
+        { key: 'cateName', label: '商品分类', checked: false },
+        { key: 'userNickName', label: '微信昵称', checked: false },
 
 
         { key: 'deliverySn', label: '快递公司编号', checked: false },
@@ -1249,6 +1269,8 @@ export default {
         companyId: null,
         companyUserNickName: null,
         productName: null,
+        cateName: null,
+        nickname: null,
         payCode: null,
         orderType: null
 

+ 24 - 3
src/views/hisStore/storeOrder/index.vue

@@ -110,6 +110,24 @@
           @keyup.enter.native="handleQuery"
         />
       </el-form-item>
+      <el-form-item label="商品分类" prop="cateName">
+        <el-input
+          v-model="queryParams.cateName"
+          placeholder="请输入商品分类"
+          clearable
+          size="small"
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="微信昵称" prop="nickname">
+        <el-input
+          v-model="queryParams.nickname"
+          placeholder="请输入微信昵称"
+          clearable
+          size="small"
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
 
       <el-form-item label="手机号" prop="userPhone">
         <el-input
@@ -480,7 +498,7 @@
           </template>
         </el-table-column>
       <el-table-column label="小程序名称" width="120px" align="center" prop="miniProgramName"/>
-      <el-table-column label="用户昵称" align="center" prop="nickname" width="150px" >
+      <el-table-column label="微信昵称" align="center" prop="userNickName" width="150px" >
           <template slot-scope="scope">
               <span>{{scope.row.userNickName}} </span>
           </template>
@@ -517,7 +535,7 @@
       <!-- <el-table-column label="结算价格" align="center" prop="fprice"  v-if="showFinanceTableField"/> -->
       <el-table-column label="额外运费" align="center" prop="payPostage" v-if="showFinanceTableField"/>
       <el-table-column label="商品编码" align="center" prop="barCode"  v-if="showFinanceTableField"/>
-      <el-table-column label="商品分类" align="center" prop="cateName" v-if="showFinanceTableField"/>
+      <el-table-column label="商品分类" align="center" prop="cateName" width="120px"/>
        <!-- <el-table-column label="应付金额" align="center" prop="payPrice" >
           <template slot-scope="scope">
               <span v-if="scope.row.payPrice!=null">{{scope.row.payPrice.toFixed(2)}}</span>
@@ -1212,6 +1230,8 @@ export default {
         { key: 'payType', label: '支付方式', checked: true },
         { key: 'status', label: '订单状态', checked: true },
         { key: 'barCode', label: '商品编码', checked: false },
+        { key: 'cateName', label: '商品分类', checked: false },
+        { key: 'userNickName', label: '微信昵称', checked: false },
 
 
         { key: 'deliverySn', label: '快递公司编号', checked: false },
@@ -1219,7 +1239,6 @@ export default {
         { key: 'deliveryId', label: '快递单号', checked: false },
         { key: 'remark', label: '备注', checked: false },
         { key: 'isAudit', label: '是否审核', checked: false },
-        { key: 'userNickName', label: '用户昵称', checked: false },
         { key: 'orderRemark', label: '订单备注', checked: false },
         { key: 'reasonValue1', label: '售后原因一级', checked: false },
         { key: 'reasonValue2', label: '售后原因二级', checked: false },
@@ -1348,6 +1367,8 @@ export default {
         deptId:null,
         isUpload:null,
         productName:null,
+        cateName:null,
+        nickname:null,
         isAudit:null,
       },
       // 表单参数

+ 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;
       });
     },

+ 43 - 25
src/views/system/config/integralConfig.vue

@@ -81,6 +81,20 @@
           </el-form-item>
         </el-col>
       </el-row>
+      <el-row>
+        <el-col :span="12">
+          <el-form-item  label="分享首页视频积分" prop="integralShareHomeVideo">
+            <el-tooltip class="item" effect="dark" content="分享首页视频单次赠送积分" placement="top-end">
+              <el-input-number v-model="form11.integralShareHomeVideo" />
+            </el-tooltip>
+          </el-form-item>
+        </el-col>
+        <el-col :span="12">
+          <el-form-item  label="分享首页视频单日上限" prop="integralShareHomeVideoDailyLimit">
+            <el-input-number v-model="form11.integralShareHomeVideoDailyLimit" :min="1" />
+          </el-form-item>
+        </el-col>
+      </el-row>
 
       <el-row>
         <el-col :span="12">
@@ -146,10 +160,17 @@
       </el-row>
       <el-row>
         <el-col :span="12">
-          <el-form-item  label="点播课留言积分" prop="integralComment">
+          <el-form-item  label="完课评价积分(非转化素材)" prop="integralComment">
             <el-input-number v-model="form11.integralComment" />
           </el-form-item>
         </el-col>
+        <el-col :span="12">
+          <el-form-item  label="完课评价积分(转化素材)" prop="integralCommentProduct">
+            <el-input-number v-model="form11.integralCommentProduct" />
+          </el-form-item>
+        </el-col>
+      </el-row>
+      <el-row>
         <el-col :span="12">
           <el-form-item  label="积分有效天数" prop="integralExpireDays">
             <el-input-number v-model="form11.integralExpireDays" />
@@ -229,10 +250,10 @@
             <el-select
               v-model="scope.row.scopes"
               multiple
-              placeholder="请选择展示端"
+              clearable
+              placeholder="为空表示各端均不展示"
               size="small"
               style="width: 200px"
-              @change="handleLogTypeScopeChange(scope.row)"
             >
               <el-option label="APP" value="app" />
               <el-option label="小程序" value="mini" />
@@ -250,10 +271,10 @@
             <el-select
               v-model="scope.row.scopes"
               multiple
-              placeholder="请选择展示端"
+              clearable
+              placeholder="为空表示各端均不展示"
               size="small"
               style="width: 200px"
-              @change="handleTaskScopeChange(scope.row)"
             >
               <el-option label="APP" value="app" />
               <el-option label="小程序" value="mini" />
@@ -278,11 +299,12 @@ const DEFAULT_TASK_DISPLAY_ROWS = [
   { code: 'REGISTER', name: '首次注册登录', typeLabel: '新手', defaultScopes: ['app', 'mini'], tip: '完成手机号绑定注册' },
   { code: 'DOWNLOAD_APP', name: '首次下载APP', typeLabel: '新手', defaultScopes: ['app'], tip: '仅 APP 端可完成' },
   { code: 'FIRST_PURCHASE', name: '首次完成购物', typeLabel: '新手', defaultScopes: ['app', 'mini'], tip: '全渠道首购奖励' },
-  { code: 'INVITED', name: '填写朋友邀请码', typeLabel: '新手', defaultScopes: ['app', 'mini'], tip: '被邀请奖励' },
   { code: 'SHARE', name: '分享得积分', typeLabel: '每日', defaultScopes: ['app', 'mini'], tip: 'APP+小程序合计日限' },
+  { code: 'SHARE_HOME_VIDEO', name: '分享首页视频', typeLabel: '每日', defaultScopes: ['app', 'mini'], tip: '分享首页视频,默认每日5次' },
   { code: 'COURSE', name: '学习首页课程', typeLabel: '每日', defaultScopes: ['app'], tip: '默认仅 APP 展示' },
   { code: 'BROWSE_MALL', name: '浏览商城60秒', typeLabel: '每日', defaultScopes: ['app', 'mini'], tip: '浏览商城任务' },
-  { code: 'INVITE', name: '邀好友享积分', typeLabel: '每日', defaultScopes: ['app', 'mini'], tip: '邀请新用户' }
+  { code: 'INVITE', name: '邀好友享积分', typeLabel: '每日', defaultScopes: ['app', 'mini'], tip: '邀请新用户' },
+  { code: 'INVITED', name: '填写朋友邀请码', typeLabel: '每日', defaultScopes: ['app', 'mini'], tip: '被邀请奖励,仅可完成一次' }
 ]
 
 const LOG_TYPE_SCOPE_OVERRIDES = {
@@ -316,6 +338,7 @@ export default {
         integralNewTask: null,
         integralRatio: null,
         integralShare: null,
+        integralShareHomeVideo: 10,
         integralFollow: null,
         integralCourse: null,
         integralProduct: null,
@@ -329,10 +352,12 @@ export default {
         integralFirstPurchase: 20,
         integralInviteDailyLimit: 3,
         integralShareDailyLimit: 5,
+        integralShareHomeVideoDailyLimit: 5,
         integralCourseDailyLimit: 5,
         integralProductDailyLimit: 1,
         integralProductBrowseSeconds: 60,
         integralComment: 100,
+        integralCommentProduct: 150,
         integralExpireDays: 90,
         integralExpireLaunchDate: null,
         taskDisplayScope: {},
@@ -358,14 +383,16 @@ export default {
         return true
       }
       const row = this.logTypeDisplayRows.find(item => item.code === String(code))
-      const scopes = row ? row.scopes : this.getDefaultLogTypeScopes(String(code))
-      return scopes.includes(platform)
+      if (!row || !row.scopes || row.scopes.length === 0) {
+        return false
+      }
+      return row.scopes.includes(platform)
     },
     initLogTypeDisplayRows(logTypeDisplayScope = {}, dictOptions = []) {
       const rows = (dictOptions || []).map(dict => {
         const code = String(dict.dictValue)
         const savedScope = logTypeDisplayScope[code]
-        const scopes = savedScope
+        const scopes = savedScope != null
           ? savedScope.split(',').filter(Boolean)
           : this.getDefaultLogTypeScopes(code)
         return {
@@ -377,26 +404,20 @@ export default {
       rows.sort((a, b) => Number(a.code) - Number(b.code))
       this.logTypeDisplayRows = rows
     },
-    handleLogTypeScopeChange(row) {
-      if (!row.scopes || row.scopes.length === 0) {
-        row.scopes = this.getDefaultLogTypeScopes(row.code)
-        this.msgWarning('至少选择一个展示端,已恢复默认配置')
-      }
-    },
     handleLogTypePreviewChange() {
       // 仅影响上方「单日可获总积分类型」下拉预览,不改已保存值
     },
     buildLogTypeDisplayScope() {
       const logTypeDisplayScope = {}
       this.logTypeDisplayRows.forEach(row => {
-        logTypeDisplayScope[row.code] = (row.scopes || this.getDefaultLogTypeScopes(row.code)).join(',')
+        logTypeDisplayScope[row.code] = (row.scopes || []).join(',')
       })
       return logTypeDisplayScope
     },
     initTaskDisplayRows(taskDisplayScope = {}) {
       this.taskDisplayRows = DEFAULT_TASK_DISPLAY_ROWS.map(item => {
         const savedScope = taskDisplayScope[item.code]
-        const scopes = savedScope
+        const scopes = savedScope != null
           ? savedScope.split(',').filter(Boolean)
           : [...item.defaultScopes]
         return {
@@ -405,16 +426,10 @@ export default {
         }
       })
     },
-    handleTaskScopeChange(row) {
-      if (!row.scopes || row.scopes.length === 0) {
-        row.scopes = [...row.defaultScopes]
-        this.msgWarning('至少选择一个展示端,已恢复默认配置')
-      }
-    },
     buildTaskDisplayScope() {
       const taskDisplayScope = {}
       this.taskDisplayRows.forEach(row => {
-        taskDisplayScope[row.code] = (row.scopes || row.defaultScopes).join(',')
+        taskDisplayScope[row.code] = (row.scopes || []).join(',')
       })
       return taskDisplayScope
     },
@@ -426,10 +441,13 @@ export default {
           integralFirstPurchase: 20,
           integralInviteDailyLimit: 3,
           integralShareDailyLimit: 5,
+          integralShareHomeVideo: 10,
+          integralShareHomeVideoDailyLimit: 5,
           integralCourseDailyLimit: 5,
           integralProductDailyLimit: 1,
           integralProductBrowseSeconds: 60,
           integralComment: 100,
+          integralCommentProduct: 150,
           integralExpireDays: 90,
           taskDisplayScope: {},
           logTypeDisplayScope: {}