From 986ce118818cadd908df66a336b6f30b528d5533 Mon Sep 17 00:00:00 2001 From: louwenzhi Date: Wed, 28 Jul 2021 10:32:50 +0800 Subject: [PATCH] =?UTF-8?q?pm=20=20=E7=94=9F=E6=88=90=E5=B7=A5=E5=8D=95?= =?UTF-8?q?=E9=80=BB=E8=BE=91=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- dao/base/WorkCalendarLst.dao.go | 42 ++ .../implments/WorkCalendarLst.dao.impl.go | 34 + task/task.go | 581 ++++++++++++++++- web/models/pm_wo_model.go | 582 +----------------- 4 files changed, 665 insertions(+), 574 deletions(-) diff --git a/dao/base/WorkCalendarLst.dao.go b/dao/base/WorkCalendarLst.dao.go index e3aa70e..3dd7dba 100644 --- a/dao/base/WorkCalendarLst.dao.go +++ b/dao/base/WorkCalendarLst.dao.go @@ -79,6 +79,48 @@ type WorkCalendarLstDAO interface { * ******************************************************************************/ SelectOne(int, grmi.Date) (*model.WorkCalendarLst, error) + /****************************************************************************** + * + * @Function Name : IsWorkDate + *----------------------------------------------------------------------------- + * + * @Description : 查找指定键的WorkCalendarLst + * + * @Function Parameters : 主键 + * + * @Function Parameters : 主键 + * + * @Return Value : 查找到的WorkCalendarLst + * + * @Return Value : 执行时发生的错误 + * + * @Author : 代码生成器创建 + * + * @Date : 2021-04-16 10:03:06 + * + ******************************************************************************/ + IsWorkDate(string) bool + /****************************************************************************** + * + * @Function Name : SelectNearWorkDate + *----------------------------------------------------------------------------- + * + * @Description : 查找指定键的WorkCalendarLst + * + * @Function Parameters : 主键 + * + * @Function Parameters : 主键 + * + * @Return Value : 查找到的WorkCalendarLst + * + * @Return Value : 执行时发生的错误 + * + * @Author : 代码生成器创建 + * + * @Date : 2021-04-16 10:03:06 + * + ******************************************************************************/ + SelectNearWorkDate(string) (*model.WorkCalendarLst, error) /****************************************************************************** * * @Function Name : UpdateOne diff --git a/dao/base/implments/WorkCalendarLst.dao.impl.go b/dao/base/implments/WorkCalendarLst.dao.impl.go index cc4c724..e6522cc 100644 --- a/dao/base/implments/WorkCalendarLst.dao.impl.go +++ b/dao/base/implments/WorkCalendarLst.dao.impl.go @@ -98,6 +98,40 @@ func (impl *WorkCalendarLstDAOImplement) SelectOne(workCalendarNr int, workDate return &data, nil } +/****************************************************************************** + * + * @Reference LAPP_GAAS_GFrame_BACKEND/dao/base/WorkCalendarLstDAO.IsWorkDate + * + ******************************************************************************/ +func (impl *WorkCalendarLstDAOImplement) IsWorkDate(workDate string) bool { + var data model.WorkCalendarLst + ok, err := impl.session.Table(impl.meta.TableName).Where("WorkDate = ?", workDate).Get(&data) + if err != nil { + return false + } + if !ok { + return false + } + return true +} + +/****************************************************************************** + * + * @Reference LAPP_GAAS_GFrame_BACKEND/dao/base/WorkCalendarLstDAO.SelectNearWorkDate + * + ******************************************************************************/ +func (impl *WorkCalendarLstDAOImplement) SelectNearWorkDate(workDate string) (*model.WorkCalendarLst, error) { + var data model.WorkCalendarLst + ok, err := impl.session.Table(impl.meta.TableName).Where("WorkDate > ?", workDate).Asc("WorkDate").Get(&data) + if err != nil { + return nil, grmi.NewDataBaseError(err) + } + if !ok { + return nil, nil + } + return &data, nil +} + /****************************************************************************** * * @Reference LAPP_GAAS_GFrame_BACKEND/dao/base/WorkCalendarLstDAO.UpdateOne diff --git a/task/task.go b/task/task.go index 384c571..500615a 100644 --- a/task/task.go +++ b/task/task.go @@ -1,18 +1,591 @@ package task import ( + dal "LAPP_GAAS_GFrame_BACKEND/dao/base" + "LAPP_GAAS_GFrame_BACKEND/db" + "LAPP_GAAS_GFrame_BACKEND/utils" + "LAPP_GAAS_GFrame_BACKEND/web/middleware/glog" "LAPP_GAAS_GFrame_BACKEND/web/models" + "log" + "context" "time" ) func CreateTask() { - tick := time.Tick(600 * time.Second) + tick := time.Tick(60 * time.Second) for { select { case <-tick: - pm := new(models.PmWo) - pm.Finr = 100 - pm.CreateOrder() + CreateOrder() + } + } +} + +//结构体 +type TaskData struct { + TaskType string + PmAsset models.PmAsset + PmTemplate models.PmTemplate + PmService models.PmService +} + +var taskChan = make(chan TaskData, 1000) //定义一个调度任务通道 + +/**** +*生成维护工单 +***************/ +func CreateOrder() { + + //创建继承Baxkground的子节点Context + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + go doSth(ctx) + + data := make([]models.CreateData, 0) + //第一步,多表联查出所有的数据 + engine := db.Eloquent.Master() + query := engine.Table("pm_asset") + query = query.Join("INNER", "pm_asset_templatelst", "pm_asset.finr = pm_asset_templatelst.finr and pm_asset.assetid = pm_asset_templatelst.assetid") + query = query.Join("INNER", "pm_template", "pm_template.finr = pm_asset_templatelst.finr and pm_template.maintemplatenr = pm_asset_templatelst.maintemplatenr") + query = query.Join("INNER", "pm_template_servicelst", "pm_template.finr = pm_template_servicelst.finr and pm_template.maintemplatenr = pm_template_servicelst.maintemplatenr") + query = query.Join("INNER", "pm_service", "pm_service.finr = pm_template_servicelst.finr and pm_service.mainserviceid = pm_template_servicelst.mainservicenr") + + query = query.Where("pm_asset.finr = ? and pm_service.schedtype = ?", 100,"AUTO") + err := query.Find(&data) + if err != nil { + return + } + //第二步,把所有的服务调度放到channel + for _, v := range data { + //判断激活状态 + if utils.ValueIsEmpty(v.PmService.Enabled) { + continue + } + dataone := TaskData{} + dataone.PmService = v.PmService + dataone.PmTemplate = v.PmTemplate + dataone.PmAsset = v.PmAsset + //判断taskType + if v.PmService.Maintbydate > 0 { + dataone.TaskType = "A" //A是按照日期维护 + } else if v.PmService.Maintbyhour > 0 { + dataone.TaskType = "B" //B是按照小时维护 + } else if v.PmService.Maintbymileage > 0 { + dataone.TaskType = "C" //C是按照仪表值维护 + } else if v.PmService.Needschedule > 0 { + dataone.TaskType = "D" //D是按照调度维护 + } else { + continue + } + taskChan <- dataone + } +} + +//生成任务工单 +func doSth(ctx context.Context) { + //第三步,启动协程,从channel里读取数据,根据服务维护日期进入不同的方法里 + for { + select { + case <-ctx.Done(): + return + case task, ok := <-taskChan: + + if !ok { + log.Println("调度生成终止") + return //停机退出 + } + switch task.TaskType { + case "A": + //当前零点时间 + today := utils.GetZeroTime(time.Now()) + //逻辑:判断是否到了维护时间,(当前时间戳-起始时间戳)%间隔时间 + t1 := utils.TimeFormat(time.Now(), "yyyyMMdd") + t2 := task.PmService.Duedateon + time1, _ := utils.TimeParseyyyyMMdd(t1) + time2, _ := utils.TimeParseyyyyMMdd(t2) + timelen := int(time1.Unix()) - int(time2.Unix()) + timeunit := task.PmService.Duedateinterval + glog.InfoExtln("维护工单A", "Mainservicenr:", task.PmService.Mainserviceid) + glog.InfoExtln("维护工单A", "t1:", t1) + glog.InfoExtln("维护工单A", "t2:", task.PmService.Duedateon) + glog.InfoExtln("维护工单A", "timelen:", timelen) + glog.InfoExtln("维护工单A", "timeunit:", timeunit) + glog.InfoExtln("维护工单A", "res:", ((timelen / 86400) % timeunit)) + if res := ((timelen / 86400) % timeunit); res == 0 { + + //判断是否已经生成了维护工单,如果生成了,跳过 + pms := new(models.PmWo) + pms.Finr = task.PmService.Finr + pms.Mainservicenr = task.PmService.Mainserviceid + pms.Assetid = task.PmAsset.Assetid + tem, err := pms.SelectPmWoOne() + if err != nil { + glog.InfoExtln("维护工单A", "tem.Mainservicenr:", tem.Mainservicenr) + continue + } + + //判断是否添加了服务 + t2now, _ := utils.TimeParse(tem.Schedbegtime) + endtime := t2now.AddDate(0, 0, timeunit) + //先把时间字符串格式化成相同的时间类型 + nowtime, _ := utils.TimeParseyyyyMMdd(t1) + + if nowtime.Before(endtime) { + //处理逻辑 + glog.InfoExtln("维护工单A", "nowtime:", nowtime) + glog.InfoExtln("维护工单A", "endtime:", endtime) + continue + } + + glog.InfoExtln("维护工单A", "endtime:", endtime) + + snr := new(models.Snrtab) + snr.Finr = 100 + //生成ID + woid, err := snr.GetNextSnr("WOID") + if err != nil { + continue + } + //符合逻辑生成维护工单 + pm := new(models.PmWo) + pm.Finr = task.PmService.Finr + pm.Maintwoid = woid + pm.Mainservicenr = task.PmService.Mainserviceid + pm.Descr = task.PmService.Descr + pm.Status = 26 + pm.Priority = task.PmService.Priority + pm.Assetid = task.PmAsset.Assetid + pm.Plbegdat = utils.TimeFormat(time.Now(), "yyyyMMdd") + pm.Schedbegtime = utils.TimeFormat(today, "yyyyMMddHHmmss") + endtime = today.AddDate(0, 0, timeunit) + pm.Schedendtime = utils.TimeFormat(endtime, "yyyyMMddHHmmss") + pm.Actbegtime = utils.TimeFormat(today, "yyyyMMddHHmmss") + pm.Actendtime = utils.TimeFormat(endtime, "yyyyMMddHHmmss") + //查询当天是否是工作日,如果是跳过 + engine := db.Eloquent.Master() + session := engine.NewSession() + defer session.Close() + dao := dal.NewWorkCalendarLstDAO(session, task.PmAsset.Finr, "pm_service") + ok := dao.IsWorkDate(t1) + if !ok{ + result,err :=dao.SelectNearWorkDate(t1) + if err != nil { + continue + } + if result == nil{ + continue + }else{ + Acttime := result.WorkDate.Restore() + pm.Actbegtime = utils.TimeFormat(Acttime, "yyyyMMddHHmmss") + Actendtime := Acttime.AddDate(0,0,timeunit) + glog.InfoExtln("维护工单A", "Actendtime:", Actendtime) + pm.Actendtime = utils.TimeFormat(Actendtime, "yyyyMMddHHmmss") + } + } + + pm.Mainttype = task.PmService.Mainttype + pm.Credatuz = utils.TimeFormat(time.Now(), "yyyyMMddHHmmss") + pm.Lastmodif = utils.TimeFormat(time.Now(), "yyyyMMddHHmmss") + err = pm.Add() + if err != nil { + continue + } + me := new(models.PmServiceAttrlst) + me.Finr = task.PmService.Finr + me.Mainserviceid = task.PmService.Mainserviceid + data, err := me.SelectAll() + if err != nil { + continue + } + //生成属性 + for _, v := range data { + at := new(models.PmWoAttrlst) + at.Finr = v.Finr + at.Descr = v.Descr + at.Mainservicenr = v.Mainserviceid + at.Maintwoid = woid + at.Pos = v.Pos + at.Parameter = v.Parameter + at.Paravalue = v.Paravalue + at.Attrnr = v.Attrnr + at.Credatuz = utils.TimeFormat(time.Now(), "yyyyMMddHHmmss") + at.Lastmodif = utils.TimeFormat(time.Now(), "yyyyMMddHHmmss") + err := at.Add() + if err != nil { + continue + } + } + } + case "B": + today := utils.TimeFormat(time.Now(), "yyyyMMdd") + //查询当天是否是工作日,如果是跳过 + engine := db.Eloquent.Master() + session := engine.NewSession() + defer session.Close() + dao := dal.NewWorkCalendarLstDAO(session, task.PmAsset.Finr, "pm_service") + ok := dao.IsWorkDate(today) + if !ok{ + continue + } + + //逻辑:起始时间+间隔时间, + t1 := utils.TimeFormat(time.Now(), "yyyyMMddHHmmss") + //判断是否已经生成了维护工单,如果生成了,跳过 + pms := new(models.PmWo) + pms.Finr = task.PmService.Finr + pms.Mainservicenr = task.PmService.Mainserviceid + pms.Assetid = task.PmAsset.Assetid + tem, err := pms.SelectPmWoOne() + if err != nil { + glog.InfoExtln("维护工单B", "err:", err) + continue + } + glog.InfoExtln("维护工单B", "tem:", tem) + time2, _ := utils.TimeParse(tem.Schedbegtime) + time1, _ := utils.TimeParse(t1) + timelen := int(time1.Unix()) - int(time2.Unix()) + timeunit := task.PmService.Duehourinterval + + glog.InfoExtln("维护工单B", "Mainservicenr:", task.PmService.Mainserviceid) + glog.InfoExtln("维护工单B", "tem.Schedbegtime:", tem.Schedbegtime) + glog.InfoExtln("维护工单B", "timelen:", timelen) + glog.InfoExtln("维护工单B", "timeunit:", timeunit) + if (timelen - timeunit*3600) > 0 { + + snr := new(models.Snrtab) + snr.Finr = 100 + //生成ID + woid, err := snr.GetNextSnr("WOID") + if err != nil { + glog.InfoExtln("维护工单B", "err:", err) + continue + } + + //查询当天是否是工作日,如果是跳过 + engine := db.Eloquent.Master() + session := engine.NewSession() + defer session.Close() + dao := dal.NewWorkCalendarLstDAO(session, task.PmAsset.Finr, "pm_service") + res := dao.IsWorkDate(today) + if !res{ + continue + } + + //符合逻辑生成维护工单 + pm := new(models.PmWo) + pm.Finr = task.PmService.Finr + pm.Maintwoid = woid + pm.Mainservicenr = task.PmService.Mainserviceid + pm.Descr = task.PmService.Descr + pm.Status = 26 + pm.Priority = task.PmService.Priority + pm.Assetid = task.PmAsset.Assetid + pm.Plbegdat = utils.TimeFormat(time.Now(), "yyyyMMdd") + timeNow := time.Now() + pm.Schedbegtime = utils.TimeFormat(timeNow, "yyyyMMddHHmmss") + //计算结束时间 + endtime := timeNow.Add(time.Duration(timeunit)*time.Hour) + glog.InfoExtln("维护工单B", "timeunit:", timeunit) + pm.Schedendtime = utils.TimeFormat(endtime, "yyyyMMddHHmmss") + pm.Actbegtime = utils.TimeFormat(timeNow, "yyyyMMddHHmmss") + pm.Actendtime = utils.TimeFormat(endtime, "yyyyMMddHHmmss") + pm.Mainttype = task.PmService.Mainttype + pm.Credatuz = utils.TimeFormat(timeNow, "yyyyMMddHHmmss") + pm.Lastmodif = utils.TimeFormat(timeNow, "yyyyMMddHHmmss") + err = pm.Add() + if err != nil { + glog.InfoExtln("维护工单B", "err:", err) + continue + } + me := new(models.PmServiceAttrlst) + me.Finr = task.PmService.Finr + me.Mainserviceid = task.PmService.Mainserviceid + data, err := me.SelectAll() + if err != nil { + glog.InfoExtln("维护工单B", "err:", err) + continue + } + //生成属性 + for _, v := range data { + at := new(models.PmWoAttrlst) + at.Finr = v.Finr + at.Descr = v.Descr + at.Mainservicenr = v.Mainserviceid + at.Maintwoid = woid + at.Pos = v.Pos + at.Parameter = v.Parameter + at.Paravalue = v.Paravalue + at.Attrnr = v.Attrnr + at.Credatuz = utils.TimeFormat(time.Now(), "yyyyMMddHHmmss") + at.Lastmodif = utils.TimeFormat(time.Now(), "yyyyMMddHHmmss") + err := at.Add() + if err != nil { + glog.InfoExtln("维护工单B", "err:", err) + continue + } + } + } + case "C": + today := utils.TimeFormat(time.Now(), "yyyyMMdd") + //查询当天是否是工作日,如果是跳过 + engine := db.Eloquent.Master() + session := engine.NewSession() + defer session.Close() + dao := dal.NewWorkCalendarLstDAO(session, task.PmAsset.Finr, "pm_service") + ok := dao.IsWorkDate(today) + if !ok{ + continue + } + //逻辑:仪表值 + //第一步:查询资产阈值表,判断是否是触发状态 + pma := new(models.PmAssetKpi) + pma.Finr = task.PmAsset.Finr + pma.Mainserviceid = utils.ValueToString(task.PmService.Mainserviceid, "") + info, err := pma.SelectAll() + if err != nil { + continue + } + for _, pmaInfo := range info { + switch pmaInfo.Kpitype { + case 1: + if pmaInfo.Triggerstatus == 1 { + continue + } + if pmaInfo.Thresholdval < pmaInfo.Actualval { + continue + } + + //第二步:生成维护工单, + //逻辑:根据调度时间维护 + snr := new(models.Snrtab) + snr.Finr = 100 + //生成ID + woid, err := snr.GetNextSnr("WOID") + log.Printf("流水号id:%v", woid) + if err != nil { + return + } + //符合逻辑生成维护工单 + pm := new(models.PmWo) + pm.Finr = task.PmService.Finr + pm.Maintwoid = woid + pm.Mainservicenr = task.PmService.Mainserviceid + pm.Descr = task.PmService.Descr + pm.Status = 26 + pm.Priority = task.PmService.Priority + pm.Assetid = task.PmAsset.Assetid + pm.Plbegdat = utils.TimeFormat(time.Now(), "yyyyMMdd") + pm.Schedbegtime = utils.TimeFormat(time.Now(), "yyyyMMddHHmmss") + timenow := utils.ValueToString(task.PmService.Maintimelen, "") + m, _ := time.ParseDuration(timenow + "h") + pm.Schedendtime = utils.TimeFormat(time.Now().Add(m), "yyyyMMddHHmmss") + pm.Actbegtime = pm.Schedbegtime + pm.Actendtime = pm.Schedendtime + pm.Mainttype = task.PmService.Mainttype + pm.Credatuz = utils.TimeFormat(time.Now(), "yyyyMMddHHmmss") + pm.Lastmodif = utils.TimeFormat(time.Now(), "yyyyMMddHHmmss") + err = pm.Add() + if err != nil { + continue + } + me := new(models.PmServiceAttrlst) + me.Finr = task.PmService.Finr + me.Mainserviceid = task.PmService.Mainserviceid + data, err := me.SelectAll() + if err != nil { + continue + } + //生成属性 + for _, v := range data { + at := new(models.PmWoAttrlst) + at.Finr = v.Finr + at.Descr = v.Descr + at.Mainservicenr = v.Mainserviceid + at.Maintwoid = woid + at.Pos = v.Pos + at.Parameter = v.Parameter + at.Paravalue = v.Paravalue + at.Attrnr = v.Attrnr + at.Credatuz = utils.TimeFormat(time.Now(), "yyyyMMddHHmmss") + at.Lastmodif = utils.TimeFormat(time.Now(), "yyyyMMddHHmmss") + err := at.Add() + if err != nil { + continue + } + } + //第三步:锁定触发器状态 + pmu := new(models.PmAssetKpi) + pmu.Finr = 100 + pmu.Triggerstatus = 1 + pmu.Assetid = utils.ValueToString(task.PmAsset.Assetid, "") + err = pma.Update() + if err != nil { + continue + } + case 2: + if pmaInfo.Counterval < pmaInfo.Countercycleval { + continue + } + //第二步:生成维护工单, + //逻辑:根据调度时间维护 + snr := new(models.Snrtab) + snr.Finr = 100 + //生成ID + woid, err := snr.GetNextSnr("WOID") + log.Printf("流水号id:%v", woid) + if err != nil { + return + } + //符合逻辑生成维护工单 + pm := new(models.PmWo) + pm.Finr = task.PmService.Finr + pm.Maintwoid = woid + pm.Mainservicenr = task.PmService.Mainserviceid + pm.Descr = task.PmService.Descr + pm.Status = 26 + pm.Priority = task.PmService.Priority + pm.Assetid = task.PmAsset.Assetid + pm.Plbegdat = utils.TimeFormat(time.Now(), "yyyyMMdd") + pm.Schedbegtime = utils.TimeFormat(time.Now(), "yyyyMMddHHmmss") + timenow := utils.ValueToString(task.PmService.Maintimelen, "") + m, _ := time.ParseDuration(timenow + "h") + pm.Schedendtime = utils.TimeFormat(time.Now().Add(m), "yyyyMMddHHmmss") + pm.Actbegtime = pm.Schedbegtime + pm.Actendtime = pm.Schedendtime + pm.Mainttype = task.PmService.Mainttype + pm.Credatuz = utils.TimeFormat(time.Now(), "yyyyMMddHHmmss") + pm.Lastmodif = utils.TimeFormat(time.Now(), "yyyyMMddHHmmss") + err = pm.Add() + if err != nil { + continue + } + me := new(models.PmServiceAttrlst) + me.Finr = task.PmService.Finr + me.Mainserviceid = task.PmService.Mainserviceid + data, err := me.SelectAll() + if err != nil { + continue + } + //生成属性 + for _, v := range data { + at := new(models.PmWoAttrlst) + at.Finr = v.Finr + at.Descr = v.Descr + at.Mainservicenr = v.Mainserviceid + at.Maintwoid = woid + at.Pos = v.Pos + at.Parameter = v.Parameter + at.Paravalue = v.Paravalue + at.Attrnr = v.Attrnr + at.Credatuz = utils.TimeFormat(time.Now(), "yyyyMMddHHmmss") + at.Lastmodif = utils.TimeFormat(time.Now(), "yyyyMMddHHmmss") + err := at.Add() + if err != nil { + continue + } + } + //第三步:计数清零 + pmu := new(models.PmAssetKpi) + pmu.Finr = 100 + pmu.Countercycleval = 1 + pmu.Assetid = utils.ValueToString(task.PmAsset.Assetid, "") + err = pma.Update() + if err != nil { + continue + } + } + } + + case "D": + today := utils.TimeFormat(time.Now(), "yyyyMMdd") + //查询当天是否是工作日,如果是跳过 + engine := db.Eloquent.Master() + session := engine.NewSession() + defer session.Close() + dao := dal.NewWorkCalendarLstDAO(session, task.PmAsset.Finr, "pm_service") + ok := dao.IsWorkDate(today) + if !ok{ + continue + } + //逻辑:起始时间+间隔时间, + //判断是否已经生成了维护工单,如果生成了,跳过 + pms := new(models.PmWo) + pms.Finr = task.PmService.Finr + pms.Mainservicenr = task.PmService.Mainserviceid + pms.Assetid = task.PmAsset.Assetid + tem, err := pms.SelectPmWoOne() + if err != nil { + continue + } + time2, _ := utils.TimeParse(tem.Schedbegtime) + time1, _ := utils.TimeParseyyyyMMdd(today) + timelen := int(time1.Unix()) - int(time2.Unix()) + if err != nil { + continue + } + if timelen >= 0 { + //逻辑:根据调度时间维护 + snr := new(models.Snrtab) + snr.Finr = 100 + //生成ID + woid, err := snr.GetNextSnr("WOID") + log.Printf("流水号id:%v", woid) + if err != nil { + return + } + //符合逻辑生成维护工单 + pm := new(models.PmWo) + pm.Finr = task.PmService.Finr + pm.Maintwoid = woid + pm.Mainservicenr = task.PmService.Mainserviceid + pm.Descr = task.PmService.Descr + pm.Status = 26 + pm.Priority = task.PmService.Priority + pm.Assetid = task.PmAsset.Assetid + pm.Plbegdat = utils.TimeFormat(time.Now(), "yyyyMMdd") + pm.Schedbegtime = utils.TimeFormat(time.Now(), "yyyyMMddHHmmss") + timenow := utils.ValueToString(task.PmService.Maintimelen, "") + m, _ := time.ParseDuration(timenow + "h") + pm.Schedendtime = utils.TimeFormat(time.Now().Add(m), "yyyyMMddHHmmss") + pm.Actbegtime = pm.Schedbegtime + pm.Actendtime = pm.Schedendtime + pm.Mainttype = task.PmService.Mainttype + pm.Credatuz = utils.TimeFormat(time.Now(), "yyyyMMddHHmmss") + pm.Lastmodif = utils.TimeFormat(time.Now(), "yyyyMMddHHmmss") + err = pm.Add() + if err != nil { + continue + } + me := new(models.PmServiceAttrlst) + me.Finr = task.PmService.Finr + me.Mainserviceid = task.PmService.Mainserviceid + data, err := me.SelectAll() + if err != nil { + continue + } + //生成属性 + for _, v := range data { + at := new(models.PmWoAttrlst) + at.Finr = v.Finr + at.Descr = v.Descr + at.Mainservicenr = v.Mainserviceid + at.Maintwoid = woid + at.Pos = v.Pos + at.Parameter = v.Parameter + at.Paravalue = v.Paravalue + at.Attrnr = v.Attrnr + at.Credatuz = utils.TimeFormat(time.Now(), "yyyyMMddHHmmss") + at.Lastmodif = utils.TimeFormat(time.Now(), "yyyyMMddHHmmss") + err := at.Add() + if err != nil { + continue + } + } + } + + default: + //进行非抢占式任务 + } } } } diff --git a/web/models/pm_wo_model.go b/web/models/pm_wo_model.go index 0d1b745..9ec3c1c 100644 --- a/web/models/pm_wo_model.go +++ b/web/models/pm_wo_model.go @@ -3,12 +3,8 @@ package models import ( "LAPP_GAAS_GFrame_BACKEND/db" "LAPP_GAAS_GFrame_BACKEND/utils" - "LAPP_GAAS_GFrame_BACKEND/web/middleware/glog" - "github.com/go-xorm/xorm" - "context" "errors" "fmt" - "log" "strconv" "strings" "time" @@ -83,91 +79,24 @@ func (t *PmWo) Add() error { return nil } -//增 -func (t *PmWo) AddSession(session *xorm.Session) error { - count := new(PmWo) - affw, err := session.Table("pm_wo").ID(core.PK{t.Finr, t.Maintwoid}).Count(count) - if err != nil { - return err - } - if affw > 0 { - return errors.New("数据已经存在!") - } - _, err = session.Table("pm_wo").Insert(t) - - if err != nil { - return err - } - return nil -} - func (t *PmWo) InsertOne() error { - engine := db.Eloquent.Master() - session := engine.NewSession() - defer session.Close() - // add Begin() before any action - err := session.Begin() - if err != nil { - return err - } now := time.Now() + today := now.Format("20060102") + nowTime := now.Format("20060102150405") snr := new(Snrtab) - snr.Finr = t.Finr - //生成ID - woid, err := snr.GetNextSnrWithSession(session, "WOID") + snr.Finr = 100 + woid, err := snr.GetNextSnr("WOID") if err != nil { - session.Rollback() return errors.New("生成Maintwoid出错:" + err.Error()) } - //符合逻辑生成维护工单 - pm := new(PmWo) - pm.Finr = t.Finr - pm.Maintwoid = woid - pm.Mainservicenr = t.Mainservicenr - pm.Descr = t.Descr - pm.Status = 26 - pm.Priority = t.Priority - pm.Assetid = t.Assetid - pm.Plbegdat = utils.TimeFormat(now, "yyyyMMdd") - pm.Schedbegtime = utils.TimeFormat(now, "yyyyMMddHHmmss") - pm.Schedendtime = utils.TimeFormat(now, "yyyyMMddHHmmss") - pm.Mainttype = t.Mainttype - pm.Credatuz = utils.TimeFormat(time.Now(), "yyyyMMddHHmmss") - pm.Lastmodif = utils.TimeFormat(time.Now(), "yyyyMMddHHmmss") - err = pm.AddSession(session) - if err != nil { - session.Rollback() - return err - } - me := new(PmServiceAttrlst) - me.Finr = t.Finr - me.Mainserviceid = t.Mainservicenr - data, err := me.SelectAll() - if err != nil { - session.Rollback() - return err - } - //生成属性 - for _, v := range data { - at := new(PmWoAttrlst) - at.Finr = v.Finr - at.Descr = v.Descr - at.Mainservicenr = v.Mainserviceid - at.Maintwoid = woid - at.Pos = v.Pos - at.Parameter = v.Parameter - at.Paravalue = v.Paravalue - at.Attrnr = v.Attrnr - at.Credatuz = utils.TimeFormat(time.Now(), "yyyyMMddHHmmss") - at.Lastmodif = utils.TimeFormat(time.Now(), "yyyyMMddHHmmss") - err := at.AddSession(session) - if err != nil { - session.Rollback() - return err - } - } - session.Commit() - return nil + t.Maintwoid = woid + t.Status = 26 + t.Plbegdat = today + t.Schedbegtime = nowTime + t.Schedendtime = nowTime + t.Credatuz = nowTime + t.Lastmodif = nowTime + return t.Add() } //删 @@ -459,491 +388,4 @@ type CreateData struct { PmService `xorm:"extends"` } -//结构体 -type TaskData struct { - TaskType string - PmAsset PmAsset - PmTemplate PmTemplate - PmService PmService -} - -var taskChan = make(chan TaskData, 1000) //定义一个调度任务通道 -/**** -*生成维护工单 -***************/ -func (t *PmWo) CreateOrder() { - - //创建继承Baxkground的子节点Context - ctx, cancel := context.WithCancel(context.Background()) - defer cancel() - go doSth(ctx) - - data := make([]CreateData, 0) - //第一步,多表联查出所有的数据 - engine := db.Eloquent.Master() - query := engine.Table("pm_asset") - query = query.Join("INNER", "pm_asset_templatelst", "pm_asset.finr = pm_asset_templatelst.finr and pm_asset.assetid = pm_asset_templatelst.assetid") - query = query.Join("INNER", "pm_template", "pm_template.finr = pm_asset_templatelst.finr and pm_template.maintemplatenr = pm_asset_templatelst.maintemplatenr") - query = query.Join("INNER", "pm_template_servicelst", "pm_template.finr = pm_template_servicelst.finr and pm_template.maintemplatenr = pm_template_servicelst.maintemplatenr") - query = query.Join("INNER", "pm_service", "pm_service.finr = pm_template_servicelst.finr and pm_service.mainserviceid = pm_template_servicelst.mainservicenr") - - query = query.Where("pm_asset.finr = ? and pm_service.schedtype = ?", t.Finr, "AUTO") - err := query.Find(&data) - if err != nil { - return - } - //第二步,把所有的服务调度放到channel - for _, v := range data { - //判断激活状态 - if utils.ValueIsEmpty(v.PmService.Enabled) { - continue - } - dataone := TaskData{} - dataone.PmService = v.PmService - dataone.PmTemplate = v.PmTemplate - dataone.PmAsset = v.PmAsset - //判断taskType - if v.PmService.Maintbydate > 0 { - dataone.TaskType = "A" //A是按照日期维护 - } else if v.PmService.Maintbyhour > 0 { - dataone.TaskType = "B" //B是按照小时维护 - } else if v.PmService.Maintbymileage > 0 { - dataone.TaskType = "C" //C是按照仪表值维护 - } else if v.PmService.Needschedule > 0 { - dataone.TaskType = "D" //D是按照调度维护 - } else { - continue - } - taskChan <- dataone - } -} - -//生成任务工单 -func doSth(ctx context.Context) { - //第三步,启动协程,从channel里读取数据,根据服务维护日期进入不同的方法里 - for { - select { - case <-ctx.Done(): - return - case task, ok := <-taskChan: - - if !ok { - log.Println("调度生成终止") - return //停机退出 - } - switch task.TaskType { - case "A": - - //当前零点时间 - today := utils.GetZeroTime(time.Now()) - //逻辑:判断是否到了维护时间,(当前时间戳-起始时间戳)%间隔时间 - t1 := utils.TimeFormat(time.Now(), "yyyyMMdd") - t2 := task.PmService.Duedateon - time1, _ := utils.TimeParseyyyyMMdd(t1) - time2, _ := utils.TimeParseyyyyMMdd(t2) - timelen := int(time1.Unix()) - int(time2.Unix()) - timeunit := task.PmService.Duedateinterval - glog.InfoExtln("维护工单A", "Mainservicenr:", task.PmService.Mainserviceid) - glog.InfoExtln("维护工单A", "t1:", t1) - glog.InfoExtln("维护工单A", "t2:", task.PmService.Duedateon) - glog.InfoExtln("维护工单A", "timelen:", timelen) - glog.InfoExtln("维护工单A", "timeunit:", timeunit) - glog.InfoExtln("维护工单A", "res:", ((timelen / 86400) % timeunit)) - if res := ((timelen / 86400) % timeunit); res == 0 { - - //判断是否已经生成了维护工单,如果生成了,跳过 - pms := new(PmWo) - pms.Finr = task.PmService.Finr - pms.Mainservicenr = task.PmService.Mainserviceid - pms.Assetid = task.PmAsset.Assetid - tem, err := pms.SelectPmWoOne() - if err != nil { - glog.InfoExtln("维护工单A", "tem.Mainservicenr:", tem.Mainservicenr) - continue - } - - //判断是否添加了服务 - t2now, _ := utils.TimeParse(tem.Schedbegtime) - endtime := t2now.AddDate(0, 0, timeunit) - //先把时间字符串格式化成相同的时间类型 - nowtime, _ := utils.TimeParseyyyyMMdd(t1) - - if nowtime.Before(endtime) { - //处理逻辑 - glog.InfoExtln("维护工单A", "nowtime:", nowtime) - glog.InfoExtln("维护工单A", "endtime:", endtime) - continue - } - - snr := new(Snrtab) - snr.Finr = 100 - //生成ID - woid, err := snr.GetNextSnr("WOID") - if err != nil { - continue - } - //符合逻辑生成维护工单 - pm := new(PmWo) - pm.Finr = task.PmService.Finr - pm.Maintwoid = woid - pm.Mainservicenr = task.PmService.Mainserviceid - pm.Descr = task.PmService.Descr - pm.Status = 26 - pm.Priority = task.PmService.Priority - pm.Assetid = task.PmAsset.Assetid - pm.Plbegdat = utils.TimeFormat(time.Now(), "yyyyMMdd") - pm.Schedbegtime = utils.TimeFormat(today, "yyyyMMddHHmmss") - pm.Schedendtime = utils.TimeFormat(today, "yyyyMMddHHmmss") - pm.Mainttype = task.PmService.Mainttype - pm.Credatuz = utils.TimeFormat(time.Now(), "yyyyMMddHHmmss") - pm.Lastmodif = utils.TimeFormat(time.Now(), "yyyyMMddHHmmss") - err = pm.Add() - if err != nil { - continue - } - me := new(PmServiceAttrlst) - me.Finr = task.PmService.Finr - me.Mainserviceid = task.PmService.Mainserviceid - data, err := me.SelectAll() - if err != nil { - continue - } - //生成属性 - for _, v := range data { - at := new(PmWoAttrlst) - at.Finr = v.Finr - at.Descr = v.Descr - at.Mainservicenr = v.Mainserviceid - at.Maintwoid = woid - at.Pos = v.Pos - at.Parameter = v.Parameter - at.Paravalue = v.Paravalue - at.Attrnr = v.Attrnr - at.Credatuz = utils.TimeFormat(time.Now(), "yyyyMMddHHmmss") - at.Lastmodif = utils.TimeFormat(time.Now(), "yyyyMMddHHmmss") - err := at.Add() - if err != nil { - continue - } - } - } - case "B": - //逻辑:起始时间+间隔时间, - t1 := utils.TimeFormat(time.Now(), "yyyyMMddHHmmss") - //判断是否已经生成了维护工单,如果生成了,跳过 - pms := new(PmWo) - pms.Finr = task.PmService.Finr - pms.Mainservicenr = task.PmService.Mainserviceid - pms.Assetid = task.PmAsset.Assetid - tem, err := pms.SelectPmWoOne() - if err != nil { - glog.InfoExtln("维护工单B", "err:", err) - continue - } - glog.InfoExtln("维护工单B", "tem:", tem) - time2, _ := utils.TimeParse(tem.Schedbegtime) - time1, _ := utils.TimeParse(t1) - timelen := int(time1.Unix()) - int(time2.Unix()) - timeunit := task.PmService.Duehourinterval - glog.InfoExtln("维护工单B", "Mainservicenr:", task.PmService.Mainserviceid) - glog.InfoExtln("维护工单B", "tem.Schedbegtime:", tem.Schedbegtime) - glog.InfoExtln("维护工单B", "timelen:", timelen) - glog.InfoExtln("维护工单B", "timeunit:", timeunit) - if (timelen - timeunit*3600) > 0 { - - snr := new(Snrtab) - snr.Finr = 100 - //生成ID - woid, err := snr.GetNextSnr("WOID") - if err != nil { - glog.InfoExtln("维护工单B", "err:", err) - continue - } - //符合逻辑生成维护工单 - pm := new(PmWo) - pm.Finr = task.PmService.Finr - pm.Maintwoid = woid - pm.Mainservicenr = task.PmService.Mainserviceid - pm.Descr = task.PmService.Descr - pm.Status = 26 - pm.Priority = task.PmService.Priority - pm.Assetid = task.PmAsset.Assetid - pm.Plbegdat = utils.TimeFormat(time.Now(), "yyyyMMdd") - pm.Schedbegtime = utils.TimeFormat(time.Now(), "yyyyMMddHHmmss") - pm.Schedendtime = utils.TimeFormat(time.Now(), "yyyyMMddHHmmss") - pm.Mainttype = task.PmService.Mainttype - pm.Credatuz = utils.TimeFormat(time.Now(), "yyyyMMddHHmmss") - pm.Lastmodif = utils.TimeFormat(time.Now(), "yyyyMMddHHmmss") - err = pm.Add() - if err != nil { - glog.InfoExtln("维护工单B", "err:", err) - continue - } - me := new(PmServiceAttrlst) - me.Finr = task.PmService.Finr - me.Mainserviceid = task.PmService.Mainserviceid - data, err := me.SelectAll() - if err != nil { - glog.InfoExtln("维护工单B", "err:", err) - continue - } - //生成属性 - for _, v := range data { - at := new(PmWoAttrlst) - at.Finr = v.Finr - at.Descr = v.Descr - at.Mainservicenr = v.Mainserviceid - at.Maintwoid = woid - at.Pos = v.Pos - at.Parameter = v.Parameter - at.Paravalue = v.Paravalue - at.Attrnr = v.Attrnr - at.Credatuz = utils.TimeFormat(time.Now(), "yyyyMMddHHmmss") - at.Lastmodif = utils.TimeFormat(time.Now(), "yyyyMMddHHmmss") - err := at.Add() - if err != nil { - glog.InfoExtln("维护工单B", "err:", err) - continue - } - } - } - case "C": - //逻辑:仪表值 - //第一步:查询资产阈值表,判断是否是触发状态 - pma := new(PmAssetKpi) - pma.Finr = 100 - pma.Mainserviceid = utils.ValueToString(task.PmService.Mainserviceid, "") - info, err := pma.SelectAll() - if err != nil { - continue - } - for _, pmaInfo := range info { - switch pmaInfo.Kpitype { - case 1: - if pmaInfo.Triggerstatus == 1 { - continue - } - if pmaInfo.Thresholdval < pmaInfo.Actualval { - continue - } - - //第二步:生成维护工单, - //逻辑:根据调度时间维护 - snr := new(Snrtab) - snr.Finr = 100 - //生成ID - woid, err := snr.GetNextSnr("WOID") - log.Printf("流水号id:%v", woid) - if err != nil { - return - } - //符合逻辑生成维护工单 - pm := new(PmWo) - pm.Finr = task.PmService.Finr - pm.Maintwoid = woid - pm.Mainservicenr = task.PmService.Mainserviceid - pm.Descr = task.PmService.Descr - pm.Status = 26 - pm.Priority = task.PmService.Priority - pm.Assetid = task.PmAsset.Assetid - pm.Plbegdat = utils.TimeFormat(time.Now(), "yyyyMMdd") - pm.Schedbegtime = utils.TimeFormat(time.Now(), "yyyyMMddHHmmss") - timenow := utils.ValueToString(task.PmService.Maintimelen, "") - m, _ := time.ParseDuration(timenow + "h") - pm.Schedendtime = utils.TimeFormat(time.Now().Add(m), "yyyyMMddHHmmss") - pm.Mainttype = task.PmService.Mainttype - pm.Credatuz = utils.TimeFormat(time.Now(), "yyyyMMddHHmmss") - pm.Lastmodif = utils.TimeFormat(time.Now(), "yyyyMMddHHmmss") - err = pm.Add() - if err != nil { - continue - } - me := new(PmServiceAttrlst) - me.Finr = task.PmService.Finr - me.Mainserviceid = task.PmService.Mainserviceid - data, err := me.SelectAll() - if err != nil { - continue - } - //生成属性 - for _, v := range data { - at := new(PmWoAttrlst) - at.Finr = v.Finr - at.Descr = v.Descr - at.Mainservicenr = v.Mainserviceid - at.Maintwoid = woid - at.Pos = v.Pos - at.Parameter = v.Parameter - at.Paravalue = v.Paravalue - at.Attrnr = v.Attrnr - at.Credatuz = utils.TimeFormat(time.Now(), "yyyyMMddHHmmss") - at.Lastmodif = utils.TimeFormat(time.Now(), "yyyyMMddHHmmss") - err := at.Add() - if err != nil { - continue - } - } - //第三步:锁定触发器状态 - pmu := new(PmAssetKpi) - pmu.Finr = 100 - pmu.Triggerstatus = 1 - pmu.Assetid = utils.ValueToString(task.PmAsset.Assetid, "") - err = pma.Update() - if err != nil { - continue - } - case 2: - if pmaInfo.Counterval < pmaInfo.Countercycleval { - continue - } - //第二步:生成维护工单, - //逻辑:根据调度时间维护 - snr := new(Snrtab) - snr.Finr = 100 - //生成ID - woid, err := snr.GetNextSnr("WOID") - log.Printf("流水号id:%v", woid) - if err != nil { - return - } - //符合逻辑生成维护工单 - pm := new(PmWo) - pm.Finr = task.PmService.Finr - pm.Maintwoid = woid - pm.Mainservicenr = task.PmService.Mainserviceid - pm.Descr = task.PmService.Descr - pm.Status = 26 - pm.Priority = task.PmService.Priority - pm.Assetid = task.PmAsset.Assetid - pm.Plbegdat = utils.TimeFormat(time.Now(), "yyyyMMdd") - pm.Schedbegtime = utils.TimeFormat(time.Now(), "yyyyMMddHHmmss") - timenow := utils.ValueToString(task.PmService.Maintimelen, "") - m, _ := time.ParseDuration(timenow + "h") - pm.Schedendtime = utils.TimeFormat(time.Now().Add(m), "yyyyMMddHHmmss") - pm.Mainttype = task.PmService.Mainttype - pm.Credatuz = utils.TimeFormat(time.Now(), "yyyyMMddHHmmss") - pm.Lastmodif = utils.TimeFormat(time.Now(), "yyyyMMddHHmmss") - err = pm.Add() - if err != nil { - continue - } - me := new(PmServiceAttrlst) - me.Finr = task.PmService.Finr - me.Mainserviceid = task.PmService.Mainserviceid - data, err := me.SelectAll() - if err != nil { - continue - } - //生成属性 - for _, v := range data { - at := new(PmWoAttrlst) - at.Finr = v.Finr - at.Descr = v.Descr - at.Mainservicenr = v.Mainserviceid - at.Maintwoid = woid - at.Pos = v.Pos - at.Parameter = v.Parameter - at.Paravalue = v.Paravalue - at.Attrnr = v.Attrnr - at.Credatuz = utils.TimeFormat(time.Now(), "yyyyMMddHHmmss") - at.Lastmodif = utils.TimeFormat(time.Now(), "yyyyMMddHHmmss") - err := at.Add() - if err != nil { - continue - } - } - //第三步:计数清零 - pmu := new(PmAssetKpi) - pmu.Finr = 100 - pmu.Countercycleval = 1 - pmu.Assetid = utils.ValueToString(task.PmAsset.Assetid, "") - err = pma.Update() - if err != nil { - continue - } - } - } - - case "D": - //逻辑:起始时间+间隔时间, - t1 := utils.TimeFormat(time.Now(), "yyyyMMdd") - //判断是否已经生成了维护工单,如果生成了,跳过 - pms := new(PmWo) - pms.Finr = task.PmService.Finr - pms.Mainservicenr = task.PmService.Mainserviceid - pms.Assetid = task.PmAsset.Assetid - tem, err := pms.SelectPmWoOne() - if err != nil { - continue - } - time2, _ := utils.TimeParse(tem.Schedbegtime) - time1, _ := utils.TimeParseyyyyMMdd(t1) - timelen := int(time1.Unix()) - int(time2.Unix()) - if err != nil { - continue - } - if timelen >= 0 { - //逻辑:根据调度时间维护 - snr := new(Snrtab) - snr.Finr = 100 - //生成ID - woid, err := snr.GetNextSnr("WOID") - log.Printf("流水号id:%v", woid) - if err != nil { - return - } - //符合逻辑生成维护工单 - pm := new(PmWo) - pm.Finr = task.PmService.Finr - pm.Maintwoid = woid - pm.Mainservicenr = task.PmService.Mainserviceid - pm.Descr = task.PmService.Descr - pm.Status = 26 - pm.Priority = task.PmService.Priority - pm.Assetid = task.PmAsset.Assetid - pm.Plbegdat = utils.TimeFormat(time.Now(), "yyyyMMdd") - pm.Schedbegtime = utils.TimeFormat(time.Now(), "yyyyMMddHHmmss") - timenow := utils.ValueToString(task.PmService.Maintimelen, "") - m, _ := time.ParseDuration(timenow + "h") - pm.Schedendtime = utils.TimeFormat(time.Now().Add(m), "yyyyMMddHHmmss") - pm.Mainttype = task.PmService.Mainttype - pm.Credatuz = utils.TimeFormat(time.Now(), "yyyyMMddHHmmss") - pm.Lastmodif = utils.TimeFormat(time.Now(), "yyyyMMddHHmmss") - err = pm.Add() - if err != nil { - continue - } - me := new(PmServiceAttrlst) - me.Finr = task.PmService.Finr - me.Mainserviceid = task.PmService.Mainserviceid - data, err := me.SelectAll() - if err != nil { - continue - } - //生成属性 - for _, v := range data { - at := new(PmWoAttrlst) - at.Finr = v.Finr - at.Descr = v.Descr - at.Mainservicenr = v.Mainserviceid - at.Maintwoid = woid - at.Pos = v.Pos - at.Parameter = v.Parameter - at.Paravalue = v.Paravalue - at.Attrnr = v.Attrnr - at.Credatuz = utils.TimeFormat(time.Now(), "yyyyMMddHHmmss") - at.Lastmodif = utils.TimeFormat(time.Now(), "yyyyMMddHHmmss") - err := at.Add() - if err != nil { - continue - } - } - } - - default: - //进行非抢占式任务 - } - } - } -}