|
|
|
|
@@ -3,6 +3,7 @@ package task
|
|
|
|
|
import (
|
|
|
|
|
"encoding/json"
|
|
|
|
|
"fmt"
|
|
|
|
|
"sync"
|
|
|
|
|
"time"
|
|
|
|
|
|
|
|
|
|
"git.huangwc.com/pig/pig-farm-controller/internal/domain/device"
|
|
|
|
|
@@ -31,6 +32,9 @@ type ReleaseFeedWeightTask struct {
|
|
|
|
|
|
|
|
|
|
feedPort device.Service
|
|
|
|
|
|
|
|
|
|
// onceParse 保证解析参数只执行一次
|
|
|
|
|
onceParse sync.Once
|
|
|
|
|
|
|
|
|
|
logger *logs.Logger
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@@ -117,45 +121,48 @@ func (r *ReleaseFeedWeightTask) getNowWeight() (float64, error) {
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (r *ReleaseFeedWeightTask) parseParameters() error {
|
|
|
|
|
if r.claimedLog.Task.Parameters == nil {
|
|
|
|
|
r.logger.Errorf("任务 %v: 缺少参数", r.claimedLog.TaskID)
|
|
|
|
|
return fmt.Errorf("任务 %v: 参数不全", r.claimedLog.TaskID)
|
|
|
|
|
}
|
|
|
|
|
var err error
|
|
|
|
|
r.onceParse.Do(func() {
|
|
|
|
|
if r.claimedLog.Task.Parameters == nil {
|
|
|
|
|
r.logger.Errorf("任务 %v: 缺少参数", r.claimedLog.TaskID)
|
|
|
|
|
err = fmt.Errorf("任务 %v: 参数不全", r.claimedLog.TaskID)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
var params ReleaseFeedWeightTaskParams
|
|
|
|
|
err := r.claimedLog.Task.ParseParameters(¶ms)
|
|
|
|
|
if err != nil {
|
|
|
|
|
r.logger.Errorf("任务 %v: 解析参数失败: %v", r.claimedLog.TaskID, err)
|
|
|
|
|
return fmt.Errorf("任务 %v: 解析参数失败: %v", r.claimedLog.TaskID, err)
|
|
|
|
|
}
|
|
|
|
|
var params ReleaseFeedWeightTaskParams
|
|
|
|
|
err := r.claimedLog.Task.ParseParameters(¶ms)
|
|
|
|
|
if err != nil {
|
|
|
|
|
r.logger.Errorf("任务 %v: 解析参数失败: %v", r.claimedLog.TaskID, err)
|
|
|
|
|
err = fmt.Errorf("任务 %v: 解析参数失败: %v", r.claimedLog.TaskID, err)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 校验参数是否存在
|
|
|
|
|
if params.ReleaseWeight == 0 {
|
|
|
|
|
r.logger.Errorf("任务 %v: 参数 release_weight 缺失或无效", r.claimedLog.TaskID)
|
|
|
|
|
return fmt.Errorf("任务 %v: 参数 release_weight 缺失或无效", r.claimedLog.TaskID)
|
|
|
|
|
}
|
|
|
|
|
if params.FeedPortDeviceID == 0 {
|
|
|
|
|
r.logger.Errorf("任务 %v: 参数 feed_port_device_id 缺失或无效", r.claimedLog.TaskID)
|
|
|
|
|
return fmt.Errorf("任务 %v: 参数 feed_port_device_id 缺失或无效", r.claimedLog.TaskID)
|
|
|
|
|
}
|
|
|
|
|
if params.MixingTankDeviceID == 0 {
|
|
|
|
|
r.logger.Errorf("任务 %v: 参数 mixing_tank_device_id 缺失或无效", r.claimedLog.TaskID)
|
|
|
|
|
return fmt.Errorf("任务 %v: 参数 mixing_tank_device_id 缺失或无效", r.claimedLog.TaskID)
|
|
|
|
|
}
|
|
|
|
|
// 校验参数是否存在
|
|
|
|
|
if params.ReleaseWeight == 0 {
|
|
|
|
|
r.logger.Errorf("任务 %v: 参数 release_weight 缺失或无效", r.claimedLog.TaskID)
|
|
|
|
|
err = fmt.Errorf("任务 %v: 参数 release_weight 缺失或无效", r.claimedLog.TaskID)
|
|
|
|
|
}
|
|
|
|
|
if params.FeedPortDeviceID == 0 {
|
|
|
|
|
r.logger.Errorf("任务 %v: 参数 feed_port_device_id 缺失或无效", r.claimedLog.TaskID)
|
|
|
|
|
err = fmt.Errorf("任务 %v: 参数 feed_port_device_id 缺失或无效", r.claimedLog.TaskID)
|
|
|
|
|
}
|
|
|
|
|
if params.MixingTankDeviceID == 0 {
|
|
|
|
|
r.logger.Errorf("任务 %v: 参数 mixing_tank_device_id 缺失或无效", r.claimedLog.TaskID)
|
|
|
|
|
err = fmt.Errorf("任务 %v: 参数 mixing_tank_device_id 缺失或无效", r.claimedLog.TaskID)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
r.releaseWeight = params.ReleaseWeight
|
|
|
|
|
r.mixingTankDeviceID = params.MixingTankDeviceID
|
|
|
|
|
r.feedPortDevice, err = r.deviceRepo.FindByID(params.FeedPortDeviceID)
|
|
|
|
|
if err != nil {
|
|
|
|
|
r.logger.Errorf("任务 %v: 获取设备信息失败: %v", r.claimedLog.TaskID, err)
|
|
|
|
|
return fmt.Errorf("任务 %v: 获取设备信息失败: %v", r.claimedLog.TaskID, err)
|
|
|
|
|
}
|
|
|
|
|
r.releaseWeight = params.ReleaseWeight
|
|
|
|
|
r.mixingTankDeviceID = params.MixingTankDeviceID
|
|
|
|
|
r.feedPortDevice, err = r.deviceRepo.FindByID(params.FeedPortDeviceID)
|
|
|
|
|
if err != nil {
|
|
|
|
|
r.logger.Errorf("任务 %v: 获取设备信息失败: %v", r.claimedLog.TaskID, err)
|
|
|
|
|
err = fmt.Errorf("任务 %v: 获取设备信息失败: %v", r.claimedLog.TaskID, err)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return nil
|
|
|
|
|
})
|
|
|
|
|
return err
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (r *ReleaseFeedWeightTask) OnFailure(executeErr error) {
|
|
|
|
|
r.logger.Errorf("开始善后处理, 日志ID:%v", r.claimedLog.ID)
|
|
|
|
|
r.logger.Errorf("开始善后处理, 日志ID:%v; 错误信息: %v", r.claimedLog.ID, executeErr)
|
|
|
|
|
if r.feedPort != nil {
|
|
|
|
|
err := r.feedPort.Switch(r.feedPortDevice, device.DeviceActionStop)
|
|
|
|
|
if err != nil {
|
|
|
|
|
@@ -166,3 +173,10 @@ func (r *ReleaseFeedWeightTask) OnFailure(executeErr error) {
|
|
|
|
|
}
|
|
|
|
|
r.logger.Errorf("善后处理完成, 日志ID:%v", r.claimedLog.ID)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (r *ReleaseFeedWeightTask) ResolveDeviceIDs() ([]uint, error) {
|
|
|
|
|
if err := r.parseParameters(); err != nil {
|
|
|
|
|
return nil, err
|
|
|
|
|
}
|
|
|
|
|
return []uint{r.feedPortDevice.ID, r.mixingTankDeviceID}, nil
|
|
|
|
|
}
|
|
|
|
|
|