addPerson.vue 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160
  1. <script setup lang="ts">
  2. import { ref, reactive, nextTick } from "vue";
  3. import { ElMessageBox, ElMessage } from "element-plus";
  4. import { postDeptUserAdd, postListTree } from "@/api/department";
  5. const dialogVisibleAdd = ref(false);
  6. const treeSelectRef = ref(null);
  7. const postOrganizationUserPage = ref(null);
  8. const form = reactive({
  9. realName: "",
  10. hospitalCode: "",
  11. deptName: "",
  12. deptCode: "",
  13. gender: "",
  14. jobTitle: "",
  15. phone: ""
  16. });
  17. const deptTree = ref([]);
  18. const handleClose = () => {
  19. ElMessageBox.confirm("确认关闭弹窗吗?")
  20. .then(() => {
  21. dialogVisibleAdd.value = !dialogVisibleAdd.value;
  22. ElMessage({
  23. message: "已关闭",
  24. type: "success"
  25. });
  26. })
  27. .catch(() => {
  28. // catch error
  29. });
  30. };
  31. const postDeptUserAddApi = async () => {
  32. const { code, data, msg } = await postDeptUserAdd(form);
  33. if (code == 200) {
  34. ElMessage({
  35. message: "新建成功",
  36. type: "success"
  37. });
  38. postOrganizationUserPage.value();
  39. dialogVisibleAdd.value = false;
  40. } else {
  41. ElMessage({
  42. message: msg,
  43. type: "error"
  44. });
  45. }
  46. };
  47. // 部门树
  48. const postListTreeApi = async () => {
  49. const { code, data } = await postListTree();
  50. if (code == 200) {
  51. console.log("data", data);
  52. deptTree.value = data;
  53. }
  54. };
  55. // 添加部门保存
  56. const saveDepartment = () => {
  57. console.log("保存");
  58. postDeptUserAddApi();
  59. };
  60. const open = (row, postOrganizationUserPageApi) => {
  61. Object.assign(form, {
  62. realName: "",
  63. hospitalCode: "",
  64. deptName: "",
  65. deptCode: "",
  66. gender: "",
  67. jobTitle: "",
  68. phone: ""
  69. });
  70. if (row.deptCode) {
  71. // console.log("11111", row);
  72. form.deptCode = row.deptCode;
  73. dialogVisibleAdd.value = true;
  74. postOrganizationUserPage.value = postOrganizationUserPageApi;
  75. postListTreeApi();
  76. } else {
  77. ElMessage.warning("请选择部门");
  78. }
  79. };
  80. // 树选择框获取焦点时,展开到对应节点
  81. const openTreeFocus = async () => {
  82. await nextTick(); // 确保组件渲染完成
  83. if (form.deptCode && treeSelectRef.value) {
  84. const node = treeSelectRef.value.getNode(form.deptCode); // 获取节点
  85. if (node) {
  86. treeSelectRef.value.setCurrentKey(form.deptCode); // 选中节点
  87. }
  88. }
  89. };
  90. defineExpose({
  91. open
  92. });
  93. </script>
  94. <template>
  95. <div>
  96. <el-dialog v-model="dialogVisibleAdd" title="添加成员" width="500">
  97. <el-form :model="form" label-width="auto" style="max-width: 600px">
  98. <el-form-item
  99. prop="name"
  100. label="姓名"
  101. :rules="[
  102. {
  103. required: true,
  104. message: '请填写部门名称',
  105. trigger: 'blur'
  106. }
  107. ]"
  108. >
  109. <el-input v-model="form.realName" />
  110. </el-form-item>
  111. <el-form-item label="工号">
  112. <el-input v-model="form.hospitalCode" />
  113. </el-form-item>
  114. <el-form-item label="部门">
  115. <el-tree-select
  116. ref="treeSelectRef"
  117. v-model="form.deptCode"
  118. :data="deptTree"
  119. :props="{
  120. label: 'deptName',
  121. value: 'deptCode',
  122. children: 'childrenRes'
  123. }"
  124. filterable
  125. check-strictly
  126. :render-after-expand="false"
  127. style="width: 240px"
  128. node-key="deptCode"
  129. @focus="openTreeFocus"
  130. />
  131. </el-form-item>
  132. <el-form-item label="性别">
  133. <el-select v-model="form.gender" placeholder="请选择性别">
  134. <el-option label="男" value="女" />
  135. <el-option label="女" value="女" />
  136. </el-select>
  137. </el-form-item>
  138. <el-form-item label="年龄">
  139. <el-input />
  140. </el-form-item>
  141. <el-form-item label="职称">
  142. <el-select v-model="form.jobTitle" placeholder="请选择职称">
  143. <el-option label="Zone one" value="shanghai" />
  144. <el-option label="Zone two" value="beijing" />
  145. </el-select>
  146. </el-form-item>
  147. <el-form-item label="手机号">
  148. <el-input v-model="form.phone" />
  149. </el-form-item>
  150. </el-form>
  151. <template #footer>
  152. <div class="dialog-footer">
  153. <el-button @click="handleClose">取消</el-button>
  154. <el-button type="primary" @click="saveDepartment"> 确认 </el-button>
  155. </div>
  156. </template>
  157. </el-dialog>
  158. </div>
  159. </template>