package controller import ( "electricity_bill_calc/excel" "electricity_bill_calc/response" "electricity_bill_calc/security" "electricity_bill_calc/service" "net/http" "strconv" "github.com/gin-gonic/gin" "github.com/samber/lo" ) func InitializeEndUserController(router *gin.Engine) { router.GET("/report/:rid/submeter", security.EnterpriseAuthorize, fetchEndUserInReport) router.GET("/report/:rid/meter/template", security.EnterpriseAuthorize, downloadEndUserRegisterTemplate) router.POST("/report/:rid/meter/batch", security.EnterpriseAuthorize, uploadEndUserRegisterTemplate) } 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") if !ensureReportBelongs(c, result, requestReportId) { return } 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)}) }