package controller import ( "electricity_bill_calc/excel" "electricity_bill_calc/global" "electricity_bill_calc/response" "electricity_bill_calc/security" "electricity_bill_calc/service" "net/http" "strconv" "github.com/gin-gonic/gin" "github.com/samber/lo" "github.com/shopspring/decimal" ) func InitializeEndUserController(router *gin.Engine) { router.GET("/report/:rid/submeter", security.EnterpriseAuthorize, fetchEndUserInReport) router.GET("/report/:rid/meter/template", downloadEndUserRegisterTemplate) router.POST("/report/:rid/meter/batch", security.EnterpriseAuthorize, uploadEndUserRegisterTemplate) router.PUT("/report/:rid/submeter/:pid/:mid", security.EnterpriseAuthorize, modifyEndUserRegisterRecord) } func fetchEndUserInReport(c *gin.Context) { result := response.NewResult(c) requestReportId := c.Param("rid") if !ensureReportBelongs(c, result, requestReportId) { return } keyword := c.DefaultQuery("keyword", "") requestPage, err := strconv.Atoi(c.DefaultQuery("page", "1")) if err != nil { result.NotAccept("查询参数[page]格式不正确。") return } endUsers, totalItem, err := service.EndUserService.SearchEndUserRecord(requestReportId, keyword, requestPage) if err != nil { result.NotFound(err.Error()) return } result.Json( http.StatusOK, "已获取到符合条件的终端用户集合", response.NewPagedResponse(requestPage, totalItem).ToMap(), gin.H{"meters": endUsers}, ) } func downloadEndUserRegisterTemplate(c *gin.Context) { result := response.NewResult(c) requestReportId := c.Param("rid") users, err := service.EndUserService.AllEndUserRecord(requestReportId) if err != nil { result.NotFound(err.Error()) return } meterType, err := service.ReportService.RetreiveParkEndUserMeterType(requestReportId) if err != nil { result.Error(http.StatusInternalServerError, err.Error()) return } if meterType == -1 { result.NotFound("未能确定用户表计类型。") return } c.Status(http.StatusOK) c.Header("Content-Type", "application/octet-stream") c.Header("Content-Transfer-Encoding", "binary") c.Header("Content-Disposition", "attachment; filename=抄表记录.xlsx") gen := lo.Ternary[excel.ExcelTemplateGenerator]( meterType == 0, excel.NewMeterNonPVExcelTemplateGenerator(), excel.NewMeterPVExcelTemplateGenerator(), ) defer gen.Close() gen.WriteMeterData(users) gen.WriteTo(c.Writer) } func uploadEndUserRegisterTemplate(c *gin.Context) { result := response.NewResult(c) requestReportId := c.Param("rid") if !ensureReportBelongs(c, result, requestReportId) { return } meterType, err := service.ReportService.RetreiveParkEndUserMeterType(requestReportId) if err != nil { result.Error(http.StatusInternalServerError, err.Error()) return } if meterType == -1 { result.NotFound("未能确定用户表计类型。") return } uploadedFile, err := c.FormFile("data") if err != nil { result.NotAccept("没有接收到上传的档案文件。") return } archiveFile, err := uploadedFile.Open() if err != nil { result.Error(http.StatusInternalServerError, err.Error()) return } if meterType == 0 { errs := service.EndUserService.BatchImportNonPVRegister(requestReportId, archiveFile) if errs.Len() > 0 { result.Json(http.StatusInternalServerError, "上传抄表文件存在解析错误", gin.H{"errors": errs.Errs}) return } } else { errs := service.EndUserService.BatchImportPVRegister(requestReportId, archiveFile) if errs.Len() > 0 { result.Json(http.StatusInternalServerError, "上传抄表文件存在解析错误", gin.H{"errors": errs.Errs}) return } } result.Json(http.StatusOK, "已经成功完成抄表记录的导入。", gin.H{"errors": make([]error, 0)}) } type ModifyEndUserRegisterFormData struct { CurrentPeriodOverall decimal.NullDecimal `json:"currentPeriodOverall" form:"currentPeriodOverall"` CurrentPeriodCritical decimal.NullDecimal `json:"currentPeriodCritical" form:"currentPeriodCritical"` CurrentPeriodPeak decimal.NullDecimal `json:"currentPeriodPeak" form:"currentPeriodPeak"` CurrentPeriodValley decimal.NullDecimal `json:"currentPeriodValley" form:"currentPeriodValley"` AdjustOverall decimal.NullDecimal `json:"adjustOverall" form:"adjustOverall"` AdjustCritical decimal.NullDecimal `json:"adjustCritical" form:"adjustCritical"` AdjustPeak decimal.NullDecimal `json:"adjustPeak" form:"adjustPeak"` AdjustValley decimal.NullDecimal `json:"adjustValley" form:"adjustValley"` } func modifyEndUserRegisterRecord(c *gin.Context) { result := response.NewResult(c) requestReportId := c.Param("rid") if !ensureReportBelongs(c, result, requestReportId) { return } meterType, err := service.ReportService.RetreiveParkEndUserMeterType(requestReportId) if err != nil { result.Error(http.StatusInternalServerError, err.Error()) return } if meterType == -1 { result.NotFound("未能确定用户表计类型。") return } requestParkId := c.Param("pid") requestMeterId := c.Param("mid") formData := new(ModifyEndUserRegisterFormData) c.BindJSON(formData) meter, err := service.EndUserService.FetchSpecificEndUserRecord(requestReportId, requestParkId, requestMeterId) if err != nil { result.NotFound(err.Error()) return } if formData.CurrentPeriodOverall.Valid { meter.CurrentPeriodOverall = formData.CurrentPeriodOverall.Decimal } if formData.CurrentPeriodCritical.Valid { meter.CurrentPeriodCritical = formData.CurrentPeriodCritical.Decimal } if formData.CurrentPeriodPeak.Valid { meter.CurrentPeriodPeak = formData.CurrentPeriodPeak.Decimal } if formData.CurrentPeriodValley.Valid { meter.CurrentPeriodValley = formData.CurrentPeriodValley.Decimal } if formData.AdjustOverall.Valid { meter.AdjustOverall = formData.AdjustOverall.Decimal } if formData.AdjustCritical.Valid { meter.AdjustCritical = formData.AdjustCritical.Decimal } if formData.AdjustPeak.Valid { meter.AdjustPeak = formData.AdjustPeak.Decimal } if formData.AdjustValley.Valid { meter.AdjustValley = formData.AdjustValley.Decimal } valid, err := meter.Validate() if err != nil { result.Error(http.StatusInternalServerError, err.Error()) return } if !valid { result.NotAccept("抄表数据合法性验证失败。") return } tx := global.DBConn.NewSession() if err = tx.Begin(); err != nil { result.Error(http.StatusInternalServerError, err.Error()) return } defer tx.Close() err = service.EndUserService.UpdateEndUserRegisterRecord(tx, *meter) if err != nil { tx.Rollback() result.Error(http.StatusInternalServerError, err.Error()) return } err = tx.Commit() if err != nil { tx.Rollback() result.Error(http.StatusInternalServerError, err.Error()) return } result.Success("指定终端用户抄表记录已经更新。") }