statistics.js 12 KB

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