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, &params)
+	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