Kaynağa Gözat

Merge branch 'master' of http://10.8.230.114:3000/wangbin/log-server

# Conflicts:
#	initialize/timer.go
maker 3 yıl önce
ebeveyn
işleme
e4ca3c46a1

+ 2 - 0
api/v1/enter.go

@@ -3,6 +3,7 @@ package v1
 import (
 	"log-server/api/v1/dataStatistics"
 	"log-server/api/v1/example"
+	"log-server/api/v1/fileManager"
 	"log-server/api/v1/log"
 	"log-server/api/v1/rentComputer"
 	"log-server/api/v1/system"
@@ -19,6 +20,7 @@ type ApiGroup struct {
 	GroupTask            task.GroupTask
 	RentComputerApiGroup rentComputer.ApiGroup
 	DataStatisticsGroup  dataStatistics.ApiGroup
+	FileManagerGroup     fileManager.ApiGroup
 }
 
 var ApiGroupApp = new(ApiGroup)

+ 19 - 0
api/v1/fileManager/enter.go

@@ -0,0 +1,19 @@
+package fileManager
+
+import "log-server/service"
+
+type ApiGroup struct {
+	// Code generated by log-server Begin; DO NOT EDIT.
+	ApiFileFolder
+	//ApiRentComputerShop
+	//ApiRentSetMeal
+	//ApiRentComputerLedger
+	// Code generated by log-server End; DO NOT EDIT.
+}
+
+var (
+	ServiceFileFolder = service.ServiceGroupApp.FileManagerServiceGroup.ServiceFileFolder
+	// ServiceRentComputerLedger = service.ServiceGroupApp.RentComputerServiceGroup.ServiceRentComputerLedger
+	// ServiceRentComputerShop   = service.ServiceGroupApp.RentComputerServiceGroup.ServiceRentComputerShop
+	// ServiceRentSetMeal        = service.ServiceGroupApp.RentComputerServiceGroup.ServiceRentSetMeal
+)

+ 73 - 0
api/v1/fileManager/file_folder.go

@@ -0,0 +1,73 @@
+package fileManager
+
+import (
+	"github.com/gin-gonic/gin"
+	"go.uber.org/zap"
+	"log-server/global"
+	"log-server/model/common/response"
+	"log-server/model/fileManager/request"
+)
+
+type ApiFileFolder struct {
+}
+type IdName struct {
+	id   int
+	name string
+}
+
+func (v *ApiFileFolder) AddFileFolder(c *gin.Context) {
+	var api request.FileFolderRequest
+	_ = c.ShouldBindJSON(&api)
+	//if err := utils.Verify(api, utils.LogCodingVerify); err != nil {
+	//	response.FailWithMessage(err.Error(), c)
+	//	return
+	//}
+	//fmt.Printf("%#v\n", &api)
+	if parentId, parentName, err := ServiceFileFolder.AddFileFolder(api); err != nil {
+		global.GVA_LOG.Error("文件夹创建失败!", zap.Error(err))
+		response.FailWithMessage("文件夹创建失败,"+err.Error(), c)
+	} else {
+		idName := IdName{
+			parentId,
+			parentName,
+		}
+		response.OkWithDetailed(idName, "文件夹创建成功", c)
+	}
+}
+
+// GetAllTaskSimple 查询所有任务
+func (api *ApiFileFolder) GetAllTaskSimple(c *gin.Context) {
+
+	if list, err := ServiceFileFolder.GetAllTaskSimple(); err != nil {
+		//global.GVA_LOG.Error("获取失败!", zap.Error(err))
+		response.FailWithMessage("获取失败", c)
+	} else {
+		//响应结果
+		response.OkWithDetailed(response.PageResult{
+			List: list,
+		}, "获取成功", c)
+	}
+}
+
+// GetFolderFileList 获取当前父文件夹下所有的子文件夹和文件
+func (v *ApiFileFolder) GetFolderFileList(c *gin.Context) {
+	//global.GVA_LOG.Info("api----GetComputerList----strat")
+	var paramsInfo request.FileFolderPageRequest
+	_ = c.ShouldBindJSON(&paramsInfo)
+	/*if err := utils.Verify(paramsInfo.PageInfo, utils.PageInfoVerify); err != nil {
+		response.FailWithMessage(err.Error(), c)
+		return
+	}*/
+	list, total, err := ServiceFileFolder.FileList(c, paramsInfo.FileFolder, paramsInfo.PageInfo, paramsInfo.OrderKey, paramsInfo.Desc)
+	if err != nil {
+		global.GVA_LOG.Error("获取失败!", zap.Error(err))
+		response.FailWithMessage("获取失败", c)
+	} else {
+		response.OkWithDetailed(response.PageResult{
+			List:     list,
+			Total:    total,
+			Page:     paramsInfo.Page,
+			PageSize: paramsInfo.PageSize,
+		}, "获取成功", c)
+	}
+}

+ 4 - 0
api/v1/fileManager/file_qiniu.go

@@ -0,0 +1,4 @@
+package fileManager
+
+type ApiFileQiniu struct {
+}

+ 2 - 0
initialize/router.go

@@ -26,6 +26,7 @@ func Routers() *gin.Engine {
 	typeManageRouter := router.RouterGroupApp.TypeManage
 	rentComputerRouter := router.RouterGroupApp.RentComputer
 	dataStatisticsRouter := router.RouterGroupApp.DataStatistics
+	fileManagerRouter := router.RouterGroupApp.FileManager
 	// 如果想要不使用nginx代理前端网页,可以修改 web/.env.production 下的
 	// VUE_APP_BASE_API = /
 	// VUE_APP_BASE_PATH = http://localhost
@@ -74,6 +75,7 @@ func Routers() *gin.Engine {
 		dataStatisticsRouter.InitWeChatScannerApiRouter(PublicGroup)      //数据统计
 		dataStatisticsRouter.InitWeChatScannerDetailedRouter(PublicGroup) //数据统计
 		dataStatisticsRouter.InitWeChatScannerLedgerRouter(PublicGroup)   //数据统计
+		fileManagerRouter.InitFileFolderRouter(PublicGroup)
 
 	}
 	PrivateGroup := Router.Group("")

+ 124 - 0
initialize/timer.go

@@ -3,6 +3,7 @@ package initialize
 import (
 	"fmt"
 	"log-server/service/dataStatistics"
+	"log-server/service/fileManager"
 	"log-server/service/log"
 	"log-server/service/rentComputer"
 	"log-server/service/system"
@@ -20,6 +21,7 @@ var serviceRentComputer = new(rentComputer.ServiceRentComputer)
 var serviceWeChatScannerApi = new(dataStatistics.ServiceWeChatScannerApi)
 var serviceDataAbnormalRate = new(dataStatistics.ServiceDataAbnormalRate)
 var serviceWeChatScannerDetailed = new(dataStatistics.ServiceWeChatScannerDetailed)
+var serviceDownLoadUrl = new(fileManager.ServiceDownLoadUrl)
 var robotService = new(system.RobotService)
 
 func Timer() {
@@ -95,6 +97,65 @@ func Timer() {
 	//if err != nil {
 	//	fmt.Println("add DayTargetDataStatistics timer error:", err)
 	//}
+
+	//// 定时检查是否有电脑到期,修改租机状态@every 1s
+	//_, err = global.GVA_Timer.AddTaskByFunc("CheckIsExpire", "0 0/5 * * * *", serviceRentComputer.CheckIsExpire)
+	//// 定时更新前一天的统计数据
+	//_, err := global.GVA_Timer.AddTaskByFunc("StatisticsLog", "2 8 5 * * * ", serviceStatisticsLog.CreateStatisticsLog)
+	//if err != nil {
+	//	fmt.Println("add taskCode timer error:", err)
+	//}
+	//
+	////定时同步电脑相关的统计数据
+	//_, err = global.GVA_Timer.AddTaskByFunc("CreateComputerStatisticsData", "40 9,19,29,39,49,59 7-23 * * * ", serviceStatisticsLog.CreateComputerStatisticsData)
+	//if err != nil {
+	//	fmt.Println("add CreateComputerStatisticsData timer error:", err)
+	//}
+	//// 同步游戏相关的统计数据
+	//_, err = global.GVA_Timer.AddTaskByFunc("TodayCreateStatisticsGameInfoLog", "2 8,18,28,38,48,58 6-23 * * * ", serviceStatisticsLog.TodayCreateStatisticsGameInfoLog)
+	//if err != nil {
+	//	fmt.Println("add TodayCreateStatisticsGameInfoLog timer error:", err)
+	//}
+	//// 同步任务统计数据
+	//_, err = global.GVA_Timer.AddTaskByFunc("TaskStatisticsDataCache", "20 0/3 6-23 * * * ", serviceStatisticsLog.TaskStatisticsDataCache)
+	//if err != nil {
+	//	fmt.Println("add TaskStatisticsDataCache timer error:", err)
+	//}
+	//// 重试失败数据
+	//_, err = global.GVA_Timer.AddTaskByFunc("createFailLog", "2 5,15,25,35,45,55 6-23 * * * ", ServiceLogList.CreateFailLog)
+	//if err != nil {
+	//	fmt.Println("everyDayResetStatisticsCache timer error:", err)
+	//}
+	//// 定时检查电脑上报
+	//_, err = global.GVA_Timer.AddTaskByFunc("RegularCheckPc", "2 57 8-23 * * * ", serviceStatisticsLog.RegularCheckPc)
+	//if err != nil {
+	//	fmt.Println("RegularCheckPc timer error:", err)
+	//}
+	//// 新建日志表
+	//_, err = global.GVA_Timer.AddTaskByFunc("RegularCreateLogingTable", "2 1 19 20 * * ", ServiceLogList.RegularCreateLogingTable)
+	//if err != nil {
+	//	fmt.Println("add RegularCreateLogingTable timer error:", err)
+	//}
+	//// 定时删缓存
+	//_, err = global.GVA_Timer.AddTaskByFunc("RegularDelCheckData", "2 33 11 * * *", serviceStatisticsLog.RegularDelCheckData)
+	//if err != nil {
+	//	fmt.Println("add RegularDelCheckData timer error:", err)
+	//}
+	////定时添加任务
+	//_, err = global.GVA_Timer.AddTaskByFunc("EveryDaySyncTaskData", "30 22 21 * * *", syncData.EveryDaySyncTaskData)
+	//if err != nil {
+	//	fmt.Println("add EveryDaySyncTaskData timer error:", err)
+	//}
+	////同步任务数据
+	//_, err = global.GVA_Timer.AddTaskByFunc("SyncTaskData", "2 0/3 1-23 * * *", syncData.SyncTaskData)
+	//if err != nil {
+	//	fmt.Println("add SyncTaskData timer error:", err)
+	//}
+	//// 数优任务统计
+	//_, err = global.GVA_Timer.AddTaskByFunc("DayTargetDataStatistics", "40 2 5 * * *", syncData.DayTargetDataStatistics)
+	//if err != nil {
+	//	fmt.Println("add DayTargetDataStatistics timer error:", err)
+	//}
 	//
 	////// 定时检查是否有电脑到期,修改租机状态@every 1s
 	////_, err = global.GVA_Timer.AddTaskByFunc("CheckIsExpire", "0 0/5 * * * *", serviceRentComputer.CheckIsExpire)
@@ -110,6 +171,69 @@ func Timer() {
 	////定时获取扫码平台余额,每小时执行一次
 	////_, err = global.GVA_Timer.AddTaskByFunc("SyncGetWeChatScannerBalance", "0 58 * * * *", serviceWeChatScannerApi.SyncGetWeChatScannerBalance)
 	//_, err = global.GVA_Timer.AddTaskByFunc("SyncGetWeChatScannerBalance", "0 58 * * * *", serviceWeChatScannerApi.SyncGetWeChatScannerBalance)
+	//_, err = global.GVA_Timer.AddTaskByFunc("SyncGetWeChatScannerBalance", "0 58 * * * *", serviceWeChatScannerApi.SyncGetWeChatScannerBalance)
+	//if err != nil {
+	//	fmt.Println("add SyncGetWeChatScannerBalance timer error:", err)
+	//}
+	////定时更新异常率
+	//_, err = global.GVA_Timer.AddTaskByFunc("SyncAbnormalRateByBatch", "0 1,31 * * * *", serviceDataAbnormalRate.SyncAbnormalRateByBatch)
+	//if err != nil {
+	//	fmt.Println("add SyncAbnormalRateByBatch timer error:", err)
+	//}
+
+	//定时更新当日微信扫码订单列表
+	//_, err = global.GVA_Timer.AddTaskByFunc("SyncTodayWeChatScannerDetailed", "0 3,33 * * * *", serviceWeChatScannerDetailed.SyncTodayWeChatScannerDetailed)
+	//if err != nil {
+	//	fmt.Println("add SyncTodayWeChatScannerDetailed timer error:", err)
+	//}
+
+	//0点更新昨日微信扫码订单列表
+	//_, err = global.GVA_Timer.AddTaskByFunc("SyncYesterdayWeChatScannerDetailed", "1 1 0 * * *", serviceWeChatScannerDetailed.SyncYesterdayWeChatScannerDetailed)
+	//if err != nil {
+	//	fmt.Println("add SyncYesterdayWeChatScannerDetailed timer error:", err)
+	//}
+
+	//半小时同步一次机房设备信息,播报是否有异常
+	//_, err = global.GVA_Timer.AddTaskByFunc("SyncJfDevicesMessage", "0 0,30 * * * *", robotService.SyncJfDevicesMessage)
+	//if err != nil {
+	//	fmt.Println("add SyncJfDevicesMessage timer error:", err)
+	//}
+	//
+	//// 活跃定时推送消息
+	//_, err = global.GVA_Timer.AddTaskByFunc("TaskMsgSend", "20 29,59 8-21 * * *", syncData.TaskMsgSend)
+	//if err != nil {
+	//	fmt.Println("add TaskMsgSend timer error:", err)
+	//}
+	//
+	//// 活跃定时推送消息
+	//_, err = global.GVA_Timer.AddTaskByFunc("TaskMsgSend", "20 0/10 22-23 * * *", syncData.TaskMsgSend)
+	//if err != nil {
+	//	fmt.Println("add TaskMsgSend timer error:", err)
+	//}
+	//
+	//// 付费定时推送消息
+	//_, err = global.GVA_Timer.AddTaskByFunc("TaskMsgSend", "40 15,30,45,59 8-21 * * *", syncData.TaskFreeMsgSend)
+	//if err != nil {
+	//	fmt.Println("add TaskFreeMsgSend timer error:", err)
+	//}
+	//
+	//// 付费定时推送消息
+	//_, err = global.GVA_Timer.AddTaskByFunc("TaskMsgSend", "40 0/5 22-23 * * *", syncData.TaskFreeMsgSend)
+	//if err != nil {
+	//	fmt.Println("add TaskFreeMsgSend timer error:", err)
+	//}
+	//
+	//// 23起检测任务完成情况
+	//_, err = global.GVA_Timer.AddTaskByFunc("CheckTaskCompletedInfo", "10 0/4 23 * * *", syncData.CheckTaskCompletedInfo)
+	//if err != nil {
+	//	fmt.Println("add CheckTaskCompletedInfo timer error:", err)
+	//}
+
+	//定时更新游戏版本号和链接
+	_, err := global.GVA_Timer.AddTaskByFunc("UpdateGameVersion", "0 3/15 * * * *", serviceDownLoadUrl.UpdateGameVersion)
+	if err != nil {
+		fmt.Println("add UpdateGameVersion timer error:", err)
+	}
 	//if err != nil {
 	//	fmt.Println("add SyncGetWeChatScannerBalance timer error:", err)
 	//}

+ 19 - 0
model/fileManager/download_url.go

@@ -0,0 +1,19 @@
+package fileManager
+
+// DownLoadUrl 游戏下载链接记录表
+type DownLoadUrl struct {
+	Id                 int    `json:"id"`
+	CreateTime         string `json:"create_time"`          // 创建时间
+	UpdateTime         string `json:"update_time"`          // 更新时间
+	TaskId             int    `json:"task_id"`              //关联任务id,默认为0,表示无关联
+	PackageUrl         string `json:"package_url"`          //打包工具的游戏下载链接
+	PackageVersionCode int    `json:"package_version_code"` //打包工具的游戏版本号(int型)
+	AppUrl             string `json:"app_url"`              //小绵羊app里的游戏下载链接
+	AppVersionName     string `json:"app_version_name"`     //小绵羊app里的游戏版本号名
+	AppFlag            int    `json:"app_flag"`             //小绵羊app里的强更标志 2:非强更 1:强更,默认为2
+	PushFlag           int    `json:"push_flag"`            //是否已推送至微信群 0:否 1:是,默认为1
+}
+
+func (DownLoadUrl) TableName() string {
+	return "download_url"
+}

+ 15 - 0
model/fileManager/file_folder.go

@@ -0,0 +1,15 @@
+package fileManager
+
+// FileFolder 文件夹
+type FileFolder struct {
+	Id         int    `json:"id"`
+	CreateTime string `json:"create_time"` // 创建时间
+	UpdateTime string `json:"update_time"` // 更新时间
+	Name       string `json:""`            //文件夹名称,通常为'任务ID_任务名称'
+	ParentId   int    `json:"parent_id"`   //父文件夹id,默认为0,表示跟目录
+	TaskId     int    `json:"task_id"`     //关联任务id,默认为0,表示无关联
+}
+
+func (FileFolder) TableName() string {
+	return "file_folder"
+}

+ 67 - 0
model/fileManager/file_qiniu.go

@@ -0,0 +1,67 @@
+package fileManager
+
+// FileQiniu 七牛文件
+type FileQiniu struct {
+	Id           uint   `json:"id"`
+	CreateTime   string `json:"create_time"`   // 创建时间
+	UpdateTime   string `json:"update_time"`   // 更新时间
+	ParentId     int    `json:"parent_id"`     //父文件夹id
+	TaskId       int    `json:"task_id"`       //关联任务id,默认为0
+	FileName     string `json:"file_name"`     //文件名称
+	FileVersion  int64  `json:"file_version"`  //文件版本
+	QiniuAddress string `json:"qiniu_address"` //七牛云文件地址
+	QiniuKey     string `json:"qiniu_key"`     //七牛云key,方便删除文件
+	QiniuHash    string `json:"qiniu_hash"`    //七牛云hash
+	FileType     int    `json:"file_type"`     //文件类型
+	//文件类型
+	/**
+	  {
+	    value: "0",
+	    label: "游戏包.apk"
+	  },
+	  {
+	    value: "1",
+	    label: "雷电镜像.ldbk"
+	  },
+	  {
+	    value: "2",
+	    label: "夜神镜像.npbk"
+	  },
+	  {
+	    value: "3",
+	    label: "易脚本.dll"
+	  },
+	  {
+	    value: "4",
+	    label: "易语言中控.exe"
+	  },
+	  {
+	    value: "5",
+	    label: "小精灵.apk"
+	  },
+	  {
+	    value: "6",
+	    label: "Tar包更新.tar"
+	  },
+	  {
+	    value: "7",
+	    label: "Bat.bat"
+	  },
+	  {
+	    value: "8",
+	    label: "shell脚本.sh"
+	  },
+	  {
+	    value: "9",
+	    label: "小绵羊.apk"
+	  },
+	  {
+	    value: "10",
+	    label: "其他文件.*"
+	  }
+	*/
+}
+
+func (FileQiniu) TableName() string {
+	return "file_qiniu"
+}

+ 28 - 0
model/fileManager/request/common.go

@@ -0,0 +1,28 @@
+package request
+
+// PageInfo Paging common input parameter structure
+type PageInfo struct {
+	Page     int    `json:"page" form:"page"`         // 页码
+	PageSize int    `json:"pageSize" form:"pageSize"` // 每页大小
+	Keyword  string `json:"keyword" form:"keyword"`   //关键字
+}
+
+// GetById Find by id structure
+type GetById struct {
+	ID int `json:"id" form:"id"` // 主键ID
+}
+
+func (r *GetById) Uint() uint {
+	return uint(r.ID)
+}
+
+type IdsReq struct {
+	Ids []int `json:"ids" form:"ids"`
+}
+
+// GetAuthorityId Get role by id structure
+type GetAuthorityId struct {
+	AuthorityId uint `json:"authorityId" form:"authorityId"` // 角色ID
+}
+
+type Empty struct{}

+ 21 - 0
model/fileManager/request/file_folder.go

@@ -0,0 +1,21 @@
+package request
+
+import (
+	"log-server/model/fileManager"
+)
+
+type FileFolderRequest struct {
+	Id         uint   `json:"id"`
+	CreateTime string `json:"create_time"` // 创建时间
+	UpdateTime string `json:"update_time"` // 更新时间
+	Name       string `json:"name"`        //文件夹名称,通常为'任务ID_任务名称'
+	ParentId   int    `json:"parent_id"`   //父文件夹id,默认为0,表示跟目录
+	TaskId     int    `json:"task_id"`     //关联任务id,默认为0,表示无关联
+}
+
+type FileFolderPageRequest struct {
+	fileManager.FileFolder
+	PageInfo
+	OrderKey string `json:"orderKey"` // 排序
+	Desc     bool   `json:"desc"`     // 排序方式:升序false(默认)|降序true
+}

+ 16 - 0
model/fileManager/request/file_qiniu.go

@@ -0,0 +1,16 @@
+package request
+
+type FileQiniuRequest struct {
+	Id           uint   `json:"id"`
+	CreateTime   string `json:"create_time"`   // 创建时间
+	UpdateTime   string `json:"update_time"`   // 更新时间
+	ParentId     int    `json:"parent_id"`     //父文件夹id
+	TaskId       int    `json:"task_id"`       //关联任务id,默认为0
+	FileName     string `json:"file_name"`     //文件名称
+	FileVersion  int64  `json:"file_version"`  //文件版本
+	QiniuAddress string `json:"qiniu_address"` //七牛云文件地址
+	QiniuKey     string `json:"qiniu_key"`     //七牛云key,方便删除文件
+	QiniuHash    string `json:"qiniu_hash"`    //七牛云hash
+	FileType     int    `json:"file_type"`     //文件类型
+
+}

+ 8 - 0
model/fileManager/response/common.go

@@ -0,0 +1,8 @@
+package response
+
+type PageResult struct {
+	List     interface{} `json:"list"`
+	Total    int64       `json:"total"`
+	Page     int         `json:"page"`
+	PageSize int         `json:"pageSize"`
+}

+ 10 - 0
model/fileManager/response/file_folder.go

@@ -0,0 +1,10 @@
+package response
+
+type FileFolderResponse struct {
+	Id         uint   `json:"id"`
+	CreateTime string `json:"create_time"` // 创建时间
+	UpdateTime string `json:"update_time"` // 更新时间
+	Name       string `json:"name"`        //文件夹名称,通常为'任务ID_任务名称'
+	ParentId   int    `json:"parent_id"`   //父文件夹id,默认为0,表示跟目录
+	TaskId     int    `json:"task_id"`     //关联任务id,默认为0,表示无关联
+}

+ 1 - 0
model/fileManager/response/file_qiniu.go

@@ -0,0 +1 @@
+package response

+ 2 - 0
router/enter.go

@@ -3,6 +3,7 @@ package router
 import (
 	"log-server/router/dataStatistics"
 	"log-server/router/example"
+	"log-server/router/fileManager"
 	"log-server/router/log"
 	"log-server/router/rentComputer"
 	"log-server/router/system"
@@ -20,6 +21,7 @@ type RouterGroup struct {
 	UploadFile	   task.UploadFileRouter
 	RentComputer   rentComputer.RouterGroup
 	DataStatistics dataStatistics.RouterGroup
+	FileManager    fileManager.RouterGroup
 }
 
 var RouterGroupApp = new(RouterGroup)

+ 7 - 0
router/fileManager/enter.go

@@ -0,0 +1,7 @@
+package fileManager
+
+type RouterGroup struct {
+	// Code generated by log-server Begin; DO NOT EDIT.
+	FileFolderRouter
+	// Code generated by log-server End; DO NOT EDIT.
+}

+ 19 - 0
router/fileManager/file_folder.go

@@ -0,0 +1,19 @@
+package fileManager
+
+import (
+	"github.com/gin-gonic/gin"
+	v1 "log-server/api/v1"
+)
+
+type FileFolderRouter struct {
+}
+
+func (e *FileFolderRouter) InitFileFolderRouter(Router *gin.RouterGroup) {
+	excelRouter := Router.Group("fileManager")
+	api := v1.ApiGroupApp.FileManagerGroup.ApiFileFolder
+	{
+		excelRouter.POST("getAllTaskSimple", api.GetAllTaskSimple)   //查询记录
+		excelRouter.POST("addFileFolder", api.AddFileFolder)         //新建文件夹
+		excelRouter.POST("getFolderFileList", api.GetFolderFileList) //新建文件夹
+	}
+}

+ 2 - 0
service/enter.go

@@ -3,6 +3,7 @@ package service
 import (
 	"log-server/service/dataStatistics"
 	"log-server/service/example"
+	"log-server/service/fileManager"
 	"log-server/service/log"
 	"log-server/service/rentComputer"
 	"log-server/service/system"
@@ -18,6 +19,7 @@ type ServiceGroup struct {
 	TaskServiceGroup           task.ServiceGroup
 	RentComputerServiceGroup   rentComputer.ServiceGroup
 	DataStatisticsServiceGroup dataStatistics.ServiceGroup
+	FileManagerServiceGroup    fileManager.ServiceGroup
 }
 
 var ServiceGroupApp = new(ServiceGroup)

+ 186 - 0
service/fileManager/download_url.go

@@ -0,0 +1,186 @@
+package fileManager
+
+import (
+	"errors"
+	"fmt"
+	"github.com/bitly/go-simplejson"
+	"go.uber.org/zap"
+	"gorm.io/gorm"
+	"log-server/global"
+	"log-server/model/fileManager"
+	"log-server/model/task"
+	"log-server/service/system"
+	"log-server/utils"
+	"strconv"
+	"strings"
+	"time"
+)
+
+type ServiceDownLoadUrl struct {
+}
+
+var robotService = new(system.RobotService)
+
+// UpdateGameVersion 定时更新游戏版本号和链接
+func (s *ServiceDownLoadUrl) UpdateGameVersion() {
+	nowTime := time.Now().Format("2006-01-02 15:04:05")
+	taskList, err := s.GetAllTaskByRun()
+	if err != nil {
+		global.GVA_LOG.Error("定时更新游戏版本号和链接执行失败,查询所有在运行的任务失败:"+nowTime, zap.Error(err))
+		return
+	}
+	content := ""
+	var directorName string
+	for _, v := range taskList {
+		global.GVA_LOG.Info(v.GameIdXmy + v.TaskName)
+		if v.GameIdXmy == "" {
+			continue
+		}
+		result, err := s.GetGameDownLoadUrlAndVersion(v.GameIdXmy)
+		if err != nil {
+			return
+		}
+		dataJson, _ := simplejson.NewJson(result)
+		code, _ := dataJson.Get("code").Int()
+		//global.GVA_LOG.Info(strconv.Itoa(code))
+		//msg, _ := dataJson.Get("msg").String()
+		//global.GVA_LOG.Info(msg)
+		if code != 0 {
+			continue
+		}
+		packageUrl, _ := dataJson.Get("data").Get("package").Get("download_url").String()
+		//global.GVA_LOG.Info(packageUrl)
+		packageVersionCode, _ := dataJson.Get("data").Get("package").Get("version_code").Int()
+		//global.GVA_LOG.Info(strconv.Itoa(packageVersionCode))
+
+		appUrl, _ := dataJson.Get("data").Get("app").Get("download_url").String()
+		//global.GVA_LOG.Info(appUrl)
+		appVersionName, _ := dataJson.Get("data").Get("app").Get("version_name").String()
+		//global.GVA_LOG.Info(appVersionName)
+		appFlag, _ := dataJson.Get("data").Get("app").Get("flag").Int()
+		//global.GVA_LOG.Info(strconv.Itoa(appFlag))
+
+		one := new(fileManager.DownLoadUrl)
+		one.PackageUrl = packageUrl
+		one.PackageVersionCode = packageVersionCode
+		one.AppUrl = appUrl
+		one.AppVersionName = appVersionName
+		one.AppFlag = appFlag
+		one.TaskId = v.TaskId
+		one.CreateTime = time.Now().Format("2006-01-02 15:04:05")
+		one.UpdateTime = time.Now().Format("2006-01-02 15:04:05")
+		//先查询是否存在,存在则对比版本号与链接;不存在则插入
+		old := fileManager.DownLoadUrl{}
+		var keyWord string
+		if !errors.Is(global.GVA_DB.Model(&fileManager.DownLoadUrl{}).Where("task_id = ?", v.TaskId).First(&old).Error, gorm.ErrRecordNotFound) {
+			flagPackage := false
+			if one.PackageVersionCode > old.PackageVersionCode {
+				flagPackage = true
+				//global.GVA_LOG.Info("package有新版本")
+				if one.PackageUrl != "" {
+					keyWord += "在打包平台有新版本: " + one.PackageUrl + ";<font color=\"warning\">更新大概率为强制更新</font>;"
+					//keyWord += "在打包平台有新版本: [点击下载](" + one.PackageUrl + ");"
+				}
+			}
+			flagApp := false
+			sv1 := s.StrsToSlice(one.AppVersionName)
+			sv2 := s.StrsToSlice(old.AppVersionName)
+			s1Appended, s2Appended := s.ApeendZreo(sv1, sv2)
+			for i := 0; i < len(s1Appended); i++ {
+				if s1Appended[i] > s2Appended[i] {
+					flagApp = true
+					//global.GVA_LOG.Info("app有新版本")
+					if one.AppUrl != "" {
+						keyWord += "在小绵羊APP有新版本: " + one.AppUrl + ";"
+						if one.AppFlag == 1 {
+							global.GVA_LOG.Info("游戏有强更")
+							keyWord += "<font color=\"warning\">更新可能为强制更新</font>;"
+						}
+					}
+					break
+				}
+			}
+			if flagPackage == true || flagApp == true {
+				err = global.GVA_DB.Model(&fileManager.DownLoadUrl{}).Where("task_id = ?", v.TaskId).Updates(one).Error
+			}
+			if err != nil {
+				global.GVA_LOG.Error("定时更新游戏版本号和链接执行失败,执行数据库操作失败:"+nowTime, zap.Error(err))
+				return
+			}
+			//播报内容
+			if keyWord != "" {
+				if directorName != v.User {
+					content += ">#### **" + v.User + "**\n " + strconv.Itoa(v.TaskId) + " " + v.TaskName + keyWord + "\n"
+				} else {
+					content += strconv.Itoa(v.TaskId) + " " + v.TaskName + keyWord + "\n"
+				}
+				directorName = v.User
+			}
+		} else {
+			err = global.GVA_DB.Create(&one).Error
+		}
+		if err != nil {
+			global.GVA_LOG.Error("定时更新游戏版本号和链接执行失败,执行数据库操作失败:"+nowTime, zap.Error(err))
+			return
+		}
+	}
+	if content != "" {
+		content = ">#### **【游戏更新】预警** (" + nowTime + "):\n" + content
+		//global.GVA_LOG.Info(content)
+		url := global.GVA_CONFIG.SendUrl.ComputerSendUrl
+		_, _ = robotService.PostRobotToEnterpriseWeChatByMarkdown(url, content)
+		url2 := global.GVA_CONFIG.SendUrl.KeyWordSendUrl
+		_, _ = robotService.PostRobotToEnterpriseWeChatByMarkdown(url2, content)
+	}
+}
+
+// GetAllTaskByRun 查询所有在运行的任务
+func (s *ServiceDownLoadUrl) GetAllTaskByRun() (list []task.GameTask, err error) {
+	var taskList []task.GameTask
+	db := global.GVA_DB.Model(&task.GameTask{})
+	db.Where("status = 1")
+	err = db.Order("user").Find(&taskList).Error
+	return taskList, err
+}
+
+// GetGameDownLoadUrlAndVersion 获取游戏版本和下载链接
+func (s *ServiceDownLoadUrl) GetGameDownLoadUrlAndVersion(xmyId string) (result []byte, err error) {
+	url := "http://rtd.kfzs.com/get_version.php"
+	params := map[string]string{
+		"game_id": xmyId,
+	}
+	result, err = utils.HttpGet(url, params)
+	return
+}
+
+// ApeendZreo 补全切片
+func (s *ServiceDownLoadUrl) ApeendZreo(s1, s2 []string) ([]string, []string) {
+	var count int
+	if len(s1) > len(s2) {
+		count = len(s1) - len(s2)
+		for i := 0; i < count; i++ {
+			s2 = append(s2, "0")
+		}
+	}
+	if len(s1) < len(s2) {
+		count = len(s2) - len(s1)
+		for i := 0; i < count; i++ {
+			s1 = append(s1, "0")
+		}
+	}
+
+	return s1, s2
+}
+
+func (s *ServiceDownLoadUrl) StrsToSlice(version string) []string {
+	return strings.Split(version, ".")
+}
+
+func (s *ServiceDownLoadUrl) StrToInt64(str string) int64 {
+	res, err := strconv.Atoi(str)
+	if err != nil {
+		fmt.Println("Invalid Number string")
+		return -1
+	}
+	return int64(res)
+}

+ 11 - 0
service/fileManager/enter.go

@@ -0,0 +1,11 @@
+package fileManager
+
+type ServiceGroup struct {
+	// Code generated by log-server Begin; DO NOT EDIT.
+	ServiceFileFolder
+	ServiceDownLoadUrl
+	//ServiceRentComputerShop
+	//ServiceRentSetMeal
+	//ServiceRentComputerLedger
+	// Code generated by log-server End; DO NOT EDIT.
+}

+ 153 - 0
service/fileManager/file_folder.go

@@ -0,0 +1,153 @@
+package fileManager
+
+import (
+	"context"
+	"errors"
+	"go.uber.org/zap"
+	"gorm.io/gorm"
+	"log-server/global"
+	"log-server/model/fileManager"
+	"log-server/model/fileManager/request"
+	"log-server/model/fileManager/response"
+	"log-server/model/task"
+	"time"
+)
+
+type ServiceFileFolder struct {
+}
+
+// FileList 获取当前父文件夹下所有的子文件夹和文件
+func (s *ServiceFileFolder) FileList(ctx context.Context, api fileManager.FileFolder, info request.PageInfo, order string, desc bool) (interface{}, int64, error) {
+	//开始查询当前父文件夹下的所有文件夹(目录)
+	db := global.GVA_DB.Model(&fileManager.FileFolder{})
+	db = db.Where("parent_id = ?", api.ParentId)
+	var total int64
+	err := db.Count(&total).Error
+	if err != nil {
+		return nil, 0, err
+	}
+	limit := info.PageSize
+	offset := info.PageSize * (info.Page - 1)
+	//var statisticsLogs []*log.LogComputer
+	var folderListRes []*response.FileFolderResponse
+	db = db.Limit(limit).Offset(offset)
+	if order != "" {
+		var OrderStr string
+		// 设置有效排序key 防止sql注入
+		// 感谢 Tom4t0 提交漏洞信息
+		orderMap := make(map[string]bool, 3)
+		orderMap["name"] = true
+		//orderMap["game_id"] = true
+		//orderMap["operator"] = true
+		if orderMap[order] {
+			if desc {
+				OrderStr = order + " desc"
+			} else {
+				OrderStr = order
+			}
+		} else { // didn't matched any order key in `orderMap`
+			global.GVA_LOG.Error("获取失败!", zap.Error(err))
+			return folderListRes, total, err
+		}
+		err = db.Order(OrderStr).Find(&folderListRes).Error
+	} else {
+		err = db.Order("name").Find(&folderListRes).Error
+	}
+	if err != nil {
+		return nil, 0, err
+	}
+	var folderList []*response.FileFolderResponse
+
+	for _, one := range folderListRes {
+
+		folder := new(response.FileFolderResponse)
+		folder.Id = one.Id
+		folder.UpdateTime = one.UpdateTime
+		folder.CreateTime = one.CreateTime
+		folder.Name = one.Name
+		folder.ParentId = one.ParentId
+		folder.TaskId = one.TaskId
+		folderList = append(folderList, folder)
+	}
+	//开始查询当前父文件夹下的所有文件
+
+	//===============================
+	return folderList, total, err
+}
+
+//
+//func (s *ServiceRentComputer) GetRentComputerNum(ctx context.Context, api rentComputer.RentComputer) int64 {
+//	var total int64
+//
+//	db := global.GVA_DB.Model(&rentComputer.RentComputer{})
+//	db = db.Distinct("id")
+//	//db = db.Where("is_off_shelf = 0 and is_expire != 1")
+//	if api.PcNum != "" {
+//		db = db.Where("rent_computer.pc_num = ?", api.PcNum)
+//	}
+//	if api.ShopId != 0 {
+//		db = db.Where("rent_computer.shop_id = ?", api.ShopId)
+//	}
+//	if api.SetMealId != 0 {
+//		db = db.Where("rent_computer.set_meal_id = ?", api.SetMealId)
+//	}
+//	if api.DirectorName != "ALL" {
+//		if api.DirectorName == "" {
+//			db = db.Where("rent_computer.director_name IS NULL")
+//		} else {
+//			db = db.Where("rent_computer.director_name = ?", api.DirectorName)
+//		}
+//	}
+//	if api.IsExpire != -1 {
+//		db = db.Where("rent_computer.is_expire = ?", api.IsExpire)
+//	}
+//	_ = db.Count(&total).Error
+//	return total
+//}
+
+func (s *ServiceFileFolder) AddFileFolder(requestFolder request.FileFolderRequest) (parentId int, parentName string, err error) {
+	if !errors.Is(global.GVA_DB.Where("name = ? and parent_id = ? and task_id = ?", requestFolder.Name, requestFolder.ParentId, requestFolder.TaskId).First(&fileManager.FileFolder{}).Error, gorm.ErrRecordNotFound) {
+		return requestFolder.ParentId, requestFolder.Name, errors.New("文件夹已存在")
+	}
+	folder := new(fileManager.FileFolder)
+	folder.Name = requestFolder.Name
+	folder.ParentId = requestFolder.ParentId
+	folder.TaskId = requestFolder.TaskId
+	folder.CreateTime = time.Now().Format("2006-01-02 15:04:05")
+	folder.UpdateTime = time.Now().Format("2006-01-02 15:04:05")
+	err = global.GVA_DB.Create(&folder).Error
+	if err != nil {
+		return requestFolder.ParentId, requestFolder.Name, err
+	}
+	//查询刚刚创建文件夹的id
+	insertFolder := fileManager.FileFolder{}
+	err = global.GVA_DB.Where("name = ? and parent_id = ? and task_id = ?", requestFolder.Name, requestFolder.ParentId, requestFolder.TaskId).First(&insertFolder).Error
+	if err != nil {
+		return requestFolder.ParentId, requestFolder.Name, err
+	}
+	//判断如果是与任务相关联,则默认创建脚本、镜像、游戏包三个文件夹
+	folderDefaultList := []string{"脚本", "镜像", "apk"}
+	if requestFolder.TaskId != 0 {
+		for _, name := range folderDefaultList {
+			one := new(fileManager.FileFolder)
+			one.Name = name
+			one.ParentId = insertFolder.Id
+			one.TaskId = 0
+			one.CreateTime = time.Now().Format("2006-01-02 15:04:05")
+			one.UpdateTime = time.Now().Format("2006-01-02 15:04:05")
+			err = global.GVA_DB.Create(&one).Error
+			if err != nil {
+				return requestFolder.ParentId, requestFolder.Name, err
+			}
+		}
+	}
+	return insertFolder.Id, insertFolder.Name, err
+}
+
+// GetAllTaskSimple 查询所有任务
+func (s *ServiceFileFolder) GetAllTaskSimple() (list interface{}, err error) {
+	var taskList []task.GameTask
+	db := global.GVA_DB.Model(&task.GameTask{})
+	err = db.Order("id").Find(&taskList).Error
+	return taskList, err
+}