From 001d1f605c0a275a139f5c8fa66e631eb998e3b9 Mon Sep 17 00:00:00 2001 From: zhangqian <zhangqian@123.com> Date: 星期六, 02 九月 2023 14:35:10 +0800 Subject: [PATCH] 存储全部设备的工序和订单&代码优化 --- service/task.go | 54 +++++++++++++ nsq/msg_handler.go | 84 ++++++++++++--------- model/procedures.go | 2 model/process_model.go | 1 test/msg_handler_test.go | 4 api/v1/task.go | 77 ++---------------- 6 files changed, 116 insertions(+), 106 deletions(-) diff --git a/api/v1/task.go b/api/v1/task.go index d07c123..0a364f5 100644 --- a/api/v1/task.go +++ b/api/v1/task.go @@ -1,12 +1,9 @@ package v1 import ( - "apsClient/conf" "apsClient/constvar" "apsClient/model" - "apsClient/model/common" "apsClient/model/response" - "apsClient/nsq" "apsClient/pkg/contextx" "apsClient/pkg/convertx" "apsClient/pkg/ecode" @@ -14,7 +11,6 @@ "apsClient/pkg/plc" "apsClient/service" "apsClient/service/plc_address" - "encoding/json" "errors" "fmt" "github.com/gin-gonic/gin" @@ -96,60 +92,21 @@ return } - paramsMap := make(map[string]interface{}) - var paramsNumber string - data, err := model.NewProcessModelSearch(). - SetWorkOrder(procedure.WorkOrderID). - SetDevice(procedure.ProceduresInfo.DeviceName). - SetOrderId(procedure.OrderID). - SetProcedure(procedure.ProceduresInfo.ProcedureName). - SetProduct(order.ProductName). - SetOrder("id desc").First() - if err == nil { - err = json.Unmarshal([]byte(data.Params), &data.ParamsMap) - paramsMap = data.ParamsMap - paramsNumber = data.Number - if err != nil { - logx.Errorf("process model json.Unmarshal:%v", err) - ctx.FailWithMsg(ecode.UnknownErr, "鏈幏鍙栧埌宸ヨ壓鍙傛暟") - return - } - } else if err == gorm.ErrRecordNotFound { //濡備綍鏁版嵁搴撴病鏈変粠浜戠鑾峰彇 - caller := nsq.NewCaller(fmt.Sprintf(constvar.NsqTopicProcessParamsRequest, conf.Conf.NsqConf.NodeId), fmt.Sprintf(constvar.NsqTopicProcessParamsResponse, conf.Conf.NsqConf.NodeId)) - var result common.ResponseProcessParams - err = caller.Call(common.RequestProcessParams{ - WorkOrder: procedure.WorkOrderID, - OrderId: procedure.OrderID, - Product: order.ProductName, - Procedure: procedure.ProceduresInfo.ProcedureName, - Device: procedure.ProceduresInfo.DeviceName}, &result, time.Second*3) - if err != nil { - logx.Errorf("TaskStart GetProcessModel error:%v", err.Error()) - ctx.FailWithMsg(ecode.UnknownErr, "鏈幏鍙栧埌宸ヨ壓鍙傛暟") - return - } - if result.ParamsMap == nil { - logx.Errorf("TaskStart GetProcessModel response miss process params:%v", result) - ctx.FailWithMsg(ecode.UnknownErr, "鏈幏鍙栧埌宸ヨ壓鍙傛暟") - return - } - paramsMap = result.ParamsMap - paramsNumber = result.Number - } else { - logx.Errorf("TaskStart GetProcessModel err:%v", err) - ctx.FailWithMsg(ecode.UnknownErr, "鏈幏鍙栧埌宸ヨ壓鍙傛暟") + processModel, err := service.NewTaskService().GetProcessParams(procedure, order) + if err != nil || processModel == nil || processModel.ParamsMap == nil { + ctx.Fail(ecode.UnknownErr) return } - processParamsArr := make([]response.ProcessParams, 0, len(paramsMap)) - for k, v := range paramsMap { + processParamsArr := make([]response.ProcessParams, 0, len(processModel.ParamsMap)) + for k, v := range processModel.ParamsMap { processParamsArr = append(processParamsArr, response.ProcessParams{ Key: k, Value: v, }) } resp := response.ProcessParamsResponse{ - Number: paramsNumber, + Number: processModel.Number, Params: processParamsArr, } ctx.OkWithDetailed(resp) @@ -221,23 +178,9 @@ return } - caller := nsq.NewCaller(fmt.Sprintf(constvar.NsqTopicProcessParamsRequest, conf.Conf.NsqConf.NodeId), fmt.Sprintf(constvar.NsqTopicProcessParamsResponse, conf.Conf.NsqConf.NodeId)) - var result common.ResponseProcessParams - - err = caller.Call(common.RequestProcessParams{ - WorkOrder: procedure.WorkOrderID, - OrderId: procedure.OrderID, - Product: order.ProductName, - Procedure: procedure.ProceduresInfo.ProcedureName, - Device: procedure.ProceduresInfo.DeviceName}, &result, time.Second*3) - if err != nil { - logx.Errorf("SendProcessParams GetProcessModel error:%v", err.Error()) - ctx.FailWithMsg(ecode.UnknownErr, "鏈幏鍙栧埌宸ヨ壓鍙傛暟") - return - } - if result.ParamsMap == nil { - logx.Errorf("SendProcessParams GetProcessModel response miss process params:%v", result) - ctx.FailWithMsg(ecode.UnknownErr, "鏈幏鍙栧埌宸ヨ壓鍙傛暟") + processModel, err := service.NewTaskService().GetProcessParams(procedure, order) + if err != nil || processModel == nil || processModel.ParamsMap == nil { + ctx.Fail(ecode.UnknownErr) return } @@ -263,7 +206,7 @@ return } plcConfig.MaxTryTimes = 2 - err = SendParams(result.ParamsMap, plcConfig) + err = SendParams(processModel.ParamsMap, plcConfig) if err != nil { logx.Errorf("SendProcessParams: %v", err.Error()) ctx.FailWithMsg(ecode.NeedConfirmedErr, "绯熺硶锛屽伐鑹轰笅鍙戝け璐ャ��") diff --git a/model/procedures.go b/model/procedures.go index a8eb474..b15cc0c 100644 --- a/model/procedures.go +++ b/model/procedures.go @@ -15,7 +15,7 @@ ID int `gorm:"primarykey"` WorkOrderID string `gorm:"index;type:varchar(191);not null;comment:宸ュ崟ID" json:"-"` OrderID string `gorm:"index;type:varchar(191);not null;comment:璁㈠崟ID" json:"-"` - DeviceID string `gorm:"type:varchar(191);comment:璁惧ID" json:"deviceId"` + DeviceID string `gorm:"index;type:varchar(191);comment:璁惧ID" json:"deviceId"` StartTime int64 `gorm:"comment:璁″垝寮�濮嬫椂闂�" json:"startTime"` EndTime int64 `gorm:"comment:璁″垝缁撴潫鏃堕棿" json:"endTime"` Status ProcedureStatus diff --git a/model/process_model.go b/model/process_model.go index 9a15886..77cf9af 100644 --- a/model/process_model.go +++ b/model/process_model.go @@ -18,6 +18,7 @@ Device string `gorm:"column:device;type:varchar(255);not null;default '';comment:璁惧" json:"device"` //璁惧 Params string `gorm:"type:text;comment:宸ヨ壓鍙傛暟閿�煎json涓�"` ParamsMap map[string]interface{} `json:"paramsMap" gorm:"-"` + DeviceId string `json:"deviceId" gorm:"-"` //鐢ㄤ簬杩囨护鑾峰彇nsq娑堟伅 } ProcessModelSearch struct { diff --git a/nsq/msg_handler.go b/nsq/msg_handler.go index b7a168b..af96211 100644 --- a/nsq/msg_handler.go +++ b/nsq/msg_handler.go @@ -43,41 +43,48 @@ return err } for _, task := range tasks { + oldWorkOrder, err := model.NewOrderSearch(nil).SetWorkOrderId(task.WorkOrder.WorkOrderID).First() + if oldWorkOrder != nil && oldWorkOrder.WorkOrderID != "" && oldWorkOrder.Status != model.OrderStatusWaitProcess { //宸插紑濮嬬殑宸ュ簭涓嶅彲浠ヤ慨鏀� + continue + } + + procedureRecords := make([]*model.Procedures, 0, len(task.Procedures)) for _, procedure := range task.Procedures { - if procedure.DeviceID == conf.Conf.System.DeviceId { //鍙瓨鍌ㄦ湰璁惧鐨勫伐搴� - err = model.WithTransaction(func(db *gorm.DB) error { - _, err := model.NewOrderSearch(db).SetWorkOrderId(task.WorkOrder.WorkOrderID).First() - if err == gorm.ErrRecordNotFound { - var orderRecord model.Order - err = structx.AssignTo(task.WorkOrder, &orderRecord) - orderRecord.Status = model.OrderStatusWaitProcess - 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{ - StartTime: procedure.StartTime, - EndTime: procedure.EndTime, - WorkOrderID: task.WorkOrder.WorkOrderID, - OrderID: task.WorkOrder.OrderID, - Status: model.ProcedureStatusWaitProcess, - } - 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()) - } + procedureRecord := model.Procedures{ + WorkOrderID: task.WorkOrder.WorkOrderID, + OrderID: task.WorkOrder.OrderID, + DeviceID: procedure.DeviceID, + StartTime: procedure.StartTime, + EndTime: procedure.EndTime, + Status: model.ProcedureStatusWaitProcess, + ProcedureData: "", + ProceduresInfo: common.ProductProcedure{}, } + procedureData, err := json.Marshal(procedure) + if err != nil { + return err + } + procedureRecord.ProcedureData = string(procedureData) + procedureRecords = append(procedureRecords, &procedureRecord) + } + + var orderRecord model.Order + err = structx.AssignTo(task.WorkOrder, &orderRecord) + orderRecord.Status = model.OrderStatusWaitProcess + if err != nil { + logx.Errorf(" structx.Assign task.Order to orderRecord err: %v", err.Error()) + return err + } + + err = model.WithTransaction(func(db *gorm.DB) error { + if err = model.NewOrderSearch(db).Save(&orderRecord); err != nil { + return err + } + return model.NewProceduresSearch(db).CreateBatch(procedureRecords) + }) + if err != nil { + logx.Errorf(" save task message error err: %v", err.Error()) + return err } } return nil @@ -140,9 +147,14 @@ logx.Infof("unmarshal process params sync err :%s", err) return err } - err = model.NewProcessModelSearch().Create(&processModel) - if err != nil { - logx.Infof("save process params err :%s", err) + if processModel.DeviceId != conf.Conf.System.DeviceId { //涓嶆槸鍙戠粰鏈澶囩殑娑堟伅 + return nil + } + if processModel.Params != "" { + err = model.NewProcessModelSearch().Create(&processModel) + if err != nil { + logx.Infof("save process params err :%s", err) + } } //閫氱煡鍥炲鏀跺埌 ReceivedMessageChan <- &ReceivedMessage{ diff --git a/service/task.go b/service/task.go index 5a1634e..43d6819 100644 --- a/service/task.go +++ b/service/task.go @@ -1,9 +1,17 @@ package service import ( + "apsClient/conf" + "apsClient/constvar" "apsClient/model" + "apsClient/model/common" "apsClient/model/response" + "apsClient/nsq" "apsClient/pkg/ecode" + "apsClient/pkg/logx" + "apsClient/pkg/structx" + "encoding/json" + "fmt" "gorm.io/gorm" "time" ) @@ -37,6 +45,7 @@ procedure, err := model.NewProceduresSearch(nil).SetOrder("start_time asc"). SetWorkOrderId(order.WorkOrderID). SetStartTimeMax(nowTs). + SetDeviceId(conf.Conf.System.DeviceId). SetStatusNot(model.ProcedureStatusFinished). First() if err == gorm.ErrRecordNotFound { //璇ヨ鍗曟湰璁惧鍏ㄩ儴宸ュ簭瀹屾垚锛屾妸璁㈠崟缃负瀹屾垚鐘舵�侊紙鍙槸瀵规湰璁惧瀹屾垚锛� @@ -82,6 +91,51 @@ return model.NewOrderSearch(nil).SetWorkOrderId(workOrderId).First() } +func (slf TaskService) GetProcessParams(procedure *model.Procedures, order *model.Order) (processModel *model.ProcessModel, err error) { + data, err := model.NewProcessModelSearch(). + SetWorkOrder(procedure.WorkOrderID). + SetDevice(procedure.ProceduresInfo.DeviceName). + SetOrderId(procedure.OrderID). + SetProcedure(procedure.ProceduresInfo.ProcedureName). + SetProduct(order.ProductName). + SetOrder("id desc").First() + if err != nil && err != gorm.ErrRecordNotFound { + logx.Errorf("TaskStart GetProcessModel err:%v", err) + return nil, err + } + if err == nil { + err = json.Unmarshal([]byte(data.Params), &data.ParamsMap) + if err != nil { + logx.Errorf("process model json.Unmarshal:%v", err) + return + } + return data, nil + } + + if err == gorm.ErrRecordNotFound { //濡傛灉鏁版嵁搴撴病鏈変粠浜戠鑾峰彇 + caller := nsq.NewCaller(fmt.Sprintf(constvar.NsqTopicProcessParamsRequest, conf.Conf.NsqConf.NodeId), fmt.Sprintf(constvar.NsqTopicProcessParamsResponse, conf.Conf.NsqConf.NodeId)) + var result common.ResponseProcessParams + err = caller.Call(common.RequestProcessParams{ + WorkOrder: procedure.WorkOrderID, + OrderId: procedure.OrderID, + Product: order.ProductName, + Procedure: procedure.ProceduresInfo.ProcedureName, + Device: procedure.ProceduresInfo.DeviceName}, &result, time.Second*3) + if err != nil { + logx.Errorf("TaskStart GetProcessModel error:%v", err.Error()) + return + } + if result.ParamsMap == nil { + logx.Errorf("TaskStart GetProcessModel response miss process params:%v", result) + return + } + processModel = new(model.ProcessModel) + err = structx.AssignTo(result, &processModel) + return processModel, err + } + return +} + // GetCurrentTask 鑾峰彇寰呭畬鎴愭垨杩涜涓殑浠诲姟锛� 姣忎釜宸ュ崟鍙湁涓�涓伐搴� func (slf TaskService) GetCurrentTask() (workOrder *model.Order, err error) { nowTs := time.Now().Unix() diff --git a/test/msg_handler_test.go b/test/msg_handler_test.go index d2b0566..7c23cb1 100644 --- a/test/msg_handler_test.go +++ b/test/msg_handler_test.go @@ -79,7 +79,7 @@ Workers: workers, }, {ProcedureID: "ProcedureID 2", ProcedureName: "ProcedureName 2", - DeviceID: "DeviceID1", + DeviceID: "DeviceID2", DeviceName: "DeviceName 1", StartTime: startTime.Unix(), EndTime: endTime.Unix(), @@ -118,7 +118,7 @@ }, { ProcedureID: "ProcedureID 4", ProcedureName: "ProcedureName 4", - DeviceID: "DeviceID1", + DeviceID: "DeviceID2", DeviceName: "DeviceName 1", StartTime: startTime.Unix(), EndTime: endTime.Unix(), -- Gitblit v1.8.0