upload_file.go 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193
  1. package backend
  2. import (
  3. "context"
  4. "fmt"
  5. "kpt-pasture/config"
  6. "kpt-pasture/model"
  7. "kpt-pasture/util"
  8. "mime/multipart"
  9. "os"
  10. "path/filepath"
  11. "strconv"
  12. "time"
  13. "gitee.com/xuyiping_admin/pkg/logger/zaplog"
  14. "go.uber.org/zap"
  15. pasturePb "gitee.com/xuyiping_admin/go_proto/proto/go/backend/cow"
  16. "gitee.com/xuyiping_admin/pkg/xerr"
  17. )
  18. func (s *StoreEntry) Photos(ctx context.Context, files []*multipart.FileHeader) ([]string, error) {
  19. userModel, err := s.GetUserModel(ctx)
  20. if err != nil {
  21. return nil, err
  22. }
  23. workDir := fmt.Sprintf("%s", config.WorkDir)
  24. pathDir := fmt.Sprintf("/files/photos/%d/%s", userModel.AppPasture.Id, time.Now().Local().Format("20060102"))
  25. saveDir := filepath.Join(workDir, pathDir)
  26. if _, err = os.Stat(saveDir); os.IsNotExist(err) {
  27. if err = os.MkdirAll(saveDir, 0755); err != nil {
  28. return nil, xerr.Customf("创建目录失败: %s", err.Error())
  29. }
  30. }
  31. // 处理每个文件
  32. filePaths := make([]string, len(files))
  33. for i, file := range files {
  34. contentType := file.Header.Get("Content-Type")
  35. if contentType != "image/jpeg" && contentType != "image/png" && contentType != "image/gif" {
  36. return nil, xerr.Customf("图片格式错误: %s", file.Filename)
  37. }
  38. if file.Size > 1024*1024*5 {
  39. return nil, xerr.Customf("单个图片文件不能超过5MB")
  40. }
  41. ext := filepath.Ext(file.Filename)
  42. if ext == "" {
  43. switch contentType {
  44. case "image/jpeg":
  45. ext = ".jpg"
  46. case "image/png":
  47. ext = ".png"
  48. case "image/gif":
  49. ext = ".gif"
  50. default:
  51. ext = ".jpg" // 默认
  52. }
  53. }
  54. randomName := util.GenerateRandomNumberString(32)
  55. finalFilename := randomName + ext
  56. fPath := filepath.Join(saveDir, finalFilename)
  57. urlPath := filepath.Join(pathDir, finalFilename)
  58. if err = util.SaveUploadedFile(file, fPath); err != nil {
  59. return nil, xerr.Customf("保存文件失败: %s", err.Error())
  60. }
  61. filePaths[i] = urlPath
  62. }
  63. return filePaths, nil
  64. }
  65. func (s *StoreEntry) ImportExcel(ctx context.Context, data [][]string) error {
  66. // 获取当前用户信息
  67. userModel, err := s.GetUserModel(ctx)
  68. if err != nil {
  69. return err
  70. }
  71. penMap := model.PenMap
  72. // 验证牧场ID
  73. if userModel.AppPasture.Id <= 0 {
  74. return xerr.Custom("无效的牧场ID")
  75. }
  76. // 处理Excel数据
  77. //headers := data[0]
  78. eventEnterList := make([]*pasturePb.EventEnterRequest, 0)
  79. for _, row := range data[1:] {
  80. if len(row) <= 0 {
  81. continue
  82. }
  83. ts := &pasturePb.EventEnterRequest{}
  84. zaplog.Error("row", zap.Any("row", row))
  85. for j, d := range row {
  86. switch j {
  87. case 0:
  88. continue
  89. case 1:
  90. continue
  91. case 2:
  92. ts.EarNumber = d
  93. case 3:
  94. if pn, ok := penMap[d]; ok {
  95. ts.PenId = pn
  96. ts.PenName = d
  97. }
  98. case 4:
  99. ts.Sex = pasturePb.Genders_Female
  100. if d == "公" {
  101. ts.Sex = pasturePb.Genders_Male
  102. }
  103. case 5:
  104. if d == "成母牛" {
  105. ts.CowType = pasturePb.CowType_Breeding_Calf
  106. } else if d == "犊牛" {
  107. ts.CowType = pasturePb.CowType_Lactating_Calf
  108. } else if d == "青年牛" {
  109. ts.CowType = pasturePb.CowType_Youth_Calf
  110. } else if d == "育成牛" {
  111. ts.CowType = pasturePb.CowType_Reserve_Calf
  112. }
  113. case 6:
  114. continue
  115. case 7:
  116. bat, _ := util.TimeParseLocal(model.LayoutTime2, d)
  117. if !bat.IsZero() {
  118. ts.BirthAt = int32(bat.Local().Unix())
  119. }
  120. case 8:
  121. lact, _ := strconv.Atoi(d)
  122. ts.Lact = int32(lact)
  123. case 9:
  124. eat, _ := util.TimeParseLocal(model.LayoutTime2, d)
  125. if !eat.IsZero() {
  126. ts.EnterAt = int32(eat.Local().Unix())
  127. }
  128. case 10:
  129. ts.FatherNumber = d
  130. case 11:
  131. ts.MotherNumber = d
  132. case 12:
  133. mat, _ := util.TimeParseLocal(model.LayoutTime2, d)
  134. if !mat.IsZero() {
  135. ts.MatingAt = int32(mat.Local().Unix())
  136. }
  137. case 13:
  138. continue
  139. case 14:
  140. continue
  141. case 15:
  142. mt, _ := strconv.Atoi(d)
  143. ts.MatingTimes = int32(mt)
  144. case 16:
  145. continue
  146. case 17:
  147. pat, _ := util.TimeParseLocal(model.LayoutTime2, d)
  148. if !pat.IsZero() {
  149. ts.PregnancyCheckAt = int32(pat.Local().Unix())
  150. }
  151. case 18:
  152. continue
  153. case 19:
  154. continue
  155. case 20:
  156. cat, _ := util.TimeParseLocal(model.LayoutTime2, d)
  157. if !cat.IsZero() {
  158. ts.CalvingAt = int32(cat.Local().Unix())
  159. }
  160. case 21:
  161. continue
  162. case 22:
  163. continue
  164. case 23:
  165. continue
  166. case 24:
  167. ts.CowKind = pasturePb.CowKind_AGSN
  168. }
  169. }
  170. eventEnterList = append(eventEnterList, ts)
  171. break
  172. }
  173. if len(eventEnterList) <= 0 {
  174. return nil
  175. }
  176. zaplog.Error("eventEnterList", zap.Any("eventEnterList", eventEnterList))
  177. return nil
  178. }