feed_service.go 8.2 KB

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