package msg import ( "fmt" "github.com/tealeg/xlsx" "leit.com/leit_seat_aps/common" "leit.com/leit_seat_aps/db" "leit.com/leit_seat_aps/glog" "leit.com/leit_seat_aps/service" "context" "time" ) func Msg() { var ( err error pe service.BL_PrintEngine ) // 启动解析循环 for { // 加载打印引擎所需模板数据 pe = service.BL_PrintEngine{} if err = pe.LoadPickingTemplates(); err != nil { glog.InfoExtln("Msg消息推送", "加载拣料单模板失败,原因是:", err) return } if err = pe.LoadPackageTemplate(); err != nil { glog.InfoExtln("Msg消息推送", "加载包装单模板失败,原因是:", err) return } if err = pe.LoadShipCarTemplate(); err != nil { glog.InfoExtln("Msg消息推送", "加载发运单模板失败,原因是:", err) return } if err = pe.LoadAttributes(); err != nil { glog.InfoExtln("Msg消息推送", "加载属性主数据失败,原因是:", err) return } if err = pe.LoadBbaasnTemplates(); err != nil { glog.InfoExtln("Msg消息推送", "加载属性主数据失败,原因是:", err) return } fmt.Println("准备解析打印消息!") if err = ParseOpenPrintMsg(&pe); err != nil { glog.InfoExtln("Msg消息推送", "解析打印消息失败:", err) return } fmt.Println("解析完成!") time.Sleep(10 * time.Second) } } // 为发运单生成独立的ASN,基于发运单消息 func Asn() { for { var ( err error ) if err = ParseShipOrderMsg(); err != nil { glog.InfoExtln("BBAASN", "解析发运单消息失败,无法生成ASN文件: ", err) return } time.Sleep(10 * time.Second) } } // 生成Grammar的SNF,每天执行一次 func EdiNew(filefolder string) { var ( err error ) fmt.Println("开始执行!") if err = Grammer_GenerateSEQOrderEDIFile(filefolder); err != nil { glog.InfoExtln("Grammersnf", "生成EDI文件失败: ", err) } fmt.Println("执行结束!") } func NOSEQOrderEDIFile(filefolder string) { for { var ( err error ) fmt.Println("开始执行!") if err = Grammer_GenerateNOSEQOrderEDIFile(filefolder); err != nil { glog.InfoExtln("Grammersnf", "生成EDI文件失败: ", err) } fmt.Println("执行结束!") time.Sleep(10 * time.Second) } } type BackFlushData struct { Backflush string //雇员 Partid string //零件号 Worklineid string //产线信息 Partqty int //零件数量 } // 客户订单生成一个Back flush的excel文件 func BackFlush() { for { //1.查询已关闭的客户订单 var data []db.Pln_custorder var stdeftab db.Stdeftab var workline db.Stdeftab e := db.G_DbEngine err := e.Table("pln_custorder").Where("finr =? and status = ? and backflush != ?", db.G_FINR, 80, 1).Asc("custordernr").Limit(10).Find(&data) if err != nil { glog.InfoExtln("Back flush", "Back flush err :", err) return } if len(data) == 0 { time.Sleep(10 * time.Second) continue } glog.InfoExtln("Back flush", "Back flush data :", data) for _, v := range data { BackData := make([]BackFlushData, 0) //2.判断pln_custorder.orderinfo if ==INT if v.Orderinfo == "INT" { temData := make([]BackFlushData, 0) _, err := e.Table("stdeftab").Where("finr = ? and stdeftyp = ? and statid = ? and lang=?", db.G_FINR, "G38_BACKFLUSH", "EMPLOYEE", "chi").Get(&stdeftab) if err != nil { glog.InfoExtln("Back flush", "Back flush err :", err) continue } _, err = e.Table("stdeftab").Where("finr = ? and stdeftyp = ? and statid = ? and lang=?", db.G_FINR, "G38_BACKFLUSH", "WORKLINE", "chi").Get(&workline) if err != nil { glog.InfoExtln("Back flush", "Back flush err :", err) continue } //联查出零件号和数量 err = e.Table("pln_custorder").Select("pln_workorder.worklineid,pln_workorder_partlst.partid,pln_workorder_partlst.partqty").Join("INNER", "pln_workorder", "pln_custorder.finr = pln_workorder.finr and pln_custorder.custordernr = pln_workorder.custordernr").Join("INNER", "pln_workorder_partlst", "pln_workorder_partlst.finr = pln_workorder.finr and pln_workorder_partlst.workordernr = pln_workorder.workordernr").Where("pln_custorder.finr = ? and pln_custorder.custordernr =?", db.G_FINR, v.Custordernr).Find(&temData) if err != nil { glog.InfoExtln("Back flush", "Back flush err :", err) continue } for _, v := range temData { var backone BackFlushData backone.Backflush = stdeftab.Bez backone.Worklineid = workline.Bez backone.Partid = v.Partid backone.Partqty = v.Partqty BackData = append(BackData, backone) } } else { temData := make([]BackFlushData, 0) _, err := e.Table("stdeftab").Where("finr = ? and stdeftyp = ? and statid = ? and lang=?", db.G_FINR, "G38_BACKFLUSH", "EMPLOYEE", "chi").Get(&stdeftab) if err != nil { glog.InfoExtln("Back flush", "Back flush err :", err) continue } _, err = e.Table("stdeftab").Where("finr = ? and stdeftyp = ? and statid = ? and lang=?", db.G_FINR, "G38_BACKFLUSH", "WORKLINE", "chi").Get(&workline) if err != nil { glog.InfoExtln("Back flush", "Back flush err :", err) continue } //联查出零件号和数量 err = e.Table("pln_custorder").Select("pln_custorder_supplygroup_partlst.partid,pln_custorder_supplygroup_partlst.partqty").Join("INNER", "pln_custorder_supplygroup_partlst", "pln_custorder.finr = pln_custorder_supplygroup_partlst.finr and pln_custorder.custordernr = pln_custorder_supplygroup_partlst.custordernr").Where("pln_custorder.finr = ? and pln_custorder.custordernr =?", db.G_FINR, v.Custordernr).Find(&temData) if err != nil { glog.InfoExtln("Back flush", "Back flush err :", err) continue } for _, v := range temData { var backone BackFlushData backone.Backflush = stdeftab.Bez backone.Worklineid = workline.Bez backone.Partid = v.Partid backone.Partqty = v.Partqty BackData = append(BackData, backone) } } //3.更新pln_custorder里backflush和backflushsn信息 Backflushsn := "BACKFLUSH" + common.CreateCaptchaFive() var pln db.Pln_custorder pln.Finr = db.G_FINR pln.Custordernr = v.Custordernr pln.Backflush = 1 pln.Backflushsn = Backflushsn _, err = e.Table("pln_custorder").Cols("backflush,backflushsn").Where("finr = ? and custordernr =?", db.G_FINR, v.Custordernr).Update(&pln) if err != nil { glog.InfoExtln("Back flush", "Back flush err :", err) continue } //4.生产对应的excel文件 var file *xlsx.File var sheet *xlsx.Sheet var row *xlsx.Row var cell *xlsx.Cell file = xlsx.NewFile() sheet, err = file.AddSheet("Sheet1") if err != nil { glog.InfoExtln("Back flush", "Back flush err :", err) return } tableHead := true for _, val := range BackData { if tableHead { //添加表头 row = sheet.AddRow() cell = row.AddCell() cell.Value = "雇员" cell = row.AddCell() cell.Value = "零件号" cell = row.AddCell() cell.Value = "" cell = row.AddCell() cell.Value = "" cell = row.AddCell() cell.Value = "产品线" cell = row.AddCell() cell.Value = "数量" tableHead = false } row = sheet.AddRow() cell = row.AddCell() cell.Value = common.ValueToString(val.Backflush, "") cell = row.AddCell() cell.Value = common.ValueToString(val.Partid, "") cell = row.AddCell() cell.Value = "" cell = row.AddCell() cell.Value = "" cell = row.AddCell() cell.Value = common.ValueToString(val.Worklineid, "") cell = row.AddCell() cell.Value = common.ValueToString(val.Partqty, "") } filename := Backflushsn + ".xlsx" //文件名 exceldir := "C:/G38EDI/Backflush/uploadxlsx" // 目录+文件名 excelfile := exceldir + "/" + filename err = file.Save(excelfile) } time.Sleep(10 * time.Second) } } /***** *发送邮件方法 ******************/ func SendMail() { //生产者:每次查询50条数据 go Product() //创建继承Baxkground的子节点Context ctx, cancel := context.WithCancel(context.Background()) defer cancel() Consume(ctx) } type MailInfo struct { Id int Username string Password string Host string Tomail string Name string Subject string Body string Mailtype string } //定义一个调度任务通道,相当于仓库 var mailChan = make(chan MailInfo, 50) //生产者 func Product() { for { var ( ids []int err error ) //查询status:waiting等待;doing处理中;close已完成 e := db.G_DbEngine data := make([]MailInfo, 0) //查询出50条需要发送的信息 err = e.Table("sendmailtab").Where("status = ?", "waiting").Asc("id").Limit(50).Find(&data) if err != nil { glog.InfoExtln("调度生成终止", "product is error!") return } if len(data) == 0 { time.Sleep(10 * time.Second) continue } else { //锁定信息,状态变为doing for _, v := range data { ids = append(ids, v.Id) } _, err = e.Table("sendmailtab").In("id", ids).Update(map[string]string{"status": "doing"}) if err != nil { glog.InfoExtln("调度生成终止", "product update is error!") continue } for _, v := range data { common.TrimStruct(&v, v) glog.InfoExtln("sendmail 数据", "v is :", v) mailChan <- v } } time.Sleep(5 * time.Second) } } //消费者 func Consume(ctx context.Context) { for { select { case <-ctx.Done(): return case task, ok := <-mailChan: if !ok { glog.InfoExtln("调度生成终止", "Consume is not ok!") return //停机退出 } //发送邮件 err := common.SendMail(task.Username, task.Password, task.Host, task.Tomail, task.Name, task.Subject, task.Body, task.Mailtype) //更新数据状态为关闭 e := db.G_DbEngine if err != nil { glog.InfoExtln("sendmail 结果", "err is :", err) e.Table("sendmailtab").Where("id = ?", task.Id).Update(map[string]string{"status": "close", "resultinfo": "error"}) } else { e.Table("sendmailtab").Where("id = ?", task.Id).Update(map[string]string{"status": "close", "resultinfo": "ok"}) } } } }