member.vue 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225
  1. <template>
  2. <view class="page">
  3. <view class="content">
  4. <view class="contentWrapper">
  5. <view class="title">成员管理</view>
  6. <view class="list">
  7. <uni-segmented-control :current="currentStatus" :values="status.map(item => item.label)" @clickItem="onClickItem" styleType="text" activeColor="#dd524d"></uni-segmented-control>
  8. <uni-collapse>
  9. <uni-collapse-item
  10. v-for="member in memberList"
  11. :key="member.user_id"
  12. :title="member.User.CName"
  13. >
  14. <uni-card>
  15. <view>工号:{{ member.User.UserName }}</view>
  16. <view>联系方式:{{ member.User.Mobile }}</view>
  17. <view
  18. slot="actions"
  19. class="actions"
  20. v-if="notManager(member)"
  21. @click="deleteMember(member)"
  22. >
  23. <view>移除</view>
  24. </view>
  25. </uni-card>
  26. </uni-collapse-item>
  27. </uni-collapse>
  28. <view class="add">
  29. <uni-forms
  30. label-position="top"
  31. class="form"
  32. ref="form"
  33. :modelValue="formData"
  34. :rules="rules"
  35. >
  36. <uni-forms-item label="添加成员" name="member">
  37. <uni-data-picker
  38. ref="member"
  39. class="depSelect"
  40. :localdata="depUserTree"
  41. @change="changeMember"
  42. />
  43. </uni-forms-item>
  44. </uni-forms>
  45. <button class="button" @click="onAddMember">添加</button>
  46. </view>
  47. </view>
  48. </view>
  49. </view>
  50. </view>
  51. </template>
  52. <script>
  53. import { mapState } from "vuex";
  54. import { queryMember, deleteMember, addMember } from "@/services/project";
  55. export default {
  56. data() {
  57. return {
  58. memberList: [],
  59. currentStatus: 0,
  60. formData: {
  61. member: "",
  62. },
  63. rules: {
  64. member: {
  65. rules: [{ required: true, errorMessage: "请选择成员" }],
  66. },
  67. },
  68. };
  69. },
  70. computed: {
  71. ...mapState(["currentProject", "depUserTree"]),
  72. status() {
  73. let list= [
  74. { value: 1, label: '售前' },
  75. { value: 2, label: '执行' },
  76. { value: 4, label: '研发' },
  77. { value: 5, label: '运营' },
  78. { value: 6, label: '质保' },
  79. ]
  80. return list.filter(item => this.currentProject.flow_id >= item.value)
  81. }
  82. },
  83. onLoad() {
  84. this.init();
  85. },
  86. methods: {
  87. async init() {
  88. let flowId = this.status[this.currentStatus].value
  89. let res = await queryMember({ project_code_id: this.currentProject.id, flow_id: flowId });
  90. this.memberList = res.data;
  91. },
  92. async onClickItem(e){
  93. if (this.currentStatus !== e.currentIndex) {
  94. this.currentStatus = e.currentIndex
  95. }
  96. console.log(e.currentIndex)
  97. this.init()
  98. },
  99. notManager(member) {
  100. return (
  101. member.user_id != this.currentProject.author &&
  102. member.user_id != this.currentProject.LeaderId &&
  103. member.user_id != this.currentProject.wty_manager_id &&
  104. member.user_id != this.currentProject.opt_manager_id
  105. );
  106. },
  107. deleteMember(member) {
  108. uni.showModal({
  109. title: "移除成员",
  110. content: "是否确认从项目中移除该成员",
  111. confirmText: "移除",
  112. confirmColor: "#ff7875",
  113. success: async (res) => {
  114. if (res.confirm) {
  115. let flowId = this.status[this.currentStatus].value
  116. await deleteMember({
  117. project_code_id: this.currentProject.id,
  118. user_id: member.user_id,
  119. flow_id: flowId
  120. });
  121. uni.showToast({
  122. title: "删除成功",
  123. });
  124. setTimeout(() => {
  125. uni.hideToast();
  126. this.init();
  127. }, 1800);
  128. }
  129. },
  130. });
  131. },
  132. changeMember(e) {
  133. if (e.detail.value.length > 0)
  134. this.formData.member = e.detail.value[e.detail.value.length - 1].value;
  135. else this.formData.member = "";
  136. },
  137. onAddMember() {
  138. this.$refs.form.validate(async (err) => {
  139. if (!err) {
  140. const member_id = this.formData.member.split("-")[1];
  141. let flowId = this.status[this.currentStatus].value
  142. let payload = {
  143. project_code_id: this.currentProject.id,
  144. user_id: Number(member_id),
  145. flow_id: flowId
  146. };
  147. await addMember(payload);
  148. uni.showToast({
  149. title: "添加成功",
  150. });
  151. setTimeout(() => {
  152. uni.hideToast();
  153. this.init();
  154. this.$refs.member.clear();
  155. this.formData.member = "";
  156. }, 1800);
  157. }
  158. });
  159. },
  160. },
  161. };
  162. </script>
  163. <style lang="less">
  164. .contentWrapper {
  165. display: flex;
  166. flex-wrap: wrap;
  167. }
  168. .title {
  169. width: 100%;
  170. background: url("~@/static/app-plus/menu-title-bg.png") no-repeat center;
  171. padding: 40rpx;
  172. font: 18px bold;
  173. color: #fff;
  174. }
  175. .list {
  176. margin: 0 5% 20px 5%;
  177. width: 100%;
  178. display: flex;
  179. flex-wrap: wrap;
  180. justify-content: center;
  181. }
  182. .actions {
  183. font-size: 14px;
  184. border-top: 1px solid gray;
  185. padding: 4px 10px 4px 0px;
  186. display: flex;
  187. justify-content: flex-end;
  188. }
  189. .add {
  190. width: 90%;
  191. margin-top: 20px;
  192. display: flex;
  193. flex-wrap: wrap;
  194. justify-content: flex-end;
  195. }
  196. .form {
  197. width: 100%;
  198. }
  199. .depSelect {
  200. background: #fff;
  201. }
  202. .button {
  203. width: 60px;
  204. height: 40px;
  205. font-size: 14px;
  206. background: #1890ff;
  207. color: #fff;
  208. margin: 0;
  209. }
  210. ::v-deep {
  211. .uni-collapse-item__title-text {
  212. font-size: 16px;
  213. }
  214. .segmented-control {
  215. width: 100%;
  216. }
  217. }
  218. </style>