From ef214c135b9c1cf77cf4810acd0e25b098cbb88e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BE=90=E6=B6=9B?= Date: Mon, 22 Aug 2022 22:31:40 +0800 Subject: [PATCH] =?UTF-8?q?feat(report):=E5=AE=8C=E6=88=90=E5=B3=B0?= =?UTF-8?q?=E8=B0=B7=E7=94=A8=E6=88=B7=E6=8A=84=E8=A1=A8Excel=E5=AF=BC?= =?UTF-8?q?=E5=87=BA=E5=8A=9F=E8=83=BD=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- controller/end_user.go | 23 ++++++++ excel/meter_pv_template.go | 108 +++++++++++++++++++++++++++++++++++++ service/end_user.go | 9 ++++ 3 files changed, 140 insertions(+) create mode 100644 excel/meter_pv_template.go diff --git a/controller/end_user.go b/controller/end_user.go index 558297a..0261d71 100644 --- a/controller/end_user.go +++ b/controller/end_user.go @@ -1,6 +1,7 @@ package controller import ( + "electricity_bill_calc/excel" "electricity_bill_calc/response" "electricity_bill_calc/security" "electricity_bill_calc/service" @@ -12,6 +13,7 @@ import ( func InitializeEndUserController(router *gin.Engine) { router.GET("/report/:rid/submeter", security.EnterpriseAuthorize, fetchEndUserInReport) + router.GET("/report/:rid/meter/template", security.EnterpriseAuthorize, downloadEndUserRegisterTemplate) } func fetchEndUserInReport(c *gin.Context) { @@ -38,3 +40,24 @@ func fetchEndUserInReport(c *gin.Context) { 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 + } + gen := excel.NewMeterPVExcelTemplateGenerator() + defer gen.Close() + gen.WriteMeterData(users) + c.Status(http.StatusOK) + c.Header("Content-Type", "application/octet-stream") + c.Header("Content-Transfer-Encoding", "binary") + c.Header("Content-Disposition", "attachment; filename=抄表记录.xslx") + gen.WriteTo(c.Writer) +} diff --git a/excel/meter_pv_template.go b/excel/meter_pv_template.go new file mode 100644 index 0000000..c26a812 --- /dev/null +++ b/excel/meter_pv_template.go @@ -0,0 +1,108 @@ +package excel + +import ( + "electricity_bill_calc/model" + "io" + + "github.com/xuri/excelize/v2" +) + +type MeterPVExcelTemplateGenerator struct { + file *excelize.File +} + +// 生成峰谷计量抄表Excel模板 +func NewMeterPVExcelTemplateGenerator() *MeterPVExcelTemplateGenerator { + return &MeterPVExcelTemplateGenerator{ + file: excelize.NewFile(), + } +} + +func (MeterPVExcelTemplateGenerator) titles() []interface{} { + return []interface{}{ + "序号", + "用户名称", + "户址", + "电表编号", + "倍率", + "上期表底(总)", + "本期表底(总)", + "上期表底(尖峰)", + "本期表底(尖峰)", + "上期表底(峰)", + "本期表底(峰)", + "上期表底(谷)", + "本期表底(谷)", + "退补电量(总)", + "退补电量(尖峰)", + "退补电量(峰)", + "退补电量(谷)", + } +} + +func (t *MeterPVExcelTemplateGenerator) Close() { + t.file.Close() +} + +func (t MeterPVExcelTemplateGenerator) WriteTo(w io.Writer) (int64, error) { + return t.file.WriteTo(w) +} + +func (t *MeterPVExcelTemplateGenerator) WriteMeterData(meters []model.EndUserDetail) error { + defaultSheet := t.file.GetSheetName(0) + stream, err := t.file.NewStreamWriter(defaultSheet) + if err != nil { + return err + } + firstCell, err := excelize.CoordinatesToCellName(1, 1) + if err != nil { + return err + } + stream.SetColWidth(2, 4, 20) + stream.SetColWidth(6, 17, 15) + stream.SetRow(firstCell, t.titles(), excelize.RowOpts{Height: 20}) + + for index, meter := range meters { + firstCell, err := excelize.CoordinatesToCellName(1, index+2) + if err != nil { + return err + } + customerName := "" + if meter.CustomerName != nil { + customerName = *meter.CustomerName + } + customerAddress := "" + if meter.Address != nil { + customerAddress = *meter.Address + } + if err = stream.SetRow( + firstCell, + []interface{}{ + meter.Seq, + customerName, + customerAddress, + meter.MeterId, + meter.Ratio, + meter.LastPeriodOverall, + nil, + meter.LastPeriodCritical, + nil, + meter.LastPeriodPeak, + nil, + meter.LastPeriodValley, + nil, + nil, + nil, + nil, + nil, + }, + excelize.RowOpts{Height: 15}, + ); err != nil { + return err + } + } + if err = stream.Flush(); err != nil { + return err + } + return nil +} diff --git a/service/end_user.go b/service/end_user.go index cc569b4..2b69ecb 100644 --- a/service/end_user.go +++ b/service/end_user.go @@ -38,3 +38,12 @@ func (_EndUserService) SearchEndUserRecord(reportId, keyword string, page int) ( Find(&endUsers) return endUsers, total, err } + +func (_EndUserService) AllEndUserRecord(reportId string) ([]model.EndUserDetail, error) { + users := make([]model.EndUserDetail, 0) + err := global.DBConn. + Where(builder.Eq{"report_id": reportId}). + Asc("seq"). + Find(&users) + return users, err +}