PersonGroupDrawer.vue 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179
  1. <template>
  2. <el-drawer :title="title" v-model="drawerOpened" @close="reset">
  3. <el-form label-width="80px" :model="formData" :rules="formRules" ref="formInstance">
  4. <el-form-item label="分组名称" prop="name">
  5. <el-input
  6. v-model="formData.name"
  7. type="textarea"
  8. :autosize="{ minRows: 1, maxRows: 2 }"
  9. autocomplete="off"
  10. placeholder="请输入15字以内分组名称"
  11. ></el-input>
  12. </el-form-item>
  13. <el-form-item label="分组描述" prop="description">
  14. <el-input
  15. v-model="formData.description"
  16. type="textarea"
  17. :rows="4"
  18. maxlength="50"
  19. show-word-limit
  20. autocomplete="off"
  21. placeholder="请输入50字以内分组描述"
  22. ></el-input>
  23. </el-form-item>
  24. <el-form-item label="组内成员" prop="userList" :rules="[{ required: true, message: '组内成员不能为空' }]">
  25. <el-select
  26. placeholder="请添加组内人员"
  27. v-model="formData.userList"
  28. value-key="id"
  29. multiple
  30. @click="dialogOpened = true"
  31. >
  32. <el-option
  33. v-for="user in selectedUser"
  34. :key="user.id"
  35. :label="user.staffNo + '-' + user.realname"
  36. :value="user"
  37. />
  38. </el-select>
  39. <p
  40. >共<span>&nbsp;{{ total }}&nbsp;</span>人</p
  41. >
  42. </el-form-item>
  43. <el-form-item label="操作人" prop="operator">
  44. <el-input v-model="operater" disabled="true" />
  45. </el-form-item>
  46. </el-form>
  47. <template #footer>
  48. <el-button @click="reset">重置</el-button>
  49. <el-button type="primary" @click="submit">提交</el-button>
  50. </template>
  51. </el-drawer>
  52. <el-dialog
  53. v-model="dialogOpened"
  54. title="添加人员"
  55. align-center
  56. :close-on-click-modal="false"
  57. style="height: 583px"
  58. :width="731"
  59. :destroy-on-close="true"
  60. class="workShopDialog"
  61. >
  62. <PersonGroupFilter
  63. ref="dialogInstance"
  64. :init-selected="selectedUser"
  65. @cancel="handleCancle"
  66. @submit="handleSubmit"
  67. />
  68. </el-dialog>
  69. </template>
  70. <script setup lang="ts">
  71. import { reactive, ref, computed } from 'vue';
  72. import {
  73. PersonGroupForm,
  74. AddPersonGroupParams,
  75. EditPersonGroupParams,
  76. PersonGroupItem,
  77. PersonGroupListItem,
  78. } from '@/types/person-group/type';
  79. import { addUserGroup, modifyUserGroup, queryUserGroupDetail } from '@/api/system/person-group';
  80. import { FormRules, FormInstance, ElMessage } from 'element-plus';
  81. import { useUserStore } from '@/store/modules/user';
  82. import PersonGroupFilter from './PersonGroupFilter.vue';
  83. import { storeToRefs } from 'pinia';
  84. defineProps<{
  85. title: string;
  86. }>();
  87. const emits = defineEmits<{
  88. (e: 'submitted'): void; // 提交之后触发的事件
  89. }>();
  90. const drawerOpened = ref(false);
  91. const dialogOpened = ref(false);
  92. const selectedUser = ref<PersonGroupItem[]>([]);
  93. // 表单相关
  94. const defaultFormData = (): PersonGroupForm => ({
  95. id: null,
  96. name: '',
  97. description: '',
  98. userList: [],
  99. });
  100. const useUser = useUserStore();
  101. const { info } = storeToRefs(useUser);
  102. const operater = ref(info.value.realname);
  103. const total = ref<number>(0);
  104. const formData = reactive<PersonGroupForm>(defaultFormData());
  105. const formRules: FormRules = {
  106. name: { required: true, trigger: 'blur', message: '请填写分组名称' },
  107. userList: { required: true, trigger: 'blur', message: '请选择组内成员' },
  108. };
  109. const formInstance = ref<FormInstance>();
  110. const isEditing = computed(() => formData.id != null);
  111. /** 重置表单 */
  112. const reset = () => {
  113. formInstance.value?.resetFields();
  114. Object.assign(formData, defaultFormData());
  115. };
  116. /** 提交表单 */
  117. const submit = async () => {
  118. try {
  119. await formInstance.value?.validate();
  120. if (isEditing.value) {
  121. await modifyUserGroup({
  122. name: formData.name,
  123. description: formData.description,
  124. userIdList: formData.userList.map((x) => x.id),
  125. total: formData.userList.length,
  126. userGroupId: formData.id!,
  127. });
  128. } else {
  129. await addUserGroup({
  130. name: formData.name,
  131. description: formData.description,
  132. userIdList: formData.userList.map((x) => x.id),
  133. total: formData.userList.length,
  134. });
  135. }
  136. drawerOpened.value = false;
  137. ElMessage.success('提交成功');
  138. emits('submitted');
  139. } catch (e) {
  140. console.error(e);
  141. }
  142. };
  143. const handleCancle = () => {
  144. dialogOpened.value = false;
  145. };
  146. const handleSubmit = (selectedData: PersonGroupItem[]) => {
  147. selectedUser.value = selectedData;
  148. formData.userList = selectedData;
  149. total.value = formData.userList.length;
  150. dialogOpened.value = false;
  151. };
  152. const open = async (row?: PersonGroupListItem) => {
  153. if (row) {
  154. const res = await queryUserGroupDetail(row.id);
  155. formData.id = res.userGroupId;
  156. formData.name = res.name;
  157. formData.description = res.description;
  158. formData.userList = res.userList;
  159. }
  160. drawerOpened.value = true;
  161. };
  162. defineExpose({
  163. open,
  164. });
  165. </script>