my_task.vue 11 KB

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