| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144 |
- package result
- import (
- "context"
- "encoding/json"
- "errors"
- "lims_adapter/dao/consequent"
- "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 *consequent.ConsequentDao
- ConsequentDetailDao *consequent.ConsequentDetailDao
- Tenant string
- }
- // NewSrv 服务初始化
- func NewSrv(tenant string) Service {
- return Service{ConsequentDao: consequent.NewConsequentDao(tenant), ConsequentDetailDao: consequent.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
- })
- }
- // 获取成果基本信息
- func (s Service) GetResultConsequent(req comm_def.IdOnlyReq) (result_def.ResultList, error) {
- var result result_def.ResultList
- query := s.ConsequentDao.M
- query.Where("Id = ?", req.Id).Scan(&result)
- mediaIds := []uint{}
- json.Unmarshal([]byte(result.MediaIds), &mediaIds)
- log.Println(mediaIds)
- fields := "Id, FileName as Name, Url"
- if len(mediaIds) > 0 {
- s.ConsequentDao.DB.Model("media").Where("Id IN (?)", mediaIds).Fields(fields).Scan(&result.Files)
- }
- return result, nil
- }
|