enhance(report):导出用户抄表模板完成,提取公共生成器类型。
This commit is contained in:
parent
ef214c135b
commit
67cfb60515
|
@ -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)
|
||||||
}
|
}
|
||||||
|
|
|
@ -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
|
||||||
|
|
90
excel/meter_non_pv_template.go
Normal file
90
excel/meter_non_pv_template.go
Normal 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
|
||||||
|
}
|
|
@ -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
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue
Block a user