package edi
|
|
|
|
import (
|
|
"fmt"
|
|
"github.com/pkg/errors"
|
|
"io/ioutil"
|
|
"leit.com/leit_seat_aps/db"
|
|
"leit.com/leit_seat_aps/glog"
|
|
"leit.com/leit_seat_aps/seq"
|
|
"os"
|
|
"regexp"
|
|
"strings"
|
|
"time"
|
|
)
|
|
|
|
func RunEdiSeqAssignTask(editab db.Edi_oem){
|
|
var err error
|
|
|
|
for{
|
|
if err = EdiAssignSeq(editab); err != nil{
|
|
return
|
|
}
|
|
|
|
time.Sleep(2 * time.Second)
|
|
}
|
|
|
|
}
|
|
|
|
// 监控G38/18的SEQ inbox,根据项目指定的Key值将两个项目的seq文件筛选出来,而后移到对应的文件夹
|
|
func EdiAssignSeq(editab db.Edi_oem)(err error){
|
|
var(
|
|
rd []os.FileInfo
|
|
fi os.FileInfo
|
|
seq_file string
|
|
matched bool
|
|
seqobj seq.SEQUENCE
|
|
pfid string
|
|
pflist []string
|
|
ediitemtab db.Edi_oem_itemlst
|
|
seq_move_folder string
|
|
errinfo string
|
|
i int
|
|
)
|
|
|
|
// 读取SEQ目录
|
|
if rd, err = ioutil.ReadDir(editab.Seq_folder + "/inbox"); err != nil {
|
|
err = errors.New(fmt.Sprintf("无法读取SEQ文件夹%s !", editab.Seq_folder))
|
|
return
|
|
}
|
|
|
|
// 遍历SEQ文件夹内的文件
|
|
for _, fi = range rd {
|
|
if fi.IsDir() {
|
|
continue
|
|
}
|
|
seq_file = editab.Seq_folder + "/inbox" + "/" + fi.Name()
|
|
|
|
// 判断文件的合规性
|
|
if matched, err = regexp.MatchString(editab.Seq_filename_regexp, fi.Name()); err != nil {
|
|
errinfo = fmt.Sprintf("EDI SEQ文件%s 匹配命名规则%s 出错 %v !", fi.Name(), editab.Seq_filename_regexp, err)
|
|
os.Rename(seq_file, editab.Seq_folder+"/errbox"+"/"+fi.Name())
|
|
// 发送邮件
|
|
if err = EdiSendSeqErrorEmail(editab, errinfo); err != nil {
|
|
return
|
|
}
|
|
continue
|
|
}
|
|
if !matched {
|
|
errinfo = fmt.Sprintf("EDI SEQ文件%s 不符合文件名命名规范%s !", fi.Name(), editab.Seq_filename_regexp)
|
|
os.Rename(seq_file, editab.Seq_folder+"/errbox"+"/"+fi.Name())
|
|
// 发送邮件
|
|
if err = EdiSendSeqErrorEmail(editab, errinfo); err != nil {
|
|
return
|
|
}
|
|
continue
|
|
}
|
|
|
|
// 解析SEQ文件
|
|
seqobj = seq.SEQUENCE{}
|
|
if err = seq.ParseSeqEdi(seq_file, &seqobj); err != nil {
|
|
errinfo = fmt.Sprintf("解析SEQ文件%s 失败%v !", fi.Name(), err)
|
|
os.Rename(seq_file, editab.Seq_folder+"/errbox"+"/"+fi.Name())
|
|
// 发送邮件
|
|
if err = EdiSendSeqErrorEmail(editab, errinfo); err != nil {
|
|
return
|
|
}
|
|
continue
|
|
}
|
|
|
|
// 获取SEQ的PF
|
|
pfid = strings.TrimSpace(seqobj.Ftx.PartFamily)
|
|
if pfid == "" {
|
|
errinfo = fmt.Sprintf("SEQ文件%s 的零件族为空 !", fi.Name())
|
|
os.Rename(seq_file, editab.Seq_folder+"/errbox"+"/"+fi.Name())
|
|
// 发送邮件
|
|
if err = EdiSendSeqErrorEmail(editab, errinfo); err != nil {
|
|
return
|
|
}
|
|
continue
|
|
}
|
|
|
|
// 与SEQ子项比较,适配零件族则转移
|
|
matched = false
|
|
for _, ediitemtab = range editab.Itemlst {
|
|
if strings.TrimSpace(ediitemtab.Itemtype) != "SEQ" {
|
|
continue
|
|
}
|
|
pflist = strings.Split(ediitemtab.Keyval, ",")
|
|
for i = 0; i < len(pflist); i++ {
|
|
if pfid == strings.TrimSpace(pflist[i]) {
|
|
matched = true
|
|
break
|
|
}
|
|
}
|
|
if matched {
|
|
seq_move_folder = strings.TrimSpace(ediitemtab.Inbox_folder)
|
|
break
|
|
}
|
|
}
|
|
if matched {
|
|
os.Rename(seq_file, seq_move_folder+"/inbox"+"/"+fi.Name())
|
|
fmt.Println("成功为SEQ文件",seq_file,"匹配到项目文件夹",seq_move_folder)
|
|
}else{
|
|
errinfo = fmt.Sprintf("没有为SEQ文件%s 找到适配的SEQ项目!", fi.Name())
|
|
os.Rename(seq_file, editab.Seq_folder+"/errbox"+"/"+fi.Name())
|
|
// 发送邮件
|
|
if err = EdiSendSeqErrorEmail(editab, errinfo); err != nil {
|
|
return
|
|
}
|
|
continue
|
|
}
|
|
}
|
|
|
|
return
|
|
}
|
|
|
|
func EdiSendSeqErrorEmail(editab db.Edi_oem, errinfo string)(err error){
|
|
var mail db.Sendmailtab
|
|
|
|
mail.Status = "waiting"
|
|
mail.Body = errinfo
|
|
mail.Subject = "SEQ文件指派项目文件夹错误"
|
|
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
|
|
}
|