line-chart.js 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268
  1. (function(){
  2. var startDate,
  3. endDate;
  4. Vue.component('line-chart',{
  5. template: '<div class="mtb10 bgc-fff c-border pb10">\
  6. <div class="ui-grid ui-grid-middle plr10 c-border-b">\
  7. <div class="ui-col-0">\
  8. <span class="c-333 c-bold c-f14">{{panelName}}</span>\
  9. </div>\
  10. <div class="ui-col-1 c-t-right ptb5">\
  11. <span class="date-tag" :class="{active: selectedDateType == 1}" data-type="1" @click="changeType(1)">日</span><!--\
  12. --><span class="date-tag" :class="{active: selectedDateType == 2}" data-type="2" @click="changeType(2)">周</span><!--\
  13. --><span class="date-tag" :class="{active: selectedDateType == 3}" data-type="3" @click="changeType(3)">月</span>\
  14. </div>\
  15. </div>\
  16. <div class="ui-grid ui-grid-middle mt5 plr10">\
  17. <div v-if="showDatePanel" class="ui-col-1" >\
  18. <span>数据时间:</span>\
  19. <el-date-picker\
  20. v-model="dateValue"\
  21. type="daterange"\
  22. align="right"\
  23. unlink-panels\
  24. range-separator="至"\
  25. start-placeholder="开始日期"\
  26. end-placeholder="结束日期"\
  27. :default-value="defaultValue"\
  28. :picker-options="pickerOptions2"\
  29. @change="dateChange"\
  30. >\
  31. </el-date-picker>\
  32. </div>\
  33. <div v-if="!showDatePanel" class="ui-col-1 c-f12 c-909090"><span>{{startDate}}</span> ~ <span>{{endDate}}</span>数据</div>\
  34. <div class="ui-col-0 c-f12 c-909090">单位:{{unit}}</div>\
  35. </div>\
  36. <div class="line-chart" :id="lineid" style="height: 200px; width: 100%;"></div>\
  37. </div>',
  38. props:['lineid', 'showDatePanel'],
  39. data: function(){
  40. return {
  41. selectedDateType: 1,
  42. startDate: "", //数据展示时显示的开始时间
  43. endDate: "", //数据展示时显示的结束时间
  44. panelName: "",
  45. unit: "人",
  46. dateValue: "",
  47. defaultValue: [],
  48. pickerOptions2: {
  49. shortcuts: [{
  50. text: '最近一周',
  51. onClick(picker) {
  52. var end = new Date();
  53. var start = new Date();
  54. start.setTime(start.getTime() - 3600 * 1000 * 24 * 7);
  55. picker.$emit('pick', [start, end]);
  56. }
  57. }, {
  58. text: '最近一个月',
  59. onClick(picker) {
  60. var end = new Date();
  61. var start = new Date();
  62. start.setTime(start.getTime() - 3600 * 1000 * 24 * 30);
  63. picker.$emit('pick', [start, end]);
  64. }
  65. }, {
  66. text: '最近三个月',
  67. onClick(picker) {
  68. var end = new Date();
  69. var start = new Date();
  70. start.setTime(start.getTime() - 3600 * 1000 * 24 * 90);
  71. picker.$emit('pick', [start, end]);
  72. }
  73. }],
  74. disabledDate: function(d){
  75. var start = new Date(startDate),
  76. end = new Date(endDate);
  77. return d < start || d > end;
  78. }
  79. }
  80. }
  81. },
  82. watch:{
  83. dateValue: function(val){
  84. // this.$emit("getlinedata", {dateValue: val});
  85. if(val){
  86. startDate = this.dateValue[0];
  87. endDate = this.dateValue[1];
  88. }
  89. }
  90. },
  91. methods: {
  92. changeType: function(type){
  93. this.selectedDateType = type;
  94. //触发页面更新折线图的数据,触发器是父类页面自定在组件上的
  95. this.$emit("getlinedata", {dateType: type});
  96. },
  97. dateChange: function(val){
  98. var start = val[0].format("yyyy-MM-dd"),
  99. end = val[1].format("yyyy-MM-dd");
  100. this.$emit("getlinedata", {dateType: this.selectedDateType, dateValue: [start, end]});
  101. }
  102. },
  103. mounted: function(){
  104. var vm = this;
  105. EventBus.$on("draw-line-chart", function(arg){
  106. vm.panelName = arg.panelName;
  107. if(arg.selectedDateType){
  108. vm.selectedDateType = arg.selectedDateType;
  109. }
  110. if(arg.unit){
  111. vm.unit = arg.unit;
  112. }
  113. vm.dateValue = arg.dateValue;
  114. drawLine(vm, arg);
  115. })
  116. }
  117. });
  118. function drawLine(vm, arg){
  119. var lineCharts = echarts.init(document.getElementById(vm.lineid));
  120. var xData = arg.xData,
  121. yDatas = arg.yDatas,
  122. names = arg.quotaNames,
  123. colors = arg.colors,
  124. markLineValue = arg.markLineValue,
  125. markLineName = arg.markLineName;
  126. //处理数据, 数据按照20条数一屏展示
  127. // var lastIndex = xData.length % 20;
  128. if(xData.length > 20 ){
  129. dataZoom_end = 100-(19/xData.length)*100;
  130. }else{
  131. dataZoom_end = 0;
  132. }
  133. //初始结束时间
  134. var lastValue = xData[xData.length - 1];
  135. if(vm.selectedDateType == 1 || vm.selectedDateType == 2){
  136. vm.endDate = lastValue;
  137. }else if(vm.selectedDateType == 3){
  138. var val = lastValue.substr(5,2)+"月"
  139. vm.endDate = lastValue.substr(0,4)+"年"+val;
  140. }
  141. var options = {
  142. tooltip: {
  143. trigger: 'axis'
  144. },
  145. color: colors,
  146. legend: {
  147. top: '0px',
  148. data: names,
  149. borderColor: "#f1f1f1"
  150. },
  151. grid: {
  152. show: false,
  153. left: '20px',
  154. right: '20px',
  155. bottom: '40px',
  156. top: '20px',
  157. containLabel: true
  158. },
  159. xAxis: {
  160. type: 'category',
  161. boundaryGap: false,
  162. data: xData,
  163. axisLabel: {
  164. interval:0,//横轴信息全部显示
  165. formatter: function (value, index) {
  166. if(vm.selectedDateType == 1 || vm.selectedDateType == 2){
  167. if(index == 0){
  168. vm.startDate = value;
  169. return value.substr(5,2)+"月"+value.substr(8,2);
  170. }else{
  171. if(index == 19){
  172. vm.endDate = value;
  173. }
  174. return value.substr(8,2);
  175. }
  176. }else if(vm.selectedDateType == 3){
  177. var val = value.substr(5,2)+"月"
  178. if(index == 0){
  179. vm.startDate = value.substr(0,4)+"年"+val;
  180. }else{
  181. if(index == 19){
  182. vm.endDate = value.substr(0,4)+"年"+val;
  183. }
  184. }
  185. return val;
  186. }
  187. }
  188. }
  189. },
  190. yAxis: {
  191. type: 'value',
  192. axisPointer: {
  193. snap: true
  194. },
  195. scale: true,
  196. minInterval: 1,
  197. boundaryGap: ['10%', '30%'],
  198. splitLine: {show:false}
  199. },
  200. dataZoom: [{//给x轴设置滚动条
  201. // show: false,
  202. start: dataZoom_end,
  203. end: 100,
  204. type: 'slider',
  205. zoomLock: false,
  206. },{ //下面这个属性是内容区域配置
  207. start: dataZoom_end,
  208. end: 100,
  209. type: 'inside',
  210. zoomLock: false,
  211. }]
  212. };
  213. var series = [];
  214. for(var i=0; i<yDatas.length; i++){
  215. var obj = {
  216. name: names[i],
  217. type: 'line',
  218. smooth: true,
  219. data: yDatas[i],
  220. lineStyle:{
  221. normal:{
  222. color: colors[i]
  223. }
  224. }
  225. };
  226. series.push(obj);
  227. }
  228. options.series = series;
  229. if(markLineValue){
  230. //目前统计只有签约统计页面有目标量
  231. $.extend(options.yAxis, {
  232. min: function(value) {
  233. if(value.min > markLineValue){
  234. return markLineValue / 2;
  235. }else{
  236. return value.min / 2;
  237. }
  238. },
  239. max: function(value){
  240. if(value.max > markLineValue){
  241. return parseInt(value.max * 1.5);
  242. }else{
  243. return parseInt(markLineValue * 1.2);
  244. }
  245. }
  246. });
  247. $.extend(options.series[0], {markLine: {
  248. data:[
  249. {yAxis: markLineValue, name: markLineName}
  250. ],
  251. label:{
  252. show: true,
  253. position: 'middle',
  254. formatter: '{b}: {c}'
  255. },
  256. lineStyle:{
  257. color: 'rgb(194,53,49)'
  258. }
  259. }});
  260. }
  261. // console.log(JSON.stringify(options));
  262. $("#"+vm.lineid).removeAttr('_echarts_instance_')
  263. lineCharts.setOption(options);
  264. window.lineCharts = lineCharts;
  265. }
  266. })()