index_merge.go 32 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097
  1. package services
  2. import (
  3. "encoding/json"
  4. "fmt"
  5. "hongze/mysteel_watch/global"
  6. "hongze/mysteel_watch/models/index"
  7. "hongze/mysteel_watch/utils"
  8. "strconv"
  9. "strings"
  10. "sync"
  11. "time"
  12. "github.com/rdlucklib/rdluck_tools/paging"
  13. "github.com/xuri/excelize/v2"
  14. )
  15. // Merge 合并指标
  16. func Merge() {
  17. fmt.Println("merge start")
  18. /*
  19. 年底,季度,存放在一个excel中
  20. 月度30个指标存一个excel
  21. 周度25个指标存放一个excel
  22. 日度20个指标存一个excel
  23. */
  24. //年度->38
  25. IndexYearMerge()
  26. //季度->5
  27. IndexSeasonMerge()
  28. //月度->86
  29. IndexMonthMerge()
  30. //周度->292
  31. IndexWeekMerge()
  32. //日度->114
  33. IndexDayMerge()
  34. //merge_file_path
  35. fmt.Println("merge end")
  36. }
  37. //年度
  38. func IndexYearMerge() {
  39. frequency := "年度"
  40. fileName := "year" + ".xlsx" //保存的文件名称
  41. yearIndexFilePath := utils.IndexMsergeSaveDir + fileName
  42. var err error
  43. indexObj := new(index.BaseFromMysteelChemicalIndex)
  44. yearList, err := indexObj.GetIndexByFrequency(frequency)
  45. if err != nil {
  46. fmt.Println("GetIndexByFrequency Err:" + err.Error())
  47. return
  48. }
  49. if len(yearList) <= 0 {
  50. return
  51. }
  52. commentResult, err := GetIndexComment(yearIndexFilePath, yearList, 1)
  53. if err != nil {
  54. fmt.Println("GetIndexComment Err:" + err.Error())
  55. return
  56. }
  57. if utils.FileIsExist(yearIndexFilePath) { //修改文件
  58. fileObj, err := excelize.OpenFile(yearIndexFilePath)
  59. if err != nil {
  60. fmt.Println("打开文件失败,Err:" + err.Error())
  61. return
  62. }
  63. fileObj.DeleteComment("Sheet1", "A1")
  64. fileObj.AddComment("Sheet1", "A1", commentResult)
  65. if err := fileObj.SaveAs(yearIndexFilePath); err != nil {
  66. fmt.Println("保存失败,Err:" + err.Error())
  67. fileObj.Close()
  68. return
  69. }
  70. fileObj.Close()
  71. } else { //新增文件
  72. templatePath := utils.IndexSaveDir + "index_template.xlsx"
  73. templateFile, err := excelize.OpenFile(templatePath)
  74. if err != nil {
  75. fmt.Println("打开文件失败,Err:" + err.Error())
  76. return
  77. }
  78. templateFile.DeleteComment("Sheet1", "A1")
  79. templateFile.AddComment("Sheet1", "A1", commentResult)
  80. if err := templateFile.SaveAs(yearIndexFilePath); err != nil {
  81. fmt.Println("保存失败,Err:" + err.Error())
  82. templateFile.Close()
  83. return
  84. }
  85. templateFile.Close()
  86. }
  87. //处理excel数据
  88. }
  89. //季度
  90. func IndexSeasonMerge() {
  91. frequency := "季度"
  92. fileName := "season" + ".xlsx" //保存的文件名称
  93. seasonIndexFilePath := utils.IndexMsergeSaveDir + fileName
  94. var err error
  95. indexObj := new(index.BaseFromMysteelChemicalIndex)
  96. seasonList, err := indexObj.GetIndexByFrequency(frequency)
  97. if err != nil {
  98. fmt.Println("GetIndexByFrequency Err:" + err.Error())
  99. return
  100. }
  101. if len(seasonList) <= 0 {
  102. return
  103. }
  104. commentResult, err := GetIndexComment(seasonIndexFilePath, seasonList, 1)
  105. if err != nil {
  106. fmt.Println("GetIndexComment Err:" + err.Error())
  107. return
  108. }
  109. if utils.FileIsExist(seasonIndexFilePath) { //修改文件
  110. fileObj, err := excelize.OpenFile(seasonIndexFilePath)
  111. if err != nil {
  112. fmt.Println("打开文件失败,Err:" + err.Error())
  113. return
  114. }
  115. fileObj.DeleteComment("Sheet1", "A1")
  116. fileObj.AddComment("Sheet1", "A1", commentResult)
  117. if err := fileObj.SaveAs(seasonIndexFilePath); err != nil {
  118. fmt.Println("保存失败,Err:" + err.Error())
  119. fileObj.Close()
  120. return
  121. }
  122. fileObj.Close()
  123. } else { //新增文件
  124. templatePath := utils.IndexSaveDir + "index_template.xlsx"
  125. templateFile, err := excelize.OpenFile(templatePath)
  126. if err != nil {
  127. fmt.Println("打开文件失败,Err:" + err.Error())
  128. return
  129. }
  130. templateFile.DeleteComment("Sheet1", "A1")
  131. templateFile.AddComment("Sheet1", "A1", commentResult)
  132. if err := templateFile.SaveAs(seasonIndexFilePath); err != nil {
  133. fmt.Println("保存失败,Err:" + err.Error())
  134. templateFile.Close()
  135. return
  136. }
  137. templateFile.Close()
  138. }
  139. //处理excel数据
  140. }
  141. //月度
  142. //func IndexMonthMerge() {
  143. // frequency := "月度"
  144. // filePre := "month"
  145. // pageSize := 30
  146. // var err error
  147. //
  148. // indexObj := new(index.BaseFromMysteelChemicalIndex)
  149. // total, err := indexObj.GetIndexByFrequencyCount(frequency)
  150. // if err != nil {
  151. // fmt.Println("GetIndexByFrequencyCount Err:" + err.Error())
  152. // return
  153. // }
  154. //
  155. // maxFileIndexItem, err := indexObj.GetMaxFileIndex(frequency)
  156. // if err != nil {
  157. // fmt.Println("GetMaxFileIndex Err:" + err.Error())
  158. // return
  159. // }
  160. //
  161. // maxFileIndex := maxFileIndexItem.FileIndex
  162. // if maxFileIndex <= 0 {
  163. // maxFileIndex = 1
  164. // }
  165. //
  166. // fileName := filePre + "_" + strconv.Itoa(maxFileIndex) + ".xlsx" //保存的文件名称
  167. // monthIndexFilePath := utils.IndexMsergeSaveDir + fileName
  168. //
  169. // indexTotal, err := indexObj.GetIndexCountByMergeFilePath(monthIndexFilePath)
  170. // if err != nil {
  171. // fmt.Println("GetIndexCountByMergeFilePath Err:" + err.Error())
  172. // return
  173. // }
  174. //
  175. // if (indexTotal > int64(pageSize)/2) && maxFileIndex != 1 {
  176. // maxFileIndex += 1
  177. // }
  178. //
  179. // fmt.Println("maxFileIndex:", maxFileIndex)
  180. // totalPage := paging.PageCount(int(total), pageSize)
  181. // fmt.Println("total:", total)
  182. // fmt.Println("totalPage:", totalPage)
  183. // for i := 1; i <= totalPage; i++ {
  184. //
  185. // offset := (i - 1) * pageSize
  186. //
  187. // fileName = filePre + "_" + strconv.Itoa(maxFileIndex) + ".xlsx" //保存的文件名称
  188. // monthIndexFilePath := utils.IndexMsergeSaveDir + fileName
  189. // fmt.Println(monthIndexFilePath)
  190. //
  191. // fmt.Println(offset, pageSize)
  192. // pageList, err := indexObj.GetIndexByFrequencyPage(frequency, offset, pageSize)
  193. // if err != nil {
  194. // fmt.Println("GetIndexByFrequency Err:" + err.Error())
  195. // return
  196. // }
  197. //
  198. // commentResult, err := GetIndexComment(monthIndexFilePath, pageList, maxFileIndex)
  199. // if err != nil {
  200. // fmt.Println("GetIndexComment Err:" + err.Error())
  201. // return
  202. // }
  203. // if utils.FileIsExist(monthIndexFilePath) { //修改文件
  204. // fileObj, err := excelize.OpenFile(monthIndexFilePath)
  205. // if err != nil {
  206. // fmt.Println("打开文件失败,Err:" + err.Error())
  207. // return
  208. // }
  209. //
  210. // fileObj.DeleteComment("Sheet1", "A1")
  211. // fileObj.AddComment("Sheet1", "A1", commentResult)
  212. // if err := fileObj.SaveAs(monthIndexFilePath); err != nil {
  213. // fmt.Println("保存失败,Err:" + err.Error())
  214. // fileObj.Close()
  215. // return
  216. // }
  217. // fileObj.Close()
  218. // } else { //新增文件
  219. // templatePath := utils.IndexSaveDir + "index_template.xlsx"
  220. // templateFile, err := excelize.OpenFile(templatePath)
  221. // if err != nil {
  222. // fmt.Println("打开文件失败,Err:" + err.Error())
  223. // return
  224. // }
  225. // templateFile.DeleteComment("Sheet1", "A1")
  226. // templateFile.AddComment("Sheet1", "A1", commentResult)
  227. // if err := templateFile.SaveAs(monthIndexFilePath); err != nil {
  228. // fmt.Println("保存失败,Err:" + err.Error())
  229. // templateFile.Close()
  230. // return
  231. // }
  232. // templateFile.Close()
  233. // }
  234. // maxFileIndex += 1
  235. // time.Sleep(1 * time.Second)
  236. // }
  237. //}
  238. func IndexMonthMerge() {
  239. frequency := "月度"
  240. filePre := "month"
  241. pageSize := 30
  242. err := indexMerge(frequency, filePre, pageSize)
  243. if err != nil {
  244. fmt.Println("合并月度指标失败,err:", err)
  245. }
  246. }
  247. //日度
  248. //func IndexDayMerge() {
  249. // frequency := "日度"
  250. // filePre := "day"
  251. // pageSize := 30
  252. // var err error
  253. //
  254. // indexObj := new(index.BaseFromMysteelChemicalIndex)
  255. // total, err := indexObj.GetIndexByFrequencyCount(frequency)
  256. // if err != nil {
  257. // fmt.Println("GetIndexByFrequencyCount Err:" + err.Error())
  258. // return
  259. // }
  260. //
  261. // maxFileIndexItem, err := indexObj.GetMaxFileIndex(frequency)
  262. // if err != nil {
  263. // fmt.Println("GetMaxFileIndex Err:" + err.Error())
  264. // return
  265. // }
  266. //
  267. // maxFileIndex := maxFileIndexItem.FileIndex
  268. // if maxFileIndex <= 0 {
  269. // maxFileIndex = 1
  270. // }
  271. //
  272. // fileName := filePre + "_" + strconv.Itoa(maxFileIndex) + ".xlsx" //保存的文件名称
  273. // monthIndexFilePath := utils.IndexMsergeSaveDir + fileName
  274. //
  275. // indexTotal, err := indexObj.GetIndexCountByMergeFilePath(monthIndexFilePath)
  276. // if err != nil {
  277. // fmt.Println("GetIndexCountByMergeFilePath Err:" + err.Error())
  278. // return
  279. // }
  280. //
  281. // if (indexTotal > int64(pageSize)/2) && maxFileIndex != 1 {
  282. // maxFileIndex += 1
  283. // }
  284. //
  285. // fmt.Println("maxFileIndex:", maxFileIndex)
  286. // totalPage := paging.PageCount(int(total), pageSize)
  287. // fmt.Println("total:", total)
  288. // fmt.Println("totalPage:", totalPage)
  289. // for i := 1; i <= totalPage; i++ {
  290. //
  291. // offset := (i - 1) * pageSize
  292. //
  293. // fileName = filePre + "_" + strconv.Itoa(maxFileIndex) + ".xlsx" //保存的文件名称
  294. // monthIndexFilePath := utils.IndexMsergeSaveDir + fileName
  295. // fmt.Println(monthIndexFilePath)
  296. //
  297. // fmt.Println(offset, pageSize)
  298. // pageList, err := indexObj.GetIndexByFrequencyPage(frequency, offset, pageSize)
  299. // if err != nil {
  300. // fmt.Println("GetIndexByFrequency Err:" + err.Error())
  301. // return
  302. // }
  303. //
  304. // commentResult, err := GetIndexComment(monthIndexFilePath, pageList, maxFileIndex)
  305. // if err != nil {
  306. // fmt.Println("GetIndexComment Err:" + err.Error())
  307. // return
  308. // }
  309. // if utils.FileIsExist(monthIndexFilePath) { //修改文件
  310. // fileObj, err := excelize.OpenFile(monthIndexFilePath)
  311. // if err != nil {
  312. // fmt.Println("打开文件失败,Err:" + err.Error())
  313. // return
  314. // }
  315. //
  316. // fileObj.DeleteComment("Sheet1", "A1")
  317. // fileObj.AddComment("Sheet1", "A1", commentResult)
  318. // if err := fileObj.SaveAs(monthIndexFilePath); err != nil {
  319. // fmt.Println("保存失败,Err:" + err.Error())
  320. // fileObj.Close()
  321. // return
  322. // }
  323. // fileObj.Close()
  324. // } else { //新增文件
  325. // templatePath := utils.IndexSaveDir + "index_template.xlsx"
  326. // templateFile, err := excelize.OpenFile(templatePath)
  327. // if err != nil {
  328. // fmt.Println("打开文件失败,Err:" + err.Error())
  329. // return
  330. // }
  331. // templateFile.DeleteComment("Sheet1", "A1")
  332. // templateFile.AddComment("Sheet1", "A1", commentResult)
  333. // if err := templateFile.SaveAs(monthIndexFilePath); err != nil {
  334. // fmt.Println("保存失败,Err:" + err.Error())
  335. // templateFile.Close()
  336. // return
  337. // }
  338. // templateFile.Close()
  339. // }
  340. // maxFileIndex += 1
  341. // time.Sleep(1 * time.Second)
  342. // }
  343. //}
  344. // IndexDayMerge 日度指标合并
  345. func IndexDayMerge() {
  346. frequency := "日度"
  347. filePre := "day"
  348. pageSize := 30 //每个excel表需要的指标数
  349. err := indexMerge(frequency, filePre, pageSize)
  350. if err != nil {
  351. fmt.Println("合并日度指标失败,err:", err)
  352. }
  353. }
  354. // IndexWeekMerge 周度指标合并
  355. func IndexWeekMerge() {
  356. frequency := "周度"
  357. filePre := "week"
  358. pageSize := 30 //每个excel表需要的指标数
  359. err := indexMerge(frequency, filePre, pageSize)
  360. if err != nil {
  361. fmt.Println("合并周度指标失败,err:", err)
  362. }
  363. }
  364. //func IndexWeekMerge() {
  365. // frequency := "周度"
  366. // filePre := "week"
  367. // pageSize := 30 //每个excel表需要的指标数
  368. // firstIndexCount := pageSize //第一个添加的excel表需要的指标数
  369. // var err error
  370. //
  371. // indexObj := new(index.BaseFromMysteelChemicalIndex)
  372. //
  373. // // 获取未合并的指标总数量
  374. // total, err := indexObj.GetNoMergeIndexByFrequencyCount(frequency)
  375. // if err != nil {
  376. // fmt.Println("GetIndexByFrequencyCount Err:" + err.Error())
  377. // return
  378. // }
  379. // //未合并的指标总数量小于等于0,说明没有需要合并的指标
  380. // if total <=0{
  381. // return
  382. // }
  383. //
  384. // // 获取最大的文件编号下标
  385. // maxFileIndexItem, err := indexObj.GetMaxFileIndex(frequency)
  386. // if err != nil {
  387. // fmt.Println("GetMaxFileIndex Err:" + err.Error())
  388. // return
  389. // }
  390. //
  391. // maxFileIndex := maxFileIndexItem.FileIndex
  392. // if maxFileIndex <= 0 {
  393. // maxFileIndex = 1
  394. // }
  395. //
  396. // fileName := filePre + "_" + strconv.Itoa(maxFileIndex) + ".xlsx" //保存的文件名称
  397. // maxMergeIndexFilePath := utils.IndexMsergeSaveDir + fileName
  398. //
  399. // // 根据文件下标获取该文件下标已经存在多少的指标
  400. // indexTotal, err := indexObj.GetIndexCountByMergeFilePath(maxMergeIndexFilePath)
  401. // if err != nil {
  402. // fmt.Println("GetIndexCountByMergeFilePath Err:" + err.Error())
  403. // return
  404. // }
  405. //
  406. // // 如果最近的excel表的指标数量 少于 每页需要的指标数
  407. // if int(indexTotal) < pageSize {
  408. // // 最近的excel表的待添加指标数 = 每页需要的指标数 - 已经添加的指标
  409. // firstIndexCount = pageSize - int(indexTotal)
  410. // }
  411. //
  412. // fmt.Println("maxFileIndex:", maxFileIndex)
  413. //
  414. // // 除去第一个excel表的剩余需要添加的指标数量
  415. // nextTotal := int(total)-firstIndexCount
  416. // // 总文件数
  417. // totalPage := paging.PageCount(nextTotal, pageSize)
  418. // totalPage = totalPage+1 //需要加上除去在外面的指标(第一张excel)
  419. // fmt.Println("total:", total)
  420. // fmt.Println("totalPage:", totalPage)
  421. // for i := 1; i <= totalPage; i++ {
  422. // //offset := (i - 1) * pageSize
  423. //
  424. // fileName = filePre + "_" + strconv.Itoa(maxFileIndex) + ".xlsx" //保存的文件名称
  425. // mergeIndexFilePath := utils.IndexMsergeSaveDir + fileName
  426. // fmt.Println(mergeIndexFilePath)
  427. //
  428. // var list []*index.BaseFromMysteelChemicalIndex
  429. // // 需要查询的指标数
  430. // size := pageSize
  431. // if i == 1{
  432. // size = firstIndexCount // 第一页需要合并的新指标数
  433. //
  434. // // 第一页需要的指标列表
  435. // tmpList ,tmpErr := indexObj.GetIndexByFrequencyListByMergeFilePath(frequency,mergeIndexFilePath)
  436. // if tmpErr != nil{
  437. // fmt.Println("GetIndexByFrequencyListByMergeFilePath Err:" + err.Error())
  438. // return
  439. // }
  440. // list = tmpList
  441. // }
  442. // fmt.Println("需要查询",size,"个指标")
  443. //
  444. // //fmt.Println(offset, pageSize)
  445. //
  446. // // 当下需要合并到excel的指标
  447. // pageList, err := indexObj.GetNoMergeIndexByFrequencyPage(frequency, size)
  448. // if err != nil {
  449. // fmt.Println("GetIndexByFrequency Err:" + err.Error())
  450. // return
  451. // }
  452. //
  453. // if len(list)>0{
  454. // pageList = append(pageList,list...)
  455. // }
  456. //
  457. // commentResult, err := GetIndexComment(mergeIndexFilePath, pageList, maxFileIndex)
  458. // if err != nil {
  459. // fmt.Println("GetIndexComment Err:" + err.Error())
  460. // return
  461. // }
  462. // if utils.FileIsExist(mergeIndexFilePath) { //修改文件
  463. // fileObj, err := excelize.OpenFile(mergeIndexFilePath)
  464. // if err != nil {
  465. // fmt.Println("打开文件失败,Err:" + err.Error())
  466. // return
  467. // }
  468. //
  469. // fileObj.DeleteComment("Sheet1", "A1")
  470. // fileObj.AddComment("Sheet1", "A1", commentResult)
  471. // if err := fileObj.SaveAs(mergeIndexFilePath); err != nil {
  472. // fmt.Println("保存失败,Err:" + err.Error())
  473. // fileObj.Close()
  474. // return
  475. // }
  476. // fileObj.Close()
  477. // } else { //新增文件
  478. // templatePath := utils.IndexSaveDir + "index_template.xlsx"
  479. // templateFile, err := excelize.OpenFile(templatePath)
  480. // if err != nil {
  481. // fmt.Println("打开文件失败,Err:" + err.Error())
  482. // return
  483. // }
  484. // templateFile.DeleteComment("Sheet1", "A1")
  485. // templateFile.AddComment("Sheet1", "A1", commentResult)
  486. // if err := templateFile.SaveAs(mergeIndexFilePath); err != nil {
  487. // fmt.Println("保存失败,Err:" + err.Error())
  488. // templateFile.Close()
  489. // return
  490. // }
  491. // templateFile.Close()
  492. // }
  493. // maxFileIndex += 1
  494. // time.Sleep(1 * time.Second)
  495. // }
  496. //}
  497. // indexMerge 指标合并
  498. // @params frequency string 频度
  499. // @params filePre string 文件名前缀
  500. // @params pageSize int 每个excel表中的指标数量
  501. func indexMerge(frequency, filePre string, pageSize int) (err error) {
  502. firstIndexCount := pageSize //第一个添加的excel表需要的指标数
  503. indexObj := new(index.BaseFromMysteelChemicalIndex)
  504. // 获取未合并的指标总数量
  505. total, err := indexObj.GetNoMergeIndexByFrequencyCount(frequency)
  506. if err != nil {
  507. fmt.Println("GetIndexByFrequencyCount Err:" + err.Error())
  508. return
  509. }
  510. //未合并的指标总数量小于等于0,说明没有需要合并的指标
  511. if total <= 0 {
  512. return
  513. }
  514. // 获取最大的文件编号下标
  515. maxFileIndexItem, err := indexObj.GetMaxFileIndex(frequency)
  516. if err != nil {
  517. fmt.Println("GetMaxFileIndex Err:" + err.Error())
  518. return
  519. }
  520. maxFileIndex := maxFileIndexItem.FileIndex
  521. if maxFileIndex <= 0 {
  522. maxFileIndex = 1
  523. }
  524. fileName := filePre + "_" + strconv.Itoa(maxFileIndex) + ".xlsx" //保存的文件名称
  525. maxMergeIndexFilePath := utils.IndexMsergeSaveDir + fileName
  526. // 根据文件下标获取该文件下标已经存在多少的指标
  527. indexTotal, err := indexObj.GetIndexCountByMergeFilePath(maxMergeIndexFilePath)
  528. if err != nil {
  529. fmt.Println("GetIndexCountByMergeFilePath Err:" + err.Error())
  530. return
  531. }
  532. // 如果最近的excel表的指标数量 少于 每页需要的指标数
  533. if int(indexTotal) < pageSize {
  534. // 最近的excel表的待添加指标数 = 每页需要的指标数 - 已经添加的指标
  535. firstIndexCount = pageSize - int(indexTotal)
  536. }
  537. fmt.Println("maxFileIndex:", maxFileIndex)
  538. // 除去第一个excel表的剩余需要添加的指标数量
  539. nextTotal := int(total) - firstIndexCount
  540. // 总文件数
  541. totalPage := paging.PageCount(nextTotal, pageSize)
  542. totalPage = totalPage + 1 //需要加上除去在外面的指标(第一张excel)
  543. fmt.Println("total:", total)
  544. fmt.Println("totalPage:", totalPage)
  545. for i := 1; i <= totalPage; i++ {
  546. //offset := (i - 1) * pageSize
  547. fileName = filePre + "_" + strconv.Itoa(maxFileIndex) + ".xlsx" //保存的文件名称
  548. mergeIndexFilePath := utils.IndexMsergeSaveDir + fileName
  549. fmt.Println(mergeIndexFilePath)
  550. var list []*index.BaseFromMysteelChemicalIndex
  551. // 需要查询的指标数
  552. size := pageSize
  553. if i == 1 {
  554. size = firstIndexCount // 第一页需要合并的新指标数
  555. // 第一页需要的指标列表
  556. tmpList, tmpErr := indexObj.GetIndexByFrequencyListByMergeFilePath(frequency, mergeIndexFilePath)
  557. if tmpErr != nil {
  558. fmt.Println("GetIndexByFrequencyListByMergeFilePath Err:" + tmpErr.Error())
  559. err = tmpErr
  560. return
  561. }
  562. list = tmpList
  563. }
  564. fmt.Println("需要查询", size, "个指标")
  565. //fmt.Println(offset, pageSize)
  566. // 当下需要合并到excel的指标
  567. pageList, tmpErr := indexObj.GetNoMergeIndexByFrequencyPage(frequency, size)
  568. if tmpErr != nil {
  569. fmt.Println("GetIndexByFrequency Err:" + tmpErr.Error())
  570. err = tmpErr
  571. return
  572. }
  573. if len(list) > 0 {
  574. pageList = append(pageList, list...)
  575. }
  576. commentResult, tmpErr := GetIndexComment(mergeIndexFilePath, pageList, maxFileIndex)
  577. if tmpErr != nil {
  578. fmt.Println("GetIndexComment Err:" + tmpErr.Error())
  579. err = tmpErr
  580. return
  581. }
  582. if utils.FileIsExist(mergeIndexFilePath) { //修改文件
  583. fileObj, tmpErr := excelize.OpenFile(mergeIndexFilePath)
  584. if tmpErr != nil {
  585. fmt.Println("打开文件失败,Err:" + tmpErr.Error())
  586. err = tmpErr
  587. return
  588. }
  589. fileObj.DeleteComment("Sheet1", "A1")
  590. fileObj.AddComment("Sheet1", "A1", commentResult)
  591. if err = fileObj.SaveAs(mergeIndexFilePath); err != nil {
  592. fmt.Println("保存失败,Err:" + err.Error())
  593. fileObj.Close()
  594. return
  595. }
  596. fileObj.Close()
  597. } else { //新增文件
  598. templatePath := utils.IndexSaveDir + "index_template.xlsx"
  599. templateFile, tmpErr := excelize.OpenFile(templatePath)
  600. if tmpErr != nil {
  601. fmt.Println("打开文件失败,Err:" + tmpErr.Error())
  602. err = tmpErr
  603. return
  604. }
  605. templateFile.DeleteComment("Sheet1", "A1")
  606. templateFile.AddComment("Sheet1", "A1", commentResult)
  607. if err = templateFile.SaveAs(mergeIndexFilePath); err != nil {
  608. fmt.Println("保存失败,Err:" + err.Error())
  609. templateFile.Close()
  610. return
  611. }
  612. templateFile.Close()
  613. }
  614. maxFileIndex += 1
  615. time.Sleep(1 * time.Second)
  616. }
  617. return
  618. }
  619. func GetIndexComment(indexFilePath string, list []*index.BaseFromMysteelChemicalIndex, fileIndex int) (commentResult string, err error) {
  620. runMode := "release"
  621. indexInfo := new(IndexObj)
  622. if utils.FileIsExist(indexFilePath) { //文件存在
  623. fmt.Println("utils.FileIsExist")
  624. getCommentStr := GetComment(indexFilePath)
  625. fmt.Println(getCommentStr)
  626. err = json.Unmarshal([]byte(getCommentStr), &indexInfo)
  627. if err != nil {
  628. fmt.Println("json.Unmarshal err:" + err.Error())
  629. return
  630. }
  631. } else { //文件不存在,
  632. indexInfo.BlankValue = "0"
  633. indexInfo.CanMark = true
  634. indexInfo.ChartLineType = "0"
  635. indexInfo.DateBlock = 0
  636. indexInfo.DateBlockCount = 1
  637. indexInfo.DateFormat = 0
  638. indexInfo.DateTimeTag = "637973605613980000"
  639. indexInfo.EndDate = ""
  640. indexInfo.ExportType = 0
  641. indexInfo.HasDescription = true
  642. indexInfo.HasEmptyRows = false
  643. indexInfo.HasFrequency = true
  644. indexInfo.HasIndexID = true
  645. indexInfo.HasLastDate = true
  646. indexInfo.HasSourceName = true
  647. indexInfo.HasTimeInterval = true
  648. indexInfo.HasUnit = true
  649. indexInfo.HasUpdateDate = true
  650. indexInfo.IsCreateChart = false
  651. indexInfo.IsDataSort = true
  652. indexInfo.IsNewSheet = false
  653. indexInfo.IsNewWorkbook = false
  654. indexInfo.Position = "A1"
  655. indexInfo.ShowBlankLines = false
  656. indexInfo.StartDate = ""
  657. indexInfo.Transpose = false
  658. indexInfo.UpdateMode = 1
  659. indexInfo.LookModel.IsLast = false
  660. indexInfo.LookModel.LookValue = 0
  661. indexInfo.LookModel.LookType = 0
  662. indexInfo.Ver = 3
  663. }
  664. modelsList := make([]IndexModels, 0)
  665. startDate := "1990-01-01"
  666. indexObj := new(index.BaseFromMysteelChemicalIndex)
  667. for k, v := range list {
  668. fmt.Println(k, v)
  669. item := new(IndexModels)
  670. item.DataFormat = 0
  671. if v.IndexName == "" {
  672. item.DataStartDate = startDate
  673. } else {
  674. item.DataStartDate = v.StartDate.Format(utils.FormatDate)
  675. }
  676. item.DefineName = ""
  677. item.DefineUnit = ""
  678. item.DisplayIndexCode = v.IndexCode
  679. item.IndexCode = v.IndexCode
  680. item.IndexFormula = v.IndexCode
  681. item.PointValue = 0
  682. item.UnionStart = ""
  683. modelsList = append(modelsList, *item)
  684. indexObj.IndexCode = v.IndexCode
  685. indexObj.MergeFilePath = indexFilePath
  686. indexObj.FileIndex = fileIndex
  687. updateColsArr := make([]string, 0)
  688. updateColsArr = append(updateColsArr, "merge_file_path")
  689. updateColsArr = append(updateColsArr, "file_index")
  690. err = indexObj.Update(runMode, updateColsArr)
  691. if err != nil {
  692. fmt.Println("indexObj.Update err:" + err.Error())
  693. return
  694. }
  695. }
  696. indexInfo.Models = modelsList
  697. indexStr, err := json.Marshal(indexInfo)
  698. if err != nil {
  699. fmt.Println("json.Marshal err:" + err.Error())
  700. return
  701. }
  702. text := string(indexStr)
  703. text = strings.Trim(text, "{")
  704. commentMap := make(map[string]interface{})
  705. commentMap["author"] = "{"
  706. commentMap["text"] = text
  707. //commentMap["text"] = commentItem
  708. commentJson, err := json.Marshal(commentMap)
  709. if err != nil {
  710. fmt.Println("json.Marshal err:" + err.Error())
  711. }
  712. commentResult = string(commentJson)
  713. return
  714. }
  715. type IndexObj struct {
  716. BlankValue string `json:"BlankValue"`
  717. CanMark bool `json:"CanMark"`
  718. ChartLineType string `json:"ChartLineType"`
  719. DateBlock int64 `json:"DateBlock"`
  720. DateBlockCount int64 `json:"DateBlockCount"`
  721. DateFormat int64 `json:"DateFormat"`
  722. DateTimeTag string `json:"DateTimeTag"`
  723. EndDate string `json:"EndDate"`
  724. ExportType int64 `json:"ExportType"`
  725. HasDescription bool `json:"HasDescription"`
  726. HasEmptyRows bool `json:"HasEmptyRows"`
  727. HasFrequency bool `json:"HasFrequency"`
  728. HasIndexID bool `json:"HasIndexID"`
  729. HasLastDate bool `json:"HasLastDate"`
  730. HasSourceName bool `json:"HasSourceName"`
  731. HasTimeInterval bool `json:"HasTimeInterval"`
  732. HasUnit bool `json:"HasUnit"`
  733. HasUpdateDate bool `json:"HasUpdateDate"`
  734. IsCreateChart bool `json:"IsCreateChart"`
  735. IsDataSort bool `json:"IsDataSort"`
  736. IsNewSheet bool `json:"IsNewSheet"`
  737. IsNewWorkbook bool `json:"IsNewWorkbook"`
  738. Models []IndexModels `json:"Models"`
  739. Position string `json:"Position"`
  740. RangeData string `json:"RangeData"`
  741. ShowBlankLines bool `json:"ShowBlankLines"`
  742. StartDate string `json:"StartDate"`
  743. Transpose bool `json:"Transpose"`
  744. UpdateMode int64 `json:"UpdateMode"`
  745. LookModel struct {
  746. IsLast bool `json:"IsLast"`
  747. LookValue int64 `json:"LookValue"`
  748. LookType int64 `json:"lookType"`
  749. } `json:"lookModel"`
  750. Ver int64 `json:"ver"`
  751. }
  752. type IndexModels struct {
  753. DataFormat int64 `json:"DataFormat"`
  754. DataStartDate string `json:"DataStartDate"`
  755. DefineName string `json:"DefineName"`
  756. DefineUnit string `json:"DefineUnit"`
  757. DisplayIndexCode string `json:"DisplayIndexCode"`
  758. IndexCode string `json:"IndexCode"`
  759. IndexFormula string `json:"IndexFormula"`
  760. PointValue int64 `json:"PointValue"`
  761. UnionStart string `json:"UnionStart"`
  762. }
  763. func DataAnalysis(filePath string) {
  764. runMode := "debug"
  765. //runMode = "release"
  766. fmt.Println("filePath:", filePath)
  767. time.Sleep(1 * time.Second)
  768. if !utils.FileIsExist(filePath) {
  769. fmt.Println("filePath is not exist:" + filePath)
  770. return
  771. }
  772. //读取文件内容
  773. global.LOG.Info("WatchFile:" + filePath)
  774. f, err := excelize.OpenFile(filePath)
  775. global.LOG.Info("OpenFile:" + filePath)
  776. if err != nil {
  777. fmt.Println("OpenFile:" + filePath + ",Err:" + err.Error())
  778. return
  779. }
  780. defer func() {
  781. if err := f.Close(); err != nil {
  782. fmt.Println("FileClose Err:" + err.Error())
  783. return
  784. }
  785. }()
  786. indexObj := new(index.BaseFromMysteelChemicalIndex)
  787. var wg = sync.WaitGroup{}
  788. wg.Add(1)
  789. go func() {
  790. sheetList := f.GetSheetList()
  791. for _, sv := range sheetList {
  792. rows, err := f.GetRows(sv)
  793. if err != nil {
  794. fmt.Println("f.GetRows:err:" + err.Error())
  795. return
  796. }
  797. var nameArr []string
  798. unitArr := make([]string, 0)
  799. sourceArr := make([]string, 0)
  800. codeArr := make([]string, 0)
  801. frequencyArr := make([]string, 0)
  802. dateArr := make([]string, 0)
  803. describeArr := make([]string, 0)
  804. endDateArr := make([]string, 0)
  805. updateArr := make([]string, 0)
  806. indexDateArr := make([]string, 0)
  807. dataMap := make(map[string][]string)
  808. var nameLen int
  809. for rk, row := range rows {
  810. if rk == 0 {
  811. continue
  812. }
  813. if rk == 1 {
  814. for ck, colCell := range row {
  815. if ck >= 1 {
  816. nameArr = append(nameArr, colCell)
  817. }
  818. }
  819. nameLen = len(nameArr)
  820. unitArr = make([]string, nameLen)
  821. sourceArr = make([]string, nameLen)
  822. codeArr = make([]string, nameLen)
  823. frequencyArr = make([]string, nameLen)
  824. dateArr = make([]string, nameLen)
  825. describeArr = make([]string, nameLen)
  826. endDateArr = make([]string, nameLen)
  827. updateArr = make([]string, nameLen)
  828. } else if rk == 2 {
  829. for ck, colCell := range row {
  830. if ck >= 1 {
  831. unitArr[ck-1] = colCell
  832. }
  833. }
  834. } else if rk == 3 {
  835. for ck, colCell := range row {
  836. if ck >= 1 {
  837. //sourceArr = append(sourceArr, colCell)
  838. sourceArr[ck-1] = colCell
  839. }
  840. }
  841. } else if rk == 4 {
  842. for ck, colCell := range row {
  843. if ck >= 1 {
  844. //codeArr = append(codeArr, colCell)
  845. codeArr[ck-1] = colCell
  846. }
  847. }
  848. } else if rk == 5 {
  849. for ck, colCell := range row {
  850. if ck >= 1 {
  851. //frequencyArr = append(frequencyArr, colCell)
  852. frequencyArr[ck-1] = colCell
  853. }
  854. }
  855. } else if rk == 6 {
  856. for ck, colCell := range row {
  857. if ck >= 1 {
  858. //dateArr = append(dateArr, colCell)
  859. dateArr[ck-1] = colCell
  860. }
  861. }
  862. } else if rk == 7 {
  863. for ck, colCell := range row {
  864. if ck >= 1 {
  865. //describeArr = append(describeArr, colCell)
  866. describeArr[ck-1] = colCell
  867. }
  868. }
  869. } else if rk == 8 {
  870. for ck, colCell := range row {
  871. if ck >= 1 {
  872. //endDateArr = append(endDateArr, colCell)
  873. endDateArr[ck-1] = colCell
  874. }
  875. }
  876. } else if rk == 9 {
  877. for ck, colCell := range row {
  878. if ck >= 1 {
  879. //updateArr = append(updateArr, colCell)
  880. updateArr[ck-1] = colCell
  881. }
  882. }
  883. } else {
  884. var date string
  885. dataArr := make([]string, nameLen)
  886. for ck, colCell := range row {
  887. if ck == 0 {
  888. date = colCell
  889. indexDateArr = append(indexDateArr, date)
  890. } else {
  891. if colCell != "" {
  892. dataArr[ck-1] = colCell
  893. }
  894. }
  895. }
  896. dataMap[date] = dataArr
  897. }
  898. }
  899. var indexId int64
  900. existDataMap := make(map[string]string)
  901. for k, v := range nameArr {
  902. indexName := v
  903. indexCode := codeArr[k]
  904. unit := unitArr[k]
  905. source := sourceArr[k]
  906. describe := describeArr[k]
  907. dateStr := dateArr[k]
  908. frequency := frequencyArr[k]
  909. //判断指标是否存在
  910. var isAdd int
  911. item, err := indexObj.GetIndexItem(runMode, indexCode)
  912. if err != nil {
  913. if err.Error() == "record not found" {
  914. isAdd = 1
  915. } else {
  916. isAdd = -1
  917. fmt.Println("GetIndexItem Err:" + err.Error())
  918. return
  919. }
  920. }
  921. if item != nil && item.BaseFromMysteelChemicalIndexId > 0 {
  922. fmt.Println("item:", item)
  923. isAdd = 2
  924. } else {
  925. isAdd = 1
  926. }
  927. var startDate, endDate string
  928. startEndArr := strings.Split(dateStr, "~")
  929. if len(startEndArr) >= 2 {
  930. startDate = startEndArr[0]
  931. endDate = startEndArr[1]
  932. }
  933. if !strings.Contains(frequency, "度") {
  934. frequency = frequency + "度"
  935. }
  936. indexItem := new(index.BaseFromMysteelChemicalIndex)
  937. if isAdd == 1 {
  938. indexItem.IndexCode = indexCode
  939. indexItem.IndexName = indexName
  940. indexItem.Unit = unit
  941. indexItem.Source = source
  942. indexItem.Describe = describe
  943. indexItem.StartDate, _ = time.ParseInLocation(utils.FormatDate, startDate, time.Local)
  944. indexItem.EndDate, _ = time.ParseInLocation(utils.FormatDate, endDate, time.Local)
  945. indexItem.Frequency = frequency
  946. indexItem.FilePath = filePath
  947. indexItem.MergeFilePath = filePath
  948. err = indexItem.Add(runMode)
  949. if err != nil {
  950. fmt.Println("indexItem.add err:" + err.Error())
  951. return
  952. }
  953. indexId = indexObj.BaseFromMysteelChemicalIndexId
  954. } else if isAdd == 2 {
  955. indexItem.IndexCode = indexCode
  956. indexItem.IndexName = indexName
  957. indexItem.Unit = unit
  958. indexItem.Source = source
  959. indexItem.Describe = describe
  960. indexItem.StartDate, _ = time.ParseInLocation(utils.FormatDate, startDate, time.Local)
  961. indexItem.EndDate, _ = time.ParseInLocation(utils.FormatDate, endDate, time.Local)
  962. indexItem.Frequency = frequency
  963. indexItem.FilePath = filePath
  964. indexItem.ModifyTime = time.Now()
  965. indexId = item.BaseFromMysteelChemicalIndexId
  966. //修改数据
  967. updateColsArr := make([]string, 0)
  968. updateColsArr = append(updateColsArr, "index_name")
  969. updateColsArr = append(updateColsArr, "unit")
  970. updateColsArr = append(updateColsArr, "source")
  971. updateColsArr = append(updateColsArr, "frequency")
  972. updateColsArr = append(updateColsArr, "start_date")
  973. updateColsArr = append(updateColsArr, "end_date")
  974. updateColsArr = append(updateColsArr, "describe")
  975. updateColsArr = append(updateColsArr, "end_date")
  976. updateColsArr = append(updateColsArr, "modify_time")
  977. updateColsArr = append(updateColsArr, "file_path")
  978. err = indexItem.Update(runMode, updateColsArr)
  979. if err != nil {
  980. fmt.Println("indexObj.Update err:" + err.Error())
  981. return
  982. }
  983. dataObj := new(index.BaseFromMysteelChemicalData)
  984. //获取已存在的所有数据
  985. dataList, err := dataObj.GetIndexDataList(runMode, indexCode)
  986. if err != nil {
  987. fmt.Println("GetIndexDataList Err:" + err.Error())
  988. return
  989. }
  990. fmt.Println("dataListLen:", len(dataList))
  991. for _, v := range dataList {
  992. dateStr := v.DataTime.Format(utils.FormatDate)
  993. existDataMap[dateStr] = v.Value
  994. }
  995. }
  996. dataList := make([]index.BaseFromMysteelChemicalData, 0)
  997. for _, dv := range indexDateArr {
  998. dataArr := dataMap[dv]
  999. dataVal := dataArr[k]
  1000. updateDate := updateArr[k]
  1001. if dataVal != "" {
  1002. if _, ok := existDataMap[dv]; !ok {
  1003. dateTime, err := time.ParseInLocation(utils.FormatDate, dv, time.Local)
  1004. if err != nil {
  1005. fmt.Println("time.ParseInLocation Err:" + err.Error())
  1006. return
  1007. }
  1008. dataItem := new(index.BaseFromMysteelChemicalData)
  1009. dataItem.BaseFromMysteelChemicalIndexId = indexId
  1010. dataItem.IndexCode = indexCode
  1011. dataItem.DataTime = dateTime
  1012. dataItem.Value = dataVal
  1013. dataItem.UpdateDate = updateDate
  1014. dataItem.CreateTime = time.Now()
  1015. dataItem.ModifyTime = time.Now()
  1016. dataList = append(dataList, *dataItem)
  1017. }
  1018. }
  1019. }
  1020. if len(dataList) > 0 {
  1021. dataObj := new(index.BaseFromMysteelChemicalData)
  1022. err = dataObj.Add(runMode, dataList)
  1023. if err != nil {
  1024. fmt.Println("dataObj.Add() Err:" + err.Error())
  1025. return
  1026. }
  1027. }
  1028. }
  1029. }
  1030. wg.Done()
  1031. }()
  1032. wg.Wait()
  1033. }