feed_service.go 8.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288
  1. package backend
  2. import (
  3. "bytes"
  4. "context"
  5. "errors"
  6. "fmt"
  7. "io"
  8. "kpt-tmr-group/model"
  9. "kpt-tmr-group/pkg/logger/zaplog"
  10. "kpt-tmr-group/pkg/xerr"
  11. operationPb "kpt-tmr-group/proto/go/backend/operation"
  12. "github.com/xuri/excelize/v2"
  13. "go.uber.org/zap"
  14. "gorm.io/gorm"
  15. )
  16. // CreateFeedFormula 添加数据
  17. func (s *StoreEntry) CreateFeedFormula(ctx context.Context, req *operationPb.AddFeedFormulaRequest) error {
  18. forage := model.NewFeedFormula(req)
  19. if err := s.DB.Create(forage).Error; err != nil {
  20. return xerr.WithStack(err)
  21. }
  22. return nil
  23. }
  24. // EditFeedFormula 编辑数据
  25. func (s *StoreEntry) EditFeedFormula(ctx context.Context, req *operationPb.AddFeedFormulaRequest) error {
  26. forage := model.FeedFormula{Id: int64(req.Id)}
  27. if err := s.DB.Where("is_delete = ?", operationPb.IsShow_OK).First(&forage).Error; err != nil {
  28. if errors.Is(err, gorm.ErrRecordNotFound) {
  29. return xerr.Custom("该数据不存在")
  30. }
  31. return xerr.WithStack(err)
  32. }
  33. updateData := &model.FeedFormula{
  34. Name: req.Name,
  35. Colour: req.Colour,
  36. CattleCategoryId: req.CattleCategoryId,
  37. CattleCategoryName: req.CattleCategoryName,
  38. FormulaTypeId: req.FormulaTypeId,
  39. FormulaTypeName: req.FormulaTypeName,
  40. DataSourceId: req.DataSourceId,
  41. DataSourceName: req.DataSourceName,
  42. Remarks: req.Remarks,
  43. IsShow: req.IsShow,
  44. }
  45. if err := s.DB.Model(new(model.FeedFormula)).
  46. Omit("is_show", "is_delete", "encode_number", "formula_type_id", "formula_type_name", "data_source", "version", "is_modify").
  47. Where("id = ?", req.Id).
  48. Updates(updateData).Error; err != nil {
  49. return xerr.WithStack(err)
  50. }
  51. return nil
  52. }
  53. // SearchFeedFormulaList 查询数据列表
  54. func (s *StoreEntry) SearchFeedFormulaList(ctx context.Context, req *operationPb.SearchFeedFormulaRequest) (*operationPb.SearchFeedFormulaListResponse, error) {
  55. feedFormula := make([]*model.FeedFormula, 0)
  56. var count int64 = 0
  57. pref := s.DB.Model(new(model.FeedFormula)).Where("is_delete = ?", operationPb.IsShow_OK)
  58. if req.Name != "" {
  59. pref.Where("name like ?", fmt.Sprintf("%s%s%s", "%", req.Name, "%"))
  60. }
  61. if req.CattleCategoryId > 0 {
  62. pref.Where("cattle_category_id = ?", req.CattleCategoryId)
  63. }
  64. if req.FormulaTypeId > 0 {
  65. pref.Where("formula_type_id = ?", req.FormulaTypeId)
  66. }
  67. if req.IsShow > 0 {
  68. pref.Where("is_show = ?", req.IsShow)
  69. }
  70. if req.DataSource > 0 {
  71. pref.Where("data_source = ?", req.DataSource)
  72. }
  73. if req.Remarks != "" {
  74. pref.Where("remarks = ?", req.Remarks)
  75. }
  76. if err := pref.Order("id desc").Count(&count).Limit(int(req.Pagination.PageSize)).Offset(int(req.Pagination.PageOffset)).
  77. Find(&feedFormula).Error; err != nil {
  78. return nil, xerr.WithStack(err)
  79. }
  80. return &operationPb.SearchFeedFormulaListResponse{
  81. Page: req.Pagination.Page,
  82. PageSize: req.Pagination.PageSize,
  83. Total: int32(count),
  84. List: model.FeedFormulaSlice(feedFormula).ToPB(),
  85. }, nil
  86. }
  87. // IsShowFeedFormula 是否启用和是否可修改
  88. func (s *StoreEntry) IsShowFeedFormula(ctx context.Context, req *operationPb.IsShowModifyFeedFormula) error {
  89. feedFormula := &model.FeedFormula{Id: int64(req.FeedFormulaId)}
  90. if err := s.DB.First(feedFormula).Error; err != nil {
  91. if errors.Is(err, gorm.ErrRecordNotFound) {
  92. return xerr.Custom("该数据不存在")
  93. }
  94. return xerr.WithStack(err)
  95. }
  96. if req.EditType == 1 {
  97. if err := s.DB.Model(new(model.FeedFormula)).Where("id = ?", req.FeedFormulaId).Update("is_show", req.IsShow).Error; err != nil {
  98. return xerr.WithStack(err)
  99. }
  100. }
  101. if req.EditType == 2 {
  102. if err := s.DB.Model(new(model.FeedFormula)).Where("id = ?", req.FeedFormulaId).Update("is_modify", req.IsShow).Error; err != nil {
  103. return xerr.WithStack(err)
  104. }
  105. }
  106. return nil
  107. }
  108. // DeleteFeedFormula 是否删除
  109. func (s *StoreEntry) DeleteFeedFormula(ctx context.Context, feedFormulaId int64) error {
  110. feedFormula := &model.FeedFormula{Id: feedFormulaId}
  111. if err := s.DB.First(feedFormula).Error; err != nil {
  112. if errors.Is(err, gorm.ErrRecordNotFound) {
  113. return xerr.Custom("该数据不存在")
  114. }
  115. return xerr.WithStack(err)
  116. }
  117. if err := s.DB.Model(new(model.FeedFormula)).Where("id = ?", feedFormula.Id).Update("is_delete", operationPb.IsShow_NO).Error; err != nil {
  118. return xerr.WithStack(err)
  119. }
  120. return nil
  121. }
  122. // ExcelImportFeedFormula 导入excel
  123. func (s *StoreEntry) ExcelImportFeedFormula(ctx context.Context, req io.Reader) error {
  124. xlsx, err := excelize.OpenReader(req)
  125. if err != nil {
  126. return xerr.WithStack(err)
  127. }
  128. defer xlsx.Close()
  129. rows, err := xlsx.GetRows(xlsx.GetSheetName(xlsx.GetActiveSheetIndex()))
  130. if err != nil {
  131. return xerr.WithStack(err)
  132. }
  133. if len(rows) > 10000 {
  134. rows = rows[:10000]
  135. }
  136. feedFormulaList := make([]*model.FeedFormula, 0)
  137. for i, row := range rows {
  138. if i == 0 {
  139. continue
  140. }
  141. var (
  142. name, encodeNumber, cattleCategoryName, formulaTypeName, dataSourceName, remarks, isShowStr string
  143. isShow operationPb.IsShow_Kind
  144. )
  145. for k, v := range row {
  146. if k == 0 {
  147. name = v
  148. }
  149. if k == 1 {
  150. encodeNumber = v
  151. }
  152. if k == 2 {
  153. cattleCategoryName = v
  154. }
  155. if k == 3 {
  156. formulaTypeName = v
  157. }
  158. if k == 4 {
  159. dataSourceName = v
  160. }
  161. if k == 5 {
  162. remarks = v
  163. }
  164. if k == 6 {
  165. isShowStr = v
  166. }
  167. }
  168. if isShowStr == "是" {
  169. isShow = operationPb.IsShow_OK
  170. } else {
  171. isShow = operationPb.IsShow_NO
  172. }
  173. feedFormulaItem := &model.FeedFormula{
  174. Name: name,
  175. EncodeNumber: encodeNumber,
  176. CattleCategoryName: cattleCategoryName,
  177. FormulaTypeName: formulaTypeName,
  178. Remarks: remarks,
  179. IsShow: isShow,
  180. IsDelete: operationPb.IsShow_OK,
  181. DataSourceId: operationPb.DataSource_EXCEL_IMPORT,
  182. DataSourceName: dataSourceName,
  183. }
  184. feedFormulaList = append(feedFormulaList, feedFormulaItem)
  185. }
  186. if len(feedFormulaList) > 0 {
  187. if err = s.DB.Create(feedFormulaList).Error; err != nil {
  188. return xerr.WithStack(err)
  189. }
  190. }
  191. return nil
  192. }
  193. // ExcelExportFeedFormula 流式导出excel
  194. func (s *StoreEntry) ExcelExportFeedFormula(ctx context.Context, req *operationPb.SearchFeedFormulaRequest) (*bytes.Buffer, error) {
  195. res, err := s.SearchFeedFormulaList(ctx, req)
  196. if err != nil {
  197. return nil, xerr.WithStack(err)
  198. }
  199. if len(res.List) <= 0 {
  200. return nil, xerr.Custom("数据为空")
  201. }
  202. file := excelize.NewFile()
  203. defer file.Close()
  204. streamWriter, err := file.NewStreamWriter("Sheet1")
  205. if err != nil {
  206. return nil, xerr.WithStack(err)
  207. }
  208. titles := []interface{}{"配方名称", "配方编码", "畜牧类别", "配方类别", "来源", "备注", "是否启用",
  209. "饲料组", "饲料名称", "重量(kg)", "搅拌延迟(min)", "是否锁定牛头数比例", "顺序"}
  210. if err = streamWriter.SetRow("A1", titles); err != nil {
  211. return nil, xerr.WithStack(err)
  212. }
  213. for i, item := range res.List {
  214. cell, err := excelize.CoordinatesToCellName(1, i+2)
  215. if err != nil {
  216. zaplog.Error("excelize.CoordinatesToCellName", zap.Any("Err", err))
  217. continue
  218. }
  219. row := make([]interface{}, 0)
  220. row = append(row, item.Name, item.EncodeNumber, item.CattleCategoryName, item.FormulaTypeName, item.DataSourceName,
  221. item.Remarks, item.IsShow)
  222. if err = streamWriter.SetRow(cell, row); err != nil {
  223. return nil, xerr.WithStack(err)
  224. }
  225. }
  226. if err = streamWriter.Flush(); err != nil {
  227. return nil, xerr.WithStack(err)
  228. }
  229. return file.WriteToBuffer()
  230. }
  231. // ExcelTemplateFeedFormula 导出模板
  232. func (s *StoreEntry) ExcelTemplateFeedFormula(ctx context.Context) (*bytes.Buffer, error) {
  233. file := excelize.NewFile()
  234. defer file.Close()
  235. streamWriter, err := file.NewStreamWriter("Sheet1")
  236. if err != nil {
  237. return nil, xerr.WithStack(err)
  238. }
  239. titles := []interface{}{"配方名称", "配方编码", "畜牧类别", "配方类别", "来源", "备注", "是否启用",
  240. "饲料组", "饲料名称", "重量(kg)", "搅拌延迟(min)", "是否锁定牛头数比例", "顺序"}
  241. if err = streamWriter.SetRow("A1", titles); err != nil {
  242. return nil, xerr.WithStack(err)
  243. }
  244. if err = streamWriter.Flush(); err != nil {
  245. return nil, xerr.WithStack(err)
  246. }
  247. return file.WriteToBuffer()
  248. }