main.1.js 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571
  1. $(function () {
  2. ajax.loadProgram();
  3. var time = 0;
  4. $(".right-box-bottom").scroll(function (e) {
  5. e.preventDefault();
  6. });
  7. $("#video").on("timeupdate", function (e) {
  8. if(time === 0) return time++
  9. canvas.linemove(this.currentTime);
  10. });
  11. $("#addHere").on("click", ".column", function () {
  12. if ($(this).hasClass("act")) return;
  13. var index = $(this).attr("index");
  14. var item = ajax.column && ajax.column.length ? ajax.column[index] : {};
  15. $(".act").removeClass("act");
  16. $(this).addClass("act");
  17. $("#video").attr("src", item.url);
  18. ajax.loaddata(item.dataUrl);
  19. });
  20. $("#channelUl .li").on("click", function () {
  21. if (ajax.channelName === $(this).text()) return;
  22. $("#channelNameshow").text($(this).text());
  23. ajax.channelName = $(this).text();
  24. views.createColumn(ajax.column);
  25. $(".actSelect").removeClass("actSelect");
  26. $(this).addClass("actSelect");
  27. var item = {};
  28. for (var i = 0; i < ajax.column.length; i++) {
  29. var v = ajax.column[i];
  30. if (ajax.channelName === v.channelName) {
  31. item = v;
  32. break;
  33. }
  34. }
  35. $("#video").attr("src", item.url);
  36. ajax.loaddata(item.dataUrl);
  37. });
  38. });
  39. var ssss;
  40. var myChart;
  41. var load;
  42. var ajax = {
  43. domain: "https://djweb.smcic.net",
  44. Irdata: [],
  45. Icdata: [],
  46. column: [],
  47. channelList: [],
  48. // 存放code
  49. areaId: null,
  50. programTypeCode: null,
  51. // 存放code结束
  52. audienceRating: [],
  53. timeAll: [],
  54. AllDate: [],
  55. loaddata: function (api) {
  56. var that = this;
  57. load = true;
  58. var programId = $("#programName").attr("programid");
  59. $.ajax({
  60. type: "get",
  61. async: true,
  62. data: {
  63. programId: programId,
  64. },
  65. url: api,
  66. cache: false,
  67. dataType: "json",
  68. success: function (json) {
  69. that.Irdata = [];
  70. that.Icdata = [];
  71. that.audienceRating = [];
  72. that.timeAll = [];
  73. that.AllDate = [];
  74. for (var i in json.data) {
  75. that.AllDate.push(json.data[i]);
  76. that.timeAll.push(Tool.timeformate(i));
  77. that.Irdata.push(json.data[i].lr);
  78. that.Icdata.push(-1 * json.data[i].lc);
  79. that.audienceRating.push(
  80. Tool.accMul(json.data[i].audienceRating, 100)
  81. );
  82. }
  83. ssss = that.timeAll[0];
  84. canvas.startpercen = 0;
  85. canvas.endpercen = 6.8;
  86. canvas.draw();
  87. load = false;
  88. },
  89. });
  90. },
  91. locationClick: function () {
  92. var that = this;
  93. $("#LocationUl li ").on("click", function () {
  94. $("#locationName").text($(this).text());
  95. $("#locationName").attr("areaId", $(this).attr("areaId"));
  96. });
  97. },
  98. typeClick: function () {
  99. var that = this;
  100. $("#typeUl li").on("click", function () {
  101. $("#typeName").text($(this).text());
  102. $("#typeName").attr("programTypeCode", $(this).attr("programTypeCode"));
  103. that.loadProgram();
  104. });
  105. },
  106. loadProgram: function () {
  107. var that = this;
  108. $.ajax({
  109. type: "get",
  110. // type: "POST",
  111. async: false,
  112. url: that.domain + "/data/program.json",
  113. data: {},
  114. cache: false,
  115. dataType: "json",
  116. success: function (json) {
  117. // $("#programUl").empty();
  118. // if (!json.data.length) return $("#programName").text("暂无数据");
  119. ajax.column = json.data || [];
  120. if (!ajax.column.length) return;
  121. $("#channelNameshow").text(ajax.column[0].channelName);
  122. $("#channelName").text(ajax.column[0].channelName);
  123. var channel = {};
  124. that.channelName = ajax.column[0].channelName;
  125. for (var i = 0; i < ajax.column.length; i++) {
  126. var v = json.data[i];
  127. if (!channel[v.channelName]) {
  128. ajax.channelList.push(v.channelName);
  129. channel[v.channelName] = true;
  130. }
  131. continue;
  132. }
  133. views.createChannel(ajax.channelList);
  134. views.createColumn(ajax.column);
  135. $("#video").attr("src", ajax.column[0].url);
  136. ajax.loaddata(ajax.column[0].dataUrl);
  137. },
  138. });
  139. },
  140. programClick: function () {
  141. var that = this;
  142. $("#programUl li").on("click", function () {
  143. $("#programName").text($(this).text());
  144. $("#programName").attr("programId", $(this).attr("programId"));
  145. $("#programName").attr("endTime", $(this).attr("endTime"));
  146. $("#programName").attr("startTime", $(this).attr("startTime"));
  147. $("#programName").attr("url", $(this).attr("playPath"));
  148. $("#video").attr("src", $(this).attr("url"));
  149. });
  150. },
  151. };
  152. var views = {
  153. createChannel: function (list) {
  154. $("#channelUl").empty();
  155. // $("#channelUl").append('<li class="li">' + list[0] + "</li>");
  156. for (var i = 0; i < list.length; i++) {
  157. var v = list[i];
  158. if (i === 0) {
  159. $("#channelUl").append('<div class="li actSelect">' + v + "</div>");
  160. } else {
  161. $("#channelUl").append('<div class="li">' + v + "</div>");
  162. }
  163. }
  164. },
  165. createColumn: function (list) {
  166. var select = -1;
  167. $("#addHere").empty();
  168. for (var i = 0; i < list.length; i++) {
  169. var v = list[i];
  170. if (ajax.channelName !== v.channelName) continue;
  171. select++;
  172. var className = "right-box-bottom-header column";
  173. select === 0 && (className += " act");
  174. var div =
  175. '<div index="' +
  176. i +
  177. '" class="' +
  178. className +
  179. '">' +
  180. '<span class="header-left"><div class="selectAct"></div>' +
  181. v.startTime +
  182. "</span>" +
  183. '<span class="header-middle">' +
  184. v.content +
  185. "</span>" +
  186. '<div class="header-right progressbox">' +
  187. "<p>" +
  188. v.audienceRating +
  189. "%</p>" +
  190. '<div class="progress">' +
  191. '<div style="width: ' +
  192. v.audienceRating +
  193. '%;" class="progressline"></div>' +
  194. "</div>" +
  195. "</div>" +
  196. "</div>";
  197. $("#addHere").append(div);
  198. }
  199. },
  200. };
  201. var canvas = {
  202. startpercen: 0,
  203. endpercen: 6.8,
  204. fixendpercen: 6.8,
  205. startTime: null,
  206. endTime: null,
  207. pagenum: 1,
  208. innernowdata: null,
  209. linemove: function (nowdate) {
  210. // return;
  211. if (!ajax.AllDate || !ajax.AllDate.length || load) return;
  212. var nowsecend = Math.floor(nowdate + Tool.tosecond(ssss));
  213. var h =
  214. Math.floor((nowsecend / 60 / 60) % 24) < 10
  215. ? "0" + Math.floor((nowsecend / 60 / 60) % 24)
  216. : Math.floor((nowsecend / 60 / 60) % 24);
  217. var m =
  218. Math.floor((nowsecend / 60) % 60) < 10
  219. ? "0" + Math.floor((nowsecend / 60) % 60)
  220. : Math.floor((nowsecend / 60) % 60);
  221. var s =
  222. Math.floor(nowsecend % 60) < 10
  223. ? "0" + Math.floor(nowsecend % 60)
  224. : Math.floor(nowsecend % 60);
  225. var allDate = ajax.AllDate[Math.floor(nowdate)] || {};
  226. var programGroup = allDate.programGroup || {};
  227. var lrTop = allDate.lrTop || {};
  228. var lcTop = allDate.lcTop || {};
  229. $("#ys").text(programGroup.CCTV) || "";
  230. $("#ws").text(programGroup.satellite) || "";
  231. $("#sj").text(programGroup.provincial) || "";
  232. $("#dm").text(programGroup.ground) || "";
  233. $("#qt").text(programGroup.other) || "";
  234. $("#no1").text(lrTop.No1 || "");
  235. $("#no2").text(lrTop.No2 || "");
  236. $("#no3").text(lrTop.No3 || "");
  237. $("#no4").text(lrTop.No4 || "");
  238. $("#no5").text(lrTop.No5 || "");
  239. $("#lcno1").text(lcTop.No1 || "");
  240. $("#lcno2").text(lcTop.No2 || "");
  241. $("#lcno3").text(lcTop.No3 || "");
  242. $("#lcno4").text(lcTop.No4 || "");
  243. $("#lcno5").text(lcTop.No5 || "");
  244. $("#now").text("当前时间:" + h + ":" + m + ":" + s);
  245. let p = Tool.accMul(allDate.audienceRating, 100);
  246. $("#sslnum").text(p.toFixed(2) + "%");
  247. var start = Tool.tosecond(this.startTime);
  248. var end = Tool.tosecond(this.endTime);
  249. var cha = end - start;
  250. // if (nowdate > 0 && nowdate % cha == 0) {
  251. // this.pagenum = Math.floor(nowdate / cha);
  252. // } else {
  253. // this.pagenum = Math.floor(nowdate / cha) + 1;
  254. // }
  255. // Tool.tosecond(this.endTime) - Tool.tosecond(ssss) < nowdate ||
  256. // start - Tool.tosecond(ssss) > nowdate
  257. if (nowsecend < start || end <= nowsecend) {
  258. var video = $("#video")[0];
  259. this.startpercen = (video.currentTime / video.duration) * 100;
  260. this.endpercen = this.startpercen + this.fixendpercen;
  261. this.draw();
  262. $("#line").css({
  263. // "left": 500 * ((nowdate % cha) / cha) //比例乘以步长
  264. // "left": Tool.accMul((Math.round(nowdate) % cha) / cha, 500) //比例乘以步长
  265. left: "0%", //比例乘以步长
  266. });
  267. return;
  268. }
  269. // var step =
  270. // ($("#linebox").innerWidth() * (Tool.tosecond(ssss) + nowdate - start)) /
  271. // cha;
  272. // var t =
  273. // nowdate -
  274. // (new Date("2021-01-01 " + this.startTime) -
  275. // new Date("2021-01-01 " + ssss));
  276. $("#line").css({
  277. // "left": 500 * ((nowdate % cha) / cha) //比例乘以步长
  278. // "left": Tool.accMul((Math.round(nowdate) % cha) / cha, 500) //比例乘以步长
  279. left: ((nowsecend - start) / cha) * 100 + "%", //比例乘以步长
  280. });
  281. },
  282. draw: function () {
  283. //流出/流入/收视率
  284. if(myChart) myChart.dispose();
  285. myChart = echarts.init(document.getElementById("main"));
  286. option = {
  287. dataZoom: [
  288. {
  289. maxSpan: 10,
  290. minSpan: 10,
  291. type: "slider",
  292. show: true,
  293. realtime: true,
  294. start: canvas.startpercen,
  295. end: canvas.endpercen,
  296. zoomOnMouseWheel: false,
  297. height: "30",
  298. top: "85%",
  299. handleIcon:
  300. "M10.7,11.9v-1.3H9.3v1.3c-4.9,0.3-8.8,4.4-8.8,9.4c0,5,3.9,9.1,8.8,9.4v1.3h1.3v-1.3c4.9-0.3,8.8-4.4,8.8-9.4C19.5,16.3,15.6,12.2,10.7,11.9z M13.3,24.4H6.7V23h6.6V24.4z M13.3,19.6H6.7v-1.4h6.6V19.6z",
  301. handleSize: 15,
  302. textStyle: {
  303. color: "#c5c6cc",
  304. },
  305. dataBackground: {
  306. lineStyle: {
  307. color: "#fff",
  308. },
  309. areaStyle: {
  310. color: "#8b51a8",
  311. },
  312. },
  313. },
  314. ],
  315. legend: {
  316. show: false,
  317. data: ["流入", "流出", "收视率%"],
  318. left: "center",
  319. textStyle: {
  320. color: "#000000",
  321. fontSize: 12,
  322. },
  323. },
  324. xAxis: {
  325. data: ajax.timeAll,
  326. position: "top",
  327. silent: false,
  328. axisLine: {
  329. onZero: true,
  330. },
  331. splitLine: {
  332. show: false,
  333. },
  334. splitArea: {
  335. show: false,
  336. },
  337. axisTick: {
  338. show: false,
  339. },
  340. axisLabel: {
  341. interval: "auto",
  342. textStyle: {
  343. color: "#c5c6cc",
  344. },
  345. rotate: "-90",
  346. },
  347. },
  348. yAxis: [
  349. {
  350. scale: false,
  351. nameGap: 6,
  352. inverse: false,
  353. name: "流入流出",
  354. nameLocation: "start",
  355. splitArea: {
  356. show: false,
  357. },
  358. splitLine: {
  359. show: false,
  360. },
  361. axisLabel: {
  362. textStyle: {
  363. color: "#c5c6cc",
  364. },
  365. formatter: function (value, index) {
  366. let v = value;
  367. if (v < 0) v *= -1;
  368. return v;
  369. },
  370. },
  371. axisTick: {
  372. show: false,
  373. },
  374. axisLine: {
  375. show: false,
  376. },
  377. nameTextStyle: {
  378. color: "#c5c6cc",
  379. },
  380. },
  381. {
  382. scale: true,
  383. nameGap: 6,
  384. type: "value",
  385. name: "收视率%",
  386. nameLocation: "start",
  387. splitLine: {
  388. show: false,
  389. },
  390. axisTick: {
  391. show: false,
  392. },
  393. axisLine: {
  394. show: false,
  395. },
  396. axisLabel: {
  397. textStyle: {
  398. color: "#c5c6cc",
  399. },
  400. },
  401. nameTextStyle: {
  402. color: "#c5c6cc",
  403. },
  404. },
  405. ],
  406. grid: {},
  407. series: [
  408. {
  409. name: "流入",
  410. type: "bar",
  411. yAxisIndex: 0,
  412. stack: "one",
  413. data: ajax.Irdata,
  414. itemStyle: {
  415. normal: {
  416. color: "#df5a5a",
  417. },
  418. },
  419. },
  420. {
  421. name: "流出",
  422. type: "bar",
  423. yAxisIndex: 0,
  424. stack: "one",
  425. data: ajax.Icdata,
  426. itemStyle: {
  427. normal: {
  428. color: "#6ab581",
  429. },
  430. },
  431. },
  432. {
  433. name: "收视率%",
  434. type: "line",
  435. yAxisIndex: 1,
  436. smooth: true,
  437. showSymbol: false,
  438. data: ajax.audienceRating,
  439. lineStyle: {
  440. width: 1,
  441. color: "#50abfd",
  442. },
  443. },
  444. ],
  445. };
  446. myChart.setOption(option);
  447. window.onresize = myChart.resize;
  448. var xAxis = myChart.getModel().option.xAxis
  449. ? myChart.getModel().option.xAxis[0]
  450. : { data: [] };
  451. var len = xAxis.data.length;
  452. var video = $("#video")[0];
  453. // if(load) video.currentTime = 0;
  454. var e =
  455. canvas.endpercen > 100
  456. ? len - 1
  457. : Math.floor((canvas.endpercen / 100) * (len - 1));
  458. canvas.startTime = xAxis.data[Math.floor(video.currentTime)];
  459. canvas.endTime = xAxis.data[e];
  460. if (e >= len - 1) {
  461. canvas.startTime =
  462. xAxis.data[e - Math.ceil((len * canvas.fixendpercen) / 100)];
  463. }
  464. if (Math.floor(video.currentTime) === 0) {
  465. canvas.endTime = xAxis.data[Math.ceil((len * canvas.fixendpercen) / 100)];
  466. }
  467. myChart.on("datazoom", function (params) {
  468. this.setOption({ animation: false });
  469. var xAxis = myChart.getModel().option.xAxis
  470. ? myChart.getModel().option.xAxis[0]
  471. : { data: [] };
  472. var len = (xAxis.data || []).length - 1;
  473. canvas.startTime = xAxis.data[Math.floor((params.start / 100) * len)];
  474. canvas.endTime = xAxis.data[Math.floor((params.end / 100) * len)];
  475. if (Math.round(params.end - params.start) == canvas.fixendpercen) {
  476. //移动
  477. $("#line").css({
  478. left: 0, //比例乘以步长
  479. });
  480. } else {
  481. //拉伸
  482. canvas.fixendpercen = Math.round(params.end - params.start);
  483. }
  484. //改变
  485. var myVid = document.getElementsByClassName("video")[0];
  486. myVid.currentTime = Tool.tosecond(canvas.startTime) - Tool.tosecond(ssss);
  487. canvas.linemove(myVid.currentTime);
  488. });
  489. },
  490. };
  491. // 工具类
  492. var Tool = {
  493. timeformate: function (times) {
  494. //传时间戳 2017-02-02 00:00:00 返回 00:00:00
  495. var time = new Date(times);
  496. hours = time.getHours() < 10 ? "0" + time.getHours() : time.getHours();
  497. minutes =
  498. time.getMinutes() < 10 ? "0" + time.getMinutes() : time.getMinutes();
  499. seconds =
  500. time.getSeconds() < 10 ? "0" + time.getSeconds() : time.getSeconds();
  501. date = hours + ":" + minutes + ":" + seconds;
  502. return date;
  503. },
  504. toTime: function () {
  505. //转换成 2017-09-09
  506. var date = new Date("2017-06-05");
  507. var year = date.getFullYear();
  508. var month =
  509. date.getMonth() + 1 < 10
  510. ? "0" + (date.getMonth() + 1)
  511. : date.getMonth() + 1;
  512. var day = date.getDate() < 10 ? "0" + date.getDate() : date.getDate();
  513. var hour = date.getHours() < 10 ? "0" + date.getHours() : date.getHours();
  514. var min =
  515. date.getMinutes() < 10 ? "0" + date.getMinutes() : date.getMinutes();
  516. var second =
  517. date.getSeconds() < 10 ? "0" + date.getSeconds() : date.getSeconds();
  518. return (
  519. year + "-" + month + "-" + day + " " + hour + ":" + min + ":" + second
  520. );
  521. },
  522. tosecond: function (time) {
  523. //传入00:00:00 导出 多少秒
  524. if (!time) return "";
  525. var arr = time.split(":");
  526. var time =
  527. parseInt(arr[0] * 60 * 60) + parseInt(arr[1] * 60) + parseInt(arr[2]);
  528. return time;
  529. },
  530. toCH: function (time) {
  531. //输入2014-01-01 转换成2014年01月01日
  532. return (
  533. time.split("-")[0] + "年" + time.split("-")[1] + "月" + time.split("-")[2]
  534. );
  535. },
  536. accMul: function (arg1, arg2) {
  537. var m = 0,
  538. s1 = arg1.toString(),
  539. s2 = arg2.toString();
  540. try {
  541. m += s1.split(".")[1].length;
  542. } catch (e) {}
  543. try {
  544. m += s2.split(".")[1].length;
  545. } catch (e) {}
  546. return (
  547. (Number(s1.replace(".", "")) * Number(s2.replace(".", ""))) /
  548. Math.pow(10, m)
  549. );
  550. },
  551. // secToTime: function(nowsecend) {
  552. // var h = (Math.floor(nowsecend / 60 / 60 % 24)) < 10 ? '0' + Math.floor(nowsecend / 60 / 60 % 24) : Math.floor(nowsecend / 60 / 60 % 24);
  553. // var m = Math.floor(nowsecend / 60 % 60) < 10 ? '0' + Math.floor(nowsecend / 60 % 60) : Math.floor(nowsecend / 60 % 60);
  554. // var s = Math.floor(nowsecend % 60) < 10 ? '0' + Math.floor(nowsecend % 60) : Math.floor(nowsecend % 60);
  555. // return h + ':' + m + ':' + s
  556. // }
  557. };