PushObject.vue 8.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319
  1. <template>
  2. <el-form :model="ruleForm" ref="ruleFormRef">
  3. <el-form-item
  4. label="推送对象"
  5. prop="recipientType"
  6. :rules="[{ required: true, message: '请选择推送对象' }]"
  7. >
  8. <el-radio-group v-model="ruleForm.recipientType" :disabled="disabled">
  9. <el-radio
  10. v-for="item in recipientTypeName"
  11. :key="item.value"
  12. :value="item.value"
  13. :label="item.label"
  14. />
  15. </el-radio-group>
  16. </el-form-item>
  17. <div class="userGroupList" v-if="ruleForm.recipientType === 2">
  18. <el-form-item
  19. label="选择分组"
  20. prop="userGroupList"
  21. :rules="[{ required: true, message: '请选择分组' }]"
  22. >
  23. <el-select
  24. v-model="ruleForm.userGroupList"
  25. multiple
  26. placeholder="请选择分组"
  27. style="width: 300px"
  28. :disabled="disabled"
  29. >
  30. <el-option
  31. v-for="item in options"
  32. :key="item.userGroupId"
  33. :value="item.userGroupId"
  34. :label="item.name"
  35. />
  36. </el-select>
  37. </el-form-item>
  38. <span
  39. v-if="ruleForm.userGroupList.length > 0"
  40. @click="queryGroupInfo(ruleForm.userGroupList)"
  41. >
  42. 人员详情
  43. </span>
  44. </div>
  45. <div class="customUserList" v-if="ruleForm.recipientType === 3">
  46. <el-form-item
  47. label="选择人员"
  48. prop="customUserList"
  49. :rules="[{ required: true, message: '请选择人员' }]"
  50. >
  51. <el-select
  52. v-model="ruleForm.customUserList"
  53. value-key="id"
  54. multiple
  55. placeholder="请选择人员"
  56. style="width: 300px"
  57. @click="userInfo = true"
  58. :disabled="disabled"
  59. >
  60. <el-option v-for="user in selectedUser" :key="user.id" :label="user.name" :value="user">
  61. </el-option>
  62. </el-select>
  63. </el-form-item>
  64. </div>
  65. </el-form>
  66. <el-dialog
  67. v-model="groupInfo"
  68. title="人员详情"
  69. align-center
  70. :close-on-click-modal="false"
  71. style="height: 583px"
  72. :width="731"
  73. :destroy-on-close="true"
  74. class="groupInfo"
  75. >
  76. <div class="group" v-for="group in userGroupInfo" :key="group.userGroupId">
  77. <div class="group-name">
  78. <span
  79. style="font-weight: 400; font-size: 16px; color: rgba(0, 0, 0, 0.88); line-height: 22px"
  80. >
  81. {{ group.name }}
  82. </span>
  83. <span
  84. style="
  85. margin-left: 4px;
  86. font-weight: 400;
  87. font-size: 12px;
  88. color: rgba(0, 0, 0, 0.88);
  89. line-height: 17px;
  90. "
  91. >
  92. <span style="color: #1777ff">{{ group.total }}</span>
  93. </span>
  94. <div
  95. class="user-info"
  96. :class="{ expanded: group.isExpand }"
  97. :style="
  98. !group.isExpand
  99. ? 'max-height:86px;overflow-y:hidden;'
  100. : 'max-height:100%;overflow-y:auto'
  101. "
  102. style="display: flex"
  103. >
  104. <div
  105. class="left"
  106. style="display: flex; gap: 10px; margin-top: 20px; flex-wrap: wrap; flex: 1"
  107. >
  108. <el-tag type="primary" v-for="user in group.userList" :key="user.userId">
  109. {{ user.loginName }}-{{ user.nickname }}
  110. </el-tag>
  111. </div>
  112. <div class="right" style="width: 50px; margin-top: 20px">
  113. <span
  114. @click="toggleExpand(group)"
  115. style="display: flex; cursor: pointer; align-items: center"
  116. >
  117. {{ group.isExpand ? '收起' : '展开' }}
  118. <img v-if="group.isExpand" src="@/assets/icons/arrow_top.png" />
  119. <img v-else src="@/assets/icons/arrow_bottom.png" />
  120. </span>
  121. </div>
  122. </div>
  123. </div>
  124. </div>
  125. </el-dialog>
  126. <el-dialog
  127. v-model="userInfo"
  128. class="userInfo"
  129. title="添加组内成员"
  130. align-center
  131. :close-on-click-modal="false"
  132. style="height: 583px"
  133. :width="731"
  134. :destroy-on-close="true"
  135. >
  136. <SelectTree @cancel="handleCancle" @submit="handleSubmit" :selectedUser="selectedUser" />
  137. </el-dialog>
  138. </template>
  139. <script setup lang="ts">
  140. import { onMounted, ref, reactive, watch, watchEffect } from 'vue';
  141. import SelectTree from '../persongroup/components/SelectTree.vue';
  142. import { recipientTypeName } from '../constant';
  143. import { ToPushObjectqueryUserGroupList, queryUserGroupDetail } from '../api/index';
  144. import type { FormInstance } from 'element-plus';
  145. import { GroupData } from '../persongroup/type';
  146. const ruleFormRef = ref<FormInstance>();
  147. const groupInfo = ref<boolean>(false);
  148. const userInfo = ref<boolean>(false);
  149. const disabled = ref<boolean>(false);
  150. interface customUserList {
  151. userId: number;
  152. userLoginName: string;
  153. userNickname: string;
  154. userNumber: string;
  155. }
  156. interface userGroupVOList {
  157. userGroupId: number;
  158. total: number;
  159. operatorName: string;
  160. operationTime: string;
  161. name: string;
  162. description: string;
  163. }
  164. interface UserList {
  165. id: string;
  166. name: string;
  167. userId: number;
  168. }
  169. const selectedUser = ref<UserList[]>([]);
  170. interface RuleForm {
  171. recipientType?: number;
  172. userGroupList: number[];
  173. customUserList: UserList[];
  174. }
  175. const ruleForm = reactive<RuleForm>({
  176. userGroupList: [],
  177. customUserList: [],
  178. });
  179. const props = defineProps<{
  180. recipientType?: number;
  181. userGroupList?: userGroupVOList[];
  182. customUserList?: customUserList[];
  183. disabled?: boolean;
  184. }>();
  185. interface Options {
  186. userGroupId?: number;
  187. name?: string;
  188. description: string;
  189. total: number;
  190. operatorName: string;
  191. operationTime: string;
  192. }
  193. const options = ref<Options[]>([]);
  194. const userGroupInfo = ref<GroupData[]>();
  195. const queryGroupInfo = (groupList) => {
  196. groupInfo.value = true;
  197. queryUserGroupDetail(groupList).then((res) => {
  198. userGroupInfo.value = res.map((group) => ({
  199. ...group,
  200. isExpand: false,
  201. }));
  202. });
  203. };
  204. const submitForm = () => {
  205. return ruleFormRef.value!.validate(() => {});
  206. };
  207. const getChildValue = () => {
  208. return {
  209. recipientType: ruleForm.recipientType,
  210. userGroupList:
  211. ruleForm.recipientType === 3
  212. ? []
  213. : ruleForm.recipientType === 1
  214. ? []
  215. : ruleForm.userGroupList.map((item) => item),
  216. customUserList:
  217. ruleForm.recipientType === 2
  218. ? []
  219. : ruleForm.recipientType === 1
  220. ? []
  221. : ruleForm.customUserList.map((item) => item.userId),
  222. };
  223. };
  224. const toggleExpand = (group) => {
  225. group.isExpand = !group.isExpand;
  226. };
  227. const handleCancle = () => {
  228. userInfo.value = false;
  229. };
  230. const handleSubmit = (selectedData: UserList[]) => {
  231. selectedUser.value = selectedData;
  232. ruleForm.customUserList = selectedUser.value;
  233. userInfo.value = false;
  234. };
  235. const formatCustomUserList = (customList: customUserList[]): UserList[] => {
  236. return customList.map((item) => ({
  237. id: `u${item.userId}`,
  238. userId: item.userId,
  239. name: `${item.userLoginName}-${item.userNickname}`,
  240. }));
  241. };
  242. defineExpose({
  243. submitForm,
  244. getChildValue,
  245. });
  246. onMounted(() => {
  247. ToPushObjectqueryUserGroupList().then((res) => {
  248. options.value = res.groupVOList;
  249. });
  250. });
  251. watchEffect(() => {
  252. if (props.recipientType) {
  253. ruleForm.recipientType = props.recipientType;
  254. }
  255. if (props.userGroupList) {
  256. ruleForm.userGroupList = props.userGroupList.map((item) => item.userGroupId);
  257. }
  258. if (props.customUserList) {
  259. ruleForm.customUserList = formatCustomUserList(props.customUserList);
  260. selectedUser.value = formatCustomUserList(props.customUserList);
  261. }
  262. if (props.disabled) {
  263. disabled.value = props.disabled;
  264. }
  265. });
  266. watch(
  267. () => ruleForm.customUserList,
  268. (newSelected) => {
  269. selectedUser.value = newSelected;
  270. },
  271. { immediate: true },
  272. );
  273. </script>
  274. <style lang="scss" scoped>
  275. .userGroupList {
  276. margin-left: 12%;
  277. width: 88%;
  278. max-height: 120px;
  279. padding: 12px 17px 12px 12px;
  280. background: #fafafa;
  281. border-radius: 4px;
  282. :deep(.el-form-item) {
  283. margin-bottom: 12px !important;
  284. }
  285. ::v-deep .el-select__selection {
  286. min-height: 25px;
  287. max-height: 60px;
  288. overflow-y: auto;
  289. }
  290. span {
  291. cursor: pointer;
  292. margin-left: 80px;
  293. font-weight: 400;
  294. font-size: 10px;
  295. color: #1777ff;
  296. line-height: 14px;
  297. }
  298. }
  299. .customUserList {
  300. margin-left: 12%;
  301. width: 88%;
  302. max-height: 120px;
  303. padding: 12px 17px 12px 12px;
  304. background: #fafafa;
  305. border-radius: 4px;
  306. :deep(.el-form-item) {
  307. margin-bottom: 12px !important;
  308. }
  309. ::v-deep .el-select__selection {
  310. min-height: 25px;
  311. max-height: 60px;
  312. overflow-y: auto;
  313. }
  314. }
  315. </style>