2 Commits 2087f6b676 ... a9734d6a05

Author SHA1 Message Date
  hd a9734d6a05 bug 1 month ago
  hd 1caf9a8891 bug 1 month ago

+ 606 - 569
app/statistics/js/common.js

@ -1,216 +1,216 @@
var indexName = {'index_128': '预约总量', 'index_129': '居民预约量', 'index_130': '代预约量'};
var indexName = { 'index_128': '预约总量', 'index_129': '居民预约量', 'index_130': '代预约量' }
function getSignDate(){   //获取初始化签约年
	var nowdate = new Date();
    var year = nowdate.getFullYear();
    var month = nowdate.getMonth() + 1;
    if(year>=2023){
    	year = year
    }else if(month<=6){
    	year = year - 1
    }
    return year
function getSignDate() {
  //获取初始化签约年
  var nowdate = new Date()
  var year = nowdate.getFullYear()
  var month = nowdate.getMonth() + 1
  if (year >= 2023) {
    year = year
  } else if (month <= 6) {
    year = year - 1
  }
  return year
}
function getStartDate(chooseYear){
    // 按年度来计算的时候,开始时间是该年度7月1号还是到下一个年的6月30号结束
	// 2022年及以前开始时间07-01
	// 2023及以后开始时间01-01
	
    if(chooseYear == 2016){
        return chooseYear + "-08-01";
    }else if(chooseYear <= 2022) {
		return chooseYear+'-07-01';
	}else if(chooseYear >= 2023){
        return chooseYear+'-01-01';
    }
function getStartDate(chooseYear) {
  // 按年度来计算的时候,开始时间是该年度7月1号还是到下一个年的6月30号结束
  // 2022年及以前开始时间07-01
  // 2023及以后开始时间01-01
  if (chooseYear == 2016) {
    return chooseYear + '-08-01'
  } else if (chooseYear <= 2022) {
    return chooseYear + '-07-01'
  } else if (chooseYear >= 2023) {
    return chooseYear + '-01-01'
  }
}
//获取结束时间
function getEndDate(chooseYear){
	
	var nowdate = new Date();
	var year = nowdate.getFullYear();
	var month = nowdate.getMonth() + 1;
	var day = nowdate.getDate();
	var endDate = ''
	if(chooseYear < '2022') {
		endDate = new Date((parseInt(chooseYear)+1) + '-06-30');
	}else{
		endDate = new Date((parseInt(chooseYear)) + '-12-31');
	}
	var now = new Date();
	
	if(now <= endDate){
	    return now.format("yyyy-MM-dd");
	}else{
		if(chooseYear < '2022') {
			return (parseInt(chooseYear)+1) + '-06-30';
		}else{
			return (parseInt(chooseYear)) + '-12-31';
		}
	}
	
function getEndDate(chooseYear) {
  var nowdate = new Date()
  var year = nowdate.getFullYear()
  var month = nowdate.getMonth() + 1
  var day = nowdate.getDate()
  var endDate = ''
  if (chooseYear < '2022') {
    endDate = new Date(parseInt(chooseYear) + 1 + '-06-30')
  } else {
    endDate = new Date(parseInt(chooseYear) + '-12-31')
  }
  var now = new Date()
  if (now <= endDate) {
    return now.format('yyyy-MM-dd')
  } else {
    if (chooseYear < '2022') {
      return parseInt(chooseYear) + 1 + '-06-30'
    } else {
      return parseInt(chooseYear) + '-12-31'
    }
  }
}
//获取结束时间29
function getEndDate29(chooseYear){
    chooseYear = parseInt(chooseYear);
    var endDate = new Date((chooseYear+1) + '-06-29'),
        now = new Date();
    if(now <= endDate){
        return now.format("yyyy-MM-dd");
    }else{
        return (chooseYear+1) + '-06-29';
    }
function getEndDate29(chooseYear) {
  chooseYear = parseInt(chooseYear)
  var endDate = new Date(chooseYear + 1 + '-06-29'),
    now = new Date()
  if (now <= endDate) {
    return now.format('yyyy-MM-dd')
  } else {
    return chooseYear + 1 + '-06-29'
  }
}
/**
 * 获取多少天前的日期
 */
function getDateBefore(days) {
	var now = new Date();
	var date = new Date(now.getTime() - days * 24 * 3600 * 1000);
	var year = date.getFullYear();
	var month = date.getMonth() + 1;
	var day = date.getDate();
	var hour = date.getHours();
	var minute = date.getMinutes();
	var second = date.getSeconds();
	return year + '-' + (month < 10 ? '0' + month : month) + '-' + (day < 10 ? '0' + day : day);
  var now = new Date()
  var date = new Date(now.getTime() - days * 24 * 3600 * 1000)
  var year = date.getFullYear()
  var month = date.getMonth() + 1
  var day = date.getDate()
  var hour = date.getHours()
  var minute = date.getMinutes()
  var second = date.getSeconds()
  return year + '-' + (month < 10 ? '0' + month : month) + '-' + (day < 10 ? '0' + day : day)
}
/*
 * 获取用来排序的字段值,返回数组
 * 参数: list - 列表, key - 字段的名称 
 * 参数: list - 列表, key - 字段的名称
 */
function getKeyValueArr(list, key){
    var arr = [];
    for(var k in list){
        arr.push(list[k][key]);
    }
    
    return arr;
function getKeyValueArr(list, key) {
  var arr = []
  for (var k in list) {
    arr.push(list[k][key])
  }
  return arr
}
/*
 * 排名
 */
function soreRank(arr){
    var temp = [];
    var lis = [];
    for(var i=0;i<arr.length;i++){
        lis.push(arr[i]);
    }
    lis = _.uniq(lis);
    for(var i=0;i<arr.length;i++){
        temp[i] = lis.indexOf(arr[i])+1;
    }
    
    return temp;
function soreRank(arr) {
  var temp = []
  var lis = []
  for (var i = 0; i < arr.length; i++) {
    lis.push(arr[i])
  }
  lis = _.uniq(lis)
  for (var i = 0; i < arr.length; i++) {
    temp[i] = lis.indexOf(arr[i]) + 1
  }
  return temp
}
/*
 * 绘制饼图数据处理  // elId, arry, title, hasNum,colors,radius,noLedend,param
 */
function handlePieData(arg){	
	var legend = {
        orient: 'vertical',
        right: arg.legendRight||'15%',
        y:'center',
   	};
   	var colorList=[]
    legendNames = [];
    var arr1 = _.map(arg.arry, function(o,i){
    	var count =  0
    	if(arg.param){
    		count = parseFloat(o[arg.param])
    	}else{
    		count = parseFloat(o.amount)
    	}
        var obj = {
            name: o[arg.nameparam]||o.name,
            count: count
        };
        legendNames.push(obj);
        if(o.code){
        	colorList.push(arg.colors[o.code])
        }else{
        	colorList.push(arg.colors[i])
        }
        return {
            value: count,
            name: o[arg.nameparam]||o.name
        }
    });
    legend.formatter = function(name){
        if(arg.hasNum){
	        var target;
	        for (var i = 0, l = legendNames.length; i < l; i++) {
	            if (legendNames[i].name == name) {
	                target = parseInt(legendNames[i].count);
	            }
	        }
        	return name+": "+target
        }else{
        	return name
        }        
function handlePieData(arg) {
  var legend = {
    orient: 'vertical',
    right: arg.legendRight || '15%',
    y: 'center'
  }
  var colorList = []
  legendNames = []
  var arr1 = _.map(arg.arry, function (o, i) {
    var count = 0
    if (arg.param) {
      count = parseFloat(o[arg.param])
    } else {
      count = parseFloat(o.amount)
    }
    var obj = {
      name: o[arg.nameparam] || o.name,
      count: count
    }
    if(arg.noLedend){   //true时无注释
    	drawPie(arg.elId, arr1, colorList, null, arg.position||['50%', '51%'], arg.radius||['70%', '90%'], arg.title)
    }else{
    	drawPie(arg.elId, arr1, colorList, legend, arg.position||['30%', '51%'], arg.radius||['70%', '90%'], arg.title)
    legendNames.push(obj)
    if (o.code) {
      colorList.push(arg.colors[o.code])
    } else {
      colorList.push(arg.colors[i])
    }
    return {
      value: count,
      name: o[arg.nameparam] || o.name
    }
  })
  legend.formatter = function (name) {
    if (arg.hasNum) {
      var target
      for (var i = 0, l = legendNames.length; i < l; i++) {
        if (legendNames[i].name == name) {
          target = parseInt(legendNames[i].count)
        }
      }
      return name + ': ' + target
    } else {
      return name
    }
  }
  if (arg.noLedend) {
    //true时无注释
    drawPie(arg.elId, arr1, colorList, null, arg.position || ['50%', '51%'], arg.radius || ['70%', '90%'], arg.title)
  } else {
    drawPie(arg.elId, arr1, colorList, legend, arg.position || ['30%', '51%'], arg.radius || ['70%', '90%'], arg.title)
  }
}
/*
 * 绘制饼图
 */
function drawPie(elId, arry, color, legend, center, radius, title){
    var pieChart = echarts.init(document.getElementById(elId));
    var options = {
        tooltip: {
            trigger: 'item',
            formatter: "{b} : {c} ({d}%)",
//          position: ['50%', '50%']
function drawPie(elId, arry, color, legend, center, radius, title) {
  var pieChart = echarts.init(document.getElementById(elId))
  var options = {
    tooltip: {
      trigger: 'item',
      formatter: '{b} : {c} ({d}%)'
      //          position: ['50%', '50%']
    },
    color: color,
    series: [
      {
        type: 'pie',
        radius: ['80%', '99%'],
        startAngle: 270,
        legendHoverLink: false,
        hoverAnimation: false,
        avoidLabelOverlap: false,
        label: {
          normal: {
            show: false,
            textStyle: {
              color: '#000'
            }
          }
        },
        color: color,
        series: [
        {
            type:'pie',
            radius: ['80%', '99%'],
            startAngle: 270,
            legendHoverLink: false,
            hoverAnimation: false,
            avoidLabelOverlap: false,
            label: {
                normal: {
                    show: false,
                    textStyle: {
                        color: "#000",
                    }
                }
            },
            labelLine: {
                normal: {
                    show: false 
                }
            },
            data:arry,
        }]
    };
    if(legend){
        options.legend = legend;
    }
    if(center){
        options.series[0].center = center;
    }
    if(radius){
        options.series[0].radius = radius;
    }
    if(title){
        options.title = title
    }
    pieChart.clear();
    pieChart.setOption(options);
        labelLine: {
          normal: {
            show: false
          }
        },
        data: arry
      }
    ]
  }
  if (legend) {
    options.legend = legend
  }
  if (center) {
    options.series[0].center = center
  }
  if (radius) {
    options.series[0].radius = radius
  }
  if (title) {
    options.title = title
  }
  pieChart.clear()
  pieChart.setOption(options)
}
/*
@ -219,104 +219,112 @@ function drawPie(elId, arry, color, legend, center, radius, title){
 * color ['#ffc800', '#17b3ec']
 * silent 图形是否不响应和触发鼠标事件,默认为 false,即响应和触发鼠标事件
 */
function drawPieChart(elId, arry, color, silent){
    var myChart = echarts.init(document.getElementById(elId));
    var option = {
        tooltip: {
            trigger: 'item',
            formatter: "{b} : {c} ({d}%)",
            position: ['50%', '50%']
function drawPieChart(elId, arry, color, silent) {
  var myChart = echarts.init(document.getElementById(elId))
  var option = {
    tooltip: {
      trigger: 'item',
      formatter: '{b} : {c} ({d}%)',
      position: ['50%', '50%']
    },
    color: color,
    series: [
      {
        type: 'pie',
        radius: ['80%', '99%'],
        startAngle: 270,
        legendHoverLink: false,
        hoverAnimation: false,
        avoidLabelOverlap: false,
        silent: silent,
        label: {
          normal: {
            show: false,
            textStyle: {
              color: '#000'
            }
          }
        },
        color: color,
        series: [
        {
            type:'pie',
            radius: ['80%', '99%'],
            startAngle: 270,
            legendHoverLink: false,
            hoverAnimation: false,
            avoidLabelOverlap: false,
            silent: silent,
            label: {
                normal: {
                    show: false,
                    textStyle: {
                        color: "#000"
                    }
                }
            },
            labelLine: {
                normal: {
                    show: false 
                }
            },
            data:arry
        }]
    };
    $("#"+elId).removeAttr("_echarts_instance_");
    myChart.setOption(option);
    return myChart;
        labelLine: {
          normal: {
            show: false
          }
        },
        data: arry
      }
    ]
  }
  $('#' + elId).removeAttr('_echarts_instance_')
  myChart.setOption(option)
  return myChart
}
/**
 * 绘制柱状图
 */
function drawBarChart(el, xData, yData, color, name){
    var myChart = echarts.init(document.getElementById(el));
       
    // 指定图表的配置项和数据
    var option = {
        tooltip: {
            trigger: 'item'
        },
        toolbox: {
            dataZoom: true,
            show: true,
            orient: 'vertical',
            x: 'right',
            y: 'center'
        },
        grid: {
            left: '20px',
            right: '20px',
            bottom: '20px',
            top: '20px',
            containLabel: true
function drawBarChart(el, xData, yData, color, name) {
  var myChart = echarts.init(document.getElementById(el))
  // 指定图表的配置项和数据
  var option = {
    tooltip: {
      trigger: 'item'
    },
    toolbox: {
      dataZoom: true,
      show: true,
      orient: 'vertical',
      x: 'right',
      y: 'center'
    },
    grid: {
      left: '20px',
      right: '20px',
      bottom: '20px',
      top: '20px',
      containLabel: true
    },
    xAxis: [
      {
        type: 'category',
        data: xData,
        axisLabel: {
          interval: 0 //横轴信息全部显示
        },
        xAxis: [{
            type: 'category',
            data: xData,
            axisLabel: {
                interval:0,//横轴信息全部显示  
            },
            splitLine: {
                show: false
            }
        }],
        yAxis: [{
            type: 'value',
            splitLine: {show:false}
        }],
        series: [{
            clickable: true,
            name: name,
            itemStyle : { 
                normal: {
                    label : {
                        show: true, position: 'top'
                    },
                    color: color
                }
        splitLine: {
          show: false
        }
      }
    ],
    yAxis: [
      {
        type: 'value',
        splitLine: { show: false }
      }
    ],
    series: [
      {
        clickable: true,
        name: name,
        itemStyle: {
          normal: {
            label: {
              show: true,
              position: 'top'
            },
            barWidth: 20,
            type: 'bar',
            data: yData 
        }]
    };
    
    // 使用刚指定的配置项和数据显示图表。
    myChart.setOption(option);
    return myChart;
            color: color
          }
        },
        barWidth: 20,
        type: 'bar',
        data: yData
      }
    ]
  }
  // 使用刚指定的配置项和数据显示图表。
  myChart.setOption(option)
  return myChart
}
/**
 * 绘制折线图数据处理
@ -324,324 +332,353 @@ function drawBarChart(el, xData, yData, color, name){
 * @param {Object} data  数据值
 * @param {Object} selectedDateType  true的时候x轴值年-月-日 1-日,2-周, 3-月
 */
function getChartData(elId, data, selectedDateType,hasLegend,title,unit){
	var dataZoom_end,
        xDatas = [],
        yDatas = [],
        names = [],
        colors = ['#12b7f5', '#cd67fd','#FF9526'];
    for(var p in data){
    	if(hasLegend){
        	names.push(indexName[p]);
    	}
        var xData = _.map(data[p], function(o){
            return o.range;
        });
        var yData = _.map(data[p], function(o){
            return o.amount;
        });			        
        xDatas.push(xData);
        yDatas.push(yData);
        var lastIndex = yData.length % 10;
        if(yData.length >10 ){  
            dataZoom_end = 100-(9/yData.length)*100;  
        }else{  
            dataZoom_end = 0;  
        }
function getChartData(elId, data, selectedDateType, hasLegend, title, unit) {
  var dataZoom_end,
    xDatas = [],
    yDatas = [],
    names = [],
    colors = ['#12b7f5', '#cd67fd', '#FF9526']
  for (var p in data) {
    if (hasLegend) {
      names.push(indexName[p])
    }
	setTimeout(function(){    	
	    EventBus.$emit("draw-line-chart", {
	        panelName : title,
	        quotaNames : names,
	        xData : xDatas[0],
	        yDatas : yDatas,
	        colors : colors,
	        selectedDateType: selectedDateType,        
	        nowlineid : elId,
	        unit:unit
    	});
	},10)
    
    var xData = _.map(data[p], function (o) {
      return o.range
    })
    var yData = _.map(data[p], function (o) {
      return o.amount
    })
    xDatas.push(xData)
    yDatas.push(yData)
    var lastIndex = yData.length % 10
    if (yData.length > 10) {
      dataZoom_end = 100 - (9 / yData.length) * 100
    } else {
      dataZoom_end = 0
    }
  }
  setTimeout(function () {
    EventBus.$emit('draw-line-chart', {
      panelName: title,
      quotaNames: names,
      xData: xDatas[0],
      yDatas: yDatas,
      colors: colors,
      selectedDateType: selectedDateType,
      nowlineid: elId,
      unit: unit
    })
  }, 10)
}
/**
 * 绘制柱状图数据处理
 * @param {Object} elId  div的id值
 * @param {Object} data  数据值
 */
function getBarData(arg){
	var dataZoom_end,
        xDatas = [],
        yDatas = [],
        names = [],
        colors = ['#12b7f5', '#cd67fd','#FF9526'];
    if(arg.colors){
    	colors = arg.colors
function getBarData(arg) {
  var dataZoom_end,
    xDatas = [],
    yDatas = [],
    names = [],
    colors = ['#12b7f5', '#cd67fd', '#FF9526']
  if (arg.colors) {
    colors = arg.colors
  }
  for (var p in arg.data) {
    if (arg.hasLegend) {
      names.push(arg.indexNames[p])
    }
    for(var p in arg.data){
    	if(arg.hasLegend){
        	names.push(arg.indexNames[p]);
    	}
        var xData = _.map(arg.data[p].data||arg.data[p], function(o){
            return o[arg.rangeParams]||o.range;
        });
        var yData = _.map(arg.data[p].data||arg.data[p], function(o){
            return o[arg.amountParams]||o.amount;
        });			        
        xDatas.push(xData);
        yDatas.push(yData);
        var lastIndex = yData.length % 10;
        if(yData.length >10 ){  
            dataZoom_end = 100-(9/yData.length)*100;  
        }else{  
            dataZoom_end = 0;  
        }
    }
    if(arg.typeV){
    	drawBarV({elId:arg.elId, name:names, dataZoom_end:dataZoom_end,
    		xData:xDatas[0], yDatas:yDatas, colors:colors,barCategoryGap:arg.barCategoryGap,argInit:arg})
    }else{
    	drawBarH({elId:arg.elId, name:names, dataZoom_end:dataZoom_end,
    		xData:xDatas[0], yDatas:yDatas, colors:colors,barCategoryGap:arg.barCategoryGap,argInit:arg})
    var xData = _.map(arg.data[p].data || arg.data[p], function (o) {
      return o[arg.rangeParams] || o.range
    })
    var yData = _.map(arg.data[p].data || arg.data[p], function (o) {
      return o[arg.amountParams] || o.amount
    })
    xDatas.push(xData)
    yDatas.push(yData)
    var lastIndex = yData.length % 10
    if (yData.length > 10) {
      dataZoom_end = 100 - (9 / yData.length) * 100
    } else {
      dataZoom_end = 0
    }
  }
  if (arg.typeV) {
    drawBarV({ elId: arg.elId, name: names, dataZoom_end: dataZoom_end, xData: xDatas[0], yDatas: yDatas, colors: colors, barCategoryGap: arg.barCategoryGap, argInit: arg })
  } else {
    drawBarH({ elId: arg.elId, name: names, dataZoom_end: dataZoom_end, xData: xDatas[0], yDatas: yDatas, colors: colors, barCategoryGap: arg.barCategoryGap, argInit: arg })
  }
}
function drawBarH(arg){
    var barCharts = echarts.init(document.getElementById(arg.elId));
	var options = {
		tooltip: {
	        trigger: 'axis',
	        axisPointer: {            // 坐标轴指示器,坐标轴触发有效
            	type: 'shadow'        // 默认为直线,可选为:'line' | 'shadow'
	        },
	        textStyle:{
	            align:'left'
			},
			formatter:function(datas){
				var res = datas[0].name + '<br/>'
		        for (var i = 0, length = datas.length; i < length; i++) {
	           		var unit = ""
	           		if(arg.argInit.units){
	           			unit = arg.argInit.units[datas[i].seriesName]
	           		}
		           	res += datas[i].seriesName + ':' 
		               	+ datas[i].value + unit +'<br/>'
		        }
		        return res
	       	}
		},
		calculable: false,
		grid: {
			borderWidth: 0,
			top:'20px',
			left: '20px',
	        right: '20px',
	        bottom: '20px',
	        containLabel: true
		},
		xAxis: [{
			type: 'category',
			axisLine: {
				lineStyle: {
					type: 'solid',
					color: '#333333', //左边线的颜色
					width: '1' //坐标线的宽度
				}
			},
			axisTick: {
				show: false
			},
			splitArea: {
				show: false
			},
			splitLine: {
				show: false
			},
			data: arg.xData
		}],
		yAxis: [{
			type: 'value',
			axisTick: {
				show: false
			},
			splitArea: {
				show: false
			},
			splitLine: {
				show: false
			},
			axisLine: {
				lineStyle: {
					type: 'solid',
					color: '#333333', //左边线的颜色
					width: '1' //坐标线的宽度
				}
			},
		}],
	}
    var series = [];
    for(var i=0; i<arg.yDatas.length; i++){
        var obj = {
            name: arg.name[i],
        	data: arg.yDatas[i],
	        type: 'bar',
            barGap: 0,
			barWidth: 30, //柱图宽度 
            itemStyle:{
                normal:{
                	barBorderRadius: [50, 50, 0, 0],
					color: arg.colors[i],
					label: {
						show: true,
						position: 'top',
						textStyle: {
							color: "#333333",
							fontSize: 12
						}
					}
                }
            },
        };
        series.push(obj);
function drawBarH(arg) {
  var barCharts = echarts.init(document.getElementById(arg.elId))
  var options = {
    tooltip: {
      trigger: 'axis',
      axisPointer: {
        // 坐标轴指示器,坐标轴触发有效
        type: 'shadow' // 默认为直线,可选为:'line' | 'shadow'
      },
      textStyle: {
        align: 'left'
      },
      formatter: function (datas) {
        var res = datas[0].name + '<br/>'
        for (var i = 0, length = datas.length; i < length; i++) {
          var unit = ''
          if (arg.argInit.units) {
            unit = arg.argInit.units[datas[i].seriesName]
          }
          res += datas[i].seriesName + ':' + datas[i].value + unit + '<br/>'
        }
        return res
      }
    },
    calculable: false,
    grid: {
      borderWidth: 0,
      top: '20px',
      left: '20px',
      right: '20px',
      bottom: '20px',
      containLabel: true
    },
    xAxis: [
      {
        type: 'category',
        axisLine: {
          lineStyle: {
            type: 'solid',
            color: '#333333', //左边线的颜色
            width: '1' //坐标线的宽度
          }
        },
        axisTick: {
          show: false
        },
        splitArea: {
          show: false
        },
        splitLine: {
          show: false
        },
        data: arg.xData
      }
    ],
    yAxis: [
      {
        type: 'value',
        axisTick: {
          show: false
        },
        splitArea: {
          show: false
        },
        splitLine: {
          show: false
        },
        axisLine: {
          lineStyle: {
            type: 'solid',
            color: '#333333', //左边线的颜色
            width: '1' //坐标线的宽度
          }
        }
      }
    ]
  }
  var series = []
  for (var i = 0; i < arg.yDatas.length; i++) {
    var obj = {
      name: arg.name[i],
      data: arg.yDatas[i],
      type: 'bar',
      barGap: 0,
      barWidth: 30, //柱图宽度
      itemStyle: {
        normal: {
          barBorderRadius: [50, 50, 0, 0],
          color: arg.colors[i],
          label: {
            show: true,
            position: 'top',
            textStyle: {
              color: '#333333',
              fontSize: 12
            }
          }
        }
      }
    }
    options.series = series;
	$("#"+arg.elId).removeAttr('_echarts_instance_')
    barCharts.setOption(options);
    series.push(obj)
  }
  options.series = series
  $('#' + arg.elId).removeAttr('_echarts_instance_')
  barCharts.setOption(options)
}
function drawBarV(arg){
    var barCharts = echarts.init(document.getElementById(arg.elId));
	var options = {
		tooltip: {
	        trigger: 'axis',
	        axisPointer: {            // 坐标轴指示器,坐标轴触发有效
            	type: 'shadow'        // 默认为直线,可选为:'line' | 'shadow'
	        },
	        textStyle:{
	            align:'left'
			},
			formatter:function(datas){
				var res = datas[0].name + '<br/>'
		        for (var i = 0, length = datas.length; i < length; i++) {
	           		var unit = ""
	           		if(arg.argInit.units){
	           			unit = arg.argInit.units[datas[i].seriesName]
	           		}
		           	res += datas[i].seriesName + ':' 
		               	+ datas[i].value + unit +'<br/>'
		        }
		        return res
	       	}
		},
		calculable: false,
		grid: {
			borderWidth: 0,
			top:'5%',
			left: '3%',
	        right: '10%',
	        bottom: '5%',
	        containLabel: true
		},
		yAxis: [{
			type: 'category',
			axisLine: {
				lineStyle: {
					type: 'solid',
					color: '#333333', //左边线的颜色
					width: '1' //坐标线的宽度
				}
			},
			axisTick: {
				show: false
			},
			splitArea: {
				show: false
			},
			splitLine: {
				show: false
			},
			data: arg.xData
		}],
		xAxis: [{
			type: 'value',
			axisTick: {
				show: false
			},
			splitArea: {
				show: false
			},
			splitLine: {
				show: false
			},
			axisLine: {
				lineStyle: {
					type: 'solid',
					color: '#333333', //左边线的颜色
					width: '1' //坐标线的宽度
				}
			},
		}],
	}
    var series = [];
    for(var i=0; i<arg.yDatas.length; i++){
        var obj = {
            name: arg.name[i],
        	data: arg.yDatas[i],
	        type: 'bar',
            barGap: 0,
			barWidth: 12, //柱图宽度 
            itemStyle:{
                normal:{
                	barBorderRadius: [0, 50, 50, 0],
					color: arg.colors[i],
					label: {
						show: true,
						position: 'right',
						textStyle: {
							color: "#333333",
							fontSize: 12
						}
					}
                }
            },
        };
        series.push(obj);
function drawBarV(arg) {
  var barCharts = echarts.init(document.getElementById(arg.elId))
  var options = {
    tooltip: {
      trigger: 'axis',
      axisPointer: {
        // 坐标轴指示器,坐标轴触发有效
        type: 'shadow' // 默认为直线,可选为:'line' | 'shadow'
      },
      textStyle: {
        align: 'left'
      },
      formatter: function (datas) {
        var res = datas[0].name + '<br/>'
        for (var i = 0, length = datas.length; i < length; i++) {
          var unit = ''
          if (arg.argInit.units) {
            unit = arg.argInit.units[datas[i].seriesName]
          }
          res += datas[i].seriesName + ':' + datas[i].value + unit + '<br/>'
        }
        return res
      }
    },
    calculable: false,
    grid: {
      borderWidth: 0,
      top: '5%',
      left: '3%',
      right: '10%',
      bottom: '5%',
      containLabel: true
    },
    yAxis: [
      {
        type: 'category',
        axisLine: {
          lineStyle: {
            type: 'solid',
            color: '#333333', //左边线的颜色
            width: '1' //坐标线的宽度
          }
        },
        axisTick: {
          show: false
        },
        splitArea: {
          show: false
        },
        splitLine: {
          show: false
        },
        data: arg.xData
      }
    ],
    xAxis: [
      {
        type: 'value',
        axisTick: {
          show: false
        },
        splitArea: {
          show: false
        },
        splitLine: {
          show: false
        },
        axisLine: {
          lineStyle: {
            type: 'solid',
            color: '#333333', //左边线的颜色
            width: '1' //坐标线的宽度
          }
        }
      }
    ]
  }
  var series = []
  for (var i = 0; i < arg.yDatas.length; i++) {
    var obj = {
      name: arg.name[i],
      data: arg.yDatas[i],
      type: 'bar',
      barGap: 0,
      barWidth: 12, //柱图宽度
      itemStyle: {
        normal: {
          barBorderRadius: [0, 50, 50, 0],
          color: arg.colors[i],
          label: {
            show: true,
            position: 'right',
            textStyle: {
              color: '#333333',
              fontSize: 12
            }
          }
        }
      }
    }
	options = newline(options, 4, 'yAxis')
    options.series = series;
	$("#"+arg.elId).removeAttr('_echarts_instance_')
    barCharts.setOption(options);
    series.push(obj)
  }
  options = newline(options, 4, 'yAxis')
  options.series = series
  $('#' + arg.elId).removeAttr('_echarts_instance_')
  barCharts.setOption(options)
}
function newline(option, number, axis){
    /* 此处注意你的json是数组还是对象 */
    option[axis][0]['axisLabel']={
        interval: 0,
        formatter: function(params){
            var newParamsName = "";
            var paramsNameNumber = params.length;
            var provideNumber = number;
            var rowNumber = Math.ceil(paramsNameNumber / provideNumber);
            if (paramsNameNumber > provideNumber) {
                for (var p = 0; p < rowNumber; p++) {
                    var tempStr = "";
                    var start = p * provideNumber;
                    var end = start + provideNumber;
                    if (p == rowNumber - 1) {
                        tempStr = params.substring(start, paramsNameNumber);
                    } else {
                        tempStr = params.substring(start, end) + "\n";
                    }
                    newParamsName += tempStr;
                }
            } else {
                newParamsName = params;
            }
            return newParamsName
function newline(option, number, axis) {
  /* 此处注意你的json是数组还是对象 */
  option[axis][0]['axisLabel'] = {
    interval: 0,
    formatter: function (params) {
      var newParamsName = ''
      var paramsNameNumber = params.length
      var provideNumber = number
      var rowNumber = Math.ceil(paramsNameNumber / provideNumber)
      if (paramsNameNumber > provideNumber) {
        for (var p = 0; p < rowNumber; p++) {
          var tempStr = ''
          var start = p * provideNumber
          var end = start + provideNumber
          if (p == rowNumber - 1) {
            tempStr = params.substring(start, paramsNameNumber)
          } else {
            tempStr = params.substring(start, end) + '\n'
          }
          newParamsName += tempStr
        }
      } else {
        newParamsName = params
      }
      return newParamsName
    }
    return option;
}
  }
  return option
}
function getSecondClassifyList(val) {
  switch (val) {
    case '':
      return [
        { label: '全部', value: '' },
        { label: '健康竞走', value: '健康竞走' },
        { label: '健康问答', value: '健康问答' },
        { label: '健康咨询', value: '健康咨询' }
      ]
    case '健康运动类':
      return [
        { label: '全部', value: '' },
        { label: '健康竞走', value: '健康竞走' }
      ]
    case '健康教育类':
      return [
        { label: '全部', value: '' },
        { label: '健康问答', value: '健康问答' }
      ]
    case '促进业务类':
      return [
        { label: '全部', value: '' },
        { label: '健康咨询', value: '健康咨询' }
      ]
  }
}

+ 31 - 19
app/statistics/js/comprehensive-query.js

@ -202,7 +202,7 @@ new Vue({
        code: '92',
        root: true,
        children: [
          { id: '1', prop: 'joinPatientNum', label: '参与居民人数', code: '92', tip: '该区域/社区举办的活动中,已报名/参与的居民人数(已去重)'  },
          { id: '1', prop: 'joinPatientNum', label: '参与居民人数', code: '92', tip: '该区域/社区举办的活动中,已报名/参与的居民人数(已去重)' },
          { id: '2', prop: 'joinHospitalNum', label: '参与社区医院数量', code: '92', tip: '该区域/社区举办的活动中,已报名。参与的居民签约的社区医院总数(已去重)', width: '150' },
          { id: '3', prop: 'eventTotal', label: '活动举办总数', code: '92', tip: '该区域/社区举办的活动数量总和' },
          { id: '4', prop: 'eventDoneNum', label: '已办活动场数', code: '92', tip: '该区域/社区举办的活动中,已结束的活动数量总和' },
@ -212,9 +212,27 @@ new Vue({
          { id: '8', prop: 'healthEduNum', label: '健康教育类活动', code: '92', tip: '该区域/社区举办的活动中,一级类别为:“健康教育”的活动数量总和' },
          { id: '9', prop: 'promoteBusinessNum', label: '促进业务类活动', code: '92', tip: '该区域/社区举办的活动中,一级类别为:“促进业务”的活动数量总和' },
          { id: '10', prop: 'signUpTotal', label: '活动报名总人数', code: '92', tip: '该区域/社区举办的活动中,已报名/参与的人数(重复报名按多次计算)' },
          { id: '11', prop: 'healthSportSignUpNum', label: '健康运动类报名', code: '92', tip: '该区域/社区举办的一级类别为:“健康运动”的活动中,已报名/参与的人数(重复报名按多次计算)' },
          { id: '12', prop: 'healthEduSignUpNum',label: '健康教育类报名', code: '92', tip: '该区域/社区举办的一级类别为:“健康教育”的活动中,已报名/参与的人数(重复报名按多次计算)' },
          { id: '13', prop: 'promoteBusinessSignUpNum', label: '促进业务类报名', code: '92', tip: '该区域/社区举办的一级类别为:“促进业务”的活动中,已报名/参与的人数(重复报名按多次计算)' }
          {
            id: '11',
            prop: 'healthSportSignUpNum',
            label: '健康运动类报名',
            code: '92',
            tip: '该区域/社区举办的一级类别为:“健康运动”的活动中,已报名/参与的人数(重复报名按多次计算)'
          },
          {
            id: '12',
            prop: 'healthEduSignUpNum',
            label: '健康教育类报名',
            code: '92',
            tip: '该区域/社区举办的一级类别为:“健康教育”的活动中,已报名/参与的人数(重复报名按多次计算)'
          },
          {
            id: '13',
            prop: 'promoteBusinessSignUpNum',
            label: '促进业务类报名',
            code: '92',
            tip: '该区域/社区举办的一级类别为:“促进业务”的活动中,已报名/参与的人数(重复报名按多次计算)'
          }
        ]
      },
      {
@ -225,7 +243,7 @@ new Vue({
          { id: '21', prop: 'joinNum', label: '参与积分人数', code: '93' },
          { id: '22', prop: 'integrateTotal', label: '累计积分数', code: '93' },
          { id: '23', prop: 'useIntegrate', label: '已使用积分', code: '93' },
          { id: '24', prop: 'noUseIntegrate', label: '未使用积分', code: '93' },
          { id: '24', prop: 'noUseIntegrate', label: '未使用积分', code: '93' }
        ]
      },
      {
@ -245,7 +263,7 @@ new Vue({
      { label: '活动举办明细', id: '95' },
      { label: '居民活动报名明细', id: '96' },
      { label: '居民积分明细', id: '97' },
      { label: '居民红包奖励明细', id: '90' },
      { label: '居民红包奖励明细', id: '90' }
    ],
    jkjlbList: [],
    copdFilterCheckValue: [],
@ -428,18 +446,6 @@ new Vue({
        label: '上门服务汇总',
        code: '3',
        children: [{ id: 'fwgd', label: '服务工单', code: '3' }]
      },
      {
        id: 'activityTimes,targetNum,joinNum,rewardNum,feeNum',
        label: '红包奖励汇总',
        code: '4',
        children: [
          { id: 'activityTimes', label: '举办活动次数', code: '4' },
          { id: 'targetNum', label: '目标参与人数', code: '4' },
          { id: 'joinNum', label: '实际参与人数', code: '4' },
          { id: 'rewardNum', label: '领取奖励人数', code: '4' },
          { id: 'feeNum', label: '领取奖励金额', code: '4' }
        ]
      }
    ],
    specHosName: '',
@ -1245,12 +1251,18 @@ new Vue({
        vm.jkjlbList = vm.$refs.collectTree.getCheckedNodes().filter(function (item) {
          return item.root != true
        })
        
      })
    },
    // 点击明细查询树形图
    handleNodeClick: function (item, type) {
      var vm = this
      vm.jkjlbList = []
      vm.jkjlbTabsTree.forEach(function (item) {
        item.children.forEach(function (o) {
          if(vm.$refs.collectTree) vm.$refs.collectTree.setChecked(o, false, true)
        })
      })
      vm.copdFilterCheckValue = []
      vm.handleNodeId = 0
      vm.derive = item.label

+ 80 - 13
component/statistics/ActivityHoldDetail/index.html

@ -30,9 +30,9 @@
      <label class="c-333 c-f14">活动一级类别:</label>
      <el-select v-model="form.firstClassify" placeholder="请输入活动名称进行搜索" @change="form.secondClassify = ''">
        <el-option label="全部" value=""></el-option>
        <el-option label="健康运动" value="健康运动"></el-option>
        <el-option label="健康教育" value="健康教育"></el-option>
        <el-option label="促进业务" value="促进业务"></el-option>
        <el-option label="健康运动类" value="健康运动类"></el-option>
        <el-option label="健康教育类" value="健康教育类"></el-option>
        <el-option label="促进业务类" value="促进业务类"></el-option>
      </el-select>
    </div>
    <div class="searchDiv pb20 pr20">
@ -57,18 +57,18 @@
      <label class="c-333 c-f14">举办形式:</label>
      <el-select v-model="form.eventForm" placeholder="请输入活动名称进行搜索">
        <el-option label="全部" value=""></el-option>
        <el-option label="线上" value="1"></el-option>
        <el-option label="线下" value="2"></el-option>
        <el-option label="综合" value="3"></el-option>
        <el-option label="线上" value="线上"></el-option>
        <el-option label="线下" value="线下"></el-option>
        <el-option label="综合" value="综合"></el-option>
      </el-select>
    </div>
    <div class="searchDiv pb20 pr20">
      <label class="c-333 c-f14">举办目的:</label>
      <el-select v-model="form.eventAim" placeholder="请输入活动名称进行搜索">
        <el-option label="全部" value=""></el-option>
        <el-option label="促进健康" value="1"></el-option>
        <el-option label="业务宣传" value="2"></el-option>
        <el-option label="服务提升" value="3"></el-option>
        <el-option label="促进健康" value="促进健康"></el-option>
        <el-option label="业务宣传" value="业务宣传"></el-option>
        <el-option label="服务提升" value="服务提升"></el-option>
      </el-select>
    </div>
    <div class="searchDiv pb20 pr20">
@ -85,7 +85,7 @@
    </div>
    <div class="searchDiv pb20 pr20" v-if="form.range == 'hospital'||form.range == 'team'">
      <label class="c-333 c-f14">社区:</label>
      <el-select class="formWidth" v-model="form.hospital" placeholder="请选择" @change="getTeam">
      <el-select class="formWidth" v-model="form.hospital" placeholder="请选择">
        <el-option v-for="(option, index) in hospitalOptions" :label="option.name" :value="option.code" :key="option.code"></el-option>
      </el-select>
    </div>
@ -99,7 +99,11 @@
  <el-table :data="tableData" style="width: 100%" v-loading="loading">
    <el-table-column type="index" label="序号" width="80"></el-table-column>
    <el-table-column v-for="item in tableHeader" :key="item.prop" :label="item.label" :prop="item.prop" :min-width="item.width || 100"></el-table-column>
    <el-table-column v-for="item in tableHeader" :key="item.prop" :label="item.label" :min-width="item.width || 100">
      <template slot-scope="scope">
        <span :class="`${item.prop=='title'?'pointer c-409eff':''}`" @click="openDialog(scope.row,item.prop)">{{scope.row[item.prop]}}</span>
      </template>
    </el-table-column>
    <el-table-column label="数据查看">
      <template slot-scope="scope">
        <el-button type="text" @click="previewDetailData(scope.row)">查看</el-button>
@ -110,7 +114,7 @@
    @current-change="handleCurrentChange($event, 1)"
    @size-change="handleSizeChange($event, 1)"
    :current-page.sync="page1"
    :page-size="size2"
    :page-size="size1"
    :page-sizes="[10, 20, 50]"
    layout="total, sizes, prev, pager, next, jumper"
    class="pagination"
@ -160,4 +164,67 @@
        :total="total2"></el-pagination>
    </div>
  </el-dialog>
</div>
  <el-dialog :visible.sync="dialogShow1" @close="closeDialog1" width="1200px" title="活动报名明细">
    <el-form inline size="mini">
      <el-form-item label="按活动年度:" v-if="yearType == 1">
        <el-select v-model="chooseYear" disabled>
          <el-option v-for="(item , index) in years" :key="index" :label="item" :value="item"></el-option>
        </el-select>
      </el-form-item>
      <el-form-item label="创建时间:" v-if="yearType == 2">
        <el-date-picker
          v-model="chooseTime"
          type="daterange"
          range-separator="至"
          start-placeholder="开始日期"
          end-placeholder="结束日期"
          value-format="yyyy-MM-dd"
          disabled></el-date-picker>
      </el-form-item>
      <el-form-item label="活动名称:">
        <el-input v-model="query1.title" placeholder="请输入活动名称进行搜索"></el-input>
      </el-form-item>
      <el-form-item label="签约机构:">
        <el-input v-model="query1.hospitalName" placeholder="请输入签约机构名称进行搜索"></el-input>
      </el-form-item>
      <el-form-item label="签约医生:">
        <el-input v-model="query1.doctorName" placeholder="请输入签约医生名称进行搜索"></el-input>
      </el-form-item>
      <el-form-item label="活动一级类别">
        <el-select v-model="query1.firstClassify" @change="query1.secondClassify = ''">
          <el-option label="全部" value=""></el-option>
          <el-option label="健康运动类" value="健康运动类"></el-option>
          <el-option label="健康教育类" value="健康教育类"></el-option>
          <el-option label="促进业务类" value="促进业务类"></el-option>
        </el-select>
      </el-form-item>
      <el-form-item label="活动二级类别">
        <el-select v-model="query1.secondClassify">
          <el-option :label="item.label" :value="item.value" v-for="item in getSecondClassifyList(query1.firstClassify)" :key="item.value"></el-option>
        </el-select>
      </el-form-item>
      <el-form-item>
        <el-button type="primary" @click="dialogSearch1">查询</el-button>
        <el-button type="ff9526" @click="dialogExport1" :disabled="dialogExportLoading1">导出</el-button>
      </el-form-item>
    </el-form>
    <el-table :data="dialogTableData1" border v-loading="dialogLoading1">
      <el-table-column type="index" label="序号" :width="70"></el-table-column>
      <el-table-column v-for="item in dialogHeader1" :label="item.label" :prop="item.prop" :key="item.prop" :min-width="item.width || 100">
        <template slot-scope="scope">
          <span>{{scope.row[item.prop]}}</span>
        </template>
      </el-table-column>
    </el-table>
    <div style="display: flex; justify-content: flex-end; margin-top: 10px">
      <el-pagination
        @current-change="handleCurrentChange($event, 3)"
        @size-change="handleSizeChange($event, 3)"
        :current-page.sync="page3"
        :page-size="size3"
        :page-sizes="[10, 20, 50]"
        layout="total, sizes, prev, pager, next, jumper"
        :total="total3"></el-pagination>
    </div>
  </el-dialog>
</div>

+ 148 - 25
component/statistics/ActivityHoldDetail/index.js

@ -36,6 +36,9 @@ Vue.component('activity-hold-detail', {
      page2: 1,
      size2: 10,
      total2: 0,
      page3: 1,
      size3: 10,
      total3: 0,
      loading: false,
      exportLoading: false,
      rangeOptions: [
@ -68,6 +71,7 @@ Vue.component('activity-hold-detail', {
      ],
      dialogShow: false,
      query: {},
      query1: {},
      dialogTableData: [],
      dialogHeader: [
        { label: '姓名', prop: 'name' },
@ -82,7 +86,28 @@ Vue.component('activity-hold-detail', {
        { label: '排名', prop: 'ranking' }
      ],
      dialogLoading: false,
      activityId: null
      dialogLoading1: false,
      activityId: null,
      dialogShow1: false,
      dialogTableData1: [],
      dialogHeader1: [
        { label: '姓名', prop: 'name' },
        { label: '性别', prop: 'sex' },
        { label: '年龄', prop: 'age' },
        { label: '证件号码', prop: 'idcard', width: '140' },
        { label: '手机号码', prop: 'mobile' },
        { label: '签约机构', prop: 'hospitalName' },
        { label: '签约医生', prop: 'doctorName' },
        { label: '活动名称', prop: 'title' },
        { label: '活动一级类别', prop: 'firstClassify', width: '120' },
        { label: '活动二级类别', prop: 'secondClassify', width: '120' },
        { label: '主办机构', prop: 'organizer' },
        { label: '获得积分', prop: 'total' },
        { label: '获得奖励金额', prop: 'feeTotal', width: '120' },
        { label: '参与活动时间', prop: 'updateTime', width: '160' }
      ],
      dialogExportLoading1: false,
      hospitalOptions: []
    }
  },
  methods: {
@ -111,6 +136,22 @@ Vue.component('activity-hold-detail', {
          eventAim: ''
        }
        this.getHospital(selectedRole.code)
      } else {
        this.rangeOptions = [{ label: '按社区', value: 'hospital' }]
        this.form = {
          range: 'hospital',
          area: selectedRole.code.substring(0, 6),
          hospital: selectedRole.code,
          firstClassify: '',
          secondClassify: '',
          activityStatus: '',
          eventForm: '',
          eventAim: ''
        }
        this.level = 3 // 社区管理
        this.areaOptions = [{ label: selectedRole.name.substring(0, 3), value: selectedRole.code.substring(0, 6) }]
        this.hospitalOptions = [{ name: selectedRole.name, code: selectedRole.code }]
      }
      this.initTime()
      this.searchFn()
@ -195,6 +236,17 @@ Vue.component('activity-hold-detail', {
          eventAim: ''
        }
        this.getHospital(selectedRole.code)
      } else {
        this.form = {
          range: 'hospital',
          area: selectedRole.code.substring(0, 6),
          hospital: selectedRole.code,
          firstClassify: '',
          secondClassify: '',
          activityStatus: '',
          eventForm: '',
          eventAim: ''
        }
      }
      this.yearType = '1'
@ -202,6 +254,22 @@ Vue.component('activity-hold-detail', {
      this.chooseTime = null
      this.$forceUpdate()
    },
    openDialog(row, prop) {
      if (prop != 'title') {
        return
      }
      this.dialogShow1 = true
      this.page3 = 1
      this.query1 = {
        activityId: row.id,
        title: row.title,
        hospitalName: '',
        doctorName: '',
        firstClassify: row.firstClassify,
        secondClassify: row.secondClassify
      }
      this.dialogSearch1()
    },
    closeDialog() {
      this.dialogShow = false
    },
@ -211,7 +279,7 @@ Vue.component('activity-hold-detail', {
      this.query = {
        // sex: ''
      }
      this.page1 = 1
      this.page2 = 1
      this.dialogSearch()
    },
    getHospital(code) {
@ -279,29 +347,84 @@ Vue.component('activity-hold-detail', {
      })
    },
    getSecondClassifyList(val) {
      switch (val) {
        case '':
          return [
            { label: '全部', value: '' },
            { label: '健康运动', value: '健康运动' },
            { label: '健康问答', value: '健康问答' },
            { label: '健康咨询', value: '健康咨询' }
          ]
        case '健康运动':
          return [
            { label: '全部', value: '' },
            { label: '健康运动', value: '健康运动' }
          ]
        case '健康教育':
          return [
            { label: '全部', value: '' },
            { label: '健康问答', value: '健康问答' }
          ]
        case '促进业务':
          return [
            { label: '全部', value: '' },
            { label: '健康咨询', value: '健康咨询' }
          ]
      return getSecondClassifyList(val)
    },
    closeDialog1() {
      this.dialogShow1 = false
    },
    dialogSearch1() {
      var vm = this
      this.dialogLoading1 = true
      var params = {
        range: this.form.range,
        area: this.form.area,
        hospital: this.form.hospital,
        ...this.query1,
        page: this.page3,
        size: this.size3
      }
      if (this.yearType == '1') {
        params.startDate = this.chooseYear + '-01-01'
        params.endDate = this.chooseYear + '-12-31'
      } else {
        if (this.chooseTime) {
          params.startDate = this.chooseTime[0]
          params.endDate = this.chooseTime[1]
        }
      }
      httpRequest.get('doctor/healthBank/eventRegistrationDetail', { data: params }).then(function (res) {
        if (res.status == 200) {
          vm.dialogTableData1 = res.detailModelList
          vm.total3 = res.totalCount
        }
        vm.dialogLoading1 = false
      })
    },
    dialogExport1() {
      var vm = this
      var params = {
        range: this.form.range,
        area: this.form.area ?? '',
        hospital: this.form.hospital ?? '',
        ...this.query1
      }
      if (this.yearType == '1') {
        params.startDate = this.chooseYear + '-01-01'
        params.endDate = this.chooseYear + '-12-31'
      } else {
        if (this.chooseTime) {
          params.startDate = this.chooseTime[0]
          params.endDate = this.chooseTime[1]
        }
      }
      this.dialogExportLoading1 = true
      var fileName = `活动报名明细${new Date().getTime()}.xls`
      httpRequest.downLoadFileForAjax('doctor/healthBank/exportEventRegistrationDetail', fileName, params).then(function () {
        vm.dialogExportLoading1 = false
      })
    },
    handleCurrentChange(val, num) {
      if (num == 1) {
        this.page1 = val
        this.searchFn()
      } else if (num == 2) {
        this.page2 = val
        this.dialogSearch()
      } else {
        this.page3 = val
        this.dialogSearch1()
      }
    },
    handleSizeChange(val, num) {
      if (num == 1) {
        this.size1 = val
        this.searchFn()
      } else if (num == 2) {
        this.size2 = val
        this.dialogSearch()
      } else {
        this.size3 = val
        this.dialogSearch1()
      }
    }
  },

+ 6 - 6
component/statistics/ActivityRegister/index.html

@ -85,9 +85,9 @@
      <el-form-item label="活动一级类别:">
        <el-select v-model="query.firstClassify" @change="query.secondClassify = ''">
          <el-option label="全部" value=""></el-option>
          <el-option label="健康运动" value="健康运动"></el-option>
          <el-option label="健康教育" value="健康教育"></el-option>
          <el-option label="促进业务" value="促进业务"></el-option>
          <el-option label="健康运动类" value="健康运动类"></el-option>
          <el-option label="健康教育类" value="健康教育类"></el-option>
          <el-option label="促进业务类" value="促进业务类"></el-option>
        </el-select>
      </el-form-item>
      <el-form-item label="活动二级类别:">
@ -160,9 +160,9 @@
      <el-form-item label="活动一级类别">
        <el-select v-model="query1.firstClassify" @change="query1.secondClassify = ''">
          <el-option label="全部" value=""></el-option>
          <el-option label="健康运动" value="健康运动"></el-option>
          <el-option label="健康教育" value="健康教育"></el-option>
          <el-option label="促进业务" value="促进业务"></el-option>
          <el-option label="健康运动类" value="健康运动类"></el-option>
          <el-option label="健康教育类" value="健康教育类"></el-option>
          <el-option label="促进业务类" value="促进业务类"></el-option>
        </el-select>
      </el-form-item>
      <el-form-item label="活动二级类别">

+ 62 - 37
component/statistics/ActivityRegister/index.js

@ -37,8 +37,8 @@ Vue.component('activity-register', {
      loading: false,
      exportLoading: false,
      rangeOptions: [
        { label: '区', value: 'town' },
        { label: '社区', value: 'hospital' }
        { label: '按区', value: 'town' },
        { label: '按社区', value: 'hospital' }
      ],
      areaOptions: [
        { label: '思明区', value: '350203' },
@ -89,12 +89,7 @@ Vue.component('activity-register', {
      ],
      dialogLoading1: false,
      dialogExportLoading1: false,
      secondClassifyList: [
        { label: '全部', value: '' },
        { label: '健康运动', value: '健康运动' },
        { label: '健康问答', value: '健康问答' },
        { label: '健康咨询', value: '健康咨询' }
      ]
      hospitalOptions: []
    }
  },
  watch: {
@ -133,6 +128,16 @@ Vue.component('activity-register', {
          area: selectedRole.code
        }
        this.getHospital(selectedRole.code)
      } else {
        this.rangeOptions = [{ label: '按社区', value: 'hospital' }]
        this.form = {
          range: 'hospital',
          area: selectedRole.code.substring(0, 6),
          hospital: selectedRole.code
        }
        this.level = 3 // 社区管理
        this.areaOptions = [{ label: selectedRole.name.substring(0, 3), value: selectedRole.code.substring(0, 6) }]
        this.hospitalOptions = [{ name: selectedRole.name, code: selectedRole.code }]
      }
      this.initTime()
      setTimeout(function () {
@ -225,6 +230,15 @@ Vue.component('activity-register', {
          area: selectedRole.code
        }
        this.getHospital(selectedRole.code)
      } else {
        this.form = {
          range: 'hospital',
          area: selectedRole.code.substring(0, 6),
          hospital: selectedRole.code
        }
        this.level = 3 // 社区管理
        this.areaOptions = [{ label: selectedRole.name.substring(0, 3), value: selectedRole.code.substring(0, 6) }]
        this.hospitalOptions = [{ name: selectedRole.name, code: selectedRole.code }]
      }
      this.yearType = '1'
@ -462,6 +476,30 @@ Vue.component('activity-register', {
          activityStatus: '',
          range: range
        }
        switch (prop) {
          case 'eventTotal':
            this.query.activityStatus = ''
            break
          case 'eventDoneNum':
            this.query.activityStatus = '6'
            break
          case 'eventIngNum':
            this.query.activityStatus = '2'
            break
          case 'eventNotStartNum':
            this.query.activityStatus = '4'
            break
          case 'healthSportNum':
            this.query.firstClassify = '健康运动类'
            break
          case 'healthEduNum':
            this.query.firstClassify = '健康教育类'
            break
          case 'promoteBusinessNum':
            this.query.firstClassify = '促进业务类'
            break
        }
        if (range == 'town') {
          this.query.area = row.code
        } else if (range == 'hospital') {
@ -484,6 +522,14 @@ Vue.component('activity-register', {
        } else if (range == 'hospital') {
          this.query1.hospital = row.code
        }
        var dict = {
          signUpTotal: '',
          healthSportSignUpNum: '健康运动类',
          healthEduSignUpNum: '健康教育类',
          promoteBusinessSignUpNum: '促进业务类'
        }
        this.query1.firstClassify = dict[prop]
        this.dialogShow1 = true
        this.searchActivityRegistry()
        this.page1 = 1
@ -492,40 +538,19 @@ Vue.component('activity-register', {
    previewRegisterDetail(row, prop) {
      this.query1 = {
        activityId: row.id,
        title: '',
        title: row.title,
        hospitalName: '',
        doctorName: '',
        firstClassify: '',
        secondClassify: ''
        firstClassify: row.firstClassify,
        secondClassify: row.secondClassify
      }
      if (prop == 'title') {
        this.dialogShow1 = true
        this.searchActivityRegistry()
      }
      this.dialogShow1 = true
      this.searchActivityRegistry()
    },
    getSecondClassifyList(val) {
      switch (val) {
        case '':
          return [
            { label: '全部', value: '' },
            { label: '健康运动', value: '健康运动' },
            { label: '健康问答', value: '健康问答' },
            { label: '健康咨询', value: '健康咨询' }
          ]
        case '健康运动':
          return [
            { label: '全部', value: '' },
            { label: '健康运动', value: '健康运动' }
          ]
        case '健康教育':
          return [
            { label: '全部', value: '' },
            { label: '健康问答', value: '健康问答' }
          ]
        case '促进业务':
          return [
            { label: '全部', value: '' },
            { label: '健康咨询', value: '健康咨询' }
          ]
      }
      return getSecondClassifyList(val)
    }
  },
  mounted() {

+ 4 - 4
component/statistics/ActivityRegisterDetail/index.html

@ -24,7 +24,7 @@
    </div>
    <div class="searchDiv pb20 pr20">
      <label class="c-333 c-f14">居民姓名:</label>
      <el-input v-model="form.name" placeholder="请输入居民姓名进行搜索"></el-input>
      <el-input v-model="form.patientName" placeholder="请输入居民姓名进行搜索"></el-input>
    </div>
    <div class="searchDiv pb20 pr20">
      <label class="c-333 c-f14">手机号码:</label>
@ -42,9 +42,9 @@
      <label class="c-333 c-f14">活动一级类别:</label>
      <el-select v-model="form.firstClassify" @change="form.secondClassify = ''">
        <el-option label="全部" value=""></el-option>
        <el-option label="健康运动" value="健康运动"></el-option>
        <el-option label="健康教育" value="健康教育"></el-option>
        <el-option label="促进业务" value="促进业务"></el-option>
        <el-option label="健康运动类" value="健康运动类"></el-option>
        <el-option label="健康教育类" value="健康教育类"></el-option>
        <el-option label="促进业务类" value="促进业务类"></el-option>
      </el-select>
    </div>
    <div class="searchDiv pb20 pr20">

+ 6 - 29
component/statistics/ActivityRegisterDetail/index.js

@ -33,9 +33,9 @@ Vue.component('activity-register-detail', {
      loading: false,
      exportLoading: false,
      rangeOptions: [
        { label: '区', value: 'town' },
        { label: '社区', value: 'hospital' },
        { label: '团队', value: 'team' }
        { label: '按区', value: 'town' },
        { label: '按社区', value: 'hospital' },
        { label: '按团队', value: 'team' }
      ],
      areaOptions: [
        { label: '思明区', value: '350203' },
@ -90,8 +90,8 @@ Vue.component('activity-register-detail', {
      } else {
        this.level = 3 // 社区管理
        this.rangeOptions = [
          { label: '社区', value: 'hospital' },
          { label: '团队', value: 'team' }
          { label: '按社区', value: 'hospital' },
          { label: '按团队', value: 'team' }
        ]
        this.areaOptions = [{ label: selectedRole.name.substring(0, 3), value: selectedRole.code.substring(0, 6) }]
        this.hospitalOptions = [{ name: selectedRole.name, code: selectedRole.code }]
@ -232,30 +232,7 @@ Vue.component('activity-register-detail', {
      })
    },
    getSecondClassifyList(val) {
      switch (val) {
        case '':
          return [
            { label: '全部', value: '' },
            { label: '健康运动', value: '健康运动' },
            { label: '健康问答', value: '健康问答' },
            { label: '健康咨询', value: '健康咨询' }
          ]
        case '健康运动':
          return [
            { label: '全部', value: '' },
            { label: '健康运动', value: '健康运动' }
          ]
        case '健康教育':
          return [
            { label: '全部', value: '' },
            { label: '健康问答', value: '健康问答' }
          ]
        case '促进业务':
          return [
            { label: '全部', value: '' },
            { label: '健康咨询', value: '健康咨询' }
          ]
      }
      return getSecondClassifyList(val)
    }
  },
  mounted() {

+ 32 - 7
component/statistics/MoneyReward/index.js

@ -41,8 +41,8 @@ Vue.component('money-reward', {
        2: '女'
      },
      rangeOptions: [
        { label: '区', value: 'town' },
        { label: '社区', value: 'hospital' }
        { label: '按区', value: 'town' },
        { label: '按社区', value: 'hospital' }
      ],
      areaOptions: [
        { label: '思明区', value: '350203' },
@ -54,7 +54,8 @@ Vue.component('money-reward', {
      ],
      level: 0,
      tableHeader: [],
      serviceType: []
      serviceType: [],
      hospitalOptions: []
    }
  },
  watch: {
@ -93,6 +94,18 @@ Vue.component('money-reward', {
          serviceType: ''
        }
        this.getHospital(selectedRole.code)
      } else {
        this.rangeOptions = [{ label: '按社区', value: 'hospital' }]
        this.form = {
          range: 'hospital',
          area: selectedRole.code.substring(0, 6),
          hospital: selectedRole.code,
          serviceType: ''
        }
        this.level = 3 // 社区管理
        this.areaOptions = [{ label: selectedRole.name.substring(0, 3), value: selectedRole.code.substring(0, 6) }]
        this.hospitalOptions = [{ name: selectedRole.name, code: selectedRole.code }]
      }
      this.initTime()
      this.searchFn()
@ -150,8 +163,11 @@ Vue.component('money-reward', {
      var vm = this
      var params = {
        ...this.form,
        page: this.page,
        pageSize: this.size
        menu: this.header
          .map(function (item) {
            return item.prop
          })
          .join(',')
      }
      if (this.yearType == '1') {
        params.startDate = this.chooseYear + '-01-01'
@ -164,8 +180,8 @@ Vue.component('money-reward', {
      }
      this.exportLoading = true
      var fileName = `红包奖励汇总${new Date().getTime()}.xls`
      
      httpRequest.downLoadFileForAjax('statisticsExport/exPatinetIntegralAnalysis', fileName, params).then(function () {
      httpRequest.downLoadFileForAjax('/doctor/healthBank/exportRedPackageRewardStatistics', fileName, params).then(function () {
        vm.exportLoading = false
      })
    },
@ -183,6 +199,15 @@ Vue.component('money-reward', {
          serviceType: ''
        }
        this.getHospital(selectedRole.code)
      } else {
        this.form = {
          range: 'hospital',
          area: selectedRole.code.substring(0, 6),
          hospital: selectedRole.code,
          serviceType: ''
        }
        this.areaOptions = [{ label: selectedRole.name.substring(0, 3), value: selectedRole.code.substring(0, 6) }]
        this.hospitalOptions = [{ name: selectedRole.name, code: selectedRole.code }]
      }
      this.yearType = '1'

+ 6 - 5
component/statistics/MoneyRewardDetail/index.js

@ -45,7 +45,6 @@ Vue.component('money-reward-detail', {
      size: 10,
      total: 0,
      serviceType: []
    }
  },
  methods: {
@ -75,7 +74,7 @@ Vue.component('money-reward-detail', {
      this.initTime()
      this.searchFn()
    },
    
    initTime() {
      var vm = this
      var now = new Date()
@ -89,7 +88,7 @@ Vue.component('money-reward-detail', {
    getDictData() {
      var vm = this
      statisticAPI.getDictByDictName({ name: 'health_bank_service_type' }).then(function (res) {
        vm.serviceType = [{label: '全部', value: ''}].concat(res.list)
        vm.serviceType = [{ label: '全部', value: '' }].concat(res.list)
      })
    },
    searchFn() {
@ -144,12 +143,14 @@ Vue.component('money-reward-detail', {
      var selectedRole = JSON.parse(sessionStorage.getItem('selectedRole'))
      if (this.level == 1) {
        this.form = {
          range: 'town'
          range: 'town',
          serviceType: ''
        }
      } else if (this.level == 2) {
        this.form = {
          range: 'town',
          area: selectedRole.code
          area: selectedRole.code,
          serviceType: ''
        }
        this.getHospital(selectedRole.code)
      }

+ 22 - 1
component/statistics/RedBagReward/index.js

@ -176,7 +176,28 @@ Vue.component('red-bag-reward', {
        })
    },
    eliminateClick() {
      this.resetArea()
      var selectedRole = JSON.parse(sessionStorage.getItem('selectedRole'))
      if (this.level == 1) {
        this.form = {
          range: 'town',
          serviceType: ''
        }
      } else if (this.level == 2) {
        this.form = {
          range: 'town',
          area: selectedRole.code,
          serviceType: ''
        }
        this.getHospital(selectedRole.code)
      } else {
        this.form = {
          range: 'hospital',
          area: selectedRole.code.substring(0, 6),
          hospital: selectedRole.code
        }
        this.getTeam(selectedRole.code)
      }
      this.yearType = '1'
      this.chooseYear = new Date().getFullYear()
      this.chooseTime = null

+ 6 - 4
component/statistics/ResidentScore/index.js

@ -31,9 +31,9 @@ Vue.component('resident-score', {
      loading: false,
      exportLoading: false,
      rangeOptions: [
        { label: '区', value: 'town' },
        { label: '社区', value: 'hospital' },
        { label: '团队', value: 'team' }
        { label: '按区', value: 'town' },
        { label: '按社区', value: 'hospital' },
        { label: '按团队', value: 'team' }
      ],
      areaOptions: [
        { label: '思明区', value: '350203' },
@ -44,7 +44,9 @@ Vue.component('resident-score', {
        { label: '翔安区', value: '350213' }
      ],
      level: 0,
      tableHeader: []
      tableHeader: [],
      hospitalOptions: [],
      teamOptions: []
    }
  },
  watch: {

+ 1 - 1
component/statistics/ResidentScoreDetail/index.html

@ -44,7 +44,7 @@
    </div>
    <div class="searchDiv pb20 pr20" v-if="form.range == 'hospital'||form.range == 'team'">
      <label class="c-333 c-f14">社区:</label>
      <el-select class="formWidth" v-model="form.hospital" placeholder="请选择" @change="getTeam">
      <el-select class="formWidth" v-model="form.hospital" placeholder="请选择">
        <el-option v-for="(option, index) in hospitalOptions" :label="option.name" :value="option.code" :key="option.code"></el-option>
      </el-select>
    </div>

+ 20 - 3
component/statistics/ResidentScoreDetail/index.js

@ -42,7 +42,8 @@ Vue.component('resident-score-detail', {
      tableHeader: [],
      page: 1,
      size: 10,
      total: 0
      total: 0,
      hospitalOptions: []
    }
  },
  methods: {
@ -66,6 +67,16 @@ Vue.component('resident-score-detail', {
          area: selectedRole.code
        }
        this.getHospital(selectedRole.code)
      } else {
        this.rangeOptions = [{ label: '按社区', value: 'hospital' }]
        this.form = {
          range: 'hospital',
          area: selectedRole.code.substring(0, 6),
          hospital: selectedRole.code
        }
        this.level = 3 // 社区管理
        this.areaOptions = [{ label: selectedRole.name.substring(0, 3), value: selectedRole.code.substring(0, 6) }]
        this.hospitalOptions = [{ name: selectedRole.name, code: selectedRole.code }]
      }
      this.initTime()
      this.searchFn()
@ -122,8 +133,8 @@ Vue.component('resident-score-detail', {
        params.signYear = this.chooseYear
      } else {
        if (this.chooseTime) {
          params.startDate = this.chooseTime[0] + ' 00:00'
          params.endDate = this.chooseTime[1] + ' 23:59'
          params.startDate = this.chooseTime[0]
          params.endDate = this.chooseTime[1]
        }
      }
      this.exportLoading = true
@ -144,6 +155,12 @@ Vue.component('resident-score-detail', {
          area: selectedRole.code
        }
        this.getHospital(selectedRole.code)
      } else {
        this.form = {
          range: 'hospital',
          area: selectedRole.code.substring(0, 6),
          hospital: selectedRole.code
        }
      }
      this.yearType = '1'