123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292 |
- package service
- import (
- "database/sql"
- "fmt"
- "time"
- "crazy-fox-backend-api/config"
- "crazy-fox-backend-api/global"
- "crazy-fox-backend-api/model"
- "crazy-fox-backend-api/repo"
- "crazy-fox-backend-api/utils"
- "crazy-fox-backend-api/utils/answer"
- "github.com/gin-gonic/gin"
- "github.com/pkg/errors"
- "github.com/xuri/excelize/v2"
- )
- const (
- typeAct = "act" // 活动
- typeFunc = "func" // 功能
- )
- // excelService Excel表格操作服务
- type excelService struct{}
- // OpenReader 解析请求中的文件内容
- func (This *excelService) OpenReader(c *gin.Context) *excelize.File {
- file, _, err := c.Request.FormFile("file")
- if err != nil {
- answer.FailWithMessage("接收文件失败", err, c)
- }
- xlsx, err := excelize.OpenReader(file)
- if err != nil {
- answer.FailWithMessage("文件解析失败", err, c)
- }
- return xlsx
- }
- // ReadExcel 读取Excel中的数据
- func (This *excelService) ReadExcel(xlsx *excelize.File) ([][][]string, error) {
- var sheetList = xlsx.GetSheetList()
- var infoList = make([][][]string, 0, 4)
- for i := 0; i < len(sheetList); i++ {
- rows, err := xlsx.GetRows(sheetList[i])
- if err != nil {
- return nil, errors.WithStack(err)
- }
- infoList = append(infoList, rows)
- }
- return infoList, nil
- }
- // Excel2Info 将Excel工作表中的数据 转换成相应数据结构
- func (This *excelService) Excel2Info(options model.ExcelOptions, excelInfo [][][]string) (resData any, err error) {
- resData = struct{}{}
- switch options.Type {
- case typeAct:
- var detailInfo model.ActDetailInfo
- if err = Activity.parseBasicActConf(&detailInfo, excelInfo[0], options.Name); err != nil {
- return resData, errors.Wrap(err, "解析活动的基础配置项失败")
- }
- detailInfo.ActShowConf, err = Activity.NewSubAct(options.Name).handleActImport(&detailInfo, excelInfo)
- resData = detailInfo
- case typeFunc:
- switch options.Name {
- case config.LvCoinsFunc:
- err = Activity.actLvCoins.handleActLvCoinsImport(excelInfo)
- case config.TreasureFunc:
- err = Activity.actTreasure.handleProbImport(excelInfo, options.Params)
- case config.SysMailFunc:
- resData, err = SysMail.handleTemplateImport(excelInfo)
- case config.SlotWeightProbFunc:
- err = Slot.handleWeightGroupsProbImport(excelInfo, options.Params)
- case config.SlotSpinsLostFunc, config.SlotLostDayFunc, config.SlotLimitDayFunc:
- err = Slot.handleWeightAmendImport(excelInfo, options.Name)
- case config.SlotStealFloorFunc:
- err = Slot.handleStealFloorImport(excelInfo)
- case config.SlotStealCoinFunc:
- err = Slot.handleStealCoinImport(excelInfo)
- case config.SlotAttackCoinFunc:
- err = Slot.handleAttackCoinImport(excelInfo)
- case config.SlotSpinsFloorFunc:
- err = Slot.handleSpinsFloorImport(excelInfo)
- case config.SlotSpinsPotGoodsFunc:
- err = Slot.handleSpinsBankGoodsImport(excelInfo)
- case config.SlotSpinsPotWeightFunc:
- err = Slot.handleSpinsBankWeightImport(excelInfo)
- case config.IslandBasicConfFunc:
- err = Island.handleBasicConfImport(excelInfo)
- case config.IslandThemeFunc:
- err = Island.handleThemeImport(excelInfo)
- case config.NormalCardGroupFunc, config.TimeLimitCardGroupFunc:
- err = Card.handleCardImport(excelInfo, options.Name)
- case config.SkinChestFunc:
- err = Card.handleSkinChestImport(excelInfo)
- case config.FruitSlotLevelCoinFunc:
- err = FruitSlot.handleLevelCoinImport(excelInfo)
- case config.SignInPrizeFunc:
- err = SignIn.handlePrizeConfImport(excelInfo, options.Params)
- case config.PetConfFunc:
- err = Pet.handleBasicConfImport(excelInfo, options.Params)
- case config.ShareConfFunc:
- err = Social.handleShareConfImport(excelInfo)
- case config.PushConfFunc:
- err = Push.Import(excelInfo)
- case config.VipUsers:
- err = Waiter.handleVipsImport(excelInfo, options.Params)
- default:
- err = errors.New(fmt.Sprintf("未匹配到功能类型: %s\n", options.Name))
- }
- default:
- err = errors.New(fmt.Sprintf("未匹配到此类型: %s\n", options.Type))
- }
- return resData, errors.WithStack(err)
- }
- // Info2Excel 将数据转化成Excel表格
- func (This *excelService) Info2Excel(options model.ExcelOptions) (filePath string, err error) {
- xlsx := excelize.NewFile()
- var fileName = new(string)
- switch options.Type {
- case typeAct:
- switch options.Name {
- default:
- err = errors.New("未匹配到活动类型: " + options.Name)
- }
- case typeFunc:
- switch options.Name {
- case "test": // 示例
- err = This.handleTestActivityExport(xlsx, fileName)
- case config.LvCoinsFunc:
- err = Activity.actLvCoins.handleActLvCoinsExport(xlsx, fileName)
- case config.TreasureFunc:
- err = Activity.actTreasure.handleProbExport(xlsx, fileName, options.Params)
- case config.SlotWeightProbFunc:
- err = Slot.handleWeightGroupsProbExport(xlsx, fileName, options.Params)
- case config.SlotSpinsLostFunc, config.SlotLostDayFunc, config.SlotLimitDayFunc:
- err = Slot.handleWeightAmendExport(xlsx, fileName, options.Name)
- case config.SlotStealFloorFunc:
- err = Slot.handleStealFloorExport(xlsx, fileName)
- case config.SlotStealCoinFunc:
- err = Slot.handleStealCoinExport(xlsx, fileName)
- case config.SlotAttackCoinFunc:
- err = Slot.handleAttackCoinExport(xlsx, fileName)
- case config.SlotSpinsFloorFunc:
- err = Slot.handleSpinsFloorExport(xlsx, fileName)
- case config.SlotSpinsPotGoodsFunc:
- err = Slot.handleSpinsBankGoodsExport(xlsx, fileName)
- case config.SlotSpinsPotWeightFunc:
- err = Slot.handleSpinsBankWeightExport(xlsx, fileName)
- case config.IslandBasicConfFunc:
- err = Island.handleBasicConfExport(xlsx, fileName)
- case config.IslandThemeFunc:
- err = Island.handleThemeExport(xlsx, fileName)
- case config.NormalCardGroupFunc, config.TimeLimitCardGroupFunc:
- err = Card.handleCardExport(xlsx, fileName, options.Name)
- case config.SkinChestFunc:
- err = Card.handleSkinChestExport(xlsx, fileName)
- case config.FruitSlotLevelCoinFunc:
- err = FruitSlot.handleLevelCoinExport(xlsx, fileName)
- case config.SignInPrizeFunc:
- err = SignIn.handlePrizeConfExport(xlsx, fileName, options.Params)
- case config.PetConfFunc:
- err = Pet.handleBasicConfExport(xlsx, fileName, options.Params)
- case config.ShareConfFunc:
- err = Social.handleShareConfExport(xlsx, fileName)
- case config.PushConfFunc:
- err = Push.Export(xlsx, fileName)
- case config.VipUsers:
- err = Waiter.handleVipsExport(xlsx, fileName, options.Params)
- default:
- err = errors.New("未匹配到功能类型: " + options.Name)
- }
- default:
- err = errors.New("未匹配到此类型: " + options.Type)
- }
- if err != nil {
- return "", errors.WithStack(err)
- }
- filePath = This.getFilePath(*fileName, options)
- This.setXlsxDefaultStyle(xlsx)
- err = xlsx.SaveAs(filePath)
- return filePath, err
- }
- func (This *excelService) handleTestActivityExport(xlsx *excelize.File, fileName *string) error {
- infoList, err := repo.Excel.GetTestTableInfo()
- if err != nil && !errors.Is(err, sql.ErrNoRows) {
- return errors.WithStack(err)
- }
- // 工作表1
- sheetName := "工作表1"
- if err = xlsx.SetSheetName("Sheet1", sheetName); err != nil {
- return errors.WithStack(err)
- }
- titles := []string{"等级", "中文名", "英文名", "资源ID"}
- if err = xlsx.SetSheetRow(sheetName, "A1", &titles); err != nil {
- return errors.WithStack(err)
- }
- for i := 0; i < len(infoList); i++ {
- oneInfo := infoList[i]
- axis := fmt.Sprintf("A%d", i+2)
- if err = xlsx.SetSheetRow(sheetName, axis, &[]interface{}{
- oneInfo.LevelId,
- oneInfo.Name,
- oneInfo.NameEn,
- oneInfo.PictureId,
- }); err != nil {
- return errors.WithStack(err)
- }
- }
- // 工作表2
- sheetName = "工作表2"
- if _, err = xlsx.NewSheet(sheetName); err != nil {
- return errors.WithStack(err)
- }
- titles = []string{"等级2", "中文名2", "英文名2", "资源ID2"}
- if err = xlsx.SetSheetRow(sheetName, "A1", &titles); err != nil {
- return errors.WithStack(err)
- }
- for i := 0; i < len(infoList); i++ {
- oneInfo := infoList[i]
- axis := fmt.Sprintf("A%d", i+2)
- if err = xlsx.SetSheetRow(sheetName, axis, &[]interface{}{
- oneInfo.LevelId,
- oneInfo.Name,
- oneInfo.NameEn,
- oneInfo.PictureId,
- }); err != nil {
- return errors.WithStack(err)
- }
- }
- return nil
- }
- // getFilePath 生成Excel文件路径
- func (This *excelService) getFilePath(fileName string, options model.ExcelOptions) string {
- if fileName == "" {
- fileName = utils.Concat(options.Type, "_", options.Name)
- }
- fileName = utils.Concat(fileName, "_", time.Now().Format("2006-01-02-150405.000"))
- return utils.Concat(global.Config.Excel.Dir, fileName, ".xlsx")
- }
- // 设置表格的默认样式
- func (This *excelService) setXlsxDefaultStyle(xlsx *excelize.File) {
- style, err := xlsx.NewStyle(&excelize.Style{Alignment: &excelize.Alignment{Horizontal: "center", Vertical: "center"}})
- if err != nil {
- return
- }
- sheetList := xlsx.GetSheetList()
- for _, sheetName := range sheetList {
- rows, err := xlsx.GetRows(sheetName)
- if err != nil {
- return
- }
- if err = xlsx.SetRowStyle(sheetName, 1, len(rows), style); err != nil {
- return
- }
- }
- }
|