GroupBoard.vue 10 KB

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