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