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
3.9 KiB

  1. package edi
  2. import (
  3. "fmt"
  4. "github.com/pkg/errors"
  5. "io/ioutil"
  6. "leit.com/leit_seat_aps/db"
  7. "leit.com/leit_seat_aps/glog"
  8. "leit.com/leit_seat_aps/seq"
  9. "os"
  10. "regexp"
  11. "strings"
  12. "time"
  13. )
  14. func RunEdiSeqAssignTask(editab db.Edi_oem){
  15. var err error
  16. for{
  17. if err = EdiAssignSeq(editab); err != nil{
  18. return
  19. }
  20. time.Sleep(2 * time.Second)
  21. }
  22. }
  23. // 监控G38/18的SEQ inbox,根据项目指定的Key值将两个项目的seq文件筛选出来,而后移到对应的文件夹
  24. func EdiAssignSeq(editab db.Edi_oem)(err error){
  25. var(
  26. rd []os.FileInfo
  27. fi os.FileInfo
  28. seq_file string
  29. matched bool
  30. seqobj seq.SEQUENCE
  31. pfid string
  32. pflist []string
  33. ediitemtab db.Edi_oem_itemlst
  34. seq_move_folder string
  35. errinfo string
  36. i int
  37. )
  38. // 读取SEQ目录
  39. if rd, err = ioutil.ReadDir(editab.Seq_folder + "/inbox"); err != nil {
  40. err = errors.New(fmt.Sprintf("无法读取SEQ文件夹%s !", editab.Seq_folder))
  41. return
  42. }
  43. // 遍历SEQ文件夹内的文件
  44. for _, fi = range rd {
  45. if fi.IsDir() {
  46. continue
  47. }
  48. seq_file = editab.Seq_folder + "/inbox" + "/" + fi.Name()
  49. // 判断文件的合规性
  50. if matched, err = regexp.MatchString(editab.Seq_filename_regexp, fi.Name()); err != nil {
  51. errinfo = fmt.Sprintf("EDI SEQ文件%s 匹配命名规则%s 出错 %v !", fi.Name(), editab.Seq_filename_regexp, err)
  52. os.Rename(seq_file, editab.Seq_folder+"/errbox"+"/"+fi.Name())
  53. // 发送邮件
  54. if err = EdiSendSeqErrorEmail(editab, errinfo); err != nil {
  55. return
  56. }
  57. continue
  58. }
  59. if !matched {
  60. errinfo = fmt.Sprintf("EDI SEQ文件%s 不符合文件名命名规范%s !", fi.Name(), editab.Seq_filename_regexp)
  61. os.Rename(seq_file, editab.Seq_folder+"/errbox"+"/"+fi.Name())
  62. // 发送邮件
  63. if err = EdiSendSeqErrorEmail(editab, errinfo); err != nil {
  64. return
  65. }
  66. continue
  67. }
  68. // 解析SEQ文件
  69. seqobj = seq.SEQUENCE{}
  70. if err = seq.ParseSeqEdi(seq_file, &seqobj); err != nil {
  71. errinfo = fmt.Sprintf("解析SEQ文件%s 失败%v !", fi.Name(), err)
  72. os.Rename(seq_file, editab.Seq_folder+"/errbox"+"/"+fi.Name())
  73. // 发送邮件
  74. if err = EdiSendSeqErrorEmail(editab, errinfo); err != nil {
  75. return
  76. }
  77. continue
  78. }
  79. // 获取SEQ的PF
  80. pfid = strings.TrimSpace(seqobj.Ftx.PartFamily)
  81. if pfid == "" {
  82. errinfo = fmt.Sprintf("SEQ文件%s 的零件族为空 !", fi.Name())
  83. os.Rename(seq_file, editab.Seq_folder+"/errbox"+"/"+fi.Name())
  84. // 发送邮件
  85. if err = EdiSendSeqErrorEmail(editab, errinfo); err != nil {
  86. return
  87. }
  88. continue
  89. }
  90. // 与SEQ子项比较,适配零件族则转移
  91. matched = false
  92. for _, ediitemtab = range editab.Itemlst {
  93. if strings.TrimSpace(ediitemtab.Itemtype) != "SEQ" {
  94. continue
  95. }
  96. pflist = strings.Split(ediitemtab.Keyval, ",")
  97. for i = 0; i < len(pflist); i++ {
  98. if pfid == strings.TrimSpace(pflist[i]) {
  99. matched = true
  100. break
  101. }
  102. }
  103. if matched {
  104. seq_move_folder = strings.TrimSpace(ediitemtab.Inbox_folder)
  105. break
  106. }
  107. }
  108. if matched {
  109. os.Rename(seq_file, seq_move_folder+"/inbox"+"/"+fi.Name())
  110. fmt.Println("成功为SEQ文件",seq_file,"匹配到项目文件夹",seq_move_folder)
  111. }else{
  112. errinfo = fmt.Sprintf("没有为SEQ文件%s 找到适配的SEQ项目!", fi.Name())
  113. os.Rename(seq_file, editab.Seq_folder+"/errbox"+"/"+fi.Name())
  114. // 发送邮件
  115. if err = EdiSendSeqErrorEmail(editab, errinfo); err != nil {
  116. return
  117. }
  118. continue
  119. }
  120. }
  121. return
  122. }
  123. func EdiSendSeqErrorEmail(editab db.Edi_oem, errinfo string)(err error){
  124. var mail db.Sendmailtab
  125. mail.Status = "waiting"
  126. mail.Body = errinfo
  127. mail.Subject = "SEQ文件指派项目文件夹错误"
  128. mail.Name = editab.From_email
  129. mail.Tomail = editab.Edi_error_to_recievers
  130. mail.Host = editab.Emailserver_host
  131. mail.Password = editab.From_pwd
  132. mail.Username = editab.From_email
  133. err = mail.Add()
  134. if err != nil {
  135. glog.InfoExtln("发送邮件", "err is :", err)
  136. }
  137. return
  138. }