package edi
|
|
|
|
import (
|
|
"errors"
|
|
"fmt"
|
|
"io/ioutil"
|
|
"leit.com/leit_seat_aps/db"
|
|
"leit.com/leit_seat_aps/glog"
|
|
"leit.com/leit_seat_aps/tod"
|
|
"os"
|
|
"regexp"
|
|
"strings"
|
|
"time"
|
|
)
|
|
|
|
func RunEdiTodAssignTask(editab db.Edi_oem){
|
|
var err error
|
|
|
|
for{
|
|
if err = EdiAssignTod(editab); err != nil{
|
|
return
|
|
}
|
|
|
|
time.Sleep(2 * time.Second)
|
|
}
|
|
|
|
}
|
|
|
|
// 监控G38/18的TOD inbox,根据项目指定的Key值将两个项目的tod文件筛选出来,而后移到对应的文件夹
|
|
func EdiAssignTod(editab db.Edi_oem)(err error){
|
|
var(
|
|
rd []os.FileInfo
|
|
fi os.FileInfo
|
|
tod_file string
|
|
matched bool
|
|
todobj tod.TOD
|
|
seqobj tod.SEQ
|
|
pfid string
|
|
pflist []string
|
|
ediitemtab db.Edi_oem_itemlst
|
|
tod_move_folder string
|
|
errinfo string
|
|
i int
|
|
)
|
|
|
|
// 读取TOD目录
|
|
if rd, err = ioutil.ReadDir(editab.Tod_folder + "/inbox"); err != nil {
|
|
err = errors.New(fmt.Sprintf("无法读取TOD文件夹%s !", editab.Tod_folder))
|
|
return
|
|
}
|
|
|
|
// 遍历TOD文件夹内的文件
|
|
for _, fi = range rd {
|
|
if fi.IsDir() {
|
|
continue
|
|
}
|
|
tod_file = editab.Tod_folder + "/inbox" + "/" + fi.Name()
|
|
|
|
// 判断文件的合规性
|
|
if matched, err = regexp.MatchString(editab.Tod_filename_regexp, fi.Name()); err != nil {
|
|
errinfo = fmt.Sprintf("EDI TOD文件%s 匹配命名规则%s 出错 %v !", fi.Name(), editab.Tod_filename_regexp, err)
|
|
os.Rename(tod_file, editab.Tod_folder+"/errbox"+"/"+fi.Name())
|
|
// 发送邮件
|
|
if err = EdiSendTodErrorEmail(editab, errinfo); err != nil {
|
|
return
|
|
}
|
|
continue
|
|
}
|
|
if !matched {
|
|
errinfo = fmt.Sprintf("EDI TOD文件%s 不符合文件名命名规范%s !", fi.Name(), editab.Tod_filename_regexp)
|
|
os.Rename(tod_file, editab.Tod_folder+"/errbox"+"/"+fi.Name())
|
|
// 发送邮件
|
|
if err = EdiSendTodErrorEmail(editab, errinfo); err != nil {
|
|
return
|
|
}
|
|
continue
|
|
}
|
|
|
|
// 解析TOD文件
|
|
todobj = tod.TOD{}
|
|
if err = tod.ParseTodEdi(tod_file, &todobj); err != nil {
|
|
errinfo = fmt.Sprintf("解析TOD文件%s 失败%v !", fi.Name(), err)
|
|
os.Rename(tod_file, editab.Tod_folder+"/errbox"+"/"+fi.Name())
|
|
// 发送邮件
|
|
if err = EdiSendTodErrorEmail(editab, errinfo); err != nil {
|
|
return
|
|
}
|
|
continue
|
|
}
|
|
|
|
// 获取TOD的PF
|
|
pfid = ""
|
|
for _, seqobj = range todobj.SeqList {
|
|
if strings.TrimSpace(seqobj.Gir.PartFamily) != ""{
|
|
pfid = strings.TrimSpace(seqobj.Gir.PartFamily)
|
|
break
|
|
}
|
|
}
|
|
if pfid == "" {
|
|
errinfo = fmt.Sprintf("TOD文件%s 的零件族为空 !", fi.Name())
|
|
os.Rename(tod_file, editab.Tod_folder+"/errbox"+"/"+fi.Name())
|
|
// 发送邮件
|
|
if err = EdiSendTodErrorEmail(editab, errinfo); err != nil {
|
|
return
|
|
}
|
|
continue
|
|
}
|
|
|
|
// 与TOD子项比较,适配零件族则转移
|
|
matched = false
|
|
for _, ediitemtab = range editab.Itemlst {
|
|
if strings.TrimSpace(ediitemtab.Itemtype) != "TOD" {
|
|
continue
|
|
}
|
|
pflist = strings.Split(ediitemtab.Keyval, ",")
|
|
for i = 0; i < len(pflist); i++ {
|
|
if pfid == strings.TrimSpace(pflist[i]) {
|
|
matched = true
|
|
break
|
|
}
|
|
}
|
|
if matched {
|
|
tod_move_folder = strings.TrimSpace(ediitemtab.Inbox_folder)
|
|
break
|
|
}
|
|
}
|
|
if matched {
|
|
os.Rename(tod_file, tod_move_folder+"/inbox"+"/"+fi.Name())
|
|
fmt.Println("成功为TOD文件",tod_file,"匹配到项目文件夹",tod_move_folder)
|
|
}else{
|
|
errinfo = fmt.Sprintf("没有为TOD文件%s 找到适配的TOD项目!", fi.Name())
|
|
os.Rename(tod_file, editab.Tod_folder+"/errbox"+"/"+fi.Name())
|
|
// 发送邮件
|
|
if err = EdiSendTodErrorEmail(editab, errinfo); err != nil {
|
|
return
|
|
}
|
|
continue
|
|
}
|
|
}
|
|
|
|
return
|
|
}
|
|
|
|
func EdiSendTodErrorEmail(editab db.Edi_oem, errinfo string)(err error){
|
|
var mail db.Sendmailtab
|
|
|
|
mail.Status = "waiting"
|
|
mail.Body = errinfo
|
|
mail.Subject = "TOD文件指派项目文件夹错误"
|
|
mail.Name = editab.From_email
|
|
mail.Tomail = editab.Edi_error_to_recievers
|
|
mail.Host = editab.Emailserver_host
|
|
mail.Password = editab.From_pwd
|
|
mail.Username = editab.From_email
|
|
err = mail.Add()
|
|
if err != nil {
|
|
glog.InfoExtln("发送邮件", "err is :", err)
|
|
}
|
|
return
|
|
}
|
|
|