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