From 690f87827af019554c57c7e45cf83bf48bec6baa Mon Sep 17 00:00:00 2001 From: zhangxin Date: Mon, 27 Jun 2022 09:43:54 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E5=AE=9A=E6=97=B6=E6=B4=BE?= =?UTF-8?q?=E5=B7=A5=E4=BB=BB=E5=8A=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- services/pln/CustOrder.service.go | 2 + .../implments/CustOrder.CrossPlant.impl.go | 2 + .../implments/CustOrderLogic.service.impl.go | 102 ++++++++++++++++-- task/ApsRelease.go | 6 ++ task/scheduler.go | 1 + 5 files changed, 105 insertions(+), 8 deletions(-) diff --git a/services/pln/CustOrder.service.go b/services/pln/CustOrder.service.go index 34d0ae5..58b71dd 100644 --- a/services/pln/CustOrder.service.go +++ b/services/pln/CustOrder.service.go @@ -435,6 +435,8 @@ type CustOrderService interface { CrossPlantTask() error // ManualReleaseCustOrder 手动派工 ManualReleaseCustOrder(user *global.User, custOrderId string) error + // PutTaskToChannel 根据配置定时向channel中导入派工任务 + PutTaskToChannel() (err error) } diff --git a/services/pln/implments/CustOrder.CrossPlant.impl.go b/services/pln/implments/CustOrder.CrossPlant.impl.go index 3ca7e7e..c72f783 100644 --- a/services/pln/implments/CustOrder.CrossPlant.impl.go +++ b/services/pln/implments/CustOrder.CrossPlant.impl.go @@ -151,6 +151,8 @@ func (impl *CustOrderServiceImplement) GenerateCrossPlantTaskData(task baseModel fmt.Println("通道不存在, 工厂号:" + strconv.Itoa(plantNr)) return nil } + mk := fmt.Sprintf("%d-%s", custOrderLi[0].PlantNr, custOrderLi[0].CustOrderId) + common.ReleasingTaskMap.Store(mk, nil) err = channel.SendData(custOrderLi[0]) if err != nil { fmt.Println("跨工厂发送数据出错:" + err.Error()) diff --git a/services/pln/implments/CustOrderLogic.service.impl.go b/services/pln/implments/CustOrderLogic.service.impl.go index 4857c57..4638d71 100644 --- a/services/pln/implments/CustOrderLogic.service.impl.go +++ b/services/pln/implments/CustOrderLogic.service.impl.go @@ -158,7 +158,7 @@ func (impl *CustOrderServiceImplement) LockCustOrder(user *global.User, custOrde for _, custOrder := range custOrderLi { config := workLineConfigMap[custOrder.WorkLineId] duration := utils.CalcDurationByUom(float64(config.LeadTime), config.TimeUomId) - if custOrder.PlanStartTime.Restore().Add(-duration * time.Second).Unix() < time.Now().Unix() { + if custOrder.PlanStartTime.Restore().Add(-duration*time.Second).Unix() < time.Now().Unix() { newReleaseTaskLi = append(newReleaseTaskLi, custOrder) } } @@ -168,6 +168,8 @@ func (impl *CustOrderServiceImplement) LockCustOrder(user *global.User, custOrde return nil } for _, custOrder := range newReleaseTaskLi { + mk := fmt.Sprintf("%d-%s", custOrder.PlantNr, custOrder.CustOrderId) + common.ReleasingTaskMap.Store(mk, nil) err = channel.SendData(custOrder) if err != nil { return nil @@ -405,7 +407,7 @@ func (impl *CustOrderServiceImplement) AnalysisPlanFromExcel(user *global.User, for _, custOrder := range releaseCustOrderLi { config := workLineConfigMap[custOrder.WorkLineId] duration := utils.CalcDurationByUom(float64(config.LeadTime), config.TimeUomId) - if custOrder.PlanStartTime.Restore().Add(-duration * time.Second).Unix() < time.Now().Unix() { + if custOrder.PlanStartTime.Restore().Add(-duration*time.Second).Unix() < time.Now().Unix() { newReleaseTaskLi = append(newReleaseTaskLi, custOrder) } } @@ -416,6 +418,8 @@ func (impl *CustOrderServiceImplement) AnalysisPlanFromExcel(user *global.User, return nil } for _, custOrder := range newReleaseTaskLi { + mk := fmt.Sprintf("%d-%s", custOrder.PlantNr, custOrder.CustOrderId) + common.ReleasingTaskMap.Store(mk, nil) err = channel.SendData(custOrder) if err != nil { fmt.Println("派工发送数据出错:" + err.Error()) @@ -910,13 +914,13 @@ func (impl *CustOrderServiceImplement) ReleaseCustOrder(user *global.User, custO preSerialNumber, err = snrDao.GetNextSnrWithTime(project.PreOrderSnr, waitReleaseSerialOrderLi[0].PlanStartTime.Restore()) if err != nil { _ = session.Rollback() - return grmi.NewBusinessError("获取流水号失败,错误:" + err.Error()+ ", 流水号Id:" + project.PreOrderSnr) + return grmi.NewBusinessError("获取流水号失败,错误:" + err.Error() + ", 流水号Id:" + project.PreOrderSnr) } } bindPreOrderLi := make([]omModel.PreOrderBindMainOrder, 0) var ( serialNumber string - syncSnr = true + syncSnr = true ) for _, product := range productLi { if product.CtrlStr1 != meModel.PRODUCT_TYPE_PRE { @@ -1156,7 +1160,8 @@ func (impl *CustOrderServiceImplement) ReleaseCustOrder(user *global.User, custO log.Error("客户订单已经派工完成,但是并没有改变客户订单状态, 当前派工客户订单ID:" + custOrderData.CustOrderId) } log.Info("客户订单已经派工完成, 当前派工客户订单ID:" + custOrderData.CustOrderId) - + mk := fmt.Sprintf("%d-%s", custOrderData.PlantNr, custOrderData.CustOrderId) + common.ReleasingTaskMap.Delete(mk) return nil } @@ -1211,6 +1216,8 @@ func (impl *CustOrderServiceImplement) ReleaseTask() error { common.ReleaseTaskChannel[user.PlantNr] = channel } for _, custOrder := range custOrderLi { + mk := fmt.Sprintf("%d-%s", custOrder.PlantNr, custOrder.CustOrderId) + common.ReleasingTaskMap.Store(mk, nil) err = channel.SendData(custOrder) if err != nil { return err @@ -1290,6 +1297,8 @@ func (impl *CustOrderServiceImplement) RepairReleaseFailedTask(user *global.User return grmi.NewBusinessError("查询需要派工的客户订单失败, 错误:" + err.Error()) } for _, custOrder := range custOrderLi { + mk := fmt.Sprintf("%d-%s", custOrder.PlantNr, custOrder.CustOrderId) + common.ReleasingTaskMap.Store(mk, nil) err = channel.SendData(custOrder) if err != nil { _ = session.Rollback() @@ -1415,17 +1424,94 @@ func (impl *CustOrderServiceImplement) ManualReleaseCustOrder(user *global.User, if custOrder.OrderStatus.Status != baseModel.WO_STATUS_LOCKED { return grmi.NewBusinessError("订单不是已锁定, 不能手动派工") } - if custOrder.OrderStatus.Status1 == baseModel.WO_STATUS_RUNNING { - return grmi.NewBusinessError("订单已在派工中") + //if custOrder.OrderStatus.Status1 == baseModel.WO_STATUS_RUNNING { + // return grmi.NewBusinessError("订单已在派工中") + //} + mk := fmt.Sprintf("%d-%s", custOrder.PlantNr, custOrder.CustOrderId) + _, ok := common.ReleasingTaskMap.Load(mk) + if ok { + return grmi.NewBusinessError("订单已在派工队列中") } channel, exist := common.ReleaseTaskChannel[custOrder.PlantNr] if !exist { fmt.Println(fmt.Sprintf("通道不存在, 工厂%d", custOrder.PlantNr)) return nil } + common.ReleasingTaskMap.Store(mk, nil) err = channel.SendData(*custOrder) if err != nil { return grmi.NewBusinessError("派工发送数据出错:" + err.Error()) } return nil -} \ No newline at end of file +} + +// PutTaskToChannel 根据配置定时向channel中导入派工任务 +func (impl *CustOrderServiceImplement) PutTaskToChannel() (err error) { + engine := db.Eloquent.Master() + session := engine.NewSession() + defer session.Close() + log, _ := logger.NewLogger("定时派工", "RELEASE") + userId := "System" + defer func() { + if err != nil { + log.Error("执行失败, 错误:" + err.Error()) + } + }() + plantDao := baseDal.NewPlantDAO(session, userId) + plantLi, err := plantDao.Select(nil, nil) + if err != nil { + return err + } + for _, plant := range plantLi { + user := &global.User{ + UserId: "System", + PlantNr: plant.PlantNr, + } + configDao := dal.NewReleaseTaskConfigDAO(session, user.PlantNr, user.UserId) + configLi, err := configDao.Select([]grmi.Predicate{meta.ReleaseTaskConfig_BusinessObjType.NewPredicate(grmi.Equal, model.CONFIG_TYPE_WORK_LINE)}, nil) + if err != nil { + return err + } + configMap := make(map[string]model.ReleaseTaskConfig) + for _, config := range configLi { + configMap[config.BusinessObjId] = config + } + custOrderDao := dal.NewCustOrderDAO(session, user.PlantNr, user.UserId) + custOrderLi, err := custOrderDao.SelectNeedReleaseCustOrder() + if err != nil { + return err + } + sort.Slice(custOrderLi, func(i, j int) bool { + itemI := custOrderLi[i] + itemJ := custOrderLi[j] + iUnix := itemI.PlanStartTime.Restore().Unix() + jUnix := itemJ.PlanStartTime.Restore().Unix() + return iUnix < jUnix + }) + channel, exist := common.ReleaseTaskChannel[plant.PlantNr] + if !exist { + return grmi.NewBusinessError(fmt.Sprintf("通道不存在, 工厂%d", plant.PlantNr)) + } + for _, custOrder := range custOrderLi { + mk := fmt.Sprintf("%d-%s", custOrder.PlantNr, custOrder.CustOrderId) + _, ok := common.ReleasingTaskMap.Load(mk) + if ok { + continue + } + config, exist := configMap[custOrder.WorkLineId] + if !exist { + return grmi.NewBusinessError(fmt.Sprintf("产线%s没有派工配置", custOrder.WorkLineId)) + } + duration := utils.CalcDurationByUom(float64(config.LeadTime), config.TimeUomId) + if custOrder.PlanStartTime.Restore().Add(-duration*time.Second).Unix() > time.Now().Unix() { + continue + } + common.ReleasingTaskMap.Store(mk, nil) + err = channel.SendData(custOrder) + if err != nil { + return grmi.NewBusinessError("派工发送数据出错:" + err.Error()) + } + } + } + return nil +} diff --git a/task/ApsRelease.go b/task/ApsRelease.go index e50d8ec..1058e8b 100644 --- a/task/ApsRelease.go +++ b/task/ApsRelease.go @@ -20,4 +20,10 @@ func StartCrossPlantTask() error { custSvr := pln.NewCustOrderService() err := custSvr.CrossPlantTask() return err +} + +func StartTimingPutTaskToChannel() { + // 异步派工 + custSvr := pln.NewCustOrderService() + _ = custSvr.PutTaskToChannel() } \ No newline at end of file diff --git a/task/scheduler.go b/task/scheduler.go index 3fb8782..6c78455 100644 --- a/task/scheduler.go +++ b/task/scheduler.go @@ -41,6 +41,7 @@ func Start() error { if err != nil { return err } + err = c.AddFunc("0 * * * * ?", StartTimingPutTaskToChannel) c.Start() select {} }