forked from free-lancers/electricity_bill_calc_service
		
	enhance(report):导出用户抄表模板完成,提取公共生成器类型。
This commit is contained in:
		| @@ -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) | ||||
| } | ||||
|   | ||||
| @@ -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 | ||||
|   | ||||
							
								
								
									
										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) | ||||
| 	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 | ||||
| } | ||||
|   | ||||
		Reference in New Issue
	
	Block a user