business_file.go 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  1. package proj
  2. import (
  3. "context"
  4. "dashoo.cn/opms_libary/myerrors"
  5. "dashoo.cn/opms_libary/plugin/dingtalk"
  6. "encoding/base64"
  7. "fmt"
  8. "github.com/gogf/gf/util/gconv"
  9. "io"
  10. "net/http"
  11. "strings"
  12. projDao "dashoo.cn/micro/app/dao/proj"
  13. model "dashoo.cn/micro/app/model/proj"
  14. "dashoo.cn/micro/app/service"
  15. )
  16. type businessFileService struct {
  17. *service.ContextService
  18. Dao *projDao.ProjBusinessFileDao
  19. }
  20. func NewBusinessFileService(ctx context.Context) (svc *businessFileService, err error) {
  21. svc = new(businessFileService)
  22. if svc.ContextService, err = svc.Init(ctx); err != nil {
  23. return nil, err
  24. }
  25. svc.Dao = projDao.NewProjBusinessFileDao(svc.Tenant)
  26. return svc, nil
  27. }
  28. func (p *businessFileService) GetList(busId int64) (fileList []*model.ProjBusinessFile, err error) {
  29. err = p.Dao.Where(p.Dao.C.BusId, busId).Order("id desc").Scan(&fileList)
  30. return
  31. }
  32. func (p *businessFileService) GetEntityById(id int64) (business *model.ProjBusinessFile, err error) {
  33. err = p.Dao.Where(projDao.ProjBusinessFile.C.Id, id).Scan(&business)
  34. return
  35. }
  36. func (p *businessFileService) Create(req *model.ProjBusinessFileReq) (err error) {
  37. businessData := new(model.ProjBusinessFile)
  38. if err = gconv.Struct(req, businessData); err != nil {
  39. return
  40. }
  41. service.SetCreatedInfo(businessData, p.GetCxtUserId(), p.GetCxtUserName())
  42. _, err = p.Dao.Insert(businessData)
  43. return
  44. }
  45. func (p *businessFileService) DeleteByIds(ids []int64) (err error) {
  46. _, err = p.Dao.WhereIn(projDao.ProjBusinessFile.C.Id, ids).Delete()
  47. return
  48. }
  49. func (p businessFileService) DownloadDingTalkFile(id int) (string, error) {
  50. ent, err := p.Dao.WherePri(id).One()
  51. if err != nil {
  52. return "", err
  53. }
  54. if ent == nil {
  55. return "", myerrors.TipsError("附件不存在")
  56. }
  57. if !strings.HasPrefix(ent.FileUrl, "dingtalk") {
  58. return "", myerrors.TipsError("此附件不是钉钉附件")
  59. }
  60. fileInfo := strings.Split(ent.FileUrl, ":")
  61. if len(fileInfo) != 3 {
  62. return "", myerrors.TipsError("钉钉附件地址不合法")
  63. }
  64. spaceId := fileInfo[1]
  65. fileId := fileInfo[2]
  66. // res, err := dingtalk.Client.GetStorage().AddPermission(dingtalk.Client.Context.CorpId, spaceId, s.userInfo.DingtalkId, "EDITOR", "USER")
  67. // fmt.Println(res, err)
  68. // if err != nil {
  69. // return "", fmt.Errorf("设置权限异常 %s", err.Error())
  70. // }
  71. resp, err := dingtalk.Client.GetStorage().QueryFileDownloadInfo(spaceId, fileId, p.CxtUser.DingtalkId)
  72. if err != nil {
  73. return "", myerrors.TipsError("获取文件下载信息异常")
  74. }
  75. fmt.Println(resp, err)
  76. req, err := http.NewRequest("GET", resp.HeaderSignatureInfo.ResourceUrls[0], nil)
  77. if err != nil {
  78. return "", fmt.Errorf("构建文件下载请求异常 %s", err.Error())
  79. }
  80. for k, v := range resp.HeaderSignatureInfo.Headers {
  81. req.Header.Add(k, v)
  82. }
  83. fileresp, err := http.DefaultClient.Do(req)
  84. if err != nil {
  85. return "", fmt.Errorf("文件下载异常 %s", err.Error())
  86. }
  87. data, err := io.ReadAll(fileresp.Body)
  88. if err != nil {
  89. return "", fmt.Errorf("读取下载内容异常 %s", err.Error())
  90. }
  91. return base64.StdEncoding.EncodeToString(data), nil
  92. }