result.go 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144
  1. package result
  2. import (
  3. "context"
  4. "encoding/json"
  5. "errors"
  6. "lims_adapter/dao/consequent"
  7. "log"
  8. "dashoo.cn/common_definition/admin/result_def"
  9. "dashoo.cn/common_definition/comm_def"
  10. "dashoo.cn/micro_libary/request"
  11. "github.com/gogf/gf/database/gdb"
  12. )
  13. type Service struct {
  14. ConsequentDao *consequent.ConsequentDao
  15. ConsequentDetailDao *consequent.ConsequentDetailDao
  16. Tenant string
  17. }
  18. // NewSrv 服务初始化
  19. func NewSrv(tenant string) Service {
  20. return Service{ConsequentDao: consequent.NewConsequentDao(tenant), ConsequentDetailDao: consequent.NewConsequentDetailDao(tenant), Tenant: tenant}
  21. }
  22. func (s Service) GetResultList(req result_def.ResultListReq) ([]result_def.ResultList, int, error) {
  23. query := s.ConsequentDao.M
  24. log.Println(req.PublishTime)
  25. // FILTER
  26. if len(req.PublishTime) == 2 {
  27. query = query.Where("(PublishTime BETWEEN ? and ?)", (req.PublishTime)[0], (req.PublishTime)[1])
  28. }
  29. if req.Name != "" {
  30. query = query.Where("Name LIKE ?", "%"+req.Name+"%")
  31. }
  32. if req.ProjectId != 0 {
  33. query = query.Where("ProjectId = ?", req.ProjectId)
  34. }
  35. total, err := query.Count()
  36. if err != nil {
  37. return nil, 0, errors.New("读取行数失败")
  38. }
  39. // 无数据返回空
  40. if total == 0 {
  41. return nil, 0, nil
  42. }
  43. // FIXME owners_name: ["123,123333,实验室管理员,123"],没有拆分类,原接口亦是如此
  44. data, err := query.Page(int(req.Current), int(req.Size)).FindAll()
  45. result := make([]result_def.ResultList, 0, 0)
  46. data.Structs(&result)
  47. return result, total, err
  48. }
  49. // 论文批量插入
  50. func (s Service) BatchInsertPapers(insertList []result_def.BatchInsertPapersReq, userInfo request.UserInfo) (int, int, int, []interface{}, error) {
  51. failCount := 0
  52. duplicatedCount := 0
  53. failList := []interface{}{}
  54. successCount := 0
  55. for _, p := range insertList {
  56. p.Detail.CreatedBy = userInfo.RealName
  57. p.Detail.CreatedById = int(userInfo.Id)
  58. p.Detail.UpdatedBy = userInfo.RealName
  59. p.Detail.UpdatedById = int(userInfo.Id)
  60. p.Entity.CreatedBy = userInfo.RealName
  61. // 由于使用string接收,应该对时间字符串校验,无法解析直接nil
  62. if *p.Entity.PublishTime == "" {
  63. p.Entity.PublishTime = nil
  64. }
  65. // TODO 查询优化
  66. // 防止重复插入论文
  67. r, _ := s.ConsequentDetailDao.M.Where("PaperTopic=? or PaperPage=?", p.Detail.PaperTopic, p.Detail.PaperPage).Where("PaperPage!=''").One()
  68. if len(r) > 0 {
  69. duplicatedCount += 1
  70. continue
  71. }
  72. InsertId, err := s.ConsequentDao.M.InsertAndGetId(p.Entity)
  73. if err == nil {
  74. p.Detail.ConsequentId = int(InsertId)
  75. _, err = s.ConsequentDetailDao.M.Insert(p.Detail)
  76. // 如果Detail插入失败则删除成果主表记录
  77. if err != nil {
  78. s.ConsequentDao.Where("id=?", InsertId).Delete()
  79. failCount += 1
  80. failList = append(failList, map[string]string{
  81. "title": p.Detail.PaperTopic,
  82. "error": "",
  83. })
  84. } else {
  85. successCount += 1
  86. }
  87. } else {
  88. failCount += 1
  89. failList = append(failList, map[string]string{
  90. "title": p.Detail.PaperTopic,
  91. "error": "",
  92. })
  93. }
  94. }
  95. return failCount, successCount, duplicatedCount, failList, nil
  96. }
  97. // 删除成果
  98. func (s Service) DeleteResult(req comm_def.IdOnlyReq) error {
  99. ctx := context.TODO()
  100. return s.ConsequentDao.Transaction(ctx, func(ctx context.Context, tx *gdb.TX) error {
  101. if err := s.ConsequentDao.Transaction(ctx, func(ctx context.Context, tx *gdb.TX) error {
  102. _, err := s.ConsequentDao.M.Ctx(ctx).Where("Id = ?", req.Id).Delete()
  103. return err
  104. }); err != nil {
  105. return err
  106. }
  107. if err := s.ConsequentDetailDao.Transaction(ctx, func(ctx context.Context, tx *gdb.TX) error {
  108. _, err := s.ConsequentDetailDao.M.Ctx(ctx).Where("ConsequentId = ?", req.Id).Delete()
  109. return err
  110. }); err != nil {
  111. return err
  112. }
  113. return nil
  114. })
  115. }
  116. // 获取成果基本信息
  117. func (s Service) GetResultConsequent(req comm_def.IdOnlyReq) (result_def.ResultList, error) {
  118. var result result_def.ResultList
  119. query := s.ConsequentDao.M
  120. query.Where("Id = ?", req.Id).Scan(&result)
  121. mediaIds := []uint{}
  122. json.Unmarshal([]byte(result.MediaIds), &mediaIds)
  123. log.Println(mediaIds)
  124. fields := "Id, FileName as Name, Url"
  125. if len(mediaIds) > 0 {
  126. s.ConsequentDao.DB.Model("media").Where("Id IN (?)", mediaIds).Fields(fields).Scan(&result.Files)
  127. }
  128. return result, nil
  129. }