dialog-selectInviteUser.vue 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241
  1. <template>
  2. <dialog-base ref="baseDialog" title="请选择">
  3. <view class="userList">
  4. <uni-easyinput class="uni-mt-5" v-model="userName" placeholder="请输入协作者编号"
  5. @input="debounce(handleSearchUserName,500)"></uni-easyinput>
  6. <!-- @blur="handleBlur" -->
  7. <view class="uni-row showUser">
  8. <view v-for="(item,index) in userList">
  9. <view class="user" @click="handleClickUserName(item)">{{item.nickName}}</view>
  10. </view>
  11. </view>
  12. </view>
  13. <view class="uni-row selectedUserList">
  14. <view class="selectedUser uni-row" v-for="(item,index) in selectedUserList">
  15. <view>{{item.nickName}}</view>
  16. <view v-if="selectedUserList.length > 0" @click="handleRemoveUserName(item)">×</view>
  17. </view>
  18. </view>
  19. <view class="add-btn-container uni-row">
  20. <button type="primary" class="btn" @click="handleStart">开始</button>
  21. </view>
  22. </dialog-base>
  23. </template>
  24. <script setup>
  25. import {
  26. ref
  27. } from 'vue'
  28. import {
  29. onLoad
  30. } from '@dcloudio/uni-app'
  31. import {
  32. getUserInfo
  33. } from '@/api/login/index.js'
  34. import {
  35. saveproTem
  36. } from '@/api/business/dayWorkItem.js'
  37. import {
  38. store
  39. } from '@/store/index.js'
  40. import {
  41. timestampToTime,
  42. debounce
  43. } from '@/utils/common.js'
  44. import {
  45. getUserByLikeUsername
  46. } from '@/api/sys/user.js'
  47. const baseDialog = ref(null)
  48. const emit = defineEmits(['handleAddDayWorkItem'])
  49. const userId = ref(null)
  50. const flag = ref(false)
  51. const userName = ref(null)
  52. const userList = ref([])
  53. const selectedUserList = ref([])
  54. const itemList = ref(null)
  55. const resourceGroupList = ref([])
  56. const planDetailId = ref(null)
  57. onLoad(() => {
  58. userId.value = store.userInfo.userId || "";
  59. planDetailId.value = store.planDetails.id
  60. })
  61. function resetPage() {
  62. flag.value = false;
  63. userName.value = null;
  64. userList.value = [];
  65. selectedUserList.value = [];
  66. }
  67. function init() {
  68. baseDialog.value.open()
  69. }
  70. function open(data) {
  71. resetPage()
  72. userName.value = null;
  73. userList.value = [];
  74. itemList.value = data;
  75. init();
  76. }
  77. function close() {
  78. baseDialog.value.close()
  79. }
  80. defineExpose({
  81. open
  82. })
  83. function handleSearchUserName() {
  84. if (userName.value) {
  85. getUserByLikeUsername(userName.value).then(res => {
  86. if (res.code == 200) {
  87. userList.value = res.data;
  88. }
  89. })
  90. }
  91. }
  92. function handleClickUserName(item) {
  93. selectedUserList.value.push(item);
  94. for (let i = 0; i < selectedUserList.value.length; i++) {
  95. if (userId.value == selectedUserList.value[i].userId) {
  96. handleRemoveUserName(item)
  97. uni.showToast({
  98. icon: "none",
  99. title: "邀请报工不能选择自己"
  100. })
  101. }
  102. }
  103. userList.value = [];
  104. }
  105. function handleBlur() {
  106. setTimeout(function() {
  107. userList.value = [];
  108. }, 200)
  109. }
  110. function handleRemoveUserName(item) {
  111. selectedUserList.value.splice(selectedUserList.value.indexOf(item), 1);
  112. }
  113. function handleResourceGroupChange() {
  114. }
  115. function handleStart() {
  116. uni.showModal({
  117. title: "提示",
  118. content: "确认邀请协作者吗",
  119. success: function(res) {
  120. if (res.confirm) {
  121. if (selectedUserList.value.length == 0) {
  122. uni.showToast({
  123. icon: "none",
  124. title: "未选择协作人员"
  125. })
  126. close()
  127. } else {
  128. let inviteUserList = []
  129. let commonType = "person"
  130. for (let i = 0; i < selectedUserList.value.length; i++) {
  131. let inviteUser = {}
  132. inviteUser.tenantId = store.tenantId
  133. inviteUser.deptId = store.curDeptDetails.deptId
  134. inviteUser.commonId = selectedUserList.value[i].userId
  135. inviteUser.commonCode = selectedUserList.value[i].userName
  136. inviteUser.commonType = commonType
  137. inviteUser.commonName = selectedUserList.value[i].nickName
  138. inviteUser.protemDayworkId = store.dayworkInfo.id
  139. inviteUser.protemProcessId = itemList.value[0].processId
  140. inviteUserList.push(inviteUser)
  141. }
  142. console.log(inviteUserList)
  143. saveproTem(inviteUserList).then(res => {
  144. if (res.code == 200) {
  145. uni.showToast({
  146. icon: 'success',
  147. title: '操作成功',
  148. });
  149. close()
  150. } else {
  151. uni.showToast({
  152. icon: 'none',
  153. title: '添加失败',
  154. });
  155. }
  156. })
  157. }
  158. } else if (res.cancel) {
  159. close();
  160. }
  161. }
  162. })
  163. }
  164. </script>
  165. <style lang="scss">
  166. .dialog-body {
  167. .userList {
  168. // border: 1rpx solid #1684fc;
  169. border-radius: 8rpx;
  170. max-height: 300rpx;
  171. overflow: auto;
  172. width: 100%;
  173. margin-top: 16rpx;
  174. // padding: 16rpx;
  175. .showUser {
  176. justify-content: flex-start;
  177. flex-wrap: wrap;
  178. .user {
  179. border: 1rpx solid #999;
  180. border-radius: 8rpx;
  181. width: 150rpx;
  182. height: 50rpx;
  183. text-align: center;
  184. line-height: 50rpx;
  185. margin: 10rpx;
  186. overflow: auto;
  187. }
  188. }
  189. }
  190. .selectedUserList {
  191. width: 100%;
  192. justify-content: flex-start;
  193. flex-wrap: wrap;
  194. .selectedUser {
  195. border: 1rpx solid #999;
  196. border-radius: 8rpx;
  197. width: 150rpx;
  198. height: 50rpx;
  199. text-align: center;
  200. line-height: 50rpx;
  201. margin: 20rpx 20rpx 0 0;
  202. justify-content: space-around;
  203. }
  204. }
  205. .add-btn-container {
  206. margin-top: 32rpx;
  207. .btn {
  208. flex: 1;
  209. }
  210. }
  211. }
  212. </style>