|
|
@ -1,6 +1,7 @@ |
|
|
|
package implments |
|
|
|
|
|
|
|
import ( |
|
|
|
"LAPP_ACURA_MOM_BACKEND/common" |
|
|
|
baseDal "LAPP_ACURA_MOM_BACKEND/dao/base" |
|
|
|
meDal "LAPP_ACURA_MOM_BACKEND/dao/me" |
|
|
|
dal "LAPP_ACURA_MOM_BACKEND/dao/om" |
|
|
@ -12,6 +13,7 @@ import ( |
|
|
|
meMeta "LAPP_ACURA_MOM_BACKEND/meta/me" |
|
|
|
meta "LAPP_ACURA_MOM_BACKEND/meta/om" |
|
|
|
baseModel "LAPP_ACURA_MOM_BACKEND/models/base" |
|
|
|
channelModel "LAPP_ACURA_MOM_BACKEND/models/channel" |
|
|
|
model "LAPP_ACURA_MOM_BACKEND/models/om" |
|
|
|
"LAPP_ACURA_MOM_BACKEND/utils" |
|
|
|
"github.com/go-xorm/xorm" |
|
|
@ -515,18 +517,14 @@ func (impl *SerialOrderServiceImplement) SingleProductTask(user *global.User, se |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
// ExecuteCrossPlantTask 执行跨工厂任务
|
|
|
|
func (impl *SerialOrderServiceImplement) ExecuteCrossPlantTask(task baseModel.CrossPlanTask) { |
|
|
|
// ExecuteSingleCrossPlantTask 执行跨工厂任务
|
|
|
|
func (impl *SerialOrderServiceImplement) ExecuteSingleCrossPlantTask(user *global.User, task baseModel.CrossPlanTask) error { |
|
|
|
engine := db.Eloquent.Master() |
|
|
|
session := engine.NewSession() |
|
|
|
defer session.Close() |
|
|
|
user := &global.User{ |
|
|
|
PlantNr: task.ToPlantNr, |
|
|
|
UserId: "MultiPlantTask", |
|
|
|
} |
|
|
|
releaseId, err := uuid.NewV4() |
|
|
|
if err != nil { |
|
|
|
return |
|
|
|
return nil |
|
|
|
} |
|
|
|
log, _ := logger.NewLogger("跨工厂生成计划,id:"+releaseId.String(), "CrossPlant") |
|
|
|
taskDao := baseDal.NewCrossPlanTaskDAO(session, user.UserId) |
|
|
@ -535,40 +533,40 @@ func (impl *SerialOrderServiceImplement) ExecuteCrossPlantTask(task baseModel.Cr |
|
|
|
if err != nil { |
|
|
|
task.Status = baseModel.CROSS_TASK_STATUS_ERROR |
|
|
|
task.ErrorMsg = "查询任务项目失败,错误:" + err.Error() |
|
|
|
err = taskDao.UpdateOne(&task) |
|
|
|
if err != nil { |
|
|
|
log.Error("更新任务状态失败, 错误:" + err.Error() + ", 任务ID:" + strconv.Itoa(task.TaskNr)) |
|
|
|
innerErr := taskDao.UpdateOne(&task) |
|
|
|
if innerErr != nil { |
|
|
|
log.Error("更新任务状态失败, 错误:" + innerErr.Error() + ", 任务ID:" + strconv.Itoa(task.TaskNr)) |
|
|
|
} |
|
|
|
return |
|
|
|
return grmi.NewBusinessError(task.ErrorMsg) |
|
|
|
} |
|
|
|
if project == nil { |
|
|
|
task.Status = baseModel.CROSS_TASK_STATUS_ERROR |
|
|
|
task.ErrorMsg = "任务项目不存在, 项目ID:" + task.ProjectId |
|
|
|
err = taskDao.UpdateOne(&task) |
|
|
|
if err != nil { |
|
|
|
log.Error("更新任务状态失败, 错误:" + err.Error() + ", 任务ID:" + strconv.Itoa(task.TaskNr)) |
|
|
|
innerErr := taskDao.UpdateOne(&task) |
|
|
|
if innerErr != nil { |
|
|
|
log.Error("更新任务状态失败, 错误:" + innerErr.Error() + ", 任务ID:" + strconv.Itoa(task.TaskNr)) |
|
|
|
} |
|
|
|
return |
|
|
|
return grmi.NewBusinessError(task.ErrorMsg) |
|
|
|
} |
|
|
|
// 获取生产的物料
|
|
|
|
productIdLi := strings.Split(task.ArtId, ";") |
|
|
|
if len(productIdLi) == 0 { |
|
|
|
task.Status = baseModel.CROSS_TASK_STATUS_ERROR |
|
|
|
task.ErrorMsg = "任务未包含物料数据" |
|
|
|
err = taskDao.UpdateOne(&task) |
|
|
|
if err != nil { |
|
|
|
log.Error("更新任务状态失败, 错误:" + err.Error() + ", 任务ID:" + strconv.Itoa(task.TaskNr)) |
|
|
|
innerErr := taskDao.UpdateOne(&task) |
|
|
|
if innerErr != nil { |
|
|
|
log.Error("更新任务状态失败, 错误:" + innerErr.Error() + ", 任务ID:" + strconv.Itoa(task.TaskNr)) |
|
|
|
} |
|
|
|
return |
|
|
|
return grmi.NewBusinessError(task.ErrorMsg) |
|
|
|
} |
|
|
|
if task.PlanEndTime.Restore().Before(task.PlanStartTime.Restore()) { |
|
|
|
task.Status = baseModel.CROSS_TASK_STATUS_ERROR |
|
|
|
task.ErrorMsg = "任务计划结束时间早于开始时间" |
|
|
|
err = taskDao.UpdateOne(&task) |
|
|
|
if err != nil { |
|
|
|
log.Error("更新任务状态失败, 错误:" + err.Error() + ", 任务ID:" + strconv.Itoa(task.TaskNr)) |
|
|
|
innerErr := taskDao.UpdateOne(&task) |
|
|
|
if innerErr != nil { |
|
|
|
log.Error("更新任务状态失败, 错误:" + innerErr.Error() + ", 任务ID:" + strconv.Itoa(task.TaskNr)) |
|
|
|
} |
|
|
|
return |
|
|
|
return grmi.NewBusinessError(task.ErrorMsg) |
|
|
|
} |
|
|
|
// 获取每个总成当前派工数量
|
|
|
|
releaseQtyStrLi := strings.Split(task.ReleaseQty, ";") |
|
|
@ -580,11 +578,11 @@ func (impl *SerialOrderServiceImplement) ExecuteCrossPlantTask(task baseModel.Cr |
|
|
|
} else if len(releaseQtyStrLi) != len(productIdLi) { |
|
|
|
task.Status = baseModel.CROSS_TASK_STATUS_ERROR |
|
|
|
task.ErrorMsg = "派工数量格式错误" |
|
|
|
err = taskDao.UpdateOne(&task) |
|
|
|
if err != nil { |
|
|
|
log.Error("更新任务状态失败, 错误:" + err.Error() + ", 任务ID:" + strconv.Itoa(task.TaskNr)) |
|
|
|
innerErr := taskDao.UpdateOne(&task) |
|
|
|
if innerErr != nil { |
|
|
|
log.Error("更新任务状态失败, 错误:" + innerErr.Error() + ", 任务ID:" + strconv.Itoa(task.TaskNr)) |
|
|
|
} |
|
|
|
return |
|
|
|
return grmi.NewBusinessError(task.ErrorMsg) |
|
|
|
} |
|
|
|
// 获取当前一共派工的数量
|
|
|
|
var currentQty int |
|
|
@ -593,11 +591,11 @@ func (impl *SerialOrderServiceImplement) ExecuteCrossPlantTask(task baseModel.Cr |
|
|
|
if err != nil { |
|
|
|
task.Status = baseModel.CROSS_TASK_STATUS_ERROR |
|
|
|
task.ErrorMsg = "派工数量格式错误" |
|
|
|
err = taskDao.UpdateOne(&task) |
|
|
|
if err != nil { |
|
|
|
log.Error("更新任务状态失败, 错误:" + err.Error() + ", 任务ID:" + strconv.Itoa(task.TaskNr)) |
|
|
|
innerErr := taskDao.UpdateOne(&task) |
|
|
|
if innerErr != nil { |
|
|
|
log.Error("更新任务状态失败, 错误:" + innerErr.Error() + ", 任务ID:" + strconv.Itoa(task.TaskNr)) |
|
|
|
} |
|
|
|
return |
|
|
|
return grmi.NewBusinessError(task.ErrorMsg) |
|
|
|
} |
|
|
|
releaseQtyLi = append(releaseQtyLi, qty) |
|
|
|
currentQty += qty |
|
|
@ -610,11 +608,11 @@ func (impl *SerialOrderServiceImplement) ExecuteCrossPlantTask(task baseModel.Cr |
|
|
|
if err != nil || schedQty == 0 { |
|
|
|
task.Status = baseModel.CROSS_TASK_STATUS_ERROR |
|
|
|
task.ErrorMsg = "不支持的调度模式" |
|
|
|
err = taskDao.UpdateOne(&task) |
|
|
|
if err != nil { |
|
|
|
log.Error("更新任务状态失败, 错误:" + err.Error() + ", 任务ID:" + strconv.Itoa(task.TaskNr)) |
|
|
|
innerErr := taskDao.UpdateOne(&task) |
|
|
|
if innerErr != nil { |
|
|
|
log.Error("更新任务状态失败, 错误:" + innerErr.Error() + ", 任务ID:" + strconv.Itoa(task.TaskNr)) |
|
|
|
} |
|
|
|
return |
|
|
|
return grmi.NewBusinessError(task.ErrorMsg) |
|
|
|
} |
|
|
|
// 记录生成计划中间的数量
|
|
|
|
type ProductQty struct { |
|
|
@ -635,11 +633,11 @@ func (impl *SerialOrderServiceImplement) ExecuteCrossPlantTask(task baseModel.Cr |
|
|
|
if err != nil { |
|
|
|
task.Status = baseModel.CROSS_TASK_STATUS_ERROR |
|
|
|
task.ErrorMsg = "生成工单工艺失败, 错误:" + err.Error() |
|
|
|
err = taskDao.UpdateOne(&task) |
|
|
|
if err != nil { |
|
|
|
log.Error("更新任务状态失败, 错误:" + err.Error() + ", 任务ID:" + strconv.Itoa(task.TaskNr)) |
|
|
|
innerErr := taskDao.UpdateOne(&task) |
|
|
|
if innerErr != nil { |
|
|
|
log.Error("更新任务状态失败, 错误:" + innerErr.Error() + ", 任务ID:" + strconv.Itoa(task.TaskNr)) |
|
|
|
} |
|
|
|
return |
|
|
|
return grmi.NewBusinessError(task.ErrorMsg) |
|
|
|
} |
|
|
|
productCraftMap[productId] = serialOrderCraft |
|
|
|
} |
|
|
@ -656,11 +654,11 @@ func (impl *SerialOrderServiceImplement) ExecuteCrossPlantTask(task baseModel.Cr |
|
|
|
if err = session.Begin(); err != nil { |
|
|
|
task.Status = baseModel.CROSS_TASK_STATUS_ERROR |
|
|
|
task.ErrorMsg = "开启事务失败, 错误:" + err.Error() |
|
|
|
err = taskDao.UpdateOne(&task) |
|
|
|
if err != nil { |
|
|
|
log.Error("更新任务状态失败, 错误:" + err.Error() + ", 任务ID:" + strconv.Itoa(task.TaskNr)) |
|
|
|
innerErr := taskDao.UpdateOne(&task) |
|
|
|
if innerErr != nil { |
|
|
|
log.Error("更新任务状态失败, 错误:" + innerErr.Error() + ", 任务ID:" + strconv.Itoa(task.TaskNr)) |
|
|
|
} |
|
|
|
return |
|
|
|
return grmi.NewBusinessError(task.ErrorMsg) |
|
|
|
} |
|
|
|
orderCraft := productCraftMap[productQtyCache.ProductId] |
|
|
|
planStartTime := task.PlanStartTime.Restore().Add(time.Duration(currentQty*perDuration) * time.Second) |
|
|
@ -669,11 +667,11 @@ func (impl *SerialOrderServiceImplement) ExecuteCrossPlantTask(task baseModel.Cr |
|
|
|
_ = session.Rollback() |
|
|
|
task.Status = baseModel.CROSS_TASK_STATUS_ERROR |
|
|
|
task.ErrorMsg = "保存工单工艺失败, 错误:" + err.Error() |
|
|
|
err = taskDao.UpdateOne(&task) |
|
|
|
if err != nil { |
|
|
|
log.Error("更新任务状态失败, 错误:" + err.Error() + ", 任务ID:" + strconv.Itoa(task.TaskNr)) |
|
|
|
innerErr := taskDao.UpdateOne(&task) |
|
|
|
if innerErr != nil { |
|
|
|
log.Error("更新任务状态失败, 错误:" + innerErr.Error() + ", 任务ID:" + strconv.Itoa(task.TaskNr)) |
|
|
|
} |
|
|
|
return |
|
|
|
return grmi.NewBusinessError(task.ErrorMsg) |
|
|
|
} |
|
|
|
releaseQtyLi[index] += schedQty |
|
|
|
var totalReleaseQty string |
|
|
@ -702,12 +700,12 @@ func (impl *SerialOrderServiceImplement) ExecuteCrossPlantTask(task baseModel.Cr |
|
|
|
if err != nil { |
|
|
|
_ = session.Rollback() |
|
|
|
log.Error("更新任务状态失败, 错误:" + err.Error() + ", 任务ID:" + strconv.Itoa(task.TaskNr)) |
|
|
|
return |
|
|
|
return err |
|
|
|
} |
|
|
|
_ = session.Commit() |
|
|
|
} |
|
|
|
} |
|
|
|
return |
|
|
|
return nil |
|
|
|
} |
|
|
|
|
|
|
|
// SaveBatchOrderData 保存总成的工艺数据
|
|
|
@ -885,4 +883,68 @@ func (impl *SerialOrderServiceImplement) SaveBatchOrderData(user *global.User, s |
|
|
|
return nil |
|
|
|
} |
|
|
|
|
|
|
|
// SchedCrossPlantTask 调度跨工厂任务
|
|
|
|
func (impl *SerialOrderServiceImplement) SchedCrossPlantTask() error { |
|
|
|
engine := db.Eloquent.Master() |
|
|
|
session := engine.NewSession() |
|
|
|
defer session.Close() |
|
|
|
userId := "MultiPlantTask" |
|
|
|
plantDao := baseDal.NewPlantDAO(session, userId) |
|
|
|
plantLi, err := plantDao.Select(nil, nil) |
|
|
|
if err != nil { |
|
|
|
return err |
|
|
|
} |
|
|
|
for _, plant := range plantLi { |
|
|
|
user := &global.User{ |
|
|
|
PlantNr: plant.PlantNr, |
|
|
|
UserId: userId, |
|
|
|
} |
|
|
|
taskDao := baseDal.NewCrossPlanTaskDAO(session, user.UserId) |
|
|
|
taskLi, err := taskDao.Select([]grmi.Predicate{ |
|
|
|
baseMeta.CrossPlanTask_ToPlantNr.NewPredicate(grmi.Equal, plant.PlantNr), |
|
|
|
baseMeta.CrossPlanTask_Status.NewPredicate(grmi.LessThen, baseModel.CROSS_TASK_STATUS_ACCOMPLISHED), |
|
|
|
}, []grmi.Field{baseMeta.CrossPlanTask_Priority, baseMeta.CrossPlanTask_TaskNr}) |
|
|
|
channel, exist := common.ReleaseTaskChannel[user.PlantNr] |
|
|
|
if !exist { |
|
|
|
channel = channelModel.NewReleaseChannel() |
|
|
|
common.ReleaseTaskChannel[user.PlantNr] = channel |
|
|
|
} |
|
|
|
for _, task := range taskLi { |
|
|
|
err = channel.SendData(task) |
|
|
|
if err != nil { |
|
|
|
return err |
|
|
|
} |
|
|
|
} |
|
|
|
go func(user *global.User) { |
|
|
|
impl.ExecuteCrossPlantTask(user) |
|
|
|
}(user) |
|
|
|
} |
|
|
|
return nil |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
// ExecuteCrossPlantTask 执行跨工厂派工
|
|
|
|
func (impl *SerialOrderServiceImplement) ExecuteCrossPlantTask(user *global.User) { |
|
|
|
log, _ := logger.NewLogger("跨工厂任务", "MultiPlantTask") |
|
|
|
plantNr := user.PlantNr |
|
|
|
channel, exist := common.ReleaseTaskChannel[plantNr] |
|
|
|
if !exist { |
|
|
|
return |
|
|
|
} |
|
|
|
for { |
|
|
|
taskInterface, ok, err := channel.Read() |
|
|
|
if err != nil { |
|
|
|
return |
|
|
|
} |
|
|
|
if !ok { |
|
|
|
continue |
|
|
|
} |
|
|
|
task := taskInterface.(baseModel.CrossPlanTask) |
|
|
|
err = impl.ExecuteSingleCrossPlantTask(user, task) |
|
|
|
if err != nil { |
|
|
|
log.Error("派工异常, 错误:" + err.Error()) |
|
|
|
channel.Close() |
|
|
|
return |
|
|
|
} |
|
|
|
} |
|
|
|
} |