fix.go 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424
  1. package pcsg
  2. import (
  3. "encoding/json"
  4. "errors"
  5. "eta/eta_email_analysis/global"
  6. "eta/eta_email_analysis/models/eta"
  7. "eta/eta_email_analysis/models/report"
  8. "eta/eta_email_analysis/utils"
  9. "eta/eta_email_analysis/utils/mail"
  10. "fmt"
  11. "github.com/emersion/go-imap"
  12. "github.com/emersion/go-imap/client"
  13. "log"
  14. "strings"
  15. )
  16. func Fix() {
  17. mailAddress := fmt.Sprintf("%s:%d", global.CONFIG.Email.Host, global.CONFIG.Email.Port)
  18. // 建立与 IMAP 服务器的连接
  19. c, err := client.DialTLS(mailAddress, nil)
  20. if err != nil {
  21. fmt.Printf("连接 IMAP 服务器失败: %+v \n", err)
  22. return
  23. }
  24. // 最后一定不要忘记退出登录
  25. defer func() {
  26. _ = c.Logout()
  27. }()
  28. // 登录
  29. if err = c.Login(global.CONFIG.Email.UserName, global.CONFIG.Email.Password); err != nil {
  30. fmt.Printf("邮箱[%s] 登录失败: %v \n", fmt.Sprintf("%s:%s", global.CONFIG.Email.UserName, mailAddress), err)
  31. return
  32. }
  33. // 列出当前邮箱中的文件夹
  34. mailboxes := make(chan *imap.MailboxInfo, 10)
  35. done := make(chan error, 1) // 记录错误的 chan
  36. go func() {
  37. done <- c.List("", "*", mailboxes)
  38. }()
  39. log.Println("-->当前邮箱的文件夹 Mailboxes:")
  40. var folderExists bool
  41. for m := range mailboxes {
  42. log.Println("* ", m.Name)
  43. if m.Name == global.CONFIG.Email.Folder {
  44. folderExists = true
  45. }
  46. }
  47. err = <-done
  48. if err != nil {
  49. global.LOG.Errorf("列出邮箱列表时,出现错误:%v \n", err)
  50. return
  51. }
  52. log.Println("-->列出邮箱列表完毕!")
  53. if !folderExists {
  54. err = errors.New(fmt.Sprintf("文件夹[%s] 不存在 \n", global.CONFIG.Email.Folder))
  55. return
  56. }
  57. // 选择指定的文件夹
  58. mbox, err := c.Select(global.CONFIG.Email.Folder, false)
  59. if err != nil {
  60. err = errors.New(fmt.Sprintf("选择邮件箱失败: %+v", err))
  61. return
  62. }
  63. //log.Printf("mbox %+v \n", mbox)
  64. log.Printf("当前文件夹[%s]中,总共有 %d 封邮件 \n", global.CONFIG.Email.Folder, mbox.Messages)
  65. if mbox.Messages == 0 {
  66. //log.Fatalf("当前文件夹[%s]中没有邮件", folder)
  67. return
  68. }
  69. list, err := report.GetNoSysUserNameOutsideReport()
  70. if err != nil {
  71. fmt.Println("获取没有用户的信息失败:", err)
  72. return
  73. }
  74. for _, v := range list {
  75. _, fromName, tmpErr := mail.ListenMailV2(c, v.EmailMessageUID)
  76. if tmpErr != nil {
  77. fmt.Println(v.Title, ",获取失败:", tmpErr)
  78. continue
  79. }
  80. v.SysUserName = fromName
  81. tmpErr = v.Update([]string{"SysUserName"})
  82. if tmpErr != nil {
  83. fmt.Println(v.Title, ",更新信息失败:", tmpErr)
  84. continue
  85. }
  86. }
  87. }
  88. func FixHistory() {
  89. list, err := report.GetMailOutsideReport()
  90. if err != nil {
  91. fmt.Println("获取没有分类的信息失败:", err)
  92. return
  93. }
  94. ruleJson, err := eta.GetBusinessConfByKey("MailCheckRule")
  95. if err != nil {
  96. global.FILE_LOG.Error("获取规则配置失败:%v", err)
  97. return
  98. }
  99. var ruleList []report.MailRule
  100. err = json.Unmarshal([]byte(ruleJson.ConfVal), &ruleList)
  101. if err != nil {
  102. global.FILE_LOG.Error("解析规则配置失败:%v", err)
  103. return
  104. }
  105. ruleMap := make(map[string]report.MailRule)
  106. for _, v := range ruleList {
  107. ruleMap[v.Rule] = v
  108. }
  109. classifyAll, e := report.GetClassifyAll()
  110. if e != nil {
  111. err = e
  112. global.FILE_LOG.Error("获取分类失败:", err)
  113. return
  114. }
  115. calssifyMap := make(map[int]*report.Classify)
  116. for _, v := range classifyAll {
  117. calssifyMap[v.Id] = v
  118. }
  119. for _, reportInfo := range list {
  120. for _, v := range ruleList {
  121. title := strings.ToLower(reportInfo.Title)
  122. rule := strings.ToLower(v.Rule)
  123. if strings.Contains(title, rule) {
  124. fmt.Println(reportInfo.Title, "匹配到规则:", v.Rule)
  125. reportInfo.Title = v.Title
  126. reportInfo.Abstract = v.Abstract
  127. reportInfo.ClassifyID = v.ClassifyId
  128. if calssifyMap[v.ClassifyId] != nil {
  129. reportInfo.ClassifyName = calssifyMap[v.ClassifyId].ClassifyName
  130. }
  131. // 特殊规则
  132. if strings.Contains(title, "海外分公司市场信息月报") || strings.Contains(title, "区域市场信息月报") {
  133. if reportInfo.SysUserName == "report.pcanalyst00@petrochina-usa.com" {
  134. v.Author = "PCI"
  135. } else {
  136. v.Author = reportInfo.SysUserName
  137. }
  138. }
  139. if strings.Contains(v.Author, "@") {
  140. sysUser, tmpErr := eta.GetSysUserByEmail(v.Author)
  141. if tmpErr != nil && !utils.IsErrNoRow(tmpErr) {
  142. err = tmpErr
  143. return
  144. }
  145. if sysUser.AdminId > 0 {
  146. reportInfo.SysUserID = sysUser.AdminId
  147. reportInfo.SysUserName = sysUser.RealName
  148. } else {
  149. reportInfo.SysUserName = v.Author
  150. }
  151. } else {
  152. reportInfo.SysUserName = v.Author
  153. }
  154. err = reportInfo.Update([]string{"Title", "Abstract", "ClassifyID", "ClassifyName", "SysUserID", "SysUserName"})
  155. if err != nil {
  156. fmt.Println("更新失败:", err)
  157. return
  158. }
  159. fmt.Println(reportInfo.Title, "更新成功")
  160. break
  161. }
  162. }
  163. if strings.Contains(reportInfo.Title, "[PCI ANALYTICS CLOUD PLATFORM(00) Fwd] - ") {
  164. reportInfo.Title = strings.Replace(reportInfo.Title, "[PCI ANALYTICS CLOUD PLATFORM(00) Fwd] - ", "", -1)
  165. err = reportInfo.Update([]string{"Title"})
  166. if err != nil {
  167. fmt.Println("更新失败:", err)
  168. return
  169. }
  170. fmt.Println(reportInfo.Title, "去除前缀成功")
  171. }
  172. }
  173. }
  174. func FixHistory2() {
  175. list, err := report.GetMailOutsideReportHistory()
  176. if err != nil {
  177. fmt.Println("获取没有分类的信息失败:", err)
  178. return
  179. }
  180. fmt.Println("报告数量:", len(list))
  181. ruleJson, err := eta.GetBusinessConfByKey("MailCheckRule")
  182. if err != nil {
  183. global.FILE_LOG.Error("获取规则配置失败:%v", err)
  184. return
  185. }
  186. var ruleList []report.MailRule
  187. err = json.Unmarshal([]byte(ruleJson.ConfVal), &ruleList)
  188. if err != nil {
  189. global.FILE_LOG.Error("解析规则配置失败:%v", err)
  190. return
  191. }
  192. fmt.Println("规则数量:", len(ruleList))
  193. for _, reportInfo := range list {
  194. fmt.Println("标题:", reportInfo.Title)
  195. fmt.Println("作者:", reportInfo.SysUserName)
  196. // 特殊规则
  197. if strings.Contains(reportInfo.Title, "海外分公司市场信息月报") || strings.Contains(reportInfo.Title, "区域市场信息月报") {
  198. if reportInfo.SysUserName == "report.pcanalyst00@petrochina-usa.com" {
  199. reportInfo.SysUserName = "PCI"
  200. err = reportInfo.Update([]string{"SysUserName"})
  201. if err != nil {
  202. fmt.Println("更新失败:", err)
  203. return
  204. }
  205. fmt.Println(reportInfo.Title, "更新成功")
  206. continue
  207. } else if strings.Contains(reportInfo.SysUserName, "@") {
  208. sysUser, tmpErr := eta.GetSysUserByEmail(reportInfo.SysUserName)
  209. if tmpErr != nil && !utils.IsErrNoRow(tmpErr) {
  210. err = tmpErr
  211. return
  212. }
  213. if sysUser.AdminId > 0 {
  214. fmt.Println(reportInfo.SysUserName, " 有对应用户:", sysUser.RealName)
  215. reportInfo.SysUserID = sysUser.AdminId
  216. reportInfo.SysUserName = sysUser.RealName
  217. }
  218. fmt.Println("无对应用户")
  219. err = reportInfo.Update([]string{"SysUserID", "SysUserName"})
  220. if err != nil {
  221. fmt.Println("更新失败:", err)
  222. return
  223. }
  224. fmt.Println(reportInfo.Title, "更新成功")
  225. }
  226. }
  227. }
  228. }
  229. func FixHistory3() {
  230. list, err := report.GetMailOutsideReportHistory2()
  231. if err != nil {
  232. fmt.Println("获取没有分类的信息失败:", err)
  233. return
  234. }
  235. ruleJson, err := eta.GetBusinessConfByKey("MailCheckRule")
  236. if err != nil {
  237. global.FILE_LOG.Error("获取规则配置失败:%v", err)
  238. return
  239. }
  240. var ruleList []report.MailRule
  241. err = json.Unmarshal([]byte(ruleJson.ConfVal), &ruleList)
  242. if err != nil {
  243. global.FILE_LOG.Error("解析规则配置失败:%v", err)
  244. return
  245. }
  246. ruleMap := make(map[string]report.MailRule)
  247. for _, v := range ruleList {
  248. ruleMap[v.Rule] = v
  249. }
  250. classifyAll, e := report.GetClassifyAll()
  251. if e != nil {
  252. err = e
  253. global.FILE_LOG.Error("获取分类失败:", err)
  254. return
  255. }
  256. calssifyMap := make(map[int]*report.Classify)
  257. for _, v := range classifyAll {
  258. calssifyMap[v.Id] = v
  259. }
  260. for _, reportInfo := range list {
  261. for _, v := range ruleList {
  262. title := strings.ToLower(reportInfo.Title)
  263. rule := strings.ToLower(v.Rule)
  264. if strings.Contains(title, rule) {
  265. fmt.Println(reportInfo.Title, "匹配到规则:", v.Rule)
  266. reportInfo.Title = v.Title
  267. reportInfo.Abstract = v.Abstract
  268. reportInfo.ClassifyID = v.ClassifyId
  269. if calssifyMap[v.ClassifyId] != nil {
  270. reportInfo.ClassifyName = calssifyMap[v.ClassifyId].ClassifyName
  271. }
  272. // 特殊规则
  273. if reportInfo.ClassifyID == 377 || reportInfo.ClassifyID == 378 {
  274. if reportInfo.SysUserName == "report.pcanalyst00@petrochina-usa.com" {
  275. v.Author = "PCI"
  276. } else {
  277. v.Author = reportInfo.SysUserName
  278. }
  279. }
  280. if strings.Contains(v.Author, "@") {
  281. sysUser, tmpErr := eta.GetSysUserByEmail(v.Author)
  282. if tmpErr != nil && !utils.IsErrNoRow(tmpErr) {
  283. err = tmpErr
  284. return
  285. }
  286. if sysUser.AdminId > 0 {
  287. reportInfo.SysUserID = sysUser.AdminId
  288. reportInfo.SysUserName = sysUser.RealName
  289. } else {
  290. reportInfo.SysUserName = v.Author
  291. }
  292. } else {
  293. reportInfo.SysUserName = v.Author
  294. }
  295. err = reportInfo.Update([]string{"Title", "Abstract", "SysUserID", "SysUserName"})
  296. if err != nil {
  297. fmt.Println("更新失败:", err)
  298. return
  299. }
  300. fmt.Println(reportInfo.Title, "更新成功")
  301. break
  302. }
  303. }
  304. if strings.Contains(reportInfo.Title, "[PCI ANALYTICS CLOUD PLATFORM(00) Fwd] - ") {
  305. reportInfo.Title = strings.Replace(reportInfo.Title, "[PCI ANALYTICS CLOUD PLATFORM(00) Fwd] - ", "", -1)
  306. err = reportInfo.Update([]string{"Title"})
  307. if err != nil {
  308. fmt.Println("更新失败:", err)
  309. return
  310. }
  311. fmt.Println(reportInfo.Title, "去除前缀成功")
  312. }
  313. }
  314. }
  315. func FixHistory1226() {
  316. list, err := report.GetMailOutsideReportHistory3()
  317. if err != nil {
  318. fmt.Println("获取没有分类的信息失败:", err)
  319. return
  320. }
  321. ruleJson, err := eta.GetBusinessConfByKey("MailCheckRule")
  322. if err != nil {
  323. global.FILE_LOG.Error("获取规则配置失败:%v", err)
  324. return
  325. }
  326. var ruleList []report.MailRule
  327. err = json.Unmarshal([]byte(ruleJson.ConfVal), &ruleList)
  328. if err != nil {
  329. global.FILE_LOG.Error("解析规则配置失败:%v", err)
  330. return
  331. }
  332. ruleMap := make(map[string]report.MailRule)
  333. for _, v := range ruleList {
  334. ruleMap[v.Rule] = v
  335. }
  336. classifyAll, e := report.GetClassifyAll()
  337. if e != nil {
  338. err = e
  339. global.FILE_LOG.Error("获取分类失败:", err)
  340. return
  341. }
  342. calssifyMap := make(map[int]*report.Classify)
  343. for _, v := range classifyAll {
  344. calssifyMap[v.Id] = v
  345. }
  346. for _, reportInfo := range list {
  347. for _, v := range ruleList {
  348. title := strings.ToLower(reportInfo.Title)
  349. rule := strings.ToLower(v.Rule)
  350. if strings.Contains(title, rule) {
  351. fmt.Println(reportInfo.Title, "匹配到规则:", v.Rule)
  352. reportInfo.Title = v.Title
  353. reportInfo.Abstract = v.Abstract
  354. reportInfo.ClassifyID = v.ClassifyId
  355. if calssifyMap[v.ClassifyId] != nil {
  356. reportInfo.ClassifyName = calssifyMap[v.ClassifyId].ClassifyName
  357. }
  358. // 特殊规则
  359. if strings.Contains(title, "海外分公司市场信息月报") || strings.Contains(title, "区域市场信息月报") {
  360. if reportInfo.SysUserName == "report.pcanalyst00@petrochina-usa.com" {
  361. v.Author = "PCI"
  362. } else {
  363. v.Author = reportInfo.SysUserName
  364. }
  365. }
  366. if strings.Contains(v.Author, "@") {
  367. sysUser, tmpErr := eta.GetSysUserByEmail(v.Author)
  368. if tmpErr != nil && !utils.IsErrNoRow(tmpErr) {
  369. err = tmpErr
  370. return
  371. }
  372. if sysUser.AdminId > 0 {
  373. reportInfo.SysUserID = sysUser.AdminId
  374. reportInfo.SysUserName = sysUser.RealName
  375. } else {
  376. reportInfo.SysUserName = v.Author
  377. }
  378. } else {
  379. reportInfo.SysUserName = v.Author
  380. }
  381. err = reportInfo.Update([]string{"Title", "Abstract", "ClassifyID", "ClassifyName", "SysUserID", "SysUserName"})
  382. if err != nil {
  383. fmt.Println("更新失败:", err)
  384. return
  385. }
  386. fmt.Println(reportInfo.Title, "更新成功")
  387. break
  388. }
  389. }
  390. if strings.Contains(reportInfo.Title, "[PCI ANALYTICS CLOUD PLATFORM(00) Fwd] - ") {
  391. reportInfo.Title = strings.Replace(reportInfo.Title, "[PCI ANALYTICS CLOUD PLATFORM(00) Fwd] - ", "", -1)
  392. err = reportInfo.Update([]string{"Title"})
  393. if err != nil {
  394. fmt.Println("更新失败:", err)
  395. return
  396. }
  397. fmt.Println(reportInfo.Title, "去除前缀成功")
  398. }
  399. }
  400. }