pasture_sync_service.go 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375
  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: operationPb.FormulaType_Kind(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. // FeedInsert 饲料数据同步 todo 后面优化成有就更新,没有则新增
  214. func (s *StoreEntry) FeedInsert(ctx context.Context, groupPasture *model.GroupPasture, list []*model.Feed) error {
  215. res := make([]*model.Forage, 0)
  216. for _, data := range list {
  217. forageSourceName := data.Source
  218. forageSourceId := operationPb.ForageSource_SYSTEM_BUILT_IN
  219. if forageSourceName == "用户自定义" {
  220. forageSourceId = operationPb.ForageSource_USER_DEFINED
  221. }
  222. confirmStart := operationPb.IsShow_INVALID
  223. if data.ConfirmStart == 0 {
  224. confirmStart = operationPb.IsShow_NO
  225. }
  226. if data.ConfirmStart == 1 {
  227. confirmStart = operationPb.IsShow_OK
  228. }
  229. if data.Id <= 0 {
  230. continue
  231. }
  232. res = append(res, &model.Forage{
  233. Name: data.FName,
  234. CategoryId: data.FClassId,
  235. CategoryName: data.FClass,
  236. MaterialType: 0, // 牧场端找不到这个字段
  237. UniqueEncode: data.FeedCode,
  238. ForageSourceId: forageSourceId,
  239. ForageSourceName: forageSourceName,
  240. PlanTypeId: operationPb.ForagePlanType_Kind(data.PrintGroupId),
  241. PlanTypeName: data.PrintGroup,
  242. SmallMaterialScale: data.SmtMrName,
  243. AllowError: data.AllowRatio,
  244. PackageWeight: data.UnitWeight,
  245. Price: int64(data.UPrice * 100),
  246. JumpWeight: data.AutoZone,
  247. JumpDelay: operationPb.JumpDelaType_Kind(data.AutoSecond),
  248. ConfirmStart: confirmStart,
  249. RelayLocations: int64(data.TrgAddress),
  250. Jmp: operationPb.IsShow_Kind(data.Jmp),
  251. DataSource: operationPb.DataSource_FROM_PASTURE,
  252. Sort: int64(data.Sort),
  253. PastureId: groupPasture.PastureId,
  254. PastureName: groupPasture.Name,
  255. PastureDataId: data.Id,
  256. IsShow: operationPb.IsShow_Kind(data.Enable),
  257. IsDelete: operationPb.IsShow_OK,
  258. })
  259. }
  260. if err := s.DB.Model(new(model.Forage)).Create(res).Error; err != nil {
  261. return xerr.WithStack(err)
  262. }
  263. return nil
  264. }
  265. // FeedFormulaDetailListSyncData 饲料配方详情同步
  266. func (s *StoreEntry) FeedFormulaDetailListSyncData(ctx context.Context, req *operationPb.FeedFormulaSyncRequest) error {
  267. groupPastureList, err := s.DataSyncGroupPastureList(ctx)
  268. if err != nil {
  269. return xerr.WithStack(err)
  270. }
  271. var (
  272. ok bool
  273. groupPasture *model.GroupPasture
  274. )
  275. for _, pastureDetail := range groupPastureList {
  276. if pastureDetail.Id != int64(req.PastureId) {
  277. continue
  278. }
  279. groupPasture = pastureDetail
  280. ok = true
  281. }
  282. if ok {
  283. total := 0
  284. page := 1
  285. pageSize := 100
  286. for i := 0; i <= total; i++ {
  287. body := &model.FeedFormulaListRequest{
  288. PastureId: int32(groupPasture.PastureId),
  289. Page: int32(page),
  290. PageSize: int32(pageSize),
  291. }
  292. response := &model.FeedFormulaDetailListResponse{}
  293. if _, err = s.PastureHttpClient(ctx, model.FeedFormulaDetailListAsyncUrl, int64(req.PastureId), body, response); err != nil {
  294. return xerr.WithStack(err)
  295. }
  296. if response.Code != http.StatusOK {
  297. return xerr.Customf("%s", response.Msg)
  298. }
  299. if response.Data.Total > 0 && response.Data.List != nil {
  300. total = int(math.Ceil(float64(response.Data.Total) / float64(pageSize)))
  301. }
  302. if err = s.FeedFormulaDetailInsert(ctx, groupPasture, response.Data.List); err != nil {
  303. return xerr.WithStack(err)
  304. }
  305. }
  306. }
  307. return nil
  308. }
  309. func (s *StoreEntry) FeedFormulaDetailInsert(ctx context.Context, groupPasture *model.GroupPasture, list []*model.FeedTemplateDetail) error {
  310. res := make([]*model.FeedFormulaDetail, 0)
  311. for _, data := range list {
  312. if data.Id <= 0 {
  313. continue
  314. }
  315. isLockCowCountRatio := 0
  316. if data.IsLockCount == 0 {
  317. isLockCowCountRatio = 2
  318. }
  319. if data.IsLockCount == 1 {
  320. isLockCowCountRatio = 1
  321. }
  322. res = append(res, &model.FeedFormulaDetail{
  323. PastureId: groupPasture.PastureId,
  324. PastureName: groupPasture.Name,
  325. PastureDataId: data.Id,
  326. ForageId: data.FId,
  327. FeedFormulaId: data.FtId,
  328. Weight: int32(data.FWeight * 100),
  329. ForageGroupName: data.FeedGroup,
  330. ForageName: data.FName,
  331. StirDelay: data.AutoSecond,
  332. AllowError: data.Deviation,
  333. Prefit: data.PreFtId,
  334. IsShow: operationPb.IsShow_OK,
  335. IsLockCowCountRatio: operationPb.IsShow_Kind(isLockCowCountRatio),
  336. Sort: data.Sort,
  337. })
  338. }
  339. if err := s.DB.Model(new(model.FeedFormulaDetail)).Create(res).Error; err != nil {
  340. return xerr.WithStack(err)
  341. }
  342. return nil
  343. }