From fcc5eaccffbbd0980077cf3fc4707566546f879a Mon Sep 17 00:00:00 2001
From: zhangqian <zhangqian@123.com>
Date: 星期四, 17 八月 2023 17:31:18 +0800
Subject: [PATCH] 增加plc pkg, 增加获取任务,完成任务,开始任务接口

---
 service/task.go          |   69 ++
 nsq/msg_handler.go       |   55 +
 .gitignore               |    3 
 logs/apsClient.info.log  |  133 ++++
 model/procedures.go      |   80 ++
 go.mod                   |    1 
 docs/swagger.yaml        |  146 +++-
 logs/apsClient.err.log   |   11 
 docs/docs.go             |  198 ++++-
 api/v1/task.go           |  111 +++
 docs/swagger.json        |  198 ++++-
 /dev/null                |  260 --------
 pkg/plc/plc4x.go         |  127 ++++
 model/order.go           |  268 +++++++++
 model/index.go           |    2 
 conf/config.go           |   24 
 conf/apsClient.json      |   16 
 model/response/common.go |    9 
 router/index.go          |   11 
 19 files changed, 1,188 insertions(+), 534 deletions(-)

diff --git a/.gitignore b/.gitignore
index 5f530a0..ca9b9ad 100644
--- a/.gitignore
+++ b/.gitignore
@@ -22,4 +22,5 @@
 *.exe
 *.test
 apsClient
-aps.db
\ No newline at end of file
+aps.db
+.idea
\ No newline at end of file
diff --git a/api/v1/notice.go b/api/v1/notice.go
deleted file mode 100644
index 53b7a01..0000000
--- a/api/v1/notice.go
+++ /dev/null
@@ -1,44 +0,0 @@
-package v1
-
-import (
-	"apsClient/model/request"
-	_ "apsClient/model/response"
-	"apsClient/pkg/contextx"
-	"apsClient/pkg/logx"
-	"apsClient/pkg/safe"
-	"apsClient/service"
-	"github.com/gin-gonic/gin"
-)
-
-type NoticeApi struct{}
-
-// TaskStart
-// @Tags      Base
-// @Summary   浠诲姟寮�鍚�氱煡
-// @Produce   application/json
-// @Param     object  body    request.TaskInfo true  "鏌ヨ鍙傛暟"
-// @Success   200   {object}  contextx.Response{}  "鎴愬姛"
-// @Router    /v1/notice/task/start [post]
-func (slf *NoticeApi) TaskStart(c *gin.Context) {
-	var params request.TaskInfo
-	ctx, ok := contextx.NewContext(c, &params)
-	if !ok {
-		return
-	}
-	safe.Go(func() {
-		resp, err := service.ProcessModel{}.GetProcessModel(service.GetProcessModelParams{
-			WorkOrder: params.WorkOrder,
-			OrderId:   params.OrderId,
-			Product:   params.Product,
-			Procedure: params.Procedure,
-			Device:    params.Device,
-		})
-		if err != nil {
-			logx.Errorf("TaskStart Notice GetProcessModel error: %v", err.Error())
-			return
-		}
-		logx.Infof("TaskStart Notice GetProcessModel: %+v", resp)
-	})
-
-	ctx.Ok()
-}
diff --git a/api/v1/task.go b/api/v1/task.go
index 196ee69..cc746f2 100644
--- a/api/v1/task.go
+++ b/api/v1/task.go
@@ -1,47 +1,114 @@
 package v1
 
 import (
-	"apsClient/model/request"
+	"apsClient/model"
 	_ "apsClient/model/response"
 	"apsClient/pkg/contextx"
+	"apsClient/pkg/convertx"
 	"apsClient/pkg/ecode"
+	"apsClient/pkg/logx"
 	"apsClient/service"
-	"encoding/json"
 	"github.com/gin-gonic/gin"
 )
 
 type TaskApi struct{}
 
-// TaskList
-// @Tags      Base
-// @Summary   浠诲姟寮�鍚�氱煡
+// TaskGet
+// @Tags      Task
+// @Summary   鑾峰彇浠诲姟
 // @Produce   application/json
-// @Param     object  query    request.TaskList true  "鏌ヨ鍙傛暟"
-// @Success   200   {object}  contextx.Response{data=[]model.ScheduleTask}  "鎴愬姛"
-// @Router    /v1/task/list [get]
-func (slf *TaskApi) TaskList(c *gin.Context) {
-	var params request.TaskList
-	ctx, ok := contextx.NewContext(c, &params)
+// @Success   200   {object}  contextx.Response{data=response.TaskData}  "鎴愬姛"
+// @Router    /v1/task/get [get]
+func (slf *TaskApi) TaskGet(c *gin.Context) {
+	ctx, ok := contextx.NewContext(c, nil)
 	if !ok {
 		return
 	}
 
-	taskList, total, code := service.NewTaskService().GetTaskList(params.Page, params.PageSize)
+	taskData, code := service.NewTaskService().GetTask()
 	if code != ecode.OK {
 		ctx.Fail(code)
 		return
 	}
+	ctx.OkWithDetailed(taskData)
+}
 
-	for _, task := range taskList {
-		if task.Data != "" {
-			err := json.Unmarshal([]byte(task.Data), &task.TaskInfo)
-			if err != nil {
-				ctx.Fail(ecode.UnknownErr)
-				return
-			}
-		}
-
+// TaskStart
+// @Tags      Base
+// @Summary   浠诲姟寮�濮�
+// @Produce   application/json
+// @Param     id  path    int true  "宸ュ簭id"
+// @Success   200   {object}  contextx.Response{service.GetProcessModel}  "鎴愬姛"
+// @Router    /v1/task/start/{id} [get]
+func (slf *TaskApi) TaskStart(c *gin.Context) {
+	ctx, ok := contextx.NewContext(c, nil)
+	if !ok {
+		return
+	}
+	idx := c.Param("id")
+	if idx == "" {
+		ctx.Fail(ecode.ParamsErr)
+		return
+	}
+	id := convertx.Atoi(idx)
+	procedure, code := service.NewTaskService().GetProcedureById(id)
+	if code != ecode.OK {
+		ctx.Fail(code)
+		return
+	}
+	order, err := service.NewTaskService().GetOrderByOrderId(procedure.OrderID)
+	if err != nil {
+		ctx.Fail(ecode.UnknownErr)
+		return
 	}
 
-	ctx.ResultList(taskList, total)
+	params := service.GetProcessModelParams{
+		WorkOrder: "",
+		OrderId:   procedure.OrderID,
+		Product:   order.ProductName,
+		Procedure: procedure.ProceduresInfo.ProcedureName,
+		Device:    procedure.ProceduresInfo.DeviceID,
+	}
+
+	resp, err := service.ProcessModel{}.GetProcessModel(params)
+
+	if err != nil {
+		logx.Errorf("TaskStart Notice GetProcessModel error: %v", err.Error())
+		ctx.Fail(ecode.UnknownErr)
+		return
+	}
+	logx.Infof("TaskStart Notice GetProcessModel: %+v", resp)
+	ctx.OkWithDetailed(resp)
+}
+
+// TaskFinish
+// @Tags      Base
+// @Summary   浠诲姟缁撴潫
+// @Produce   application/json
+// @Param     id  path    int true  "宸ュ簭id"
+// @Success   200   {object}  contextx.Response{service.GetProcessModel}  "鎴愬姛"
+// @Router    /v1/task/finish/{id} [put]
+func (slf *TaskApi) TaskFinish(c *gin.Context) {
+	ctx, ok := contextx.NewContext(c, nil)
+	if !ok {
+		return
+	}
+	idx := c.Param("id")
+	if idx == "" {
+		ctx.Fail(ecode.ParamsErr)
+		return
+	}
+	id := convertx.Atoi(idx)
+	_, code := service.NewTaskService().GetProcedureById(id)
+	if code != ecode.OK {
+		ctx.Fail(code)
+		return
+	}
+	err := service.NewTaskService().UpdateProcedureStatus(id, model.ProcedureStatusFinished)
+	if err != nil {
+		logx.Errorf("UpdateProcedureStatus err: %v", err.Error())
+		ctx.Fail(ecode.UnknownErr)
+		return
+	}
+	ctx.Ok()
 }
diff --git a/conf/apsClient.json b/conf/apsClient.json
index aaaf003..2ed7d69 100644
--- a/conf/apsClient.json
+++ b/conf/apsClient.json
@@ -7,7 +7,8 @@
     "LimitCountIP": 15000,
     "LimitTimeIP": 3600,
     "RouterPrefix": "api",
-    "SudoPassword": "basic2021"
+    "SudoPassword": "basic2021",
+    "deviceId": "MA-JWW-1"
   },
   "log": {
     "path": "./logs/apsClient.log",
@@ -34,19 +35,6 @@
     "port": 6379,
     "password": "123456",
     "db": 0
-  },
-  "captcha": {
-    "keyLong": 6,
-    "imgWidth": 240,
-    "imgHeight": 80,
-    "openCaptcha": 0,
-    "openCaptchaTimeout": 3600
-  },
-  "jwt": {
-    "SigningKey": "327a9457-899a-481e-8b30-58cc97e5b808",
-    "ExpiresTime": "7d",
-    "BufferTime": "1d",
-    "Issuer": "qmPlus"
   },
   "etcd": {
     "endpoints": [
diff --git a/conf/config.go b/conf/config.go
index 60569a2..5af1d43 100644
--- a/conf/config.go
+++ b/conf/config.go
@@ -24,21 +24,6 @@
 )
 
 type (
-	Captcha struct {
-		KeyLong            int // 楠岃瘉鐮侀暱搴�
-		ImgWidth           int // 楠岃瘉鐮佸搴�
-		ImgHeight          int // 楠岃瘉鐮侀珮搴�
-		OpenCaptcha        int // 闃茬垎鐮撮獙璇佺爜寮�鍚鏁帮紝0浠h〃姣忔鐧诲綍閮介渶瑕侀獙璇佺爜锛屽叾浠栨暟瀛椾唬琛ㄩ敊璇瘑鐮佹鏁帮紝濡�3浠h〃閿欒涓夋鍚庡嚭鐜伴獙璇佺爜
-		OpenCaptchaTimeOut int // 闃茬垎鐮撮獙璇佺爜瓒呮椂鏃堕棿锛屽崟浣嶏細s(绉�)
-	}
-
-	JWT struct {
-		SigningKey  string // jwt绛惧悕
-		ExpiresTime string // 杩囨湡鏃堕棿
-		BufferTime  string // 缂撳啿鏃堕棿
-		Issuer      string // 绛惧彂鑰�
-	}
-
 	System struct {
 		Env           string // 鐜鍊� develop test public
 		Port          int    // 绔彛
@@ -49,6 +34,7 @@
 		LimitTimeIP   int
 		RouterPrefix  string // 璺敱鍓嶇紑
 		SudoPassword  string // sudo瀵嗙爜
+		DeviceId      string //璁惧id
 	}
 
 	Etcd struct {
@@ -102,12 +88,6 @@
 
 		// redis閰嶇疆
 		Redis redisx.Conf
-
-		// 楠岃瘉鐮�
-		Captcha Captcha
-
-		// JWT閰嶇疆
-		JWT JWT
 
 		// etcd閰嶇疆
 		Etcd Etcd
@@ -169,8 +149,6 @@
 	log.Printf("   System:                %+v", Conf.System)
 	log.Printf("   Log:                   %+v", Conf.Log)
 	log.Printf("   Mysql:                 %+v", Conf.Mysql)
-	log.Printf("   Captcha:               %+v", Conf.Captcha)
-	log.Printf("   JWT:                   %+v", Conf.JWT)
 	log.Printf("   etcd:                  %+v", Conf.Etcd)
 	log.Printf("   rancher:               %+v", Conf.Rancher)
 	log.Printf("   k8s:                   %+v", Conf.K8s)
diff --git a/docs/docs.go b/docs/docs.go
index be67e6e..91eb01b 100644
--- a/docs/docs.go
+++ b/docs/docs.go
@@ -16,24 +16,22 @@
     "host": "{{.Host}}",
     "basePath": "{{.BasePath}}",
     "paths": {
-        "/v1/notice/task/start": {
-            "post": {
+        "/v1/task/finish/{id}": {
+            "put": {
                 "produces": [
                     "application/json"
                 ],
                 "tags": [
                     "Base"
                 ],
-                "summary": "浠诲姟寮�鍚�氱煡",
+                "summary": "浠诲姟缁撴潫",
                 "parameters": [
                     {
-                        "description": "鏌ヨ鍙傛暟",
-                        "name": "object",
-                        "in": "body",
-                        "required": true,
-                        "schema": {
-                            "$ref": "#/definitions/request.TaskInfo"
-                        }
+                        "type": "integer",
+                        "description": "宸ュ簭id",
+                        "name": "id",
+                        "in": "path",
+                        "required": true
                     }
                 ],
                 "responses": {
@@ -46,29 +44,15 @@
                 }
             }
         },
-        "/v1/task/list": {
+        "/v1/task/get": {
             "get": {
                 "produces": [
                     "application/json"
                 ],
                 "tags": [
-                    "Base"
+                    "Task"
                 ],
-                "summary": "浠诲姟寮�鍚�氱煡",
-                "parameters": [
-                    {
-                        "type": "integer",
-                        "description": "椤电爜",
-                        "name": "page",
-                        "in": "query"
-                    },
-                    {
-                        "type": "integer",
-                        "description": "姣忛〉澶у皬",
-                        "name": "pageSize",
-                        "in": "query"
-                    }
-                ],
+                "summary": "鑾峰彇浠诲姟",
                 "responses": {
                     "200": {
                         "description": "鎴愬姛",
@@ -81,14 +65,39 @@
                                     "type": "object",
                                     "properties": {
                                         "data": {
-                                            "type": "array",
-                                            "items": {
-                                                "$ref": "#/definitions/model.ScheduleTask"
-                                            }
+                                            "$ref": "#/definitions/response.TaskData"
                                         }
                                     }
                                 }
                             ]
+                        }
+                    }
+                }
+            }
+        },
+        "/v1/task/start/{id}": {
+            "get": {
+                "produces": [
+                    "application/json"
+                ],
+                "tags": [
+                    "Base"
+                ],
+                "summary": "浠诲姟寮�濮�",
+                "parameters": [
+                    {
+                        "type": "integer",
+                        "description": "宸ュ簭id",
+                        "name": "id",
+                        "in": "path",
+                        "required": true
+                    }
+                ],
+                "responses": {
+                    "200": {
+                        "description": "鎴愬姛",
+                        "schema": {
+                            "$ref": "#/definitions/contextx.Response"
                         }
                     }
                 }
@@ -108,33 +117,35 @@
                 }
             }
         },
-        "model.ScheduleTask": {
+        "model.Order": {
             "type": "object",
             "properties": {
                 "amount": {
-                    "description": "Parameter   string          ` + "`" + `json:\"parameter\"` + "`" + `   //浜у搧鍚嶇О\nCustomer    string          ` + "`" + `json:\"customer\"` + "`" + `\nDeliverDate string          ` + "`" + `json:\"deliverDate\"` + "`" + `\nOrderAttr   string          ` + "`" + `json:\"orderAttr\"` + "`" + `",
                     "type": "number"
                 },
-                "data": {
-                    "description": "鎺掔▼浠诲姟json涓�",
+                "customer": {
+                    "type": "string"
+                },
+                "deliverDate": {
                     "type": "string"
                 },
                 "endTime": {
                     "type": "integer"
                 },
-                "id": {
-                    "type": "integer"
+                "orderAttr": {
+                    "description": "璁㈠崟灞炴�ф嫾鎺ョ殑瀛楃涓诧紝鍗宠揣鐗╂弿杩�",
+                    "type": "string"
                 },
                 "orderId": {
-                    "description": "璁㈠崟id",
+                    "type": "string"
+                },
+                "parameter": {
                     "type": "string"
                 },
                 "productId": {
-                    "description": "璁㈠崟id",
                     "type": "string"
                 },
                 "productName": {
-                    "description": "浜у搧鍚嶇О",
                     "type": "string"
                 },
                 "startTime": {
@@ -145,28 +156,105 @@
                 }
             }
         },
-        "request.TaskInfo": {
+        "model.Procedures": {
             "type": "object",
             "properties": {
-                "device": {
-                    "description": "璁惧",
-                    "type": "string"
-                },
-                "orderId": {
-                    "description": "璁㈠崟鍙�",
-                    "type": "string"
-                },
-                "password": {
-                    "description": "浜у搧",
-                    "type": "string"
+                "id": {
+                    "type": "integer"
                 },
                 "procedure": {
-                    "description": "宸ュ簭",
+                    "description": "request.ProductProcedure  瀵硅薄",
+                    "allOf": [
+                        {
+                            "$ref": "#/definitions/request.ProductProcedure"
+                        }
+                    ]
+                }
+            }
+        },
+        "request.ProcedureMaterial": {
+            "type": "object",
+            "properties": {
+                "amount": {
+                    "type": "number"
+                },
+                "materialId": {
                     "type": "string"
                 },
-                "workOrder": {
-                    "description": "宸ュ崟",
+                "materialName": {
                     "type": "string"
+                },
+                "unit": {
+                    "type": "string"
+                }
+            }
+        },
+        "request.ProcedureWorker": {
+            "type": "object",
+            "properties": {
+                "phoneNum": {
+                    "type": "string"
+                },
+                "workerId": {
+                    "type": "string"
+                },
+                "workerName": {
+                    "type": "string"
+                }
+            }
+        },
+        "request.ProductProcedure": {
+            "type": "object",
+            "properties": {
+                "deviceId": {
+                    "type": "string"
+                },
+                "endTime": {
+                    "type": "integer"
+                },
+                "inputMaterials": {
+                    "description": "杈撳叆鐗╂枡鍒楄〃",
+                    "type": "array",
+                    "items": {
+                        "$ref": "#/definitions/request.ProcedureMaterial"
+                    }
+                },
+                "outputMaterials": {
+                    "description": "杈撳嚭鐗╂枡鍒楄〃",
+                    "type": "array",
+                    "items": {
+                        "$ref": "#/definitions/request.ProcedureMaterial"
+                    }
+                },
+                "procedureId": {
+                    "type": "string"
+                },
+                "procedureName": {
+                    "type": "string"
+                },
+                "startTime": {
+                    "type": "integer"
+                },
+                "workHours": {
+                    "type": "number"
+                },
+                "workers": {
+                    "description": "浜哄憳鍒楄〃",
+                    "type": "array",
+                    "items": {
+                        "$ref": "#/definitions/request.ProcedureWorker"
+                    }
+                }
+            }
+        },
+        "response.TaskData": {
+            "type": "object",
+            "properties": {
+                "order": {
+                    "$ref": "#/definitions/model.Order"
+                },
+                "procedure": {
+                    "$ref": "#/definitions/model.Procedures"
                 }
             }
         }
diff --git a/docs/swagger.json b/docs/swagger.json
index bba27ba..0fa3a0e 100644
--- a/docs/swagger.json
+++ b/docs/swagger.json
@@ -4,24 +4,22 @@
         "contact": {}
     },
     "paths": {
-        "/v1/notice/task/start": {
-            "post": {
+        "/v1/task/finish/{id}": {
+            "put": {
                 "produces": [
                     "application/json"
                 ],
                 "tags": [
                     "Base"
                 ],
-                "summary": "浠诲姟寮�鍚�氱煡",
+                "summary": "浠诲姟缁撴潫",
                 "parameters": [
                     {
-                        "description": "鏌ヨ鍙傛暟",
-                        "name": "object",
-                        "in": "body",
-                        "required": true,
-                        "schema": {
-                            "$ref": "#/definitions/request.TaskInfo"
-                        }
+                        "type": "integer",
+                        "description": "宸ュ簭id",
+                        "name": "id",
+                        "in": "path",
+                        "required": true
                     }
                 ],
                 "responses": {
@@ -34,29 +32,15 @@
                 }
             }
         },
-        "/v1/task/list": {
+        "/v1/task/get": {
             "get": {
                 "produces": [
                     "application/json"
                 ],
                 "tags": [
-                    "Base"
+                    "Task"
                 ],
-                "summary": "浠诲姟寮�鍚�氱煡",
-                "parameters": [
-                    {
-                        "type": "integer",
-                        "description": "椤电爜",
-                        "name": "page",
-                        "in": "query"
-                    },
-                    {
-                        "type": "integer",
-                        "description": "姣忛〉澶у皬",
-                        "name": "pageSize",
-                        "in": "query"
-                    }
-                ],
+                "summary": "鑾峰彇浠诲姟",
                 "responses": {
                     "200": {
                         "description": "鎴愬姛",
@@ -69,14 +53,39 @@
                                     "type": "object",
                                     "properties": {
                                         "data": {
-                                            "type": "array",
-                                            "items": {
-                                                "$ref": "#/definitions/model.ScheduleTask"
-                                            }
+                                            "$ref": "#/definitions/response.TaskData"
                                         }
                                     }
                                 }
                             ]
+                        }
+                    }
+                }
+            }
+        },
+        "/v1/task/start/{id}": {
+            "get": {
+                "produces": [
+                    "application/json"
+                ],
+                "tags": [
+                    "Base"
+                ],
+                "summary": "浠诲姟寮�濮�",
+                "parameters": [
+                    {
+                        "type": "integer",
+                        "description": "宸ュ簭id",
+                        "name": "id",
+                        "in": "path",
+                        "required": true
+                    }
+                ],
+                "responses": {
+                    "200": {
+                        "description": "鎴愬姛",
+                        "schema": {
+                            "$ref": "#/definitions/contextx.Response"
                         }
                     }
                 }
@@ -96,33 +105,35 @@
                 }
             }
         },
-        "model.ScheduleTask": {
+        "model.Order": {
             "type": "object",
             "properties": {
                 "amount": {
-                    "description": "Parameter   string          `json:\"parameter\"`   //浜у搧鍚嶇О\nCustomer    string          `json:\"customer\"`\nDeliverDate string          `json:\"deliverDate\"`\nOrderAttr   string          `json:\"orderAttr\"`",
                     "type": "number"
                 },
-                "data": {
-                    "description": "鎺掔▼浠诲姟json涓�",
+                "customer": {
+                    "type": "string"
+                },
+                "deliverDate": {
                     "type": "string"
                 },
                 "endTime": {
                     "type": "integer"
                 },
-                "id": {
-                    "type": "integer"
+                "orderAttr": {
+                    "description": "璁㈠崟灞炴�ф嫾鎺ョ殑瀛楃涓诧紝鍗宠揣鐗╂弿杩�",
+                    "type": "string"
                 },
                 "orderId": {
-                    "description": "璁㈠崟id",
+                    "type": "string"
+                },
+                "parameter": {
                     "type": "string"
                 },
                 "productId": {
-                    "description": "璁㈠崟id",
                     "type": "string"
                 },
                 "productName": {
-                    "description": "浜у搧鍚嶇О",
                     "type": "string"
                 },
                 "startTime": {
@@ -133,28 +144,105 @@
                 }
             }
         },
-        "request.TaskInfo": {
+        "model.Procedures": {
             "type": "object",
             "properties": {
-                "device": {
-                    "description": "璁惧",
-                    "type": "string"
-                },
-                "orderId": {
-                    "description": "璁㈠崟鍙�",
-                    "type": "string"
-                },
-                "password": {
-                    "description": "浜у搧",
-                    "type": "string"
+                "id": {
+                    "type": "integer"
                 },
                 "procedure": {
-                    "description": "宸ュ簭",
+                    "description": "request.ProductProcedure  瀵硅薄",
+                    "allOf": [
+                        {
+                            "$ref": "#/definitions/request.ProductProcedure"
+                        }
+                    ]
+                }
+            }
+        },
+        "request.ProcedureMaterial": {
+            "type": "object",
+            "properties": {
+                "amount": {
+                    "type": "number"
+                },
+                "materialId": {
                     "type": "string"
                 },
-                "workOrder": {
-                    "description": "宸ュ崟",
+                "materialName": {
                     "type": "string"
+                },
+                "unit": {
+                    "type": "string"
+                }
+            }
+        },
+        "request.ProcedureWorker": {
+            "type": "object",
+            "properties": {
+                "phoneNum": {
+                    "type": "string"
+                },
+                "workerId": {
+                    "type": "string"
+                },
+                "workerName": {
+                    "type": "string"
+                }
+            }
+        },
+        "request.ProductProcedure": {
+            "type": "object",
+            "properties": {
+                "deviceId": {
+                    "type": "string"
+                },
+                "endTime": {
+                    "type": "integer"
+                },
+                "inputMaterials": {
+                    "description": "杈撳叆鐗╂枡鍒楄〃",
+                    "type": "array",
+                    "items": {
+                        "$ref": "#/definitions/request.ProcedureMaterial"
+                    }
+                },
+                "outputMaterials": {
+                    "description": "杈撳嚭鐗╂枡鍒楄〃",
+                    "type": "array",
+                    "items": {
+                        "$ref": "#/definitions/request.ProcedureMaterial"
+                    }
+                },
+                "procedureId": {
+                    "type": "string"
+                },
+                "procedureName": {
+                    "type": "string"
+                },
+                "startTime": {
+                    "type": "integer"
+                },
+                "workHours": {
+                    "type": "number"
+                },
+                "workers": {
+                    "description": "浜哄憳鍒楄〃",
+                    "type": "array",
+                    "items": {
+                        "$ref": "#/definitions/request.ProcedureWorker"
+                    }
+                }
+            }
+        },
+        "response.TaskData": {
+            "type": "object",
+            "properties": {
+                "order": {
+                    "$ref": "#/definitions/model.Order"
+                },
+                "procedure": {
+                    "$ref": "#/definitions/model.Procedures"
                 }
             }
         }
diff --git a/docs/swagger.yaml b/docs/swagger.yaml
index d7c6fa3..fa6eed7 100644
--- a/docs/swagger.yaml
+++ b/docs/swagger.yaml
@@ -7,66 +7,109 @@
       msg:
         type: string
     type: object
-  model.ScheduleTask:
+  model.Order:
     properties:
       amount:
-        description: |-
-          Parameter   string          `json:"parameter"`   //浜у搧鍚嶇О
-          Customer    string          `json:"customer"`
-          DeliverDate string          `json:"deliverDate"`
-          OrderAttr   string          `json:"orderAttr"`
         type: number
-      data:
-        description: 鎺掔▼浠诲姟json涓�
+      customer:
+        type: string
+      deliverDate:
         type: string
       endTime:
         type: integer
-      id:
-        type: integer
+      orderAttr:
+        description: 璁㈠崟灞炴�ф嫾鎺ョ殑瀛楃涓诧紝鍗宠揣鐗╂弿杩�
+        type: string
       orderId:
-        description: 璁㈠崟id
+        type: string
+      parameter:
         type: string
       productId:
-        description: 璁㈠崟id
         type: string
       productName:
-        description: 浜у搧鍚嶇О
         type: string
       startTime:
         type: integer
       unit:
         type: string
     type: object
-  request.TaskInfo:
+  model.Procedures:
     properties:
-      device:
-        description: 璁惧
-        type: string
-      orderId:
-        description: 璁㈠崟鍙�
-        type: string
-      password:
-        description: 浜у搧
-        type: string
+      id:
+        type: integer
       procedure:
-        description: 宸ュ簭
+        allOf:
+        - $ref: '#/definitions/request.ProductProcedure'
+        description: request.ProductProcedure  瀵硅薄
+    type: object
+  request.ProcedureMaterial:
+    properties:
+      amount:
+        type: number
+      materialId:
         type: string
-      workOrder:
-        description: 宸ュ崟
+      materialName:
         type: string
+      unit:
+        type: string
+    type: object
+  request.ProcedureWorker:
+    properties:
+      phoneNum:
+        type: string
+      workerId:
+        type: string
+      workerName:
+        type: string
+    type: object
+  request.ProductProcedure:
+    properties:
+      deviceId:
+        type: string
+      endTime:
+        type: integer
+      inputMaterials:
+        description: 杈撳叆鐗╂枡鍒楄〃
+        items:
+          $ref: '#/definitions/request.ProcedureMaterial'
+        type: array
+      outputMaterials:
+        description: 杈撳嚭鐗╂枡鍒楄〃
+        items:
+          $ref: '#/definitions/request.ProcedureMaterial'
+        type: array
+      procedureId:
+        type: string
+      procedureName:
+        type: string
+      startTime:
+        type: integer
+      workHours:
+        type: number
+      workers:
+        description: 浜哄憳鍒楄〃
+        items:
+          $ref: '#/definitions/request.ProcedureWorker'
+        type: array
+    type: object
+  response.TaskData:
+    properties:
+      order:
+        $ref: '#/definitions/model.Order'
+      procedure:
+        $ref: '#/definitions/model.Procedures'
     type: object
 info:
   contact: {}
 paths:
-  /v1/notice/task/start:
-    post:
+  /v1/task/finish/{id}:
+    put:
       parameters:
-      - description: 鏌ヨ鍙傛暟
-        in: body
-        name: object
+      - description: 宸ュ簭id
+        in: path
+        name: id
         required: true
-        schema:
-          $ref: '#/definitions/request.TaskInfo'
+        type: integer
       produces:
       - application/json
       responses:
@@ -74,20 +117,11 @@
           description: 鎴愬姛
           schema:
             $ref: '#/definitions/contextx.Response'
-      summary: 浠诲姟寮�鍚�氱煡
+      summary: 浠诲姟缁撴潫
       tags:
       - Base
-  /v1/task/list:
+  /v1/task/get:
     get:
-      parameters:
-      - description: 椤电爜
-        in: query
-        name: page
-        type: integer
-      - description: 姣忛〉澶у皬
-        in: query
-        name: pageSize
-        type: integer
       produces:
       - application/json
       responses:
@@ -98,11 +132,27 @@
             - $ref: '#/definitions/contextx.Response'
             - properties:
                 data:
-                  items:
-                    $ref: '#/definitions/model.ScheduleTask'
-                  type: array
+                  $ref: '#/definitions/response.TaskData'
               type: object
-      summary: 浠诲姟寮�鍚�氱煡
+      summary: 鑾峰彇浠诲姟
+      tags:
+      - Task
+  /v1/task/start/{id}:
+    get:
+      parameters:
+      - description: 宸ュ簭id
+        in: path
+        name: id
+        required: true
+        type: integer
+      produces:
+      - application/json
+      responses:
+        "200":
+          description: 鎴愬姛
+          schema:
+            $ref: '#/definitions/contextx.Response'
+      summary: 浠诲姟寮�濮�
       tags:
       - Base
 swagger: "2.0"
diff --git a/go.mod b/go.mod
index dd75050..4e81ef2 100644
--- a/go.mod
+++ b/go.mod
@@ -26,6 +26,7 @@
 	gorm.io/driver/mysql v1.5.0
 	gorm.io/gorm v1.25.3
 	moul.io/zapgorm2 v1.3.0
+	github.com/apache/plc4x/plc4go v0.0.0-20230714120555-05ec3da87ebe
 )
 
 require (
diff --git a/logs/apsClient.err.log b/logs/apsClient.err.log
index e636088..9f6ddbd 100644
--- a/logs/apsClient.err.log
+++ b/logs/apsClient.err.log
@@ -51,3 +51,14 @@
 [2023-08-15 19:53:30]	[error]	[gorm.io/gorm/migrator.Migrator.AutoMigrate:113]	failed to parse value model.ScheduleTask{Model:gorm.Model{ID:0x0, CreatedAt:time.Date(1, time.January, 1, 0, 0, 0, 0, time.UTC), UpdatedAt:time.Date(1, time.January, 1, 0, 0, 0, 0, time.UTC), DeletedAt:gorm.DeletedAt{Time:time.Date(1, time.January, 1, 0, 0, 0, 0, time.UTC), Valid:false}}, Id:0, OrderId:"", ProductId:"", ProductName:"", Amount:decimal.Decimal{value:(*big.Int)(nil), exp:0}, Unit:"", StartTime:0, EndTime:0, Data:"", TaskInfo:request.DeliverScheduleTask{Order:request.Order{OrderID:"", ProductID:"", ProductName:"", Parameter:"", Customer:"", DeliverDate:"", OrderAttr:"", Amount:decimal.Decimal{value:(*big.Int)(nil), exp:0}, Unit:"", StartTime:0, EndTime:0}, Procedures:[]*request.ProductProcedure(nil)}}, got error invalid field found for struct apsClient/model/request.DeliverScheduleTask's field Order: define a valid foreign key for relations or implement the Valuer/Scanner interface
 [2023-08-15 19:53:30]	[error]	[gorm.io/gorm/migrator.Migrator.CreateTable:207]	failed to parse value model.ScheduleTask{Model:gorm.Model{ID:0x0, CreatedAt:time.Date(1, time.January, 1, 0, 0, 0, 0, time.UTC), UpdatedAt:time.Date(1, time.January, 1, 0, 0, 0, 0, time.UTC), DeletedAt:gorm.DeletedAt{Time:time.Date(1, time.January, 1, 0, 0, 0, 0, time.UTC), Valid:false}}, Id:0, OrderId:"", ProductId:"", ProductName:"", Amount:decimal.Decimal{value:(*big.Int)(nil), exp:0}, Unit:"", StartTime:0, EndTime:0, Data:"", TaskInfo:request.DeliverScheduleTask{Order:request.Order{OrderID:"", ProductID:"", ProductName:"", Parameter:"", Customer:"", DeliverDate:"", OrderAttr:"", Amount:decimal.Decimal{value:(*big.Int)(nil), exp:0}, Unit:"", StartTime:0, EndTime:0}, Procedures:[]*request.ProductProcedure(nil)}}, got error invalid field found for struct apsClient/model/request.DeliverScheduleTask's field Order: define a valid foreign key for relations or implement the Valuer/Scanner interface
 [2023-08-15 19:53:30]	[error]	[main.main:23]	model Init err:invalid field found for struct apsClient/model/request.DeliverScheduleTask's field Order: define a valid foreign key for relations or implement the Valuer/Scanner interface
+[2023-08-16 13:37:32]	[error]	[apsClient/model.Init:10]	failed to initialize database, got error Binary was compiled with 'CGO_ENABLED=0', go-sqlite3 requires cgo to work. This is a stub
+[2023-08-16 13:37:32]	[error]	[main.main:23]	model Init err:Binary was compiled with 'CGO_ENABLED=0', go-sqlite3 requires cgo to work. This is a stub
+[2023-08-16 14:23:42]	[error]	[apsClient/model.Init:10]	failed to initialize database, got error Binary was compiled with 'CGO_ENABLED=0', go-sqlite3 requires cgo to work. This is a stub
+[2023-08-16 14:23:42]	[error]	[main.main:23]	model Init err:Binary was compiled with 'CGO_ENABLED=0', go-sqlite3 requires cgo to work. This is a stub
+[2023-08-16 19:47:30]	[error]	[apsClient/model.Init:10]	failed to initialize database, got error Binary was compiled with 'CGO_ENABLED=0', go-sqlite3 requires cgo to work. This is a stub
+[2023-08-16 19:47:30]	[error]	[main.main:23]	model Init err:Binary was compiled with 'CGO_ENABLED=0', go-sqlite3 requires cgo to work. This is a stub
+[2023-08-16 19:58:28]	[error]	[apsClient/model.Init:10]	failed to initialize database, got error Binary was compiled with 'CGO_ENABLED=0', go-sqlite3 requires cgo to work. This is a stub
+[2023-08-16 19:58:28]	[error]	[main.main:23]	model Init err:Binary was compiled with 'CGO_ENABLED=0', go-sqlite3 requires cgo to work. This is a stub
+[2023-08-17 17:01:05]	[error]	[apsClient/model.Init:10]	failed to initialize database, got error Binary was compiled with 'CGO_ENABLED=0', go-sqlite3 requires cgo to work. This is a stub
+[2023-08-17 17:01:05]	[error]	[main.main:23]	model Init err:Binary was compiled with 'CGO_ENABLED=0', go-sqlite3 requires cgo to work. This is a stub
+[2023-08-17 17:27:57]	[error]	[apsClient/model.(*OrderSearch).First:189]	trace	{"error": "record not found", "elapsed": 0, "rows": 0, "sql": "SELECT * FROM `Order` WHERE status = \"1\" AND start_time >= 1692264477 AND `Order`.`deleted_at` IS NULL ORDER BY created_at asc,`Order`.`id` LIMIT 1"}
diff --git a/logs/apsClient.info.log b/logs/apsClient.info.log
index d69ffb7..85d9e6a 100644
--- a/logs/apsClient.info.log
+++ b/logs/apsClient.info.log
@@ -188,3 +188,136 @@
 [2023-08-15 19:54:52]	[debug]	[apsClient/model.(*ScheduleTaskSearch).Find:195]	trace	{"elapsed": 0.0010002, "rows": 1, "sql": "SELECT count(*) FROM `schedule_task` WHERE `schedule_task`.`deleted_at` IS NULL"}
 [2023-08-15 19:54:52]	[debug]	[apsClient/model.(*ScheduleTaskSearch).Find:201]	trace	{"elapsed": 0.0009973, "rows": 4, "sql": "SELECT * FROM `schedule_task` WHERE `schedule_task`.`deleted_at` IS NULL LIMIT 20"}
 [2023-08-15 19:55:57]	[info]	[main.shutdown:48]	apsClient exited...
+[2023-08-15 19:56:02]	[debug]	[gorm.io/driver/sqlite.Migrator.HasTable.func1:33]	trace	{"elapsed": 0, "rows": -1, "sql": "SELECT count(*) FROM sqlite_master WHERE type='table' AND name=\"schedule_task\""}
+[2023-08-15 19:56:02]	[debug]	[gorm.io/gorm/migrator.Migrator.RunWithValue:71]	trace	{"elapsed": 0, "rows": 3, "sql": "SELECT sql FROM sqlite_master WHERE type IN (\"table\",\"index\") AND tbl_name = \"schedule_task\" AND sql IS NOT NULL order by type = \"table\" desc"}
+[2023-08-15 19:56:02]	[debug]	[gorm.io/driver/sqlite.Migrator.ColumnTypes.func1:119]	trace	{"elapsed": 0, "rows": -1, "sql": "SELECT * FROM `schedule_task` LIMIT 1"}
+[2023-08-15 19:56:02]	[debug]	[gorm.io/driver/sqlite.Migrator.HasIndex.func1:313]	trace	{"elapsed": 0, "rows": -1, "sql": "SELECT count(*) FROM sqlite_master WHERE type = \"index\" AND tbl_name = \"schedule_task\" AND name = \"idx_schedule_task_deleted_at\""}
+[2023-08-15 19:56:02]	[info]	[main.main:33]	apsClient start serve...
+[2023-08-15 19:56:02]	[info]	[apsClient/nsq.Consume:17]	Consume NewNsqConsumer topic:aps.wangpengfei.scheduleTask
+[2023-08-15 19:56:07]	[info]	[apsClient/pkg/contextx.NewContext.func1:44]	192.168.20.120 | GET /v1/task/list?page=1&pageSize=20 | uid:  | &{PageInfo:{Page:1 PageSize:20}}
+[2023-08-15 19:56:07]	[debug]	[apsClient/model.(*ScheduleTaskSearch).Find:195]	trace	{"elapsed": 0, "rows": 1, "sql": "SELECT count(*) FROM `schedule_task` WHERE `schedule_task`.`deleted_at` IS NULL"}
+[2023-08-15 19:56:07]	[debug]	[apsClient/model.(*ScheduleTaskSearch).Find:201]	trace	{"elapsed": 0, "rows": 4, "sql": "SELECT * FROM `schedule_task` WHERE `schedule_task`.`deleted_at` IS NULL LIMIT 20"}
+[2023-08-16 13:37:29]	[info]	[main.shutdown:48]	apsClient exited...
+[2023-08-16 14:24:28]	[debug]	[gorm.io/driver/sqlite.Migrator.HasTable.func1:33]	trace	{"elapsed": 0.0010137, "rows": -1, "sql": "SELECT count(*) FROM sqlite_master WHERE type='table' AND name=\"schedule_task\""}
+[2023-08-16 14:24:28]	[debug]	[gorm.io/gorm/migrator.Migrator.RunWithValue:71]	trace	{"elapsed": 0.0009919, "rows": 3, "sql": "SELECT sql FROM sqlite_master WHERE type IN (\"table\",\"index\") AND tbl_name = \"schedule_task\" AND sql IS NOT NULL order by type = \"table\" desc"}
+[2023-08-16 14:24:28]	[debug]	[gorm.io/driver/sqlite.Migrator.ColumnTypes.func1:119]	trace	{"elapsed": 0, "rows": -1, "sql": "SELECT * FROM `schedule_task` LIMIT 1"}
+[2023-08-16 14:24:28]	[debug]	[gorm.io/driver/sqlite.Migrator.HasIndex.func1:313]	trace	{"elapsed": 0, "rows": -1, "sql": "SELECT count(*) FROM sqlite_master WHERE type = \"index\" AND tbl_name = \"schedule_task\" AND name = \"idx_schedule_task_deleted_at\""}
+[2023-08-16 14:24:28]	[info]	[main.main:33]	apsClient start serve...
+[2023-08-16 14:24:28]	[info]	[apsClient/nsq.Consume:17]	Consume NewNsqConsumer topic:aps.wangpengfei.scheduleTask
+[2023-08-16 14:24:52]	[info]	[main.shutdown:48]	apsClient exited...
+[2023-08-16 14:24:53]	[debug]	[gorm.io/driver/sqlite.Migrator.HasTable.func1:33]	trace	{"elapsed": 0, "rows": -1, "sql": "SELECT count(*) FROM sqlite_master WHERE type='table' AND name=\"schedule_task\""}
+[2023-08-16 14:24:53]	[debug]	[gorm.io/gorm/migrator.Migrator.RunWithValue:71]	trace	{"elapsed": 0, "rows": 3, "sql": "SELECT sql FROM sqlite_master WHERE type IN (\"table\",\"index\") AND tbl_name = \"schedule_task\" AND sql IS NOT NULL order by type = \"table\" desc"}
+[2023-08-16 14:24:53]	[debug]	[gorm.io/driver/sqlite.Migrator.ColumnTypes.func1:119]	trace	{"elapsed": 0, "rows": -1, "sql": "SELECT * FROM `schedule_task` LIMIT 1"}
+[2023-08-16 14:24:53]	[debug]	[gorm.io/driver/sqlite.Migrator.HasIndex.func1:313]	trace	{"elapsed": 0, "rows": -1, "sql": "SELECT count(*) FROM sqlite_master WHERE type = \"index\" AND tbl_name = \"schedule_task\" AND name = \"idx_schedule_task_deleted_at\""}
+[2023-08-16 14:24:53]	[info]	[main.main:33]	apsClient start serve...
+[2023-08-16 14:24:53]	[info]	[apsClient/nsq.Consume:17]	Consume NewNsqConsumer topic:aps.wangpengfei.scheduleTask
+[2023-08-16 14:25:21]	[info]	[main.shutdown:48]	apsClient exited...
+[2023-08-16 14:25:26]	[debug]	[gorm.io/driver/sqlite.Migrator.HasTable.func1:33]	trace	{"elapsed": 0, "rows": -1, "sql": "SELECT count(*) FROM sqlite_master WHERE type='table' AND name=\"schedule_task\""}
+[2023-08-16 14:25:26]	[debug]	[gorm.io/gorm/migrator.Migrator.RunWithValue:71]	trace	{"elapsed": 0, "rows": 3, "sql": "SELECT sql FROM sqlite_master WHERE type IN (\"table\",\"index\") AND tbl_name = \"schedule_task\" AND sql IS NOT NULL order by type = \"table\" desc"}
+[2023-08-16 14:25:26]	[debug]	[gorm.io/driver/sqlite.Migrator.ColumnTypes.func1:119]	trace	{"elapsed": 0, "rows": -1, "sql": "SELECT * FROM `schedule_task` LIMIT 1"}
+[2023-08-16 14:25:26]	[debug]	[gorm.io/driver/sqlite.Migrator.HasIndex.func1:313]	trace	{"elapsed": 0, "rows": -1, "sql": "SELECT count(*) FROM sqlite_master WHERE type = \"index\" AND tbl_name = \"schedule_task\" AND name = \"idx_schedule_task_deleted_at\""}
+[2023-08-16 14:25:26]	[info]	[main.main:33]	apsClient start serve...
+[2023-08-16 14:25:26]	[info]	[apsClient/nsq.Consume:17]	Consume NewNsqConsumer topic:aps.wangpengfei.scheduleTask
+[2023-08-16 19:47:26]	[info]	[main.shutdown:48]	apsClient exited...
+[2023-08-16 19:58:49]	[debug]	[gorm.io/driver/sqlite.Migrator.HasTable.func1:33]	trace	{"elapsed": 0, "rows": -1, "sql": "SELECT count(*) FROM sqlite_master WHERE type='table' AND name=\"schedule_task\""}
+[2023-08-16 19:58:49]	[debug]	[gorm.io/gorm/migrator.Migrator.RunWithValue:71]	trace	{"elapsed": 0.0010028, "rows": 3, "sql": "SELECT sql FROM sqlite_master WHERE type IN (\"table\",\"index\") AND tbl_name = \"schedule_task\" AND sql IS NOT NULL order by type = \"table\" desc"}
+[2023-08-16 19:58:49]	[debug]	[gorm.io/driver/sqlite.Migrator.ColumnTypes.func1:119]	trace	{"elapsed": 0, "rows": -1, "sql": "SELECT * FROM `schedule_task` LIMIT 1"}
+[2023-08-16 19:58:49]	[debug]	[gorm.io/driver/sqlite.Migrator.HasIndex.func1:313]	trace	{"elapsed": 0, "rows": -1, "sql": "SELECT count(*) FROM sqlite_master WHERE type = \"index\" AND tbl_name = \"schedule_task\" AND name = \"idx_schedule_task_deleted_at\""}
+[2023-08-16 19:58:49]	[info]	[main.main:33]	apsClient start serve...
+[2023-08-16 19:58:49]	[info]	[apsClient/nsq.Consume:17]	Consume NewNsqConsumer topic:aps.wangpengfei.scheduleTask
+[2023-08-17 17:00:28]	[info]	[main.shutdown:48]	apsClient exited...
+[2023-08-17 17:01:32]	[debug]	[gorm.io/driver/sqlite.Migrator.HasTable.func1:33]	trace	{"elapsed": 0, "rows": -1, "sql": "SELECT count(*) FROM sqlite_master WHERE type='table' AND name=\"Order\""}
+[2023-08-17 17:01:32]	[debug]	[gorm.io/gorm/migrator.Migrator.CreateTable.func1:290]	trace	{"elapsed": 0.0070474, "rows": 0, "sql": "CREATE TABLE `Order` (`id` integer,`created_at` datetime,`updated_at` datetime,`deleted_at` datetime,`order_id` varchar(191) NOT NULL,`product_id` varchar(191),`product_name` varchar(191),`parameter` varchar(1024),`customer` varchar(191),`deliver_date` varchar(100),`order_attr` text,`amount` decimal(35,18),`unit` varchar(100),`start_time` integer,`end_time` integer,`status` integer,PRIMARY KEY (`id`))"}
+[2023-08-17 17:01:32]	[debug]	[gorm.io/driver/sqlite.Migrator.CreateIndex.func1:294]	trace	{"elapsed": 0.0040126, "rows": 0, "sql": "CREATE INDEX `idx_Order_order_id` ON `Order`(`order_id`)"}
+[2023-08-17 17:01:32]	[debug]	[gorm.io/driver/sqlite.Migrator.CreateIndex.func1:294]	trace	{"elapsed": 0.0050064, "rows": 0, "sql": "CREATE INDEX `idx_Order_deleted_at` ON `Order`(`deleted_at`)"}
+[2023-08-17 17:01:32]	[debug]	[gorm.io/driver/sqlite.Migrator.HasTable.func1:33]	trace	{"elapsed": 0, "rows": -1, "sql": "SELECT count(*) FROM sqlite_master WHERE type='table' AND name=\"procedures\""}
+[2023-08-17 17:01:32]	[debug]	[gorm.io/gorm/migrator.Migrator.RunWithValue:71]	trace	{"elapsed": 0, "rows": 2, "sql": "SELECT sql FROM sqlite_master WHERE type IN (\"table\",\"index\") AND tbl_name = \"procedures\" AND sql IS NOT NULL order by type = \"table\" desc"}
+[2023-08-17 17:01:32]	[debug]	[gorm.io/driver/sqlite.Migrator.ColumnTypes.func1:119]	trace	{"elapsed": 0, "rows": -1, "sql": "SELECT * FROM `procedures` LIMIT 1"}
+[2023-08-17 17:01:32]	[debug]	[gorm.io/gorm/migrator.Migrator.AddColumn.func1:363]	trace	{"elapsed": 0.0060192, "rows": 0, "sql": "ALTER TABLE `procedures` ADD `order_id` varchar(191) NOT NULL"}
+[2023-08-17 17:01:32]	[debug]	[gorm.io/gorm/migrator.Migrator.AddColumn.func1:363]	trace	{"elapsed": 0.0050113, "rows": 0, "sql": "ALTER TABLE `procedures` ADD `status` integer"}
+[2023-08-17 17:01:32]	[debug]	[gorm.io/gorm/migrator.Migrator.AddColumn.func1:363]	trace	{"elapsed": 0.004009, "rows": 0, "sql": "ALTER TABLE `procedures` ADD `procedure_data` text"}
+[2023-08-17 17:01:32]	[debug]	[gorm.io/driver/sqlite.Migrator.HasIndex.func1:313]	trace	{"elapsed": 0, "rows": -1, "sql": "SELECT count(*) FROM sqlite_master WHERE type = \"index\" AND tbl_name = \"procedures\" AND name = \"idx_procedures_deleted_at\""}
+[2023-08-17 17:01:32]	[debug]	[gorm.io/driver/sqlite.Migrator.HasIndex.func1:313]	trace	{"elapsed": 0, "rows": -1, "sql": "SELECT count(*) FROM sqlite_master WHERE type = \"index\" AND tbl_name = \"procedures\" AND name = \"idx_procedures_order_id\""}
+[2023-08-17 17:01:32]	[debug]	[gorm.io/driver/sqlite.Migrator.CreateIndex.func1:294]	trace	{"elapsed": 0.0050123, "rows": 0, "sql": "CREATE INDEX `idx_procedures_order_id` ON `procedures`(`order_id`)"}
+[2023-08-17 17:01:32]	[info]	[main.main:33]	apsClient start serve...
+[2023-08-17 17:01:32]	[info]	[apsClient/nsq.Consume:17]	Consume NewNsqConsumer topic:aps.wangpengfei.scheduleTask
+[2023-08-17 17:18:25]	[info]	[main.shutdown:48]	apsClient exited...
+[2023-08-17 17:18:30]	[debug]	[gorm.io/driver/sqlite.Migrator.HasTable.func1:33]	trace	{"elapsed": 0, "rows": -1, "sql": "SELECT count(*) FROM sqlite_master WHERE type='table' AND name=\"Order\""}
+[2023-08-17 17:18:30]	[debug]	[gorm.io/gorm/migrator.Migrator.RunWithValue:71]	trace	{"elapsed": 0, "rows": 3, "sql": "SELECT sql FROM sqlite_master WHERE type IN (\"table\",\"index\") AND tbl_name = \"Order\" AND sql IS NOT NULL order by type = \"table\" desc"}
+[2023-08-17 17:18:30]	[debug]	[gorm.io/driver/sqlite.Migrator.ColumnTypes.func1:119]	trace	{"elapsed": 0, "rows": -1, "sql": "SELECT * FROM `Order` LIMIT 1"}
+[2023-08-17 17:18:30]	[debug]	[gorm.io/driver/sqlite.Migrator.HasIndex.func1:313]	trace	{"elapsed": 0, "rows": -1, "sql": "SELECT count(*) FROM sqlite_master WHERE type = \"index\" AND tbl_name = \"Order\" AND name = \"idx_Order_deleted_at\""}
+[2023-08-17 17:18:30]	[debug]	[gorm.io/driver/sqlite.Migrator.HasIndex.func1:313]	trace	{"elapsed": 0, "rows": -1, "sql": "SELECT count(*) FROM sqlite_master WHERE type = \"index\" AND tbl_name = \"Order\" AND name = \"idx_Order_order_id\""}
+[2023-08-17 17:18:30]	[debug]	[gorm.io/driver/sqlite.Migrator.HasTable.func1:33]	trace	{"elapsed": 0, "rows": -1, "sql": "SELECT count(*) FROM sqlite_master WHERE type='table' AND name=\"procedures\""}
+[2023-08-17 17:18:30]	[debug]	[gorm.io/gorm/migrator.Migrator.RunWithValue:71]	trace	{"elapsed": 0, "rows": 3, "sql": "SELECT sql FROM sqlite_master WHERE type IN (\"table\",\"index\") AND tbl_name = \"procedures\" AND sql IS NOT NULL order by type = \"table\" desc"}
+[2023-08-17 17:18:30]	[debug]	[gorm.io/driver/sqlite.Migrator.ColumnTypes.func1:119]	trace	{"elapsed": 0, "rows": -1, "sql": "SELECT * FROM `procedures` LIMIT 1"}
+[2023-08-17 17:18:30]	[debug]	[gorm.io/driver/sqlite.Migrator.HasIndex.func1:313]	trace	{"elapsed": 0, "rows": -1, "sql": "SELECT count(*) FROM sqlite_master WHERE type = \"index\" AND tbl_name = \"procedures\" AND name = \"idx_procedures_deleted_at\""}
+[2023-08-17 17:18:30]	[debug]	[gorm.io/driver/sqlite.Migrator.HasIndex.func1:313]	trace	{"elapsed": 0, "rows": -1, "sql": "SELECT count(*) FROM sqlite_master WHERE type = \"index\" AND tbl_name = \"procedures\" AND name = \"idx_procedures_order_id\""}
+[2023-08-17 17:18:30]	[info]	[main.main:33]	apsClient start serve...
+[2023-08-17 17:18:30]	[info]	[apsClient/nsq.Consume:17]	Consume NewNsqConsumer topic:aps.wangpengfei.scheduleTask
+[2023-08-17 17:23:05]	[info]	[main.shutdown:48]	apsClient exited...
+[2023-08-17 17:23:10]	[debug]	[gorm.io/driver/sqlite.Migrator.HasTable.func1:33]	trace	{"elapsed": 0, "rows": -1, "sql": "SELECT count(*) FROM sqlite_master WHERE type='table' AND name=\"Order\""}
+[2023-08-17 17:23:10]	[debug]	[gorm.io/gorm/migrator.Migrator.RunWithValue:71]	trace	{"elapsed": 0, "rows": 3, "sql": "SELECT sql FROM sqlite_master WHERE type IN (\"table\",\"index\") AND tbl_name = \"Order\" AND sql IS NOT NULL order by type = \"table\" desc"}
+[2023-08-17 17:23:10]	[debug]	[gorm.io/driver/sqlite.Migrator.ColumnTypes.func1:119]	trace	{"elapsed": 0, "rows": -1, "sql": "SELECT * FROM `Order` LIMIT 1"}
+[2023-08-17 17:23:10]	[debug]	[gorm.io/driver/sqlite.Migrator.HasIndex.func1:313]	trace	{"elapsed": 0, "rows": -1, "sql": "SELECT count(*) FROM sqlite_master WHERE type = \"index\" AND tbl_name = \"Order\" AND name = \"idx_Order_deleted_at\""}
+[2023-08-17 17:23:10]	[debug]	[gorm.io/driver/sqlite.Migrator.HasIndex.func1:313]	trace	{"elapsed": 0, "rows": -1, "sql": "SELECT count(*) FROM sqlite_master WHERE type = \"index\" AND tbl_name = \"Order\" AND name = \"idx_Order_order_id\""}
+[2023-08-17 17:23:10]	[debug]	[gorm.io/driver/sqlite.Migrator.HasTable.func1:33]	trace	{"elapsed": 0, "rows": -1, "sql": "SELECT count(*) FROM sqlite_master WHERE type='table' AND name=\"procedures\""}
+[2023-08-17 17:23:10]	[debug]	[gorm.io/gorm/migrator.Migrator.RunWithValue:71]	trace	{"elapsed": 0.0009688, "rows": 3, "sql": "SELECT sql FROM sqlite_master WHERE type IN (\"table\",\"index\") AND tbl_name = \"procedures\" AND sql IS NOT NULL order by type = \"table\" desc"}
+[2023-08-17 17:23:10]	[debug]	[gorm.io/driver/sqlite.Migrator.ColumnTypes.func1:119]	trace	{"elapsed": 0, "rows": -1, "sql": "SELECT * FROM `procedures` LIMIT 1"}
+[2023-08-17 17:23:10]	[debug]	[gorm.io/driver/sqlite.Migrator.HasIndex.func1:313]	trace	{"elapsed": 0, "rows": -1, "sql": "SELECT count(*) FROM sqlite_master WHERE type = \"index\" AND tbl_name = \"procedures\" AND name = \"idx_procedures_deleted_at\""}
+[2023-08-17 17:23:10]	[debug]	[gorm.io/driver/sqlite.Migrator.HasIndex.func1:313]	trace	{"elapsed": 0, "rows": -1, "sql": "SELECT count(*) FROM sqlite_master WHERE type = \"index\" AND tbl_name = \"procedures\" AND name = \"idx_procedures_order_id\""}
+[2023-08-17 17:23:10]	[info]	[main.main:33]	apsClient start serve...
+[2023-08-17 17:23:10]	[info]	[apsClient/nsq.Consume:17]	Consume NewNsqConsumer topic:aps.wangpengfei.scheduleTask
+[2023-08-17 17:24:23]	[info]	[main.shutdown:48]	apsClient exited...
+[2023-08-17 17:24:28]	[debug]	[gorm.io/driver/sqlite.Migrator.HasTable.func1:33]	trace	{"elapsed": 0, "rows": -1, "sql": "SELECT count(*) FROM sqlite_master WHERE type='table' AND name=\"Order\""}
+[2023-08-17 17:24:28]	[debug]	[gorm.io/gorm/migrator.Migrator.RunWithValue:71]	trace	{"elapsed": 0, "rows": 3, "sql": "SELECT sql FROM sqlite_master WHERE type IN (\"table\",\"index\") AND tbl_name = \"Order\" AND sql IS NOT NULL order by type = \"table\" desc"}
+[2023-08-17 17:24:28]	[debug]	[gorm.io/driver/sqlite.Migrator.ColumnTypes.func1:119]	trace	{"elapsed": 0, "rows": -1, "sql": "SELECT * FROM `Order` LIMIT 1"}
+[2023-08-17 17:24:28]	[debug]	[gorm.io/driver/sqlite.Migrator.HasIndex.func1:313]	trace	{"elapsed": 0, "rows": -1, "sql": "SELECT count(*) FROM sqlite_master WHERE type = \"index\" AND tbl_name = \"Order\" AND name = \"idx_Order_deleted_at\""}
+[2023-08-17 17:24:28]	[debug]	[gorm.io/driver/sqlite.Migrator.HasIndex.func1:313]	trace	{"elapsed": 0, "rows": -1, "sql": "SELECT count(*) FROM sqlite_master WHERE type = \"index\" AND tbl_name = \"Order\" AND name = \"idx_Order_order_id\""}
+[2023-08-17 17:24:28]	[debug]	[gorm.io/driver/sqlite.Migrator.HasTable.func1:33]	trace	{"elapsed": 0, "rows": -1, "sql": "SELECT count(*) FROM sqlite_master WHERE type='table' AND name=\"procedures\""}
+[2023-08-17 17:24:28]	[debug]	[gorm.io/gorm/migrator.Migrator.RunWithValue:71]	trace	{"elapsed": 0, "rows": 3, "sql": "SELECT sql FROM sqlite_master WHERE type IN (\"table\",\"index\") AND tbl_name = \"procedures\" AND sql IS NOT NULL order by type = \"table\" desc"}
+[2023-08-17 17:24:28]	[debug]	[gorm.io/driver/sqlite.Migrator.ColumnTypes.func1:119]	trace	{"elapsed": 0, "rows": -1, "sql": "SELECT * FROM `procedures` LIMIT 1"}
+[2023-08-17 17:24:28]	[debug]	[gorm.io/driver/sqlite.Migrator.HasIndex.func1:313]	trace	{"elapsed": 0, "rows": -1, "sql": "SELECT count(*) FROM sqlite_master WHERE type = \"index\" AND tbl_name = \"procedures\" AND name = \"idx_procedures_deleted_at\""}
+[2023-08-17 17:24:28]	[debug]	[gorm.io/driver/sqlite.Migrator.HasIndex.func1:313]	trace	{"elapsed": 0, "rows": -1, "sql": "SELECT count(*) FROM sqlite_master WHERE type = \"index\" AND tbl_name = \"procedures\" AND name = \"idx_procedures_order_id\""}
+[2023-08-17 17:24:28]	[info]	[main.main:33]	apsClient start serve...
+[2023-08-17 17:24:28]	[info]	[apsClient/nsq.Consume:17]	Consume NewNsqConsumer topic:aps.wangpengfei.scheduleTask
+[2023-08-17 17:25:44]	[info]	[main.shutdown:48]	apsClient exited...
+[2023-08-17 17:25:51]	[debug]	[gorm.io/driver/sqlite.Migrator.HasTable.func1:33]	trace	{"elapsed": 0, "rows": -1, "sql": "SELECT count(*) FROM sqlite_master WHERE type='table' AND name=\"Order\""}
+[2023-08-17 17:25:51]	[debug]	[gorm.io/gorm/migrator.Migrator.RunWithValue:71]	trace	{"elapsed": 0, "rows": 3, "sql": "SELECT sql FROM sqlite_master WHERE type IN (\"table\",\"index\") AND tbl_name = \"Order\" AND sql IS NOT NULL order by type = \"table\" desc"}
+[2023-08-17 17:25:51]	[debug]	[gorm.io/driver/sqlite.Migrator.ColumnTypes.func1:119]	trace	{"elapsed": 0, "rows": -1, "sql": "SELECT * FROM `Order` LIMIT 1"}
+[2023-08-17 17:25:51]	[debug]	[gorm.io/driver/sqlite.Migrator.HasIndex.func1:313]	trace	{"elapsed": 0, "rows": -1, "sql": "SELECT count(*) FROM sqlite_master WHERE type = \"index\" AND tbl_name = \"Order\" AND name = \"idx_Order_deleted_at\""}
+[2023-08-17 17:25:51]	[debug]	[gorm.io/driver/sqlite.Migrator.HasIndex.func1:313]	trace	{"elapsed": 0, "rows": -1, "sql": "SELECT count(*) FROM sqlite_master WHERE type = \"index\" AND tbl_name = \"Order\" AND name = \"idx_Order_order_id\""}
+[2023-08-17 17:25:51]	[debug]	[gorm.io/driver/sqlite.Migrator.HasTable.func1:33]	trace	{"elapsed": 0, "rows": -1, "sql": "SELECT count(*) FROM sqlite_master WHERE type='table' AND name=\"procedures\""}
+[2023-08-17 17:25:51]	[debug]	[gorm.io/gorm/migrator.Migrator.RunWithValue:71]	trace	{"elapsed": 0, "rows": 3, "sql": "SELECT sql FROM sqlite_master WHERE type IN (\"table\",\"index\") AND tbl_name = \"procedures\" AND sql IS NOT NULL order by type = \"table\" desc"}
+[2023-08-17 17:25:51]	[debug]	[gorm.io/driver/sqlite.Migrator.ColumnTypes.func1:119]	trace	{"elapsed": 0, "rows": -1, "sql": "SELECT * FROM `procedures` LIMIT 1"}
+[2023-08-17 17:25:51]	[debug]	[gorm.io/driver/sqlite.Migrator.HasIndex.func1:313]	trace	{"elapsed": 0, "rows": -1, "sql": "SELECT count(*) FROM sqlite_master WHERE type = \"index\" AND tbl_name = \"procedures\" AND name = \"idx_procedures_deleted_at\""}
+[2023-08-17 17:25:51]	[debug]	[gorm.io/driver/sqlite.Migrator.HasIndex.func1:313]	trace	{"elapsed": 0, "rows": -1, "sql": "SELECT count(*) FROM sqlite_master WHERE type = \"index\" AND tbl_name = \"procedures\" AND name = \"idx_procedures_order_id\""}
+[2023-08-17 17:25:51]	[info]	[main.main:33]	apsClient start serve...
+[2023-08-17 17:25:51]	[info]	[apsClient/nsq.Consume:17]	Consume NewNsqConsumer topic:aps.wangpengfei.scheduleTask
+[2023-08-17 17:26:43]	[info]	[main.shutdown:48]	apsClient exited...
+[2023-08-17 17:26:48]	[debug]	[gorm.io/driver/sqlite.Migrator.HasTable.func1:33]	trace	{"elapsed": 0, "rows": -1, "sql": "SELECT count(*) FROM sqlite_master WHERE type='table' AND name=\"Order\""}
+[2023-08-17 17:26:48]	[debug]	[gorm.io/gorm/migrator.Migrator.RunWithValue:71]	trace	{"elapsed": 0, "rows": 3, "sql": "SELECT sql FROM sqlite_master WHERE type IN (\"table\",\"index\") AND tbl_name = \"Order\" AND sql IS NOT NULL order by type = \"table\" desc"}
+[2023-08-17 17:26:48]	[debug]	[gorm.io/driver/sqlite.Migrator.ColumnTypes.func1:119]	trace	{"elapsed": 0, "rows": -1, "sql": "SELECT * FROM `Order` LIMIT 1"}
+[2023-08-17 17:26:48]	[debug]	[gorm.io/driver/sqlite.Migrator.HasIndex.func1:313]	trace	{"elapsed": 0, "rows": -1, "sql": "SELECT count(*) FROM sqlite_master WHERE type = \"index\" AND tbl_name = \"Order\" AND name = \"idx_Order_deleted_at\""}
+[2023-08-17 17:26:48]	[debug]	[gorm.io/driver/sqlite.Migrator.HasIndex.func1:313]	trace	{"elapsed": 0, "rows": -1, "sql": "SELECT count(*) FROM sqlite_master WHERE type = \"index\" AND tbl_name = \"Order\" AND name = \"idx_Order_order_id\""}
+[2023-08-17 17:26:48]	[debug]	[gorm.io/driver/sqlite.Migrator.HasTable.func1:33]	trace	{"elapsed": 0, "rows": -1, "sql": "SELECT count(*) FROM sqlite_master WHERE type='table' AND name=\"procedures\""}
+[2023-08-17 17:26:48]	[debug]	[gorm.io/gorm/migrator.Migrator.RunWithValue:71]	trace	{"elapsed": 0, "rows": 3, "sql": "SELECT sql FROM sqlite_master WHERE type IN (\"table\",\"index\") AND tbl_name = \"procedures\" AND sql IS NOT NULL order by type = \"table\" desc"}
+[2023-08-17 17:26:48]	[debug]	[gorm.io/driver/sqlite.Migrator.ColumnTypes.func1:119]	trace	{"elapsed": 0, "rows": -1, "sql": "SELECT * FROM `procedures` LIMIT 1"}
+[2023-08-17 17:26:48]	[debug]	[gorm.io/driver/sqlite.Migrator.HasIndex.func1:313]	trace	{"elapsed": 0, "rows": -1, "sql": "SELECT count(*) FROM sqlite_master WHERE type = \"index\" AND tbl_name = \"procedures\" AND name = \"idx_procedures_deleted_at\""}
+[2023-08-17 17:26:48]	[debug]	[gorm.io/driver/sqlite.Migrator.HasIndex.func1:313]	trace	{"elapsed": 0, "rows": -1, "sql": "SELECT count(*) FROM sqlite_master WHERE type = \"index\" AND tbl_name = \"procedures\" AND name = \"idx_procedures_order_id\""}
+[2023-08-17 17:26:48]	[info]	[main.main:33]	apsClient start serve...
+[2023-08-17 17:26:48]	[info]	[apsClient/nsq.Consume:17]	Consume NewNsqConsumer topic:aps.wangpengfei.scheduleTask
+[2023-08-17 17:27:40]	[info]	[main.shutdown:48]	apsClient exited...
+[2023-08-17 17:27:45]	[debug]	[gorm.io/driver/sqlite.Migrator.HasTable.func1:33]	trace	{"elapsed": 0, "rows": -1, "sql": "SELECT count(*) FROM sqlite_master WHERE type='table' AND name=\"Order\""}
+[2023-08-17 17:27:45]	[debug]	[gorm.io/gorm/migrator.Migrator.RunWithValue:71]	trace	{"elapsed": 0, "rows": 3, "sql": "SELECT sql FROM sqlite_master WHERE type IN (\"table\",\"index\") AND tbl_name = \"Order\" AND sql IS NOT NULL order by type = \"table\" desc"}
+[2023-08-17 17:27:45]	[debug]	[gorm.io/driver/sqlite.Migrator.ColumnTypes.func1:119]	trace	{"elapsed": 0, "rows": -1, "sql": "SELECT * FROM `Order` LIMIT 1"}
+[2023-08-17 17:27:45]	[debug]	[gorm.io/driver/sqlite.Migrator.HasIndex.func1:313]	trace	{"elapsed": 0, "rows": -1, "sql": "SELECT count(*) FROM sqlite_master WHERE type = \"index\" AND tbl_name = \"Order\" AND name = \"idx_Order_deleted_at\""}
+[2023-08-17 17:27:45]	[debug]	[gorm.io/driver/sqlite.Migrator.HasIndex.func1:313]	trace	{"elapsed": 0, "rows": -1, "sql": "SELECT count(*) FROM sqlite_master WHERE type = \"index\" AND tbl_name = \"Order\" AND name = \"idx_Order_order_id\""}
+[2023-08-17 17:27:45]	[debug]	[gorm.io/driver/sqlite.Migrator.HasTable.func1:33]	trace	{"elapsed": 0, "rows": -1, "sql": "SELECT count(*) FROM sqlite_master WHERE type='table' AND name=\"procedures\""}
+[2023-08-17 17:27:45]	[debug]	[gorm.io/gorm/migrator.Migrator.RunWithValue:71]	trace	{"elapsed": 0, "rows": 3, "sql": "SELECT sql FROM sqlite_master WHERE type IN (\"table\",\"index\") AND tbl_name = \"procedures\" AND sql IS NOT NULL order by type = \"table\" desc"}
+[2023-08-17 17:27:45]	[debug]	[gorm.io/driver/sqlite.Migrator.ColumnTypes.func1:119]	trace	{"elapsed": 0, "rows": -1, "sql": "SELECT * FROM `procedures` LIMIT 1"}
+[2023-08-17 17:27:45]	[debug]	[gorm.io/driver/sqlite.Migrator.HasIndex.func1:313]	trace	{"elapsed": 0, "rows": -1, "sql": "SELECT count(*) FROM sqlite_master WHERE type = \"index\" AND tbl_name = \"procedures\" AND name = \"idx_procedures_deleted_at\""}
+[2023-08-17 17:27:45]	[debug]	[gorm.io/driver/sqlite.Migrator.HasIndex.func1:313]	trace	{"elapsed": 0, "rows": -1, "sql": "SELECT count(*) FROM sqlite_master WHERE type = \"index\" AND tbl_name = \"procedures\" AND name = \"idx_procedures_order_id\""}
+[2023-08-17 17:27:45]	[info]	[main.main:33]	apsClient start serve...
+[2023-08-17 17:27:45]	[info]	[apsClient/nsq.Consume:17]	Consume NewNsqConsumer topic:aps.wangpengfei.scheduleTask
+[2023-08-17 17:27:57]	[info]	[apsClient/pkg/contextx.NewContext.func1:44]	192.168.20.120 | GET /v1/task/get | uid:  | <nil>
+[2023-08-17 17:28:54]	[info]	[main.shutdown:48]	apsClient exited...
diff --git a/model/index.go b/model/index.go
index fb11459..21552fb 100644
--- a/model/index.go
+++ b/model/index.go
@@ -19,6 +19,6 @@
 
 func RegisterTables() error {
 	db := sqlitex.GetDB()
-	err := db.AutoMigrate(ScheduleTask{})
+	err := db.AutoMigrate(Order{}, Procedures{})
 	return err
 }
diff --git a/model/materials.go b/model/materials.go
deleted file mode 100644
index 8fd66e5..0000000
--- a/model/materials.go
+++ /dev/null
@@ -1,221 +0,0 @@
-package model
-
-import (
-	"apsClient/pkg/sqlitex"
-	"fmt"
-	"gorm.io/gorm"
-)
-
-type (
-
-	//"materialId": "PS",
-	//"materialName": "涓ョ墝PS",
-	//"amount": "10",
-	//"unit": "g/銕�"
-
-	Materials struct {
-		gorm.Model   `json:"-"`
-		Id           int    `json:"id"`
-		MaterialId   string `json:"materialId"`
-		MaterialName string `json:"materialName"`
-		Amount       string `json:"amount"`
-		Unit         string `json:"unit"`
-	}
-
-	MaterialsSearch struct {
-		Materials
-		Order    string
-		PageNum  int
-		PageSize int
-		Orm      *gorm.DB
-	}
-)
-
-func (slf *Materials) TableName() string {
-	return "materials"
-}
-
-func NewMaterialsSearch(db *gorm.DB) *MaterialsSearch {
-	if db == nil {
-		db = sqlitex.GetDB()
-	}
-	return &MaterialsSearch{Orm: db}
-}
-
-func (slf *MaterialsSearch) SetOrm(tx *gorm.DB) *MaterialsSearch {
-	slf.Orm = tx
-	return slf
-}
-
-func (slf *MaterialsSearch) SetPage(page, size int) *MaterialsSearch {
-	slf.PageNum, slf.PageSize = page, size
-	return slf
-}
-
-func (slf *MaterialsSearch) SetOrder(order string) *MaterialsSearch {
-	slf.Order = order
-	return slf
-}
-
-func (slf *MaterialsSearch) build() *gorm.DB {
-	var db = slf.Orm.Model(&Materials{})
-
-	if slf.Order != "" {
-		db = db.Order(slf.Order)
-	}
-
-	return db
-}
-
-// Create 鍗曟潯鎻掑叆
-func (slf *MaterialsSearch) Create(record *Materials) error {
-	var db = slf.build()
-
-	if err := db.Create(record).Error; err != nil {
-		return fmt.Errorf("create err: %v, record: %+v", err, record)
-	}
-
-	return nil
-}
-
-// CreateBatch 鎵归噺鎻掑叆
-func (slf *MaterialsSearch) CreateBatch(records []*Materials) error {
-	var db = slf.build()
-
-	if err := db.Create(&records).Error; err != nil {
-		return fmt.Errorf("create batch err: %v, records: %+v", err, records)
-	}
-
-	return nil
-}
-
-func (slf *MaterialsSearch) Save(record *Materials) error {
-	var db = slf.build()
-
-	if err := db.Save(record).Error; err != nil {
-		return fmt.Errorf("save err: %v, record: %+v", err, record)
-	}
-
-	return nil
-}
-
-func (slf *MaterialsSearch) UpdateByMap(upMap map[string]interface{}) error {
-	var (
-		db = slf.build()
-	)
-
-	if err := db.Updates(upMap).Error; err != nil {
-		return fmt.Errorf("update by map err: %v, upMap: %+v", err, upMap)
-	}
-
-	return nil
-}
-
-func (slf *MaterialsSearch) UpdateByQuery(query string, args []interface{}, upMap map[string]interface{}) error {
-	var (
-		db = slf.Orm.Table(slf.TableName()).Where(query, args...)
-	)
-
-	if err := db.Updates(upMap).Error; err != nil {
-		return fmt.Errorf("update by query err: %v, query: %s, args: %+v, upMap: %+v", err, query, args, upMap)
-	}
-
-	return nil
-}
-
-func (slf *MaterialsSearch) Delete() error {
-	var db = slf.build()
-
-	if err := db.Unscoped().Delete(&Materials{}).Error; err != nil {
-		return err
-	}
-
-	return nil
-}
-
-func (slf *MaterialsSearch) First() (*Materials, error) {
-	var (
-		record = new(Materials)
-		db     = slf.build()
-	)
-
-	if err := db.First(record).Error; err != nil {
-		return record, err
-	}
-
-	return record, nil
-}
-
-func (slf *MaterialsSearch) Find() ([]*Materials, int64, error) {
-	var (
-		records = make([]*Materials, 0)
-		total   int64
-		db      = slf.build()
-	)
-
-	if err := db.Count(&total).Error; err != nil {
-		return records, total, fmt.Errorf("find count err: %v", err)
-	}
-	if slf.PageNum*slf.PageSize > 0 {
-		db = db.Offset((slf.PageNum - 1) * slf.PageSize).Limit(slf.PageSize)
-	}
-	if err := db.Find(&records).Error; err != nil {
-		return records, total, fmt.Errorf("find records err: %v", err)
-	}
-
-	return records, total, nil
-}
-
-func (slf *MaterialsSearch) FindNotTotal() ([]*Materials, error) {
-	var (
-		records = make([]*Materials, 0)
-		db      = slf.build()
-	)
-
-	if slf.PageNum*slf.PageSize > 0 {
-		db = db.Offset((slf.PageNum - 1) * slf.PageSize).Limit(slf.PageSize)
-	}
-	if err := db.Find(&records).Error; err != nil {
-		return records, fmt.Errorf("find records err: %v", err)
-	}
-
-	return records, nil
-}
-
-// FindByQuery 鎸囧畾鏉′欢鏌ヨ.
-func (slf *MaterialsSearch) FindByQuery(query string, args []interface{}) ([]*Materials, int64, error) {
-	var (
-		records = make([]*Materials, 0)
-		total   int64
-		db      = slf.Orm.Table(slf.TableName()).Where(query, args...)
-	)
-
-	if err := db.Count(&total).Error; err != nil {
-		return records, total, fmt.Errorf("find by query count err: %v", err)
-	}
-	if slf.PageNum*slf.PageSize > 0 {
-		db = db.Offset((slf.PageNum - 1) * slf.PageSize).Limit(slf.PageSize)
-	}
-	if err := db.Find(&records).Error; err != nil {
-		return records, total, fmt.Errorf("find by query records err: %v, query: %s, args: %+v", err, query, args)
-	}
-
-	return records, total, nil
-}
-
-// FindByQueryNotTotal 鎸囧畾鏉′欢鏌ヨ&涓嶆煡璇㈡�绘潯鏁�.
-func (slf *MaterialsSearch) FindByQueryNotTotal(query string, args []interface{}) ([]*Materials, error) {
-	var (
-		records = make([]*Materials, 0)
-		db      = slf.Orm.Table(slf.TableName()).Where(query, args...)
-	)
-
-	if slf.PageNum*slf.PageSize > 0 {
-		db = db.Offset((slf.PageNum - 1) * slf.PageSize).Limit(slf.PageSize)
-	}
-	if err := db.Find(&records).Error; err != nil {
-		return records, fmt.Errorf("find by query records err: %v, query: %s, args: %+v", err, query, args)
-	}
-
-	return records, nil
-}
diff --git a/model/order.go b/model/order.go
new file mode 100644
index 0000000..87e67c9
--- /dev/null
+++ b/model/order.go
@@ -0,0 +1,268 @@
+package model
+
+import (
+	"apsClient/pkg/sqlitex"
+	"fmt"
+	"github.com/shopspring/decimal"
+	"gorm.io/gorm"
+)
+
+type (
+	Order struct {
+		gorm.Model  `json:"-"`
+		OrderID     string          `gorm:"index;type:varchar(191);not null;comment:璁㈠崟ID" json:"orderId"`
+		ProductID   string          `gorm:"type:varchar(191);comment:浜у搧ID" json:"productId"`
+		ProductName string          `gorm:"type:varchar(191);comment:浜у搧鍚嶇О" json:"productName"`
+		Parameter   string          `gorm:"type:varchar(1024);comment:鍙傛暟闇�姹�" json:"parameter"`
+		Customer    string          `gorm:"type:varchar(191);comment:瀹㈡埛缂栫爜" json:"customer"`
+		DeliverDate string          `gorm:"type:varchar(100);comment:浜よ揣鏃ユ湡" json:"deliverDate"`
+		OrderAttr   string          `json:"orderAttr"` // 璁㈠崟灞炴�ф嫾鎺ョ殑瀛楃涓诧紝鍗宠揣鐗╂弿杩�
+		Amount      decimal.Decimal `gorm:"type:decimal(35,18);comment:鏁伴噺" json:"amount"`
+		Unit        string          `gorm:"type:varchar(100);comment:鍗曚綅" json:"unit"`
+		StartTime   int64           `gorm:"comment:璁″垝寮�濮嬫椂闂�" json:"startTime"`
+		EndTime     int64           `gorm:"comment:璁″垝缁撴潫鏃堕棿" json:"endTime"`
+		Status      OrderStatus     `json:"-"`
+	}
+
+	OrderSearch struct {
+		Order
+		OrderBy      string
+		PageNum      int
+		PageSize     int
+		Orm          *gorm.DB
+		Preload      bool
+		StartTimeMin int64
+	}
+)
+
+type OrderStatus int
+
+const (
+	OrderStatusUnFinished OrderStatus = 1
+	OrderStatusFinished   OrderStatus = 2
+)
+
+func (slf *Order) TableName() string {
+	return "Order"
+}
+
+func NewOrderSearch(db *gorm.DB) *OrderSearch {
+	if db == nil {
+		db = sqlitex.GetDB()
+	}
+	return &OrderSearch{Orm: db}
+}
+
+func (slf *OrderSearch) SetOrm(tx *gorm.DB) *OrderSearch {
+	slf.Orm = tx
+	return slf
+}
+
+func (slf *OrderSearch) SetPage(page, size int) *OrderSearch {
+	slf.PageNum, slf.PageSize = page, size
+	return slf
+}
+
+func (slf *OrderSearch) SetOrder(order string) *OrderSearch {
+	slf.OrderBy = order
+	return slf
+}
+
+func (slf *OrderSearch) SetStartTimeMin(ts int64) *OrderSearch {
+	slf.StartTimeMin = ts
+	return slf
+}
+
+func (slf *OrderSearch) SetStatus(status OrderStatus) *OrderSearch {
+	slf.Status = status
+	return slf
+}
+
+func (slf *OrderSearch) SetPreload(preload bool) *OrderSearch {
+	slf.Preload = preload
+	return slf
+}
+
+func (slf *OrderSearch) SetOrderId(orderId string) *OrderSearch {
+	slf.OrderID = orderId
+	return slf
+}
+
+func (slf *OrderSearch) build() *gorm.DB {
+	var db = slf.Orm.Model(&Order{})
+
+	if slf.OrderBy != "" {
+		db = db.Order(slf.OrderBy)
+	}
+
+	if slf.OrderID != "" {
+		db = db.Where("order_id = ?", slf.OrderID)
+	}
+
+	if slf.Status != 0 {
+		db = db.Where("status = ?", slf.Status)
+	}
+
+	if slf.StartTimeMin != 0 {
+		db = db.Where("start_time >= ?", slf.StartTimeMin)
+	}
+
+	if slf.Preload {
+		db = db.Preload("InputMaterials").Preload("OutputMaterials")
+	}
+
+	return db
+}
+
+// Create 鍗曟潯鎻掑叆
+func (slf *OrderSearch) Create(record *Order) error {
+	var db = slf.build()
+
+	if err := db.Create(record).Error; err != nil {
+		return fmt.Errorf("create err: %v, record: %+v", err, record)
+	}
+
+	return nil
+}
+
+// CreateBatch 鎵归噺鎻掑叆
+func (slf *OrderSearch) CreateBatch(records []*Order) error {
+	var db = slf.build()
+
+	if err := db.Create(&records).Error; err != nil {
+		return fmt.Errorf("create batch err: %v, records: %+v", err, records)
+	}
+
+	return nil
+}
+
+func (slf *OrderSearch) Save(record *Order) error {
+	var db = slf.build()
+
+	if err := db.Save(record).Error; err != nil {
+		return fmt.Errorf("save err: %v, record: %+v", err, record)
+	}
+
+	return nil
+}
+
+func (slf *OrderSearch) UpdateByMap(upMap map[string]interface{}) error {
+	var (
+		db = slf.build()
+	)
+
+	if err := db.Updates(upMap).Error; err != nil {
+		return fmt.Errorf("update by map err: %v, upMap: %+v", err, upMap)
+	}
+
+	return nil
+}
+
+func (slf *OrderSearch) UpdateByQuery(query string, args []interface{}, upMap map[string]interface{}) error {
+	var (
+		db = slf.Orm.Table(slf.TableName()).Where(query, args...)
+	)
+
+	if err := db.Updates(upMap).Error; err != nil {
+		return fmt.Errorf("update by query err: %v, query: %s, args: %+v, upMap: %+v", err, query, args, upMap)
+	}
+
+	return nil
+}
+
+func (slf *OrderSearch) Delete() error {
+	var db = slf.build()
+
+	if err := db.Unscoped().Delete(&Order{}).Error; err != nil {
+		return err
+	}
+
+	return nil
+}
+
+func (slf *OrderSearch) First() (*Order, error) {
+	var (
+		record = new(Order)
+		db     = slf.build()
+	)
+
+	if err := db.First(record).Error; err != nil {
+		return record, err
+	}
+
+	return record, nil
+}
+
+func (slf *OrderSearch) Find() ([]*Order, int64, error) {
+	var (
+		records = make([]*Order, 0)
+		total   int64
+		db      = slf.build()
+	)
+
+	if err := db.Count(&total).Error; err != nil {
+		return records, total, fmt.Errorf("find count err: %v", err)
+	}
+	if slf.PageNum*slf.PageSize > 0 {
+		db = db.Offset((slf.PageNum - 1) * slf.PageSize).Limit(slf.PageSize)
+	}
+	if err := db.Find(&records).Error; err != nil {
+		return records, total, fmt.Errorf("find records err: %v", err)
+	}
+
+	return records, total, nil
+}
+
+func (slf *OrderSearch) FindNotTotal() ([]*Order, error) {
+	var (
+		records = make([]*Order, 0)
+		db      = slf.build()
+	)
+
+	if slf.PageNum*slf.PageSize > 0 {
+		db = db.Offset((slf.PageNum - 1) * slf.PageSize).Limit(slf.PageSize)
+	}
+	if err := db.Find(&records).Error; err != nil {
+		return records, fmt.Errorf("find records err: %v", err)
+	}
+
+	return records, nil
+}
+
+// FindByQuery 鎸囧畾鏉′欢鏌ヨ.
+func (slf *OrderSearch) FindByQuery(query string, args []interface{}) ([]*Order, int64, error) {
+	var (
+		records = make([]*Order, 0)
+		total   int64
+		db      = slf.Orm.Table(slf.TableName()).Where(query, args...)
+	)
+
+	if err := db.Count(&total).Error; err != nil {
+		return records, total, fmt.Errorf("find by query count err: %v", err)
+	}
+	if slf.PageNum*slf.PageSize > 0 {
+		db = db.Offset((slf.PageNum - 1) * slf.PageSize).Limit(slf.PageSize)
+	}
+	if err := db.Find(&records).Error; err != nil {
+		return records, total, fmt.Errorf("find by query records err: %v, query: %s, args: %+v", err, query, args)
+	}
+
+	return records, total, nil
+}
+
+// FindByQueryNotTotal 鎸囧畾鏉′欢鏌ヨ&涓嶆煡璇㈡�绘潯鏁�.
+func (slf *OrderSearch) FindByQueryNotTotal(query string, args []interface{}) ([]*Order, error) {
+	var (
+		records = make([]*Order, 0)
+		db      = slf.Orm.Table(slf.TableName()).Where(query, args...)
+	)
+
+	if slf.PageNum*slf.PageSize > 0 {
+		db = db.Offset((slf.PageNum - 1) * slf.PageSize).Limit(slf.PageSize)
+	}
+	if err := db.Find(&records).Error; err != nil {
+		return records, fmt.Errorf("find by query records err: %v, query: %s, args: %+v", err, query, args)
+	}
+
+	return records, nil
+}
diff --git a/model/procedures.go b/model/procedures.go
index 1dfc611..245f2e4 100644
--- a/model/procedures.go
+++ b/model/procedures.go
@@ -1,39 +1,53 @@
 package model
 
 import (
+	"apsClient/model/request"
+	"apsClient/pkg/logx"
 	"apsClient/pkg/sqlitex"
+	"encoding/json"
 	"fmt"
 	"gorm.io/gorm"
 )
 
 type (
 	Procedures struct {
-		gorm.Model        `json:"-"`
-		Id                int        `json:"id"`
-		ProcedureId       string     `json:"orderId"`
-		ProcedureName     string     `json:"product"`
-		DeviceId          string     `json:"deviceId"`
-		StartTime         string     `json:"startTime"`
-		EndTime           string     `json:"endTime"`
-		WorkHours         string     `json:"workHours"`
-		InputMaterialsId  int        `json:"-"`
-		InputMaterials    *Materials `json:"inputMaterials" gorm:"foreignKey:InputMaterialsId"`
-		OutputMaterialsId int        `json:"-"`
-		OutputMaterials   *Materials `json:"outputMaterials" gorm:"foreignKey:InputMaterialsId"`
+		gorm.Model     `json:"-"`
+		ID             int                      `gorm:"primarykey"`
+		OrderID        string                   `gorm:"index;type:varchar(191);not null;comment:璁㈠崟ID" json:"-"`
+		Status         ProcedureStatus          `json:"-"`
+		ProcedureData  string                   `json:"-"`                  //request.ProductProcedure  json涓�
+		ProceduresInfo request.ProductProcedure `json:"procedure" gorm:"-"` //request.ProductProcedure  瀵硅薄
 	}
 
 	ProceduresSearch struct {
 		Procedures
-		Order    string
-		PageNum  int
-		PageSize int
-		Orm      *gorm.DB
-		Preload  bool
+		Order        string
+		PageNum      int
+		PageSize     int
+		Orm          *gorm.DB
+		Preload      bool
+		StartTimeMin int64
 	}
+)
+
+type ProcedureStatus int
+
+const (
+	ProcedureStatusUnFinished ProcedureStatus = 1
+	ProcedureStatusFinished   ProcedureStatus = 2
 )
 
 func (slf *Procedures) TableName() string {
 	return "procedures"
+}
+func (slf *Procedures) AfterFind() {
+	var proceduresInfo request.ProductProcedure
+	err := json.Unmarshal([]byte(slf.ProcedureData), &proceduresInfo)
+	if err != nil {
+		logx.Errorf("AfterFind Unmarshal err: %v", err.Error())
+		return
+	}
+	slf.ProceduresInfo = proceduresInfo
 }
 
 func NewProceduresSearch(db *gorm.DB) *ProceduresSearch {
@@ -58,6 +72,25 @@
 	return slf
 }
 
+func (slf *ProceduresSearch) SetOrderId(orderId string) *ProceduresSearch {
+	slf.OrderID = orderId
+	return slf
+}
+func (slf *ProceduresSearch) SetStartTimeMin(ts int64) *ProceduresSearch {
+	slf.StartTimeMin = ts
+	return slf
+}
+
+func (slf *ProceduresSearch) SetId(id int) *ProceduresSearch {
+	slf.ID = id
+	return slf
+}
+
+func (slf *ProceduresSearch) SetStatus(status ProcedureStatus) *ProceduresSearch {
+	slf.Status = status
+	return slf
+}
+
 func (slf *ProceduresSearch) SetPreload(preload bool) *ProceduresSearch {
 	slf.Preload = preload
 	return slf
@@ -69,10 +102,23 @@
 	if slf.Order != "" {
 		db = db.Order(slf.Order)
 	}
+
+	if slf.OrderID != "" {
+		db = db.Where("order_id = ?", slf.OrderID)
+	}
+
 	if slf.Preload {
 		db = db.Preload("InputMaterials").Preload("OutputMaterials")
 	}
 
+	if slf.StartTimeMin != 0 {
+		db = db.Where("start_time >= ?", slf.StartTimeMin)
+	}
+
+	if slf.Status != 0 {
+		db = db.Where("status = ?", slf.Status)
+	}
+
 	return db
 }
 
diff --git a/model/response/common.go b/model/response/common.go
index 7461096..05246bb 100644
--- a/model/response/common.go
+++ b/model/response/common.go
@@ -1,8 +1,17 @@
 package response
 
+import (
+	"apsClient/model"
+)
+
 type PageResult struct {
 	List     interface{} `json:"list"`
 	Total    int64       `json:"total"`
 	Page     int         `json:"page"`
 	PageSize int         `json:"pageSize"`
 }
+
+type TaskData struct {
+	Order     *model.Order
+	Procedure *model.Procedures
+}
diff --git a/model/schedule_task.go b/model/schedule_task.go
deleted file mode 100644
index b8ab664..0000000
--- a/model/schedule_task.go
+++ /dev/null
@@ -1,260 +0,0 @@
-package model
-
-import (
-	"apsClient/model/request"
-	"apsClient/pkg/sqlitex"
-	"fmt"
-	"github.com/shopspring/decimal"
-	"gorm.io/gorm"
-)
-
-//{
-//"orderId": "0100000",
-//"productId": "PE500A01D/F",
-//"productName": "鍓嶇汉姣涘竷",
-//"parameter": "",
-//"customer": "1200",
-//"deliverDate": "2023-08-16",
-//"orderAttr": "浜у搧绫诲埆:娑ょ憾",
-//"amount": "1200",
-//"unit": "",
-//"startTime": 1692328320,
-//"endTime": 1692946800
-//},
-
-type (
-	ScheduleTask struct {
-		gorm.Model  `json:"-"`
-		Id          int    `json:"id"`
-		OrderId     string `json:"orderId"`     //璁㈠崟id
-		ProductId   string `json:"productId"`   //璁㈠崟id
-		ProductName string `json:"productName"` //浜у搧鍚嶇О
-		//Parameter   string          `json:"parameter"`   //浜у搧鍚嶇О
-		//Customer    string          `json:"customer"`
-		//DeliverDate string          `json:"deliverDate"`
-		//OrderAttr   string          `json:"orderAttr"`
-		Amount    decimal.Decimal             `json:"amount"`
-		Unit      string                      `json:"unit"`
-		StartTime int64                       `json:"startTime"`
-		EndTime   int64                       `json:"endTime"`
-		Data      string                      `json:"data"`              //鎺掔▼浠诲姟json涓�
-		TaskInfo  request.DeliverScheduleTask `json:"taskInfo" gorm:"-"` //鎺掔▼浠诲姟json涓�
-		//Procedures  []*Procedures   `json:"Procedures" gorm:"many2many:ScheduleTask_Procedures;"`
-	}
-
-	ScheduleTaskSearch struct {
-		ScheduleTask
-		Order    string
-		PageNum  int
-		PageSize int
-		Orm      *gorm.DB
-		Preload  bool
-	}
-)
-
-func (slf *ScheduleTask) TableName() string {
-	return "schedule_task"
-}
-
-func NewScheduleTaskSearch(db *gorm.DB) *ScheduleTaskSearch {
-	if db == nil {
-		db = sqlitex.GetDB()
-	}
-	return &ScheduleTaskSearch{Orm: db}
-}
-
-func (slf *ScheduleTaskSearch) SetOrm(tx *gorm.DB) *ScheduleTaskSearch {
-	slf.Orm = tx
-	return slf
-}
-
-func (slf *ScheduleTaskSearch) SetPage(page, size int) *ScheduleTaskSearch {
-	slf.PageNum, slf.PageSize = page, size
-	return slf
-}
-
-func (slf *ScheduleTaskSearch) SetOrder(order string) *ScheduleTaskSearch {
-	slf.Order = order
-	return slf
-}
-
-func (slf *ScheduleTaskSearch) SetPreload(preload bool) *ScheduleTaskSearch {
-	slf.Preload = preload
-	return slf
-}
-
-func (slf *ScheduleTaskSearch) SetEndTime(endTime int64) *ScheduleTaskSearch {
-	slf.EndTime = endTime
-	return slf
-}
-
-func (slf *ScheduleTaskSearch) build() *gorm.DB {
-	var db = slf.Orm.Model(&ScheduleTask{})
-
-	if slf.Order != "" {
-		db = db.Order(slf.Order)
-	}
-
-	if slf.EndTime > 0 {
-		db = db.Where("end_time < ?", slf.EndTime)
-	}
-
-	//if slf.Preload {
-	//	db = db.Preload("Procedures")
-	//}
-
-	return db
-}
-
-// Create 鍗曟潯鎻掑叆
-func (slf *ScheduleTaskSearch) Create(record *ScheduleTask) error {
-	var db = slf.build()
-
-	if err := db.Create(record).Error; err != nil {
-		return fmt.Errorf("create err: %v, record: %+v", err, record)
-	}
-
-	return nil
-}
-
-// CreateBatch 鎵归噺鎻掑叆
-func (slf *ScheduleTaskSearch) CreateBatch(records []*ScheduleTask) error {
-	var db = slf.build()
-
-	if err := db.Create(&records).Error; err != nil {
-		return fmt.Errorf("create batch err: %v, records: %+v", err, records)
-	}
-
-	return nil
-}
-
-func (slf *ScheduleTaskSearch) Save(record *ScheduleTask) error {
-	var db = slf.build()
-
-	if err := db.Save(record).Error; err != nil {
-		return fmt.Errorf("save err: %v, record: %+v", err, record)
-	}
-
-	return nil
-}
-
-func (slf *ScheduleTaskSearch) UpdateByMap(upMap map[string]interface{}) error {
-	var (
-		db = slf.build()
-	)
-
-	if err := db.Updates(upMap).Error; err != nil {
-		return fmt.Errorf("update by map err: %v, upMap: %+v", err, upMap)
-	}
-
-	return nil
-}
-
-func (slf *ScheduleTaskSearch) UpdateByQuery(query string, args []interface{}, upMap map[string]interface{}) error {
-	var (
-		db = slf.Orm.Table(slf.TableName()).Where(query, args...)
-	)
-
-	if err := db.Updates(upMap).Error; err != nil {
-		return fmt.Errorf("update by query err: %v, query: %s, args: %+v, upMap: %+v", err, query, args, upMap)
-	}
-
-	return nil
-}
-
-func (slf *ScheduleTaskSearch) Delete() error {
-	var db = slf.build()
-
-	if err := db.Unscoped().Delete(&ScheduleTask{}).Error; err != nil {
-		return err
-	}
-
-	return nil
-}
-
-func (slf *ScheduleTaskSearch) First() (*ScheduleTask, error) {
-	var (
-		record = new(ScheduleTask)
-		db     = slf.build()
-	)
-
-	if err := db.First(record).Error; err != nil {
-		return record, err
-	}
-
-	return record, nil
-}
-
-func (slf *ScheduleTaskSearch) Find() ([]*ScheduleTask, int64, error) {
-	var (
-		records = make([]*ScheduleTask, 0)
-		total   int64
-		db      = slf.build()
-	)
-
-	if err := db.Count(&total).Error; err != nil {
-		return records, total, fmt.Errorf("find count err: %v", err)
-	}
-	if slf.PageNum*slf.PageSize > 0 {
-		db = db.Offset((slf.PageNum - 1) * slf.PageSize).Limit(slf.PageSize)
-	}
-	if err := db.Find(&records).Error; err != nil {
-		return records, total, fmt.Errorf("find records err: %v", err)
-	}
-
-	return records, total, nil
-}
-
-func (slf *ScheduleTaskSearch) FindNotTotal() ([]*ScheduleTask, error) {
-	var (
-		records = make([]*ScheduleTask, 0)
-		db      = slf.build()
-	)
-
-	if slf.PageNum*slf.PageSize > 0 {
-		db = db.Offset((slf.PageNum - 1) * slf.PageSize).Limit(slf.PageSize)
-	}
-	if err := db.Find(&records).Error; err != nil {
-		return records, fmt.Errorf("find records err: %v", err)
-	}
-
-	return records, nil
-}
-
-// FindByQuery 鎸囧畾鏉′欢鏌ヨ.
-func (slf *ScheduleTaskSearch) FindByQuery(query string, args []interface{}) ([]*ScheduleTask, int64, error) {
-	var (
-		records = make([]*ScheduleTask, 0)
-		total   int64
-		db      = slf.Orm.Table(slf.TableName()).Where(query, args...)
-	)
-
-	if err := db.Count(&total).Error; err != nil {
-		return records, total, fmt.Errorf("find by query count err: %v", err)
-	}
-	if slf.PageNum*slf.PageSize > 0 {
-		db = db.Offset((slf.PageNum - 1) * slf.PageSize).Limit(slf.PageSize)
-	}
-	if err := db.Find(&records).Error; err != nil {
-		return records, total, fmt.Errorf("find by query records err: %v, query: %s, args: %+v", err, query, args)
-	}
-
-	return records, total, nil
-}
-
-// FindByQueryNotTotal 鎸囧畾鏉′欢鏌ヨ&涓嶆煡璇㈡�绘潯鏁�.
-func (slf *ScheduleTaskSearch) FindByQueryNotTotal(query string, args []interface{}) ([]*ScheduleTask, error) {
-	var (
-		records = make([]*ScheduleTask, 0)
-		db      = slf.Orm.Table(slf.TableName()).Where(query, args...)
-	)
-
-	if slf.PageNum*slf.PageSize > 0 {
-		db = db.Offset((slf.PageNum - 1) * slf.PageSize).Limit(slf.PageSize)
-	}
-	if err := db.Find(&records).Error; err != nil {
-		return records, fmt.Errorf("find by query records err: %v, query: %s, args: %+v", err, query, args)
-	}
-
-	return records, nil
-}
diff --git a/nsq/msg_handler.go b/nsq/msg_handler.go
index 495b6ef..fef9a83 100644
--- a/nsq/msg_handler.go
+++ b/nsq/msg_handler.go
@@ -1,10 +1,13 @@
 package nsq
 
 import (
+	"apsClient/conf"
 	"apsClient/model"
 	"apsClient/pkg/logx"
+	"apsClient/pkg/structx"
 	"encoding/json"
 	"fmt"
+	"gorm.io/gorm"
 )
 
 type MsgHandler interface {
@@ -25,26 +28,38 @@
 		return err
 	}
 	for _, task := range tasks {
-		taskRecord := model.ScheduleTask{
-			Id:          0,
-			OrderId:     task.Order.OrderID,
-			ProductId:   task.Order.ProductID,
-			ProductName: task.Order.ProductName,
-			Amount:      task.Order.Amount,
-			Unit:        task.Order.Unit,
-			StartTime:   task.Order.StartTime,
-			EndTime:     task.Order.EndTime,
-		}
-		jsonStr, err := json.Marshal(task)
-		if err != nil {
-			logx.Errorf("ScheduleTask HandleMessage Marshal err: %v, old: %#v", err.Error(), task)
-			return err
-		}
-		taskRecord.Data = string(jsonStr)
-		err = model.NewScheduleTaskSearch(nil).Create(&taskRecord)
-		if err != nil {
-			logx.Errorf("ScheduleTask HandleMessage Create taskRecord err: %v,  record: %#v", err.Error(), taskRecord)
-			return err
+		for _, procedure := range task.Procedures {
+			if procedure.DeviceID == conf.Conf.System.DeviceId { //鍙瓨鍌ㄦ湰璁惧鐨勫伐搴�
+				err = model.WithTransaction(func(db *gorm.DB) error {
+					_, err := model.NewOrderSearch(db).SetOrderId(task.Order.OrderID).First()
+					if err == gorm.ErrRecordNotFound {
+						var orderRecord model.Order
+						err = structx.AssignTo(task.Order, &orderRecord)
+						orderRecord.Status = model.OrderStatusUnFinished
+						if err != nil {
+							logx.Errorf(" structx.Assign task.Order to orderRecord err: %v", err.Error())
+							return err
+						}
+						if err = model.NewOrderSearch(db).Create(&orderRecord); err != nil {
+							return err
+						}
+					}
+					procedureRecord := model.Procedures{
+						OrderID: task.Order.OrderID,
+						Status:  model.ProcedureStatusUnFinished,
+					}
+					procedureData, err := json.Marshal(procedure)
+					procedureRecord.ProcedureData = string(procedureData)
+					if err != nil {
+						logx.Errorf(" json.Marshal(procedure) err: %v", err.Error())
+						return err
+					}
+					return model.NewProceduresSearch(db).Create(&procedureRecord)
+				})
+				if err != nil {
+					logx.Errorf(" save procedure err: %v", err.Error())
+				}
+			}
 		}
 	}
 	return nil
diff --git a/pkg/plc/plc4x.go b/pkg/plc/plc4x.go
new file mode 100644
index 0000000..8afb487
--- /dev/null
+++ b/pkg/plc/plc4x.go
@@ -0,0 +1,127 @@
+package plc
+
+import (
+	"errors"
+	"fmt"
+	apiModel "github.com/apache/plc4x/plc4go/pkg/api/model"
+
+	plc4go "github.com/apache/plc4x/plc4go/pkg/api"
+	"github.com/apache/plc4x/plc4go/pkg/api/drivers"
+	"github.com/apache/plc4x/plc4go/pkg/api/transports"
+)
+
+func NewModbusConnection(ipAddr string) (plc4go.PlcConnection, error) {
+	// 鍒涘缓椹卞姩绠$悊鍣�
+	driverManager := plc4go.NewPlcDriverManager()
+
+	// 娉ㄥ唽TCP浼犺緭
+	transports.RegisterTcpTransport(driverManager)
+
+	// 娉ㄥ唽椹卞姩
+	//drivers.RegisterKnxDriver(driverManager)
+	drivers.RegisterModbusTcpDriver(driverManager)
+
+	// 閫氳繃TCP杩炴帴PLC璁惧
+	connectionString := fmt.Sprintf("modbus-tcp://%s", ipAddr)
+	connectionRequestChanel := driverManager.GetConnection(connectionString)
+
+	// 绛夊緟杩炴帴鍝嶅簲
+	connectionResult := <-connectionRequestChanel
+
+	// 鍒ゆ柇鏄惁杩炴帴鎴愬姛
+	if err := connectionResult.GetErr(); err != nil {
+		return nil, err
+	}
+
+	return connectionResult.GetConnection(), nil
+}
+func ReadHoldingRegisterSingle(connection plc4go.PlcConnection, address int) ([]byte, error) {
+	tagAddress := fmt.Sprintf("holding-register:%d:UINT", address)
+
+	// 璇绘ā寮�
+	readRequest, err := connection.ReadRequestBuilder().AddTagAddress("tag", tagAddress).Build()
+	if err != nil {
+		fmt.Printf("preparing read-request:%s\n", err.Error())
+		return nil, err
+	}
+
+	// 鎵ц
+	readResult := <-readRequest.Execute()
+	if err := readResult.GetErr(); err != nil {
+		fmt.Printf("execting read-request:%s\n", err.Error())
+		return nil, err
+	}
+
+	// 鍒ゆ柇鍝嶅簲鐮佹槸鍚︽纭�
+	if readResult.GetResponse().GetResponseCode("tag") != apiModel.PlcResponseCode_OK {
+		fmt.Printf("error an non-ok return code: %s", readResult.GetResponse().GetResponseCode("tag").GetName())
+		return nil, nil
+	}
+
+	value := readResult.GetResponse().GetValue("tag")
+
+	return value.GetRaw(), err
+
+}
+
+func ReadHoldingRegisterList(connection plc4go.PlcConnection, address, length int) ([]byte, error) {
+	tagAddress := fmt.Sprintf("holding-register:%d:UINT[%d]", address, length)
+
+	// 璇绘ā寮�
+	readRequest, err := connection.ReadRequestBuilder().AddTagAddress("tag", tagAddress).Build()
+	if err != nil {
+		fmt.Printf("preparing read-request:%s\n", err.Error())
+		return nil, err
+	}
+
+	// 鎵ц
+	readResult := <-readRequest.Execute()
+	if err := readResult.GetErr(); err != nil {
+		fmt.Printf("execting read-request:%s\n", err.Error())
+		return nil, err
+	}
+
+	// 鍒ゆ柇鍝嶅簲鐮佹槸鍚︽纭�
+	if readResult.GetResponse().GetResponseCode("tag") != apiModel.PlcResponseCode_OK {
+		fmt.Printf("error an non-ok return code: %s", readResult.GetResponse().GetResponseCode("tag").GetName())
+		return nil, errors.New("error  code: " + readResult.GetResponse().GetResponseCode("tag").GetName())
+	}
+
+	value := readResult.GetResponse().GetValue("tag")
+
+	var result []byte
+
+	for _, val := range value.GetList() {
+		result = append(result, val.GetRaw()...)
+	}
+
+	return result, nil
+}
+
+func WriteHoldingRegister(connection plc4go.PlcConnection, address int, value any) (string, error) {
+	tagAddress := fmt.Sprintf("holding-register:%d:UINT", address)
+
+	// 鍐欐ā寮�
+	writeRequest, err := connection.WriteRequestBuilder().AddTagAddress("tag", tagAddress, value).Build()
+	if err != nil {
+		fmt.Printf("preparing read-request:%s\n", err.Error())
+		return "", err
+	}
+
+	// 鎵ц
+	writeResult := <-writeRequest.Execute()
+	if err := writeResult.GetErr(); err != nil {
+		fmt.Printf("execting read-request:%s\n", err.Error())
+		return "", err
+	}
+
+	// 鍒ゆ柇鍝嶅簲鐮佹槸鍚︽纭�
+	if writeResult.GetResponse().GetResponseCode("tag") != apiModel.PlcResponseCode_OK {
+		fmt.Printf("error an non-ok return code: %s", writeResult.GetResponse().GetResponseCode("tag").GetName())
+		return "", errors.New("error  code: " + writeResult.GetResponse().GetResponseCode("tag").GetName())
+	}
+
+	result := writeResult.GetResponse().String()
+
+	return result, nil
+}
diff --git a/router/index.go b/router/index.go
index 3e5f9c7..462624d 100644
--- a/router/index.go
+++ b/router/index.go
@@ -32,17 +32,12 @@
 
 	v1Group := Router.Group("v1")
 
-	// 鎺ユ敹閫氱煡
-	noticeApi := new(v1.NoticeApi)
-	noticeGroup := v1Group.Group("notice")
-	{
-		noticeGroup.POST("task/start", noticeApi.TaskStart) // 浠诲姟寮�鍚�氱煡
-	}
-
 	taskApi := new(v1.TaskApi)
 	taskGroup := v1Group.Group("task")
 	{
-		taskGroup.GET("list", taskApi.TaskList) // 浠诲姟寮�鍚�氱煡
+		taskGroup.GET("get", taskApi.TaskGet)           // 鑾峰彇宸ュ簭
+		taskGroup.GET("start/:id", taskApi.TaskStart)   // 寮�鍚伐搴忓苟鑾峰彇鍙傛暟
+		taskGroup.PUT("finish/:id", taskApi.TaskFinish) // 瀹屾垚宸ュ簭
 	}
 
 	return Router
diff --git a/service/task.go b/service/task.go
index bf65ebf..11b543b 100644
--- a/service/task.go
+++ b/service/task.go
@@ -2,7 +2,10 @@
 
 import (
 	"apsClient/model"
+	"apsClient/model/response"
 	"apsClient/pkg/ecode"
+	"gorm.io/gorm"
+	"time"
 )
 
 type TaskService struct {
@@ -12,16 +15,62 @@
 	return &TaskService{}
 }
 
-func (slf TaskService) GetTaskList(page, pageSize int) (taskList []*model.ScheduleTask, total int64, code int) {
-	search := model.NewScheduleTaskSearch(nil)
-	search.SetPage(page, pageSize).
-		SetPreload(true)
-	//SetEndTime(time.Now().Unix())
-	var err error
-	taskList, total, err = search.Find()
-	if err != nil {
-		return
+// GetTask 鑾峰彇浠诲姟锛屾湭瀹屾垚鐨勫紑濮嬫椂闂存渶鏃╃殑浠诲姟
+func (slf TaskService) GetTask() (taskData *response.TaskData, code int) {
+	nowTs := time.Now().Unix()
+	orderSearch := model.NewOrderSearch(nil)
+	orderSearch.SetOrder("created_at asc").
+		SetStartTimeMin(nowTs).
+		SetStatus(model.OrderStatusUnFinished)
+	var (
+		err   error
+		order *model.Order
+	)
+	order, err = orderSearch.First() //鍏堝彇杩涜涓殑浠诲姟
+	if err == gorm.ErrRecordNotFound {
+		err = nil
+		return nil, ecode.OK
 	}
-	return taskList, total, ecode.OK
+	if err != nil {
+		return nil, ecode.DBErr
+	}
+	procedure, err := model.NewProceduresSearch(nil).
+		SetOrderId(order.OrderID).
+		SetStartTimeMin(nowTs).
+		SetStatus(model.ProcedureStatusUnFinished).
+		First()
+	if err == gorm.ErrRecordNotFound { //璇ヨ鍗曟湰璁惧鍏ㄩ儴宸ュ簭瀹屾垚锛屾妸璁㈠崟缃负瀹屾垚鐘舵�侊紙鍙槸瀵规湰璁惧瀹屾垚锛�
+		err = nil
+		err = model.NewOrderSearch(nil).SetOrderId(order.OrderID).UpdateByMap(map[string]interface{}{
+			"status": model.OrderStatusFinished,
+		})
+		if err != nil {
+			return nil, ecode.DBErr
+		}
+		return slf.GetTask() //褰撳墠璁㈠崟宸插畬鍏紝缁х画鏌ヨ鏈畬鎴愯鍗�
+	}
+	if err != nil {
+		return nil, ecode.DBErr
+	}
+	taskData.Order = order
+	taskData.Procedure = procedure
+	return taskData, ecode.OK
+}
 
+func (slf TaskService) GetProcedureById(id int) (*model.Procedures, int) {
+	procedure, err := model.NewProceduresSearch(nil).SetId(id).First()
+	if err != nil {
+		return nil, ecode.DBErr
+	}
+	return procedure, ecode.OK
+}
+
+func (slf TaskService) UpdateProcedureStatus(id int, status model.ProcedureStatus) error {
+	return model.NewProceduresSearch(nil).SetId(id).UpdateByMap(map[string]interface{}{
+		"status": status,
+	})
+}
+
+func (slf TaskService) GetOrderByOrderId(orderId string) (order *model.Order, err error) {
+	return model.NewOrderSearch(nil).SetOrderId(orderId).First()
 }

--
Gitblit v1.8.0