package service import ( "app.yhyue.com/moapp/jy_docs/rpc/partnerlib/conversion" "app.yhyue.com/moapp/jy_docs/rpc/partnerlib/entity" IC "app.yhyue.com/moapp/jy_docs/rpc/partnerlib/init" "app.yhyue.com/moapp/jy_docs/rpc/partnerlib/type/partnerlib" "app.yhyue.com/moapp/jy_docs/rpc/partnerlib/util" "app.yhyue.com/moapp/jy_docs/rpc/partnerlib/warn" "app.yhyue.com/moapp/jy_docs/services/model" "app.yhyue.com/moapp/jy_docs/services/partner" "app.yhyue.com/moapp/jybase/common" "app.yhyue.com/moapp/jybase/redis" "app.yhyue.com/moapp/jyfs/rpc/filesystem" "encoding/json" "fmt" "net/url" "strings" "time" ) type DRes struct { Msg string Code int64 } func DocDownload(in *partnerlib.UserDownloadRequest) (res *partnerlib.UDRes, err error) { res = new(partnerlib.UDRes) var ( b []byte isJson bool id = strings.ReplaceAll(in.DocId, fmt.Sprintf("%s-", entity.PartnerName), "") userId = common.If(IC.I.Docin.TestAccount > 0, IC.I.Docin.TestAccount, in.PositionId).(int64) //测试账号 ) 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{ "productId": []string{id}, "userId": []string{common.InterfaceToStr(userId)}, }) b, err, isJson = h.HttpFunc() go h.SaveDocinLogger(b, err, "req") if err == nil { //豆丁同步数据到mongo go h.SaveDocinLogger(b, err, "res") if isJson { if err = json.Unmarshal(b, &res); err == nil { res.Msg = entity.Res[res.Msg] return } } else { //获取文件信息 docInfo := partner.DocsFindOne(in.DocId) if docInfo.DocName != "" { //查看oss服务器是否已存在此文档 if res.OssDocId = docInfo.OssDocId; res.OssDocId != "" { return } fileId := util.GetHashKey(b) ossId := fmt.Sprintf("%s.%s", fileId, docInfo.DocFileSuffix) fileUploadCache := fmt.Sprintf("file_upload_ing_%s", ossId) redis.Put(entity.RedisCode, fileUploadCache, ossId, 60*60) go func(_ossId, _fileId, _fileUploadCache string, _docInfo *model.Docin, _b []byte) { //并发ing entity.FileUploadChanel <- true defer func() { <-entity.FileUploadChanel }() defer func() { redis.Del(entity.RedisCode, _fileUploadCache) }() //获取附件后上传oss fileRes := util.FileUpload(&filesystem.SaveFileReq{ Domain: IC.C.OssInfo.BucketName, FileId: _ossId, Meta: map[string]string{ "docName": _docInfo.DocName, "docSuffix": _docInfo.DocFileSuffix, "docSize": fmt.Sprintf("%d", _docInfo.DocFileSize), }, RawFileContent: _b, Charset: util.GetFileChardet(_b), }) if fileRes.OssDocId == "" { //err = fmt.Errorf("文档上传失败") warn.SendMsgByWXURL(fmt.Sprintf("文档id:%s,文档名称:%s,上传到oss异常:%s", _docInfo.Id, _docInfo.DocName, fileRes.Msg)) } else if IC.C.Conversion.Switch && IC.C.Conversion.DocFormat[_docInfo.DocFileSuffix] { //转换pdf if msg := conversion.NewConversion(_docInfo.Id, _docInfo.DocName, _fileId, _docInfo.DocFileSuffix, _b, _docInfo.DocFileSize).ToConversion(); msg != "" { warn.SendMsgByWXURL(fmt.Sprintf("文档 %s--%s 转换 pdf格式异常:%s", _docInfo.Id, _docInfo.DocName, msg)) } } }(ossId, fileId, fileUploadCache, docInfo, b) //更新doc if errUpdate := partner.DocsUpdate(0, model.Doc{ Id: in.DocId, OssDocId: ossId, OssPdfId: ossId, OssTxtId: fileId, UpdateDate: time.Now(), }); errUpdate != nil { warn.SendMsgByWXURL(fmt.Sprintf("文档id:%s,文档名称:%s 上传 tidb doc 异常:%s", docInfo.Id, docInfo.DocName, err.Error())) } res.OssDocId = ossId return } else { err = fmt.Errorf("获取文档信息异常") } } } res.Msg = err.Error() res.Code = -1 return }