task_conf.go 9.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294
  1. package task
  2. import (
  3. "bufio"
  4. "bytes"
  5. "context"
  6. "crypto/md5"
  7. "encoding/hex"
  8. "errors"
  9. "fmt"
  10. "github.com/qiniu/api.v7/v7/auth/qbox"
  11. "github.com/qiniu/api.v7/v7/storage"
  12. "go.uber.org/zap"
  13. "gorm.io/gorm"
  14. "io"
  15. "log-server/global"
  16. "log-server/model/common/request"
  17. "log-server/model/task"
  18. taskReq "log-server/model/task/request"
  19. "log-server/model/task/response"
  20. "log-server/utils"
  21. "mime/multipart"
  22. "path"
  23. "strconv"
  24. "strings"
  25. "time"
  26. )
  27. type TaskConfService struct {
  28. }
  29. func (e *TaskConfService) Upload(file response.UploadFileResponse) error {
  30. return global.GVA_DB.Table("upload_file").Create(&file).Error
  31. }
  32. //更改的上传文件函数
  33. func (e *TaskConfService) UploadFileFunc(file *multipart.FileHeader, taskId string) (string, string, string, error) {
  34. // 读取文件后缀
  35. ext := path.Ext(file.Filename)
  36. // 读取文件名并加密
  37. name := strings.TrimSuffix(file.Filename, ext)
  38. name = utils.MD5V([]byte(name))
  39. // 拼接新文件名
  40. filename := name + "_" + time.Now().Format("20060102150405") + ext
  41. key := "shuyou/script/" + taskId + "/" + filename
  42. // 尝试创建此路径
  43. //mkdirErr := os.MkdirAll(global.GVA_CONFIG.Local.ScriptPath, os.ModePerm)
  44. //if mkdirErr != nil {
  45. // global.GVA_LOG.Error("function os.MkdirAll() Filed", zap.Any("err", mkdirErr.Error()))
  46. // return "", "", "", errors.New("function os.MkdirAll() Filed, err:" + mkdirErr.Error())
  47. //}
  48. // 拼接路径和文件名
  49. //p := global.GVA_CONFIG.Local.ScriptPath + "/" + filename
  50. //filepath := global.GVA_CONFIG.Local.ScriptPath + "/" + filename
  51. uploadErr := e.UploadFileToQiNiu(filename, taskId, file)
  52. if uploadErr != nil {
  53. global.GVA_LOG.Error("function UploadFileToQiNiu Filed", zap.Any("err", uploadErr.Error()))
  54. return "", "", "", errors.New("function UploadFileToQiNiu Filed, err:" + uploadErr.Error())
  55. }
  56. //f, openError := file.Open() // 读取文件
  57. f1, openErr := file.Open() // 读取文件生成MD5值
  58. if openErr != nil {
  59. global.GVA_LOG.Error("function file.Open() Filed", zap.Any("err", openErr.Error()))
  60. return "", "", "", errors.New("function file.Open() Filed, err:" + openErr.Error())
  61. }
  62. //defer f.Close() // 创建文件 defer 关闭
  63. defer f1.Close()
  64. //生成md5值
  65. md5h := md5.New()
  66. io.Copy(md5h, f1)
  67. md5String := hex.EncodeToString(md5h.Sum(nil))
  68. //
  69. //out, createErr := os.Create(p)
  70. //if createErr != nil {
  71. // global.GVA_LOG.Error("function os.Create() Filed", zap.Any("err", createErr.Error()))
  72. //
  73. // return "", "", "", errors.New("function os.Create() Filed, err:" + createErr.Error())
  74. //}
  75. //defer out.Close() // 创建文件 defer 关闭
  76. //_, copyErr := io.Copy(out, f) // 传输(拷贝)文件
  77. //fmt.Println("拷贝文件")
  78. //if copyErr != nil {
  79. // global.GVA_LOG.Error("function io.Copy() Filed", zap.Any("err", copyErr.Error()))
  80. // return "", "", "", errors.New("function io.Copy() Filed, err:" + copyErr.Error())
  81. //}
  82. return key, filename, md5String, nil
  83. }
  84. func (e *TaskConfService) UploadFileToQiNiu(fileName string, taskId string, file *multipart.FileHeader) ( error) {
  85. accessKey := "B81Gsvry2StqKVE3txS-7v9GBBfqykC9zhebmxnW"
  86. secretKey := "YEZJuYcdeF7vRvzffxpopAVR-jMPZg9pZ-4IKTVW"
  87. mac := qbox.NewMac(accessKey, secretKey)
  88. bucket := "pinaishop"
  89. putPolicy := storage.PutPolicy{
  90. Scope: bucket,
  91. }
  92. key :="shuyou/script/" + taskId + "/" + fileName
  93. upToken := putPolicy.UploadToken(mac)
  94. cfg := storage.Config{}
  95. // 空间对应的机房
  96. cfg.Region = &storage.ZoneHuanan
  97. // 是否使用https域名
  98. cfg.UseHTTPS = true
  99. // 上传是否使用CDN上传加速
  100. cfg.UseCdnDomains = false
  101. formUploader := storage.NewFormUploader(&cfg)
  102. ret := storage.PutRet{}
  103. putExtra := storage.PutExtra{
  104. //Params: map[string]string{
  105. // "x:name": "github logo",
  106. //},
  107. }
  108. // Get the file size
  109. fileSize := file.Size
  110. f, openError := file.Open() // 读取文件
  111. if openError != nil {
  112. global.GVA_LOG.Error("function file.Open() Filed", zap.Any("err", openError.Error()))
  113. return errors.New("function file.Open() Filed, err:" + openError.Error())
  114. }
  115. defer f.Close()
  116. // Read the file into a byte slice
  117. bs := make([]byte, fileSize)
  118. _, err := bufio.NewReader(f).Read(bs)
  119. if err != nil && err != io.EOF {
  120. fmt.Println(err)
  121. return errors.New("文件转化成字节数组错误, err:" + err.Error())
  122. }
  123. err = formUploader.Put(context.Background(), &ret, upToken, key, bytes.NewReader(bs), fileSize, &putExtra)
  124. if err != nil {
  125. fmt.Println(err)
  126. return errors.New("上传七牛云错误, err:" + err.Error())
  127. }
  128. fmt.Println(ret.Key, ret.Hash)
  129. return nil
  130. }
  131. //上传文件
  132. func (e *TaskConfService) UploadFile(taskId int, user string, header *multipart.FileHeader) (file response.UploadFileResponse, err error) {
  133. //查询数据库记录数
  134. var count int64
  135. //获取最后一条记录
  136. var lastRecord response.UploadFileResponse
  137. var version int
  138. //定义下载前缀
  139. var prefix string = "http://cdn.pinaishop.kfzs.com/"
  140. global.GVA_DB.Table("upload_file").Where("task_id = ?", taskId).Count(&count)
  141. if count == 0 {
  142. version = 1
  143. } else {
  144. fmt.Println(count)
  145. global.GVA_DB.Table("upload_file").Where("task_id = ?", taskId).Order("id desc").Limit(1).Find(&lastRecord)
  146. fmt.Println(lastRecord)
  147. version = lastRecord.Version + 1
  148. recordArr := []response.UploadFileResponse{}
  149. global.GVA_DB.Table("upload_file").Where("task_id = ?", taskId).Find(&recordArr)
  150. fmt.Println(recordArr)
  151. }
  152. filePath, key, md5String, uploadErr := e.UploadFileFunc(header,strconv.Itoa(taskId) )
  153. if uploadErr != nil {
  154. panic(err)
  155. }
  156. s := strings.Split(header.Filename, ".")
  157. f := response.UploadFileResponse{
  158. TaskID: taskId,
  159. ResponsiblePerson: user,
  160. Url: prefix + filePath,
  161. Name: header.Filename,
  162. Tag: s[len(s)-1],
  163. Key: key,
  164. Version: version,
  165. Md5String: md5String,
  166. State : 1,
  167. }
  168. return f, e.Upload(f)
  169. }
  170. //下载文件
  171. func (e *TaskConfService) DownloadFile(taskId int, md5String string) (info response.DownloadFile, err error) {
  172. var file response.UploadFileResponse
  173. //改由存储至数据库的时候拼接前缀
  174. //var prefix string = global.GVA_CONFIG.PrefixUrl.PrefixLocal
  175. //数据库中无记录,即不需要更新
  176. err = global.GVA_DB.Table("upload_file").Where("task_id = ? and state = 1", taskId).Order("id desc").Limit(1).Find(&file).Error
  177. if errors.Is(err, gorm.ErrRecordNotFound) {
  178. info = response.DownloadFile{
  179. Url: "",
  180. Md5String: "",
  181. Flag: false,
  182. }
  183. return info, errors.New("无对应脚本")
  184. }
  185. if file.Md5String == md5String {
  186. info = response.DownloadFile{
  187. Url: "",
  188. Md5String: "",
  189. Flag: false,
  190. }
  191. } else {
  192. fullUrl := file.Url
  193. info = response.DownloadFile{
  194. Url: fullUrl,
  195. Md5String: file.Md5String,
  196. Flag: true,
  197. }
  198. }
  199. return info, err
  200. }
  201. //条件查询脚本列表
  202. func (e *TaskConfService) GetScriptList(script task.GameScriptResponse, info request.PageInfo, order string, desc bool) (list interface{}, total int64, err error) {
  203. //获取分页数据
  204. limit := info.PageSize
  205. offset := (info.Page - 1) * info.PageSize
  206. //绑定操作结构体
  207. db := global.GVA_DB.Table("upload_file").Model(&task.GameScriptResponse{})
  208. var scriptList []task.GameScriptResponse
  209. //条件查询
  210. if script.ResponsiblePerson != "" {
  211. db = db.Where("responsible_person = ?", script.ResponsiblePerson)
  212. }
  213. if script.TaskID != 0 {
  214. db = db.Where("task_id = ?", script.TaskID)
  215. }
  216. //先过滤在排序
  217. if err = db.Count(&total).Error; err != nil {
  218. return scriptList, total, err
  219. } else {
  220. //分页
  221. db.Limit(limit).Offset(offset)
  222. //判断是否有排序字段
  223. if order != "" {
  224. var orderStr string
  225. orderMap := make(map[string]bool, 1)
  226. orderMap["create_time"] = true
  227. orderMap["task_id"] = true
  228. orderMap["name"] = true
  229. orderMap["responsible_person"] = true
  230. orderMap["version"] = true
  231. if orderMap[order] {
  232. //合法排序字符
  233. if desc {
  234. orderStr = order + " desc"
  235. } else {
  236. orderStr = order
  237. }
  238. } else {
  239. //传入排序字段非法
  240. err = fmt.Errorf("传入非法字段 %v", order)
  241. return scriptList, total, err
  242. }
  243. err = db.Order(orderStr).Find(&scriptList).Error
  244. } else {
  245. //默认按照名字升序排序
  246. err = db.Order("name").Find(&scriptList).Error
  247. }
  248. }
  249. return scriptList, total, err
  250. }
  251. //更改脚本状态
  252. func (e *TaskConfService) UpdateScriptStatus(c taskReq.UpdateScriptStatusRequest) (err error) {
  253. err = global.GVA_DB.Table("upload_file").Where("id = ?", c.Id).Error
  254. if errors.Is(err, gorm.ErrRecordNotFound) {
  255. return errors.New("请传入正确的Id")
  256. }
  257. err = global.GVA_DB.Table("upload_file").Where("id = ?", c.Id).Update("state", c.State).Error
  258. return err
  259. }
  260. //更改推送标准
  261. func (e *TaskConfService) JudgeOperate(taskConf task.TaskConf) (err error) {
  262. //查找数据库中是否有这条记录
  263. var entity task.TaskConf
  264. err = global.GVA_DB.Model(&task.TaskConf{}).Where("task_id = ?", taskConf.TaskId).First(&entity).Error
  265. //如果没有,创建
  266. if errors.Is(err, gorm.ErrRecordNotFound) {
  267. return global.GVA_DB.Model(&task.TaskConf{}).Create(&taskConf).Error
  268. }
  269. //如果有,更新
  270. return global.GVA_DB.Model(&task.TaskConf{}).Where("task_id = ?", taskConf.TaskId).Omit("task_id", "user").Updates(&taskConf).Error
  271. }