go通用查询的结果集填充扩展接口
这篇文章摘要描述了Go语言中几个核心数据查询和导出相关的结构体和方法定义了ViewWordsInLibRequest结构体用于词汇库查询请求包含基础实体和UI查询参数。实现了查询方法QueryModel支持分页查询、数据聚合和结果填充功能。提供了Fills方法处理查询结果统计词汇在不同级别的分布情况。实现了ExportFile和ExportFile2Ret方法支持将查询结果导出为Excel文件。QueryModel2Report方法构建查询请求并返回格式化结果支持结果填充和导出功能。这些结构体和方法组成了一个完整的数据查询、处理和导出框架支持灵活的查询条件和结果处理。type ViewWordsInLibRequest struct { basedto.BaseEntity uiframe.UiQueryRequest[int64, *viewentity.ViewWordsInLib] }type UiQueryRequest[P generaliface.GoPkey, E generaliface.IBaseModel[P]] struct { *generaldao.BaseDao[P, E] // QueryRequest[P, E] Param E json:param QueryParam beforQuery func() json:- common.BaseService }type BaseDao[P generaliface.GoPkey, E generaliface.IBaseModel[P]] struct { *GobaseDao[P, E] ifDebug bool FillRows generaliface.FillRows[E] FillRow generaliface.FillRow[E] *pagedb.PageDbRequest }func (self *BaseDao[P, E]) QueryModel(pageSize ...int) *pagemodel.PageResult[E] { var ret self.List(pageSize...) if ret.IsSuccess() self.IfAgg self.IfExistGroupFields() { var groupFields strings.Join(self.GroupFields, ,) if dataAgg, err : self.DbGroupStats(groupFields, self.Statfields...); err nil { ret.DataAgg dataAgg } else { golog.Error(err) ret.FailMsg(err.Error()) } } if ret.ExistRecord() { if lo.IsNotNil(self.FillRows) { self.FillRows.Fills(ret) } if lo.IsNotNil(self.FillRow) { for i : range ret.Data { self.FillRow.Fill(ret.Data[i]) } } } return ret }示例func (self *ViewWordsInLibRequest) Fills(vret *pagemodel.PageResult[*viewentity.ViewWordsInLib]) { var sql select a.word_id,b.level,sum(1) count from word_sentences a , sentences b where a.sentence_idb.id and a.word_id in (select vw.word_id from vocab_words vw where vw.vocab_id ?) group by a.word_id,b.level var dao self.BaseDao.NewDao() dao.PageSize apiconst.OPC_STAT_MAX_RECORD_NUM var data []*ReportWordLevel{} var wret dao.DbSelectModel(data, sql, self.Param.VocabId) if wret.ExistRecord() { for i : range vret.Data { if reportWordLevel, ok : lo.Find(data, func(item *ReportWordLevel) bool { return vret.Data[i].Id item.WordId }); ok { switch reportWordLevel.Level { case 1: vret.Data[i].Level1 reportWordLevel.Count case 2: vret.Data[i].Level2 reportWordLevel.Count case 3: vret.Data[i].Level3 reportWordLevel.Count case 4: vret.Data[i].Level4 reportWordLevel.Count case 5: vret.Data[i].Level5 reportWordLevel.Count } } } } } func (self *ViewWordsInLibRequest) ExportFile(c *gin.Context) *pagemodel.PageResult[*viewentity.ViewWordsInLib] { if self.Param.VocabId 0 { return self.PageResultFailUser(请选择词汇库) } self.FillRows self return self.ExportFile2Ret(c, ReportWord{}) }func (self *UiQueryRequest[P, E]) ExportFile2Ret(c *gin.Context, ireportTable gotag.IreportTable) *pagemodel.PageResult[E] { if err : self.ParseTable(ireportTable); err ! nil { return self.PageResultFail(err.Error()) } var ret self.QueryModel2Report(ireportTable.GetPageSize()) if ret.IsFailed() { return ret } var expRet goexcelframe.FindBeanGoexcelFrame().ExportFile2Ret(c, ret.MapDefault().Data, ireportTable) ret.IchubResult *expRet return ret }func (self *UiQueryRequest[P, E]) ExportFile2Ret(c *gin.Context, ireportTable gotag.IreportTable) *pagemodel.PageResult[E] { if err : self.ParseTable(ireportTable); err ! nil { return self.PageResultFail(err.Error()) } var ret self.QueryModel2Report(ireportTable.GetPageSize()) if ret.IsFailed() { return ret } var expRet goexcelframe.FindBeanGoexcelFrame().ExportFile2Ret(c, ret.MapDefault().Data, ireportTable) ret.IchubResult *expRet return ret }func (self *UiQueryRequest[P, E]) QueryModel2Report(sizes ...int) *pagemodel.PageResult[E] { if sizes nil || len(sizes) 0 { sizes []int{self.PageSize} } self.BuildRequest() self.BeforeQuery()() if self.OrderBys { self.OrderByDesc(id) } var ret self.QueryModel(sizes[0]) if ret.ExistRecord() { lo.ForEach(ret.Data, func(item E, index int) { item.Fill() }) } return ret }