upload_file.go 5.2 KB

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