byte_core_service.go 2.3 KB
package domainService

import (
	"bytes"
	"github.com/beego/beego/v2/client/httplib"
	"gitlab.fjmaimaimai.com/allied-creation/character-library-metadata-bastion/pkg/domain"
	"gitlab.fjmaimaimai.com/allied-creation/character-library-metadata-bastion/pkg/domain/bytecore"
	"gitlab.fjmaimaimai.com/allied-creation/character-library-metadata-bastion/pkg/infrastructure/excel"
)

type ByteCoreService struct {
	TempDataTable map[int]*bytecore.DataLoadDataTable
}

var ByteCore = &ByteCoreService{} //bytecore.ByteLibService

func (ptr *ByteCoreService) LoadDataTable(param bytecore.ReqLoadDataTable) (*bytecore.DataLoadDataTable, error) {
	if v, ok := ptr.load(param.FileId); ok {
		return v.Filter(param.Where), nil
	}
	file, err := httplib.Get(param.Url).Bytes()
	if err != nil {
		return nil, err
	}
	reader := bytes.NewReader(file)
	var importer *excel.Importer
	if param.Ext == domain.XLSX {
		importer = excel.NewExcelImport(&excel.XLXSReader{})
	} else if param.Ext == domain.XLS {
		importer = excel.NewExcelImport(&excel.XLSReader{})
	}
	data, err := importer.OpenExcelFromIoReader(reader)
	if err != nil {
		return nil, err
	}
	cols := importer.Reader().Header().Columns

	var response = &bytecore.DataLoadDataTable{
		FileId:       param.FileId,
		DataFields:   columnToField(cols),
		DataRows:     data,
		Total:        len(data),
		PageNumber:   param.PageNumber,
		InValidCells: make([]bytecore.InValidCell, 0),
	}

	ptr.save(param.FileId, response)
	return response.Filter(param.Where), nil
}

func (ptr *ByteCoreService) EditTable(param bytecore.ReqEditDataTable) (*bytecore.DataEditDataTable, error) {
	return nil, nil
}

func (ptr *ByteCoreService) save(fileId int, dataTable *bytecore.DataLoadDataTable) {
	// Once
	if ptr.TempDataTable == nil {
		ptr.TempDataTable = make(map[int]*bytecore.DataLoadDataTable)
	}
	ptr.TempDataTable[fileId] = dataTable
}

func (ptr *ByteCoreService) load(fileId int) (*bytecore.DataLoadDataTable, bool) {
	v, ok := ptr.TempDataTable[fileId]
	return v, ok
}

func columnToField(cols []string) []*bytecore.Field {
	var fields []*bytecore.Field
	for i, col := range cols {
		fields = append(fields, &bytecore.Field{
			Name:  col,
			Index: i + 1,
			Type:  "string",
		})
	}
	return fields
}

//////////////
// 字库核心
//////////////

func CreateByteCoreService() (*ByteCoreService, error) {
	return ByteCore, nil
}