zhangqian
2023-08-27 c6173b62e0fea3116075d56692b73cc0bc624815
逻辑修改
6个文件已修改
191 ■■■■■ 已修改文件
api/v1/plc.go 24 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
api/v1/task.go 96 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
model/procedures.go 15 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
model/work_order.go 24 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
nsq/msg_handler.go 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
service/task.go 28 ●●●●● 补丁 | 查看 | 原始文档 | 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()
}