// ========================================================================== // GFast自动生成controller操作代码。 // 生成日期:2023-12-12 15:21:22 // 生成路径: internal/app/system/controller/manage_task.go // 生成人:gfast // desc:航线任务下发 // company:云南奇讯科技有限公司 // ========================================================================== package controller import ( "context" "errors" "github.com/gogf/gf/v2/database/gdb" "github.com/gogf/gf/v2/frame/g" uuid "github.com/satori/go.uuid" "github.com/tiger1103/gfast/v3/api/v1/common/coryCommon" "github.com/tiger1103/gfast/v3/api/v1/system" "github.com/tiger1103/gfast/v3/internal/app/system/dao" ct "github.com/tiger1103/gfast/v3/internal/app/system/logic/context" logic "github.com/tiger1103/gfast/v3/internal/app/system/logic/manageTaskRecord" "github.com/tiger1103/gfast/v3/internal/app/system/model" "github.com/tiger1103/gfast/v3/internal/app/system/service" "github.com/tiger1103/gfast/v3/library/liberr" "github.com/tiger1103/gfast/v3/third/plane/dj" "github.com/tiger1103/gfast/v3/third/plane/mqtt" tool "github.com/tiger1103/gfast/v3/utility/coryUtils" "strconv" "strings" "time" ) type manageTaskController struct { BaseController } var ManageTask = new(manageTaskController) // List 列表 func (c *manageTaskController) List(ctx context.Context, req *system.ManageTaskSearchReq) (res *system.ManageTaskSearchRes, err error) { res, err = service.ManageTask().List(ctx, req) return } // Get 获取航线任务下发 func (c *manageTaskController) Get(ctx context.Context, req *system.ManageTaskGetReq) (res *system.ManageTaskGetRes, err error) { res = new(system.ManageTaskGetRes) res.ManageTaskInfoRes, err = service.ManageTask().GetById(ctx, req.Id) return } // Add 添加航线任务下发 func (c *manageTaskController) Add(ctx context.Context, req *system.ManageTaskAddReq) (res *system.ManageTaskAddRes, err error) { err = service.ManageTask().Add(ctx, req) return } // Edit 修改航线任务下发 func (c *manageTaskController) Edit(ctx context.Context, req *system.ManageTaskEditReq) (res *system.ManageTaskEditRes, err error) { err = service.ManageTask().Edit(ctx, req) return } // Delete 删除航线任务下发 func (c *manageTaskController) Delete(ctx context.Context, req *system.ManageTaskDeleteReq) (res *system.ManageTaskDeleteRes, err error) { err = service.ManageTask().Delete(ctx, req.Ids) return } // FlighttaskPrepare 航线任务下发 func (c *manageTaskController) FlighttaskPrepare(ctx context.Context, req *system.FlighttaskPrepareReq) (res *system.FlighttaskPrepareRes, err error) { _, err = FlighttaskPrepareFunc(ctx, req) return } // FlighttaskPrepareFunc 下发任务 or 断点续飞 func FlighttaskPrepareFunc(ctx context.Context, req *system.FlighttaskPrepareReq) (id int64, err error) { get, err := g.Redis().Get(ctx, mqtt.RainfallStr+req.GatewaySn) if err == nil && get.String() == " " { err = errors.New("无法获取降雨量") return } else if get.Int() > 0 { err = errors.New("机舱外正在下雨,无法下发任务!") return } err = g.DB().Transaction(ctx, func(ctx context.Context, tx gdb.TX) error { err = g.Try(ctx, func(ctx context.Context) { var mt *model.ManageTaskInfoRes err = dao.ManageTask.Ctx(ctx).WherePri(req.Id).Scan(&mt) if mt != nil { all := strings.ReplaceAll(uuid.NewV4().String(), "-", "") if req.BreakpointRenewalUUID != "" { all = req.BreakpointRenewalUUID } //1、组装数据。发送mq line := mt.AirLine var ma *model.ManageAirlineInfoRes err = dao.ManageAirline.Ctx(ctx).WherePri(line).Scan(&ma) if ma == nil { liberr.ErrIsNil(ctx, err) return } prepareRes := dj.FlighttaskPrepareRes{} prepareRes.Data.FlightId = all atoi, _ := strconv.Atoi(req.TaskType) prepareRes.Data.TaskType = atoi prepareRes.Data.TaskType = atoi prepareRes.Data.ExecuteTime = req.ExecuteTime prepareRes.Data.WaylineType = mt.WaylineType prepareRes.Data.File = &dj.FileEntity{Url: coryCommon.GlobalPath + "/" + ma.FilePath, Fingerprint: ma.Fingerprint} prepareRes.Data.RthAltitude = mt.RthAltitude prepareRes.Data.RthMode = mt.RthMode prepareRes.Data.OutOfControlAction = mt.OutOfControlAction prepareRes.Data.ExitWaylineWhenRcLost = mt.ExitWaylineWhenRcLost if req.BreakPoint != nil { //断点续飞 point := dj.BreakPoint{ Index: req.BreakPoint.Index, State: req.BreakPoint.State, Progress: req.BreakPoint.Progress, WaylineId: req.BreakPoint.WaylineId, } prepareRes.Data.BreakPoint = &point } _, _, err2, reply := mqtt.Flighttask_prepare(ctx, req.GatewaySn, &prepareRes) if err2 != nil { liberr.ErrIsNil(ctx, err2, "下发任务失败!") return } if reply.Data.Result > 0 { err = mqtt.Geterror(reply.Data.Result) liberr.ErrIsNil(ctx, err) return } var idd uint64 user := ct.New().GetLoginUser(ctx) if user == nil { idd = 0 } else { idd = user.Id } if req.BreakPoint == nil { // 预估回传数量 number, numberErr := logic.GetTheTaskDataBasedOnTheTaskId(ctx, mt.Id) if numberErr != nil { g.Log("uav").Error(ctx, "预估回传数量错误") liberr.ErrIsNil(ctx, numberErr) return } //2、新增历史记录 infoRes := model.ManageTaskRecordInfoRes{ TaskId: mt.Id, TaskType: req.TaskType, ExecuteTime: req.ExecuteTime, FlightId: all, Remark: req.Remark, MqClientId: mt.MqClientId, ProjectId: mt.ProjectId, CreateBy: strconv.FormatUint(idd, 10), TaskName: mt.TaskName, Waypoint: number, } //不为空代表定时自动飞行 if req.TimedFlight != "" { infoRes.IsVoluntarily = "0" } else { infoRes.IsVoluntarily = "1" } insertData, err := dao.ManageTaskRecord.Ctx(ctx).OmitEmpty().Insert(infoRes) liberr.ErrIsNil(ctx, err, "任务下发失败!") id, err = insertData.LastInsertId() liberr.ErrIsNil(ctx, err) } else { //断点续飞 time.Sleep(1 * time.Second) errDd, replyDd := mqtt.Flighttask_execute(ctx, req.GatewaySn, all) if errDd != nil { return } if replyDd.Data.Result > 0 { err = mqtt.Geterror(replyDd.Data.Result) } else { dao.ManageTaskRecord.Ctx(ctx).Where("flight_id", req.BreakpointRenewalUUID).Update(g.Map{"execute_the_task": tool.MillisecondTimestamp()}) } return } } liberr.ErrIsNil(ctx, err) return }) return err }) return }