my_task.vue 8.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297
  1. <template>
  2. <div>
  3. <div class="box">
  4. <el-tabs v-model="formData.status" type="card">
  5. <el-tab-pane v-for="(item, index) in tabsOption" :key="index" :label="item.label" :name="item.name"></el-tab-pane>
  6. </el-tabs>
  7. <el-form ref="formData" :inline="true" :model="formData" label-width="80px">
  8. <el-form-item label="积分类型">
  9. <el-select v-model="formData.pt_id" clearable placeholder="请选择积分类型">
  10. <el-option v-for="item in point_type" :key="item.id" :label="item.name" :value="item.id"></el-option>
  11. </el-select>
  12. </el-form-item>
  13. <el-form-item label="排序">
  14. <el-select v-model="formData.sort" placeholder="请选择排序">
  15. <el-option v-for="item in sort" :key="item.id" :label="item.name" :value="item.code"></el-option>
  16. </el-select>
  17. </el-form-item>
  18. </el-form>
  19. <div v-if="formData.status == 'running'">
  20. <el-table :data="list" style="width: 100%" v-loading="loading" @row-click="openDetail">
  21. <el-table-column label="任务内容" prop="task_name">
  22. <template slot-scope="scope">
  23. <span class="font-flex-word" style="max-width: 200px;">{{ scope.row.task_name }}</span>
  24. </template>
  25. </el-table-column>
  26. <el-table-column label="积分">
  27. <template slot-scope="scope">
  28. <span class="red">
  29. {{ scope.row.point_config.base_point }} {{ scope.row.pt_name }}
  30. </span>
  31. <!-- <span class="red" v-if="scope.row.point_config.review_point!=0">
  32. +{{ scope.row.point_config.review_point }} {{ scope.row.pt_name }}
  33. </span>
  34. <span class="red" v-else>
  35. +{{ scope.row.point_config.base_point }} {{ scope.row.pt_name }}
  36. </span> -->
  37. </template>
  38. </el-table-column>
  39. <el-table-column label="截止时间" prop="expire_time"></el-table-column>
  40. <el-table-column label="操作" prop="owner_id">
  41. <template slot-scope="scope">
  42. <el-link type="primary" :underline="false" @click.stop="completeBtn(scope.row)">完成任务</el-link>
  43. </template>
  44. </el-table-column>
  45. <template slot="empty">
  46. <noData></noData>
  47. </template>
  48. </el-table>
  49. </div>
  50. <div v-else>
  51. <el-table :data="list" style="width: 100%" v-loading="loading" @row-click="openDetail">
  52. <el-table-column label="任务内容" prop="task_name">
  53. <template slot-scope="scope">
  54. <span class="font-flex-word" style="max-width: 200px;">{{ scope.row.task_name }}</span>
  55. </template>
  56. </el-table-column>
  57. <el-table-column label="积分">
  58. <template slot-scope="scope">
  59. <span class="red" >
  60. {{ scope.row.point_config.base_point }} {{ scope.row.pt_name }}
  61. </span>
  62. <!-- <span class="red" v-if="scope.row.point_config.review_point!=0">
  63. +{{ scope.row.point_config.review_point }} {{ scope.row.pt_name }}
  64. </span>
  65. <span class="red" v-else>
  66. +{{ scope.row.point_config.base_point }} {{ scope.row.pt_name }}
  67. </span> -->
  68. </template>
  69. </el-table-column>
  70. <el-table-column label="截止时间" prop="expire_time"></el-table-column>
  71. <el-table-column label="状态" prop="review_status">
  72. <template slot-scope="scope">
  73. <div class="yellow" v-if="scope.row.review_status == 0">待处理</div>
  74. <div class="green" v-if="scope.row.review_status ==1">已通过</div>
  75. <div class="red" v-if="scope.row.review_status == 2">已驳回</div>
  76. </template>
  77. </el-table-column>
  78. <template slot="empty">
  79. <noData></noData>
  80. </template>
  81. </el-table>
  82. </div>
  83. <center style="padding: 20px 0;">
  84. <el-pagination
  85. background
  86. @size-change="handleSizeChange"
  87. @current-change="handleCurrentChange"
  88. :page-sizes="[10, 20, 50, 100]"
  89. layout="total, sizes, prev, pager, next"
  90. :current-page="formData.page"
  91. :page-size="formData.page_size"
  92. :total="total"
  93. ></el-pagination>
  94. </center>
  95. </div>
  96. <el-drawer :custom-class="'drawer_details'" :visible.sync="completeShow" wrapperClosable :with-header="false" size="500px">
  97. <div class="details_title">完成任务</div>
  98. <div class="details_content">
  99. <el-form :model="detail_form" ref="detail_form" label-width="80px">
  100. <el-form-item label="任务备注" prop="remark" :rules="[{ required: true, message: '请填写任务备注(限20字)', trigger: 'blur' }]">
  101. <el-input v-model="detail_form.remark" type="textarea" :rows="4" maxlength="20" show-word-limit></el-input>
  102. </el-form-item>
  103. <el-form-item>
  104. <el-button @click="resetForm('detail_form')">取消</el-button>
  105. <el-button type="primary" @click="onSubmit('detail_form')">提交</el-button>
  106. </el-form-item>
  107. </el-form>
  108. </div>
  109. </el-drawer>
  110. <!-- 详情弹窗 -->
  111. <taskDetailsPopup :visible.sync="showDetailPopup" v-if="showDetailPopup" :id="detailId" :title="'任务详情'"></taskDetailsPopup>
  112. </div>
  113. </template>
  114. <script>
  115. import noData from '@/components/noData';
  116. import taskDetailsPopup from '@/views/common/taskDetailsPopup'
  117. export default {
  118. name: 'my_task',
  119. data() {
  120. return {
  121. active: 'running',
  122. tabsOption: [{ label: '待完成', name: 'running' }, { label: '待审批', name: 'complete' }, { label: '已审批', name: 'reviewed' }],
  123. list: [],
  124. loading: false,
  125. total: null,
  126. sort: [ { id: 2, code: 'publish', name: '按发布时间' },{ id: 1, code: 'expire', name: '按截止时间' }],
  127. point_type: null,
  128. detail_form: {
  129. id: '',
  130. remark: ''
  131. },
  132. formData: {
  133. status: 'running',
  134. pt_id: 0,
  135. sort: 'publish',
  136. today: '0',
  137. page: 1,
  138. page_size: 10
  139. },
  140. completeShow: false,
  141. showDetailPopup: false,
  142. detailId: null,
  143. showRepetitiveTasksPopup: false,
  144. showRewardTaskDetailsPopup: false
  145. };
  146. },
  147. components: { taskDetailsPopup, noData },
  148. watch: {
  149. 'formData.pt_id'(val) {
  150. this.get_list();
  151. },
  152. 'formData.sort'(val) {
  153. this.get_list();
  154. },
  155. 'formData.status'(val) {
  156. this.formData.page = 1;
  157. this.formData.pt_id = 0;
  158. this.formData.sort = 'publish';
  159. this.list = [];
  160. this.get_list();
  161. }
  162. },
  163. mounted() {
  164. this.get_list();
  165. this.point_type = this.getPointType();
  166. },
  167. methods: {
  168. // 点击完成
  169. completeBtn(data) {
  170. this.detail_form.id = data.id;
  171. this.completeShow = true;
  172. },
  173. //提交完成任务
  174. onSubmit(formName) {
  175. this.$refs[formName].validate(valid => {
  176. if (valid) {
  177. let self = this;
  178. let data = {
  179. work_id: self.detail_form.id,
  180. progress: '100',
  181. remark: self.detail_form.remark,
  182. state: '1'
  183. };
  184. self.$axios('post', '/api/integral/work', data).then(res => {
  185. if (res.data.code == 1) {
  186. self.$message.success(res.data.msg);
  187. self.$refs[formName].resetFields();
  188. self.completeShow = false;
  189. self.get_list();
  190. } else {
  191. self.$message.error(res.data.msg);
  192. }
  193. });
  194. }
  195. });
  196. },
  197. //重置表单
  198. resetForm(formName) {
  199. this.$refs[formName].resetFields();
  200. this.completeShow = false;
  201. },
  202. getPointType() {
  203. let point = window.plus ? JSON.parse(puls.storage.getItem('types')) : JSON.parse(localStorage.getItem('types'));
  204. // point.splice(0,1)
  205. point.unshift({ code: 'AF', id: 0, name: '全部' });
  206. return point;
  207. },
  208. // 页码变更
  209. handleCurrentChange(val) {
  210. this.formData.page = val;
  211. this.get_list();
  212. },
  213. handleSizeChange(val) {
  214. this.formData.page_size = val;
  215. this.get_list();
  216. },
  217. openDetail(row) {
  218. this.detailId = parseInt(row.id);
  219. this.showDetailPopup = true;
  220. },
  221. get_list() {
  222. let self = this;
  223. self.loading = true;
  224. let params = JSON.parse(JSON.stringify(this.formData));
  225. if (params.pt_id == 0) {
  226. delete params.pt_id;
  227. }
  228. self.$axios('get', '/api/integral/work/list', params)
  229. .then(res => {
  230. if (res.data.code == 1) {
  231. self.list = res.data.data.list;
  232. self.total = res.data.data.total;
  233. } else {
  234. self.$message.error(res.data.data.msg);
  235. }
  236. })
  237. .finally(() => {
  238. self.loading = false;
  239. });
  240. }
  241. }
  242. };
  243. </script>
  244. <style scoped lang="scss">
  245. .box {
  246. min-height: calc(100vh - 184px);
  247. min-width: 800px;
  248. background-color: #fff;
  249. padding: 20px;
  250. }
  251. ::v-deep .el-table tr:hover {
  252. cursor: pointer;
  253. }
  254. .details_content {
  255. padding: 20px;
  256. height: calc(100vh - 60px);
  257. overflow: auto;
  258. .row_title {
  259. position: relative;
  260. margin: 0 0 20px 0;
  261. padding-top: 12px;
  262. font-size: 16px;
  263. color: #303133;
  264. line-height: 22px;
  265. }
  266. .row_title:before {
  267. position: absolute;
  268. top: 0;
  269. content: ' ';
  270. width: 100%;
  271. border-top: 1px #f8f8f8 solid;
  272. }
  273. .el-row {
  274. margin-bottom: 10px;
  275. font-size: 14px;
  276. .el-col-4 {
  277. color: #606266;
  278. }
  279. }
  280. }
  281. .details_title {
  282. font-size: 18px;
  283. padding: 20px;
  284. border-bottom: 1px #efefef solid;
  285. }
  286. </style>