addPerson.vue 5.2 KB

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