enhance(report):导出用户抄表模板完成,提取公共生成器类型。

This commit is contained in:
徐涛 2022-08-22 22:52:17 +08:00
parent ef214c135b
commit 67cfb60515
4 changed files with 134 additions and 3 deletions

View File

@ -9,6 +9,7 @@ import (
"strconv" "strconv"
"github.com/gin-gonic/gin" "github.com/gin-gonic/gin"
"github.com/samber/lo"
) )
func InitializeEndUserController(router *gin.Engine) { func InitializeEndUserController(router *gin.Engine) {
@ -52,12 +53,28 @@ func downloadEndUserRegisterTemplate(c *gin.Context) {
result.NotFound(err.Error()) result.NotFound(err.Error())
return return
} }
gen := excel.NewMeterPVExcelTemplateGenerator() meterType, err := service.ReportService.RetreiveParkEndUserMeterType(requestReportId)
defer gen.Close() if err != nil {
gen.WriteMeterData(users) result.Error(http.StatusInternalServerError, err.Error())
return
}
if meterType == -1 {
result.NotFound("未能确定用户表计类型。")
return
}
c.Status(http.StatusOK) c.Status(http.StatusOK)
c.Header("Content-Type", "application/octet-stream") c.Header("Content-Type", "application/octet-stream")
c.Header("Content-Transfer-Encoding", "binary") c.Header("Content-Transfer-Encoding", "binary")
c.Header("Content-Disposition", "attachment; filename=抄表记录.xslx") 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) gen.WriteTo(c.Writer)
} }

View File

@ -1,6 +1,7 @@
package excel package excel
import ( import (
"electricity_bill_calc/model"
"electricity_bill_calc/tools" "electricity_bill_calc/tools"
"encoding/json" "encoding/json"
"fmt" "fmt"
@ -14,6 +15,12 @@ import (
"github.com/xuri/excelize/v2" "github.com/xuri/excelize/v2"
) )
type ExcelTemplateGenerator interface {
Close()
WriteTo(w io.Writer) (int64, error)
WriteMeterData(meters []model.EndUserDetail) error
}
type ColumnRecognizer struct { type ColumnRecognizer struct {
Pattern []string Pattern []string
Tag string Tag string

View File

@ -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
}

View File

@ -342,3 +342,20 @@ func (_ReportService) ProgressReportWillDilutedFee(report model.Report) (err err
_, err = global.DBConn.ID(report.Id).Cols("step_state").Update(report) _, err = global.DBConn.ID(report.Id).Cols("step_state").Update(report)
return 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
}