diff --git a/controller/end_user.go b/controller/end_user.go index 0261d71..5d485db 100644 --- a/controller/end_user.go +++ b/controller/end_user.go @@ -9,6 +9,7 @@ import ( "strconv" "github.com/gin-gonic/gin" + "github.com/samber/lo" ) func InitializeEndUserController(router *gin.Engine) { @@ -52,12 +53,28 @@ func downloadEndUserRegisterTemplate(c *gin.Context) { result.NotFound(err.Error()) return } - gen := excel.NewMeterPVExcelTemplateGenerator() - defer gen.Close() - gen.WriteMeterData(users) + 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=抄表记录.xslx") + + gen := lo.Ternary[excel.ExcelTemplateGenerator]( + meterType == 0, + excel.NewMeterNonPVExcelTemplateGenerator(), + excel.NewMeterPVExcelTemplateGenerator(), + ) + defer gen.Close() + gen.WriteMeterData(users) gen.WriteTo(c.Writer) } diff --git a/excel/abstract.go b/excel/abstract.go index cde4444..96b424e 100644 --- a/excel/abstract.go +++ b/excel/abstract.go @@ -1,6 +1,7 @@ package excel import ( + "electricity_bill_calc/model" "electricity_bill_calc/tools" "encoding/json" "fmt" @@ -14,6 +15,12 @@ import ( "github.com/xuri/excelize/v2" ) +type ExcelTemplateGenerator interface { + Close() + WriteTo(w io.Writer) (int64, error) + WriteMeterData(meters []model.EndUserDetail) error +} + type ColumnRecognizer struct { Pattern []string Tag string diff --git a/excel/meter_non_pv_template.go b/excel/meter_non_pv_template.go new file mode 100644 index 0000000..4a7d9dc --- /dev/null +++ b/excel/meter_non_pv_template.go @@ -0,0 +1,90 @@ +package excel + +import ( + "electricity_bill_calc/model" + "io" + + "github.com/xuri/excelize/v2" +) + +type MeterNonPVExcelTemplateGenerator struct { + file *excelize.File +} + +// 生成峰谷计量抄表Excel模板 +func NewMeterNonPVExcelTemplateGenerator() *MeterNonPVExcelTemplateGenerator { + return &MeterNonPVExcelTemplateGenerator{ + file: excelize.NewFile(), + } +} + +func (MeterNonPVExcelTemplateGenerator) titles() []interface{} { + return []interface{}{ + "序号", + "用户名称", + "户址", + "电表编号", + "倍率", + "上期表底(总)", + "本期表底(总)", + "退补电量(总)", + } +} + +func (t *MeterNonPVExcelTemplateGenerator) Close() { + t.file.Close() +} + +func (t MeterNonPVExcelTemplateGenerator) WriteTo(w io.Writer) (int64, error) { + return t.file.WriteTo(w) +} + +func (t *MeterNonPVExcelTemplateGenerator) 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, 8, 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, + nil, + }, + excelize.RowOpts{Height: 15}, + ); err != nil { + return err + } + } + if err = stream.Flush(); err != nil { + return err + } + return nil +} diff --git a/service/report.go b/service/report.go index 9a21d3a..d771402 100644 --- a/service/report.go +++ b/service/report.go @@ -342,3 +342,20 @@ func (_ReportService) ProgressReportWillDilutedFee(report model.Report) (err err _, err = global.DBConn.ID(report.Id).Cols("step_state").Update(report) return } + +func (_ReportService) RetreiveParkEndUserMeterType(reportId string) (int, error) { + var types = make([]int, 0) + err := global.DBConn. + Table("park").Alias("p"). + Join("INNER", []string{"report", "r"}, "r.park_id=p.id"). + Where(builder.Eq{"r.id": reportId}). + Select("p.meter_04kv_type"). + Find(&types) + if err != nil { + return -1, err + } + if len(types) == 0 { + return -1, nil + } + return types[0], nil +}