backlog.vue 14 KB

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