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.

153 lines
4.1 KiB

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
}