综合办公系统
Вы не можете выбрать более 25 тем Темы должны начинаться с буквы или цифры, могут содержать дефисы(-) и должны содержать не более 35 символов.

ChoosePeople.vue 7.1KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252
  1. <template>
  2. <view class="choose-people">
  3. <view class="search-form">
  4. <view class="search-item">
  5. <text class="label">姓名:</text>
  6. <uv-input v-model="queryParams.nickName" placeholder="请输入姓名" />
  7. </view>
  8. <view class="search-item">
  9. <text class="label">部门:</text>
  10. <uni-data-select style="width:270rpx;margin-right:30rpx;" v-model="queryParams.deptId" :localdata="deptList"
  11. @change="getList" clearable />
  12. </view>
  13. <view class="search-item">
  14. <u-button type="primary" @click="getList">搜索</u-button>
  15. </view>
  16. </view>
  17. <!-- 选择人员 -->
  18. <scroll-view scroll-y class="user-list" :style="{ height: '35vh' }">
  19. <uv-checkbox-group v-model="selectedIds" iconPlacement="right" placement="column"
  20. @change="(value) => handleCheckboxChange(value)">
  21. <uv-checkbox v-for="item in userList" :label="item.nickName" :name="item.userId" :disabled="item.status == 1" />
  22. </uv-checkbox-group>
  23. </scroll-view>
  24. <view class="selected-users" v-if="multiple">
  25. <text class="label">已选人员:</text>
  26. <view class="tags">
  27. <u-tag v-for="item in chooseUser" :key="item.userId" :text="item.nickName" style="margin: 5px;" />
  28. </view>
  29. </view>
  30. <view class="selected-users" v-else>
  31. <text class="label">已选人员:</text>
  32. <u-tag v-if="chooseUser.nickName" :text="chooseUser.nickName" style="margin: 5px;" />
  33. </view>
  34. <view class="action-buttons">
  35. <u-button type="primary" @click="confirmChoose">确认选择</u-button>
  36. <u-button @click="clearChoose">清空选择</u-button>
  37. </view>
  38. </view>
  39. </template>
  40. <script>
  41. import { listUser } from "@/api/system/user";
  42. import { listDept } from "@/api/system/dept";
  43. export default {
  44. name: 'ChoosePeople',
  45. props: {
  46. deptId: {
  47. type: Number
  48. },
  49. multiple: {
  50. type: Boolean,
  51. default: true
  52. },
  53. selected: {
  54. type: Array,
  55. default: () => []
  56. }
  57. },
  58. data() {
  59. return {
  60. queryParams: {
  61. pageNum: 1,
  62. pageSize: 100,
  63. nickName: '',
  64. deptId: undefined
  65. },
  66. userList: [],
  67. deptList: [],
  68. chooseUser: this.selected,
  69. total: 0,
  70. selectedIds: [],
  71. allSelectedUsers: []
  72. }
  73. },
  74. created() {
  75. this.queryParams.deptId = this.deptId;
  76. this.getList();
  77. this.getDeptList();
  78. this.selectedIds = this.selected.map(user => user.userId);
  79. this.allSelectedUsers = [...this.selected];
  80. },
  81. methods: {
  82. getList() {
  83. listUser(this.queryParams).then(response => {
  84. this.userList = response.rows.filter(item => item.status != '1' && item.status != '2');
  85. this.total = response.total;
  86. // 更新当前页面的选中状态,保持所有已选用户
  87. this.selectedIds = this.userList
  88. .filter(item => this.allSelectedUsers.some(selected => selected.userId === item.userId))
  89. .map(item => item.userId);
  90. this.updateSelectedUsers();
  91. });
  92. },
  93. getDeptList() {
  94. listDept().then(res => {
  95. this.deptList = res.data
  96. .filter(item => item.deptName != '四川中水成勘院测绘工程有限责任公司')
  97. .map(item => ({
  98. text: item.deptName,
  99. value: item.deptId
  100. }));
  101. });
  102. },
  103. updateSelectedUsers() {
  104. // 合并当前页面选中的用户和其他页面的已选用户
  105. const currentPageUsers = this.userList.filter(item => this.selectedIds.includes(item.userId));
  106. const otherPageUsers = this.allSelectedUsers.filter(user =>
  107. !this.userList.some(item => item.userId === user.userId)
  108. );
  109. this.chooseUser = [...currentPageUsers, ...otherPageUsers];
  110. },
  111. isSelected(user) {
  112. return this.selectedIds.includes(user.userId);
  113. },
  114. confirmChoose() {
  115. this.$emit('chooseUser', this.chooseUser);
  116. },
  117. clearChoose() {
  118. this.selectedIds = [];
  119. this.allSelectedUsers = [];
  120. this.chooseUser = this.multiple ? [] : {};
  121. this.$emit('clear');
  122. },
  123. getAgeByIdCard(idCard) {
  124. if (!idCard) return '';
  125. const yearBirth = idCard.substring(6, 10);
  126. const monthBirth = idCard.substring(10, 12);
  127. const dayBirth = idCard.substring(12, 14);
  128. const now = new Date();
  129. const monthNow = now.getMonth() + 1;
  130. const dayNow = now.getDate();
  131. let age = now.getFullYear() - yearBirth;
  132. if (monthNow < monthBirth || (monthNow == monthBirth && dayNow < dayBirth)) {
  133. age--;
  134. }
  135. return age;
  136. },
  137. handleCheckboxChange(selectedNames) {
  138. if (this.multiple) {
  139. this.selectedIds = selectedNames;
  140. // 更新当前页面的选中用户
  141. const currentPageSelectedUsers = this.userList.filter(user => selectedNames.includes(user.userId));
  142. // 获取其他页面的已选用户
  143. const otherPageUsers = this.allSelectedUsers.filter(user =>
  144. !this.userList.some(item => item.userId === user.userId)
  145. );
  146. // 更新所有已选用户列表
  147. this.allSelectedUsers = [...currentPageSelectedUsers, ...otherPageUsers];
  148. this.updateSelectedUsers();
  149. } else {
  150. const lastSelectedId = selectedNames[selectedNames.length - 1];
  151. this.selectedIds = lastSelectedId ? [lastSelectedId] : [];
  152. this.allSelectedUsers = lastSelectedId ? [this.userList.find(user => user.userId === lastSelectedId)] : [];
  153. this.updateSelectedUsers();
  154. if (lastSelectedId) {
  155. this.confirmChoose();
  156. }
  157. }
  158. }
  159. }
  160. }
  161. </script>
  162. <style lang="scss" scoped>
  163. .choose-people {
  164. padding: 20rpx;
  165. .search-form {
  166. display: flex;
  167. flex-wrap: wrap;
  168. gap: 20rpx;
  169. .search-item {
  170. display: flex;
  171. align-items: center;
  172. gap: 10rpx;
  173. .label {
  174. font-size: 28rpx;
  175. color: #333;
  176. }
  177. }
  178. }
  179. .user-list {
  180. margin-bottom: 30rpx;
  181. background-color: #fff;
  182. border-radius: 12rpx;
  183. padding: 20rpx;
  184. ::v-deep .uv-checkbox {
  185. margin: 20rpx 0;
  186. padding: 20rpx;
  187. border-radius: 8rpx;
  188. background-color: #f8f8f8;
  189. transition: all 0.3s;
  190. &:active {
  191. background-color: #f0f0f0;
  192. }
  193. &.uv-checkbox--checked {
  194. background-color: #e6f7ff;
  195. border-color: #1890ff;
  196. box-shadow: 0 2rpx 8rpx rgba(24, 144, 255, 0.15);
  197. }
  198. .uv-checkbox__label {
  199. font-size: 28rpx;
  200. color: #333;
  201. }
  202. }
  203. }
  204. .pagination {
  205. display: flex;
  206. justify-content: center;
  207. margin: 20rpx 0;
  208. }
  209. .selected-users {
  210. margin: 20rpx 0;
  211. display: flex;
  212. align-items: center;
  213. flex-wrap: wrap;
  214. gap: 10rpx;
  215. .label {
  216. font-size: 28rpx;
  217. color: #333;
  218. }
  219. .tags {
  220. display: flex;
  221. flex-wrap: wrap;
  222. gap: 10rpx;
  223. }
  224. }
  225. .action-buttons {
  226. display: flex;
  227. justify-content: center;
  228. gap: 20rpx;
  229. margin-top: 30rpx;
  230. }
  231. }
  232. </style>