feat(report):完成峰谷用户抄表Excel导出功能。

This commit is contained in:
徐涛 2022-08-22 22:31:40 +08:00
parent d1a27d6d81
commit ef214c135b
3 changed files with 140 additions and 0 deletions

View File

@ -1,6 +1,7 @@
package controller package controller
import ( import (
"electricity_bill_calc/excel"
"electricity_bill_calc/response" "electricity_bill_calc/response"
"electricity_bill_calc/security" "electricity_bill_calc/security"
"electricity_bill_calc/service" "electricity_bill_calc/service"
@ -12,6 +13,7 @@ import (
func InitializeEndUserController(router *gin.Engine) { func InitializeEndUserController(router *gin.Engine) {
router.GET("/report/:rid/submeter", security.EnterpriseAuthorize, fetchEndUserInReport) router.GET("/report/:rid/submeter", security.EnterpriseAuthorize, fetchEndUserInReport)
router.GET("/report/:rid/meter/template", security.EnterpriseAuthorize, downloadEndUserRegisterTemplate)
} }
func fetchEndUserInReport(c *gin.Context) { func fetchEndUserInReport(c *gin.Context) {
@ -38,3 +40,24 @@ func fetchEndUserInReport(c *gin.Context) {
gin.H{"meters": endUsers}, 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)
}

108
excel/meter_pv_template.go Normal file
View File

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

View File

@ -38,3 +38,12 @@ func (_EndUserService) SearchEndUserRecord(reportId, keyword string, page int) (
Find(&endUsers) Find(&endUsers)
return endUsers, total, err 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
}