my_task.vue 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410
  1. <template>
  2. <div class="my_task_box">
  3. <van-nav-bar :title="title" left-text="返回" @click-left="$route_back" left-arrow></van-nav-bar>
  4. <TabsList
  5. ref="tabsList"
  6. :tabsOption="tabsOption"
  7. @onRefresh="onRefresh"
  8. @onInfinite="onInfinite"
  9. @onTabChange="onTabChange"
  10. @onConfirm="onConfirm"
  11. @onCancel="onCancel"
  12. enablePullUpRefresh
  13. :isSameContent="true">
  14. <div slot="filter" style="background: #fff;padding:0.32rem; padding-top: 0;">
  15. <div class="" v-for="(item,index) in screen_list" :key="index">
  16. <p>{{item.title}}</p>
  17. <div class="selected_list">
  18. <span v-for="(d,i) in item.list" :key="i" @click="onselect(item,d)" :class="{selected: filter[item.mapping] === d.id}">{{d.name}}</span>
  19. </div>
  20. </div>
  21. </div>
  22. <div slot="content">
  23. <div v-if="filter.status == 'running'">
  24. <div style="background-color:#f5f7fa;padding: 0.02rem 0.32rem;border-radius: 5px;border: 0.24rem solid #f5f7fa;" class="flex-box-ce">
  25. <span class="flex-1 tab-item" @click="activeNames=item.index" :class="item.index==activeNames? 'tab-item-active':''" v-for="(item,index) in tabs" :key="index">{{item.name}}</span>
  26. </div>
  27. <template v-if="activeNames=='1'">
  28. <van-cell-group v-for="(item,index) in list " :key="index" @click="detail(item)">
  29. <van-cell class="task_list" :title="item.task_name">
  30. <template slot="default">
  31. <template v-if="item.status == 4">
  32. <span class="point red" v-if="item.point_config.review_point> 0">+{{item.point_config.review_point}}{{item.pt_name}}</span>
  33. <span class="point green" v-if="item.point_config.review_point< 0">{{item.point_config.review_point}}{{item.pt_name}}</span>
  34. </template>
  35. <template v-else>
  36. <span class="point red" v-if="item.point_config.base_point> 0">+{{item.point_config.base_point}}{{item.pt_name}}</span>
  37. <span class="point green" v-if="item.point_config.base_point< 0">{{item.point_config.base_point}}{{item.pt_name}}</span>
  38. </template>
  39. </template>
  40. <template slot="label">
  41. <div class="clear" style="margin-top: 0.3rem">
  42. <span class="date red">{{item.expire_time}}截止</span>
  43. <van-button class="fr complete_task" v-show="item.status == 1" type="info" @click.stop="complete_task(item)" size="small">完成任务</van-button>
  44. <span class="fr orange bg" v-show="item.status == 2">待审批</span>
  45. <span class="fr red bg" v-show="item.review_status == 2">审批驳回</span>
  46. <span class="fr green bg" v-show="item.review_status == 1">审批通过</span>
  47. </div>
  48. </template>
  49. </van-cell>
  50. </van-cell-group>
  51. <div v-if="list.length == 0" style="background: #fff;color: #909399;font-size: 14px;margin: 0;text-align: center;padding: 0.5rem 0;">
  52. <img src="static/images/new_noData.png" style="width: 40%;" alt="" />
  53. <p>今日没有待完成任务哦</p>
  54. </div>
  55. </template>
  56. <template v-if="activeNames=='2'">
  57. <van-cell-group v-for="(item,index) in list " :key="index" @click="detail(item)">
  58. <van-cell class="task_list" :title="item.task_name">
  59. <template slot="default">
  60. <template v-if="item.status == 4">
  61. <span class="point red" v-if="item.point_config.review_point> 0">+{{item.point_config.review_point}}{{item.pt_name}}</span>
  62. <span class="point green" v-if="item.point_config.review_point< 0">{{item.point_config.review_point}}{{item.pt_name}}</span>
  63. </template>
  64. <template v-else>
  65. <span class="point red" v-if="item.point_config.base_point> 0">+{{item.point_config.base_point}}{{item.pt_name}}</span>
  66. <span class="point green" v-if="item.point_config.base_point< 0">{{item.point_config.base_point}}{{item.pt_name}}</span>
  67. </template>
  68. </template>
  69. <template slot="label">
  70. <div class="clear" style="margin-top: 0.3rem">
  71. <span class="date fontColorC" >{{item.expire_time}}截止</span>
  72. <van-button class="fr complete_task" v-show="item.status == 1" type="info" @click.stop="complete_task(item)" size="small">完成任务</van-button>
  73. <span class="fr orange bg" v-show="item.status == 2">待审批</span>
  74. <span class="fr red bg" v-show="item.review_status == 2">审批驳回</span>
  75. <span class="fr green bg" v-show="item.review_status == 1">审批通过</span>
  76. </div>
  77. </template>
  78. </van-cell>
  79. </van-cell-group>
  80. <div v-if="list.length == 0" style="background: #fff;color: #909399;font-size: 14px;margin: 0;text-align: center;padding: 0.5rem 0;">
  81. <img src="static/images/new_noData.png" style="width: 40%;" alt="" />
  82. <p>没有逾期任务哦</p>
  83. </div>
  84. </template>
  85. <template v-if="activeNames=='3'">
  86. <van-cell-group v-for="(item,index) in list " :key="index" @click="detail(item)">
  87. <van-cell v-if="date != item.expire_time.slice(0,10)" class="task_list" :title="item.task_name">
  88. <template slot="default">
  89. <template v-if="item.status == 4">
  90. <span class="point red" v-if="item.point_config.review_point> 0">+{{item.point_config.review_point}}{{item.pt_name}}</span>
  91. <span class="point green" v-if="item.point_config.review_point< 0">{{item.point_config.review_point}}{{item.pt_name}}</span>
  92. </template>
  93. <template v-else>
  94. <span class="point red" v-if="item.point_config.base_point> 0">+{{item.point_config.base_point}}{{item.pt_name}}</span>
  95. <span class="point green" v-if="item.point_config.base_point< 0">{{item.point_config.base_point}}{{item.pt_name}}</span>
  96. </template>
  97. </template>
  98. <template slot="label">
  99. <div class="clear" style="margin-top: 0.3rem">
  100. <span class="date" :class="item.expire_time_color?'red':'fontColorC'" >{{item.expire_time}}截止</span>
  101. <van-button class="fr complete_task" v-show="item.status == 1" type="info" @click.stop="complete_task(item)" size="small">完成任务</van-button>
  102. <span class="fr orange bg" v-show="item.status == 2">待审批</span>
  103. <span class="fr red bg" v-show="item.status == 3">审批驳回</span>
  104. <span class="fr green bg" v-show="item.status == 4">审批通过</span>
  105. </div>
  106. </template>
  107. </van-cell>
  108. </van-cell-group>
  109. <div v-if="list.length == 0" style="background: #fff;color: #909399;font-size: 14px;margin: 0;text-align: center;padding: 0.5rem 0;">
  110. <img src="static/images/new_noData.png" style="width: 40%;" alt="" />
  111. <p>没有其他待完成任务哦</p>
  112. </div>
  113. </template>
  114. </div>
  115. <van-cell-group v-if="filter.status != 'running'">
  116. <van-cell v-for="(item,index) in list " :key="index" @click="detail(item)" class="task_list" :title="item.task_name">
  117. <template slot="default">
  118. <template v-if="item.status == 4">
  119. <span class="point red" v-if="item.point_config.review_point> 0">+{{item.point_config.review_point}}{{item.pt_name}}</span>
  120. <span class="point green" v-if="item.point_config.review_point< 0">{{item.point_config.review_point}}{{item.pt_name}}</span>
  121. </template>
  122. <template v-else>
  123. <span class="point red" v-if="item.point_config.base_point> 0">+{{item.point_config.base_point}}{{item.pt_name}}</span>
  124. <span class="point green" v-if="item.point_config.base_point< 0">{{item.point_config.base_point}}{{item.pt_name}}</span>
  125. </template>
  126. </template>
  127. <template slot="label">
  128. <div class="clear" style="margin-top: 0.3rem">
  129. <span class="date fontColorC" >{{item.expire_time}}截止</span>
  130. <van-button class="fr complete_task" v-show="item.status == 1" type="info" @click.stop="complete_task(item)" size="small">完成任务</van-button>
  131. <span class="fr orange bg" v-show="item.review_status == 0">待处理</span>
  132. <span class="fr green bg" v-show="item.review_status == 1">已通过</span>
  133. <span class="fr red bg" v-show="item.review_status == 2">已拒绝</span>
  134. </div>
  135. </template>
  136. </van-cell>
  137. <noData style="position: absolute;top: 50vh;margin-top: -3rem;background-color:rgb(245, 245, 245);" :list='list' />
  138. </van-cell-group>
  139. </div>
  140. </TabsList>
  141. </div>
  142. </template>
  143. <script>
  144. import TabsList from '@/components/TabsList'
  145. import Vue from 'vue'
  146. import {Tab, Tabs, DropdownMenu, DropdownItem,Collapse, CollapseItem } from 'vant'
  147. import moment from 'moment'
  148. Vue.use(Tab).use(Tabs).use(DropdownMenu).use(DropdownItem).use(Collapse).use(CollapseItem)
  149. export default {
  150. components: {TabsList},
  151. // 数据
  152. data () {
  153. return {
  154. tabs:[
  155. {name:'逾期任务',index:'2',num:0},
  156. {name:'今日任务',index:'1',num:0},
  157. {name:'其他任务',index:'3',num:0}
  158. ],
  159. moment,
  160. page:1,
  161. yqList:[],//逾期任务
  162. yqTotal:0,
  163. toList: [], // 放今天待完成
  164. toTotal:0,
  165. laList: [], // 放代完成
  166. laTotal:0,
  167. time: moment().format('YYYY-MM-DD HH:mm'),
  168. date: moment().format('YYYY-MM-DD'),
  169. tips: '暂无数据',
  170. title: '我的任务',
  171. loading: true,
  172. activeNames: '2',
  173. filter: {
  174. page: 1,
  175. status: 'rewrite',
  176. sort: 'publish',
  177. source_type: 0,
  178. pt_id: 0,
  179. page_size:20,
  180. },
  181. tabsOption: [
  182. { title: '驳回重做', value: 'rewrite' },
  183. { title: '待完成', value: 'running' },
  184. { title: '待审批', value: 'complete' },
  185. { title: '已审批', value: 'reviewed' }
  186. ],
  187. screen_list: [
  188. {
  189. title: '任务类型',
  190. mapping: 'pt_id',
  191. list: [
  192. {name: '全部', id: 0}
  193. ]
  194. },
  195. {
  196. title: '排序',
  197. mapping: 'sort',
  198. list: [
  199. {name: '按发布时间', id: 'publish'},
  200. {name: '按截止时间', id: 'expire'}
  201. ]
  202. }
  203. ],
  204. list:[],
  205. }
  206. },
  207. watch:{
  208. activeNames(){
  209. this.onConfirm();
  210. }
  211. },
  212. // 方法
  213. methods: {
  214. // 选择条件
  215. onselect (item, subItem) {
  216. this.filter[item.mapping] = subItem.id
  217. },
  218. onConfirm() {
  219. this.$refs.tabsList.triggerPullToRefresh()
  220. },
  221. onCancel () {
  222. this.screen_list.forEach(e => {
  223. this.filter[e.mapping] = e.list[0].id
  224. })
  225. this.$refs.tabsList.triggerPullToRefresh()
  226. },
  227. // 加载
  228. showLoading () {
  229. this.$toast.loading({
  230. loadingType: 'spinner',
  231. message: '正在处理'
  232. })
  233. },
  234. onTabChange (value) {
  235. this.loading = true
  236. this.list = []
  237. this.laList = []
  238. this.filter.status = value.activeTab
  239. this.$refs.tabsList.triggerPullToRefresh()
  240. },
  241. onInfinite (params) {
  242. if(this.filter.status=='running'){
  243. this.page++;
  244. this.getToDay(true,params.done)
  245. }else{
  246. this.filter.page++;
  247. this.get_list(true,params.done)
  248. }
  249. },
  250. onRefresh (params) {
  251. if(this.filter.status === 'running'){
  252. this.getToDay(false,params.done)
  253. }else{
  254. this.get_list(false,params.done)
  255. }
  256. },
  257. get_list (is,callback) {
  258. // 需要告诉scroller 组件是否还有数据未加载
  259. let hasMore = false
  260. this.loading = true
  261. is? '':this.filter.page=1;
  262. this.$axiosUser('get', '/api/pro/integral/work/list', this.filter).then((res) => {
  263. if (res.data.code == 1) {
  264. const list = res.data.data.list
  265. this.laTotal=res.data.data.total
  266. if (this.filter.page === 1) {
  267. this.list = list
  268. } else {
  269. this.list = this.list.concat(list)
  270. }
  271. // 检查是否超时
  272. this.list.forEach(element => {
  273. if (moment(this.time).isBefore(element.expire_time)) {
  274. element.expire_time_color = false
  275. } else {
  276. element.expire_time_color = true
  277. }
  278. })
  279. // 需要告诉scroller 组件是否还有数据未加载 true没有 flase 还有
  280. hasMore = list.length !== 20
  281. callback && callback(hasMore)
  282. }
  283. }).finally(() => {
  284. this.loading = false
  285. })
  286. },
  287. getToDay (is,callback) {
  288. let hasMore = false
  289. this.loading = true
  290. is? '':this.page=1;
  291. let data={
  292. page:is? this.page:1,
  293. page_size:20,
  294. status:'running',
  295. today: this.activeNames.toString(),
  296. sort: this.filter.sort,
  297. source_type: 0,
  298. pt_id: this.filter.pt_id
  299. }
  300. this.$axiosUser('get', '/api/pro/integral/work/list',data).then(res => {
  301. let list=res.data.data.list||[];
  302. if (this.page === 1) {
  303. this.list = list
  304. } else {
  305. this.list = this.list.concat(list)
  306. }
  307. hasMore = list.length !== 20
  308. callback && callback(hasMore)
  309. }).finally(() => {
  310. this.loading = false
  311. })
  312. },
  313. // 进入详情
  314. detail (item) {
  315. this.$router.push({name: 'taskFile', query: {task_id: item.id}})
  316. },
  317. // 完成任务
  318. complete_task (item) {
  319. this.$router.push({name: 'process', query: {work_id: item.id, progress: 100}})
  320. }
  321. },
  322. // 组件挂载完成
  323. mounted () {
  324. let arr = this.$getTypes
  325. this.screen_list[0].list.push(...arr)
  326. },
  327. activated() {
  328. this.$refs.tabsList.triggerPullToRefresh()
  329. }
  330. }
  331. </script>
  332. <style scoped>
  333. .tab-item{
  334. background-color: rgb(236, 237, 239);
  335. text-align: center;
  336. font-weight: 500;
  337. padding: 0.1rem;
  338. color: #646566;
  339. }
  340. .tab-item-active{
  341. background-color: #fff;
  342. color: #141c28;
  343. border-radius: 5px;
  344. }
  345. .body_com{height: calc(100% - 1.92rem); position: relative;}
  346. .task_list .van-cell__title span{
  347. font-size: 0.36rem;
  348. }
  349. .task_list .van-cell__title span.date{
  350. font-size: 0.28rem;
  351. }
  352. .task_list .van-cell__title .complete_task{
  353. position: absolute;
  354. right: 0.24rem;
  355. bottom: 0.24rem;
  356. z-index: 2;
  357. }
  358. .task_list .van-cell__title .fr.orange,.task_list .van-cell__title .fr.red,.task_list .van-cell__title .fr.green{
  359. position: absolute;
  360. right: 0.24rem;
  361. bottom: 0.24rem;
  362. z-index: 2;
  363. font-size: 0.28rem;
  364. }
  365. .task_list .van-cell__title .complete_task span{
  366. font-size: inherit;
  367. }
  368. .task_list /deep/ .van-cell__value{
  369. flex: none;
  370. }
  371. .selected_list span{
  372. display: inline-block;
  373. height: 0.72rem;
  374. background: #f5f7fa;
  375. border-radius: 0.08rem;
  376. line-height: 0.72rem;
  377. touch-action: none;
  378. padding: 0 0.2rem;
  379. margin-right: 0.2rem;
  380. font-size: 0.3rem;
  381. }
  382. .selected_list span.selected{
  383. color: #26a2ff;
  384. background: #26a2ff33;
  385. }
  386. .van-cell-group{
  387. margin-top: 0;
  388. }
  389. .task {
  390. /* background: #F5F7FA; */
  391. color: #222;
  392. font-size: 14px;
  393. /* padding: 0.05rem 0.32rem 0.15rem 0.32rem; */
  394. }
  395. .bkColor {
  396. background-color: #fff;
  397. }
  398. .activeColor {
  399. background-color: transparent;
  400. }
  401. .my_task_box /deep/ .van-row--justify-center{
  402. top:50vh;
  403. }
  404. </style>