statistics.js 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477
  1. var app = getApp();
  2. var that;
  3. var animation;
  4. var chart1;
  5. var chart2;
  6. import { setCache, getCache } from '../../../utils/util'
  7. Page({
  8. data: {
  9. tabIndex: 1,
  10. isShowType: false,
  11. defaultRuleId: '',
  12. jxName: '',
  13. theProgressOf: {
  14. complete: 0,
  15. theTotalNum: 0
  16. },
  17. currentRate: 0,
  18. rate: 0,
  19. page: 1,
  20. isVal: false,
  21. keyword: '',
  22. list: [],
  23. statementHnList: [
  24. { tit: '参与人数', num: 0, key: 0 },
  25. { tit: '目标制定', num: 0, key: 1 },
  26. { tit: '目标确认', num: 0, key: 2 },
  27. { tit: '执行中', num: 0, key: 3 },
  28. { tit: '结果值录入', num: 0, key: 4 },
  29. { tit: '评分', num: 0, key: 5 },
  30. { tit: '审批', num: 0, key: 9 },
  31. { tit: '考核结束', num: 0, key: 11 }
  32. ],
  33. // 部门筛选
  34. department_list: [],
  35. department_index: 0,
  36. // 部门筛选
  37. levels_list: [],
  38. levels_index: 0,
  39. statementperson: [],
  40. jxUserList: [],//结果分析人员列表
  41. selectPftiData: {},//选择的绩效
  42. },
  43. onLoad() {
  44. that = this;
  45. chart1, chart2 = '';
  46. dd.setNavigationBar({ title: "报表统计" });
  47. this.getRange();
  48. },
  49. onShow() {
  50. animation = dd.createAnimation({
  51. duration: 200,
  52. timeFunction: "linear",
  53. });
  54. },
  55. personnel_detailsPath(e) {
  56. let index = e.target.dataset.index
  57. let data = {
  58. paths: 'personnelDetail',
  59. asslist: this.data.selectPftiData,
  60. index: index,
  61. }
  62. setCache('statementDetails', data)
  63. dd.navigateTo({
  64. url: `../statementDetails/statementDetails`
  65. })
  66. },
  67. cellDept(e) {
  68. let item = e.target.dataset.item
  69. let data = {
  70. paths: 'statdeEcharts',
  71. dept_o: item,
  72. asslist: this.data.selectPftiData,
  73. index: 0,
  74. }
  75. setCache('statementDetails', data)
  76. dd.navigateTo({
  77. url: `../statementDetails/statementDetails`
  78. })
  79. },
  80. openDetail(e) {
  81. let item = e.target.dataset.item
  82. let str = `../performanceDetails/performanceDetails?assId=${this.data.selectPftiData.id}&staffId=${item.id}&tel=${this.data.selectPftiData.name}`
  83. dd.navigateTo({
  84. url: str
  85. })
  86. },
  87. // 结果分析人员列表
  88. isShow() {
  89. let arr = [];
  90. this.setData({
  91. jxUserList: []
  92. })
  93. this.data.allStatementResult.map(item => {
  94. if (this.isQualified(item)) {
  95. item.name = app.globalData.usersList[item.id].name
  96. arr.push(item);
  97. }
  98. });
  99. setTimeout(() => {
  100. this.setData({
  101. jxUserList: arr
  102. })
  103. }, 200)
  104. },
  105. isQualified(item) {
  106. let deptId = this.data.department_list[this.data.department_index].value
  107. let level = this.data.levels_list[this.data.levels_index].value
  108. if (deptId == 0 && level == '-') {
  109. return true;
  110. }
  111. let isDept = false,
  112. isLevel = false;
  113. if (deptId != 0) {
  114. item.departments.some(e => {
  115. if (e.id == deptId) {
  116. isDept = true;
  117. return true;
  118. }
  119. });
  120. }
  121. if (item.level == level || level == '-') {
  122. isLevel = true;
  123. }
  124. if (deptId == 0) {
  125. isDept = true;
  126. }
  127. return isDept && isLevel;
  128. },
  129. statisticalPeople() {
  130. this.setData({
  131. department_index: 0,
  132. levels_index: 0,
  133. })
  134. let params = {
  135. package_id: this.data.defaultRuleId,
  136. };
  137. app.$get('api/per/package/info_v3_aid', params).then(res => {
  138. if (res.data.code == 1) {
  139. this.skeletonLoad = false;
  140. let data = res.data.data.statistics;
  141. let list = this.data.statementHnList;
  142. let theOf = this.data.theProgressOf;
  143. let all = 0
  144. for (let i in data) {
  145. all += data[i]
  146. }
  147. list[0].num = all; // 参与人数
  148. list[1].num = data[1]; // 目标制定
  149. list[2].num = data[2]; // 目标确认
  150. list[3].num = data[3]; // 执行中
  151. list[4].num = data[4]; // 结果值录入
  152. list[5].num = data[5]; // 评分
  153. list[6].num = data[9]; // 审批
  154. list[7].num = data[11]; // 结束
  155. theOf.complete = data[11]; // 已完成人数
  156. theOf.theTotalNum = all; // 总人数
  157. let rate = (theOf.complete / theOf.theTotalNum) * 100; // 进度条百分比
  158. if (!isNaN(rate)) {
  159. this.setData({// 进度条百分比
  160. rate: rate.toFixed(2),
  161. })
  162. }
  163. this.setData({// 进度条百分比
  164. theProgressOf: theOf, //考核进度
  165. statementHnList: list
  166. })
  167. //部门筛选
  168. let other = res.data.data.other
  169. let department_list = other.department_list;
  170. department_list.forEach(item => {
  171. item.text = item.dep_name;
  172. item.value = item.id;
  173. });
  174. department_list.unshift({ text: '全部部门', value: 0 });
  175. this.setData({// 部门筛选
  176. department_list: department_list,
  177. })
  178. //等级筛选
  179. let levels = other.levels;
  180. if (levels.indexOf('无等级') == -1) {
  181. levels.push('无等级')
  182. }
  183. levels = levels.map(item => {
  184. return { text: item, value: item };
  185. });
  186. levels.unshift({ text: '全部等级', value: '-' });
  187. this.setData({// 等级筛选
  188. levels_list: levels,
  189. })
  190. let departMent = other.department;
  191. // this.deptMentList = departMent;
  192. // 考核人数分析
  193. let deptList = [];
  194. let assPeopleFx = [];
  195. departMent.forEach(item => {
  196. // echarts数据
  197. assPeopleFx.push({
  198. year: item[0].dep_name,
  199. sales: item.length
  200. })
  201. // 列表
  202. let arr = {};
  203. arr.name = item[0].dep_name;
  204. arr.tak = item.length;
  205. arr.id = [item[0].id]
  206. let employ = [];
  207. item.forEach(arr => {
  208. employ.push(arr.employee_id);
  209. });
  210. deptList.push(arr);
  211. });
  212. this.setData({// 考核人数列表
  213. statementperson: deptList,
  214. assPeopleFx: assPeopleFx,
  215. })
  216. // 结果分析
  217. let statistics = other.statistics;
  218. let theResultsOfNum = [];
  219. let PieProps = 0;
  220. for (let i in statistics) {
  221. theResultsOfNum.push({
  222. name: i == 'empty' ? '无等级' : i,
  223. percent: '',
  224. num: statistics[i].length,
  225. a: '1'
  226. })
  227. PieProps += statistics[i].length;
  228. }
  229. theResultsOfNum.forEach(item => {//设置百分比
  230. let bfb = (Math.round(item.num / PieProps * 10000) / 100.00);
  231. if (bfb !== bfb) { bfb = 0; };
  232. item.percent = bfb
  233. })
  234. this.setData({// 总人数
  235. PieProps: PieProps,
  236. theResultsOfNum: theResultsOfNum
  237. })
  238. if (this.data.tabIndex == 1) {
  239. this.statmentAnalysesPie();
  240. } else {
  241. this.statmentAnalysesBar()
  242. }
  243. let theResultsOfList = [];
  244. res.data.data.employees.forEach(item => {
  245. let data = {
  246. id: item.id,
  247. name: item.name,
  248. level: item.final_level == '' ? '无等级' : item.final_level,
  249. point: item.final_point,
  250. departments: []
  251. }
  252. res.data.data.other.department.forEach(x => {
  253. let arr = x.filter(y => item.id == y.employee_id)
  254. if (arr[0]) {
  255. data.departments.push(arr[0])
  256. }
  257. })
  258. theResultsOfList.push(data)
  259. })
  260. theResultsOfList.sort(function (a, b) {
  261. if (Number(a.point) < Number(b.point)) {
  262. return 1;
  263. } else {
  264. return -1;
  265. }
  266. });
  267. this.setData({
  268. allStatementResult: theResultsOfList,
  269. })
  270. this.isShow();
  271. }
  272. })
  273. },
  274. // 柱状图
  275. statmentAnalysesBar() {
  276. chart2.changeData(this.data.assPeopleFx)
  277. },
  278. // 饼图
  279. statmentAnalysesPie() {
  280. const data = this.data.theResultsOfNum;
  281. const map = [];
  282. data.forEach(function (obj) {
  283. map[obj.name] = obj.num + '人 ' + obj.percent + '%'
  284. });
  285. chart1.legend({
  286. position: 'right',
  287. itemFormatter: function itemFormatter(val) {
  288. return val + ' ' + map[val];
  289. }
  290. });
  291. chart1.changeData(data)
  292. },
  293. getRange() {
  294. app.$get("api/per/package/list", { page: 0, is_manage_scope: 1 }).then((res) => {
  295. let obj = res.data.data.list;
  296. let arr = [
  297. { name: '月度', id: 2, list: [] },
  298. { name: '日', id: 1, list: [] },
  299. { name: '季度', id: 3, list: [] },
  300. { name: '半年度', id: 4, list: [] },
  301. { name: '年度', id: 5, list: [] },
  302. { name: '自定义', id: 6, list: [] }
  303. ];
  304. obj.forEach(item => {
  305. arr.forEach(item2 => {
  306. if (item2.id == item.cycle_type) {
  307. item2.list.push(item);
  308. }
  309. });
  310. });
  311. let data = arr;
  312. let list = [];
  313. data.forEach(item => {
  314. if (item.list.length > 0) {
  315. list.push(item);
  316. }
  317. });
  318. list.some(item => {
  319. if (item.list.length > 0) {
  320. obj = item.list
  321. return true;
  322. }
  323. });
  324. that.setData({
  325. selectPftiData: obj.length>0 ? obj[0] : '',
  326. defaultRuleId: obj.length>0 ? obj[0].id : '',
  327. jxName: obj.length>0 ? obj[0].name : '',
  328. })
  329. if (obj.length>0) {
  330. this.statisticalPeople();
  331. }
  332. })
  333. },
  334. onInitChart2(F2, config) {
  335. const data = [];
  336. chart2 = new F2.Chart(config);
  337. chart2.source(data);
  338. // chart2.tooltip({
  339. // showItemMarker: false,
  340. // onShow: function onShow(ev) {
  341. // const items = ev.items;
  342. // items[0].name = null;
  343. // items[0].name = items[0].title;
  344. // items[0].value = '¥ ' + items[0].value;
  345. // }
  346. // });
  347. chart2.interval().position('year*sales').size(30).color('l(90) 0:#4ECFFF 1:#26A2FF'); // 定义柱状图渐变色
  348. chart2.render();
  349. },
  350. // 饼图
  351. onInitChart(F2, config) {
  352. const data = [];
  353. const map = [];
  354. data.forEach(function (obj) {
  355. map[obj.name] = obj.num + '项 ' + obj.percent + '%';
  356. });
  357. chart1 = new F2.Chart(config);
  358. chart1.source(data, {
  359. percent: {
  360. formatter: function formatter(val) {
  361. return val * 100 + '%';
  362. }
  363. }
  364. });
  365. chart1.tooltip(false);
  366. chart1.coord('polar', {
  367. transposed: true,
  368. radius: 0.85
  369. });
  370. chart1.axis(false);
  371. chart1.interval()
  372. .position('a*percent')
  373. .color('name', ['#1890FF', '#F56C6C', '#2FC25B', '#FACC14', '#F04864', '#8543E0'])
  374. .adjust('stack')
  375. .style({
  376. lineWidth: 1,
  377. stroke: '#fff',
  378. lineJoin: 'round',
  379. lineCap: 'round'
  380. })
  381. .animate({
  382. appear: {
  383. duration: 1200,
  384. easing: 'bounceOut'
  385. }
  386. });
  387. chart1.render();
  388. },
  389. getPrizeList(is) {
  390. let data = {
  391. page: this.data.page,
  392. page_size: 20,
  393. package_id: this.data.defaultRuleId,
  394. name: this.data.keyword,
  395. range: this.data.minuteArray[this.data.minuteIndex].value,
  396. }
  397. let str = 'api/per/package/management_record';
  398. app.$get(str, data).then((res) => {
  399. var data = res.data.data.list;
  400. if (that.data.page == 1) { this.setData({ list: [] }) }
  401. var list = that.data.list;
  402. if (is) {
  403. if (data.length < 20) {
  404. this.setData({ list: list.concat(data), isData: true })
  405. } else {
  406. this.setData({ list: list.concat(data) })
  407. }
  408. } else {
  409. this.setData({
  410. list: data,
  411. isData: false
  412. })
  413. }
  414. })
  415. },
  416. activeItem(e) {
  417. this.setData({ department_index: e.detail.value })
  418. this.isShow()
  419. },
  420. activeItem2(e) {
  421. this.setData({ levels_index: e.detail.value })
  422. this.isShow()
  423. },
  424. tabAction(e) {
  425. this.setData({
  426. tabIndex: e.target.dataset.index
  427. })
  428. if (e.target.dataset.index == 1) {
  429. setTimeout(() => {
  430. this.statmentAnalysesPie();
  431. }, 500)
  432. } else {
  433. setTimeout(() => {
  434. this.statmentAnalysesBar();
  435. }, 500)
  436. }
  437. },
  438. onChange(e) {
  439. console.log(e.detail.value);
  440. },
  441. //选择弹窗
  442. openSelect(e) {
  443. animation.translateY(0).step();
  444. that.setData({
  445. isShowType: true,
  446. animationInfo: animation.export(),
  447. popupCx: 'container__mask',
  448. });
  449. },
  450. //关闭规则
  451. onClose() {
  452. animation.translateY(1200).step();
  453. that.setData({
  454. isShowType: false,
  455. animationInfo: animation.export(),
  456. popupCx: '',
  457. });
  458. },
  459. onSelectItem(e) {
  460. that.setData({
  461. defaultRuleId: e.id,
  462. jxName: e.name,
  463. selectPftiData: e
  464. });
  465. this.statisticalPeople();
  466. },
  467. });