在前端进行数据检索时,通常会将根据条件检索到某个数据的列表排序,而这种信息对于用户来说有的时候会很不方便,因此需要将查询结果导出到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)
}
}