From c6173b62e0fea3116075d56692b73cc0bc624815 Mon Sep 17 00:00:00 2001
From: zhangqian <zhangqian@123.com>
Date: 星期日, 27 八月 2023 00:54:56 +0800
Subject: [PATCH] 逻辑修改

---
 api/v1/plc.go       |   24 ------
 service/task.go     |   28 ++++--
 nsq/msg_handler.go  |    4 
 model/procedures.go |   15 +++
 model/work_order.go |   24 +++++
 api/v1/task.go      |   96 +++++++----------------
 6 files changed, 84 insertions(+), 107 deletions(-)

diff --git a/api/v1/plc.go b/api/v1/plc.go
index 03a19ce..cba0bbd 100644
--- a/api/v1/plc.go
+++ b/api/v1/plc.go
@@ -5,8 +5,6 @@
 	"apsClient/model/response"
 	_ "apsClient/model/response"
 	"apsClient/pkg/contextx"
-	"apsClient/pkg/ecode"
-	"apsClient/pkg/safe"
 	"apsClient/service"
 	"github.com/gin-gonic/gin"
 	"github.com/spf13/cast"
@@ -44,27 +42,5 @@
 	if !ok {
 		return
 	}
-
-	taskData, code := service.NewTaskService().GetTask()
-	if code != ecode.OK {
-		ctx.Fail(code)
-		return
-	}
-
-	if taskData.Order == nil {
-		ctx.FailWithMsg(ecode.UnknownErr, "褰撳墠娌℃湁寰呯敓浜у伐鍗�")
-		return
-	}
-
-	plcConfig, code := service.NewDevicePlcService().GetDevicePlc()
-	if code != ecode.OK {
-		ctx.FailWithMsg(ecode.UnknownErr, "璇峰厛閰嶇疆PLC")
-		return
-	}
-
-	safe.Go(func() {
-		_ = service.PlcWrite(plcConfig, constvar.PlcStartAddressTypeTotalNumber, taskData.Order.Amount.IntPart())
-	})
-
 	ctx.Ok()
 }
diff --git a/api/v1/task.go b/api/v1/task.go
index 901592e..c84a110 100644
--- a/api/v1/task.go
+++ b/api/v1/task.go
@@ -18,6 +18,7 @@
 	"errors"
 	"fmt"
 	"github.com/gin-gonic/gin"
+	"gorm.io/gorm"
 	"time"
 )
 
@@ -35,7 +36,7 @@
 		return
 	}
 	var resp response.TaskCountdown
-	workOrder, err := service.NewTaskService().GetComingTask()
+	workOrder, err := service.NewTaskService().GetCurrentTask()
 	if err == nil {
 		seconds := workOrder.StartTime - time.Now().Unix()
 		resp.CountDownHour = seconds / 3600
@@ -88,8 +89,8 @@
 		ctx.Fail(code)
 		return
 	}
-	if procedure.Status != model.ProcedureStatusUnFinished {
-		ctx.FailWithMsg(ecode.ParamsErr, "璇ュ伐搴忓凡缁撴潫")
+	if procedure.Status != model.ProcedureStatusWaitProcess {
+		ctx.FailWithMsg(ecode.ParamsErr, "璇ュ伐搴忕姸鎬佷笉鏄湭寮�濮�")
 		return
 	}
 
@@ -98,19 +99,6 @@
 		ctx.Fail(ecode.UnknownErr)
 		return
 	}
-	//params := service.GetProcessModelParams{
-	//	WorkOrder: procedure.WorkOrderID,
-	//	OrderId:   procedure.OrderID,
-	//	Product:   order.ProductName,
-	//	Procedure: procedure.ProceduresInfo.ProcedureName,
-	//	Device:    procedure.ProceduresInfo.DeviceName,
-	//}
-	//resp, err := service.ProcessModel{}.GetProcessModel(params)
-	//if err != nil {
-	//	logx.Errorf("TaskStart GetProcessModel error: %v", err.Error())
-	//	ctx.FailWithMsg(ecode.UnknownErr, "鏈幏鍙栧埌宸ヨ壓鍙傛暟")
-	//	return
-	//}
 
 	caller := nsq.NewCaller(fmt.Sprintf(constvar.NsqTopicProcessParamsRequest, conf.Conf.NsqConf.NodeId), fmt.Sprintf(constvar.NsqTopicProcessParamsResponse, conf.Conf.NsqConf.NodeId))
 	var result common.ResponseProcessParams
@@ -170,7 +158,7 @@
 		ctx.Fail(code)
 		return
 	}
-	err := service.NewTaskService().UpdateProcedureStatus(id, model.ProcedureStatusFinished)
+	err := service.NewTaskService().UpdateProcedureStatus(nil, id, model.ProcedureStatusFinished)
 	if err != nil {
 		logx.Errorf("UpdateProcedureStatus err: %v", err.Error())
 		ctx.Fail(ecode.UnknownErr)
@@ -228,64 +216,40 @@
 		return
 	}
 
-	//fmt.Println("----------------寮�濮嬩笅鍙戝伐鑹哄弬鏁�-----------------")
-	//for k, v := range resp.ParamsMap {
-	//	fmt.Println(fmt.Sprintf("%v : %v", k, v))
-	//	time.Sleep(time.Millisecond * 300)
-	//}
-	//fmt.Println("----------------涓嬪彂宸ヨ壓鍙傛暟瀹屾瘯-----------------")
-
-	//err = SendParams(resp.ParamsMap)
-	//if err != nil {
-	//	logx.Errorf("SendProcessParams: %v", err.Error())
-	//	ctx.Fail(ecode.UnknownErr)
-	//	return
-	//}
+	err = model.WithTransaction(func(db *gorm.DB) error {
+		err = service.NewTaskService().UpdateProcedureStatus(db, id, model.ProcedureStatusProcessing)
+		if err != nil {
+			return err
+		}
+		err = service.NewTaskService().UpdateOrderStatus(db, order.ID, model.OrderStatusProcessing)
+		if err != nil {
+			return err
+		}
+		return nil
+	})
+	if err != nil {
+		logx.Errorf("SendProcessParams update order and procedure status error:%v", err.Error())
+		ctx.FailWithMsg(ecode.DBErr, "鏇存敼宸ュ崟鐘舵�佸け璐�")
+		return
+	}
 
 	safe.Go(func() {
-		err = SendParams2(result.ParamsMap, 0)
+		err = SendParams(result.ParamsMap, 0)
 		if err != nil {
 			logx.Errorf("SendProcessParams: %v", err.Error())
 			return
 		}
+		plcConfig, code := service.NewDevicePlcService().GetDevicePlc()
+		if code != ecode.OK {
+			logx.Errorf("get plcConfig err: %v", err.Error())
+			return
+		}
+		_ = service.PlcWrite(plcConfig, constvar.PlcStartAddressTypeTotalNumber, order.Amount.IntPart())
 	})
 	ctx.Ok()
 }
 
-func SendParams(paramsMap map[string]interface{}) error {
-	if len(paramsMap) == 0 {
-		return errors.New("empty params")
-	}
-	plcAddressMap := make(map[string]*int, len(conf.Conf.PLCAddresses))
-	for _, item := range conf.Conf.PLCAddresses {
-		plcAddressMap[item.FieldName] = &item.Address
-	}
-
-	plcConfig, code := service.NewDevicePlcService().GetDevicePlc()
-	if code != ecode.OK {
-		return errors.New("璇峰厛閰嶇疆PLC")
-	}
-	conn, err := plc.GetModbusConnection(fmt.Sprintf("%s:%v", plcConfig.Address, plcConfig.Port))
-	if err != nil {
-		return errors.New(fmt.Sprintf("杩炴帴plc澶辫触: %v", err.Error()))
-	}
-
-	logx.Info("----------------寮�濮嬩笅鍙戝伐鑹哄弬鏁�-----------------")
-	for k, v := range paramsMap {
-		if plcAddressMap[k] != nil {
-			result, err := plc.WriteHoldingRegister(conn, *plcAddressMap[k], v)
-			if err != nil {
-				logx.Errorf("WriteHoldingRegister err:%v, address: %v, key: %v value: %v", err.Error(), *plcAddressMap[k], k, v)
-			} else {
-				logx.Infof("WriteHoldingRegister ok: key: %v, value: %v, result: %v", k, v, result)
-			}
-		}
-	}
-	logx.Info("----------------涓嬪彂宸ヨ壓鍙傛暟瀹屾瘯-----------------")
-	return nil
-}
-
-func SendParams2(paramsMap map[string]interface{}, tryTimes int) error {
+func SendParams(paramsMap map[string]interface{}, tryTimes int) error {
 	if len(paramsMap) == 0 {
 		return errors.New("empty params")
 	}
@@ -326,7 +290,7 @@
 			return err
 		}
 		tryTimes++
-		return SendParams2(paramsMap, tryTimes)
+		return SendParams(paramsMap, tryTimes)
 	}
 	logx.Info("----------------涓嬪彂宸ヨ壓鍙傛暟瀹屾瘯-----------------")
 	return nil
diff --git a/model/procedures.go b/model/procedures.go
index a1fb11b..48534b3 100644
--- a/model/procedures.go
+++ b/model/procedures.go
@@ -30,14 +30,16 @@
 		Orm          *gorm.DB
 		Preload      bool
 		StartTimeMax int64
+		StatusNot    ProcedureStatus
 	}
 )
 
 type ProcedureStatus int
 
 const (
-	ProcedureStatusUnFinished ProcedureStatus = 1
-	ProcedureStatusFinished   ProcedureStatus = 2
+	ProcedureStatusWaitProcess ProcedureStatus = 1
+	ProcedureStatusProcessing  ProcedureStatus = 2
+	ProcedureStatusFinished    ProcedureStatus = 3
 )
 
 func (slf *Procedures) TableName() string {
@@ -95,6 +97,11 @@
 	return slf
 }
 
+func (slf *ProceduresSearch) SetStatusNot(status ProcedureStatus) *ProceduresSearch {
+	slf.StatusNot = status
+	return slf
+}
+
 func (slf *ProceduresSearch) SetPreload(preload bool) *ProceduresSearch {
 	slf.Preload = preload
 	return slf
@@ -127,6 +134,10 @@
 		db = db.Where("status = ?", slf.Status)
 	}
 
+	if slf.StatusNot != 0 {
+		db = db.Where("status != ?", slf.StatusNot)
+	}
+
 	return db
 }
 
diff --git a/model/work_order.go b/model/work_order.go
index be00fec..0626042 100644
--- a/model/work_order.go
+++ b/model/work_order.go
@@ -23,6 +23,7 @@
 		StartTime   int64           `gorm:"comment:璁″垝寮�濮嬫椂闂�" json:"startTime"`
 		EndTime     int64           `gorm:"comment:璁″垝缁撴潫鏃堕棿" json:"endTime"`
 		Status      OrderStatus
+		StatusList  []OrderStatus
 	}
 
 	OrderSearch struct {
@@ -40,8 +41,9 @@
 type OrderStatus int
 
 const (
-	OrderStatusUnFinished OrderStatus = 1
-	OrderStatusFinished   OrderStatus = 2
+	OrderStatusWaitProcess OrderStatus = 1
+	OrderStatusProcessing  OrderStatus = 2
+	OrderStatusFinished    OrderStatus = 3
 )
 
 func (slf *Order) TableName() string {
@@ -84,6 +86,11 @@
 	return slf
 }
 
+func (slf *OrderSearch) SetStatusList(statusList []OrderStatus) *OrderSearch {
+	slf.StatusList = statusList
+	return slf
+}
+
 func (slf *OrderSearch) SetPreload(preload bool) *OrderSearch {
 	slf.Preload = preload
 	return slf
@@ -94,11 +101,20 @@
 	return slf
 }
 
+func (slf *OrderSearch) SetId(id uint) *OrderSearch {
+	slf.ID = id
+	return slf
+}
+
 func (slf *OrderSearch) build() *gorm.DB {
 	var db = slf.Orm.Model(&Order{})
 
 	if slf.OrderBy != "" {
 		db = db.Order(slf.OrderBy)
+	}
+
+	if slf.ID != 0 {
+		db = db.Where("id = ?", slf.ID)
 	}
 
 	if slf.WorkOrderID != "" {
@@ -109,6 +125,10 @@
 		db = db.Where("status = ?", slf.Status)
 	}
 
+	if len(slf.StatusList) != 0 {
+		db = db.Where("status != ?", slf.StatusList)
+	}
+
 	if slf.StartTimeMax != 0 {
 		db = db.Where("start_time <= ?", slf.StartTimeMax)
 	}
diff --git a/nsq/msg_handler.go b/nsq/msg_handler.go
index 910f123..be6dea7 100644
--- a/nsq/msg_handler.go
+++ b/nsq/msg_handler.go
@@ -50,7 +50,7 @@
 					if err == gorm.ErrRecordNotFound {
 						var orderRecord model.Order
 						err = structx.AssignTo(task.WorkOrder, &orderRecord)
-						orderRecord.Status = model.OrderStatusUnFinished
+						orderRecord.Status = model.OrderStatusWaitProcess
 						if err != nil {
 							logx.Errorf(" structx.Assign task.Order to orderRecord err: %v", err.Error())
 							return err
@@ -64,7 +64,7 @@
 						EndTime:     procedure.EndTime,
 						WorkOrderID: task.WorkOrder.WorkOrderID,
 						OrderID:     task.WorkOrder.OrderID,
-						Status:      model.ProcedureStatusUnFinished,
+						Status:      model.ProcedureStatusWaitProcess,
 					}
 					procedureData, err := json.Marshal(procedure)
 					procedureRecord.ProcedureData = string(procedureData)
diff --git a/service/task.go b/service/task.go
index 5b7be1c..ac5fdca 100644
--- a/service/task.go
+++ b/service/task.go
@@ -19,9 +19,9 @@
 func (slf TaskService) GetTask() (taskData *response.TaskData, code int) {
 	nowTs := time.Now().Unix()
 	orderSearch := model.NewOrderSearch(nil)
-	orderSearch.SetOrder("created_at asc").
-		SetStartTimeMax(nowTs).
-		SetStatus(model.OrderStatusUnFinished)
+	orderSearch.SetOrder("start_time asc").
+		SetStartTimeMin(nowTs).
+		SetStatusList([]model.OrderStatus{model.OrderStatusWaitProcess, model.OrderStatusProcessing})
 	var (
 		err   error
 		order *model.Order
@@ -34,10 +34,10 @@
 	if err != nil {
 		return nil, ecode.DBErr
 	}
-	procedure, err := model.NewProceduresSearch(nil).
+	procedure, err := model.NewProceduresSearch(nil).SetOrder("start_time asc").
 		SetWorkOrderId(order.WorkOrderID).
 		SetStartTimeMax(nowTs).
-		SetStatus(model.ProcedureStatusUnFinished).
+		SetStatusNot(model.ProcedureStatusFinished).
 		First()
 	if err == gorm.ErrRecordNotFound { //璇ヨ鍗曟湰璁惧鍏ㄩ儴宸ュ簭瀹屾垚锛屾妸璁㈠崟缃负瀹屾垚鐘舵�侊紙鍙槸瀵规湰璁惧瀹屾垚锛�
 		err = nil
@@ -66,8 +66,14 @@
 	return procedure, ecode.OK
 }
 
-func (slf TaskService) UpdateProcedureStatus(id int, status model.ProcedureStatus) error {
-	return model.NewProceduresSearch(nil).SetId(id).UpdateByMap(map[string]interface{}{
+func (slf TaskService) UpdateProcedureStatus(db *gorm.DB, id int, status model.ProcedureStatus) error {
+	return model.NewProceduresSearch(db).SetId(id).UpdateByMap(map[string]interface{}{
+		"status": status,
+	})
+}
+
+func (slf TaskService) UpdateOrderStatus(db *gorm.DB, id uint, status model.OrderStatus) error {
+	return model.NewOrderSearch(db).SetId(id).UpdateByMap(map[string]interface{}{
 		"status": status,
 	})
 }
@@ -76,11 +82,11 @@
 	return model.NewOrderSearch(nil).SetWorkOrderId(workOrderId).First()
 }
 
-// GetComingTask 鑾峰彇鏃堕棿鏈埌鐨勬渶鏃╀换鍔�
-func (slf TaskService) GetComingTask() (workOrder *model.Order, err error) {
+// GetCurrentTask 鑾峰彇寰呭畬鎴愭垨杩涜涓殑浠诲姟锛� 姣忎釜宸ュ崟鍙湁涓�涓伐搴�
+func (slf TaskService) GetCurrentTask() (workOrder *model.Order, err error) {
 	nowTs := time.Now().Unix()
 	orderSearch := model.NewOrderSearch(nil)
-	return orderSearch.SetOrder("created_at asc").
+	return orderSearch.SetOrder("start_time asc").
 		SetStartTimeMin(nowTs).
-		SetStatus(model.OrderStatusUnFinished).First()
+		SetStatusList([]model.OrderStatus{model.OrderStatusWaitProcess, model.OrderStatusProcessing}).First()
 }

--
Gitblit v1.8.0