GroupBoard.vue 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313
  1. <template>
  2. <div class="group-board">
  3. <el-form ref="ruleFormRef" style="max-width: 600px" :model="ruleForm" label-width="auto" class="demo-ruleForm">
  4. <el-form-item label="分组名称:" prop="name" v-if="props.drawerTitle === '查看人员分组'">
  5. <el-input
  6. v-model="ruleForm.name"
  7. type="textarea"
  8. :autosize="{ minRows: 1, maxRows: 2 }"
  9. autocomplete="off"
  10. disabled="true"
  11. />
  12. </el-form-item>
  13. <el-form-item label="分组名称:" prop="name" :rules="[{ required: true, message: '分组名称不能为空' }]" v-else>
  14. <el-input
  15. v-model="ruleForm.name"
  16. type="textarea"
  17. :autosize="{ minRows: 1, maxRows: 2 }"
  18. autocomplete="off"
  19. placeholder="请输入15字以内分组名称"
  20. maxlength="15"
  21. show-word-limit
  22. />
  23. </el-form-item>
  24. <el-form-item label="分组描述:" prop="description" v-if="props.drawerTitle === '查看人员分组'">
  25. <el-input v-model="ruleForm.description" type="textarea" :rows="4" autocomplete="off" disabled="true" />
  26. </el-form-item>
  27. <el-form-item label="分组描述:" prop="description" v-else>
  28. <el-input
  29. v-model="ruleForm.description"
  30. type="textarea"
  31. :rows="4"
  32. maxlength="50"
  33. show-word-limit
  34. autocomplete="off"
  35. placeholder="请输入50字以内分组描述"
  36. />
  37. </el-form-item>
  38. <el-form-item label="组内成员:" prop="userList" v-if="props.drawerTitle === '查看人员分组'">
  39. <el-select v-model="ruleForm.userList" value-key="id" multiple disabled="true">
  40. <el-option
  41. v-for="user in selectedUser"
  42. :key="user.id"
  43. :label="user.staffNo + '-' + user.realname"
  44. :value="user"
  45. />
  46. </el-select>
  47. <p
  48. >共<span>&nbsp;{{ total }}&nbsp;</span>人</p
  49. >
  50. </el-form-item>
  51. <el-form-item
  52. label="组内成员:"
  53. prop="userList"
  54. :rules="[{ required: true, message: '组内成员不能为空' }]"
  55. v-else
  56. >
  57. <el-select
  58. placeholder="请添加组内人员"
  59. v-model="ruleForm.userList"
  60. value-key="id"
  61. multiple
  62. @click="dialogVisible = true"
  63. >
  64. <el-option
  65. v-for="user in selectedUser"
  66. :key="user.id"
  67. :label="user.staffNo + '-' + user.realname"
  68. :value="user"
  69. />
  70. </el-select>
  71. <p
  72. >共<span>&nbsp;{{ total }}&nbsp;</span>人</p
  73. >
  74. </el-form-item>
  75. <el-form-item
  76. label="操作人:"
  77. prop="operator"
  78. v-if="props.drawerTitle === '查看人员分组' || props.drawerTitle === '编辑人员分组'"
  79. >
  80. <el-input v-model="ruleForm.operator" disabled="true" />
  81. </el-form-item>
  82. <el-form-item label="创建人:" prop="operator" v-else>
  83. <el-input v-model="ruleForm.operator" disabled="true" />
  84. </el-form-item>
  85. <el-form-item class="buttons" v-if="props.drawerTitle === '编辑人员分组'">
  86. <el-button @click="recoverForm(ruleFormRef)"> 重置 </el-button>
  87. <el-button type="primary" @click="changeForm(ruleFormRef)">提交</el-button>
  88. </el-form-item>
  89. <el-form-item class="buttons" v-if="props.drawerTitle === '新建人员分组'">
  90. <el-button @click="resetForm(ruleFormRef)"> 重置 </el-button>
  91. <el-button type="primary" @click="submitForm(ruleFormRef)">提交</el-button>
  92. </el-form-item>
  93. </el-form>
  94. <el-dialog
  95. v-model="dialogVisible"
  96. title="添加人员"
  97. align-center
  98. :close-on-click-modal="false"
  99. style="height: 583px"
  100. :width="731"
  101. :destroy-on-close="true"
  102. class="workShopDialog"
  103. >
  104. <!-- <SelectTree @cancel="handleCancle" @submit="handleSubmit" :selectedUser="selectedUser" /> -->
  105. <PersonFilterSelection @cancel="handleCancle" @submit="handleSubmit" :init-selected="selectedUser" />
  106. </el-dialog>
  107. </div>
  108. </template>
  109. <script lang="ts" setup>
  110. import { ref, reactive, watch } from 'vue';
  111. // import SelectTree from './SelectTree.vue';
  112. import { SelectedFilterPersonInfo } from '@/api/message/person-group';
  113. import PersonFilterSelection from '@/views/message/components/PersonFilterSelection.vue';
  114. import { storeToRefs } from 'pinia';
  115. import { useUserStore } from '@/store/modules/user';
  116. import type { FormInstance } from 'element-plus';
  117. import { ElMessage, ElMessageBox } from 'element-plus';
  118. import { debounce } from 'lodash-es';
  119. import { addUserGroup, addUserGroupParams, modifyUserGroup, modifyUserGroupParams } from '@/api/message/person-group';
  120. import { FormData } from '../type';
  121. const useUser = useUserStore();
  122. const { info } = storeToRefs(useUser);
  123. import userGroupList from '../store/index';
  124. const userGroup = userGroupList();
  125. const { getUserGroup } = userGroup;
  126. // interface UserList {
  127. // id: string;
  128. // name: string;
  129. // userId: number;
  130. // }
  131. const selectedUser = ref<SelectedFilterPersonInfo[]>([]);
  132. const dialogVisible = ref<boolean>(false);
  133. const ruleFormRef = ref<FormInstance>();
  134. const ruleForm = reactive({
  135. name: '',
  136. description: '',
  137. userList: [] as SelectedFilterPersonInfo[],
  138. operator: info.value.realname,
  139. });
  140. const handleCancle = () => {
  141. dialogVisible.value = false;
  142. };
  143. const total = ref<number>(0);
  144. const handleSubmit = (selectedData: SelectedFilterPersonInfo[]) => {
  145. selectedUser.value = selectedData;
  146. ruleForm.userList = selectedData;
  147. total.value = ruleForm.userList.length;
  148. dialogVisible.value = false;
  149. };
  150. const emit = defineEmits(['close']);
  151. const debounceEmit = debounce((addUserGroupParams) => {
  152. addUserGroup(addUserGroupParams)
  153. .then(() => {
  154. ElMessage({
  155. message: '创建分组成功!',
  156. type: 'success',
  157. });
  158. emit('close');
  159. getUserGroup();
  160. })
  161. .catch((e) => console.error(e));
  162. }, 500);
  163. const debounceChange = debounce((modifyUserGroupParams) => {
  164. modifyUserGroup(modifyUserGroupParams)
  165. .then(() => {
  166. ElMessage({
  167. message: '更新分组成功!',
  168. type: 'success',
  169. });
  170. emit('close');
  171. getUserGroup();
  172. })
  173. .catch((e) => console.error(e));
  174. }, 500);
  175. const submitForm = (formEl: FormInstance | undefined) => {
  176. if (!formEl) return;
  177. formEl.validate((valid) => {
  178. if (!valid) return;
  179. const params = ref<addUserGroupParams>();
  180. params.value = {
  181. name: ruleForm.name,
  182. description: ruleForm.description,
  183. userIdList: ruleForm.userList.map((user) => user.id),
  184. total: total.value,
  185. };
  186. debounceEmit(params.value);
  187. });
  188. };
  189. const changeForm = (formEl: FormInstance | undefined) => {
  190. ElMessageBox.confirm('更新之后,引用该分组的“推送对象”将同步更新', '请确认是否更新', {
  191. confirmButtonText: '确定',
  192. cancelButtonText: '取消',
  193. type: 'warning',
  194. }).then(() => {
  195. if (!formEl) return;
  196. formEl.validate((valid) => {
  197. if (!valid) return;
  198. const params = ref<modifyUserGroupParams>();
  199. params.value = {
  200. userGroupId: props.formData.userGroupId,
  201. name: ruleForm.name,
  202. description: ruleForm.description,
  203. userIdList: ruleForm.userList.map((user) => user.id),
  204. total: total.value,
  205. };
  206. debounceChange(params.value);
  207. });
  208. });
  209. };
  210. const resetForm = (formEl: FormInstance | undefined) => {
  211. if (!formEl) return;
  212. formEl.resetFields();
  213. };
  214. const userList = ref<SelectedFilterPersonInfo[]>();
  215. const recoverForm = (formEl: FormInstance | undefined) => {
  216. if (!formEl) return;
  217. ruleForm.name = props.formData.name;
  218. ruleForm.description = props.formData.description ? props.formData.description : '';
  219. // userList.value = props.formData.userList.map((user) => ({
  220. // id: `u${user.userId}`,
  221. // userId: user.userId,
  222. // name: `${user.loginName}-${user.nickname}`,
  223. // }));
  224. userList.value = props.formData.userList.map((user) => ({
  225. id: user.userId,
  226. realname: user.realname,
  227. staffNo: user.staffNo,
  228. }));
  229. selectedUser.value = userList.value;
  230. ruleForm.userList = userList.value;
  231. total.value = props.formData.userList.length;
  232. };
  233. const props = defineProps<{
  234. drawerTitle: string;
  235. formData: FormData;
  236. }>();
  237. watch(
  238. () => ruleForm.userList,
  239. (newUserList) => {
  240. total.value = newUserList.length;
  241. const ids = newUserList.map((user) => user.id);
  242. selectedUser.value = selectedUser.value.filter((user) => ids.includes(user.id));
  243. },
  244. { immediate: true },
  245. );
  246. watch(
  247. () => props.formData,
  248. (newForm) => {
  249. ruleForm.name = newForm.name;
  250. ruleForm.description = newForm.description ? newForm.description : '';
  251. if (props.drawerTitle === '查看人员分组') {
  252. ruleForm.operator = newForm.operator;
  253. }
  254. // userList.value = newForm.userList.map((user) => ({
  255. // id: `u${user.userId}`,
  256. // userId: user.userId,
  257. // name: `${user.loginName}-${user.nickname}`,
  258. // }));
  259. userList.value = props.formData.userList.map((user) => ({
  260. id: user.id,
  261. realname: user.realname,
  262. staffNo: user.staffNo,
  263. }));
  264. selectedUser.value = userList.value;
  265. ruleForm.userList = userList.value;
  266. total.value = newForm.userList.length;
  267. },
  268. );
  269. </script>
  270. <style lang="scss" scoped>
  271. .el-form {
  272. display: flex;
  273. flex-direction: column;
  274. margin-top: 24px;
  275. gap: 20px;
  276. ::v-deep .el-select__selection {
  277. min-height: 25px;
  278. max-height: 60px;
  279. overflow-y: auto;
  280. }
  281. p {
  282. margin-top: 8px;
  283. font-weight: 400;
  284. font-size: 14px;
  285. color: rgba(0, 0, 0, 0.85);
  286. line-height: 22px;
  287. }
  288. span {
  289. font-weight: 400;
  290. font-size: 14px;
  291. color: #1890ff;
  292. line-height: 22px;
  293. }
  294. .buttons {
  295. display: flex;
  296. gap: 8px;
  297. position: absolute;
  298. bottom: 35px;
  299. right: 79px;
  300. .el-button {
  301. width: 65px;
  302. height: 32px;
  303. padding: 5px 16px 5px 16px;
  304. border-radius: 2px;
  305. }
  306. }
  307. }
  308. </style>