taskStatistical.js 9.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394
  1. var app = getApp()
  2. var that;
  3. var animation;
  4. var setTime;
  5. var chart1;
  6. var chart2;
  7. Page({
  8. data: {
  9. animationInfo: '',
  10. showStaff: true,
  11. date: app.globalData.month,
  12. names: '',
  13. users: [],
  14. isAdministrator: true,//是否管理者
  15. isAllChecked: false,
  16. popupCx: '',
  17. start_date: '',
  18. end_date: '',
  19. result: {},
  20. isBh:'4',
  21. setECharts: [],//柱形图数据
  22. bfb: '0',//一图百分比
  23. sum: 0,
  24. },
  25. onLoad() {
  26. that = this;
  27. chart1, chart2 = '';
  28. dd.setNavigationBar({ title: "任务统计" });
  29. this.init();
  30. this.getMonth();//设置日期
  31. },
  32. // 页面被关闭
  33. onUnload() {
  34. app.globalData.socketApi.closewebsocket();
  35. },
  36. onShow() {
  37. animation = dd.createAnimation({
  38. duration: 200,
  39. timeFunction: "linear",
  40. });
  41. if(this.data.isAllChecked){
  42. this.opneWebSocket(true)
  43. return false
  44. }
  45. this.opneWebSocket()
  46. },
  47. showText(e) {
  48. let index = e.target.dataset.index;
  49. if(index=='5'){
  50. that.setData({
  51. start_date2: that.data.start_date,
  52. end_date2: that.data.end_date,
  53. })
  54. }
  55. this.setData({ isBh: index })
  56. },
  57. init() {
  58. let manage_scope = app.globalData.userData.employee_detail.manage_scope;
  59. let names = '';
  60. let users = [];
  61. let isAdministrator = true;//是否员工
  62. if (manage_scope.length > 0) {
  63. isAdministrator = true;
  64. manage_scope.forEach((item,index) => {
  65. if((index+1)!=manage_scope.length){
  66. names += item.name + ',';
  67. }else{
  68. names += item.name
  69. }
  70. users.push(item)
  71. })
  72. } else {
  73. isAdministrator = false;
  74. names = app.globalData.userData.name;
  75. users = [app.globalData.userData];
  76. }
  77. this.setData({
  78. names: names,
  79. users: users,
  80. isAdministrator: isAdministrator
  81. })
  82. },
  83. openUrl(e) {
  84. let index = e.target.dataset.index;
  85. let method = 'expiredList';
  86. if (index == '1') {
  87. method = 'expiredList';
  88. } else if (index == '2') {
  89. method = 'todayExpireList';
  90. } else if (index == '3') {
  91. method = 'doingList';
  92. } else {
  93. method = 'reviewingList';
  94. }
  95. let target = [];
  96. if (this.data.isAllChecked) {
  97. target = [app.globalData.userData.id]
  98. } else {
  99. target = this.data.users.map(item => {
  100. return item.id;
  101. })
  102. }
  103. let data = {
  104. type: 'task_statistics',
  105. start_date: this.data.start_date,
  106. end_date: this.data.end_date,
  107. target: target,
  108. method: method,
  109. index: index,
  110. page: 1,
  111. page_size: 100
  112. }
  113. dd.navigateTo({
  114. url: '../taskSList/taskSList?data=' + JSON.stringify(data)
  115. })
  116. },
  117. onInitChart(F2, config) {
  118. const data = [{
  119. x: '1',
  120. y: 0
  121. }];
  122. chart1 = new F2.Chart(config);
  123. chart1.source(data, { y: { max: 100, min: 0 } });
  124. chart1.axis(false);
  125. chart1.tooltip(false);
  126. chart1.coord('polar', {
  127. transposed: true,
  128. innerRadius: 1.2,
  129. radius: 0.85
  130. });
  131. chart1.guide().arc({
  132. start: [0, 0],
  133. end: [1, 99.98],
  134. top: false,
  135. style: {
  136. lineWidth: 20,
  137. stroke: '#ccc'
  138. }
  139. });
  140. chart1.interval().position('x*y').size(20).animate({
  141. appear: {
  142. duration: 1200,
  143. easing: 'cubicIn'
  144. }
  145. });
  146. chart1.render();
  147. },
  148. onInitChart2(F2, config) {
  149. const data = [];
  150. chart2 = new F2.Chart(config);
  151. chart2.source(data, {
  152. percent: {
  153. formatter: function formatter(val) {
  154. return val * 100 + '%';
  155. }
  156. }
  157. });
  158. chart2.tooltip(false);
  159. chart2.coord('polar', {
  160. transposed: true,
  161. radius: 0.85
  162. });
  163. chart2.axis(false);
  164. chart2.interval()
  165. .position('a*percent')
  166. .color('name', ['#1890FF', '#F56C6C', '#2FC25B', '#FACC14', '#F04864', '#8543E0'])
  167. .adjust('stack')
  168. .style({
  169. lineWidth: 1,
  170. stroke: '#fff',
  171. lineJoin: 'round',
  172. lineCap: 'round'
  173. })
  174. .animate({
  175. appear: {
  176. duration: 1200,
  177. easing: 'bounceOut'
  178. }
  179. });
  180. chart2.render();
  181. },
  182. ruleActiveAll(e) {
  183. this.setData({
  184. isAllChecked: e.detail.value
  185. })
  186. if (e.detail.value) {
  187. this.opneWebSocket(true);
  188. } else {
  189. this.opneWebSocket();
  190. }
  191. },
  192. tsTamp(ydm) {
  193. return new Date(ydm).getTime()
  194. },
  195. opneWebSocket(is) {
  196. let timeC = (this.tsTamp(this.data.start_date) - this.tsTamp(this.data.end_date)) / (60 * 60 * 24 * 1000)
  197. if (timeC > 0) {
  198. app.globalData.showToast("开始时间不能大于结束时间")
  199. return
  200. }
  201. dd.showLoading({
  202. content: '加载中...',
  203. });
  204. setTimeout(() => {
  205. dd.hideLoading();
  206. }, 600)
  207. let target = this.data.users.map(item => {
  208. return item.id;
  209. })
  210. let data = {
  211. type: 'task_statistics',
  212. start_date: this.data.start_date,
  213. end_date: this.data.end_date,
  214. target: is ? [app.globalData.userData.id] : target
  215. }
  216. app.globalData.socketApi.sendData(data, this.onmessageWS);
  217. },
  218. onmessageWS(e) {
  219. // 因为作用域问题,这个函数不能使用this
  220. if (e.type == 'task_statistics') {
  221. let result = e.result;
  222. that.setData({
  223. result: result,
  224. })
  225. setTimeout(() => {
  226. that.setChart(result)
  227. }, 600)
  228. }
  229. },
  230. setChart(result) {
  231. // 图像一
  232. // result.complete={
  233. // done:50,
  234. // all:60,
  235. // ahead:40,
  236. // expired:90,
  237. // }
  238. let bfb = (Math.round(result.complete.done / result.complete.all * 10000) / 100.00);
  239. if (bfb !== bfb) { bfb = 0; };
  240. if(result.complete.done > result.complete.all){
  241. const setECharts = [{ x: '1', y: 100 }];
  242. that.setData({
  243. bfb: 100
  244. })
  245. chart1.changeData(setECharts)
  246. }else{
  247. const setECharts = [{ x: '1', y: bfb }];
  248. chart1.changeData(setECharts)
  249. that.setData({
  250. bfb: bfb
  251. })
  252. }
  253. // 图像二
  254. let complete = result.complete
  255. let sum = complete.ahead + complete.expired;
  256. let ahead = (Math.round(complete.ahead / sum * 10000) / 100.00);
  257. let expired = (Math.round(complete.expired / sum * 10000) / 100.00);
  258. const data = [{
  259. name: '按时完成',
  260. percent: ahead !== ahead ? 0 : ahead,
  261. num: complete.ahead,
  262. a: '1'
  263. }, {
  264. name: '逾期完成',
  265. percent: expired !== expired ? 0 : expired,
  266. num: complete.expired,
  267. a: '1'
  268. }];
  269. const map = [];
  270. data.forEach(function (obj) {
  271. map[obj.name] = obj.num + '项 ' + obj.percent + '%';
  272. });
  273. chart2.legend({
  274. position: 'right',
  275. itemFormatter: function itemFormatter(val) {
  276. return val + ' ' + map[val];
  277. }
  278. });
  279. chart2.changeData(data)
  280. },
  281. //选择弹窗
  282. openSelect() {
  283. that.setData({ showStaff: false });
  284. if (this.data.isAllChecked) {
  285. return false
  286. }
  287. animation.translateY(0).step();
  288. that.setData({
  289. showStaff: true,
  290. popupCx: 'container__mask',
  291. animationInfo: animation.export()
  292. });
  293. },
  294. //关闭规则
  295. onClose() {
  296. animation.translateY(1200).step();
  297. that.setData({
  298. popupCx: '',
  299. showStaff: false,
  300. animationInfo: animation.export()
  301. });
  302. },
  303. //时间选择
  304. openDate(e) {
  305. let num = e.target.dataset.num
  306. let date = num == '1' ? that.data.start_date : that.data.end_date
  307. dd.datePicker({
  308. format: 'yyyy-MM-dd',
  309. currentDate: date,
  310. success: (res) => {
  311. if (res.date) {
  312. if (num == '1') {
  313. that.setData({
  314. start_date2: res.date,
  315. })
  316. } else {
  317. that.setData({
  318. end_date2: res.date,
  319. })
  320. }
  321. }
  322. }
  323. });
  324. },
  325. qrDate(){
  326. that.setData({
  327. start_date: that.data.start_date2,
  328. end_date: that.data.end_date2,
  329. isBh: "4"
  330. })
  331. if (that.data.isAllChecked) {
  332. that.opneWebSocket(true);
  333. } else {
  334. that.opneWebSocket();
  335. }
  336. },
  337. //选择员工
  338. onSelectUser(data) {
  339. let names = '', users = [];
  340. data.forEach((item,index) => {
  341. if((index+1)!=data.length){
  342. names += item.name + ',';
  343. }else{
  344. names += item.name
  345. }
  346. users.push(item);
  347. })
  348. this.setData({
  349. names: names,
  350. users: users,
  351. })
  352. this.opneWebSocket()
  353. },
  354. getMonth() {
  355. // 获取当前月的第一天
  356. var start = new Date();
  357. start.setDate(1);
  358. // 获取当前月的最后一天
  359. var date = new Date();
  360. var currentMonth = date.getMonth();
  361. var nextMonth = ++currentMonth;
  362. var nextMonthFirstDay = new Date(date.getFullYear(), nextMonth, 1);
  363. var oneDay = 1000 * 60 * 60 * 24;
  364. var end = new Date(nextMonthFirstDay - oneDay);
  365. var startDate = this.transferDate(start); // 日期变换
  366. var endDate = this.transferDate(end); // 日期变换
  367. this.setData({
  368. start_date: startDate,
  369. end_date: endDate
  370. })
  371. // return startDate + ' - ' + endDate;
  372. },
  373. transferDate(date) {
  374. // 年
  375. var year = date.getFullYear();
  376. // 月
  377. var month = date.getMonth() + 1;
  378. // 日
  379. var day = date.getDate();
  380. if (month >= 1 && month <= 9) {
  381. month = "0" + month;
  382. }
  383. if (day >= 0 && day <= 9) {
  384. day = "0" + day;
  385. }
  386. var dateString = year + '-' + month + '-' + day;
  387. return dateString;
  388. }
  389. });