SJA APS后端代码
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

362 lines
10 KiB

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