excel.go 8.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292
  1. package service
  2. import (
  3. "database/sql"
  4. "fmt"
  5. "time"
  6. "crazy-fox-backend-api/config"
  7. "crazy-fox-backend-api/global"
  8. "crazy-fox-backend-api/model"
  9. "crazy-fox-backend-api/repo"
  10. "crazy-fox-backend-api/utils"
  11. "crazy-fox-backend-api/utils/answer"
  12. "github.com/gin-gonic/gin"
  13. "github.com/pkg/errors"
  14. "github.com/xuri/excelize/v2"
  15. )
  16. const (
  17. typeAct = "act" // 活动
  18. typeFunc = "func" // 功能
  19. )
  20. // excelService Excel表格操作服务
  21. type excelService struct{}
  22. // OpenReader 解析请求中的文件内容
  23. func (This *excelService) OpenReader(c *gin.Context) *excelize.File {
  24. file, _, err := c.Request.FormFile("file")
  25. if err != nil {
  26. answer.FailWithMessage("接收文件失败", err, c)
  27. }
  28. xlsx, err := excelize.OpenReader(file)
  29. if err != nil {
  30. answer.FailWithMessage("文件解析失败", err, c)
  31. }
  32. return xlsx
  33. }
  34. // ReadExcel 读取Excel中的数据
  35. func (This *excelService) ReadExcel(xlsx *excelize.File) ([][][]string, error) {
  36. var sheetList = xlsx.GetSheetList()
  37. var infoList = make([][][]string, 0, 4)
  38. for i := 0; i < len(sheetList); i++ {
  39. rows, err := xlsx.GetRows(sheetList[i])
  40. if err != nil {
  41. return nil, errors.WithStack(err)
  42. }
  43. infoList = append(infoList, rows)
  44. }
  45. return infoList, nil
  46. }
  47. // Excel2Info 将Excel工作表中的数据 转换成相应数据结构
  48. func (This *excelService) Excel2Info(options model.ExcelOptions, excelInfo [][][]string) (resData any, err error) {
  49. resData = struct{}{}
  50. switch options.Type {
  51. case typeAct:
  52. var detailInfo model.ActDetailInfo
  53. if err = Activity.parseBasicActConf(&detailInfo, excelInfo[0], options.Name); err != nil {
  54. return resData, errors.Wrap(err, "解析活动的基础配置项失败")
  55. }
  56. detailInfo.ActShowConf, err = Activity.NewSubAct(options.Name).handleActImport(&detailInfo, excelInfo)
  57. resData = detailInfo
  58. case typeFunc:
  59. switch options.Name {
  60. case config.LvCoinsFunc:
  61. err = Activity.actLvCoins.handleActLvCoinsImport(excelInfo)
  62. case config.TreasureFunc:
  63. err = Activity.actTreasure.handleProbImport(excelInfo, options.Params)
  64. case config.SysMailFunc:
  65. resData, err = SysMail.handleTemplateImport(excelInfo)
  66. case config.SlotWeightProbFunc:
  67. err = Slot.handleWeightGroupsProbImport(excelInfo, options.Params)
  68. case config.SlotSpinsLostFunc, config.SlotLostDayFunc, config.SlotLimitDayFunc:
  69. err = Slot.handleWeightAmendImport(excelInfo, options.Name)
  70. case config.SlotStealFloorFunc:
  71. err = Slot.handleStealFloorImport(excelInfo)
  72. case config.SlotStealCoinFunc:
  73. err = Slot.handleStealCoinImport(excelInfo)
  74. case config.SlotAttackCoinFunc:
  75. err = Slot.handleAttackCoinImport(excelInfo)
  76. case config.SlotSpinsFloorFunc:
  77. err = Slot.handleSpinsFloorImport(excelInfo)
  78. case config.SlotSpinsPotGoodsFunc:
  79. err = Slot.handleSpinsBankGoodsImport(excelInfo)
  80. case config.SlotSpinsPotWeightFunc:
  81. err = Slot.handleSpinsBankWeightImport(excelInfo)
  82. case config.IslandBasicConfFunc:
  83. err = Island.handleBasicConfImport(excelInfo)
  84. case config.IslandThemeFunc:
  85. err = Island.handleThemeImport(excelInfo)
  86. case config.NormalCardGroupFunc, config.TimeLimitCardGroupFunc:
  87. err = Card.handleCardImport(excelInfo, options.Name)
  88. case config.SkinChestFunc:
  89. err = Card.handleSkinChestImport(excelInfo)
  90. case config.FruitSlotLevelCoinFunc:
  91. err = FruitSlot.handleLevelCoinImport(excelInfo)
  92. case config.SignInPrizeFunc:
  93. err = SignIn.handlePrizeConfImport(excelInfo, options.Params)
  94. case config.PetConfFunc:
  95. err = Pet.handleBasicConfImport(excelInfo, options.Params)
  96. case config.ShareConfFunc:
  97. err = Social.handleShareConfImport(excelInfo)
  98. case config.PushConfFunc:
  99. err = Push.Import(excelInfo)
  100. case config.VipUsers:
  101. err = Waiter.handleVipsImport(excelInfo, options.Params)
  102. default:
  103. err = errors.New(fmt.Sprintf("未匹配到功能类型: %s\n", options.Name))
  104. }
  105. default:
  106. err = errors.New(fmt.Sprintf("未匹配到此类型: %s\n", options.Type))
  107. }
  108. return resData, errors.WithStack(err)
  109. }
  110. // Info2Excel 将数据转化成Excel表格
  111. func (This *excelService) Info2Excel(options model.ExcelOptions) (filePath string, err error) {
  112. xlsx := excelize.NewFile()
  113. var fileName = new(string)
  114. switch options.Type {
  115. case typeAct:
  116. switch options.Name {
  117. default:
  118. err = errors.New("未匹配到活动类型: " + options.Name)
  119. }
  120. case typeFunc:
  121. switch options.Name {
  122. case "test": // 示例
  123. err = This.handleTestActivityExport(xlsx, fileName)
  124. case config.LvCoinsFunc:
  125. err = Activity.actLvCoins.handleActLvCoinsExport(xlsx, fileName)
  126. case config.TreasureFunc:
  127. err = Activity.actTreasure.handleProbExport(xlsx, fileName, options.Params)
  128. case config.SlotWeightProbFunc:
  129. err = Slot.handleWeightGroupsProbExport(xlsx, fileName, options.Params)
  130. case config.SlotSpinsLostFunc, config.SlotLostDayFunc, config.SlotLimitDayFunc:
  131. err = Slot.handleWeightAmendExport(xlsx, fileName, options.Name)
  132. case config.SlotStealFloorFunc:
  133. err = Slot.handleStealFloorExport(xlsx, fileName)
  134. case config.SlotStealCoinFunc:
  135. err = Slot.handleStealCoinExport(xlsx, fileName)
  136. case config.SlotAttackCoinFunc:
  137. err = Slot.handleAttackCoinExport(xlsx, fileName)
  138. case config.SlotSpinsFloorFunc:
  139. err = Slot.handleSpinsFloorExport(xlsx, fileName)
  140. case config.SlotSpinsPotGoodsFunc:
  141. err = Slot.handleSpinsBankGoodsExport(xlsx, fileName)
  142. case config.SlotSpinsPotWeightFunc:
  143. err = Slot.handleSpinsBankWeightExport(xlsx, fileName)
  144. case config.IslandBasicConfFunc:
  145. err = Island.handleBasicConfExport(xlsx, fileName)
  146. case config.IslandThemeFunc:
  147. err = Island.handleThemeExport(xlsx, fileName)
  148. case config.NormalCardGroupFunc, config.TimeLimitCardGroupFunc:
  149. err = Card.handleCardExport(xlsx, fileName, options.Name)
  150. case config.SkinChestFunc:
  151. err = Card.handleSkinChestExport(xlsx, fileName)
  152. case config.FruitSlotLevelCoinFunc:
  153. err = FruitSlot.handleLevelCoinExport(xlsx, fileName)
  154. case config.SignInPrizeFunc:
  155. err = SignIn.handlePrizeConfExport(xlsx, fileName, options.Params)
  156. case config.PetConfFunc:
  157. err = Pet.handleBasicConfExport(xlsx, fileName, options.Params)
  158. case config.ShareConfFunc:
  159. err = Social.handleShareConfExport(xlsx, fileName)
  160. case config.PushConfFunc:
  161. err = Push.Export(xlsx, fileName)
  162. case config.VipUsers:
  163. err = Waiter.handleVipsExport(xlsx, fileName, options.Params)
  164. default:
  165. err = errors.New("未匹配到功能类型: " + options.Name)
  166. }
  167. default:
  168. err = errors.New("未匹配到此类型: " + options.Type)
  169. }
  170. if err != nil {
  171. return "", errors.WithStack(err)
  172. }
  173. filePath = This.getFilePath(*fileName, options)
  174. This.setXlsxDefaultStyle(xlsx)
  175. err = xlsx.SaveAs(filePath)
  176. return filePath, err
  177. }
  178. func (This *excelService) handleTestActivityExport(xlsx *excelize.File, fileName *string) error {
  179. infoList, err := repo.Excel.GetTestTableInfo()
  180. if err != nil && !errors.Is(err, sql.ErrNoRows) {
  181. return errors.WithStack(err)
  182. }
  183. // 工作表1
  184. sheetName := "工作表1"
  185. if err = xlsx.SetSheetName("Sheet1", sheetName); err != nil {
  186. return errors.WithStack(err)
  187. }
  188. titles := []string{"等级", "中文名", "英文名", "资源ID"}
  189. if err = xlsx.SetSheetRow(sheetName, "A1", &titles); err != nil {
  190. return errors.WithStack(err)
  191. }
  192. for i := 0; i < len(infoList); i++ {
  193. oneInfo := infoList[i]
  194. axis := fmt.Sprintf("A%d", i+2)
  195. if err = xlsx.SetSheetRow(sheetName, axis, &[]interface{}{
  196. oneInfo.LevelId,
  197. oneInfo.Name,
  198. oneInfo.NameEn,
  199. oneInfo.PictureId,
  200. }); err != nil {
  201. return errors.WithStack(err)
  202. }
  203. }
  204. // 工作表2
  205. sheetName = "工作表2"
  206. if _, err = xlsx.NewSheet(sheetName); err != nil {
  207. return errors.WithStack(err)
  208. }
  209. titles = []string{"等级2", "中文名2", "英文名2", "资源ID2"}
  210. if err = xlsx.SetSheetRow(sheetName, "A1", &titles); err != nil {
  211. return errors.WithStack(err)
  212. }
  213. for i := 0; i < len(infoList); i++ {
  214. oneInfo := infoList[i]
  215. axis := fmt.Sprintf("A%d", i+2)
  216. if err = xlsx.SetSheetRow(sheetName, axis, &[]interface{}{
  217. oneInfo.LevelId,
  218. oneInfo.Name,
  219. oneInfo.NameEn,
  220. oneInfo.PictureId,
  221. }); err != nil {
  222. return errors.WithStack(err)
  223. }
  224. }
  225. return nil
  226. }
  227. // getFilePath 生成Excel文件路径
  228. func (This *excelService) getFilePath(fileName string, options model.ExcelOptions) string {
  229. if fileName == "" {
  230. fileName = utils.Concat(options.Type, "_", options.Name)
  231. }
  232. fileName = utils.Concat(fileName, "_", time.Now().Format("2006-01-02-150405.000"))
  233. return utils.Concat(global.Config.Excel.Dir, fileName, ".xlsx")
  234. }
  235. // 设置表格的默认样式
  236. func (This *excelService) setXlsxDefaultStyle(xlsx *excelize.File) {
  237. style, err := xlsx.NewStyle(&excelize.Style{Alignment: &excelize.Alignment{Horizontal: "center", Vertical: "center"}})
  238. if err != nil {
  239. return
  240. }
  241. sheetList := xlsx.GetSheetList()
  242. for _, sheetName := range sheetList {
  243. rows, err := xlsx.GetRows(sheetName)
  244. if err != nil {
  245. return
  246. }
  247. if err = xlsx.SetRowStyle(sheetName, 1, len(rows), style); err != nil {
  248. return
  249. }
  250. }
  251. }