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