api/v1/plc.go | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
api/v1/task.go | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
model/procedures.go | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
model/work_order.go | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
nsq/msg_handler.go | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
service/task.go | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 |
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() } 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 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 } 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) } 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) 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() }