package controller import ( "electricity_bill_calc/excel" "electricity_bill_calc/model" "electricity_bill_calc/response" "electricity_bill_calc/security" "electricity_bill_calc/service" "fmt" "net/http" "strconv" "github.com/gofiber/fiber/v2" "github.com/jinzhu/copier" "github.com/samber/lo" "github.com/shopspring/decimal" ) func InitializeMeter04kVController(router *fiber.App) { router.Get("/park/:pid/meter/template", download04kvMeterArchiveTemplate) router.Get("/park/:pid/meters", security.EnterpriseAuthorize, ListPaged04kVMeter) router.Get("/park/:pid/meter/:code", security.EnterpriseAuthorize, fetch04kVMeterDetail) router.Post("/park/:pid/meter", security.EnterpriseAuthorize, createSingle04kVMeter) router.Post("/park/:pid/meter/batch", security.EnterpriseAuthorize, batchImport04kVMeterArchive) router.Put("/park/:pid/meter/:code", security.EnterpriseAuthorize, modifySingle04kVMeter) } func download04kvMeterArchiveTemplate(c *fiber.Ctx) error { result := response.NewResult(c) requestParkId := c.Params("pid") parkDetail, err := service.ParkService.FetchParkDetail(requestParkId) if err != nil { return result.NotFound("未找到指定的园区信息。") } return c.Download("./assets/meter_04kv_template.xlsx", fmt.Sprintf("%s-户表档案.xlsx", parkDetail.Name)) } func ListPaged04kVMeter(c *fiber.Ctx) error { result := response.NewResult(c) requestParkId := c.Params("pid") if ensure, err := ensureParkBelongs(c, &result, requestParkId); !ensure { return err } requestPage, err := strconv.Atoi(c.Query("page", "1")) if err != nil { return result.NotAccept("查询参数[page]格式不正确。") } requestKeyword := c.Query("keyword", "") meters, totalItem, err := service.Meter04kVService.ListMeterDetail(requestParkId, requestKeyword, requestPage) if err != nil { return result.NotFound(err.Error()) } return result.Json( http.StatusOK, "已获取到符合条件的0.4kV表计集合。", response.NewPagedResponse(requestPage, totalItem).ToMap(), fiber.Map{"meters": meters}, ) } func fetch04kVMeterDetail(c *fiber.Ctx) error { result := response.NewResult(c) requestParkId := c.Params("pid") if ensure, err := ensureParkBelongs(c, &result, requestParkId); !ensure { return err } requestMeterCode := c.Params("code") meter, err := service.Meter04kVService.Get04kVMeterDetail(requestParkId, requestMeterCode) if err != nil { return result.NotFound(err.Error()) } if meter == nil { return result.Json(http.StatusNotFound, "指定的表计信息未能找到。", fiber.Map{"meter": nil}) } return result.Json(http.StatusOK, "指定的表计信息已找到。", fiber.Map{"meter": meter}) } type _MeterModificationFormData struct { Address *string `json:"address" form:"address"` CustomerName *string `json:"customerName" form:"customerName"` ContactName *string `json:"contactName" form:"contactName"` ContactPhone *string `json:"contactPhone" form:"contactPhone"` Ratio decimal.Decimal `json:"ratio" form:"ratio"` Seq int `json:"seq" form:"seq"` IsPublicMeter bool `json:"isPublicMeter" form:"isPublicMeter"` Enabled bool `json:"enabled" form:"enabled"` } type _MeterCreationFormData struct { Code string `json:"code" form:"code"` Address *string `json:"address" form:"address"` CustomerName *string `json:"customerName" form:"customerName"` ContactName *string `json:"contactName" form:"contactName"` ContactPhone *string `json:"contactPhone" form:"contactPhone"` Ratio decimal.Decimal `json:"ratio" form:"ratio"` Seq int `json:"seq" form:"seq"` IsPublicMeter bool `json:"isPublicMeter" form:"isPublicMeter"` Enabled bool `json:"enabled" form:"enabled"` } func createSingle04kVMeter(c *fiber.Ctx) error { result := response.NewResult(c) requestParkId := c.Params("pid") if ensure, err := ensureParkBelongs(c, &result, requestParkId); !ensure { return err } formData := new(_MeterCreationFormData) if err := c.BodyParser(formData); err != nil { return result.UnableToParse("无法解析提交的数据。") } newMeter := new(model.Meter04KV) copier.Copy(newMeter, formData) newMeter.ParkId = requestParkId err := service.Meter04kVService.CreateSingleMeter(*newMeter) if err != nil { return result.Error(http.StatusInternalServerError, err.Error()) } return result.Created("新0.4kV表计已经添加完成。") } func modifySingle04kVMeter(c *fiber.Ctx) error { result := response.NewResult(c) requestParkId := c.Params("pid") if ensure, err := ensureParkBelongs(c, &result, requestParkId); !ensure { return err } requestMeterCode := c.Params("code") meterDetail, err := service.Meter04kVService.Get04kVMeterDetail(requestParkId, requestMeterCode) if err != nil { return result.NotFound(err.Error()) } if meterDetail == nil { return result.NotFound("指定表计的信息为找到,不能修改。") } formData := new(_MeterModificationFormData) if err := c.BodyParser(formData); err != nil { return result.UnableToParse("无法解析提交的数据。") } copier.Copy(meterDetail, formData) err = service.Meter04kVService.UpdateSingleMeter(meterDetail) if err != nil { return result.Error(http.StatusInternalServerError, err.Error()) } return result.Updated("指定0.4kV表计信息已经更新。") } func batchImport04kVMeterArchive(c *fiber.Ctx) error { result := response.NewResult(c) requestParkId := c.Params("pid") if ensure, err := ensureParkBelongs(c, &result, requestParkId); !ensure { return err } uploadedFile, err := c.FormFile("data") if err != nil { return result.NotAccept("没有接收到上传的档案文件。") } archiveFile, err := uploadedFile.Open() if err != nil { return result.Error(http.StatusInternalServerError, err.Error()) } analyzer, err := excel.NewMeterArchiveExcelAnalyzer(archiveFile) if err != nil { return result.Error(http.StatusInternalServerError, err.Error()) } records, errs := analyzer.Analysis(*new(model.Meter04KV)) if len(errs) > 0 { return result.Json(http.StatusNotAcceptable, "上传的表计档案文件存在错误。", fiber.Map{"errors": errs}) } mergedMeters := lo.Map(records, func(meter model.Meter04KV, index int) model.Meter04KV { meter.ParkId = requestParkId meter.Enabled = true return meter }) errs = service.Meter04kVService.DuplicateMeterCodeValidate(mergedMeters) if len(errs) > 0 { return result.Json(http.StatusNotAcceptable, "上传的表计档案文件存在错误。", fiber.Map{"errors": errs}) } err = service.Meter04kVService.BatchCreateMeter(mergedMeters) if err != nil { return result.Error(http.StatusInternalServerError, err.Error()) } return result.Json( http.StatusOK, "上传的表计档案已经全部导入。", fiber.Map{"errors": make([]excel.ExcelAnalysisError, 0)}, ) }