|
|
@@ -0,0 +1,1692 @@
|
|
|
+<template>
|
|
|
+ <div class="app-container">
|
|
|
+ <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="100px">
|
|
|
+ <el-form-item label="员工后台昵称" prop="nickName">
|
|
|
+ <el-input v-model="queryParams.nickName" placeholder="请输入员工后台昵称" clearable size="small" style="width: 240px" @keyup.enter.native="handleQuery" />
|
|
|
+ </el-form-item>
|
|
|
+ <el-form-item label="手机号码" prop="phonenumber">
|
|
|
+ <el-input v-model="queryParams.phonenumber" placeholder="请输入手机号码" clearable size="small" style="width: 240px" @keyup.enter.native="handleQuery" />
|
|
|
+ </el-form-item>
|
|
|
+ <el-form-item label="状态" prop="status">
|
|
|
+ <el-select v-model="queryParams.status" placeholder="员工状态" clearable size="small" style="width: 240px" @change="handleQuery">
|
|
|
+ <el-option v-for="dict in statusOptions" :key="dict.dictValue" :label="dict.dictLabel" :value="dict.dictValue" />
|
|
|
+ </el-select>
|
|
|
+ </el-form-item>
|
|
|
+ <el-form-item label="企微状态" prop="qwStatus">
|
|
|
+ <el-select v-model="queryParams.qwStatus" placeholder="企微绑定状态" clearable size="small" style="width: 240px" @change="handleQuery">
|
|
|
+ <el-option v-for="dict in qwStatusOptions" :key="dict.dictValue" :label="dict.dictLabel" :value="dict.dictValue" />
|
|
|
+ </el-select>
|
|
|
+ </el-form-item>
|
|
|
+
|
|
|
+ <el-form-item label="创建时间">
|
|
|
+ <el-date-picker v-model="dateRange" size="small" style="width: 240px" value-format="yyyy-MM-dd" type="daterange" range-separator="-" start-placeholder="开始日期" end-placeholder="结束日期"></el-date-picker>
|
|
|
+ </el-form-item>
|
|
|
+ <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-form-item>
|
|
|
+ </el-form>
|
|
|
+
|
|
|
+ <el-row :gutter="10" class="mb8">
|
|
|
+ <el-col :span="1.5">
|
|
|
+ <el-button plain type="primary" icon="el-icon-plus" size="mini" @click="handleAdd" v-hasPermi="['company:user:add']">新增</el-button>
|
|
|
+ </el-col>
|
|
|
+ <el-col :span="1.5">
|
|
|
+ <el-button plain type="success" icon="el-icon-edit" size="mini" :disabled="single" @click="handleUpdate" v-hasPermi="['company:user:edit']">修改</el-button>
|
|
|
+ </el-col>
|
|
|
+ <el-col :span="1.5">
|
|
|
+ <el-button plain type="danger" icon="el-icon-delete" size="mini" :disabled="multiple" @click="handleDelete" v-hasPermi="['company:user:remove']">删除</el-button>
|
|
|
+ </el-col>
|
|
|
+ <el-col :span="1.5">
|
|
|
+ <el-button plain type="info" icon="el-icon-upload2" size="mini" @click="handleImport" v-hasPermi="['company:user:import']">导入</el-button>
|
|
|
+ </el-col>
|
|
|
+ <el-col :span="1.5">
|
|
|
+ <el-button plain type="warning" icon="el-icon-download" size="mini" @click="handleExport" v-hasPermi="['company:user:export']">导出</el-button>
|
|
|
+ </el-col>
|
|
|
+ <el-col :span="1.5">
|
|
|
+ <el-button
|
|
|
+ type="primary"
|
|
|
+ plain
|
|
|
+ size="mini"
|
|
|
+ @click="synOpen=true"
|
|
|
+ v-hasPermi="['qw:user:sync']"
|
|
|
+ >同步企微员工和部门</el-button>
|
|
|
+ </el-col>
|
|
|
+ <el-col :span="1.5">
|
|
|
+ <el-button
|
|
|
+ type="primary"
|
|
|
+ plain
|
|
|
+ size="mini"
|
|
|
+ @click="synNameOpen=true"
|
|
|
+ v-hasPermi="['qw:user:sync']"
|
|
|
+ >同步企微员工名称</el-button>
|
|
|
+ </el-col>
|
|
|
+ <el-col :span="1.5">
|
|
|
+ <el-button
|
|
|
+ type="primary"
|
|
|
+ plain
|
|
|
+ size="mini"
|
|
|
+ :disabled="multiple"
|
|
|
+ @click="handerCompanyUserAreaList"
|
|
|
+ >批量设置销售所属区域</el-button>
|
|
|
+ </el-col>
|
|
|
+ <el-col :span="1.5">
|
|
|
+ <el-button
|
|
|
+ type="primary"
|
|
|
+ plain
|
|
|
+ size="mini"
|
|
|
+ :disabled="multiple"
|
|
|
+ @click="handleSetRegister"
|
|
|
+ >设置单独注册会员</el-button>
|
|
|
+ </el-col>
|
|
|
+ <el-col :span="1.5">
|
|
|
+ <el-button
|
|
|
+ type="primary"
|
|
|
+ plain
|
|
|
+ size="mini"
|
|
|
+ :disabled="multiple"
|
|
|
+ @click="handleAllowedAllRegister"
|
|
|
+ >允许注册会员开关</el-button>
|
|
|
+ </el-col>
|
|
|
+ <el-col :span="1.5">
|
|
|
+ <el-button
|
|
|
+ type="primary"
|
|
|
+ plain
|
|
|
+ size="mini"
|
|
|
+ @click="handleBindCompanyUserCode"
|
|
|
+ >生成注册/绑定销售二维码</el-button>
|
|
|
+ </el-col>
|
|
|
+ <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
|
|
|
+ </el-row>
|
|
|
+
|
|
|
+ <el-table height="500" border v-loading="loading" :data="userList" @selection-change="handleSelectionChange">
|
|
|
+ <el-table-column type="selection" width="50" align="center" />
|
|
|
+ <el-table-column label="ID" align="center" prop="userId" :show-overflow-tooltip="true" />
|
|
|
+ <el-table-column label="员工后台账号" align="center" prop="userName" :show-overflow-tooltip="true" width="100" />
|
|
|
+ <el-table-column label="员工后台昵称" align="center" prop="nickName" :show-overflow-tooltip="true" 员工后台 width="100"/>
|
|
|
+ <el-table-column label="部门" align="center" prop="deptName" :show-overflow-tooltip="true" />
|
|
|
+ <el-table-column label="手机号码" align="center" prop="phonenumber" width="120" />
|
|
|
+ <el-table-column label="账户角色" align="center" :show-overflow-tooltip="true" width="150">
|
|
|
+ <template slot-scope="scope">
|
|
|
+ <span v-if="scope.row.roleNames && scope.row.roleNames.length > 0">
|
|
|
+ {{ scope.row.roleNames.join('、') }}
|
|
|
+ </span>
|
|
|
+ <span v-else>-</span>
|
|
|
+ </template>
|
|
|
+ </el-table-column>
|
|
|
+ <el-table-column label="二维码" align="center" prop="qrCodeWeixin">
|
|
|
+ <template slot-scope="scope">
|
|
|
+ <!-- 显示已上传的二维码 -->
|
|
|
+ <el-image
|
|
|
+ v-if="scope.row.qrCodeWeixin"
|
|
|
+ style="width: 80px; height: 80px; margin-bottom: 5px; display: block; margin-left: auto; margin-right: auto;"
|
|
|
+ :src="scope.row.qrCodeWeixin"
|
|
|
+ :preview-src-list="[scope.row.qrCodeWeixin]"
|
|
|
+ fit="contain">
|
|
|
+ <div slot="error" class="image-slot">
|
|
|
+ <i class="el-icon-picture-outline"></i>
|
|
|
+ </div>
|
|
|
+ </el-image>
|
|
|
+ <!-- 上传组件 -->
|
|
|
+ <el-upload
|
|
|
+ class="avatar-uploader"
|
|
|
+ action="#"
|
|
|
+ :show-file-list="false"
|
|
|
+ :http-request="(options) => handleCustomUpload(options, scope.row)"
|
|
|
+ :before-upload="(file) => beforeImageUpload(file, scope.row)"
|
|
|
+ >
|
|
|
+ <el-button size="small" type="primary" :loading="scope.row.uploading">
|
|
|
+ {{ scope.row.qrCodeWeixin ? '更换图片' : '上传图片' }}
|
|
|
+ <i class="el-icon-upload el-icon--right"></i>
|
|
|
+ </el-button>
|
|
|
+ </el-upload>
|
|
|
+ <div v-if="scope.row.uploadError" class="el-upload__tip" style="color: red;">
|
|
|
+ {{ scope.row.uploadError }}
|
|
|
+ </div>
|
|
|
+ </template>
|
|
|
+ </el-table-column>
|
|
|
+ <el-table-column label="状态" align="center">
|
|
|
+ <template slot-scope="scope">
|
|
|
+ <el-switch v-model="scope.row.status" active-value="0" inactive-value="1" @change="handleStatusChange(scope.row)"></el-switch>
|
|
|
+ </template>
|
|
|
+ </el-table-column>
|
|
|
+ <el-table-column label="企微状态" align="center">
|
|
|
+ <template slot-scope="scope">
|
|
|
+ <dict-tag :options="qwStatusOptions" :value="scope.row.qwStatus"/>
|
|
|
+ </template>
|
|
|
+ </el-table-column>
|
|
|
+ <el-table-column label="绑定的企微号" align="center">
|
|
|
+ <template slot-scope="scope">
|
|
|
+ <div v-if="scope.row.qwUsers && scope.row.qwUsers.length > 0">
|
|
|
+ <div v-for="user in scope.row.qwUsers" :key="user.id">
|
|
|
+ <el-tag size="mini">{{ user.qwUserName }}</el-tag>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ <div v-else>
|
|
|
+ <dict-tag :options="qwStatusOptions" :value="scope.row.qwStatus"/>
|
|
|
+ </div>
|
|
|
+ </template>
|
|
|
+ </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">
|
|
|
+ <template slot-scope="scope">
|
|
|
+ <span>{{ parseTime(scope.row.createTime) }}</span>
|
|
|
+ </template>
|
|
|
+ </el-table-column>
|
|
|
+ <el-table-column label="是否单独注册会员" align="center" prop="isNeedRegisterMember" width="80px">
|
|
|
+ <template slot-scope="scope">
|
|
|
+ <el-tag
|
|
|
+ :type="scope.row.isNeedRegisterMember === 1 ? 'success' : 'info'">{{scope.row.isNeedRegisterMember === 1 ? '是' : '否' }}</el-tag>
|
|
|
+ </template>
|
|
|
+ </el-table-column>
|
|
|
+ <el-table-column label="允许注册会员" align="center" prop="isNeedRegisterMember" width="80px">
|
|
|
+ <template slot-scope="scope">
|
|
|
+ <el-tag
|
|
|
+ :type="scope.row.isAllowedAllRegister === 1 ? 'success' : 'info'">{{scope.row.isAllowedAllRegister === 1 ? '是' : '否' }}</el-tag>
|
|
|
+ </template>
|
|
|
+ </el-table-column>
|
|
|
+ <el-table-column label="操作" align="center" width="160" class-name="small-padding fixed-width">
|
|
|
+ <template slot-scope="scope">
|
|
|
+ <el-button
|
|
|
+ size="mini"
|
|
|
+ type="text"
|
|
|
+ icon="el-icon-connection"
|
|
|
+ plain
|
|
|
+ v-if="scope.row.doctorId!=null"
|
|
|
+ @click="handleUpdateDoctor(scope.row)"
|
|
|
+ >换绑医生</el-button>
|
|
|
+ <el-button
|
|
|
+ size="mini"
|
|
|
+ type="text"
|
|
|
+ plain
|
|
|
+ icon="el-icon-link"
|
|
|
+ v-else
|
|
|
+ @click="handleUpdateDoctor(scope.row)"
|
|
|
+ >绑定医生</el-button>
|
|
|
+ <el-button
|
|
|
+ size="mini"
|
|
|
+ type="text"
|
|
|
+ icon="el-icon-unlock"
|
|
|
+ plain
|
|
|
+ v-if="scope.row.doctorId!=null"
|
|
|
+ @click="handleUnBindUserId(scope.row)"
|
|
|
+ >解绑医生</el-button>
|
|
|
+ <el-button
|
|
|
+ v-if="scope.row.qwStatus == 0"
|
|
|
+ size="mini"
|
|
|
+ type="text"
|
|
|
+ icon="el-icon-edit"
|
|
|
+ @click="qwBind(scope.row)"
|
|
|
+ v-hasPermi="['qw:user:bind']"
|
|
|
+ >绑定企微</el-button>
|
|
|
+
|
|
|
+ <el-button
|
|
|
+ v-else
|
|
|
+ size="mini"
|
|
|
+ type="text"
|
|
|
+ icon="el-icon-edit"
|
|
|
+ @click="qwBind(scope.row)"
|
|
|
+ v-hasPermi="['qw:user:bind']"
|
|
|
+ >查或换绑企微</el-button>
|
|
|
+
|
|
|
+ <el-button v-if="scope.row.userType !== '00'" size="mini" type="text" icon="el-icon-edit" @click="handleUpdate(scope.row)" v-hasPermi="['company:user:edit']">修改</el-button>
|
|
|
+ <el-button v-if="scope.row.userType !== '00'" size="mini" type="text" icon="el-icon-delete" @click="handleDelete(scope.row)" v-hasPermi="['company:user:remove']">删除</el-button>
|
|
|
+ <el-button size="mini" type="text" icon="el-icon-key" @click="handleResetPwd(scope.row)" v-hasPermi="['company:user:resetPwd']">重置密码</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-col>
|
|
|
+ </el-row>
|
|
|
+
|
|
|
+ <!-- 批量修改角色对话框 -->
|
|
|
+ <el-dialog title="批量修改角色" :visible.sync="batchRoleDialogVisible" width="500px" append-to-body>
|
|
|
+ <el-form :model="batchRoleForm" label-width="80px">
|
|
|
+ <el-form-item label="选择角色">
|
|
|
+ <el-select v-model="selectedRoleIds" multiple placeholder="请选择角色" style="width: 100%;">
|
|
|
+ <el-option
|
|
|
+ v-for="item in roleOptions"
|
|
|
+ :key="item.roleId"
|
|
|
+ :label="item.roleName"
|
|
|
+ :value="item.roleId">
|
|
|
+ </el-option>
|
|
|
+ </el-select>
|
|
|
+ </el-form-item>
|
|
|
+ </el-form>
|
|
|
+ <div slot="footer" class="dialog-footer">
|
|
|
+ <el-button @click="batchRoleDialogVisible = false">取 消</el-button>
|
|
|
+ <el-button type="primary" @click="submitBatchRoles">确 定</el-button>
|
|
|
+ </div>
|
|
|
+ </el-dialog>
|
|
|
+
|
|
|
+ <!--当点击查或换绑微信时候弹出此框-->
|
|
|
+ <el-dialog title="绑定企微账号" :visible.sync="qwOpen" width="800px" append-to-body >
|
|
|
+ <el-form ref="form" :model="form" label-width="80px" >
|
|
|
+ <el-form-item label="查询" prop="companyUserId">
|
|
|
+ <el-button type="primary" icon="el-icon-search" @click="selectQwUser()" size="mini">搜索账号</el-button>
|
|
|
+ </el-form-item>
|
|
|
+ <el-form-item label="企微账号" prop="companyUserId">
|
|
|
+ <el-tag
|
|
|
+ style="margin-left: 5px"
|
|
|
+ size="medium"
|
|
|
+ :key="id"
|
|
|
+ v-for="id in qwUser"
|
|
|
+ closable
|
|
|
+ :disable-transitions="false"
|
|
|
+ @close="handleClosegroupUser(id)">
|
|
|
+ <span v-for="list in qwUserList" :key="list.qwUserId" v-if="list.id==id">{{list.qwUserName}}({{list.corpName}})
|
|
|
+ </span>
|
|
|
+ </el-tag>
|
|
|
+ </el-form-item>
|
|
|
+ </el-form>
|
|
|
+ <div slot="footer" class="dialog-footer">
|
|
|
+ <el-button type="primary" @click="qwSubmitForm">绑 定</el-button>
|
|
|
+ <el-button @click="qwCancel">取 消</el-button>
|
|
|
+ </div>
|
|
|
+ </el-dialog>
|
|
|
+
|
|
|
+ <el-dialog title="选择企微主体" :visible.sync="synOpen" width="800px" append-to-body>
|
|
|
+ <el-form label-width="80px">
|
|
|
+ <el-form-item label="企微公司" prop="corpId">
|
|
|
+ <el-select v-model="synform.corpId" placeholder="企微公司" >
|
|
|
+ <el-option
|
|
|
+ v-for="dict in myQwCompanyList"
|
|
|
+ :key="dict.dictValue"
|
|
|
+ :label="dict.dictLabel"
|
|
|
+ :value="dict.dictValue"
|
|
|
+ />
|
|
|
+ </el-select>
|
|
|
+ </el-form-item>
|
|
|
+ </el-form>
|
|
|
+ <div slot="footer" class="dialog-footer">
|
|
|
+ <el-button type="primary" @click="synSubmitForm">确 定</el-button>
|
|
|
+ <el-button @click="synOpen=false">取 消</el-button>
|
|
|
+ </div>
|
|
|
+ </el-dialog>
|
|
|
+
|
|
|
+ <el-dialog title="选择企微主体" :visible.sync="synNameOpen" width="800px" append-to-body>
|
|
|
+ <el-form label-width="80px">
|
|
|
+ <el-form-item label="企微公司" prop="corpId">
|
|
|
+ <el-select v-model="synNameform.corpId" placeholder="企微公司" >
|
|
|
+ <el-option
|
|
|
+ v-for="dict in myQwCompanyList"
|
|
|
+ :key="dict.dictValue"
|
|
|
+ :label="dict.dictLabel"
|
|
|
+ :value="dict.dictValue"
|
|
|
+ />
|
|
|
+ </el-select>
|
|
|
+ </el-form-item>
|
|
|
+ </el-form>
|
|
|
+ <div slot="footer" class="dialog-footer">
|
|
|
+ <el-button type="primary" @click="synNameSubmitForm">确 定</el-button>
|
|
|
+ <el-button @click="synNameOpen=false">取 消</el-button>
|
|
|
+ </div>
|
|
|
+ </el-dialog>
|
|
|
+ <!-- 添加或修改参数配置对话框 -->
|
|
|
+ <el-dialog :title="title" :visible.sync="open" width="700px" append-to-body>
|
|
|
+ <el-form ref="form" :model="form" :rules="rules" label-width="80px">
|
|
|
+ <el-row>
|
|
|
+ <el-col :span="12">
|
|
|
+<!-- <el-form-item label="员工账号" prop="userName">-->
|
|
|
+<!-- <el-input v-model="form.userName" placeholder="请输入员工后台账号" />-->
|
|
|
+<!-- </el-form-item>-->
|
|
|
+ <el-form-item label="员工姓名" prop="nickName">
|
|
|
+ <el-input v-model="form.nickName" placeholder="请输入员工后台昵称" />
|
|
|
+ </el-form-item>
|
|
|
+ </el-col>
|
|
|
+ <el-col :span="12">
|
|
|
+ <el-form-item label="归属部门" prop="deptId">
|
|
|
+ <treeselect v-model="form.deptId" :options="deptOptionsByCompanyId" :show-count="true" placeholder="请选择归属部门" />
|
|
|
+ </el-form-item>
|
|
|
+ </el-col>
|
|
|
+ </el-row>
|
|
|
+ <el-row>
|
|
|
+ <el-col :span="12">
|
|
|
+ <el-form-item label="手机号码" prop="phonenumber">
|
|
|
+ <el-input v-model="form.phonenumber" placeholder="请输入手机号码" maxlength="11" />
|
|
|
+ </el-form-item>
|
|
|
+ </el-col>
|
|
|
+ <el-col :span="12">
|
|
|
+ <el-form-item label="邮箱" prop="email">
|
|
|
+ <el-input v-model="form.email" placeholder="请输入邮箱" maxlength="50" />
|
|
|
+ </el-form-item>
|
|
|
+ </el-col>
|
|
|
+ </el-row>
|
|
|
+ <el-row>
|
|
|
+ <el-col :span="12">
|
|
|
+ <el-form-item label="员工账号" prop="userName">
|
|
|
+ <el-input v-model="form.userName" placeholder="请输入员工工号" />
|
|
|
+ </el-form-item>
|
|
|
+ </el-col>
|
|
|
+ <el-col :span="12">
|
|
|
+ <el-form-item v-if="form.userId == undefined" label="用户密码" prop="password">
|
|
|
+ <el-input v-model="form.password" placeholder="请输入用户密码" type="password" show-password />
|
|
|
+ </el-form-item>
|
|
|
+ </el-col>
|
|
|
+ </el-row>
|
|
|
+
|
|
|
+ <el-row>
|
|
|
+ <el-col :span="12">
|
|
|
+ <el-form-item label="员工性别">
|
|
|
+ <el-select v-model="form.sex" placeholder="请选择">
|
|
|
+ <el-option v-for="dict in sexOptions" :key="dict.dictValue" :label="dict.dictLabel" :value="dict.dictValue"></el-option>
|
|
|
+ </el-select>
|
|
|
+ </el-form-item>
|
|
|
+ </el-col>
|
|
|
+ <el-col :span="12">
|
|
|
+ <el-form-item label="状态">
|
|
|
+ <el-radio-group v-model="form.status">
|
|
|
+ <el-radio v-for="dict in statusOptions" :key="dict.dictValue" :label="dict.dictValue">{{dict.dictLabel}}</el-radio>
|
|
|
+ </el-radio-group>
|
|
|
+ </el-form-item>
|
|
|
+ </el-col>
|
|
|
+ </el-row>
|
|
|
+ <el-row>
|
|
|
+ <el-col :span="12">
|
|
|
+ <el-form-item label="岗位">
|
|
|
+ <el-select v-model="form.postIds" multiple placeholder="请选择">
|
|
|
+ <el-option v-for="item in postOptions" :key="item.postId" :label="item.postName" :value="item.postId" :disabled="item.status == 1"></el-option>
|
|
|
+ </el-select>
|
|
|
+ </el-form-item>
|
|
|
+ </el-col>
|
|
|
+
|
|
|
+ <el-col :span="12">
|
|
|
+ <el-form-item label="角色">
|
|
|
+ <el-select v-model="form.roleIds" multiple placeholder="请选择">
|
|
|
+ <el-option v-for="item in roleOptions" :key="item.roleId" :label="item.roleName" :value="item.roleId" :disabled="item.status == 1"></el-option>
|
|
|
+ </el-select>
|
|
|
+ </el-form-item>
|
|
|
+ </el-col>
|
|
|
+
|
|
|
+ </el-row>
|
|
|
+ <el-row>
|
|
|
+ <el-col :span="12">
|
|
|
+ <el-form-item label="身份证号">
|
|
|
+ <el-input v-model="form.idCard" placeholder="请输入身份证号" maxlength="18" />
|
|
|
+ </el-form-item>
|
|
|
+ </el-col>
|
|
|
+ <el-col :span="12">
|
|
|
+ <el-form-item label="销售区域" prop="addressId">
|
|
|
+ <el-select v-model="form.addressId" filterable placeholder="请选择所属销售的区域" style="width: 200px;">
|
|
|
+ <el-option
|
|
|
+ v-for="item in citysAreaList"
|
|
|
+ :key="item.cityId"
|
|
|
+ :label="item.cityName"
|
|
|
+ :value="item.cityId"
|
|
|
+ ></el-option>
|
|
|
+ </el-select>
|
|
|
+ </el-form-item>
|
|
|
+ </el-col>
|
|
|
+ </el-row>
|
|
|
+<!-- <el-row>-->
|
|
|
+<!-- <el-col :span="24">-->
|
|
|
+<!-- <el-form-item label="数据权限">-->
|
|
|
+<!-- <el-radio-group v-model="form.userType">-->
|
|
|
+<!-- <el-radio v-for="dict in userTypeOptions" :key="dict.dictValue" :label="dict.dictValue">{{dict.dictLabel}}</el-radio>-->
|
|
|
+<!-- </el-radio-group>-->
|
|
|
+<!-- </el-form-item>-->
|
|
|
+<!-- </el-col>-->
|
|
|
+<!-- </el-row>-->
|
|
|
+<!-- <el-row>
|
|
|
+ <el-col :span="24">
|
|
|
+ <el-form-item label="看课域名">
|
|
|
+ <el-input
|
|
|
+ v-model="form.domain"
|
|
|
+ style="width: 250px"
|
|
|
+ placeholder="请生成域名"
|
|
|
+ @change="onDomainBlur"
|
|
|
+ disabled
|
|
|
+ ></el-input>
|
|
|
+ <el-button type="primary" style="margin-left: 20px" @click="generateDomain">生成域名</el-button>
|
|
|
+ </el-form-item>
|
|
|
+ </el-col>
|
|
|
+ </el-row>-->
|
|
|
+ <el-row>
|
|
|
+ <el-col :span="24">
|
|
|
+ <el-form-item label="备注">
|
|
|
+ <el-input v-model="form.remark" type="textarea" placeholder="请输入内容"></el-input>
|
|
|
+ </el-form-item>
|
|
|
+ </el-col>
|
|
|
+ </el-row>
|
|
|
+ </el-form>
|
|
|
+ <div slot="footer" class="dialog-footer">
|
|
|
+ <el-button type="primary" @click="submitForm">确 定</el-button>
|
|
|
+ <el-button @click="cancel">取 消</el-button>
|
|
|
+ </div>
|
|
|
+ </el-dialog>
|
|
|
+
|
|
|
+ <el-dialog :title="title" :visible.sync="bindCompanyOpen" width="700px" append-to-body>
|
|
|
+ <el-form ref="formBindCompany" :model="formBindCompany" :rules="bindCompanyRules" label-width="80px">
|
|
|
+ <el-row>
|
|
|
+ <el-col :span="12">
|
|
|
+ <el-form-item label="企微主体" prop="corpId">
|
|
|
+ <el-select v-model="formBindCompany.corpId" placeholder="企微主体" size="small">
|
|
|
+ <el-option
|
|
|
+ v-for="dict in myQwCompanyList"
|
|
|
+ :key="dict.dictValue"
|
|
|
+ :label="dict.dictLabel"
|
|
|
+ :value="dict.dictValue"
|
|
|
+ />
|
|
|
+ </el-select>
|
|
|
+ </el-form-item>
|
|
|
+ </el-col>
|
|
|
+ </el-row>
|
|
|
+ <el-row>
|
|
|
+ <el-col :span="12">
|
|
|
+ <el-form-item label="销售公司" prop="companyId">
|
|
|
+ <el-select filterable v-model="formBindCompany.companyId" placeholder="请选择销售公司" clearable size="small" @change="formBindCompanyChange">
|
|
|
+ <el-option
|
|
|
+ v-for="item in companys"
|
|
|
+ :key="item.companyId"
|
|
|
+ :label="item.companyName"
|
|
|
+ :value="item.companyId"
|
|
|
+ />
|
|
|
+ </el-select>
|
|
|
+ </el-form-item>
|
|
|
+ </el-col>
|
|
|
+ </el-row>
|
|
|
+
|
|
|
+ <div v-if="formBindCompany.companyId!=null">
|
|
|
+ <el-row>
|
|
|
+ <el-col :span="12">
|
|
|
+ <el-form-item label="归属部门" prop="deptId">
|
|
|
+ <treeselect v-model="formBindCompany.deptId" :options="deptOptionsByCompanyId" :show-count="true" placeholder="请选择归属部门" />
|
|
|
+ </el-form-item>
|
|
|
+ </el-col>
|
|
|
+ </el-row>
|
|
|
+ <el-row>
|
|
|
+ <el-col :span="12">
|
|
|
+ <el-form-item label="角色" prop="roleIds">
|
|
|
+ <el-select v-model="formBindCompany.roleIds" multiple placeholder="请选择">
|
|
|
+ <el-option v-for="item in roleBindOptions" :key="item.roleId" :label="item.roleName" :value="item.roleId "></el-option>
|
|
|
+ </el-select>
|
|
|
+ </el-form-item>
|
|
|
+ </el-col>
|
|
|
+ </el-row>
|
|
|
+ </div>
|
|
|
+
|
|
|
+ <el-row>
|
|
|
+ <el-col :span="12">
|
|
|
+ <el-form-item label="销售区域" prop="addressId">
|
|
|
+ <el-select v-model="formBindCompany.addressId" filterable placeholder="请选择所属销售的区域" style="width: 200px;">
|
|
|
+ <el-option
|
|
|
+ v-for="item in citysAreaList"
|
|
|
+ :key="item.cityId"
|
|
|
+ :label="item.cityName"
|
|
|
+ :value="item.cityId"
|
|
|
+ ></el-option>
|
|
|
+ </el-select>
|
|
|
+ </el-form-item>
|
|
|
+ </el-col>
|
|
|
+ </el-row>
|
|
|
+ </el-form>
|
|
|
+ <div slot="footer" class="dialog-footer">
|
|
|
+ <el-button type="primary" @click="submitBingCompanyForm">确 定</el-button>
|
|
|
+ <el-button @click="cancelBind">取 消</el-button>
|
|
|
+ </div>
|
|
|
+ </el-dialog>
|
|
|
+
|
|
|
+ <!-- 修改 selectUser 组件的引用 -->
|
|
|
+ <el-dialog :title="user.title" :visible.sync="user.open" width="1000px" append-to-body>
|
|
|
+ <selectUser ref="selectUser" @bindQwUser="bindQwUser" @close="handleSelectUserClose"/>
|
|
|
+ </el-dialog>
|
|
|
+
|
|
|
+ <el-dialog :title="companyUserArea.title" :visible.sync="companyUserArea.open" width="300px" append-to-body>
|
|
|
+ <el-select v-model="addressId" filterable placeholder="请选择所属销售的区域" style="width: 200px;">
|
|
|
+ <el-option
|
|
|
+ v-for="item in citysAreaList"
|
|
|
+ :key="item.cityId"
|
|
|
+ :label="item.cityName"
|
|
|
+ :value="item.cityId"
|
|
|
+ ></el-option>
|
|
|
+ </el-select>
|
|
|
+ <div slot="footer" style="text-align: center;">
|
|
|
+ <el-button type="primary" @click="submitFormArea(addressId)">确 定</el-button>
|
|
|
+ <el-button @click="cancelArea">取 消</el-button>
|
|
|
+ </div>
|
|
|
+ </el-dialog>
|
|
|
+
|
|
|
+ <!-- 设置单独注册会员弹窗 -->
|
|
|
+ <!-- 设置单独注册会员 -->
|
|
|
+ <el-dialog title="设置单独注册会员" :visible.sync="registerOpen" width="400px" append-to-body>
|
|
|
+ <el-form ref="registerForm" :model="registerForm" label-width="160px">
|
|
|
+ <el-form-item label="是否开启单独注册">
|
|
|
+ <el-switch v-model="registerForm.status" :active-value="true" :inactive-value="false"></el-switch>
|
|
|
+ </el-form-item>
|
|
|
+ </el-form>
|
|
|
+ <template #footer>
|
|
|
+ <div class="dialog-footer">
|
|
|
+ <el-button type="primary" @click="submitRegisterForm">确 定</el-button>
|
|
|
+ <el-button @click="registerOpen = false">取 消</el-button>
|
|
|
+ </div>
|
|
|
+ </template>
|
|
|
+ </el-dialog>
|
|
|
+
|
|
|
+ <!-- 允许注册会员 -->
|
|
|
+ <el-dialog title="允许注册会员" :visible.sync="allowedAllRegisterOpen" width="400px" append-to-body>
|
|
|
+ <el-form ref="allowedAllRegisterForm" :model="allowedAllRegisterForm" label-width="160px">
|
|
|
+ <el-form-item label="是否允许注册会员">
|
|
|
+ <el-switch v-model="allowedAllRegisterForm.status" :active-value="true" :inactive-value="false"></el-switch>
|
|
|
+ </el-form-item>
|
|
|
+ </el-form>
|
|
|
+ <template #footer>
|
|
|
+ <div class="dialog-footer">
|
|
|
+ <el-button type="primary" @click="submitAllowedAllRegisterForm">确 定</el-button>
|
|
|
+ <el-button @click="allowedAllRegisterOpen = false">取 消</el-button>
|
|
|
+ </div>
|
|
|
+ </template>
|
|
|
+ </el-dialog>
|
|
|
+
|
|
|
+ <el-dialog :title="bindCompanyUrl.title" v-if="bindCompanyUrl.open" :visible.sync="bindCompanyUrl.open" width="450px" append-to-body>
|
|
|
+ <div style="padding-bottom:15px;" >
|
|
|
+ <img :src="bindCompanyUrl.url" width="400px">
|
|
|
+ </div>
|
|
|
+ <div slot="footer" class="dialog-footer">
|
|
|
+ <el-button @click="downloadImage(bindCompanyUrl.url, bindCompanyUrl.name+'.png')">下载二维码</el-button>
|
|
|
+ </div>
|
|
|
+ </el-dialog>
|
|
|
+
|
|
|
+ <el-dialog :title="upload.title" :visible.sync="upload.open" width="400px" append-to-body>
|
|
|
+ <el-upload
|
|
|
+ ref="upload"
|
|
|
+ :limit="1"
|
|
|
+ accept=".xlsx, .xls"
|
|
|
+ :headers="upload.headers"
|
|
|
+ :action="upload.url + '?updateSupport=' + upload.updateSupport"
|
|
|
+ :disabled="upload.isUploading"
|
|
|
+ :on-progress="handleFileUploadProgress"
|
|
|
+ :on-success="handleFileSuccess"
|
|
|
+ :auto-upload="false"
|
|
|
+ drag
|
|
|
+ >
|
|
|
+ <i class="el-icon-upload"></i>
|
|
|
+ <div class="el-upload__text">将文件拖到此处,或<em>点击上传</em></div>
|
|
|
+ <div class="el-upload__tip text-center" slot="tip">
|
|
|
+ <div class="el-upload__tip" slot="tip">
|
|
|
+ </div>
|
|
|
+ <span>仅允许导入xls、xlsx格式文件。</span>
|
|
|
+ <el-link type="primary" :underline="false" style="font-size:12px;vertical-align: baseline;" @click="importTemplate">下载模板</el-link>
|
|
|
+ </div>
|
|
|
+ </el-upload>
|
|
|
+ <div slot="footer" class="dialog-footer">
|
|
|
+ <el-button type="primary" @click="submitFileForm">确 定</el-button>
|
|
|
+ <el-button @click="upload.open = false">取 消</el-button>
|
|
|
+ </div>
|
|
|
+ </el-dialog>
|
|
|
+
|
|
|
+ <el-dialog :title="doctor.title" :visible.sync="doctor.open" width="800px" append-to-body>
|
|
|
+ <selectDoctor ref="selectDoctor" @bindCompanyUserDoctorId="bindCompanyUserDoctorId"></selectDoctor>
|
|
|
+ </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 {
|
|
|
+ qwList,
|
|
|
+ delUser,
|
|
|
+ addUser,
|
|
|
+ getUser,
|
|
|
+ updateUser,
|
|
|
+ exportUser,
|
|
|
+ resetUserPwd,
|
|
|
+ importTemplate,
|
|
|
+ getCitysAreaList,
|
|
|
+ changeUserStatus,
|
|
|
+ generateSubDomain,
|
|
|
+ setIsRegisterMember,
|
|
|
+ updateCompanyUserAreaList,
|
|
|
+ isAllowedAllRegister, unBindDoctorId, bindDoctorId, updateBatchUserRoles, addCodeUrl, addInfo
|
|
|
+} from '@/api/company/companyUserAll'
|
|
|
+import { getToken } from "@/utils/auth";
|
|
|
+import { treeselect } from "@/api/company/companyDept";
|
|
|
+import Treeselect from "@riophae/vue-treeselect";
|
|
|
+import "@riophae/vue-treeselect/dist/vue-treeselect.css";
|
|
|
+import {bindQwUser, addQwUser, getQwUserByIds,addQwUserName} from '@/api/qw/user';
|
|
|
+import { syncDept } from '@/api/qw/qwDept';
|
|
|
+import {getMyQwCompanyList } from "@/api/qw/user";
|
|
|
+import selectUser from "@/views/company/components/selectQwUser.vue";
|
|
|
+import { getConfigByKey } from "@/api/company/companyConfig";
|
|
|
+import axios from "axios";
|
|
|
+import selectDoctor from "@/views/qw/user/selectDoctor.vue";
|
|
|
+import { getCompanyList } from '@/api/company/company'
|
|
|
+export default {
|
|
|
+ name: "User",
|
|
|
+ components: {selectDoctor, Treeselect ,selectUser},
|
|
|
+ data() {
|
|
|
+ return {
|
|
|
+ companyIdOpen:{
|
|
|
+ open:null,
|
|
|
+ companyId:null,
|
|
|
+ },
|
|
|
+ companys:[],
|
|
|
+ doctor: {
|
|
|
+ open: false,
|
|
|
+ title: '绑定医生'
|
|
|
+ },
|
|
|
+ doctorForm: {
|
|
|
+ userId: null,
|
|
|
+ doctorId: null
|
|
|
+ },
|
|
|
+ uploadUrl: process.env.VUE_APP_BASE_API+"/company/CompanyUserAll/common/uploadOSS",
|
|
|
+ // 遮罩层
|
|
|
+ loading: false,
|
|
|
+ qwUserList:[],
|
|
|
+ qwUserId:[],
|
|
|
+ myQwCompanyList:[],
|
|
|
+ qwUser:[],
|
|
|
+ user:{
|
|
|
+ open:false,
|
|
|
+ title:"搜索企业"
|
|
|
+ },
|
|
|
+ // 选中数组
|
|
|
+ ids: [],
|
|
|
+
|
|
|
+ //允许注册会员
|
|
|
+ isAllowedAllRegister: [],
|
|
|
+
|
|
|
+ //是否单独注册
|
|
|
+ isNeedRegisterMember: [],
|
|
|
+ synform:{corpId:null},
|
|
|
+ synOpen:false,
|
|
|
+ synNameform:{corpId:null},
|
|
|
+ synNameOpen:false,
|
|
|
+ // 非单个禁用
|
|
|
+ single: true,
|
|
|
+ // 非多个禁用
|
|
|
+ multiple: true,
|
|
|
+ // 显示搜索条件
|
|
|
+ showSearch: true,
|
|
|
+ // 总条数
|
|
|
+ total: 0,
|
|
|
+ // 用户表格数据
|
|
|
+ userList: null,
|
|
|
+ // 弹出层标题
|
|
|
+ title: "",
|
|
|
+ // 部门树选项
|
|
|
+ deptOptions: undefined,
|
|
|
+ deptOptionsByCompanyId: undefined,
|
|
|
+ // 是否显示弹出层
|
|
|
+ open: false,
|
|
|
+ bindCompanyOpen: false,
|
|
|
+ qwOpen:false,
|
|
|
+ // 部门名称
|
|
|
+ deptName: undefined,
|
|
|
+ // 日期范围
|
|
|
+ dateRange: [],
|
|
|
+ // 状态数据字典
|
|
|
+ statusOptions: [],
|
|
|
+ // 性别状态字典
|
|
|
+ sexOptions: [],
|
|
|
+ // 岗位选项
|
|
|
+ postOptions: [],
|
|
|
+ // 角色选项
|
|
|
+ roleOptions: [],
|
|
|
+ roleBindOptions: [],
|
|
|
+ userTypeOptions:[
|
|
|
+ { "dictLabel": "临时管理员","dictValue": "02"},
|
|
|
+ { "dictLabel": "普通用户","dictValue": "01"}
|
|
|
+ ],
|
|
|
+ qwForm:{
|
|
|
+ id:null,
|
|
|
+ companyUserId:null,
|
|
|
+ },
|
|
|
+ companyUserArea:{
|
|
|
+ open:false,
|
|
|
+ title:"分配区域",
|
|
|
+ },
|
|
|
+ //选择的区域
|
|
|
+ addressId:null,
|
|
|
+
|
|
|
+ citysAreaList:[],
|
|
|
+ // 表单参数
|
|
|
+ form: {},
|
|
|
+ formBindCompany: {},
|
|
|
+
|
|
|
+ bindCompanyUrl:{
|
|
|
+ open:false,
|
|
|
+ title:"绑定/注册销售二维码",
|
|
|
+ name:null,
|
|
|
+ url:null,
|
|
|
+ },
|
|
|
+
|
|
|
+ form1: {},
|
|
|
+ defaultProps: {
|
|
|
+ children: "children",
|
|
|
+ label: "label",
|
|
|
+ },
|
|
|
+ // 用户导入参数
|
|
|
+ upload: {
|
|
|
+ // 是否显示弹出层(用户导入)
|
|
|
+ open: false,
|
|
|
+ // 弹出层标题(用户导入)
|
|
|
+ title: "",
|
|
|
+ // 是否禁用上传
|
|
|
+ isUploading: false,
|
|
|
+ // 是否更新已经存在的用户数据
|
|
|
+ updateSupport: 0,
|
|
|
+ // 设置上传的请求头部
|
|
|
+ headers: { Authorization: "Bearer " + getToken() },
|
|
|
+ // 上传的地址
|
|
|
+ url: process.env.VUE_APP_BASE_API + "/company/CompanyUserAll/importCompanyUser",
|
|
|
+ },
|
|
|
+ // 查询参数
|
|
|
+ queryParams: {
|
|
|
+ pageNum: 1,
|
|
|
+ pageSize: 10,
|
|
|
+ userName: null,
|
|
|
+ companyId:null,
|
|
|
+ phonenumber: null,
|
|
|
+ status: null,
|
|
|
+ deptId: null,
|
|
|
+ qwStatus:null,
|
|
|
+ },
|
|
|
+ qwStatusOptions:[],
|
|
|
+ registerOpen: false,
|
|
|
+ registerForm: {
|
|
|
+ status: false,
|
|
|
+ },
|
|
|
+ // 表单校验
|
|
|
+ rules: {
|
|
|
+ userName: [
|
|
|
+ { required: true, message: "员工工号不能为空", trigger: "blur" },
|
|
|
+ ],
|
|
|
+ nickName: [
|
|
|
+ { required: true, message: "员工姓名不能为空", trigger: "blur" },
|
|
|
+ ],
|
|
|
+ deptId: [
|
|
|
+ { required: true, message: "归属部门不能为空", trigger: "blur" },
|
|
|
+ ],
|
|
|
+ addressId: [
|
|
|
+ { required: true, message: "销售所属区域不能为空", trigger: "blur" },
|
|
|
+ ],
|
|
|
+ password: [
|
|
|
+ { required: true, message: "员工密码不能为空", trigger: "blur" },
|
|
|
+ {
|
|
|
+ pattern: /^(?=.*[A-Za-z])(?=.*\d)(?=.*[^A-Za-z0-9]).{8,20}$/,
|
|
|
+ message: "密码长度为 8-20 位,必须包含字母、数字和特殊字符",
|
|
|
+ trigger: ["blur", "change"],
|
|
|
+ }
|
|
|
+ ],
|
|
|
+ idCard: [
|
|
|
+ { required: true, message: "身份证号不能为空", trigger: "blur" },
|
|
|
+ ],
|
|
|
+ // email: [
|
|
|
+ // { required: true, message: "邮箱地址不能为空", trigger: "blur" },
|
|
|
+ // {
|
|
|
+ // type: "email",
|
|
|
+ // message: "'请输入正确的邮箱地址",
|
|
|
+ // trigger: ["blur", "change"],
|
|
|
+ // },
|
|
|
+ // ],
|
|
|
+ phonenumber: [
|
|
|
+ { required: true, message: "手机号码不能为空", trigger: "blur" },
|
|
|
+ {
|
|
|
+ pattern: /^1[3|4|5|6|7|8|9][0-9]\d{8}$/,
|
|
|
+ message: "请输入正确的手机号码",
|
|
|
+ trigger: "blur",
|
|
|
+ },
|
|
|
+ ],
|
|
|
+ },
|
|
|
+ // 表单校验
|
|
|
+ bindCompanyRules: {
|
|
|
+ companyId: [
|
|
|
+ { required: true, message: "销售公司不能为空", trigger: "blur" },
|
|
|
+ ],
|
|
|
+ deptId: [
|
|
|
+ { required: true, message: "归属部门不能为空", trigger: "blur" },
|
|
|
+ ],
|
|
|
+ addressId: [
|
|
|
+ { required: true, message: "销售所属区域不能为空", trigger: "blur" },
|
|
|
+ ],
|
|
|
+ roleIds: [
|
|
|
+ { required: true, message: "角色不能为空", trigger: "blur" },
|
|
|
+ ],
|
|
|
+ corpId: [
|
|
|
+ { required: true, message: "角色不能为空", trigger: "blur" },
|
|
|
+ ],
|
|
|
+ },
|
|
|
+ // 是否允许注册会员开关
|
|
|
+ allowedAllRegisterOpen: false,
|
|
|
+ allowedAllRegisterForm: {
|
|
|
+ status: true
|
|
|
+ },
|
|
|
+ // 在 data() 中添加
|
|
|
+ batchRoleDialogVisible: false,
|
|
|
+ selectedRoleIds: [],
|
|
|
+ batchRoleForm: {
|
|
|
+ userIds: [],
|
|
|
+ roleIds: []
|
|
|
+ },
|
|
|
+ };
|
|
|
+ },
|
|
|
+ watch: {
|
|
|
+ // 根据名称筛选部门树
|
|
|
+ deptName(val) {
|
|
|
+ this.$refs.tree.filter(val);
|
|
|
+ },
|
|
|
+ },
|
|
|
+ created() {
|
|
|
+ this.getList();
|
|
|
+ this.getTreeselect();
|
|
|
+ getCompanyList().then(response => {
|
|
|
+ this.companys = response.data;
|
|
|
+ });
|
|
|
+ this.getDicts("sys_normal_disable").then((response) => {
|
|
|
+ this.statusOptions = response.data;
|
|
|
+ });
|
|
|
+ this.getDicts("company_user_sex").then((response) => {
|
|
|
+ this.sexOptions = response.data;
|
|
|
+ });
|
|
|
+ this.getDicts("sys_qw_user_status").then(response => {
|
|
|
+ this.qwStatusOptions = response.data;
|
|
|
+ });
|
|
|
+ getConfigByKey("his.login").then(response => {
|
|
|
+ this.form1 =JSON.parse(response.data.configValue);
|
|
|
+ });
|
|
|
+ getCitysAreaList().then(res=>{
|
|
|
+ this.citysAreaList=res.data;
|
|
|
+ })
|
|
|
+ getMyQwCompanyList().then(response => {
|
|
|
+ this.myQwCompanyList = response.data;
|
|
|
+ });
|
|
|
+ },
|
|
|
+ methods: {
|
|
|
+ onDomainBlur() {
|
|
|
+ if (this.form.domain != null) {
|
|
|
+ let value = this.form.domain.trim();
|
|
|
+
|
|
|
+ // 强制只保留第一个 http://
|
|
|
+ const httpCount = (value.match(/http:\/\//g) || []).length;
|
|
|
+ if (httpCount > 1) {
|
|
|
+ value = value.replace(/(http:\/\/)+/, 'http://'); // 只留第一个
|
|
|
+ }
|
|
|
+
|
|
|
+ // 如果不是 http:// 开头,自动补充
|
|
|
+ if (!value.startsWith('http://')) {
|
|
|
+ value = 'http://' + value.replace(/^https?:\/\//, ''); // 去掉其他 http(s):// 再补
|
|
|
+ }
|
|
|
+
|
|
|
+ this.form.domain = value; // 重新赋值,保证输入正确
|
|
|
+
|
|
|
+ // 正则校验最终格式,提醒用户
|
|
|
+ const domainPattern = /^http:\/\/([a-zA-Z0-9-]+\.)+[a-zA-Z]{2,}$/;
|
|
|
+ if (!domainPattern.test(this.form.domain)) {
|
|
|
+ return this.$message.error('请输入正确格式的域名,如:http://xxx.xxx.com');
|
|
|
+ }
|
|
|
+ }
|
|
|
+ },
|
|
|
+
|
|
|
+ // 添加处理 selectUser 关闭的方法
|
|
|
+ handleSelectUserClose() {
|
|
|
+ this.user.open = false
|
|
|
+ // 如果 selectUser 组件有 clearSelection 方法,也可以调用
|
|
|
+ if (this.$refs.selectUser && typeof this.$refs.selectUser.clearSelection === 'function') {
|
|
|
+ this.$refs.selectUser.clearSelection()
|
|
|
+ }
|
|
|
+ },
|
|
|
+
|
|
|
+ // edit G start
|
|
|
+ // 修改 selectQwUser 方法
|
|
|
+ selectQwUser() {
|
|
|
+ this.user.open = true;
|
|
|
+ // 在下次DOM更新后设置已选中的项
|
|
|
+ this.$nextTick(() => {
|
|
|
+ if (this.$refs.selectUser && this.qwUserList.length > 0) {
|
|
|
+ // 将已选中的用户传递给子组件
|
|
|
+ this.$refs.selectUser.setSelectedUsers(this.qwUserList);
|
|
|
+ }
|
|
|
+ });
|
|
|
+ },
|
|
|
+
|
|
|
+ // 修改 bindQwUser 方法
|
|
|
+ bindQwUser(row) {
|
|
|
+ // this.user.open = false; // 暂时注释掉这行,改为在 handleBatchBind 中处理
|
|
|
+ if (!this.qwUserList.some(item => item.id == row.id)) {
|
|
|
+ this.qwUserList.push(row)
|
|
|
+ }
|
|
|
+ if (!this.qwUser.some(item => item == row.id)) {
|
|
|
+ this.qwUser.push(row.id)
|
|
|
+ }
|
|
|
+ },
|
|
|
+
|
|
|
+ // 修改 qwBind 方法
|
|
|
+ qwBind(row) {
|
|
|
+ this.qwUser = [];
|
|
|
+ this.qwUserList = [];
|
|
|
+ this.qwForm.companyUserId = row.userId;
|
|
|
+ getUser(row.userId).then((response) => {
|
|
|
+ if (response.data.qwUserId != null) {
|
|
|
+ // 保存已绑定的企微用户ID列表
|
|
|
+ this.qwUser = ((response.data.qwUserId).split(",").map(Number));
|
|
|
+ getQwUserByIds(this.qwUser).then(res => {
|
|
|
+ this.qwUserList = res.data;
|
|
|
+ });
|
|
|
+ }
|
|
|
+ // 先打开"绑定企微账号"对话框
|
|
|
+ this.qwOpen = true;
|
|
|
+ });
|
|
|
+ },
|
|
|
+
|
|
|
+ // 添加批量角色更新提交方法
|
|
|
+ submitBatchRoles() {
|
|
|
+ // 验证选择的角色
|
|
|
+ if (!this.selectedRoleIds || this.selectedRoleIds.length === 0) {
|
|
|
+ this.$message.warning("请至少选择一个角色");
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ // 调用API批量更新用户角色
|
|
|
+ updateBatchUserRoles({ userIds: this.ids, roleIds: this.selectedRoleIds })
|
|
|
+ .then(response => {
|
|
|
+ if (response.code === 200) {
|
|
|
+ this.$message.success("批量修改角色成功");
|
|
|
+ this.batchRoleDialogVisible = false;
|
|
|
+ this.getList(); // 刷新列表
|
|
|
+ }
|
|
|
+ });
|
|
|
+ },
|
|
|
+ // edit G end
|
|
|
+
|
|
|
+ /** 查询用户列表 */
|
|
|
+ getList() {
|
|
|
+ this.loading = true;
|
|
|
+ qwList(this.addDateRange(this.queryParams, this.dateRange)).then(
|
|
|
+ (response) => {
|
|
|
+ this.userList = response.rows;
|
|
|
+ this.total = response.total;
|
|
|
+ this.loading = false;
|
|
|
+ }
|
|
|
+ );
|
|
|
+ },
|
|
|
+
|
|
|
+ handleClosegroupUser(list) {
|
|
|
+ const index = this.qwUser.findIndex(t => t === list);
|
|
|
+ if (index !== -1) {
|
|
|
+ this.qwUser.splice(index, 1);
|
|
|
+ }
|
|
|
+ },
|
|
|
+ /** 查询部门下拉树结构 */
|
|
|
+ getTreeselect() {
|
|
|
+ treeselect().then((response) => {
|
|
|
+ this.deptOptions = response.data;
|
|
|
+ });
|
|
|
+ },
|
|
|
+
|
|
|
+ getTreeselectByCompanyId(companyId) {
|
|
|
+ treeselect({companyId}).then((response) => {
|
|
|
+ this.deptOptionsByCompanyId = response.data;
|
|
|
+ });
|
|
|
+ },
|
|
|
+
|
|
|
+ // 筛选节点
|
|
|
+ filterNode(value, data) {
|
|
|
+ if (!value) return true;
|
|
|
+ return data.label.indexOf(value) !== -1;
|
|
|
+ },
|
|
|
+ // 节点单击事件
|
|
|
+ handleNodeClick(data) {
|
|
|
+ this.queryParams.deptId = data.id;
|
|
|
+ this.queryParams.companyId=data.companyId;
|
|
|
+ this.getList();
|
|
|
+ },
|
|
|
+ // 用户状态修改
|
|
|
+ handleStatusChange(row) {
|
|
|
+ let text = row.status === "0" ? "启用" : "停用";
|
|
|
+ this.$confirm(
|
|
|
+ '确认要"' + text + '""' + row.userName + '"用户吗?',
|
|
|
+ "警告",
|
|
|
+ {
|
|
|
+ confirmButtonText: "确定",
|
|
|
+ cancelButtonText: "取消",
|
|
|
+ type: "warning",
|
|
|
+ }
|
|
|
+ )
|
|
|
+ .then(function() {
|
|
|
+ return changeUserStatus(row.userId, row.status);
|
|
|
+ })
|
|
|
+ .then(() => {
|
|
|
+ this.msgSuccess(text + "成功");
|
|
|
+ })
|
|
|
+ .catch(function() {
|
|
|
+ row.status = row.status === "0" ? "1" : "0";
|
|
|
+ });
|
|
|
+ },
|
|
|
+ // 取消按钮
|
|
|
+ cancel() {
|
|
|
+ this.open = false;
|
|
|
+ this.reset();
|
|
|
+ },
|
|
|
+ cancelBind() {
|
|
|
+ this.bindCompanyOpen = false;
|
|
|
+ this.resetBindCompany();
|
|
|
+ },
|
|
|
+
|
|
|
+ submitFormArea(address) {
|
|
|
+ const uIds = this.ids;
|
|
|
+
|
|
|
+ if (address == null) {
|
|
|
+ this.$message.error("请选择地区");
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ updateCompanyUserAreaList({ userIds: uIds, addressId: address }).then(res => {
|
|
|
+ this.companyUserArea.open = false;
|
|
|
+ this.getList();
|
|
|
+ this.msgSuccess("操作成功");
|
|
|
+
|
|
|
+ })
|
|
|
+
|
|
|
+ },
|
|
|
+ cancelArea() {
|
|
|
+ this.companyUserArea.open = false;
|
|
|
+ this.addressId = null;
|
|
|
+ },
|
|
|
+ qwCancel() {
|
|
|
+ this.qwOpen = false;
|
|
|
+ this.qwUserId = null;
|
|
|
+ },
|
|
|
+
|
|
|
+ handerCompanyUserAreaList() {
|
|
|
+ this.companyUserArea.open = true;
|
|
|
+ },
|
|
|
+ // 表单重置
|
|
|
+ reset() {
|
|
|
+ this.form = {
|
|
|
+ userId: undefined,
|
|
|
+ deptId: undefined,
|
|
|
+ userName: undefined,
|
|
|
+ nickName: undefined,
|
|
|
+ password: undefined,
|
|
|
+ idCard: undefined,
|
|
|
+ phonenumber: undefined,
|
|
|
+ userType: "01",
|
|
|
+ email: undefined,
|
|
|
+ sex: undefined,
|
|
|
+ status: "0",
|
|
|
+ remark: undefined,
|
|
|
+ domain: null,
|
|
|
+ postIds: [],
|
|
|
+ roleIds: [],
|
|
|
+ };
|
|
|
+ this.resetForm("form");
|
|
|
+ },
|
|
|
+
|
|
|
+ resetBindCompany() {
|
|
|
+ this.formBindCompany = {
|
|
|
+ deptId: null,
|
|
|
+ addressId: null,
|
|
|
+ roleIds: [],
|
|
|
+ companyId: null,
|
|
|
+ };
|
|
|
+ this.resetForm("formBindCompany");
|
|
|
+ },
|
|
|
+
|
|
|
+ /** 搜索按钮操作 */
|
|
|
+ handleQueryCompanyId() {
|
|
|
+ if (this.companyIdOpen.companyId == null) {
|
|
|
+ return this.$message.warning("请选择公司");
|
|
|
+ }
|
|
|
+ this.reset();
|
|
|
+ this.getTreeselectByCompanyId(this.companyIdOpen.companyId);
|
|
|
+ addInfo(this.companyIdOpen.companyId).then((response) => {
|
|
|
+ this.postOptions = response.posts;
|
|
|
+ this.roleOptions = response.roles;
|
|
|
+ this.open = true;
|
|
|
+ this.title = "添加员工";
|
|
|
+ this.form.password = this.form1.loginPassword;
|
|
|
+ });
|
|
|
+ },
|
|
|
+
|
|
|
+ /** 新增按钮操作 */
|
|
|
+ handleAdd() {
|
|
|
+ this.companyIdOpen.open=true;
|
|
|
+ },
|
|
|
+
|
|
|
+ /** 重置按钮操作 */
|
|
|
+ resetQueryCompanyId() {
|
|
|
+ this.companyIdOpen.companyId=null;
|
|
|
+ this.companyIdOpen.open=false;
|
|
|
+ },
|
|
|
+
|
|
|
+ /** 搜索按钮操作 */
|
|
|
+ handleQuery() {
|
|
|
+ this.queryParams.page = 1;
|
|
|
+ this.getList();
|
|
|
+ },
|
|
|
+ /** 重置按钮操作 */
|
|
|
+ resetQuery() {
|
|
|
+ this.dateRange = [];
|
|
|
+ this.resetForm("queryForm");
|
|
|
+ this.handleQuery();
|
|
|
+ },
|
|
|
+ // 多选框选中数据
|
|
|
+ handleSelectionChange(selection) {
|
|
|
+ this.ids = selection.map((item) => item.userId);
|
|
|
+ this.isNeedRegisterMember = selection.map((item) => item.isNeedRegisterMember);
|
|
|
+ this.isAllowedAllRegister = selection.map((item) => item.isAllowedAllRegister);
|
|
|
+ this.single = selection.length != 1;
|
|
|
+ this.multiple = !selection.length;
|
|
|
+ },
|
|
|
+
|
|
|
+
|
|
|
+ handleBindCompanyUserCode() {
|
|
|
+ this.reset();
|
|
|
+ this.getTreeselect();
|
|
|
+
|
|
|
+ this.bindCompanyOpen = true;
|
|
|
+ this.title = "创建 新增/绑定销售 的二维码";
|
|
|
+
|
|
|
+ },
|
|
|
+
|
|
|
+ /** 修改按钮操作 */
|
|
|
+ handleUpdate(row) {
|
|
|
+ this.reset();
|
|
|
+ const userId = row.userId || this.ids;
|
|
|
+ getUser(userId).then((response) => {
|
|
|
+ this.getTreeselectByCompanyId(response.data.companyId);
|
|
|
+ setTimeout(() => {
|
|
|
+ this.form = response.data;
|
|
|
+ this.postOptions = response.posts;
|
|
|
+ this.roleOptions = response.roles;
|
|
|
+ this.form.postIds = response.postIds;
|
|
|
+ this.form.roleIds = response.roleIds;
|
|
|
+ this.open = true;
|
|
|
+ this.title = "修改员工";
|
|
|
+ this.form.password = "";
|
|
|
+ }, 200);
|
|
|
+ });
|
|
|
+ },
|
|
|
+ /** 重置密码按钮操作 */
|
|
|
+ handleResetPwd(row) {
|
|
|
+ this.$prompt('请输入"' + row.userName + '"的新密码', "提示", {
|
|
|
+ confirmButtonText: "确定",
|
|
|
+ cancelButtonText: "取消",
|
|
|
+ inputPlaceholder: "8-20 位,包含字母、数字和特殊字符",
|
|
|
+ inputValidator: (value) => {
|
|
|
+ const pattern = /^(?=.*[A-Za-z])(?=.*\d)(?=.*[^A-Za-z0-9]).{8,20}/;
|
|
|
+ const hasChinese = /[\u4e00-\u9fa5]/.test(value);
|
|
|
+ const hasFullWidth = /[!-~]/.test(value);
|
|
|
+
|
|
|
+ if (hasChinese) return '不能包含中文字符';
|
|
|
+ if (hasFullWidth) return '不能包含全角符号,请使用英文输入法';
|
|
|
+ if (!pattern.test(value)) return '密码格式错误:需包含字母、数字和英文特殊字符,长度为 8-20 位';
|
|
|
+
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+ })
|
|
|
+ .then(({ value }) => {
|
|
|
+ resetUserPwd(row.userId, value).then((response) => {
|
|
|
+ if (response.code === 200) {
|
|
|
+ this.msgSuccess("修改成功,新密码是:" + value);
|
|
|
+ }
|
|
|
+ });
|
|
|
+ })
|
|
|
+ .catch(() => {
|
|
|
+ });
|
|
|
+ },
|
|
|
+ /** 提交按钮 */
|
|
|
+ submitForm: function() {
|
|
|
+
|
|
|
+ // this.onDomainBlur();
|
|
|
+
|
|
|
+ // const domainPattern = /^http:\/\/([a-zA-Z0-9-]+\.)+[a-zA-Z]{2,}$/;
|
|
|
+ // if (this.form.domain!=null && !domainPattern.test(this.form.domain)) {
|
|
|
+ // this.$message.error('请输入正确格式的域名,如:http://xxx.xxx.com');
|
|
|
+ // return;
|
|
|
+ // }
|
|
|
+
|
|
|
+ this.$refs["form"].validate((valid) => {
|
|
|
+ if (valid) {
|
|
|
+ if (this.form.userId != undefined) {
|
|
|
+ updateUser(this.form).then((response) => {
|
|
|
+ if (response.code === 200) {
|
|
|
+ this.msgSuccess("修改成功");
|
|
|
+ this.open = false;
|
|
|
+ this.getList();
|
|
|
+ }
|
|
|
+ });
|
|
|
+ } else {
|
|
|
+ addUser(this.form).then((response) => {
|
|
|
+ if (response.code === 200) {
|
|
|
+ this.msgSuccess("新增成功");
|
|
|
+ this.open = false;
|
|
|
+ this.getList();
|
|
|
+ }
|
|
|
+ });
|
|
|
+ }
|
|
|
+ }
|
|
|
+ });
|
|
|
+ },
|
|
|
+
|
|
|
+ downloadImage(imageSrc, fileName) {
|
|
|
+ const link = document.createElement('a');
|
|
|
+ link.href = imageSrc;
|
|
|
+ link.download = fileName || '绑定或新增销售.png';
|
|
|
+ document.body.appendChild(link);
|
|
|
+ link.click();
|
|
|
+ document.body.removeChild(link);
|
|
|
+ },
|
|
|
+
|
|
|
+ formBindCompanyChange(){
|
|
|
+
|
|
|
+
|
|
|
+ if (this.formBindCompany.companyId == null) {
|
|
|
+ return this.$message.warning("请选择公司");
|
|
|
+ }
|
|
|
+
|
|
|
+ this.getTreeselectByCompanyId(this.formBindCompany.companyId);
|
|
|
+
|
|
|
+ addInfo(this.formBindCompany.companyId).then((response) => {
|
|
|
+
|
|
|
+ this.formBindCompany.deptId= null;
|
|
|
+ this.formBindCompany.roleIds=[];
|
|
|
+
|
|
|
+ this.postOptions = response.posts;
|
|
|
+ this.roleBindOptions = response.roles;
|
|
|
+
|
|
|
+
|
|
|
+ });
|
|
|
+
|
|
|
+ },
|
|
|
+
|
|
|
+ submitBingCompanyForm: function() {
|
|
|
+
|
|
|
+ this.$refs["formBindCompany"].validate((valid) => {
|
|
|
+ if (valid) {
|
|
|
+
|
|
|
+ let loadingRock = this.$loading({
|
|
|
+ lock: true,
|
|
|
+ text: '生成二维码中~~请不要刷新页面!!',
|
|
|
+ spinner: 'el-icon-loading',
|
|
|
+ background: 'rgba(0, 0, 0, 0.7)'
|
|
|
+ });
|
|
|
+
|
|
|
+ addCodeUrl(this.formBindCompany).then((response) => {
|
|
|
+ this.bindCompanyOpen = false;
|
|
|
+ this.bindCompanyUrl.url = response.data.url
|
|
|
+ this.bindCompanyUrl.open = true;
|
|
|
+ this.bindCompanyUrl.name = "绑定或新增 销售二维码";
|
|
|
+ }).finally(res => {
|
|
|
+ loadingRock.close();
|
|
|
+ })
|
|
|
+ }
|
|
|
+ });
|
|
|
+ },
|
|
|
+ /**
|
|
|
+ * 同步企业微信员工
|
|
|
+ */
|
|
|
+ synSubmitForm() {
|
|
|
+ this.synOpen = false;
|
|
|
+ this.loading = true;
|
|
|
+ /*this.msgSuccess("");
|
|
|
+
|
|
|
+ let loadingRock = this.$loading({
|
|
|
+ lock: true,
|
|
|
+ text: '同步中.....请等待.....请不要重复点击!!',
|
|
|
+ spinner: 'el-icon-loading',
|
|
|
+ background: 'rgba(0, 0, 0, 0.7)'
|
|
|
+ });*/
|
|
|
+
|
|
|
+ addQwUser(this.synform.corpId).then(response => {
|
|
|
+ //this.msgSuccess("同步成功");
|
|
|
+ this.msgSuccess("正在同步中...");
|
|
|
+ this.getList();
|
|
|
+ this.synOpen = false;
|
|
|
+ }).finally(() => {
|
|
|
+ this.loading = false;
|
|
|
+ this.synOpen = false;
|
|
|
+ //loadingRock.close();
|
|
|
+ });
|
|
|
+ },
|
|
|
+
|
|
|
+ synNameSubmitForm() {
|
|
|
+ this.synNameOpen = false;
|
|
|
+ this.loading = true;
|
|
|
+
|
|
|
+ addQwUserName(this.synNameform.corpId).then(response => {
|
|
|
+ // this.msgSuccess("同步成功");
|
|
|
+ this.msgSuccess("正在同步中...");
|
|
|
+ this.getList();
|
|
|
+ this.synNameOpen = false;
|
|
|
+ }).finally(() => {
|
|
|
+ this.loading = false;
|
|
|
+ this.synNameOpen = false;
|
|
|
+ //loadingRock.close();
|
|
|
+ });
|
|
|
+ },
|
|
|
+ /**
|
|
|
+ * 同步企业微信部门
|
|
|
+ */
|
|
|
+ qwSyncDept() {
|
|
|
+ syncDept().then(response => {
|
|
|
+ this.msgSuccess("同步成功");
|
|
|
+ this.getList();
|
|
|
+ }).catch(() => {
|
|
|
+ this.msgError("同步失败:" + response.msg);
|
|
|
+ })
|
|
|
+ },
|
|
|
+
|
|
|
+ qwSubmitForm() {
|
|
|
+ let loadingRock = this.$loading({
|
|
|
+ lock: true,
|
|
|
+ text: '绑定中.....同步客户信息中.....',
|
|
|
+ spinner: 'el-icon-loading',
|
|
|
+ background: 'rgba(0, 0, 0, 0.7)'
|
|
|
+ });
|
|
|
+ this.qwForm.id = (this.qwUser).join(',');
|
|
|
+ bindQwUser(this.qwForm).then(response => {
|
|
|
+ this.msgSuccess("绑定成功");
|
|
|
+ this.qwOpen = false;
|
|
|
+ this.getList();
|
|
|
+ this.qwUserId = null;
|
|
|
+ this.qwUser = [];
|
|
|
+ }).finally(res => {
|
|
|
+ loadingRock.close()
|
|
|
+ });
|
|
|
+ },
|
|
|
+ /** 删除按钮操作 */
|
|
|
+ handleDelete(row) {
|
|
|
+
|
|
|
+ const userIds = row.userId || this.ids;
|
|
|
+
|
|
|
+ // 筛选出 userType 为 '00' 的 userId
|
|
|
+ const excludedUserIds = this.userList
|
|
|
+ .filter(user => user.userType == '00')
|
|
|
+ .map(user => user.userId);
|
|
|
+
|
|
|
+ // 从 userIds 中剔除这些 userId
|
|
|
+ const finalUserIds = userIds.filter(userId =>
|
|
|
+ !excludedUserIds.includes(userId)
|
|
|
+ );
|
|
|
+
|
|
|
+ if (finalUserIds.length === 0) {
|
|
|
+ return this.msgInfo("除管理员外无其他的账号,请重新选择");
|
|
|
+ }
|
|
|
+
|
|
|
+ this.$confirm(
|
|
|
+ '是否确认删除员工编号为"' + finalUserIds + '"的数据项?【注意:删除后绑定的企业微信相关信息可能会错乱!!】',
|
|
|
+ "警告",
|
|
|
+ {
|
|
|
+ confirmButtonText: "确定",
|
|
|
+ cancelButtonText: "取消",
|
|
|
+ type: "warning",
|
|
|
+ }
|
|
|
+ )
|
|
|
+ .then(function() {
|
|
|
+ return delUser(finalUserIds);
|
|
|
+ })
|
|
|
+ .then(() => {
|
|
|
+ this.getList();
|
|
|
+ this.msgSuccess("删除成功");
|
|
|
+ })
|
|
|
+ .catch(function() {
|
|
|
+ });
|
|
|
+ },
|
|
|
+ /** 导出按钮操作 */
|
|
|
+ handleExport() {
|
|
|
+ const queryParams = this.queryParams;
|
|
|
+ this.$confirm("是否确认导出所有用户数据项?", "警告", {
|
|
|
+ confirmButtonText: "确定",
|
|
|
+ cancelButtonText: "取消",
|
|
|
+ type: "warning",
|
|
|
+ })
|
|
|
+ .then(function() {
|
|
|
+ return exportUser(queryParams);
|
|
|
+ })
|
|
|
+ .then((response) => {
|
|
|
+ this.download(response.msg);
|
|
|
+ })
|
|
|
+ .catch(function() {
|
|
|
+ });
|
|
|
+ },
|
|
|
+ /** 导入按钮操作 */
|
|
|
+ handleImport() {
|
|
|
+ this.upload.title = "用户导入";
|
|
|
+ this.upload.open = true;
|
|
|
+ },
|
|
|
+ /** 下载模板操作 */
|
|
|
+ importTemplate() {
|
|
|
+ importTemplate().then((response) => {
|
|
|
+ this.download(response.msg);
|
|
|
+ });
|
|
|
+ },
|
|
|
+ // 文件上传中处理
|
|
|
+ handleFileUploadProgress(event, file, fileList) {
|
|
|
+ this.upload.isUploading = true;
|
|
|
+ },
|
|
|
+ // 文件上传成功处理
|
|
|
+ handleFileSuccess(response, file, fileList) {
|
|
|
+ this.upload.open = false;
|
|
|
+ this.upload.isUploading = false;
|
|
|
+ this.$refs.upload.clearFiles();
|
|
|
+ this.$alert(response.msg, "导入结果", { dangerouslyUseHTMLString: true });
|
|
|
+ this.getList();
|
|
|
+ },
|
|
|
+ // 提交上传文件
|
|
|
+ submitFileForm() {
|
|
|
+ this.$refs.upload.submit();
|
|
|
+ },
|
|
|
+ generateDomain() {
|
|
|
+ let queryParams;
|
|
|
+ if (this.form.userId) {
|
|
|
+ queryParams = {
|
|
|
+ 'userId': this.form.userId,
|
|
|
+ }
|
|
|
+ }
|
|
|
+ generateSubDomain(queryParams).then(response => {
|
|
|
+ this.form.domain = response.data
|
|
|
+ });
|
|
|
+ },
|
|
|
+ /** 设置单独注册会员按钮操作 */
|
|
|
+ handleSetRegister() {
|
|
|
+ this.registerOpen = true;
|
|
|
+
|
|
|
+ if (this.isNeedRegisterMember && this.isNeedRegisterMember.some(item => item === 0)) {
|
|
|
+ this.registerForm.status = false;
|
|
|
+ } else {
|
|
|
+ this.registerForm.status = true;
|
|
|
+ }
|
|
|
+ },
|
|
|
+ /** 提交设置单独注册会员 */
|
|
|
+ submitRegisterForm() {
|
|
|
+ setIsRegisterMember({ status: this.registerForm.status }, this.ids).then(response => {
|
|
|
+ if (response.code === 200) {
|
|
|
+ this.msgSuccess("设置成功");
|
|
|
+ this.registerOpen = false;
|
|
|
+ this.getList();
|
|
|
+ }
|
|
|
+ });
|
|
|
+ },
|
|
|
+
|
|
|
+ /** 开关是否允许所有方式注册会员 */
|
|
|
+ handleAllowedAllRegister() {
|
|
|
+ this.allowedAllRegisterOpen = true;
|
|
|
+ if (this.isAllowedAllRegister && this.isAllowedAllRegister.some(item => item === 0)) {
|
|
|
+ this.allowedAllRegisterForm.status = false;
|
|
|
+ } else {
|
|
|
+ this.allowedAllRegisterForm.status = true;
|
|
|
+ }
|
|
|
+ // this.allowedAllRegisterForm.status = true;
|
|
|
+ },
|
|
|
+ // 提交
|
|
|
+ submitAllowedAllRegisterForm() {
|
|
|
+ isAllowedAllRegister({ status: this.allowedAllRegisterForm.status }, this.ids).then(response => {
|
|
|
+ if (response.code === 200) {
|
|
|
+ this.msgSuccess("操作成功");
|
|
|
+ this.allowedAllRegisterOpen = false;
|
|
|
+ this.getList();
|
|
|
+ }
|
|
|
+ });
|
|
|
+ },
|
|
|
+ /**
|
|
|
+ * 上传文件之前的钩子,参数为上传的文件,若返回 false 或者返回 Promise且被 reject,则停止上传。
|
|
|
+ * @param {File} file - 用户选择的文件对象
|
|
|
+ * @param {Object} row - 当前行的数据对象
|
|
|
+ */
|
|
|
+ beforeImageUpload(file, row) {
|
|
|
+ // 清除之前的错误信息
|
|
|
+ this.$set(row, 'uploadError', '');
|
|
|
+ const isJPG = file.type === 'image/jpeg';
|
|
|
+ const isPNG = file.type === 'image/png';
|
|
|
+ const isGIF = file.type === 'image/gif'; // 根据需要添加更多格式
|
|
|
+ const isValidFormat = isJPG || isPNG || isGIF;
|
|
|
+ const isLt2M = file.size / 1024 / 1024 < 2; // 限制图片大小为 2MB
|
|
|
+ if (!isValidFormat) {
|
|
|
+ const errorMsg = '上传二维码图片只能是 JPG/PNG/GIF 格式!';
|
|
|
+ this.$message.error(errorMsg);
|
|
|
+ this.$set(row, 'uploadError', errorMsg); // 在行内显示错误
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ if (!isLt2M) {
|
|
|
+ const errorMsg = '上传二维码图片大小不能超过 2MB!';
|
|
|
+ this.$message.error(errorMsg);
|
|
|
+ this.$set(row, 'uploadError', errorMsg); // 在行内显示错误
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ return true; // 校验通过,允许上传
|
|
|
+ },
|
|
|
+ /**
|
|
|
+ * 自定义上传方法
|
|
|
+ * @param {Object} options - Element UI upload 组件传递的参数,包含 file, onSuccess, onError, onProgress 等
|
|
|
+ * @param {Object} row - 当前行的数据对象
|
|
|
+ */
|
|
|
+ async handleCustomUpload(options, row) {
|
|
|
+
|
|
|
+ const file = options.file;
|
|
|
+ const formData = new FormData();
|
|
|
+ formData.append('file', file);
|
|
|
+
|
|
|
+ formData.append('userId', row.userId)
|
|
|
+
|
|
|
+ this.$set(row, 'uploading', true);
|
|
|
+ this.$set(row, 'uploadError', '');
|
|
|
+ try {
|
|
|
+ const response = await axios.post(this.uploadUrl, formData, {
|
|
|
+ headers: {
|
|
|
+ 'Content-Type': 'multipart/form-data',
|
|
|
+ },
|
|
|
+ onUploadProgress: progressEvent => {
|
|
|
+ const percentCompleted = Math.round((progressEvent.loaded * 100) / progressEvent.total);
|
|
|
+ console.log(`上传进度: ${percentCompleted}%`);
|
|
|
+ }
|
|
|
+ });
|
|
|
+ if (response.data && (response.data.url || (response.data.data && response.data.data.url))) {
|
|
|
+ const imageUrl = response.data.url || response.data.data.url;
|
|
|
+ this.$set(row, 'qrCodeWeixin', imageUrl); // 更新行数据中的图片URL
|
|
|
+ this.$message.success('图片上传成功!');
|
|
|
+ options.onSuccess(response.data, file); // 通知el-upload上传成功 (虽然我们自定义了,但调用一下也无妨)
|
|
|
+ } else {
|
|
|
+ const errorMsg = response.data.message || '图片上传失败,服务器未返回有效URL';
|
|
|
+ this.$message.error(errorMsg);
|
|
|
+ this.$set(row, 'uploadError', errorMsg);
|
|
|
+ options.onError(new Error(errorMsg), file); // 通知el-upload上传失败
|
|
|
+ }
|
|
|
+ } catch (error) {
|
|
|
+ console.error('上传失败:', error);
|
|
|
+ let errorMsg = '图片上传失败';
|
|
|
+ if (error.response && error.response.data && error.response.data.message) {
|
|
|
+ errorMsg = error.response.data.message;
|
|
|
+ } else if (error.message) {
|
|
|
+ errorMsg = error.message;
|
|
|
+ }
|
|
|
+ this.$message.error(errorMsg);
|
|
|
+ this.$set(row, 'uploadError', errorMsg);
|
|
|
+ options.onError(error, file); // 通知el-upload上传失败
|
|
|
+ } finally {
|
|
|
+ this.$set(row, 'uploading', false); // 无论成功失败,结束上传状态
|
|
|
+ }
|
|
|
+ },
|
|
|
+ requestUpload() {
|
|
|
+ },
|
|
|
+ beforeUpload() {
|
|
|
+ console.log(file.type)
|
|
|
+ const isPic =
|
|
|
+ file.type === 'image/jpeg' ||
|
|
|
+ file.type === 'image/png' ||
|
|
|
+ file.type === 'image/gif' ||
|
|
|
+ file.type === 'image/jpg' ||
|
|
|
+ file.type === 'audio/mpeg'
|
|
|
+ const isLt2M = file.size / 1024 / 1024 < 2
|
|
|
+ if (!isPic) {
|
|
|
+ this.$message.error('上传图片只能是 JPG、JPEG、PNG、GIF 格式!')
|
|
|
+ return false
|
|
|
+ }
|
|
|
+ if (!isLt2M) {
|
|
|
+ this.$message.error('上传头像图片大小不能超过 2MB!')
|
|
|
+ }
|
|
|
+ return isPic && isLt2M
|
|
|
+ },
|
|
|
+ handleUpdateDoctor(row) {
|
|
|
+ this.doctor.title = "绑定医生"
|
|
|
+ this.doctor.open = true;
|
|
|
+ this.doctorForm.userId = row.userId;
|
|
|
+ },
|
|
|
+ bindCompanyUserDoctorId(row) {
|
|
|
+ console.log(row)
|
|
|
+ this.doctorForm.doctorId = row;
|
|
|
+ bindDoctorId(this.doctorForm).then(res => {
|
|
|
+ if (res.code == 200) {
|
|
|
+ this.$message.success('绑定成功')
|
|
|
+ } else {
|
|
|
+ this.$message.error('绑定失败:', res.msg)
|
|
|
+ }
|
|
|
+ this.getList()
|
|
|
+ this.doctor.open = false;
|
|
|
+ })
|
|
|
+ },
|
|
|
+ handleUnBindUserId(val) {
|
|
|
+ this.$confirm(
|
|
|
+ '确认解绑医生:<span style="color: green;">' + val.nickName + '' +
|
|
|
+ '</span> 的医生?',
|
|
|
+ {
|
|
|
+ confirmButtonText: "确定",
|
|
|
+ cancelButtonText: "取消",
|
|
|
+ type: "warning",
|
|
|
+ dangerouslyUseHTMLString: true // 允许使用 HTML 字符串
|
|
|
+ }
|
|
|
+ ).then(() => {
|
|
|
+ return unBindDoctorId(val.userId);
|
|
|
+ }).then(response => {
|
|
|
+ this.getList();
|
|
|
+ this.msgSuccess("解绑成功");
|
|
|
+ }).finally(res => {
|
|
|
+ this.getList();
|
|
|
+ })
|
|
|
+ },
|
|
|
+ },
|
|
|
+}
|
|
|
+</script>
|