From f5eb41782ed6584664b797df820423f63490d4d3 Mon Sep 17 00:00:00 2001 From: zhangqian <zhangqian@123.com> Date: 星期一, 30 十月 2023 12:12:42 +0800 Subject: [PATCH] 按通道号和查询类型查询任务列表 --- service/task.go | 89 +++++++++++++++++++++ model/procedures.go | 37 +++++++++ router/index.go | 1 model/request/task.go | 16 ++++ api/v1/task.go | 71 +++++++++++++++++ 5 files changed, 211 insertions(+), 3 deletions(-) diff --git a/api/v1/task.go b/api/v1/task.go index 36ab772..cd04286 100644 --- a/api/v1/task.go +++ b/api/v1/task.go @@ -414,3 +414,74 @@ logx.Info("----------------涓嬪彂宸ヨ壓鍙傛暟瀹屾瘯-----------------") return nil } + +// TaskListByChannel +// @Tags Task +// @Summary 鑾峰彇浠诲姟鍒楄〃2 +// @Produce application/json +// @Param object query request.SimpleTaskList true "鏌ヨ鍙傛暟" +// @Success 200 {object} contextx.Response{data=map[int32]response.taskResponse} "鎴愬姛" +// @Router /v1/task/listByChannel [get] +func (slf *TaskApi) TaskListByChannel(c *gin.Context) { + var params request.TaskListByChannel + ctx, ok := contextx.NewContext(c, ¶ms) + if !ok { + return + } + + channelAmount, err := service.NewDevicePlcService().GetDeviceChannelAmount() + if err != nil { + ctx.FailWithMsg(ecode.NeedConfirmedErr, err.Error()) + return + } + + dataMap := make(map[int32]*response.TaskResponse, channelAmount) + if params.Channel != nil { + taskResponse, err := getTaskResponseByChannel(params, *params.Channel) + if err != nil { + ctx.FailWithMsg(ecode.DBErr, err.Error()) + return + } + dataMap[*params.Channel] = taskResponse + ctx.OkWithDetailed(dataMap) + return + } + + //涓嶄紶channel鍙栨墍鏈塩hannel鐨� + var wg sync.WaitGroup + var mu sync.Mutex + for i := 0; i < channelAmount; i++ { + wg.Add(1) + go func(channel int32) { + defer wg.Done() + taskResponse, err := getTaskResponseByChannel(params, channel) + if err != nil { + ctx.FailWithMsg(ecode.DBErr, err.Error()) + return + } + mu.Lock() + defer mu.Unlock() + dataMap[channel] = taskResponse + }(int32(i)) + } + wg.Wait() + ctx.OkWithDetailed(dataMap) +} + +func getTaskResponseByChannel(params request.TaskListByChannel, channel int32) (taskResponse *response.TaskResponse, err error) { + taskResponse, err = service.NewTaskService().GetTask2(params.Offset, params.Limit, []int32{channel}, params.Type) //鍙栬繘琛屼腑鐨勬垨鏈紑濮嬬殑 + if err != nil { + return + } + + nowTs := time.Now().Unix() + flagMap := make(map[int32]struct{}, 0) + for _, task := range taskResponse.Tasks { + if _, ok := flagMap[task.Channel]; !ok && !service.TaskFlagGet(task.Channel) && task.Procedure.StartTime <= nowTs { + task.CanStarted = true + flagMap[task.Channel] = struct{}{} + } + } + taskResponse.Prompt = conf.Conf.Prompt + return +} diff --git a/model/procedures.go b/model/procedures.go index 4e10260..c1df06c 100644 --- a/model/procedures.go +++ b/model/procedures.go @@ -34,11 +34,15 @@ PageSize int Orm *gorm.DB Preload bool + StartTimeMin int64 StartTimeMax int64 EndTimeMin int64 + EndTimeMax int64 StatusNot ProcedureStatus ProcedureIds []string Channels []int32 + Offset int + Limit int } ) @@ -81,6 +85,11 @@ return slf } +func (slf *ProceduresSearch) SetOffset(offset, limit int) *ProceduresSearch { + slf.Offset, slf.Limit = offset, limit + return slf +} + func (slf *ProceduresSearch) SetOrder(order string) *ProceduresSearch { slf.Order = order return slf @@ -96,6 +105,11 @@ return slf } +func (slf *ProceduresSearch) SetStartTimeMin(ts int64) *ProceduresSearch { + slf.StartTimeMin = ts + return slf +} + func (slf *ProceduresSearch) SetStartTimeMax(ts int64) *ProceduresSearch { slf.StartTimeMax = ts return slf @@ -103,6 +117,11 @@ func (slf *ProceduresSearch) SetEndTimeMin(ts int64) *ProceduresSearch { slf.EndTimeMin = ts + return slf +} + +func (slf *ProceduresSearch) SetEndTimeMax(ts int64) *ProceduresSearch { + slf.EndTimeMax = ts return slf } @@ -141,6 +160,11 @@ return slf } +func (slf *ProceduresSearch) SetChannel(channel int32) *ProceduresSearch { + slf.Channel = channel + return slf +} + func (slf *ProceduresSearch) build() *gorm.DB { var db = slf.Orm.Model(&Procedures{}) @@ -168,8 +192,16 @@ db = db.Where("start_time <= ?", slf.StartTimeMax) } + if slf.StartTimeMin != 0 { + db = db.Where("start_time >= ?", slf.EndTimeMin) + } + if slf.EndTimeMin != 0 { db = db.Where("end_time > ?", slf.EndTimeMin) + } + + if slf.EndTimeMax != 0 { + db = db.Where("end_time < ?", slf.StartTimeMax) } if slf.Status != 0 { @@ -303,6 +335,11 @@ if slf.PageNum*slf.PageSize > 0 { db = db.Offset((slf.PageNum - 1) * slf.PageSize).Limit(slf.PageSize) } + + if slf.Offset*slf.Limit > 0 { + db = db.Offset(slf.Offset).Limit(slf.Limit) + } + if err := db.Find(&records).Error; err != nil { return records, total, fmt.Errorf("find records err: %v", err) } diff --git a/model/request/task.go b/model/request/task.go index 614b629..bb144b7 100644 --- a/model/request/task.go +++ b/model/request/task.go @@ -31,3 +31,19 @@ ProcedureId uint `json:"procedureId" form:"procedureId" binding:"required"` //褰撳墠鐨勫伐搴廼d Number string `json:"number" form:"number" binding:"required"` //褰撳墠姝e湪浣跨敤鐨勫伐鑹哄弬鏁扮紪鍙� } + +// TaskListByChannel 鎸塩hannel杩斿洖浠诲姟鍒楄〃璇锋眰鍙傛暟 +type TaskListByChannel struct { + Offset int `json:"offset,omitempty"` //榛樿0 + Limit int `json:"limit,omitempty"` //榛樿3 + Type QueryType `json:"type,omitempty"` //1 鏈畬鎴� 2 浠婂ぉ鏈畬鎴� 3 宸插畬鎴� + Channel *int32 `json:"channel"` //閫氶亾鍙枫�備笉浼犲彇鍏ㄩ儴鐨� +} + +type QueryType int + +const ( + QueryTypeUnFinish QueryType = 1 + QueryTypeToday QueryType = 2 + QueryTypeFinished QueryType = 3 +) diff --git a/router/index.go b/router/index.go index a16940f..3d251be 100644 --- a/router/index.go +++ b/router/index.go @@ -41,6 +41,7 @@ taskGroup.POST("sendProcessParams", taskApi.TaskStart) // 涓嬪彂宸ヨ壓鍙傛暟骞跺紑濮嬪伐搴� taskGroup.POST("updateProcessParams", taskApi.UpdateProcessParams) // 鏇存柊宸ヨ壓鍙傛暟 taskGroup.PUT("finish/:id", taskApi.TaskFinish) // 瀹屾垚宸ュ簭 + taskGroup.PUT("list", taskApi.TaskListByChannel) //鎸夐�氶亾鍙锋煡璇换鍔″垪琛� // 绠�鏄撲换鍔″垪琛� } configApi := new(v1.ConfigApi) diff --git a/service/task.go b/service/task.go index ed8b6ea..8f6388d 100644 --- a/service/task.go +++ b/service/task.go @@ -5,6 +5,7 @@ "apsClient/constvar" "apsClient/model" "apsClient/model/common" + "apsClient/model/request" "apsClient/model/response" "apsClient/pkg/ecode" "apsClient/pkg/logx" @@ -29,7 +30,7 @@ taskResp = &response.TaskResponse{ Tasks: taskList, TaskCount: count, - Workers: slf.WorkerDistinct(workers), + Workers: workers, } var ( @@ -99,8 +100,9 @@ workers = append(workers, procedure.ProceduresInfo.Workers...) } taskResp = &response.TaskResponse{ - Tasks: taskList, - Workers: slf.WorkerDistinct(workers), + Tasks: taskList, + TaskCount: count, + Workers: slf.WorkerDistinct(workers), } return taskResp, ecode.OK } @@ -200,3 +202,84 @@ func (slf TaskService) RemoveTaskStatusSync(ids []uint) (err error) { return model.NewTaskStatusSyncSearch(nil).SetIDs(ids).Delete() } + +// GetTask2 鑾峰彇浠诲姟鍒楄〃2 +func (slf TaskService) GetTask2(offset, limit int, channels []int32, queryType request.QueryType) (taskResp *response.TaskResponse, err error) { + var taskList []*response.TaskData + var count int64 + var workers []*common.ProcedureWorker + + taskResp = &response.TaskResponse{ + Tasks: taskList, + TaskCount: count, + Workers: workers, + } + + var ( + orders []*model.Order + procedures []*model.Procedures + workOrderIds []string + ) + search := model.NewProceduresSearch(nil). + SetDeviceId(conf.Conf.System.DeviceId). + SetOffset(offset, limit).SetChannels(channels) + nowTs := time.Now().Unix() + switch queryType { + case request.QueryTypeUnFinish: + search.SetStatusNot(model.ProcedureStatusFinished).SetOrder("status desc, start_time asc") + case request.QueryTypeToday: + search.SetStatusNot(model.ProcedureStatusFinished).SetStartTimeMin(nowTs).SetEndTimeMax(nowTs + 86400).SetOrder("status desc, start_time asc") + case request.QueryTypeFinished: + search.SetStatus(model.ProcedureStatusFinished).SetOrder("start_time desc") + } + + procedures, total, err := search.Find() + if err != nil { + return taskResp, err + } + + if err != nil { + return taskResp, err + } + if len(procedures) == 0 { + return taskResp, nil + } + + for _, procedure := range procedures { + workOrderIds = append(workOrderIds, procedure.WorkOrderID) + } + orders, err = model.NewOrderSearch(nil).SetWorkOrderIds(workOrderIds).FindNotTotal() //鐢卞伐搴忓弽鎺ㄥ伐鍗� + if err != nil { + return taskResp, err + } + + orderMap := make(map[string]*model.Order, len(workOrderIds)) + for _, order := range orders { + orderMap[order.WorkOrderID] = order + } + for _, procedure := range procedures { + taskData := response.TaskData{ + Order: orderMap[procedure.WorkOrderID], + Procedure: procedure, + AllProcedures: procedure.ProceduresInfo.AllProcedureNames, + CurrentProcedureIndex: 0, + Channel: procedure.Channel, + } + index := 0 + for _, name := range procedure.ProceduresInfo.AllProcedureNames { + if name == procedure.ProceduresInfo.ProcedureName { + break + } + index++ + } + taskData.CurrentProcedureIndex = index + taskList = append(taskList, &taskData) + workers = append(workers, procedure.ProceduresInfo.Workers...) + } + taskResp = &response.TaskResponse{ + Tasks: taskList, + TaskCount: total, + Workers: slf.WorkerDistinct(workers), + } + return taskResp, err +} -- Gitblit v1.8.0