检索数据导出Excel

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/double_happiness/article/details/84655703

        在前端进行数据检索时,通常会将根据条件检索到某个数据的列表排序,而这种信息对于用户来说有的时候会很不方便,因此需要将查询结果导出到excel文件中,方便用户进行查看对比;

步骤一:调用GetQueryIdByCondition获取到QueryId

功能 根据查询参数获取QueryId
接口 HTTP://IP:PORT/api/biz/export/quertid/{QueryType}
调用方式 HTTP POST
数据类型 JSON
输入 {
    "BaseQuery":{
        "Limit":10,
        "Offset":0,
        "id":[
        ],
"QueryId":"warnall__Ro3lTvA3epetAcxAkfSM1hrqOhjv1bbO",
        "QueryTimeSpacialRanges":[
            {
                "SpacialRange":[
                ],
                "TimeRange":{
                }
            }
        ]
    },
    "RuleName":""
}
输出 {
  "Code": 1,
  "Msg": "success",
  "Redirect": "",
  "Data": {
    "QueryId": "export:allalarm:{uuid}”
  }
}
说明 (1)QueryType为不同的导出接口对应的查询的type标识(2)输入例子以导出报警为例(3)部分导出时:需要指定具体的记录的id,Id为uuid的字符串,忽略其他前端传入的检索条件,在数据库中检索时只是根据传入记录的唯一id进行检索(4)全部导出的时候相当于先走检索条件,再将符合检索条件的记录全部导出

流程说明:

1、先获取URL中传入的QueryType,得到QueryType的类型判断要导出的信息;

2、得到要导出的信息,判断body中传入的参数是否符合要导出信息的查询条件;

3、创建要导出的对象(例如:new(models.MonitorAlarmCivilQuery)),将前端传入的查询条件绑定到创建的对象判断是否出错,出错则为前端传入参数有误;否则得到符合查询条件的数据,然后将查询条件查询到的数据存入到Redis缓存中;

4、将缓存的信息以QueryId:export:allalarm:{uuid}的信息返回。

步骤二:调用对应的导出接口

功能 导出需要导出的信息
接口 HTTP://IP:PORT/api/biz/civilalarm/export?QueryId=export:civilalarm:{uuid}
调用方式 HTTP GET
数据类型 JSON
输入 QueryId
输出 具体导出的文件的压缩包

流程说明:

1、首先获取前端传入的QueryId,如果为空则返回参数错误;否则调用strings.Contains(queryId, “export:allalarm”)判断传入参数中是否包含指定的字符串信息;

2、不包括则为参数错误返回;否则调用GetQueryConditionById方法去获取Redis缓存中的数据,返回缓存的查询条件;

3、判断查询条件是否为空为空则返回参数错误;否则根据拿到的参数去判断查询中是否传入了具体记录的id,如果记录id存在则调用通过id取数据库中查询的方法;否则说明为全部导出,根据传入的查询条件去数据库中获取数据;

4、如果获取到了数据调用相应的创建Excel的方法,将查询的数据写入到Excel表格并对导出的文件进行相应的压缩处理和文件名处理。

步骤三:主要代码实现:

//调用GetQueryIdByCondition通过QueryId获取查询Id,进行Redis缓存
func (this *CommonController) GetQueryIdByCondition(c *gin.Context) {
	var queryType = c.Query("QueryType")

	searchResp := new(models.SearchResp)
	var query interface{}
	var retMap = make(map[string]string, 0)

	if queryType == "1" {
		query, searchResp = this.validVehicleRequest(c)
	} else if queryType == "2" {
		query, searchResp = this.validPedestrianRequest(c)
	} else if queryType == "3" {
		query, searchResp = this.validMotorVehicleQuery(c)
	} else if queryType == "4" {
		query, searchResp = this.validFaceRequest(c)
	} else if queryType == "5" {
		query, searchResp = this.validBaseQuery(c)
	} else if queryType == "6" {
		query, searchResp = this.validAllMonitorAlarmQueryRequest(c)
	} else if queryType == "7" {
		query, searchResp = this.validCivilMonitorAlarmQueryRequest(c)
	} else if queryType == "8" {
		query, searchResp = this.validVehicleMonitorAlarmQueryRequest(c)
	}

	if query == nil {
		searchResp.Code = models.ApiStatus_ERROR
		c.JSON(http.StatusBadRequest, searchResp)
	} else {
		retMap["QueryId"] = this.CacheQueryCondition(query)
		searchResp.Data = retMap
		c.JSON(http.StatusOK, searchResp)
	}

}
//以validAllMonitorAlarmQueryRequest为例
func (this *CommonController) validAllMonitorAlarmQueryRequest(c *gin.Context) (*models.MonitorAlarmAllQuery, *models.SearchResp) {
	monitorAlarmQuery := new(models.MonitorAlarmAllQuery)
	searchResp := &models.SearchResp{
		Code: models.ApiStatus_SUCCESS,
		Msg:  "success",
	}
	var queryId = c.Query("QueryId")
	if queryId != "" {
		if strings.Contains(queryId, "export:allalarm") {
			var query = this.GetQueryConditionById(queryId)
			if nil != query {
				monitorAlarmQuery = query.(*models.MonitorAlarmAllQuery)
			}
		}
	}else {
		if err := c.BindJSON(monitorAlarmQuery); err != nil {
			glog.Errorln(err)
			return nil, MONITOR_ALARM_FORMAT_PARAM_ERROR
		}
	}
	if monitorAlarmQuery.BaseQuery == nil {
		return nil, MONITOR_ALARM_FORMAT_PARAM_ERROR
	}

	glog.V(1).Infoln(monitorAlarmQuery)

	return monitorAlarmQuery, searchResp

}
//具体缓存前端的查询条件
func (this *CommonController) CacheQueryCondition(query interface{}) string {

	var t = ""
	switch query.(type) {
	case *models.VehicleQuery:
		t = "vec"
	case *models.PedestrianQuery:
		t = "ped"
	case *models.MotorVehicleQuery:
		t = "nmotor"
	case *models.FaceQuery:
		t = "face"
	case *models.BaseQuery:
		t = "base"
	case *models.MonitorAlarmAllQuery:
		t = "allalarm"
	case *models.MonitorAlarmCivilQuery:
		t = "civilalarm"
	case *models.MonitorAlarmVehicleQuery:
		t = "vehiclealarm"
	}

	var key = ""
	if t != "" {
		key = fmt.Sprintf("export:%s:%s", t, utils.NewV4().String())

		body, _ := json.Marshal(query)
		utils.RedisClient.Set(key, body, 60*30)
	}

	return key

}

//通过查询条件获取QueryId
func (this *CommonController) GetQueryConditionById(queryId string) interface{} {
	if utils.RedisClient.Exists(queryId) {
		cache, err := utils.RedisClient.GetRaw(queryId)
		if nil == err {
			if strings.Contains(queryId, "vec") {
				var query = new(models.VehicleQuery)
				json.Unmarshal(cache, query)
				return query
			} else if strings.Contains(queryId, "ped") {
				var query = new(models.PedestrianQuery)
				json.Unmarshal(cache, query)
				return query
			} else if strings.Contains(queryId, "nmotor") {
				var query = new(models.MotorVehicleQuery)
				json.Unmarshal(cache, query)
				return query
			} else if strings.Contains(queryId, "face") {
				var query = new(models.FaceQuery)
				json.Unmarshal(cache, query)
				return query
			} else if strings.Contains(queryId, "base") {
				var query = new(models.BaseQuery)
				json.Unmarshal(cache, query)
				return query
			} else if strings.Contains(queryId, "allalarm") {
				var query = new(models.MonitorAlarmAllQuery)
				json.Unmarshal(cache, query)
				return query
			} else if strings.Contains(queryId, "civilalarm") {
				var query = new(models.MonitorAlarmCivilQuery)
				json.Unmarshal(cache, query)
				return query
			} else if strings.Contains(queryId, "vehiclealarm") {
				var query = new(models.MonitorAlarmVehicleQuery)
				json.Unmarshal(cache, query)
				return query
			}
		}

	}
	return nil

}

//具体的导出接口
// 全部报警导出接口
func (this *CommonController) ExportMonitorAlarmAll(c *gin.Context) {
	monitorAlarmQuery, searchResp := this.validAllMonitorAlarmQueryRequest(c)
	if monitorAlarmQuery == nil {
		c.JSON(http.StatusBadRequest, searchResp)
		return
	}
	//导出最多条数
	if monitorAlarmQuery.GetBaseQuery().Limit > exportstream.EXPORT_MAX_ROWS {
		monitorAlarmQuery.GetBaseQuery().Limit = exportstream.EXPORT_MAX_ROWS
	}

	var userId = ""
	if uid, ok := c.Get(db_model.SESSION_USER_ID); ok {
		userId = uid.(string)
	}

	var uniqueAlarmIds = "{}"
	if nil != monitorAlarmQuery.GetBaseQuery() {
		if len(monitorAlarmQuery.GetBaseQuery().Id) > 0 {
			uniqueAlarmIds = utils.GetArrayAnySqlStr(monitorAlarmQuery.GetBaseQuery().Id)
		}
	}

	var alarmBaseQuery = monitorAlarmQuery.BaseQuery
	var monitorAlarmList = make([]*models.MonitorAlarmView, 0)
	var count int32
	if len(alarmBaseQuery.Id) > 0 {
		monitorAlarmList, count = this.Service.ListMonitorAlarmAll(uniqueAlarmIds, "", "", 0, 0, alarmBaseQuery.SortOrderAsc, 0, 10)
	}else {
		sensorIdsStr, timeStart, timeEnd := this.getTimeSpacialConditionByQuery(userId, alarmBaseQuery)
		monitorAlarmList, count = this.Service.ListMonitorAlarmAll("", sensorIdsStr, monitorAlarmQuery.RuleName, timeStart, timeEnd, alarmBaseQuery.SortOrderAsc, 0, alarmBaseQuery.Limit)
	}
	if count > 0 {
		monitorAlarmExport := excelstream.NewExcelMonitorAlarmAllExport(monitorAlarmList)
		exportProcessor := &exportstream.ExportProcessor{monitorAlarmExport, &sync.Mutex{}}
		exportProcessor.ProcessExport(c)
	}
}

猜你喜欢

转载自blog.csdn.net/double_happiness/article/details/84655703