result.go 3.6 KB

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