pasture_sync_service.go 8.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274
  1. package backend
  2. import (
  3. "context"
  4. "errors"
  5. "kpt-tmr-group/model"
  6. "kpt-tmr-group/pkg/xerr"
  7. operationPb "kpt-tmr-group/proto/go/backend/operation"
  8. "math"
  9. "net/http"
  10. "gorm.io/gorm"
  11. )
  12. const (
  13. FeedCategory = "feed"
  14. FeedCategoryDelete = "feed_delete"
  15. CowCategory = "cow"
  16. CowCategoryDelete = "cow_delete"
  17. )
  18. func (s *StoreEntry) CategorySyncData(ctx context.Context, req *operationPb.CategorySyncRequest) error {
  19. pastureDetail, err := s.GetGroupPastureListById(ctx, int64(req.PastureId))
  20. if err != nil {
  21. return xerr.WithStack(err)
  22. }
  23. switch req.KeyWord {
  24. case FeedCategory:
  25. history := &model.ForageCategory{}
  26. if err = s.DB.Model(new(model.ForageCategory)).
  27. Where("pasture_id = ?", req.PastureId).
  28. Where("data_id = ?", req.Id).
  29. Where("data_source = ? ", operationPb.DataSource_FROM_PASTURE).
  30. First(history).Error; err != nil {
  31. if !errors.Is(err, gorm.ErrRecordNotFound) {
  32. return xerr.WithStack(err)
  33. }
  34. }
  35. if history.IsShow == operationPb.IsShow_OK && history.Id > 0 {
  36. if err = s.DB.Model(new(model.ForageCategory)).Where("id = ?", history.Id).Updates(map[string]interface{}{
  37. "number": req.Number,
  38. "is_show": req.IsShow,
  39. "parent_id": req.ParentId,
  40. "parent_name": req.ParentName,
  41. "name": req.Name,
  42. }).Error; err != nil {
  43. return xerr.WithStack(err)
  44. }
  45. }
  46. newFeedData := model.NewPastureForageCategory(req, pastureDetail)
  47. if err = s.DB.Model(new(model.ForageCategory)).Create(newFeedData).Error; err != nil {
  48. return xerr.WithStack(err)
  49. }
  50. case CowCategory:
  51. history := &model.CattleCategory{}
  52. if err = s.DB.Model(new(model.CattleCategory)).
  53. Where("pasture_id = ?", req.PastureId).
  54. Where("data_id = ?", req.Id).
  55. Where("data_source = ? ", operationPb.DataSource_FROM_PASTURE).
  56. First(history).Error; err != nil {
  57. if !errors.Is(err, gorm.ErrRecordNotFound) {
  58. return xerr.WithStack(err)
  59. }
  60. }
  61. if history.IsShow == operationPb.IsShow_OK && history.Id > 0 {
  62. if err = s.DB.Model(new(model.CattleCategory)).Where("id = ?", history.Id).Updates(map[string]interface{}{
  63. "number": req.Number,
  64. "is_show": req.IsShow,
  65. "parent_id": req.ParentId,
  66. "parent_name": req.ParentName,
  67. "name": req.Name,
  68. }).Error; err != nil {
  69. return xerr.WithStack(err)
  70. }
  71. }
  72. newCattleData := model.NewPastureCattleCategory(req, pastureDetail)
  73. if err = s.DB.Model(new(model.CattleCategory)).Create(newCattleData).Error; err != nil {
  74. return xerr.WithStack(err)
  75. }
  76. }
  77. return nil
  78. }
  79. func (s *StoreEntry) CategoryDeleteData(ctx context.Context, req *operationPb.CategoryDeleteRequest) error {
  80. var modelValue interface{}
  81. switch req.KeyWord {
  82. case FeedCategoryDelete:
  83. modelValue = new(model.ForageCategory)
  84. case CowCategoryDelete:
  85. modelValue = new(model.CattleCategory)
  86. }
  87. if modelValue == nil {
  88. return nil
  89. }
  90. if err := s.DB.Model(modelValue).Where("data_id = ?", req.DataId).
  91. Where("pasture_id = ?", req.PastureId).Where("data_source = ?", operationPb.DataSource_FROM_PASTURE).
  92. Updates(map[string]interface{}{
  93. "is_delete": operationPb.IsShow_OK,
  94. }).Error; err != nil {
  95. return xerr.WithStack(err)
  96. }
  97. return nil
  98. }
  99. func (s *StoreEntry) FeedFormulaSyncData(ctx context.Context, req *operationPb.FeedFormulaSyncRequest) error {
  100. groupPastureList, err := s.DataSyncGroupPastureList(ctx)
  101. if err != nil {
  102. return xerr.WithStack(err)
  103. }
  104. var (
  105. ok bool
  106. groupPasture *model.GroupPasture
  107. )
  108. for _, pastureDetail := range groupPastureList {
  109. if pastureDetail.Id != int64(req.PastureId) {
  110. continue
  111. }
  112. groupPasture = pastureDetail
  113. ok = true
  114. }
  115. if ok {
  116. total := 0
  117. page := 1
  118. pageSize := 100
  119. for i := 0; i <= total; i++ {
  120. body := &model.FeedFormulaListRequest{
  121. PastureId: int32(groupPasture.PastureId),
  122. Page: int32(page),
  123. PageSize: int32(pageSize),
  124. }
  125. response := &model.FeedFormulaListResponse{}
  126. if _, err = s.PastureHttpClient(ctx, model.FeedFormulaAsyncUrl, int64(req.PastureId), body, response); err != nil {
  127. return xerr.WithStack(err)
  128. }
  129. if response.Code != http.StatusOK {
  130. return xerr.Customf("%s", response.Msg)
  131. }
  132. if response.Data.Total > 0 && response.Data.List != nil {
  133. total = int(math.Ceil(float64(response.Data.Total) / float64(pageSize)))
  134. }
  135. if err = s.FeedFormulaInsert(ctx, groupPasture, response.Data.List); err != nil {
  136. return xerr.WithStack(err)
  137. }
  138. }
  139. }
  140. return nil
  141. }
  142. func (s *StoreEntry) FeedFormulaInsert(ctx context.Context, groupPasture *model.GroupPasture, list []*model.FeedTemplate) error {
  143. res := make([]*model.FeedFormula, 0)
  144. for _, data := range list {
  145. res = append(res, &model.FeedFormula{
  146. Name: data.TName,
  147. Colour: data.TColor,
  148. EncodeNumber: data.TCode,
  149. CattleCategoryId: operationPb.CattleCategoryParent_Kind(data.CCid),
  150. CattleCategoryName: data.CCName,
  151. FormulaTypeId: data.FTTypeId,
  152. FormulaTypeName: data.FTType,
  153. DataSourceId: operationPb.DataSource_FROM_PASTURE,
  154. DataSourceName: "牧场同步",
  155. Remarks: data.Remark,
  156. Version: data.Version,
  157. PastureId: groupPasture.PastureId,
  158. PastureName: groupPasture.Name,
  159. PastureDataId: data.Id,
  160. IsShow: operationPb.IsShow_Kind(data.Enable),
  161. IsModify: operationPb.IsShow_Kind(data.IsModify),
  162. IsDelete: operationPb.IsShow_OK,
  163. })
  164. }
  165. if err := s.DB.Model(new(model.FeedFormula)).Create(res).Error; err != nil {
  166. return xerr.WithStack(err)
  167. }
  168. return nil
  169. }
  170. func (s *StoreEntry) FeedSyncData(ctx context.Context, req *operationPb.FeedFormulaSyncRequest) error {
  171. groupPastureList, err := s.DataSyncGroupPastureList(ctx)
  172. if err != nil {
  173. return xerr.WithStack(err)
  174. }
  175. var (
  176. ok bool
  177. groupPasture *model.GroupPasture
  178. )
  179. for _, pastureDetail := range groupPastureList {
  180. if pastureDetail.Id != int64(req.PastureId) {
  181. continue
  182. }
  183. groupPasture = pastureDetail
  184. ok = true
  185. }
  186. if ok {
  187. total := 0
  188. page := 1
  189. pageSize := 100
  190. for i := 0; i <= total; i++ {
  191. body := &model.FeedFormulaListRequest{
  192. PastureId: int32(groupPasture.PastureId),
  193. Page: int32(page),
  194. PageSize: int32(pageSize),
  195. }
  196. response := &model.FeedListResponse{}
  197. if _, err = s.PastureHttpClient(ctx, model.FeedAsyncUrl, int64(req.PastureId), body, response); err != nil {
  198. return xerr.WithStack(err)
  199. }
  200. if response.Code != http.StatusOK {
  201. return xerr.Customf("%s", response.Msg)
  202. }
  203. if response.Data.Total > 0 && response.Data.List != nil {
  204. total = int(math.Ceil(float64(response.Data.Total) / float64(pageSize)))
  205. }
  206. if err = s.FeedInsert(ctx, groupPasture, response.Data.List); err != nil {
  207. return xerr.WithStack(err)
  208. }
  209. }
  210. }
  211. return nil
  212. }
  213. func (s *StoreEntry) FeedInsert(ctx context.Context, groupPasture *model.GroupPasture, list []*model.Feed) error {
  214. res := make([]*model.Forage, 0)
  215. for _, data := range list {
  216. forageSourceName := data.Source
  217. forageSourceId := operationPb.ForageSource_SYSTEM_BUILT_IN
  218. if forageSourceName == "用户自定义" {
  219. forageSourceId = operationPb.ForageSource_USER_DEFINED
  220. }
  221. res = append(res, &model.Forage{
  222. Name: data.FName,
  223. CategoryId: data.FClassId,
  224. CategoryName: data.FClass,
  225. MaterialType: 0,
  226. UniqueEncode: data.FeedCode,
  227. ForageSourceId: forageSourceId,
  228. ForageSourceName: forageSourceName,
  229. PlanTypeId: operationPb.ForagePlanType_Kind(data.PrintGroupId),
  230. PlanTypeName: data.PrintGroup,
  231. SmallMaterialScale: data.SmtMrName,
  232. AllowError: data.AllowRatio,
  233. PackageWeight: data.UnitWeight,
  234. Price: int64(data.UPrice * 100),
  235. JumpWeight: data.AutoZone,
  236. JumpDelay: operationPb.JumpDelaType_Kind(data.AutoSecond),
  237. ConfirmStart: operationPb.IsShow_Kind(data.ConfirmStart),
  238. RelayLocations: int64(data.TrgAddress),
  239. Jmp: operationPb.IsShow_Kind(data.Jmp),
  240. DataSource: operationPb.DataSource_FROM_PASTURE,
  241. Sort: int64(data.Sort),
  242. PastureName: groupPasture.Name,
  243. PastureDataId: data.Id,
  244. IsShow: operationPb.IsShow_Kind(data.Enable),
  245. IsDelete: operationPb.IsShow_OK,
  246. })
  247. }
  248. if err := s.DB.Model(new(model.Forage)).Create(res).Error; err != nil {
  249. return xerr.WithStack(err)
  250. }
  251. return nil
  252. }