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"})
|
|
}
|
|
|
|
}
|
|
}
|
|
}
|