MajorQuoteMarketCmpHighCharts.cshtml 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443
  1. 
  2. @{
  3. Layout = null;
  4. }
  5. <!DOCTYPE html>
  6. <html>
  7. <head>
  8. <meta name="viewport" content="width=device-width" />
  9. <title>MajorQuoteMarketCmpHighCharts</title>
  10. <link href="~/easyui/themes/default/easyui.css" rel="stylesheet" />
  11. <link rel="stylesheet" type="text/css" href="~/easyui/themes/icon.css" />
  12. <link href="~/Content/css/bootstrap.min.css" rel="stylesheet" />
  13. <link href="~/Content/js/plugins/layer/skin/layer.css" rel="stylesheet" />
  14. @*<script src="~/Content/js/jquery.min.js"></script>*@
  15. <script src="~/Content/plugins/highcharts/jquery.min.js"></script>
  16. @*<script src="~/easyui/jquery.easyui.min.js"></script>
  17. <script src="~/easyui/jquery.easyui.mobile.js"></script>
  18. <script src="~/easyui/locale/easyui-lang-zh_CN.js"></script>*@
  19. <script src="~/Content/js/plugins/layer/laydate/laydate.js"></script>
  20. <script src="~/Content/js/plugins/layer/layer.min.js"></script>
  21. <script src="~/js/Utils.js"></script>
  22. <link href="~/Content/css/Styles.css" rel="stylesheet" />
  23. <link href="~/Content/css/style.min862f.css" rel="stylesheet" />
  24. <script src="~/Content/plugins/highcharts/highcharts.js"></script>
  25. <script type="text/javascript" src="~/Content/plugins/highcharts/modules/exporting.js"></script>
  26. </head>
  27. <body>
  28. <section class="hidden">
  29. <input type="hidden" id="hid_ReportTitle" value="@ViewBag.ReportTitle" />
  30. <input id="hid_IsMarketSysAccount" name="hid_IsMarketSysAccount" type="hidden" value="@ViewBag.IsMarketSysAccount" />
  31. <input id="hid_MarketID" name="hid_MarketID" type="hidden" value="@ViewBag.MarketID" />
  32. <input id="hid_ChartType" name="hid_ChartType" type="hidden" value="LINE" />
  33. <input id="hid_NumberFormat" name="hid_NumberFormat" type="hidden" value="0" />
  34. <input id="hid_IsExportImage" name="hid_IsExportImage" type="hidden" value="N" />
  35. </section>
  36. <table class="tableStyle1" style="Z-INDEX:101;LEFT:5px;WIDTH:725px;TOP:10px;POSITION:absolute;">
  37. <tr>
  38. <td class="td1"><img alt="" src="../Images/icon_1.gif" />商品名称:</td>
  39. <td class="td2">
  40. <select id="MajorGoods" style="height: 25px; width: 200px">
  41. @Html.Raw(ViewBag.SelMajorGoods)
  42. </select>
  43. </td>
  44. <td class="td1"><img alt="" src="../Images/icon_1.gif" />日期:</td>
  45. <td class="td2">
  46. <input class="laydate-icon layer-date" type="text" id="SearchStartTime" name="SearchStartTime" style="height: 25px; width: 200px" data-options="" placeholder="开始日期" />
  47. </td>
  48. <td class="td1">到:</td>
  49. <td class="td2">
  50. <input class="laydate-icon layer-date" type="text" id="SearchEndTime" name="SearchEndTime" style="height: 25px; width: 200px" data-options="" placeholder="截止日期" />
  51. </td>
  52. <td class="td1"><img alt="" src="../Images/icon_1.gif" />周期:</td>
  53. <td class="td2">
  54. <select style="height: 25px; width: 200px" id="cmbQueryCycle" name="cmbQueryCycle" onchange="f_CycleSelChanged()">
  55. <option value="1" selected>日</option>
  56. <option value="2">月</option>
  57. <option value="3">季</option>
  58. <option value="4">年</option>
  59. </select>
  60. </td>
  61. </tr>
  62. <tr>
  63. <td class="td1"><img alt="" src="../Images/icon_1.gif" />市场名称:</td>
  64. <td class="td2" colspan="7" height="150px">
  65. <select class="form-control" multiple="true" style="height: 150px; width: 400px" id="MarketIDs" name="MarketIDs" >
  66. @Html.Raw(ViewBag.SelMarketInfo)
  67. </select>
  68. </td>
  69. </tr>
  70. <tr>
  71. <td class="td1">
  72. <input type="radio" name="ChartType" value="LINE" style="margin: 5px 3px 0 0" checked="checked" /> 趋势图
  73. </td>
  74. <td class="td1" colspan="7">
  75. <div align="center">
  76. <div align="center">
  77. <input id="BtnPrintChart" type="button" class="but1" style=" height: 25px" onclick="LoadChart();" value="查询" />&nbsp;&nbsp;
  78. <input id="BtnPrintChart" type="button" onclick="PrintBtnClk()" style="width:60px" class="but1" value="打印图片" />&nbsp;&nbsp;
  79. <input id="BtnExportChart" type="button" onclick="ExportChartBtnClk()" style="width:60px" class="but1" value="导出图片" />
  80. </div>
  81. </div>
  82. </td>
  83. </tr>
  84. </table>
  85. <div id="container" style="Z-INDEX: 103; LEFT: 5px; WIDTH: 1000px; POSITION: absolute; TOP: 250px; HEIGHT: 400px"></div>
  86. <script>
  87. var chart;
  88. function LoadChart() {
  89. chart = new Highcharts.Chart({
  90. chart: {
  91. renderTo: 'container',
  92. defaultSeriesType: 'spline',
  93. events: {
  94. load: ChartQry
  95. }
  96. },
  97. title: {
  98. text: $('#hid_ReportTitle').val()
  99. },
  100. xAxis: {
  101. tickWidth: 3,
  102. minPadding: 0.1,
  103. maxPadding: 0.1,
  104. //gridLineWidth:1,
  105. endOnTick: false,
  106. //tickPixelInterval : 125, // 对固定Category的x轴不适用
  107. type: 'datetime', // x轴无固定Category,必须用datetime类型
  108. labels: {
  109. rotation: 0,
  110. align: 'center',
  111. formatter: function () {
  112. // Date.UTC值是长整数,转换成日期格式
  113. var strDate = Highcharts.dateFormat('%Y/%m/%d', this.value);
  114. var days = strDate.split('/');
  115. if ($('#cmbQueryCycle').val() == '1') {
  116. return days[1] + '/' + days[2];
  117. } else if ($('#cmbQueryCycle').val() == '2') {
  118. return days[0] + '/' + days[1];
  119. } else if ($('#cmbQueryCycle').val() == '3') {
  120. return days[0] + '/' + days[1];
  121. } else {
  122. return days[0];
  123. }
  124. }
  125. }
  126. },
  127. yAxis: {
  128. title: {
  129. text: ''
  130. }
  131. },
  132. tooltip: {
  133. enabled: true,
  134. formatter: function () {
  135. return '<b>' + this.series.name + '</b><br/>' +
  136. Highcharts.dateFormat('%Y-%m-%d', this.x) + ': ' +
  137. Highcharts.numberFormat(this.y, 2) + '元';
  138. }
  139. },
  140. exporting: {
  141. buttons: {
  142. printButton: {
  143. enabled: false
  144. },
  145. exportButton: {
  146. enabled: false,
  147. menuItems: [{
  148. text: 'PNG格式',
  149. onclick: function () {
  150. this.exportChart({
  151. type: 'image/png',
  152. width: 1200
  153. });
  154. }
  155. }, {
  156. text: 'JPG格式',
  157. onclick: function () {
  158. this.exportChart({
  159. type: 'image/jpeg',
  160. width: 1200
  161. });
  162. }
  163. },
  164. null,
  165. null]
  166. }
  167. },
  168. //url: 'HighchartsExport.aspx',
  169. url: 'http://export.highcharts.com.cn',
  170. filename: 'MyChart',
  171. width: 1200
  172. },
  173. plotOptions: {
  174. spline: {
  175. dataLabels: {
  176. enabled: true, // 是否在线上各点标注y轴数值
  177. formatter: function () {
  178. return Highcharts.numberFormat(this.y, 2);
  179. }
  180. },
  181. enableMouseTracking: true
  182. }
  183. },
  184. credits: {
  185. enabled: false
  186. },
  187. series: []
  188. });
  189. }
  190. var _IsExportImage = 'N';
  191. function ChartQry() {
  192. //var sDate, eDate;
  193. //sDate = document.getElementById("SearchStartTime").value;
  194. //eDate = document.getElementById("SearchEndTime").value;
  195. var MarketIDs = document.getElementById("MarketIDs");
  196. var strs = "";
  197. for (var i = 0; i < MarketIDs.length; i++) {
  198. //marketIds += marketIds == "" ? MarketIDs[i] : ',' + MarketIDs[i];
  199. if (MarketIDs.options[i].selected) {
  200. strs += MarketIDs.options[i].value + ",";
  201. }
  202. }
  203. if (strs.length > 0) {
  204. strs = strs.substr(0, strs.length - 1);
  205. }
  206. if (strs.length <= 0) {
  207. return;
  208. }
  209. var MajorGoods = $("#MajorGoods").val();
  210. var startTime = $('#SearchStartTime').val();
  211. var endTime = $('#SearchEndTime').val();
  212. var chartType = $("#hid_ChartType").val();
  213. var reportType = $("#hid_ReportType").val();
  214. var cmbQueryCycle = $("#cmbQueryCycle").val();
  215. $.ajax({
  216. url: '@Url.Action("ShowMajorQuoteMarketCmpHighCharts", "DataCharts")', // 查询接口
  217. type: 'post',
  218. dataType: 'json', // 查询接口返回的数据类型
  219. timeout: 1000000, // 单位=毫秒。为了测试写成1000秒,正式环境下可改为20秒
  220. data: {
  221. MarketIDs: strs,
  222. MajorGoods: MajorGoods,
  223. startTime: startTime,
  224. endTime: endTime,
  225. chartType: chartType,
  226. cmbQueryCycle: cmbQueryCycle,
  227. IsExportImage: _IsExportImage
  228. },
  229. success: function (srv_resp, textStatus) {
  230. // 查询接口无数据返回
  231. var count = eval(srv_resp.__totalcount);
  232. if (count == "" || count == null || count == "undefined" || count <= 0) {
  233. return;
  234. }
  235. var step = Math.ceil(count / 10.0);
  236. if (step < 1) { step = 1; }
  237. if ($("#hid_ChartType").val() == 'LINE') {
  238. if (srv_resp.__series == null) {
  239. return;
  240. }
  241. if (srv_resp.__series.length > 0) {
  242. // 设置x轴label间隔,否则可能因为数据量而过密
  243. if ($('#cmbQueryCycle').val() == '1') {
  244. chart.xAxis[0].options.tickInterval= step * 24 * 3600 * 1000;
  245. } else if ($('#cmbQueryCycle').val() == '2') {
  246. chart.xAxis[0].options.tickInterval= 30 * step * 24 * 3600 * 1000;
  247. } else if ($('#cmbQueryCycle').val() == '3') {
  248. chart.xAxis[0].options.tickInterval= 90 * step * 24 * 3600 * 1000;
  249. }else {
  250. chart.xAxis[0].options.tickInterval= 365 * step * 24 * 3600 * 1000;
  251. }
  252. // 设置各series的数据
  253. for (var i = 0; i < srv_resp.__series.length; i++) {
  254. var addFlag = 1;
  255. for (var j = 0; j < srv_resp.__series[i].length; j++) {
  256. // 把数据中的日期转换成Data.UTC值
  257. var temp = srv_resp.__series[i][j].x;
  258. if (temp != null) {
  259. var days = temp.split('/');
  260. // 日统计
  261. if ($('#cmbQueryCycle').val() == '1') {
  262. if (days.length == 3) {
  263. srv_resp.__series[i][j].x = Date.UTC(days[0], days[1]-1, days[2]);
  264. }
  265. }
  266. // 月统计
  267. else if ($('#cmbQueryCycle').val() == '2') {
  268. if (days.length == 2) {
  269. srv_resp.__series[i][j].x = Date.UTC(days[0], days[1]-1, 1);
  270. }
  271. }
  272. // 季统计(x轴类型为datetime,季度必须转换到月份)
  273. else if ($('#cmbQueryCycle').val() == '3') {
  274. if (days.length == 2) {
  275. srv_resp.__series[i][j].x = Date.UTC(days[0], 3*(days[1]-1), 1);
  276. }
  277. }
  278. // 年统计
  279. else {
  280. if (days.length == 1) {
  281. srv_resp.__series[i][j].x = Date.UTC(days[0], 0, 1);
  282. }
  283. }
  284. }
  285. else {
  286. addFlag = 0;
  287. }
  288. } //for j
  289. if (addFlag == 1) {
  290. chart.addSeries({ name: srv_resp.__names[i],
  291. data: srv_resp.__series[i] },
  292. false);
  293. }
  294. else {
  295. // 无数据的series
  296. chart.addSeries({ name: srv_resp.__names[i],
  297. data: [] },
  298. false);
  299. }
  300. }
  301. chart.redraw();
  302. }
  303. }
  304. },
  305. // 捕获出错信息(服务器应答超时、返回数据不是json格式等,用于调试)
  306. error: function (xmlHttpRequest, textStatus) {
  307. layer.alert(textStatus, { icon: 2, title: '提示信息' });
  308. },
  309. cache: false
  310. });
  311. }
  312. $(function() {
  313. if ($("#hid_IsMarketSysAccount").val() === "0") {
  314. $("#MarketIDs").find("option[value='" + $('#hid_MarketID').val() + "']").attr("selected", true);
  315. $("#MarketIDs").attr('disabled', 'disabled')
  316. } else {
  317. $("#MarketIDs").find("option[value='" + $('#hid_MarketID').val() + "']").attr("selected", true);
  318. }
  319. console.log($("#MarketIDs").val());
  320. //$('#MarketIDs').val($('#hid_MarketID').val())
  321. laydate(start);
  322. laydate(end);
  323. f_CycleSelChanged();
  324. LoadChart();
  325. });
  326. //返回两个时间的天数:要求比较的时间的格式为:YYYY-MM-DD
  327. function better_time(strDateStart, strDateEnd) {
  328. strDateStart = strDateStart.replace("/", "-").replace("/", "-");
  329. strDateEnd = strDateEnd.replace("/", "-").replace("/", "-");
  330. var strSeparator = "-"; //日期分隔符
  331. var strDateArrayStart;
  332. var strDateArrayEnd;
  333. var intDay;
  334. if (strDateStart == "" || strDateEnd == "") {
  335. //alert("ddddddd");
  336. }
  337. strDateArrayStart = strDateStart.split(strSeparator);
  338. strDateArrayEnd = strDateEnd.split(strSeparator);
  339. var strDateS = new Date(strDateArrayStart[0] + "/" + strDateArrayStart[1] + "/" + strDateArrayStart[2]);
  340. var strDateE = new Date(strDateArrayEnd[0] + "/" + strDateArrayEnd[1] + "/" + strDateArrayEnd[2]);
  341. intDay = (strDateS - strDateE) / (1000 * 3600 * 24);
  342. return intDay;
  343. }
  344. var start = {
  345. elem: "#SearchStartTime",
  346. format: "YYYY-MM-DD",
  347. min: "2010-01-01",
  348. event: "focus",
  349. choose: function (datas) {
  350. end.min = datas; //开始日选好后,重置结束日的最小日期
  351. end.start = datas; //将结束日的初始值设定为开始日
  352. $('#SearchStartTime').val(datas);
  353. }
  354. },
  355. end = {
  356. elem: "#SearchEndTime",
  357. format: "YYYY-MM-DD",
  358. min: "2010-01-01",
  359. event: "focus",
  360. choose: function (datas) {
  361. start.max = datas; //结束日选好后,重置开始日的最大日期
  362. $('#SearchEndTime').val(datas);
  363. }
  364. };
  365. // '查询周期'选择变化
  366. function f_CycleSelChanged() {
  367. var obj = $('#cmbQueryCycle').val();
  368. // 结束日期
  369. var dateE = new Date();
  370. document.getElementById("SearchEndTime").value = FormatDate(dateE);
  371. // 开始日期
  372. var dateB = new Date();
  373. if (obj == "1") {
  374. dateB.setDate(dateE.getDate() - 30);
  375. }
  376. else if (obj == "2") {
  377. dateB.setMonth(dateE.getMonth() - 6);
  378. }
  379. else if (obj == "3") {
  380. dateB.setMonth(dateE.getMonth() - 16);
  381. }
  382. else {
  383. dateB.setYear(dateE.getFullYear() - 6);
  384. }
  385. document.getElementById("SearchStartTime").value = FormatDate(dateB);
  386. }
  387. // 格式化Date类型的数据为yyyy-mm-dd
  388. function FormatDate(d) {
  389. // 获取年份
  390. s = d.getFullYear();
  391. // 获取月份
  392. c = d.getMonth() + 1;
  393. if (c < 10) {
  394. s += "-0" + c;
  395. }
  396. else {
  397. s += "-" + c;
  398. }
  399. // 获取日
  400. e = d.getDate();
  401. if (e < 10) {
  402. s += "-0" + e;
  403. }
  404. else {
  405. s += "-" + e;
  406. }
  407. return s;
  408. }
  409. // 打印图片
  410. function PrintBtnClk() {
  411. //$("#container").printArea();
  412. chart.print();
  413. }
  414. // 导出图片
  415. function ExportChartBtnClk() {
  416. _IsExportImage = 'Y';
  417. chart.exportChart({ type: 'image/png', width: 1200 });
  418. _IsExportImage = 'N';
  419. }
  420. </script>
  421. </body>
  422. </html>