package result import ( "context" "errors" "lims_adapter/dao" "log" "dashoo.cn/common_definition/admin/result_def" "dashoo.cn/common_definition/comm_def" "dashoo.cn/micro_libary/request" "github.com/gogf/gf/database/gdb" ) type Service struct { ConsequentDao *dao.ConsequentDao ConsequentDetailDao *dao.ConsequentDetailDao Tenant string } // NewSrv 服务初始化 func NewSrv(tenant string) Service { return Service{ConsequentDao: dao.NewConsequentDao(tenant), ConsequentDetailDao: dao.NewConsequentDetailDao(tenant), Tenant: tenant} } func (s Service) GetResultList(req result_def.ResultListReq) ([]result_def.ResultList, int, error) { query := s.ConsequentDao.M log.Println(req.PublishTime) // FILTER if len(req.PublishTime) == 2 { query = query.Where("(PublishTime BETWEEN ? and ?)", (req.PublishTime)[0], (req.PublishTime)[1]) } if req.Name != "" { query = query.Where("Name LIKE ?", "%"+req.Name+"%") } if req.ProjectId != 0 { query = query.Where("ProjectId = ?", req.ProjectId) } total, err := query.Count() if err != nil { return nil, 0, errors.New("读取行数失败") } // 无数据返回空 if total == 0 { return nil, 0, nil } // FIXME owners_name: ["123,123333,实验室管理员,123"],没有拆分类,原接口亦是如此 data, err := query.Page(int(req.Current), int(req.Size)).FindAll() result := make([]result_def.ResultList, 0, 0) data.Structs(&result) return result, total, err } // 论文批量插入 func (s Service) BatchInsertPapers(insertList []result_def.BatchInsertPapersReq, userInfo request.UserInfo) (int, int, int, []interface{}, error) { failCount := 0 duplicatedCount := 0 failList := []interface{}{} successCount := 0 for _, p := range insertList { p.Detail.CreatedBy = userInfo.RealName p.Detail.CreatedById = int(userInfo.Id) p.Detail.UpdatedBy = userInfo.RealName p.Detail.UpdatedById = int(userInfo.Id) p.Entity.CreatedBy = userInfo.RealName // 由于使用string接收,应该对时间字符串校验,无法解析直接nil if *p.Entity.PublishTime == "" { p.Entity.PublishTime = nil } // TODO 查询优化 // 防止重复插入论文 r, _ := s.ConsequentDetailDao.M.Where("PaperTopic=? or PaperPage=?", p.Detail.PaperTopic, p.Detail.PaperPage).Where("PaperPage!=''").One() if len(r) > 0 { duplicatedCount += 1 continue } InsertId, err := s.ConsequentDao.M.InsertAndGetId(p.Entity) if err == nil { p.Detail.ConsequentId = int(InsertId) _, err = s.ConsequentDetailDao.M.Insert(p.Detail) // 如果Detail插入失败则删除成果主表记录 if err != nil { s.ConsequentDao.Where("id=?", InsertId).Delete() failCount += 1 failList = append(failList, map[string]string{ "title": p.Detail.PaperTopic, "error": "", }) } else { successCount += 1 } } else { failCount += 1 failList = append(failList, map[string]string{ "title": p.Detail.PaperTopic, "error": "", }) } } return failCount, successCount, duplicatedCount, failList, nil } // 删除成果 func (s Service) DeleteResult(req comm_def.IdOnlyReq) error { ctx := context.TODO() return s.ConsequentDao.Transaction(ctx, func(ctx context.Context, tx *gdb.TX) error { if err := s.ConsequentDao.Transaction(ctx, func(ctx context.Context, tx *gdb.TX) error { _, err := s.ConsequentDao.M.Ctx(ctx).Where("Id = ?", req.Id).Delete() return err }); err != nil { return err } if err := s.ConsequentDetailDao.Transaction(ctx, func(ctx context.Context, tx *gdb.TX) error { _, err := s.ConsequentDetailDao.M.Ctx(ctx).Where("ConsequentId = ?", req.Id).Delete() return err }); err != nil { return err } return nil }) }