backlog.vue 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377
  1. <template>
  2. <div style="height: 100%;" :class="{ bg_fff: skeletonLoad }">
  3. <van-nav-bar title="待办事项" left-text="" left-arrow @click-left="routerBack" />
  4. <VanSkeleton :skeLoad="skeletonLoad">
  5. <template>
  6. <van-tabs v-model="type" @change="changeTab">
  7. <van-tab title="待处理" name="noEntering"></van-tab>
  8. <van-tab title="已处理" name="entering"></van-tab>
  9. </van-tabs>
  10. <header class="flex-box-ce">
  11. <div class="flex-1">
  12. 当前待办:
  13. <span v-if="commission > 0" style="color: #e42000; font-size: .29rem;">{{ commission }}条</span>
  14. </div>
  15. <div class="selector" @click="selectPfTIme">
  16. <span>{{ selectPftiText }}</span>
  17. <van-icon name="arrow-down" />
  18. </div>
  19. </header>
  20. <scroller v-if="type == 'noEntering'" ref="work_bench_scroller" class="all" :on-refresh="refresh" :on-infinite="infinite" noDataText="我也是有底线的" :list="noEnteringList">
  21. <template v-if="noEnteringList && noEnteringList.length > 0">
  22. <div class="list-item" v-for="(item, index) in noEnteringList" :key="index" @click="goHandlePage(item.reviewId, item.reviewIndicatorId, item.taskId, 'entering')">
  23. <div class="flex-box-ce" style="justify-content: space-between;">
  24. <div class="flex-box-ce">
  25. <userImage :id="item.userInfo.id" :user_name="item.userInfo.name" fontSize="0.28" width="0.6rem" height="0.6rem" style="margin-right: 0.08rem;"></userImage>
  26. <div style="font-size: 0.28rem; font-weight: 500; margin-right: 0.14rem;">{{item.employeeName}}</div>
  27. </div>
  28. <div style="font-size: 0.28rem; " class="fontColorC">{{ item.reviewTitle }}</div>
  29. </div>
  30. <div style="line-height: 0.6rem; font-size: 0.3rem; margin-bottom: 0.1rem;">指标:{{ item.title }} </div>
  31. <div class="flex-box-ce" style="justify-content: space-between; margin-bottom: 0.1rem;">
  32. <div class="node-type">
  33. {{ item.nodeType | formatNodeType }}
  34. </div>
  35. <div class="btn">去处理</div>
  36. </div>
  37. </div>
  38. </template>
  39. <van-empty v-else description="暂无绩效考核数据" />
  40. <div style="height: 0.5rem;"></div>
  41. </scroller>
  42. <scroller v-if="type == 'entering'" ref="work_bench_scroller2" class="all" :on-refresh="refresh2" :on-infinite="infinite2" noDataText="我也是有底线的" :list="enteringList">
  43. <template v-if="enteringList && enteringList.length > 0">
  44. <div class="list-item" v-for="(item, index) in enteringList" :key="index" @click="goHandlePage(item.reviewId, item.reviewIndicatorId, item.taskId, 'noEntering')">
  45. <div class="flex-box-ce" style="justify-content: space-between;">
  46. <div class="flex-box-ce">
  47. <userImage :id="item.userInfo.id" :user_name="item.userInfo.name" fontSize="0.28" width="0.6rem" height="0.6rem" style="margin-right: 0.08rem;"></userImage>
  48. <div style="font-size: 0.28rem; font-weight: 500; margin-right: 0.14rem;">{{item.employeeName}}</div>
  49. </div>
  50. <div style="font-size: 0.28rem; " class="fontColorC">{{ item.reviewTitle }}</div>
  51. </div>
  52. <div style="line-height: 0.6rem; font-size: 0.3rem; margin-bottom: 0.1rem;">指标:{{ item.title }} </div>
  53. <div class="flex-box-ce" style="justify-content: space-between; margin-bottom: 0.1rem;">
  54. <div class="node-type">
  55. {{ item.nodeType | formatNodeType }}
  56. </div>
  57. <div class="btn">查看详情</div>
  58. </div>
  59. </div>
  60. </template>
  61. <van-empty description="暂无绩效考核数据" v-if="enteringList.length == 0" />
  62. <div style="height: 0.5rem;"></div>
  63. </scroller>
  64. </template>
  65. </VanSkeleton>
  66. <van-dialog v-model="selectpfdlg" title="" width="300" :show-confirm-button="false" closeOnClickOverlay>
  67. <van-radio-group v-model="doSthForData.type">
  68. <van-radio
  69. v-for="(item, index) in selectpfList"
  70. :key="index"
  71. :name="item.value"
  72. @click="clickpfTime(item)"
  73. style="margin:.3rem 0 .3rem .4rem;font-size:.3rem"
  74. icon-size="16px"
  75. >
  76. <span style="margin-left:.3rem">{{ item.label }}</span>
  77. </van-radio>
  78. </van-radio-group>
  79. </van-dialog>
  80. </div>
  81. </template>
  82. <script>
  83. import Vue from 'vue';
  84. import { mapGetters, mapState } from 'vuex';
  85. import moment from 'moment';
  86. import VanSkeleton from '@/performance/components/public/VanSkeleton';
  87. import {Tab, Tabs, Search} from 'vant'
  88. Vue.use(Tab).use(Tabs).use(Search)
  89. export default {
  90. data() {
  91. return {
  92. skeletonLoad: false, // 过度骨架屏
  93. backlogList: [],
  94. commission: 0,
  95. doSthForData: {
  96. siteId: this.$userInfo().site_id,
  97. employeeId: this.$userInfo().id,
  98. page: 1, // 当期页
  99. pageSize: 15, // 一页多少数据
  100. type: 0 // 0-全部 1-确认目标 2-录入结果 3-自评 4-互评 5-评分 6-审批 7-考核面谈
  101. },
  102. theBackupList: [],
  103. // 分类相关
  104. selectpfList: [
  105. // 选择时间选项
  106. { label: '全部', value: 0 },
  107. { label: '确认目标', value: 1 },
  108. { label: '录入结果', value: 2 },
  109. { label: '自评', value: 3 },
  110. { label: '互评', value: 4 },
  111. { label: '评分', value: 5 },
  112. { label: '审批', value: 6 }
  113. ],
  114. selectpfdlg: false,
  115. selectPftiText: '全部', // 默认值
  116. pendingList: [] ,//提供给考核详情上下切换人员列表
  117. plcList:[],
  118. userInfo: this.$userInfo(),
  119. type:'noEntering',
  120. noEnteringList: [],
  121. enteringList:[],
  122. enteringList2:[],
  123. page: 1,
  124. };
  125. },
  126. computed: {
  127. ...mapGetters(['site_info'])
  128. },
  129. components: { VanSkeleton },
  130. filters: {
  131. formatNodeType(val) {
  132. // targetConfirm-确认目标 resultInput-录入结果值 scoreSelf-自评 scoreEachOther-互评 score-评分 review-审批
  133. if(val === 'targetConfirm') return '确认目标'
  134. if(val === 'resultInput') return '录入结果'
  135. if(val === 'scoreSelf') return '自评'
  136. if(val === 'scoreEachOther') return '互评'
  137. if(val === 'score') return '评分'
  138. if(val === 'review') return '审批'
  139. }
  140. },
  141. activated() {
  142. this.page = 1;
  143. this.doSthForData.page = 1;
  144. this.doSthForData.type = 0;
  145. this.selectPftiText = '全部'; // 默认值
  146. if(this.type == 'noEntering'){
  147. setTimeout(() => {
  148. this.$refs.work_bench_scroller.triggerPullToRefresh();
  149. }, 50);
  150. }else{
  151. setTimeout(() => {
  152. this.$refs.work_bench_scroller2.triggerPullToRefresh();
  153. }, 50);
  154. }
  155. },
  156. methods: {
  157. changeTab(name) {
  158. this.page = 1;
  159. this.doSthForData.page = 1;
  160. this.doSthForData.type = 0;
  161. this.selectPftiText = '全部'; // 默认值
  162. if(this.type == 'noEntering'){
  163. console.log("请求待处理数据")
  164. setTimeout(() => {
  165. this.$refs.work_bench_scroller.triggerPullToRefresh();
  166. }, 50);
  167. }else{
  168. setTimeout(() => {
  169. this.$refs.work_bench_scroller2.triggerPullToRefresh();
  170. }, 50);
  171. }
  172. },
  173. getNoEntering(callback) {
  174. let hasMore = false;
  175. let url = `/performance/review/job/employee/app/${this.$userInfo().site_id}/${this.$userInfo().id}`
  176. this.commission = 0;
  177. this.$axiosUser('get', url, this.doSthForData).then(res => {
  178. if(res.data.code == 1) {
  179. this.commission = res.data.data.total;
  180. let list = res.data.data.list;
  181. this.skeletonLoad = false;
  182. if(list && list.length > 0) {
  183. list.forEach(item => {
  184. let userInfo = this.$getEmployeeMapItem(item.employeeId)
  185. item.userInfo = userInfo
  186. })
  187. }
  188. if (this.doSthForData.page === 1) {
  189. this.noEnteringList = list;
  190. } else {
  191. this.noEnteringList = this.noEnteringList.concat(list);
  192. }
  193. hasMore = list.length !== 10;
  194. callback && callback(hasMore);
  195. }
  196. })
  197. },
  198. getEnteringList(callback) {
  199. let hasMore = false;
  200. this.commission = 0;
  201. let url = `/performance/review/job/employee/app/history/${this.$userInfo().site_id}/${this.$userInfo().id}`
  202. this.$axiosUser('get', url, this.doSthForData).then(res => {
  203. if(res.data.code == 1) {
  204. this.commission = res.data.data.total;
  205. let list = res.data.data.list;
  206. this.skeletonLoad = false;
  207. if(list && list.length > 0) {
  208. list.forEach(item => {
  209. let userInfo = this.$getEmployeeMapItem(item.employeeId)
  210. item.userInfo = userInfo
  211. })
  212. }
  213. if (this.doSthForData.page === 1) {
  214. this.enteringList = list;
  215. } else {
  216. this.enteringList = this.enteringList.concat(list);
  217. }
  218. hasMore = list.length !== 10;
  219. callback && callback(hasMore);
  220. }
  221. })
  222. },
  223. clickpfTime(item) {
  224. this.selectPftiText = item.label;
  225. this.doSthForData.page = 1;
  226. if(this.type === "noEntering") {
  227. setTimeout(() => {
  228. this.$refs.work_bench_scroller.triggerPullToRefresh();
  229. }, 50);
  230. }else {
  231. setTimeout(() => {
  232. this.$refs.work_bench_scroller2.triggerPullToRefresh();
  233. }, 50);
  234. }
  235. this.selectpfdlg = false;
  236. },
  237. selectPfTIme() {
  238. this.selectpfdlg = true;
  239. },
  240. goHandlePage(reviewId, reviewIndicatorId, taskId, type) {
  241. this.$router.push({ path:'/newBacklogDetails', query: { reviewId, reviewIndicatorId, taskId, type } });
  242. },
  243. // 上拉刷新
  244. refresh(done) {
  245. this.doSthForData.page = 1;
  246. this.getNoEntering(done);
  247. },
  248. // 下拉加载
  249. infinite(done) {
  250. this.doSthForData.page++;
  251. this.getNoEntering(done);
  252. },
  253. // 返回上一页
  254. routerBack() {
  255. this.$route_back();
  256. },
  257. // 上拉刷新
  258. refresh2(done) {
  259. this.doSthForData.page = 1;
  260. this.getEnteringList(done);
  261. },
  262. // 下拉加载
  263. infinite2(done) {
  264. this.doSthForData.page++;
  265. this.getEnteringList(done);
  266. },
  267. },
  268. };
  269. </script>
  270. <style scoped lang="less">
  271. .all {
  272. height: calc(100% - 2.64rem) !important;
  273. position: relative !important;
  274. background-color: #f5f7fa;
  275. }
  276. .all2{
  277. height: calc(100% - 1.84rem) !important;
  278. position: relative !important;
  279. background-color: #f5f7fa;
  280. }
  281. header {
  282. padding: 0.2rem;
  283. background-color: #fff;
  284. padding-left: 0.2rem;
  285. font-size: 0.3rem;
  286. z-index: 1;
  287. box-sizing: border-box;
  288. border-bottom: 1px solid #f1f1f1;
  289. border-top: 1px solid #f1f1f1;
  290. }
  291. .backlog_list_tit {
  292. background-color: #f5f7fa;
  293. padding: 0.2rem 0 0.2rem 0.2rem;
  294. font-size: 0.28rem;
  295. }
  296. .backlog_list {
  297. padding: 0.32rem 0.3rem 0.32rem 0.45rem;
  298. box-sizing: border-box;
  299. span {
  300. font-size: 0.29rem;
  301. }
  302. }
  303. .mb-2 {
  304. margin-bottom: 0.2rem;
  305. }
  306. .list-item {
  307. width: 96%;
  308. padding: 0.2rem;
  309. background-color: #fff;
  310. box-sizing: border-box;
  311. font-size: 0.28rem;
  312. position: relative;
  313. margin: 0.2rem auto 0 auto;
  314. border-radius: 8px;
  315. .node-type {
  316. background-color: #ecf5ff;
  317. width: 1.3rem;
  318. text-align: center;
  319. padding: 0.05rem;
  320. color: #fff;
  321. border-radius: 6px;
  322. font-size: 0.3rem;
  323. color: #26a2ff;
  324. margin-right: 0.14rem;
  325. }
  326. .btn {
  327. padding: 0.05rem;
  328. border-radius: 6px;
  329. color: #26a2ff;
  330. font-size: 0.28rem;
  331. }
  332. }
  333. </style>