addPerson.vue 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192
  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. import { getFromSelectDictRankApi, selectRank } from "@/api/select";
  6. import dayjs from "dayjs";
  7. const dialogVisibleAdd = ref(false);
  8. const treeSelectRef = ref(null);
  9. const postOrganizationUserPage = ref(null);
  10. const form = reactive({
  11. realName: "",
  12. hospitalCode: "",
  13. deptName: "",
  14. deptCode: "",
  15. gender: "",
  16. jobTitle: "",
  17. phone: "",
  18. birth: null
  19. });
  20. const dayBirth = ref("");
  21. // 出生日期
  22. const birthChange = day => {
  23. form.birth = dayjs(day).valueOf();
  24. };
  25. const formRef = ref();
  26. const deptTree = ref([]);
  27. const handleClose = () => {
  28. formRef.value.clearValidate(); // 清除验证错误
  29. formRef.value.resetFields(); // 重置表单字段
  30. dialogVisibleAdd.value = !dialogVisibleAdd.value;
  31. };
  32. const postDeptUserAddApi = async () => {
  33. const { code, data, msg } = await postDeptUserAdd(form);
  34. if (code == 200) {
  35. ElMessage({
  36. message: "新建成功",
  37. type: "success"
  38. });
  39. postOrganizationUserPage.value();
  40. dialogVisibleAdd.value = false;
  41. }
  42. };
  43. // 部门树
  44. const postListTreeApi = async () => {
  45. const { code, data } = await postListTree();
  46. if (code == 200) {
  47. console.log("data", data);
  48. deptTree.value = data;
  49. }
  50. };
  51. // 添加部门保存
  52. const saveDepartment = () => {
  53. formRef.value.validate(valid => {
  54. if (valid) {
  55. postDeptUserAddApi();
  56. }
  57. });
  58. };
  59. const open = (row, postOrganizationUserPageApi) => {
  60. Object.assign(form, {
  61. realName: "",
  62. hospitalCode: "",
  63. deptName: "",
  64. deptCode: "",
  65. gender: "",
  66. jobTitle: "",
  67. phone: "",
  68. birth: null
  69. });
  70. if (row.deptCode) {
  71. // console.log("11111", row);
  72. form.deptCode = row.deptCode;
  73. form.deptName = row.deptName;
  74. dialogVisibleAdd.value = true;
  75. postOrganizationUserPage.value = postOrganizationUserPageApi;
  76. postListTreeApi();
  77. getFromSelectDictRankApi();
  78. } else {
  79. ElMessage.warning("请选择部门");
  80. }
  81. };
  82. // 树选择框获取焦点时,展开到对应节点
  83. const openTreeFocus = async () => {
  84. await nextTick(); // 确保组件渲染完成
  85. if (form.deptCode && treeSelectRef.value) {
  86. const node = treeSelectRef.value.getNode(form.deptCode); // 获取节点
  87. if (node) {
  88. treeSelectRef.value.setCurrentKey(form.deptCode); // 选中节点
  89. }
  90. }
  91. };
  92. const rules = reactive({
  93. realName: [
  94. {
  95. required: true,
  96. message: "请填写姓名",
  97. trigger: "blur"
  98. }
  99. ],
  100. hospitalCode: [
  101. {
  102. required: true,
  103. message: "请填写工号",
  104. trigger: "blur"
  105. }
  106. ],
  107. deptCode: [
  108. {
  109. required: true,
  110. message: "请选择部门",
  111. trigger: "blur"
  112. }
  113. ]
  114. });
  115. defineExpose({
  116. open
  117. });
  118. </script>
  119. <template>
  120. <div>
  121. <el-dialog v-model="dialogVisibleAdd" title="添加人员" width="500">
  122. <el-form
  123. ref="formRef"
  124. :model="form"
  125. label-width="auto"
  126. :rules="rules"
  127. style="max-width: 600px"
  128. >
  129. <el-form-item prop="realName" label="姓名">
  130. <el-input v-model="form.realName" placeholder="请输入姓名" />
  131. </el-form-item>
  132. <el-form-item prop="hospitalCode" label="工号">
  133. <el-input v-model="form.hospitalCode" placeholder="请输入工号" />
  134. </el-form-item>
  135. <el-form-item prop="deptCode" label="部门">
  136. <el-tree-select
  137. ref="treeSelectRef"
  138. v-model="form.deptCode"
  139. :data="deptTree"
  140. placeholder="请选择部门"
  141. :props="{
  142. label: 'deptName',
  143. value: 'deptCode',
  144. children: 'childrenRes'
  145. }"
  146. filterable
  147. check-strictly
  148. :render-after-expand="false"
  149. node-key="deptCode"
  150. @focus="openTreeFocus"
  151. />
  152. </el-form-item>
  153. <el-form-item label="性别">
  154. <el-select v-model="form.gender" placeholder="请选择性别">
  155. <el-option label="男" value="男" />
  156. <el-option label="女" value="女" />
  157. </el-select>
  158. </el-form-item>
  159. <el-form-item label="出生日期">
  160. <el-date-picker
  161. v-model="dayBirth"
  162. type="date"
  163. placeholder="请选择出生日期"
  164. @change="birthChange"
  165. />
  166. </el-form-item>
  167. <el-form-item label="职称">
  168. <el-select v-model="form.jobTitle" placeholder="请选择职称">
  169. <el-option
  170. v-for="(item, index) in selectRank"
  171. :key="index"
  172. :label="item.dictValue"
  173. :value="item.dictValue"
  174. />
  175. </el-select>
  176. </el-form-item>
  177. <el-form-item label="手机号">
  178. <el-input v-model="form.phone" placeholder="请输入手机号" />
  179. </el-form-item>
  180. </el-form>
  181. <template #footer>
  182. <div class="dialog-footer">
  183. <el-button @click="handleClose">取消</el-button>
  184. <el-button type="primary" @click="saveDepartment"> 确认 </el-button>
  185. </div>
  186. </template>
  187. </el-dialog>
  188. </div>
  189. </template>