From 9bc2001b2e874e8c2444f7212f734e89bc02bc5c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BE=90=E6=B6=9B?= Date: Wed, 24 Aug 2022 08:36:06 +0800 Subject: [PATCH] =?UTF-8?q?feat(report):=E5=AE=8C=E6=88=90=E5=A4=9A?= =?UTF-8?q?=E7=AB=AF=E5=85=B1=E7=94=A8=E7=9A=84=E6=8A=A5=E8=A1=A8=E6=A3=80?= =?UTF-8?q?=E7=B4=A2=E5=8A=9F=E8=83=BD=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- controller/report.go | 46 ++++++++++++++++++++++++++++++++++++++++++++ service/report.go | 43 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 89 insertions(+) diff --git a/controller/report.go b/controller/report.go index e2c9f61..804acbc 100644 --- a/controller/report.go +++ b/controller/report.go @@ -9,6 +9,7 @@ import ( "electricity_bill_calc/tools" "log" "net/http" + "strconv" "time" "github.com/fufuok/utils" @@ -34,6 +35,7 @@ func InitializeReportController(router *gin.Engine) { router.PUT("/report/:rid/step/diluted/fees", security.EnterpriseAuthorize, progressReportWillDilutedFee) router.PUT("/report/:rid/step/meter/register", security.EnterpriseAuthorize, progressEndUserRegister) router.POST("/report/:rid/publish", security.EnterpriseAuthorize, publishReport) + router.GET("/reports", security.MustAuthenticated, searchReports) } func ensureReportBelongs(c *gin.Context, result *response.Result, requestReportId string) bool { @@ -398,3 +400,47 @@ func publishReport(c *gin.Context) { } result.Success("指定的公示报表已经发布。") } + +func searchReports(c *gin.Context) { + result := response.NewResult(c) + session, err := _retreiveSession(c) + if err != nil { + result.Unauthorized(err.Error()) + return + } + requestUser := lo. + If(session.Type == model.USER_TYPE_ENT, session.Uid). + Else(c.DefaultQuery("user", "")) + requestPark := c.DefaultQuery("park", "") + if len(requestPark) > 0 && session.Type == model.USER_TYPE_ENT { + if !ensureParkBelongs(c, result, requestPark) { + return + } + } + requestPeriodString := c.DefaultQuery("period", "") + var requestPeriod *time.Time = nil + if len(requestPeriodString) > 0 { + parsedPeriod, err := time.Parse("2006-01", requestPeriodString) + if err != nil { + result.NotAccept("参数[period]的格式不正确。") + return + } + requestPeriod = lo.ToPtr(parsedPeriod) + } + requestKeyword := c.DefaultQuery("keyword", "") + requestPage, err := strconv.Atoi(c.DefaultQuery("page", "1")) + if err != nil { + result.NotAccept("查询参数[page]格式不正确。") + return + } + records, totalItems, err := service.ReportService.SearchReport(requestUser, requestPark, requestKeyword, requestPeriod, requestPage) + if err != nil { + result.NotFound(err.Error()) + return + } + result.Success( + "已经取得符合条件的公示报表记录。", + response.NewPagedResponse(requestPage, totalItems).ToMap(), + gin.H{"reports": records}, + ) +} diff --git a/service/report.go b/service/report.go index 94c853c..de74e8a 100644 --- a/service/report.go +++ b/service/report.go @@ -1,6 +1,7 @@ package service import ( + "electricity_bill_calc/config" "electricity_bill_calc/exceptions" "electricity_bill_calc/global" "electricity_bill_calc/model" @@ -379,3 +380,45 @@ func (_ReportService) PublishReport(report model.Report) (err error) { _, err = global.DBConn.ID(report.Id).Cols("step_state", "published", "published_at").Update(report) return } + +func (_ReportService) SearchReport(requestUser, requestPark, requestKeyword string, requestPeriod *time.Time, requestPage int) ([]model.JoinedReportForWithdraw, int64, error) { + cond := builder.NewCond().And(builder.Eq{"r.published": true}) + if len(requestUser) > 0 { + cond = cond.And(builder.Eq{"u.id": requestUser}) + } + if len(requestPark) > 0 { + cond = cond.And(builder.Eq{"p.id": requestPark}) + } + if requestPeriod != nil { + cond = cond.And(builder.Eq{"r.period": *requestPeriod}) + } + if len(requestKeyword) > 0 { + cond = cond.And( + builder.Like{"u.name", requestKeyword}. + Or(builder.Like{"p.name", requestKeyword}). + Or(builder.Like{"u.abbr", requestKeyword}). + Or(builder.Like{"p.abbr", requestKeyword}). + Or(builder.Like{"u.address", requestKeyword}). + Or(builder.Like{"p.address", requestKeyword}), + ) + } + total, err := global.DBConn. + Table("report").Alias("r"). + Join("INNER", []string{"park", "p"}, "p.id=r.park_id"). + Join("INNER", []string{"user_detail", "u"}, "u.id=p.user_id"). + Where(cond). + Count() + if err != nil { + return make([]model.JoinedReportForWithdraw, 0), -1, err + } + startItem := (requestPage - 1) * config.ServiceSettings.ItemsPageSize + records := make([]model.JoinedReportForWithdraw, 0) + err = global.DBConn. + Table("report").Alias("r"). + Join("INNER", []string{"park", "p"}, "p.id=r.park_id"). + Join("INNER", []string{"user_detail", "u"}, "u.id=p.user_id"). + Where(cond). + Limit(config.ServiceSettings.ItemsPageSize, startItem). + Find(&records) + return records, total, err +}