docDownload.go 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109
  1. package service
  2. import (
  3. "app.yhyue.com/moapp/jy_docs/rpc/partnerlib/conversion"
  4. "app.yhyue.com/moapp/jy_docs/rpc/partnerlib/entity"
  5. IC "app.yhyue.com/moapp/jy_docs/rpc/partnerlib/init"
  6. "app.yhyue.com/moapp/jy_docs/rpc/partnerlib/type/partnerlib"
  7. "app.yhyue.com/moapp/jy_docs/rpc/partnerlib/util"
  8. "app.yhyue.com/moapp/jy_docs/rpc/partnerlib/warn"
  9. "app.yhyue.com/moapp/jy_docs/services/model"
  10. "app.yhyue.com/moapp/jy_docs/services/partner"
  11. "app.yhyue.com/moapp/jybase/common"
  12. "app.yhyue.com/moapp/jybase/redis"
  13. "app.yhyue.com/moapp/jyfs/rpc/filesystem"
  14. "encoding/json"
  15. "fmt"
  16. "net/url"
  17. "strings"
  18. "time"
  19. )
  20. type DRes struct {
  21. Msg string
  22. Code int64
  23. }
  24. func DocDownload(in *partnerlib.UserDownloadRequest) (res *partnerlib.UDRes, err error) {
  25. res = new(partnerlib.UDRes)
  26. var (
  27. b []byte
  28. isJson bool
  29. id = strings.ReplaceAll(in.DocId, fmt.Sprintf("%s-", entity.PartnerName), "")
  30. )
  31. h := NewHH(IC.I.Docin.Name, IC.I.Docin.Host, IC.I.Docin.DocDownload.Name, IC.I.Docin.DocDownload.Pathname, IC.I.Docin.DocDownload.Method, url.Values{
  32. "productId": []string{id},
  33. "userId": []string{common.InterfaceToStr(in.PositionId)},
  34. })
  35. b, err, isJson = h.HttpFunc()
  36. go h.SaveDocinLogger(b, err, "req")
  37. if err == nil {
  38. //豆丁同步数据到mongo
  39. go h.SaveDocinLogger(b, err, "res")
  40. if isJson {
  41. if err = json.Unmarshal(b, &res); err == nil {
  42. res.Msg = entity.Res[res.Msg]
  43. return
  44. }
  45. } else {
  46. //获取文件信息
  47. docInfo := partner.DocsFindOne(in.DocId)
  48. if docInfo.DocName != "" {
  49. //查看oss服务器是否已存在此文档
  50. if res.OssDocId = docInfo.OssDocId; res.OssDocId != "" {
  51. return
  52. }
  53. fileId := util.GetHashKey(b)
  54. ossId := fmt.Sprintf("%s.%s", fileId, docInfo.DocFileSuffix)
  55. fileUploadCache := fmt.Sprintf("file_upload_ing_%s", ossId)
  56. redis.Put(entity.RedisCode, fileUploadCache, ossId, 60*60)
  57. go func(_ossId, _fileId, fileUploadCache string, _docInfo *model.Docin) {
  58. //并发ing
  59. entity.FileUploadChanel <- true
  60. defer func() {
  61. <-entity.FileUploadChanel
  62. }()
  63. defer func() {
  64. redis.Del(entity.RedisCode, fileUploadCache)
  65. }()
  66. //获取附件后上传oss
  67. fileRes := util.FileUpload(&filesystem.SaveFileReq{
  68. Domain: IC.C.OssInfo.BucketName,
  69. FileId: _ossId,
  70. Meta: map[string]string{
  71. "docName": _docInfo.DocName,
  72. "docSuffix": _docInfo.DocFileSuffix,
  73. "docSize": fmt.Sprintf("%d", _docInfo.DocFileSize),
  74. },
  75. RawFileContent: b,
  76. Charset: util.GetFileChardet(b),
  77. })
  78. if fileRes.OssDocId == "" {
  79. err = fmt.Errorf("文档上传失败")
  80. warn.SendMsgByWXURL(fmt.Sprintf("文档id:%s,文档名称:%s,上传到oss异常:%s", _docInfo.Id, _docInfo.DocName, err.Error()))
  81. } else if IC.C.Conversion.Switch && IC.C.Conversion.DocFormat[_docInfo.DocFileSuffix] {
  82. //转换pdf
  83. conversion.NewConversion(_docInfo.Id, _docInfo.DocName, _fileId, _docInfo.DocFileSuffix, b, _docInfo.DocFileSize).ToConversion()
  84. }
  85. }(ossId, fileId, fileUploadCache, docInfo)
  86. //更新doc
  87. if errUpdate := partner.DocsUpdate(0, model.Doc{
  88. Id: in.DocId,
  89. OssDocId: ossId,
  90. OssPdfId: ossId,
  91. OssTxtId: fileId,
  92. UpdateDate: time.Now(),
  93. }); errUpdate != nil {
  94. warn.SendMsgByWXURL(fmt.Sprintf("文档id:%s,文档名称:%s 上传 tidb doc 异常:%s", docInfo.Id, docInfo.DocName, err.Error()))
  95. }
  96. res.OssDocId = ossId
  97. return
  98. } else {
  99. err = fmt.Errorf("获取文档信息异常")
  100. }
  101. }
  102. }
  103. res.Msg = err.Error()
  104. res.Code = -1
  105. return
  106. }