fix.go 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547
  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 FixEmailBaseInfo() {
  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, true)
  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. to := mbox.Messages // 此文件下的邮件总数
  70. err = mail.ListenMailV2(c, to)
  71. if err != nil {
  72. fmt.Println("处理失败:", err)
  73. }
  74. }
  75. func FixHistory() {
  76. list, err := report.GetMailOutsideReport()
  77. if err != nil {
  78. fmt.Println("获取没有分类的信息失败:", err)
  79. return
  80. }
  81. ruleJson, err := eta.GetBusinessConfByKey("MailCheckRule")
  82. if err != nil {
  83. global.FILE_LOG.Error("获取规则配置失败:%v", err)
  84. return
  85. }
  86. var ruleList []report.MailRule
  87. err = json.Unmarshal([]byte(ruleJson.ConfVal), &ruleList)
  88. if err != nil {
  89. global.FILE_LOG.Error("解析规则配置失败:%v", err)
  90. return
  91. }
  92. ruleMap := make(map[string]report.MailRule)
  93. for _, v := range ruleList {
  94. ruleMap[v.Rule] = v
  95. }
  96. classifyAll, e := report.GetClassifyAll()
  97. if e != nil {
  98. err = e
  99. global.FILE_LOG.Error("获取分类失败:", err)
  100. return
  101. }
  102. calssifyMap := make(map[int]*report.Classify)
  103. for _, v := range classifyAll {
  104. calssifyMap[v.Id] = v
  105. }
  106. for _, reportInfo := range list {
  107. for _, v := range ruleList {
  108. title := strings.ToLower(reportInfo.Title)
  109. rule := strings.ToLower(v.Rule)
  110. if strings.Contains(title, rule) {
  111. fmt.Println(reportInfo.Title, "匹配到规则:", v.Rule)
  112. reportInfo.Title = v.Title
  113. reportInfo.Abstract = v.Abstract
  114. reportInfo.ClassifyID = v.ClassifyId
  115. if calssifyMap[v.ClassifyId] != nil {
  116. reportInfo.ClassifyName = calssifyMap[v.ClassifyId].ClassifyName
  117. }
  118. // 特殊规则
  119. if strings.Contains(title, "海外分公司市场信息月报") || strings.Contains(title, "区域市场信息月报") {
  120. if reportInfo.SysUserName == "report.pcanalyst00@petrochina-usa.com" {
  121. v.Author = "PCI"
  122. } else {
  123. v.Author = reportInfo.SysUserName
  124. }
  125. }
  126. if strings.Contains(v.Author, "@") {
  127. sysUser, tmpErr := eta.GetSysUserByEmail(v.Author)
  128. if tmpErr != nil && !utils.IsErrNoRow(tmpErr) {
  129. err = tmpErr
  130. return
  131. }
  132. if sysUser.AdminId > 0 {
  133. reportInfo.SysUserID = sysUser.AdminId
  134. reportInfo.SysUserName = sysUser.RealName
  135. } else {
  136. reportInfo.SysUserName = v.Author
  137. }
  138. } else {
  139. reportInfo.SysUserName = v.Author
  140. }
  141. err = reportInfo.Update([]string{"Title", "Abstract", "ClassifyID", "ClassifyName", "SysUserID", "SysUserName"})
  142. if err != nil {
  143. fmt.Println("更新失败:", err)
  144. return
  145. }
  146. fmt.Println(reportInfo.Title, "更新成功")
  147. break
  148. }
  149. }
  150. if strings.Contains(reportInfo.Title, "[PCI ANALYTICS CLOUD PLATFORM(00) Fwd] - ") {
  151. reportInfo.Title = strings.Replace(reportInfo.Title, "[PCI ANALYTICS CLOUD PLATFORM(00) Fwd] - ", "", -1)
  152. err = reportInfo.Update([]string{"Title"})
  153. if err != nil {
  154. fmt.Println("更新失败:", err)
  155. return
  156. }
  157. fmt.Println(reportInfo.Title, "去除前缀成功")
  158. }
  159. }
  160. }
  161. func FixHistory2() {
  162. list, err := report.GetMailOutsideReportHistory()
  163. if err != nil {
  164. fmt.Println("获取没有分类的信息失败:", err)
  165. return
  166. }
  167. fmt.Println("报告数量:", len(list))
  168. ruleJson, err := eta.GetBusinessConfByKey("MailCheckRule")
  169. if err != nil {
  170. global.FILE_LOG.Error("获取规则配置失败:%v", err)
  171. return
  172. }
  173. var ruleList []report.MailRule
  174. err = json.Unmarshal([]byte(ruleJson.ConfVal), &ruleList)
  175. if err != nil {
  176. global.FILE_LOG.Error("解析规则配置失败:%v", err)
  177. return
  178. }
  179. fmt.Println("规则数量:", len(ruleList))
  180. for _, reportInfo := range list {
  181. fmt.Println("标题:", reportInfo.Title)
  182. fmt.Println("作者:", reportInfo.SysUserName)
  183. // 特殊规则
  184. if strings.Contains(reportInfo.Title, "海外分公司市场信息月报") || strings.Contains(reportInfo.Title, "区域市场信息月报") {
  185. if reportInfo.SysUserName == "report.pcanalyst00@petrochina-usa.com" {
  186. reportInfo.SysUserName = "PCI"
  187. err = reportInfo.Update([]string{"SysUserName"})
  188. if err != nil {
  189. fmt.Println("更新失败:", err)
  190. return
  191. }
  192. fmt.Println(reportInfo.Title, "更新成功")
  193. continue
  194. } else if strings.Contains(reportInfo.SysUserName, "@") {
  195. sysUser, tmpErr := eta.GetSysUserByEmail(reportInfo.SysUserName)
  196. if tmpErr != nil && !utils.IsErrNoRow(tmpErr) {
  197. err = tmpErr
  198. return
  199. }
  200. if sysUser.AdminId > 0 {
  201. fmt.Println(reportInfo.SysUserName, " 有对应用户:", sysUser.RealName)
  202. reportInfo.SysUserID = sysUser.AdminId
  203. reportInfo.SysUserName = sysUser.RealName
  204. }
  205. fmt.Println("无对应用户")
  206. err = reportInfo.Update([]string{"SysUserID", "SysUserName"})
  207. if err != nil {
  208. fmt.Println("更新失败:", err)
  209. return
  210. }
  211. fmt.Println(reportInfo.Title, "更新成功")
  212. }
  213. }
  214. }
  215. }
  216. func FixHistory3() {
  217. list, err := report.GetMailOutsideReportHistory2()
  218. if err != nil {
  219. fmt.Println("获取没有分类的信息失败:", err)
  220. return
  221. }
  222. ruleJson, err := eta.GetBusinessConfByKey("MailCheckRule")
  223. if err != nil {
  224. global.FILE_LOG.Error("获取规则配置失败:%v", err)
  225. return
  226. }
  227. var ruleList []report.MailRule
  228. err = json.Unmarshal([]byte(ruleJson.ConfVal), &ruleList)
  229. if err != nil {
  230. global.FILE_LOG.Error("解析规则配置失败:%v", err)
  231. return
  232. }
  233. ruleMap := make(map[string]report.MailRule)
  234. for _, v := range ruleList {
  235. ruleMap[v.Rule] = v
  236. }
  237. classifyAll, e := report.GetClassifyAll()
  238. if e != nil {
  239. err = e
  240. global.FILE_LOG.Error("获取分类失败:", err)
  241. return
  242. }
  243. calssifyMap := make(map[int]*report.Classify)
  244. for _, v := range classifyAll {
  245. calssifyMap[v.Id] = v
  246. }
  247. for _, reportInfo := range list {
  248. for _, v := range ruleList {
  249. title := strings.ToLower(reportInfo.Title)
  250. rule := strings.ToLower(v.Rule)
  251. if strings.Contains(title, rule) {
  252. fmt.Println(reportInfo.Title, "匹配到规则:", v.Rule)
  253. reportInfo.Title = v.Title
  254. reportInfo.Abstract = v.Abstract
  255. reportInfo.ClassifyID = v.ClassifyId
  256. if calssifyMap[v.ClassifyId] != nil {
  257. reportInfo.ClassifyName = calssifyMap[v.ClassifyId].ClassifyName
  258. }
  259. // 特殊规则
  260. if reportInfo.ClassifyID == 377 || reportInfo.ClassifyID == 378 {
  261. if reportInfo.SysUserName == "report.pcanalyst00@petrochina-usa.com" {
  262. v.Author = "PCI"
  263. } else {
  264. v.Author = reportInfo.SysUserName
  265. }
  266. }
  267. if strings.Contains(v.Author, "@") {
  268. sysUser, tmpErr := eta.GetSysUserByEmail(v.Author)
  269. if tmpErr != nil && !utils.IsErrNoRow(tmpErr) {
  270. err = tmpErr
  271. return
  272. }
  273. if sysUser.AdminId > 0 {
  274. reportInfo.SysUserID = sysUser.AdminId
  275. reportInfo.SysUserName = sysUser.RealName
  276. } else {
  277. reportInfo.SysUserName = v.Author
  278. }
  279. } else {
  280. reportInfo.SysUserName = v.Author
  281. }
  282. err = reportInfo.Update([]string{"Title", "Abstract", "SysUserID", "SysUserName"})
  283. if err != nil {
  284. fmt.Println("更新失败:", err)
  285. return
  286. }
  287. fmt.Println(reportInfo.Title, "更新成功")
  288. break
  289. }
  290. }
  291. if strings.Contains(reportInfo.Title, "[PCI ANALYTICS CLOUD PLATFORM(00) Fwd] - ") {
  292. reportInfo.Title = strings.Replace(reportInfo.Title, "[PCI ANALYTICS CLOUD PLATFORM(00) Fwd] - ", "", -1)
  293. err = reportInfo.Update([]string{"Title"})
  294. if err != nil {
  295. fmt.Println("更新失败:", err)
  296. return
  297. }
  298. fmt.Println(reportInfo.Title, "去除前缀成功")
  299. }
  300. }
  301. }
  302. func FixHistory1226() {
  303. list, err := report.GetMailOutsideReportHistory3()
  304. if err != nil {
  305. fmt.Println("获取没有分类的信息失败:", err)
  306. return
  307. }
  308. ruleJson, err := eta.GetBusinessConfByKey("MailCheckRule")
  309. if err != nil {
  310. global.FILE_LOG.Error("获取规则配置失败:%v", err)
  311. return
  312. }
  313. var ruleList []report.MailRule
  314. err = json.Unmarshal([]byte(ruleJson.ConfVal), &ruleList)
  315. if err != nil {
  316. global.FILE_LOG.Error("解析规则配置失败:%v", err)
  317. return
  318. }
  319. ruleMap := make(map[string]report.MailRule)
  320. for _, v := range ruleList {
  321. ruleMap[v.Rule] = v
  322. }
  323. classifyAll, e := report.GetClassifyAll()
  324. if e != nil {
  325. err = e
  326. global.FILE_LOG.Error("获取分类失败:", err)
  327. return
  328. }
  329. calssifyMap := make(map[int]*report.Classify)
  330. for _, v := range classifyAll {
  331. calssifyMap[v.Id] = v
  332. }
  333. for _, reportInfo := range list {
  334. for _, v := range ruleList {
  335. title := strings.ToLower(reportInfo.Title)
  336. rule := strings.ToLower(v.Rule)
  337. if strings.Contains(title, rule) {
  338. fmt.Println(reportInfo.Title, "匹配到规则:", v.Rule)
  339. reportInfo.Title = v.Title
  340. reportInfo.Abstract = v.Abstract
  341. reportInfo.ClassifyID = v.ClassifyId
  342. if calssifyMap[v.ClassifyId] != nil {
  343. reportInfo.ClassifyName = calssifyMap[v.ClassifyId].ClassifyName
  344. }
  345. // 特殊规则
  346. if strings.Contains(title, "海外分公司市场信息月报") || strings.Contains(title, "区域市场信息月报") {
  347. if reportInfo.SysUserName == "report.pcanalyst00@petrochina-usa.com" {
  348. v.Author = "PCI"
  349. } else {
  350. v.Author = reportInfo.SysUserName
  351. }
  352. }
  353. if strings.Contains(v.Author, "@") {
  354. sysUser, tmpErr := eta.GetSysUserByEmail(v.Author)
  355. if tmpErr != nil && !utils.IsErrNoRow(tmpErr) {
  356. err = tmpErr
  357. return
  358. }
  359. if sysUser.AdminId > 0 {
  360. reportInfo.SysUserID = sysUser.AdminId
  361. reportInfo.SysUserName = sysUser.RealName
  362. } else {
  363. reportInfo.SysUserName = v.Author
  364. }
  365. } else {
  366. reportInfo.SysUserName = v.Author
  367. }
  368. err = reportInfo.Update([]string{"Title", "Abstract", "ClassifyID", "ClassifyName", "SysUserID", "SysUserName"})
  369. if err != nil {
  370. fmt.Println("更新失败:", err)
  371. return
  372. }
  373. fmt.Println(reportInfo.Title, "更新成功")
  374. break
  375. }
  376. }
  377. if strings.Contains(reportInfo.Title, "[PCI ANALYTICS CLOUD PLATFORM(00) Fwd] - ") {
  378. reportInfo.Title = strings.Replace(reportInfo.Title, "[PCI ANALYTICS CLOUD PLATFORM(00) Fwd] - ", "", -1)
  379. err = reportInfo.Update([]string{"Title"})
  380. if err != nil {
  381. fmt.Println("更新失败:", err)
  382. return
  383. }
  384. fmt.Println(reportInfo.Title, "去除前缀成功")
  385. }
  386. }
  387. }
  388. func FixUserName() {
  389. var condition string
  390. var pars []interface{}
  391. idList := []int{409, 398, 395, 406, 411, 404, 402, 397, 410, 403, 407, 391, 392, 393, 394, 390, 388, 389, 396, 399, 400, 401, 405, 408, 415, 416}
  392. condition += " AND classify_id IN ? "
  393. pars = append(pars, idList)
  394. list, err := report.GetOutsideReportListByCondition(condition, pars)
  395. if err != nil {
  396. fmt.Println("获取报告失败:", err)
  397. return
  398. }
  399. obj := report.OutsideEmailBaseInfo{}
  400. for _, v := range list {
  401. // 没有id就忽略
  402. if v.EmailMessageUID <= 0 {
  403. continue
  404. }
  405. emailMessage, err := obj.GetByEmailMessageIdAndFolder(uint32(v.EmailMessageUID), "INBOX")
  406. if err != nil {
  407. fmt.Println("查找邮件失败:", err)
  408. continue
  409. }
  410. title := emailMessage.Title
  411. var abstract string
  412. var classifyId int
  413. var classifyName string
  414. var sysUserId int
  415. var sysUserName string
  416. sysUserName = emailMessage.FromAddress
  417. // 查找用户
  418. if emailMessage.From != `` {
  419. tmpEmailStrList := strings.Split(sysUserName, "<")
  420. if len(tmpEmailStrList) >= 2 {
  421. sysUserName = tmpEmailStrList[1]
  422. tmpEmailStrList = strings.Split(sysUserName, ">")
  423. if len(tmpEmailStrList) >= 2 {
  424. sysUserName = tmpEmailStrList[0]
  425. }
  426. }
  427. sysUser, tmpErr := eta.GetSysUserByEmail(sysUserName)
  428. if tmpErr != nil && !utils.IsErrNoRow(tmpErr) {
  429. err = tmpErr
  430. return
  431. }
  432. if tmpErr == nil {
  433. sysUserId = sysUser.AdminId
  434. sysUserName = sysUser.RealName
  435. }
  436. }
  437. title = strings.Replace(title, "[PCI ANALYTICS CLOUD PLATFORM(00) Fwd] - ", "", -1)
  438. for _, ruleInfo := range ruleList {
  439. tmpTitle := strings.ToLower(emailMessage.Title)
  440. rule := strings.ToLower(ruleInfo.Rule)
  441. if strings.Contains(tmpTitle, rule) {
  442. title = ruleInfo.Title
  443. abstract = ruleInfo.Abstract
  444. classifyId = ruleInfo.ClassifyId
  445. classify, e := report.GetClassifyByClassifyId(ruleInfo.ClassifyId)
  446. if e != nil {
  447. err = e
  448. global.FILE_LOG.Error("获取分类失败:", err)
  449. return
  450. }
  451. classifyName = classify.ClassifyName
  452. // 特殊规则
  453. //if strings.Contains(title, "海外分公司市场信息月报") || strings.Contains(title, "区域市场信息月报") {
  454. // if emailMessage.From == "report.pcanalyst00@petrochina-usa.com" {
  455. // sysUserName = "PCI"
  456. // break
  457. // } else {
  458. // v.Author = emailMessage.From
  459. // }
  460. //}
  461. if ruleInfo.Author != `` {
  462. if strings.Contains(ruleInfo.Author, "@") {
  463. sysUser, tmpErr := eta.GetSysUserByEmail(ruleInfo.Author)
  464. if tmpErr != nil && !utils.IsErrNoRow(tmpErr) {
  465. err = tmpErr
  466. return
  467. }
  468. if sysUser.AdminId > 0 {
  469. sysUserId = sysUser.AdminId
  470. sysUserName = sysUser.RealName
  471. } else {
  472. sysUserName = ruleInfo.Author
  473. }
  474. } else {
  475. sysUserName = ruleInfo.Author
  476. }
  477. }
  478. break
  479. }
  480. }
  481. updateCols := make([]string, 0)
  482. if v.SysUserID != sysUserId {
  483. v.SysUserID = sysUserId
  484. updateCols = append(updateCols, "sys_user_id")
  485. }
  486. if v.SysUserName != sysUserName {
  487. v.SysUserName = sysUserName
  488. updateCols = append(updateCols, "sys_user_name")
  489. }
  490. if v.Abstract != abstract {
  491. v.Abstract = abstract
  492. updateCols = append(updateCols, "abstract")
  493. }
  494. if v.ClassifyID != classifyId {
  495. v.ClassifyID = classifyId
  496. updateCols = append(updateCols, "classify_id")
  497. }
  498. if v.ClassifyName != classifyName {
  499. v.ClassifyName = classifyName
  500. updateCols = append(updateCols, "classify_name")
  501. }
  502. if len(updateCols) > 0 {
  503. err = v.Update(updateCols)
  504. if err != nil {
  505. fmt.Println(v.OutsideReportID, "更新失败:", err)
  506. }
  507. }
  508. }
  509. fmt.Println("修复完成")
  510. }