task_conf.go 9.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295
  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").First(&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. return info, errors.New("不需要更新")
  192. } else {
  193. fullUrl := file.Url
  194. info = response.DownloadFile{
  195. Url: fullUrl,
  196. Md5String: file.Md5String,
  197. Flag: true,
  198. }
  199. }
  200. return info, err
  201. }
  202. //条件查询脚本列表
  203. func (e *TaskConfService) GetScriptList(script task.GameScriptResponse, info request.PageInfo, order string, desc bool) (list interface{}, total int64, err error) {
  204. //获取分页数据
  205. limit := info.PageSize
  206. offset := (info.Page - 1) * info.PageSize
  207. //绑定操作结构体
  208. db := global.GVA_DB.Table("upload_file").Model(&task.GameScriptResponse{})
  209. var scriptList []task.GameScriptResponse
  210. //条件查询
  211. if script.ResponsiblePerson != "" {
  212. db = db.Where("responsible_person = ?", script.ResponsiblePerson)
  213. }
  214. if script.TaskID != 0 {
  215. db = db.Where("task_id = ?", script.TaskID)
  216. }
  217. //先过滤在排序
  218. if err = db.Count(&total).Error; err != nil {
  219. return scriptList, total, err
  220. } else {
  221. //分页
  222. db.Limit(limit).Offset(offset)
  223. //判断是否有排序字段
  224. if order != "" {
  225. var orderStr string
  226. orderMap := make(map[string]bool, 1)
  227. orderMap["create_time"] = true
  228. orderMap["task_id"] = true
  229. orderMap["name"] = true
  230. orderMap["responsible_person"] = true
  231. orderMap["version"] = true
  232. if orderMap[order] {
  233. //合法排序字符
  234. if desc {
  235. orderStr = order + " desc"
  236. } else {
  237. orderStr = order
  238. }
  239. } else {
  240. //传入排序字段非法
  241. err = fmt.Errorf("传入非法字段 %v", order)
  242. return scriptList, total, err
  243. }
  244. err = db.Order(orderStr).Find(&scriptList).Error
  245. } else {
  246. //默认按照名字升序排序
  247. err = db.Order("name").Find(&scriptList).Error
  248. }
  249. }
  250. return scriptList, total, err
  251. }
  252. //更改脚本状态
  253. func (e *TaskConfService) UpdateScriptStatus(c taskReq.UpdateScriptStatusRequest) (err error) {
  254. err = global.GVA_DB.Table("upload_file").Where("id = ?", c.Id).Error
  255. if errors.Is(err, gorm.ErrRecordNotFound) {
  256. return errors.New("请传入正确的Id")
  257. }
  258. err = global.GVA_DB.Table("upload_file").Where("id = ?", c.Id).Update("state", c.State).Error
  259. return err
  260. }
  261. //更改推送标准
  262. func (e *TaskConfService) JudgeOperate(taskConf task.TaskConf) (err error) {
  263. //查找数据库中是否有这条记录
  264. var entity task.TaskConf
  265. err = global.GVA_DB.Model(&task.TaskConf{}).Where("task_id = ?", taskConf.TaskId).First(&entity).Error
  266. //如果没有,创建
  267. if errors.Is(err, gorm.ErrRecordNotFound) {
  268. return global.GVA_DB.Model(&task.TaskConf{}).Create(&taskConf).Error
  269. }
  270. //如果有,更新
  271. return global.GVA_DB.Model(&task.TaskConf{}).Where("task_id = ?", taskConf.TaskId).Omit("task_id", "user").Updates(map[string]interface{}{"add_fee_notice": taskConf.AddFeeNotice, "simulator_type": taskConf.SimulatorType}).Error
  272. }