From ed5a3f6c0a0fc98cd0e37e2e948878d90a940786 Mon Sep 17 00:00:00 2001 From: DEKA_123 <1904876928@qq.com> Date: Tue, 8 Aug 2023 15:21:12 +0800 Subject: [PATCH] =?UTF-8?q?fix(#5):=E4=BF=AE=E5=A4=8D=E4=B8=BA=E5=89=8D?= =?UTF-8?q?=E7=AB=AF=E4=B8=8B=E5=88=97=E8=A1=A8=E8=AE=B0=E6=8F=90=E4=BE=9B?= =?UTF-8?q?=E7=9A=84=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- controller/meter.go | 29 +++++++++++++++++++++++++++++ model/meter.go | 21 +++++++++++++++++++++ repository/meter.go | 40 ++++++++++++++++++++++++++++++++++++++++ settings.yaml | 4 ++-- vo/meter.go | 5 +++++ 5 files changed, 97 insertions(+), 2 deletions(-) diff --git a/controller/meter.go b/controller/meter.go index eb34fcd..eb3424d 100644 --- a/controller/meter.go +++ b/controller/meter.go @@ -41,6 +41,7 @@ func InitializeMeterHandlers(router *fiber.App) { router.Get("/reading/:pid/template", security.EnterpriseAuthorize, downloadMeterReadingsTemplate) router.Post("/reading/:pid/batch", security.EnterpriseAuthorize, uploadMeterReadings) router.Post("/reading/:pid/:code", security.EnterpriseAuthorize, recordMeterReading) + router.Get("/reading/:pid/choice", security.EnterpriseAuthorize, listReadableMeters) } // 查询指定园区下的表计信息 @@ -500,3 +501,31 @@ func uploadMeterReadings(c *fiber.Ctx) error { } return result.Success("表计档案已经导入完成。", fiber.Map{"errors": errs}) } + +// 列出可以作为抄表目标的表计,主要用于创建抄表记录时的下拉选择。 +func listReadableMeters(c *fiber.Ctx) error { + parkId := c.Params("pid") + meterLog.Info("列出可以作为抄表目标的表计", zap.String("parkId", parkId)) + result := response.NewResult(c) + if len(parkId) == 0 { + meterLog.Error("无法列出指定园区中尚未绑定商户的表计,未指定要访问的园区ID") + return result.NotAccept("未指定要访问的园区。") + } + if pass, err := checkParkBelongs(parkId, meterLog, c, &result); !pass { + return err + } + limit := c.QueryInt("limit", 10) + keyword := tools.EmptyToNil(c.Query("keyword")) + meters, err := repository.MeterRepository.ListReadableMeters(parkId, keyword, uint(limit)) + if err != nil { + meterLog.Error( + "无法列出可以作为抄表目标的表计,无法获取表计列表", zap.Error(err)) + return result.Error(http.StatusInternalServerError, err.Error()) + } + var simplifiedMeters = make([]*vo.ReadableMeterQueryResponse, 0) + copier.Copy(&simplifiedMeters, &meters) + return result.Success( + "指定园区中的可作为抄表目标的表计已经列出。", + fiber.Map{"meters": simplifiedMeters}, + ) +} diff --git a/model/meter.go b/model/meter.go index bc2df21..06a2d5e 100644 --- a/model/meter.go +++ b/model/meter.go @@ -105,3 +105,24 @@ type ReadingImportRow struct { Peak decimal.NullDecimal `json:"peak" excel:"peak"` Valley decimal.NullDecimal `json:"valley" excel:"valley"` } + +type ReadAbleMeter struct { + CreatedAt types.DateTime `json:"createdAt" db:"created_at"` + LastModifiedAt types.DateTime `json:"lastModifiedAt" db:"last_modified_at"` + Code string `json:"code" db:"code"` + + Park string `json:"parkId" db:"park_id"` + Address *string `json:"address" db:"address"` + Ratio decimal.Decimal `json:"ratio" db:"ratio"` + Seq int64 `json:"seq" db:"seq"` + Enabled bool `json:"enabled" db:"enabled"` + MeterType int16 `json:"type" db:"meter_type"` + Building *string `json:"building" db:"building"` + + OnFloor *string `json:"onFloor" db:"on_floor" ` + Area decimal.NullDecimal `json:"area" db:"area"` + AttachedAt *types.DateTime `json:"attachedAt" db:"attached_at"` + DetachedAt *types.DateTime `json:"detachedAt" db:"detached_at"` + DisplayRatio decimal.Decimal `db:"display_ratio"` + BuildingName *string `db:"building_name"` +} diff --git a/repository/meter.go b/repository/meter.go index 191427d..9aba81d 100644 --- a/repository/meter.go +++ b/repository/meter.go @@ -993,3 +993,43 @@ func (mr _MeterRepository) ListMeterDocForTemplate(pid string) ([]*model.SimpleM return docs, nil } + +// 列出目前园区中可以作为抄表目标的表计 +func (mr _MeterRepository) ListReadableMeters(pid string, keyword *string, limit uint) ([]*model.ReadAbleMeter, error) { + mr.log.Info("列出目前园区中可以作为抄表目标的表计", + zap.String("park_id", pid), + zap.Uint("limit", limit), + zap.Stringp("keyword", keyword)) + ctx, cancel := global.TimeoutContext() + defer cancel() + //SELECT * + // FROM "meter_04kv" AS "m" + //LEFT JOIN "park_building" AS "b" ON ("b"."id" = "m"."building") + //WHERE (("m"."park_id" = "b"."id") AND ("m"."detached_at" IS NULL)) + //ORDER BY "m"."attached_at" DESC + //LIMIT 20; + //query:=`SELECT m.*, b.name as building_name FROM meter_04kv as m LEFT JOIN park_building as b ON b.id = m.building WHERE m.park_id=$1 AND m.detached_at IS NULL` + meterQuery := mr.ds.From(goqu.T("meter_04kv").As("m")). + LeftJoin(goqu.T("park_building").As("b"), goqu.On(goqu.I("m.building").Eq(goqu.I("b.id")))). + Select("m.*", goqu.I("b.name").As("building_name")). + Where(goqu.I("m.park_id"). + Eq(pid), goqu.I("m.detached_at").IsNull()) + if keyword != nil && len(*keyword) > 0 { + pattern := fmt.Sprintf("%%%s%%", *keyword) + meterQuery = meterQuery.Where( + goqu.Or( + goqu.I("m.code").ILike(pattern), + goqu.I("m.address").ILike(pattern), + ), + ) + } + meterQuery = meterQuery.Order(goqu.I("m.attached_at").Desc()).Limit(limit) + meterSql, meterArgs, _ := meterQuery.Prepared(true).ToSQL() + var meters []*model.ReadAbleMeter + if err := pgxscan.Select(ctx, global.DB, &meters, meterSql, meterArgs...); err != nil { + mr.log.Error("查询商户表计信息失败", zap.Error(err)) + return make([]*model.ReadAbleMeter, 0), err + } + + return meters, nil +} diff --git a/settings.yaml b/settings.yaml index 7620533..84db9ed 100644 --- a/settings.yaml +++ b/settings.yaml @@ -12,9 +12,9 @@ Server: ReadTimeout: 60 WriteTimeout: 60 Redis: - Host: 127.0.0.1 + Host: 192.168.88.129 Port: 6379 - Password: + Password: 123456 DB: 1 Service: MaxSessionLife: 2h diff --git a/vo/meter.go b/vo/meter.go index eaedcbb..6018b90 100644 --- a/vo/meter.go +++ b/vo/meter.go @@ -62,3 +62,8 @@ type SimplifiedMeterDetailResponse struct { AttachedAt types.DateTime `json:"attachedAt"` DetachedAt *types.DateTime `json:"detachedAt"` } +type ReadableMeterQueryResponse struct { + Code string `json:"code"` + Address *string `json:"address"` + Park string `json:"park"` +}