selectObjectNoDedup.vue 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227
  1. <template>
  2. <view class="page_body">
  3. <!-- 头部 -->
  4. <nav-bar :class="{'item_width':pageType=='edit'}" height="320" title="选择采集对象" :defaultTabBtnValue="targetType" :tabBtns="state.tabBtns" :onlyTitle="false" :showHeadSearchInput="false" :showFilterPicker="false" :showTabs="false" :showTabBtns="true" rightWidth="0rpx" @CommonFilterData="CommonFilterData" @GoBack="GoBack">
  5. <template #tabs_bottom_content>
  6. <!-- 搜索框单独一行 -->
  7. <view class="nav_head row_search_box">
  8. <uni-easyinput class="search_box" v-model="state.searchWord" trim="all" :styles="state.searchInputStyles"
  9. :placeholderStyle="state.searchInputPlaceholderStyle" placeholder="请输入关键字搜索">
  10. <template #left>
  11. <image src="@/static/image/overview/search.png" class="search_icon"></image>
  12. </template>
  13. </uni-easyinput>
  14. </view>
  15. </template>
  16. </nav-bar>
  17. <!-- https://ofreshman.github.io/uni-tree-view/guide/quick-start -->
  18. <!-- expand-on-click-node: 点击整行是否展开/收起-->
  19. <view class="tree_node">
  20. <uni-tree-view
  21. selectable
  22. multiple
  23. ref="treeRef"
  24. theme-color="#2E64FA"
  25. v-model="state.defaultCheckedKeys"
  26. :default-expand-all="true"
  27. :expand-on-click-node="true"
  28. :checked-disabled="true"
  29. :filter-value="state.searchWord"
  30. highlight-filter
  31. :data="state.treeData"
  32. @check-change="HandleCheckChange"
  33. >
  34. <template #append="{ data,node }">
  35. <!-- data 是你传入的原始数据项,可读任意业务字段 -->
  36. <text v-if="data?.children?.length" style="color:#87918b; font-size:17rpx;">
  37. <uni-icons :type="node.expanded?'down':'right'" style="font-size: 28rpx;color: #999999;"></uni-icons>
  38. </text>
  39. </template>
  40. </uni-tree-view>
  41. </view>
  42. <view class="foot_btn">
  43. <view class="btn_submit" @click="SaveCheckedTreeData">确定{{state.checkedValue.length?`(已选${state.checkedValue.length}人)`:''}}</view>
  44. </view>
  45. </view>
  46. </template>
  47. <script setup>
  48. import navBar from '@/components/navBar.vue';
  49. import {findDepartContainUser,findCollectPersonalInfo} from '@/reqApi/notification.js';
  50. import {getDeptTreeData,subjectTreeData,gradTreeData,permTreeData} from '@/common/common.js';
  51. import {onLoad} from '@dcloudio/uni-app';
  52. import {reactive,ref,onUnmounted,nextTick} from 'vue';
  53. const state = reactive({
  54. tabBtns:[{
  55. label:'按部门',
  56. value:1,
  57. },{
  58. label:'按学科',
  59. value:2,
  60. },{
  61. label:'按年级',
  62. value:3,
  63. },{
  64. label:'按权限',
  65. value:4,
  66. }],
  67. defaultCheckedKeys:[],//初始选中key
  68. checkedDisabled:[],
  69. checkedValue:[],//勾选的项
  70. treeData:[],
  71. deptTreeData:[],//部门tree
  72. gradeTreeList:[],//年级tree
  73. permissionTreeList:[],//权限tree
  74. subjectTreeList:[]//学科tree
  75. });
  76. const schoolYearId = ref('');//学年学期id
  77. const targetType = ref('');//采集对象 1-按部门,2-按学科,3-按年级,4-按权限,5-按学生
  78. const pageType = ref('');//添加或修改
  79. const treeRef = ref('');
  80. onLoad((option) => {
  81. schoolYearId.value = option.schoolYearId;
  82. targetType.value = Number(option.targetType);
  83. pageType.value = option.type;
  84. const taskTargetsTreeData = uni.getStorageSync('taskTargetsTreeData');
  85. const taskTargets = taskTargetsTreeData?.taskTargets || [];
  86. state.checkedValue = taskTargets;
  87. state.defaultCheckedKeys = taskTargets?.map(item=>item.id) || [];
  88. state.checkedDisabled = taskTargets.filter(item=>item.disabled && item.checked=='checked');
  89. if(pageType.value == 'add'){
  90. GetDepartContainUser();
  91. GetCollectPersonalInfo();
  92. }else{//编辑
  93. state.tabBtns = state.tabBtns.filter(item=>item.value == targetType.value);
  94. state.treeData = taskTargetsTreeData?.taskTargetsTree || [];
  95. }
  96. })
  97. //查询本学校下的当前学年的所有部门及部门下的人
  98. const GetDepartContainUser = () => {
  99. findDepartContainUser(schoolYearId.value).then(res=>{
  100. if(res.code == 200){
  101. const resData = res.data || [];
  102. state.deptTreeData = getDeptTreeData(resData);
  103. CurrentTreeData();
  104. }
  105. })
  106. }
  107. //查询本学校下的当前学年的所有学科、年级、权限数据及下的人
  108. const GetCollectPersonalInfo = async () => {
  109. const res = await findCollectPersonalInfo(schoolYearId.value);
  110. const { collectGradePersonVos, collectPermissionPersonVos, subjectPersonVoList } = res.data;
  111. state.gradeTreeList = gradTreeData(collectGradePersonVos);
  112. state.permissionTreeList = permTreeData(collectPermissionPersonVos);
  113. state.subjectTreeList = subjectTreeData(subjectPersonVoList);
  114. CurrentTreeData();
  115. }
  116. const CommonFilterData = (filterOptions,type) => {
  117. if(type=='tabBtns' && pageType.value == 'add'){
  118. targetType.value = filterOptions.tabBtnSelected;
  119. CurrentTreeData();
  120. }
  121. }
  122. const CurrentTreeData = () => {
  123. // 1-按部门,2-按学科,3-按年级,4-按权限,5-按学生
  124. if(targetType.value == 1){
  125. state.treeData = [...state.deptTreeData];
  126. }else if(targetType.value == 2){
  127. state.treeData = [...state.subjectTreeList];
  128. }else if(targetType.value == 3){
  129. state.treeData = state.gradeTreeList;
  130. }else if(targetType.value == 4){
  131. state.treeData = state.permissionTreeList;
  132. }else{
  133. state.treeData = [];
  134. }
  135. }
  136. //选择的值
  137. const HandleCheckChange = ({keys,node,nodes,value}) => {
  138. // 不可取消的节点 key 列表
  139. const lockedKeys = state.checkedDisabled.map(el=>el.id)
  140. const merged = [...new Set([...keys, ...lockedKeys])];//去重
  141. state.defaultCheckedKeys = merged;
  142. const nodesList = nodes.filter(item => item.isLeaf).map(el => ({ ...el.source }));
  143. //去重
  144. state.checkedValue = [...new Map([...nodesList, ...state.checkedDisabled].map(item => [item.id, item])).values()];
  145. }
  146. //保存选择值
  147. const SaveCheckedTreeData = () => {
  148. if(state.checkedValue.length == 0){
  149. uni.showToast({
  150. title: '请选择采集对象!',
  151. icon: 'none'
  152. })
  153. return false
  154. }
  155. uni.setStorageSync('taskTargetsTreeData',{
  156. targetType:targetType.value,
  157. taskTargets:state.checkedValue//采集对象
  158. });//返回上一页并传值
  159. GoBack()
  160. }
  161. //返回
  162. const GoBack = () => {
  163. uni.navigateBack({
  164. delta: 1
  165. });
  166. }
  167. </script>
  168. <style scoped lang="scss">
  169. :deep(.item_width){
  170. .scroll_tab_btn{
  171. .tab_item{
  172. width: 122rpx;
  173. flex: 0;
  174. }
  175. }
  176. }
  177. :deep(.scroll_tab_btn){
  178. margin-top: 24rpx;
  179. .tab_item{
  180. &.selected{
  181. background-color: #2E64FA;
  182. color: #FFFFFF;
  183. }
  184. }
  185. }
  186. .page_body{
  187. display: flex;
  188. flex-direction: column;
  189. height: 100%;
  190. min-width: auto;
  191. .row_search_box{
  192. height: 96rpx;
  193. align-items: flex-start;
  194. }
  195. .tree_node{
  196. display: flex;
  197. width: 100%;
  198. padding: 0 24rpx;
  199. box-sizing: border-box;
  200. flex:1;
  201. overflow: auto;
  202. :deep(.utv-tree-item__arrow-icon){
  203. display: none;
  204. }
  205. }
  206. .foot_btn{
  207. width: 100%;
  208. padding: 40rpx 24rpx;
  209. flex-shrink: 0;
  210. box-sizing: border-box;
  211. .btn_submit{
  212. background-color: #2E64FA;
  213. border-radius: 8rpx;
  214. width: 100%;
  215. height: 90rpx;
  216. font-weight: 500;
  217. font-size: 28rpx;
  218. color: #FFFFFF;
  219. display: flex;
  220. align-items: center;
  221. justify-content: center;
  222. }
  223. }
  224. }
  225. </style>