my_task.vue 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377
  1. <template>
  2. <div>
  3. <div class="box">
  4. <el-tabs v-model="formData.status">
  5. <el-tab-pane :disabled="loading" 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-item style="float: right;">
  19. <el-input v-model="formData.content" placeholder="请输入任务内容" max="200" @keyup.enter.native="getContent()" class="persons_name">
  20. <el-button slot="append" icon="el-icon-search" @click="getContent()"></el-button>
  21. </el-input>
  22. </el-form-item>
  23. </el-form>
  24. <div v-if="formData.status == 'running'">
  25. <el-table :data="list" style="width: 100%" v-loading="loading" @row-click="openDetail">
  26. <el-table-column label="任务内容" prop="task_name">
  27. <template slot-scope="scope">
  28. <span class="font-flex-word" style="max-width: 200px;">{{ scope.row.task_name }}</span>
  29. </template>
  30. </el-table-column>
  31. <el-table-column label="积分">
  32. <template slot-scope="scope">
  33. <span class="red" v-if="scope.row.point_config.base_point > 0">
  34. +{{ scope.row.point_config.base_point }} {{ scope.row.pt_name }}
  35. </span>
  36. <span class="green" v-else>
  37. {{ scope.row.point_config.base_point }} {{ scope.row.pt_name }}
  38. </span>
  39. </template>
  40. </el-table-column>
  41. <el-table-column label="截止时间" prop="expire_time"></el-table-column>
  42. <el-table-column label="审批人" prop="reviewer_name"></el-table-column>
  43. <el-table-column label="操作" prop="owner_id">
  44. <template slot-scope="scope">
  45. <el-link type="primary" :underline="false" @click.stop="completeBtn(scope.row)">完成任务</el-link>
  46. </template>
  47. </el-table-column>
  48. <template slot="empty">
  49. <noData></noData>
  50. </template>
  51. </el-table>
  52. </div>
  53. <div v-else>
  54. <el-table :data="list" style="width: 100%" v-loading="loading" @row-click="openDetail">
  55. <el-table-column label="任务内容" prop="task_name">
  56. <template slot-scope="scope">
  57. <span class="font-flex-word" style="max-width: 200px;">{{ scope.row.task_name }}</span>
  58. </template>
  59. </el-table-column>
  60. <el-table-column label="积分">
  61. <template slot-scope="scope">
  62. <span class="red" v-if="scope.row.point_config.base_point > 0">
  63. +{{ scope.row.point_config.base_point }} {{ scope.row.pt_name }}
  64. </span>
  65. <span class="green" 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="reviewer_name"></el-table-column>
  72. <el-table-column label="状态" prop="review_status">
  73. <template slot-scope="scope">
  74. <div class="orange" v-if="scope.row.review_status == 0">待处理</div>
  75. <div class="green" v-if="scope.row.review_status ==1">已通过</div>
  76. <div class="red" v-if="scope.row.review_status == 2">已驳回</div>
  77. </template>
  78. </el-table-column>
  79. <template slot="empty">
  80. <noData></noData>
  81. </template>
  82. </el-table>
  83. </div>
  84. <center style="padding: 20px 0;">
  85. <el-pagination
  86. background
  87. @size-change="handleSizeChange"
  88. @current-change="handleCurrentChange"
  89. :page-sizes="[10, 20, 50, 100]"
  90. layout="total, sizes, prev, pager, next"
  91. :current-page="formData.page"
  92. :page-size="formData.page_size"
  93. :total="total"
  94. ></el-pagination>
  95. </center>
  96. </div>
  97. <el-drawer :custom-class="'drawer_details'" :visible.sync="completeShow" wrapperClosable :with-header="false" size="500px">
  98. <div class="details_title">完成任务</div>
  99. <div class="details_content">
  100. <el-form :model="detail_form" ref="detail_form" label-width="80px">
  101. <el-form-item label="任务备注" prop="remark" :rules="[{ required: true, message: '请填写任务备注(限200字)', trigger: 'blur' }]">
  102. <el-input v-model="detail_form.remark" type="textarea" :rows="4" maxlength="200" show-word-limit></el-input>
  103. </el-form-item>
  104. <el-form-item label="图片">
  105. <upload
  106. :headers="Xtoken"
  107. class="avatar-uploader"
  108. :action="'https://' + 'integralsys.oss-cn-shenzhen.aliyuncs.com'"
  109. :show-file-list="true"
  110. :file-list="detail_form.fileList"
  111. :on-success="handleFilesSuccess"
  112. :on-preview="onFilePreView"
  113. :before-upload="beforeUpload"
  114. :on-remove="onFileRemove"
  115. :limit="3"
  116. accept="image/jpeg,image/png"
  117. :multiple="true"
  118. ref="clearPicture"
  119. >
  120. <el-button size="small" type="primary">点击上传</el-button>
  121. (最多选择3张)
  122. </upload>
  123. </el-form-item>
  124. <el-form-item>
  125. <el-button @click="resetForm('detail_form')">取消</el-button>
  126. <el-button type="primary" @click="onSubmit('detail_form')">提交</el-button>
  127. </el-form-item>
  128. </el-form>
  129. </div>
  130. </el-drawer>
  131. <!-- 详情弹窗 -->
  132. <taskDetailsPopup :visible.sync="showDetailPopup" v-if="showDetailPopup" :id="detailId" :title="'任务详情'"></taskDetailsPopup>
  133. </div>
  134. </template>
  135. <script>
  136. import taskDetailsPopup from '@/views/common/taskDetailsPopup'
  137. import upload from '@/components/upload';
  138. export default {
  139. name: 'my_task',
  140. data() {
  141. return {
  142. //图片附件
  143. Xtoken: { 'X-Token': this.$getToken() },
  144. active: 'running',
  145. tabsOption: [{ label: '待完成', name: 'running' }, { label: '待审批', name: 'complete' }, { label: '已审批', name: 'reviewed' }],
  146. list: [],
  147. loading: false,
  148. total: null,
  149. sort: [ { id: 2, code: 'publish', name: '按发布时间' },{ id: 1, code: 'expire', name: '按截止时间' }],
  150. point_type: null,
  151. detail_form: {
  152. id: '',
  153. remark: '',
  154. fileList: [],
  155. files: [],
  156. },
  157. formData: {
  158. status: 'running',
  159. pt_id: 0,
  160. sort: 'publish',
  161. today: '0',
  162. page: 1,
  163. page_size: 10,
  164. content: '',
  165. },
  166. completeShow: false,
  167. showDetailPopup: false,
  168. detailId: null,
  169. showRepetitiveTasksPopup: false,
  170. showRewardTaskDetailsPopup: false
  171. };
  172. },
  173. components: { taskDetailsPopup, upload },
  174. watch: {
  175. 'formData.pt_id'(val) {
  176. this.formData.page = 1
  177. this.list = []
  178. this.get_list();
  179. },
  180. 'formData.sort'(val) {
  181. this.formData.page = 1
  182. this.list = []
  183. this.get_list();
  184. },
  185. 'formData.status'(val) {
  186. this.formData.content = '';
  187. this.formData.page = 1;
  188. this.formData.pt_id = 0;
  189. this.formData.sort = 'publish';
  190. this.list = [];
  191. this.get_list();
  192. }
  193. },
  194. mounted() {
  195. this.get_list();
  196. this.point_type = this.getPointType();
  197. },
  198. methods: {
  199. getContent(){
  200. this.formData.page = 1
  201. this.list = []
  202. this.get_list()
  203. },
  204. handleFilesSuccess(response, file, fileList) {
  205. let fileListData=fileList.filter(e=>{
  206. return e.url
  207. })
  208. this.fileFun(file, fileList)
  209. },
  210. onFilePreView(file) {
  211. if (file.response) {
  212. window.open(file.response.url, '_blank');
  213. }
  214. },
  215. onFileRemove(file, fileList) {
  216. this.fileFun(file, fileList)
  217. },
  218. fileFun(file, fileList){
  219. this.detail_form.fileList = fileList;
  220. this.detail_form.files = []
  221. fileList.forEach((item, index) => {
  222. this.detail_form.files.push(item.url);
  223. });
  224. },
  225. // 附件上传
  226. beforeUpload(file) {
  227. const isJPG = /^image\/(jpeg|png|jpg)$/.test(file.type);
  228. const isLt2M = file.size / 1024 / 1024 < 5;
  229. if (!isJPG) {
  230. this.$message.error('上传图片只能是 JPEG,PNG,JPG 格式!');
  231. }
  232. if (!isLt2M) {
  233. this.$message.error('上传图片大小不能超过 5MB!');
  234. }
  235. return isJPG && isLt2M;
  236. },
  237. // 点击完成
  238. completeBtn(data) {
  239. this.detail_form.id = data.id;
  240. this.completeShow = true;
  241. },
  242. //提交完成任务
  243. onSubmit(formName) {
  244. this.$refs[formName].validate(valid => {
  245. if (valid) {
  246. let self = this;
  247. let data = {
  248. work_id: self.detail_form.id,
  249. progress: '100',
  250. remark: self.detail_form.remark,
  251. state: '1',
  252. files: this.detail_form.files
  253. };
  254. self.$axios('post', '/api/integral/work', data).then(res => {
  255. if (res.data.code == 1) {
  256. self.$message.success(res.data.msg);
  257. self.$refs[formName].resetFields();
  258. self.completeShow = false;
  259. self.detail_form.fileList = []
  260. self.detail_form.files = []
  261. self.get_list();
  262. } else {
  263. self.$message.error(res.data.msg);
  264. }
  265. });
  266. }
  267. });
  268. },
  269. //重置表单
  270. resetForm(formName) {
  271. this.$refs[formName].resetFields();
  272. this.completeShow = false;
  273. this.detail_form.fileList = []
  274. this.detail_form.files = []
  275. },
  276. getPointType() {
  277. let point = this.$getCache('types');
  278. point.unshift({ code: 'AF', id: 0, name: '全部' });
  279. return point;
  280. },
  281. // 页码变更
  282. handleCurrentChange(val) {
  283. this.formData.page = val;
  284. this.get_list();
  285. },
  286. handleSizeChange(val) {
  287. this.formData.page_size = val;
  288. this.get_list();
  289. },
  290. openDetail(row) {
  291. this.detailId = parseInt(row.id);
  292. this.showDetailPopup = true;
  293. },
  294. get_list() {
  295. let self = this;
  296. self.loading = true;
  297. let params = JSON.parse(JSON.stringify(this.formData));
  298. if (params.pt_id == 0) {
  299. delete params.pt_id;
  300. }
  301. self.$axios('get', '/api/integral/work/list', params)
  302. .then(res => {
  303. if (res.data.code == 1) {
  304. self.list = res.data.data.list;
  305. self.total = res.data.data.total;
  306. } else {
  307. self.$message.error(res.data.data.msg);
  308. }
  309. })
  310. .finally(() => {
  311. self.loading = false;
  312. });
  313. }
  314. }
  315. };
  316. </script>
  317. <style scoped lang="scss">
  318. .box {
  319. min-height: calc(100vh - 184px);
  320. min-width: 800px;
  321. background-color: #fff;
  322. padding: 20px;
  323. }
  324. ::v-deep .el-table tr:hover {
  325. cursor: pointer;
  326. }
  327. .details_content {
  328. padding: 20px;
  329. height: calc(100vh - 60px);
  330. overflow: auto;
  331. .row_title {
  332. position: relative;
  333. margin: 0 0 20px 0;
  334. padding-top: 12px;
  335. font-size: 16px;
  336. color: #303133;
  337. line-height: 22px;
  338. }
  339. .row_title:before {
  340. position: absolute;
  341. top: 0;
  342. content: ' ';
  343. width: 100%;
  344. border-top: 1px #f8f8f8 solid;
  345. }
  346. .el-row {
  347. margin-bottom: 10px;
  348. font-size: 14px;
  349. .el-col-4 {
  350. color: #606266;
  351. }
  352. }
  353. }
  354. .details_title {
  355. font-size: 18px;
  356. padding: 20px;
  357. border-bottom: 1px #efefef solid;
  358. }
  359. </style>