backlog-副本.vue 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410
  1. <template>
  2. <div style="height: 100%;" :class="{ bg_fff: skeletonLoad }">
  3. <van-nav-bar title="待办事项" left-text="" left-arrow @click-left="routerBak" />
  4. <VanSkeleton :skeLoad="skeletonLoad">
  5. <template>
  6. <van-tabs v-model="type">
  7. <van-tab title="待处理" name="noEntering"></van-tab>
  8. <van-tab title="已处理" name="entering"></van-tab>
  9. </van-tabs>
  10. <header class="performanceList flex-box-ce" v-show="type=='noEntering'">
  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-show="type=='noEntering'" ref="work_bench_scroller" class="all" style="position: relative" :on-refresh="refresh" :on-infinite="infinite" noDataText="我也是有底线的" :list="backlogList">
  21. <template v-if="plcList.length > 0 && doSthForData.node_type == 0 || doSthForData.node_type == 10">
  22. <div class="backlog_list_tit">绩效确认</div>
  23. <div v-for="(arr, keys) in plcList" :key="arr.id" :style="'z-index:' + (plcList.length - keys)" class="performanceList backlog_list" @click="openAffirm(arr)">
  24. <van-row class="flex-box">
  25. <van-col span="3">
  26. <userImage class="about-me__avatar" :id="userInfo.id" :img_url="userInfo.img_url" :user_name="userInfo.name" fontSize="0.24" width="0.65rem" height="0.65rem"></userImage>
  27. </van-col>
  28. <van-col span="20"><span>{{ arr.package_name }}【{{ arr.level_name }}】的绩效评分和等级,需要你检查确认</span></van-col>
  29. <van-col span="1"><div class="flex-box" style="align-items: center; height: 100%; color: #b1b1b1;"><van-icon name="arrow" /></div></van-col>
  30. </van-row>
  31. </div>
  32. </template>
  33. <van-empty description="暂无绩效考核数据" v-if="backlogList.length == 0&&plcList.length==0" />
  34. <template v-if="backlogList.length > 0">
  35. <div v-for="(item, index) in backlogList" :key="index">
  36. <div class="backlog_list_tit">{{ item.time }}</div>
  37. <div v-for="(arr, keys) in item.list" :key="keys" :style="'z-index:' + (item.list.length - keys)" class="performanceList backlog_list" @click="clickPush(arr)">
  38. <van-row class="flex-box">
  39. <van-col span="3">
  40. <userImage class="about-me__avatar" :id="arr.userInfo.id" :img_url="arr.userInfo.img_url" :user_name="arr.userInfo.name" fontSize="0.24" width="0.65rem" height="0.65rem"></userImage>
  41. </van-col>
  42. <van-col span="20"><span>{{ arr.content }}</span></van-col>
  43. <van-col span="1"><div class="flex-box" style="align-items: center; height: 100%; color: #b1b1b1;"><van-icon name="arrow" /></div></van-col>
  44. </van-row>
  45. </div>
  46. </div>
  47. </template>
  48. <div style="height: 0.5rem;"></div>
  49. </scroller>
  50. <scroller v-show="type=='entering'" ref="work_bench_scroller2" class="all2" :on-refresh="refresh2" :on-infinite="infinite2" noDataText="我也是有底线的" :list="enteringList">
  51. <div>
  52. <div style="height: 0.2rem;background-color: rgb(245, 247, 250);"></div>
  53. <div v-for="(item, index) in enteringList" :key="index" class="performanceList backlog_list mb-2" @click="clickPush2(item)">
  54. <van-row class="flex-box">
  55. <van-col span="3">
  56. <userImage class="about-me__avatar" :id="item.userInfo.id" :img_url="item.userInfo.img_url" :user_name="item.userInfo.name" fontSize="0.24" width="0.65rem" height="0.65rem"></userImage>
  57. </van-col>
  58. <van-col span="20">
  59. <div><span>{{ item.content }}</span></div>
  60. <div class="fontColorC" style="margin-top: 0.1rem;">{{item.update_time}}</div>
  61. </van-col>
  62. <van-col span="1"><div class="flex-box" style="align-items: center; height: 100%; color: #b1b1b1;">
  63. <van-icon name="arrow" /></div>
  64. </van-col>
  65. </van-row>
  66. </div>
  67. <van-empty description="暂无绩效考核数据" v-if="enteringList.length == 0" />
  68. <div v-else style="height: 0.5rem;"></div>
  69. </div>
  70. </scroller>
  71. </template>
  72. </VanSkeleton>
  73. <van-dialog v-model="selectpfdlg" title="" width="300" :show-confirm-button="false" closeOnClickOverlay>
  74. <van-radio-group v-model="doSthForData.node_type">
  75. <van-radio
  76. v-for="(item, index) in selectpfList"
  77. :key="index"
  78. :name="item.value"
  79. @click="clickpfTime(item)"
  80. style="margin:.3rem 0 .3rem .4rem;font-size:.3rem"
  81. icon-size="16px"
  82. >
  83. <span style="margin-left:.3rem">{{ item.label }}</span>
  84. </van-radio>
  85. </van-radio-group>
  86. </van-dialog>
  87. </div>
  88. </template>
  89. <script>
  90. import Vue from 'vue';
  91. import { mapGetters, mapState } from 'vuex';
  92. import moment from 'moment';
  93. import VanSkeleton from '@/performance/components/public/VanSkeleton';
  94. import {Tab, Tabs, Search} from 'vant'
  95. Vue.use(Tab).use(Tabs).use(Search)
  96. export default {
  97. data() {
  98. return {
  99. skeletonLoad: false, // 过度骨架屏
  100. backlogList: [],
  101. commission: 0,
  102. doSthForData: {
  103. status: 0, // 周期类型
  104. page: 1, // 当期页
  105. page_size: 10, // 一页多少数据
  106. node_type: 0
  107. },
  108. theBackupList: [],
  109. // 分类相关
  110. selectpfList: [
  111. // 选择时间选项
  112. { label: '全部待办', value: 0 },
  113. { label: '目标制定', value: 1 },
  114. { label: '指标确认', value: 2 },
  115. { label: '结果录入', value: 4 },
  116. { label: '评分', value: 5 },
  117. { label: '审批', value: 9 },
  118. { label: '绩效确认', value: 10 }
  119. ],
  120. selectpfdlg: false,
  121. selectPftiText: '全部待办', // 默认值
  122. pendingList: [] ,//提供给考核详情上下切换人员列表
  123. plcList:[],
  124. userInfo: this.$userInfo(),
  125. type:'noEntering',
  126. enteringList:[],
  127. enteringList2:[],
  128. page:1,
  129. };
  130. },
  131. computed: {
  132. ...mapGetters(['site_info'])
  133. },
  134. components: { VanSkeleton },
  135. watch:{
  136. type(val){
  137. this.page = 1;
  138. this.doSthForData.page = 1;
  139. if(val == 'noEntering'){
  140. console.log("请求待处理数据")
  141. setTimeout(() => {
  142. this.$refs.work_bench_scroller.triggerPullToRefresh();
  143. }, 50);
  144. }else{
  145. setTimeout(() => {
  146. this.$refs.work_bench_scroller2.triggerPullToRefresh();
  147. }, 50);
  148. }
  149. },
  150. },
  151. methods: {
  152. openAffirm(item){
  153. this.$router.push({ path: '/affirm', query: { pl_id: item.id,level_name:item.level_name,package_id: item.package_id } });
  154. },
  155. clickPush2(arr) {
  156. let query={};
  157. if(arr.node_type==4){
  158. let name=arr.content.split(',')[0];
  159. query={
  160. pe_ids:JSON.stringify(arr.pe_ids.concat(arr.done_pe_ids)),
  161. isUpdate:true,
  162. Tit:name,
  163. pendingList: JSON.stringify(this.enteringList2),
  164. package_id:arr.package_id,
  165. page:this.doSthForData.page,
  166. activeName:this.doSthForData.node_type,
  167. }
  168. }else{
  169. query={
  170. id: arr.remark.packageEmployee_id,
  171. Tit: arr.remark.package_name,
  172. pendingList: JSON.stringify(this.enteringList2),
  173. page:this.doSthForData.page,
  174. activeName:this.doSthForData.node_type,
  175. }
  176. }
  177. this.$router.push({ name:'performanceDetails',query:query});
  178. },
  179. clickPush(arr) {
  180. let query={};
  181. if(arr.node_type==4){
  182. let name=arr.content.split(',')[0];
  183. query={
  184. pe_ids:JSON.stringify(arr.pe_ids.concat(arr.done_pe_ids)),
  185. Tit:name,
  186. pendingList: JSON.stringify(this.pendingList),
  187. package_id:arr.package_id,
  188. page:this.doSthForData.page,
  189. activeName:this.doSthForData.node_type,
  190. }
  191. }else{
  192. query={
  193. id: arr.remark.packageEmployee_id,
  194. Tit: arr.remark.package_name,
  195. pendingList: JSON.stringify(this.pendingList),
  196. page:this.doSthForData.page,
  197. activeName:this.doSthForData.node_type,
  198. }
  199. }
  200. this.$router.push({ name:'performanceDetails',query:query});
  201. },
  202. clickpfTime(item) {
  203. this.selectPftiText = item.label;
  204. this.doSthForData.page = 1;
  205. setTimeout(() => {
  206. this.$refs.work_bench_scroller.triggerPullToRefresh();
  207. }, 50);
  208. this.selectpfdlg = false;
  209. },
  210. selectPfTIme() {
  211. this.selectpfdlg = true;
  212. },
  213. // 获取待办列表
  214. getPlc() {
  215. this.$axiosUser('get', '/api/pro/per/package/plc/list', {status: 0, page: 1, page_size: 1000 }).then(res => {
  216. this.commission = this.commission + res.data.data.total; // 待办总数量
  217. this.plcList = res.data.data.list
  218. })
  219. },
  220. doSthForSb(callback) {
  221. // 代办数量
  222. let hasMore = false;
  223. let params = this.doSthForData;
  224. this.commission = 0;
  225. this.plcList=[];
  226. if(params.node_type==0||params.node_type==10){
  227. this.getPlc()
  228. if(params.node_type==10){
  229. this.backlogList=[];
  230. callback && callback(true);
  231. return false
  232. }
  233. }
  234. this.$axiosUser('get', '/api/pro/per/package/msg/agency', params,'v2').then(res => {
  235. if (res.data.code == 1) {
  236. let list = res.data.data.list;
  237. let pendingList = [];
  238. list.forEach(item => {
  239. if(item.node_type==4){
  240. let userInfo = this.$getEmployeeMapItem(item.first_employee_id)
  241. item.userInfo = userInfo;
  242. let name = item.content.split(',')[0]
  243. pendingList.push({ name: userInfo.name, employeeID: '结果',pe_ids:item.pe_ids.concat(item.done_pe_ids),package_name: name,package_id:item.package_id });
  244. return false
  245. }
  246. if (item.remark.employee_id) { // 被考核人
  247. let userInfo = this.$getEmployeeMapItem(item.remark.employee_id)
  248. item.userInfo = userInfo;
  249. pendingList.push({ name: userInfo.name, employeeID: item.remark.packageEmployee_id, package_name: item.remark.package_name });
  250. }
  251. });
  252. this.pendingList = pendingList;
  253. this.commission = this.commission + res.data.data.total;
  254. if (this.doSthForData.page === 1) {
  255. this.theBackupList = list;
  256. } else {
  257. this.theBackupList = this.theBackupList.concat(list);
  258. }
  259. hasMore = list.length !== 10;
  260. callback && callback(hasMore);
  261. let data = this.theBackupList; //数据源
  262. data.forEach(item => {
  263. // 转换展示的时间格式
  264. if (/\d{4}/g.exec(item.update_time)[0] == moment().format('YYYY')) {
  265. item.tineKind = moment(new Date(item.update_time.replace(/-/g, '/')).getTime()).format('MM月DD日');
  266. } else {
  267. item.tineKind = moment(new Date(item.update_time.replace(/-/g, '/')).getTime()).format('YYYY年MM月DD日');
  268. }
  269. });
  270. // 转换成可用格式
  271. let bbt = [];
  272. data.forEach(item => {
  273. if (bbt[item.tineKind]) {
  274. bbt[item.tineKind].list.push(item);
  275. } else {
  276. bbt[item.tineKind] = true;
  277. bbt[item.tineKind] = {
  278. time: item.tineKind,
  279. list: []
  280. };
  281. bbt[item.tineKind].list.push(item);
  282. }
  283. });
  284. let listdata = [];
  285. for (let i in bbt) {
  286. listdata.push(bbt[i]);
  287. }
  288. this.$nextTick(() => {
  289. this.backlogList = listdata;
  290. });
  291. this.skeletonLoad = false;
  292. }
  293. })
  294. },
  295. getEnteringList(callback) {
  296. // 代办数量
  297. let hasMore = false;
  298. let params = {
  299. node_type: 0,
  300. status: 1,
  301. page: this.page,
  302. page_size: 10
  303. }
  304. this.$axiosUser('get', '/api/pro/per/package/msg/agency', params,'v2').then(res => {
  305. let list = res.data.data.list;
  306. let pendingList=[]
  307. list.forEach(item => {
  308. if(item.node_type==4){
  309. let userInfo = this.$getEmployeeMapItem(item.first_employee_id)
  310. item.userInfo = userInfo;
  311. let name=item.content.split(',')[0]
  312. pendingList.push({ name: userInfo.name, employeeID: '结果',pe_ids:item.pe_ids.concat(item.done_pe_ids),package_name: name,package_id:item.package_id });
  313. return false
  314. }
  315. if (item.remark.employee_id) { // 被考核人
  316. let userInfo = this.$getEmployeeMapItem(item.remark.employee_id)
  317. item.userInfo = userInfo;
  318. pendingList.push({ name: userInfo.name, employeeID: item.remark.packageEmployee_id, package_name: item.remark.package_name });
  319. }
  320. });
  321. this.enteringList2=pendingList
  322. if (this.page === 1) {
  323. this.enteringList = list;
  324. } else {
  325. this.enteringList = this.enteringList.concat(list);
  326. }
  327. hasMore = list.length !== 10;
  328. callback && callback(hasMore);
  329. })
  330. },
  331. // 上拉刷新
  332. refresh(done) {
  333. this.doSthForData.page = 1;
  334. this.doSthForSb(done);
  335. },
  336. // 下拉加载
  337. infinite(done) {
  338. this.doSthForData.page++;
  339. this.doSthForSb(done);
  340. },
  341. // 上拉刷新
  342. refresh2(done) {
  343. this.page = 1;
  344. this.getEnteringList(done);
  345. },
  346. // 下拉加载
  347. infinite2(done) {
  348. this.page++;
  349. this.getEnteringList(done);
  350. },
  351. // 返回上一页
  352. routerBak() {
  353. this.$route_back();
  354. },
  355. },
  356. };
  357. </script>
  358. <style scoped lang="less">
  359. .all {
  360. height: calc(100% - 2.64rem) !important;
  361. position: relative !important;
  362. background-color: #f5f7fa;
  363. }
  364. .all2{
  365. height: calc(100% - 1.84rem) !important;
  366. position: relative !important;
  367. background-color: #f5f7fa;
  368. }
  369. header {
  370. padding: 0.2rem;
  371. background-color: #fff;
  372. padding-left: 0.2rem;
  373. font-size: 0.3rem;
  374. z-index: 1;
  375. }
  376. .backlog_list_tit {
  377. background-color: #f5f7fa;
  378. padding: 0.2rem 0 0.2rem 0.2rem;
  379. font-size: 0.28rem;
  380. }
  381. .backlog_list {
  382. padding: 0.32rem 0.3rem 0.32rem 0.45rem;
  383. box-sizing: border-box;
  384. span {
  385. font-size: 0.29rem;
  386. }
  387. }
  388. .mb-2 {
  389. margin-bottom: 0.2rem;
  390. }
  391. </style>