package controller import ( "electricity_bill_calc/logger" "electricity_bill_calc/repository" "electricity_bill_calc/response" "electricity_bill_calc/security" "electricity_bill_calc/service" "electricity_bill_calc/vo" "fmt" "net/http" "github.com/gofiber/fiber/v2" "go.uber.org/zap" ) var meterLog = logger.Named("Handler", "Meter") func InitializeMeterHandlers(router *fiber.App) { router.Get("/meter/:pid", security.EnterpriseAuthorize, searchMetersWithinPark) router.Post("/meter/:pid", security.EnterpriseAuthorize, createNewMeterManually) router.Get("/meter/:pid/template", security.EnterpriseAuthorize, downloadMeterArchiveTemplate) router.Get("/meter/:pid/:code", security.EnterpriseAuthorize, retrieveSpecificMeterDetail) router.Put("/meter/:pid/:code", security.EnterpriseAuthorize, updateMeterManually) } // 查询指定园区下的表计信息 func searchMetersWithinPark(c *fiber.Ctx) error { parkId := c.Params("parkId") meterLog.Info("查询指定园区下的表计信息", zap.String("park id", parkId)) result := response.NewResult(c) session, err := _retreiveSession(c) if err != nil { meterLog.Error("无法查询指定园区下的表计信息,无法获取当前用户会话", zap.Error(err)) return result.Unauthorized(err.Error()) } if ok, err := checkParkBelongs(meterLog, parkId, session, &result); !ok { return err } keyword := c.Query("keyword") page := c.QueryInt("page", 1) meters, total, err := repository.MeterRepository.MetersIn(parkId, uint(page), &keyword) if err != nil { meterLog.Error("无法查询指定园区下的表计信息,无法获取表计列表", zap.Error(err)) return result.Error(http.StatusInternalServerError, err.Error()) } return result.Success( "已经取得符合条件的0.4kV表计列表。", response.NewPagedResponse(page, total).ToMap(), fiber.Map{"meters": meters}, ) } // 查询指定园区中指定表计的详细信息 func retrieveSpecificMeterDetail(c *fiber.Ctx) error { parkId := c.Params("pid") meterId := c.Params("code") meterLog.Info("查询指定园区中指定表计的详细信息", zap.String("park id", parkId), zap.String("meter id", meterId)) result := response.NewResult(c) session, err := _retreiveSession(c) if err != nil { meterLog.Error("无法查询指定园区中指定表计的详细信息,无法获取当前用户会话", zap.Error(err)) return result.Unauthorized(err.Error()) } if ok, err := checkParkBelongs(meterLog, parkId, session, &result); !ok { return err } meter, err := repository.MeterRepository.FetchMeterDetail(parkId, meterId) if err != nil { meterLog.Error("无法查询指定园区中指定表计的详细信息,无法获取表计信息", zap.Error(err)) return result.Error(http.StatusInternalServerError, err.Error()) } if meter == nil { meterLog.Warn("无法查询指定园区中指定表计的详细信息,表计不存在") return result.NotFound("指定的表计不存在。") } return result.Success("指定表计信息已经找到。", fiber.Map{"meter": meter}) } // 手动添加一条0.4kV表计记录 func createNewMeterManually(c *fiber.Ctx) error { parkId := c.Params("pid") meterLog.Info("手动添加一条0.4kV表计记录", zap.String("park id", parkId)) result := response.NewResult(c) session, err := _retreiveSession(c) if err != nil { meterLog.Error("无法手动添加一条0.4kV表计记录,无法获取当前用户会话", zap.Error(err)) return result.Unauthorized(err.Error()) } if ok, err := checkParkBelongs(meterLog, parkId, session, &result); !ok { return err } var creationForm vo.MeterCreationForm if err := c.BodyParser(&creationForm); err != nil { meterLog.Error("无法手动添加一条0.4kV表计记录,无法解析表计创建表单", zap.Error(err)) return result.NotAccept(err.Error()) } if err := service.MeterService.CreateMeterRecord(parkId, &creationForm); err != nil { meterLog.Error("无法手动添加一条0.4kV表计记录,无法创建表计记录", zap.Error(err)) return result.NotAccept(err.Error()) } return result.Created("新0.4kV表计已经添加完成。") } // 手动更新一条新的0.4kV表计记录 func updateMeterManually(c *fiber.Ctx) error { parkId := c.Params("pid") meterId := c.Params("code") meterLog.Info("手动更新一条新的0.4kV表计记录", zap.String("park id", parkId), zap.String("meter id", meterId)) result := response.NewResult(c) session, err := _retreiveSession(c) if err != nil { meterLog.Error("无法手动更新一条新的0.4kV表计记录,无法获取当前用户会话", zap.Error(err)) return result.Unauthorized(err.Error()) } if ok, err := checkParkBelongs(meterLog, parkId, session, &result); !ok { return err } var updateForm vo.MeterModificationForm if err := c.BodyParser(&updateForm); err != nil { meterLog.Error("无法手动更新一条新的0.4kV表计记录,无法解析表计更新表单", zap.Error(err)) return result.NotAccept(err.Error()) } if err := service.MeterService.UpdateMeterRecord(parkId, meterId, &updateForm); err != nil { meterLog.Error("无法手动更新一条新的0.4kV表计记录,无法更新表计记录", zap.Error(err)) return result.NotAccept(err.Error()) } return result.Updated("0.4kV表计已经更新完成。") } // 下载指定的园区表计登记模板 func downloadMeterArchiveTemplate(c *fiber.Ctx) error { parkId := c.Params("pid") meterLog.Info("下载指定的园区表计登记模板", zap.String("park id", parkId)) result := response.NewResult(c) session, err := _retreiveSession(c) if err != nil { meterLog.Error("无法下载指定的园区表计登记模板,无法获取当前用户会话", zap.Error(err)) return result.Unauthorized(err.Error()) } if ok, err := checkParkBelongs(meterLog, parkId, session, &result); !ok { return err } parkDetail, err := repository.ParkRepository.RetrieveParkDetail(parkId) if err != nil { meterLog.Error("无法下载指定的园区表计登记模板,无法获取园区信息", zap.Error(err)) return result.NotFound(err.Error()) } return c.Download( "./assets/meter_04kv_template.xlsx", fmt.Sprintf("%s_表计档案.xlsx", parkDetail.Name), ) } // 从Excel文件中导入表计档案 func uploadMeterArchive(c *fiber.Ctx) error { return nil } // 更换系统中的表计 func replaceMeter(c *fiber.Ctx) error { parkId := c.Params("pid") meterId := c.Params("code") meterLog.Info("更换系统中的表计", zap.String("park id", parkId), zap.String("meter id", meterId)) result := response.NewResult(c) session, err := _retreiveSession(c) if err != nil { meterLog.Error("无法更换系统中的表计,无法获取当前用户会话", zap.Error(err)) return result.Unauthorized(err.Error()) } if ok, err := checkParkBelongs(meterLog, parkId, session, &result); !ok { return err } var replacementForm vo.MeterReplacingForm if err := c.BodyParser(&replacementForm); err != nil { meterLog.Error("无法更换系统中的表计,无法解析表计更换表单", zap.Error(err)) return result.NotAccept(err.Error()) } return nil }