my_task.vue 11 KB

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