User-add.vue 7.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203
  1. <template>
  2. <el-dialog v-model="state.dialogVisible" width="769px" draggable title="新增用户" ref="dialogRef">
  3. <el-form :model="state.ruleForm" label-width="90px" ref="ruleFormRef">
  4. <el-row :gutter="10">
  5. <el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
  6. <el-divider content-position="left"><b class="formTitle">基本信息</b></el-divider>
  7. </el-col>
  8. <el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12">
  9. <el-form-item label="姓名" prop="name" :rules="[{ required: true, message: '请输入姓名', trigger: 'blur' }]">
  10. <el-input v-model="state.ruleForm.name" placeholder="请输入姓名" clearable></el-input>
  11. </el-form-item>
  12. </el-col>
  13. <el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12">
  14. <el-form-item label="账号" prop="userName" :rules="[{ required: true, message: '请输入账号', trigger: 'blur' }]">
  15. <el-input v-model="state.ruleForm.userName" placeholder="请输入账号" clearable></el-input>
  16. </el-form-item>
  17. </el-col>
  18. <el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12">
  19. <el-form-item label="电话号码" prop="phoneNo" :rules="[{ required: false, message: '请输入电话号码', trigger: 'blur' }]">
  20. <el-input v-model="state.ruleForm.phoneNo" placeholder="请输入电话号码" clearable></el-input>
  21. </el-form-item>
  22. </el-col>
  23. <el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12">
  24. <el-form-item label="性别" prop="gender" :rules="[{ required: false, message: '请选择性别', trigger: 'change' }]">
  25. <el-select v-model="state.ruleForm.gender" placeholder="请选择性别" class="w100">
  26. <el-option v-for="item in state.genderList" :key="item.key" :label="item.value" :value="item.key" />
  27. </el-select>
  28. </el-form-item>
  29. </el-col>
  30. <el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
  31. <el-form-item label="所属部门" prop="orgId" :rules="[{ required: true, message: '请选择所属部门', trigger: 'change' }]">
  32. <el-cascader
  33. :options="state.orgData"
  34. filterable
  35. :props="{ checkStrictly: true, value: 'id', label: 'orgName', emitPath: false }"
  36. placeholder="请选择所属部门"
  37. clearable
  38. class="w100"
  39. v-model="state.ruleForm.orgId"
  40. ref="cascadeRef"
  41. @change="getKnowledgeList"
  42. >
  43. </el-cascader>
  44. </el-form-item>
  45. </el-col>
  46. <el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12">
  47. <el-form-item label="默认分机" prop="defaultTelNo" :rules="[{ required: false, message: '请选择默认分机', trigger: 'change' }]">
  48. <el-select-v2 v-model="state.ruleForm.defaultTelNo" :options="state.telsList" placeholder="请选择默认分机" filterable class="w100" />
  49. </el-form-item>
  50. </el-col>
  51. <el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12">
  52. <el-form-item label="邮箱" prop="email" :rules="[{ required: false, message: '请输入邮箱', trigger: 'blur' }]">
  53. <el-input v-model="state.ruleForm.email" placeholder="请输入邮箱" clearable></el-input>
  54. </el-form-item>
  55. </el-col>
  56. <el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12">
  57. <el-form-item label="工号" prop="staffNo" :rules="[{ required: false, message: '请输入工号', trigger: 'blur' }]">
  58. <el-input v-model="state.ruleForm.staffNo" placeholder="请输入工号" clearable></el-input>
  59. </el-form-item>
  60. </el-col>
  61. <el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
  62. <el-divider content-position="left"><b class="formTitle">角色配置</b></el-divider>
  63. </el-col>
  64. <el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12">
  65. <el-form-item label="角色" prop="roleIds" :rules="[{ required: true, message: '请选择角色', trigger: 'change' }]">
  66. <el-select-v2
  67. v-model="state.ruleForm.roleIds"
  68. filterable
  69. multiple
  70. :options="state.roleOptions"
  71. class="w100"
  72. placeholder="请选择角色"
  73. clearable
  74. />
  75. </el-form-item>
  76. </el-col>
  77. </el-row>
  78. </el-form>
  79. <template #footer>
  80. <span class="dialog-footer">
  81. <el-button @click="onCancel" class="default-button">取 消</el-button>
  82. <el-button type="primary" @click="onSubmit(ruleFormRef)" :loading="loading">确 定</el-button>
  83. </span>
  84. </template>
  85. </el-dialog>
  86. </template>
  87. <script setup lang="ts" name="systemUserAdd">
  88. import { reactive, ref } from 'vue';
  89. import { ElMessage, FormInstance } from 'element-plus';
  90. import { throttle } from '/@/utils/tools';
  91. import { addUser, getCanUseOrg, getBaseData, getRoles } from '/@/api/system/user';
  92. import { getTelList } from '/@/api/public/wex';
  93. // 定义子组件向父组件传值/事件
  94. const emit = defineEmits(['updateList']);
  95. // 定义变量内容
  96. const state = reactive<any>({
  97. dialogVisible: false, // 弹窗显示隐藏
  98. ruleForm: {
  99. phoneNo: '', // 手机号
  100. gender: 0, //性别
  101. name: '', // 姓名
  102. userName: '', // 用户昵称
  103. orgId: '', // 组织id
  104. orgCode: '', //组织code
  105. staffNo: '', //工号
  106. defaultTelNo: null, //默认分机
  107. email: '', //邮箱
  108. roleIds: <EmptyArrayType>[], // 角色
  109. },
  110. orgData: [], //可用组织
  111. telsList: [], // 所有分机
  112. genderList: [], // 性别列表
  113. roleOptions: [], // 所有角色
  114. });
  115. let loading = ref<boolean>(false); // 确定按钮loading
  116. // 打开弹窗
  117. const ruleFormRef = ref<RefType>();
  118. const openDialog = () => {
  119. ruleFormRef.value?.clearValidate();
  120. ruleFormRef.value?.resetFields();
  121. getOrgListFn();
  122. getTelsListFn();
  123. getBaseDataFn();
  124. getRolesFn();
  125. state.dialogVisible = true;
  126. };
  127. // 关闭弹窗
  128. const closeDialog = () => {
  129. state.dialogVisible = false;
  130. };
  131. // 取消
  132. const onCancel = () => {
  133. closeDialog();
  134. };
  135. // 获取可用组织
  136. const getOrgListFn = () => {
  137. getCanUseOrg().then((res: any) => {
  138. state.orgData = res?.result ?? [];
  139. });
  140. };
  141. const cascadeRef = ref<RefType>();
  142. // 获取选择组织name值
  143. const getKnowledgeList = () => {
  144. let currentNode = cascadeRef.value.getCheckedNodes();
  145. state.ruleForm.orgCode = currentNode[0]?.data.orgCode ?? '';
  146. };
  147. // 获取分机列表
  148. const getTelsListFn = async (object?: object) => {
  149. const res: any = await getTelList(object);
  150. state.telsList = res?.data ?? [];
  151. state.telsList = state.telsList.map((item: any) => ({
  152. value: item.device,
  153. label: item.device,
  154. ...item,
  155. }));
  156. };
  157. // 查询页面基础信息
  158. const getBaseDataFn = () => {
  159. getBaseData().then((res: any) => {
  160. state.genderList = res?.result?.genderOptions ?? [];
  161. });
  162. };
  163. // 获取角色
  164. const getRolesFn = () => {
  165. getRoles({ PageIndex: 1, PageSize: 999 }).then((res: any) => {
  166. state.roleOptions = res.result?.items ?? [];
  167. state.roleOptions = state.roleOptions.map((item: any) => ({
  168. value: item.id,
  169. label: item.displayName,
  170. }));
  171. });
  172. };
  173. // 新增
  174. const onSubmit = throttle((formEl: FormInstance | undefined) => {
  175. if (!formEl) return;
  176. formEl.validate((valid: boolean) => {
  177. if (!valid) return;
  178. loading.value = true;
  179. addUser(state.ruleForm)
  180. .then(() => {
  181. ElMessage({
  182. message: '新增成功',
  183. type: 'success',
  184. });
  185. loading.value = false;
  186. closeDialog();
  187. emit('updateList');
  188. })
  189. .catch(() => {
  190. // 新增失败
  191. loading.value = false;
  192. closeDialog();
  193. });
  194. });
  195. }, 1000);
  196. // 暴露变量
  197. defineExpose({
  198. openDialog,
  199. closeDialog,
  200. });
  201. </script>