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. item.name=app.globalData.usersList[item.id].name
  93. arr.push(item);
  94. }
  95. });
  96. this.setData({
  97. jxUserList: arr
  98. })
  99. },
  100. isQualified(item) {
  101. let deptId = this.data.department_list[this.data.department_index].value
  102. let level = this.data.levels_list[this.data.levels_index].value
  103. if (deptId == 0 && level == '-') {
  104. return true;
  105. }
  106. let isDept = false,
  107. isLevel = false;
  108. if (deptId != 0) {
  109. item.departments.some(e => {
  110. if (e.id == deptId) {
  111. isDept = true;
  112. return true;
  113. }
  114. });
  115. }
  116. if (item.level == level || level == '-') {
  117. isLevel = true;
  118. }
  119. if (deptId == 0) {
  120. isDept = true;
  121. }
  122. return isDept && isLevel;
  123. },
  124. statisticalPeople() {
  125. this.setData({
  126. department_index: 0,
  127. levels_index: 0,
  128. })
  129. let params = {
  130. package_id: this.data.defaultRuleId,
  131. };
  132. app.$get('api/per/package/info_v3_aid', params).then(res => {
  133. if (res.data.code == 1) {
  134. this.skeletonLoad = false;
  135. let data = res.data.data.statistics;
  136. let list = this.data.statementHnList;
  137. let theOf = this.data.theProgressOf;
  138. let all = 0
  139. for (let i in data) {
  140. all += data[i]
  141. }
  142. list[0].num = all; // 参与人数
  143. list[1].num = data[1]; // 目标制定
  144. list[2].num = data[2]; // 目标确认
  145. list[3].num = data[3]; // 执行中
  146. list[4].num = data[4]; // 结果值录入
  147. list[5].num = data[5]; // 评分
  148. list[6].num = data[9]; // 审批
  149. list[7].num = data[11]; // 结束
  150. theOf.complete = data[11]; // 已完成人数
  151. theOf.theTotalNum = all; // 总人数
  152. let rate = (theOf.complete / theOf.theTotalNum) * 100; // 进度条百分比
  153. if (!isNaN(rate)) {
  154. this.setData({// 进度条百分比
  155. rate: rate.toFixed(2),
  156. })
  157. }
  158. this.setData({// 进度条百分比
  159. theProgressOf: theOf, //考核进度
  160. statementHnList: list
  161. })
  162. //部门筛选
  163. let other = res.data.data.other
  164. let department_list = other.department_list;
  165. department_list.forEach(item => {
  166. item.text = item.dep_name;
  167. item.value = item.id;
  168. });
  169. department_list.unshift({ text: '全部部门', value: 0 });
  170. this.setData({// 部门筛选
  171. department_list: department_list,
  172. })
  173. //等级筛选
  174. let levels = other.levels;
  175. if (levels.indexOf('无等级') == -1) {
  176. levels.push('无等级')
  177. }
  178. levels = levels.map(item => {
  179. return { text: item, value: item };
  180. });
  181. levels.unshift({ text: '全部等级', value: '-' });
  182. this.setData({// 等级筛选
  183. levels_list: levels,
  184. })
  185. let departMent = other.department;
  186. // this.deptMentList = departMent;
  187. // 考核人数分析
  188. let deptList = [];
  189. let assPeopleFx = [];
  190. departMent.forEach(item => {
  191. // echarts数据
  192. assPeopleFx.push({
  193. year: item[0].dep_name,
  194. sales: item.length
  195. })
  196. // 列表
  197. let arr = {};
  198. arr.name = item[0].dep_name;
  199. arr.tak = item.length;
  200. arr.id = [item[0].id]
  201. let employ = [];
  202. item.forEach(arr => {
  203. employ.push(arr.employee_id);
  204. });
  205. deptList.push(arr);
  206. });
  207. this.setData({// 考核人数列表
  208. statementperson: deptList,
  209. assPeopleFx: assPeopleFx,
  210. })
  211. // 结果分析
  212. let statistics = other.statistics;
  213. let theResultsOfNum = [];
  214. let PieProps = 0;
  215. for (let i in statistics) {
  216. theResultsOfNum.push({
  217. name: i == 'empty' ? '无等级' : i,
  218. percent: '',
  219. num: statistics[i].length,
  220. a: '1'
  221. })
  222. PieProps += statistics[i].length;
  223. }
  224. theResultsOfNum.forEach(item => {//设置百分比
  225. let bfb = (Math.round(item.num / PieProps * 10000) / 100.00);
  226. if (bfb !== bfb) { bfb = 0; };
  227. item.percent = bfb
  228. })
  229. this.setData({// 总人数
  230. PieProps: PieProps,
  231. theResultsOfNum: theResultsOfNum
  232. })
  233. if (this.data.tabIndex == 1) {
  234. this.statmentAnalysesPie();
  235. } else {
  236. this.statmentAnalysesBar()
  237. }
  238. let theResultsOfList = [];
  239. res.data.data.employees.forEach(item => {
  240. let data = {
  241. id: item.id,
  242. name: item.name,
  243. level: item.final_level == '' ? '无等级' : item.final_level,
  244. point: item.final_point,
  245. departments: []
  246. }
  247. res.data.data.other.department.forEach(x => {
  248. let arr = x.filter(y => item.id == y.employee_id)
  249. if (arr[0]) {
  250. data.departments.push(arr[0])
  251. }
  252. })
  253. theResultsOfList.push(data)
  254. })
  255. theResultsOfList.sort(function (a, b) {
  256. if (Number(a.point) < Number(b.point)) {
  257. return 1;
  258. } else {
  259. return -1;
  260. }
  261. });
  262. this.setData({
  263. allStatementResult: theResultsOfList
  264. })
  265. this.isShow();
  266. }
  267. })
  268. },
  269. // 柱状图
  270. statmentAnalysesBar() {
  271. chart2.changeData(this.data.assPeopleFx)
  272. },
  273. // 饼图
  274. statmentAnalysesPie() {
  275. const data = this.data.theResultsOfNum;
  276. const map = [];
  277. data.forEach(function (obj) {
  278. map[obj.name] = obj.num + '人 ' + obj.percent + '%'
  279. });
  280. chart1.legend({
  281. position: 'right',
  282. itemFormatter: function itemFormatter(val) {
  283. return val + ' ' + map[val];
  284. }
  285. });
  286. chart1.changeData(data)
  287. },
  288. getRange() {
  289. app.$get("api/per/package/list", { page: 0, is_manage_scope: 1 }).then((res) => {
  290. let obj = res.data.data.list;
  291. let arr = [
  292. { name: '月度', id: 2, list: [] },
  293. { name: '日', id: 1, list: [] },
  294. { name: '季度', id: 3, list: [] },
  295. { name: '半年度', id: 4, list: [] },
  296. { name: '年度', id: 5, list: [] },
  297. { name: '自定义', id: 6, list: [] }
  298. ];
  299. obj.forEach(item => {
  300. arr.forEach(item2 => {
  301. if (item2.id == item.cycle_type) {
  302. item2.list.push(item);
  303. }
  304. });
  305. });
  306. let data = arr;
  307. let list = [];
  308. data.forEach(item => {
  309. if (item.list.length > 0) {
  310. list.push(item);
  311. }
  312. });
  313. list.some(item => {
  314. if (item.list.length > 0) {
  315. obj = item.list
  316. return true;
  317. }
  318. });
  319. that.setData({
  320. selectPftiData:obj[0],
  321. defaultRuleId: obj[0].id,
  322. jxName: obj[0].name,
  323. })
  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. });