addPerson.vue 5.2 KB

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