AddPerson.vue 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195
  1. <template>
  2. <el-dialog
  3. v-model="showDialog"
  4. class="add-person-dialog"
  5. title="添加人员"
  6. width="800"
  7. destroy-on-close
  8. @close="initForm()"
  9. >
  10. <el-form :model="formData" ref="ruleFormRef" :rules="rules" label-position="top" class="add-person-dialog__form">
  11. <el-form-item prop="positionId" label="岗位职责">
  12. <el-select v-model="formData.positionId" placeholder="请选择职位">
  13. <el-option
  14. v-for="position in props.positionOptions"
  15. :key="position.positionLevel"
  16. :label="position.title"
  17. :value="position.id"
  18. />
  19. </el-select>
  20. </el-form-item>
  21. <el-form-item prop="realname" label="姓名">
  22. <el-select
  23. v-model="formData.realname"
  24. filterable
  25. remote
  26. reserve-keyword
  27. placeholder="输入名字搜索"
  28. :remote-method="getUsers"
  29. :loading="loading"
  30. >
  31. <el-option
  32. v-for="user in userOptions"
  33. :key="user.id"
  34. :label="user.realname"
  35. :value="user.realname"
  36. @click="setUserInfo(user)"
  37. />
  38. </el-select>
  39. </el-form-item>
  40. <el-form-item prop="staffNo" label="员工号">
  41. <el-input v-model="formData.staffNo" />
  42. </el-form-item>
  43. <el-form-item prop="mobile" label="联系电话">
  44. <el-input v-model="formData.mobile" type="number" />
  45. </el-form-item>
  46. <el-form-item prop="deptName" label="部门">
  47. <el-input v-model="formData.deptName" />
  48. </el-form-item>
  49. <el-form-item prop="jobName" label="职务">
  50. <el-input v-model="formData.jobName" />
  51. </el-form-item>
  52. </el-form>
  53. <template #footer>
  54. <div class="dialog-footer">
  55. <el-button type="primary" @click="submitForm"> 提交 </el-button>
  56. <el-button @click="showDialog = false">取消</el-button>
  57. </div>
  58. </template>
  59. </el-dialog>
  60. </template>
  61. <script setup lang="ts">
  62. import { ref } from 'vue';
  63. import { storeToRefs } from 'pinia';
  64. import type { FormInstance, FormRules } from 'element-plus';
  65. import useTeamStore from '../../store/userTeam';
  66. import { UserType, queryUserListByUsername } from '@/api/user/user';
  67. import { PositionType, saveTeamPersonnel } from '@/api/emergency-organization/teams';
  68. const props = defineProps<{ positionOptions: PositionType[] }>();
  69. type PersonInfo = {
  70. userId: number;
  71. positionId: string;
  72. realname: string;
  73. staffNo: string;
  74. mobile: string;
  75. deptName: string;
  76. jobName: string;
  77. };
  78. const showDialog = ref(false);
  79. const loading = ref(false);
  80. const userOptions = ref<UserType[]>([]);
  81. const { curTeam, loadingTeamInfo } = storeToRefs(useTeamStore());
  82. const { refreshCurTeamInfo } = useTeamStore();
  83. const formData = ref<PersonInfo>({
  84. userId: 0,
  85. positionId: '',
  86. realname: '',
  87. staffNo: '',
  88. mobile: '',
  89. deptName: '',
  90. jobName: '',
  91. });
  92. const ruleFormRef = ref<FormInstance>();
  93. const rules = ref<FormRules<PersonInfo>>({
  94. positionId: [{ required: true, message: '请选择岗位', trigger: 'blur' }],
  95. realname: [{ required: true, message: '请输入姓名', trigger: 'blur' }],
  96. staffNo: [{ required: true, message: '请输入员工号', trigger: 'blur' }],
  97. mobile: [{ required: true, message: '请输入联系电话', trigger: 'blur' }],
  98. });
  99. function initForm() {
  100. formData.value = {
  101. userId: 0,
  102. positionId: '',
  103. realname: '',
  104. staffNo: '',
  105. mobile: '',
  106. deptName: '',
  107. jobName: '',
  108. };
  109. }
  110. function dialogShow() {
  111. showDialog.value = true;
  112. }
  113. async function getUsers(username: string) {
  114. if (username) {
  115. loading.value = true;
  116. userOptions.value = await queryUserListByUsername(username);
  117. loading.value = false;
  118. } else {
  119. userOptions.value = [];
  120. }
  121. }
  122. function setUserInfo(user: UserType) {
  123. formData.value.userId = user.id;
  124. formData.value.staffNo = user.staffNo;
  125. formData.value.mobile = user.mobile;
  126. formData.value.deptName = user.deptName;
  127. formData.value.jobName = user.jobName;
  128. }
  129. async function submitForm() {
  130. await ruleFormRef.value!.validate(async (valid) => {
  131. if (valid) {
  132. loadingTeamInfo.value = true;
  133. showDialog.value = false;
  134. const data = {
  135. teamId: curTeam.value!.teamId,
  136. department: formData.value.deptName,
  137. jobTitle: formData.value.jobName,
  138. ...formData.value,
  139. };
  140. saveTeamPersonnel(data)
  141. .then(() => {
  142. refreshCurTeamInfo();
  143. })
  144. .finally(() => {
  145. loadingTeamInfo.value = false;
  146. });
  147. }
  148. });
  149. }
  150. defineExpose({
  151. dialogShow,
  152. });
  153. </script>
  154. <style scoped lang="scss">
  155. .add-person-dialog__header {
  156. }
  157. .add-person-dialog__form {
  158. display: grid;
  159. grid-template-columns: repeat(2, 45%);
  160. justify-content: space-around;
  161. // 去掉el input右侧的小箭头
  162. :deep(input::-webkit-outer-spin-button),
  163. :deep(input::-webkit-inner-spin-button) {
  164. -webkit-appearance: none;
  165. }
  166. }
  167. :deep(.el-dialog__header) {
  168. text-align: left;
  169. font-weight: bold;
  170. }
  171. </style>
  172. <style>
  173. .add-person-dialog {
  174. min-height: 0;
  175. }
  176. </style>