index_merge.go 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566
  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. "strings"
  9. "sync"
  10. "time"
  11. "github.com/xuri/excelize/v2"
  12. )
  13. //合并指标
  14. func Merge() {
  15. fmt.Println("merge start")
  16. /*
  17. 年底,季度,存放在一个excel中
  18. 月度30个指标存一个excel
  19. 周度25个指标存放一个excel
  20. 日度20个指标存一个excel
  21. */
  22. //年度->38
  23. //IndexYearMerge()
  24. //季度->5
  25. //IndexSeasonMerge()
  26. //月度->86
  27. //周度->292
  28. //日度->114
  29. //merge_file_path
  30. fmt.Println("merge end")
  31. }
  32. //年度
  33. func IndexYearMerge() {
  34. frequency := "年度"
  35. fileName := "year" + ".xlsx" //保存的文件名称
  36. yearIndexFilePath := utils.IndexMsergeSaveDir + fileName
  37. var err error
  38. indexObj := new(index.BaseFromMysteelChemicalIndex)
  39. yearList, err := indexObj.GetIndexByFrequency(frequency)
  40. if err != nil {
  41. fmt.Println("GetIndexByFrequency Err:" + err.Error())
  42. return
  43. }
  44. commentResult, err := GetIndexComment(yearIndexFilePath, yearList)
  45. if err != nil {
  46. fmt.Println("GetIndexComment Err:" + err.Error())
  47. return
  48. }
  49. if utils.FileIsExist(yearIndexFilePath) { //修改文件
  50. fileObj, err := excelize.OpenFile(yearIndexFilePath)
  51. if err != nil {
  52. fmt.Println("打开文件失败,Err:" + err.Error())
  53. return
  54. }
  55. fileObj.DeleteComment("Sheet1", "A1")
  56. fileObj.AddComment("Sheet1", "A1", commentResult)
  57. if err := fileObj.SaveAs(yearIndexFilePath); err != nil {
  58. fmt.Println("保存失败,Err:" + err.Error())
  59. fileObj.Close()
  60. return
  61. }
  62. fileObj.Close()
  63. } else { //新增文件
  64. templatePath := utils.IndexSaveDir + "index_template.xlsx"
  65. templateFile, err := excelize.OpenFile(templatePath)
  66. if err != nil {
  67. fmt.Println("打开文件失败,Err:" + err.Error())
  68. return
  69. }
  70. templateFile.DeleteComment("Sheet1", "A1")
  71. templateFile.AddComment("Sheet1", "A1", commentResult)
  72. if err := templateFile.SaveAs(yearIndexFilePath); err != nil {
  73. fmt.Println("保存失败,Err:" + err.Error())
  74. templateFile.Close()
  75. return
  76. }
  77. templateFile.Close()
  78. }
  79. //处理excel数据
  80. }
  81. //季度
  82. func IndexSeasonMerge() {
  83. frequency := "季度"
  84. fileName := "season" + ".xlsx" //保存的文件名称
  85. seasonIndexFilePath := utils.IndexMsergeSaveDir + fileName
  86. var err error
  87. indexObj := new(index.BaseFromMysteelChemicalIndex)
  88. seasonList, err := indexObj.GetIndexByFrequency(frequency)
  89. if err != nil {
  90. fmt.Println("GetIndexByFrequency Err:" + err.Error())
  91. return
  92. }
  93. commentResult, err := GetIndexComment(seasonIndexFilePath, seasonList)
  94. if err != nil {
  95. fmt.Println("GetIndexComment Err:" + err.Error())
  96. return
  97. }
  98. if utils.FileIsExist(seasonIndexFilePath) { //修改文件
  99. fileObj, err := excelize.OpenFile(seasonIndexFilePath)
  100. if err != nil {
  101. fmt.Println("打开文件失败,Err:" + err.Error())
  102. return
  103. }
  104. fileObj.DeleteComment("Sheet1", "A1")
  105. fileObj.AddComment("Sheet1", "A1", commentResult)
  106. if err := fileObj.SaveAs(seasonIndexFilePath); err != nil {
  107. fmt.Println("保存失败,Err:" + err.Error())
  108. fileObj.Close()
  109. return
  110. }
  111. fileObj.Close()
  112. } else { //新增文件
  113. templatePath := utils.IndexSaveDir + "index_template.xlsx"
  114. templateFile, err := excelize.OpenFile(templatePath)
  115. if err != nil {
  116. fmt.Println("打开文件失败,Err:" + err.Error())
  117. return
  118. }
  119. templateFile.DeleteComment("Sheet1", "A1")
  120. templateFile.AddComment("Sheet1", "A1", commentResult)
  121. if err := templateFile.SaveAs(seasonIndexFilePath); err != nil {
  122. fmt.Println("保存失败,Err:" + err.Error())
  123. templateFile.Close()
  124. return
  125. }
  126. templateFile.Close()
  127. }
  128. //处理excel数据
  129. }
  130. func GetIndexComment(yearIndexFilePath string, list []*index.BaseFromMysteelChemicalIndex) (commentResult string, err error) {
  131. indexInfo := new(IndexObj)
  132. if utils.FileIsExist(yearIndexFilePath) { //文件存在
  133. fmt.Println("utils.FileIsExist")
  134. getCommentStr := GetComment(yearIndexFilePath)
  135. fmt.Println(getCommentStr)
  136. err = json.Unmarshal([]byte(getCommentStr), &indexInfo)
  137. if err != nil {
  138. fmt.Println("json.Unmarshal err:" + err.Error())
  139. return
  140. }
  141. } else { //文件不存在,
  142. indexInfo.BlankValue = "0"
  143. indexInfo.CanMark = true
  144. indexInfo.ChartLineType = "0"
  145. indexInfo.DateBlock = 0
  146. indexInfo.DateBlockCount = 1
  147. indexInfo.DateFormat = 0
  148. indexInfo.DateTimeTag = "637973605613980000"
  149. indexInfo.EndDate = ""
  150. indexInfo.ExportType = 0
  151. indexInfo.HasDescription = true
  152. indexInfo.HasEmptyRows = false
  153. indexInfo.HasFrequency = true
  154. indexInfo.HasIndexID = true
  155. indexInfo.HasLastDate = true
  156. indexInfo.HasSourceName = true
  157. indexInfo.HasTimeInterval = true
  158. indexInfo.HasUnit = true
  159. indexInfo.HasUpdateDate = true
  160. indexInfo.IsCreateChart = false
  161. indexInfo.IsDataSort = true
  162. indexInfo.IsNewSheet = false
  163. indexInfo.IsNewWorkbook = false
  164. indexInfo.Position = "A1"
  165. indexInfo.ShowBlankLines = false
  166. indexInfo.StartDate = ""
  167. indexInfo.Transpose = false
  168. indexInfo.UpdateMode = 1
  169. indexInfo.LookModel.IsLast = false
  170. indexInfo.LookModel.LookValue = 0
  171. indexInfo.LookModel.LookType = 0
  172. indexInfo.Ver = 3
  173. }
  174. modelsList := make([]IndexModels, 0)
  175. startDate := "1990-01-01"
  176. for k, v := range list {
  177. fmt.Println(k, v)
  178. item := new(IndexModels)
  179. item.DataFormat = 0
  180. if v.IndexName == "" {
  181. item.DataStartDate = startDate
  182. } else {
  183. item.DataStartDate = v.StartDate.Format(utils.FormatDate)
  184. }
  185. item.DefineName = ""
  186. item.DefineUnit = ""
  187. item.DisplayIndexCode = v.IndexCode
  188. item.IndexCode = v.IndexCode
  189. item.IndexFormula = v.IndexCode
  190. item.PointValue = 0
  191. item.UnionStart = ""
  192. modelsList = append(modelsList, *item)
  193. }
  194. indexInfo.Models = modelsList
  195. indexStr, err := json.Marshal(indexInfo)
  196. if err != nil {
  197. fmt.Println("json.Marshal err:" + err.Error())
  198. return
  199. }
  200. text := string(indexStr)
  201. text = strings.Trim(text, "{")
  202. commentMap := make(map[string]interface{})
  203. commentMap["author"] = "{"
  204. commentMap["text"] = text
  205. //commentMap["text"] = commentItem
  206. commentJson, err := json.Marshal(commentMap)
  207. if err != nil {
  208. fmt.Println("json.Marshal err:" + err.Error())
  209. }
  210. commentResult = string(commentJson)
  211. return
  212. }
  213. type IndexObj struct {
  214. BlankValue string `json:"BlankValue"`
  215. CanMark bool `json:"CanMark"`
  216. ChartLineType string `json:"ChartLineType"`
  217. DateBlock int64 `json:"DateBlock"`
  218. DateBlockCount int64 `json:"DateBlockCount"`
  219. DateFormat int64 `json:"DateFormat"`
  220. DateTimeTag string `json:"DateTimeTag"`
  221. EndDate string `json:"EndDate"`
  222. ExportType int64 `json:"ExportType"`
  223. HasDescription bool `json:"HasDescription"`
  224. HasEmptyRows bool `json:"HasEmptyRows"`
  225. HasFrequency bool `json:"HasFrequency"`
  226. HasIndexID bool `json:"HasIndexID"`
  227. HasLastDate bool `json:"HasLastDate"`
  228. HasSourceName bool `json:"HasSourceName"`
  229. HasTimeInterval bool `json:"HasTimeInterval"`
  230. HasUnit bool `json:"HasUnit"`
  231. HasUpdateDate bool `json:"HasUpdateDate"`
  232. IsCreateChart bool `json:"IsCreateChart"`
  233. IsDataSort bool `json:"IsDataSort"`
  234. IsNewSheet bool `json:"IsNewSheet"`
  235. IsNewWorkbook bool `json:"IsNewWorkbook"`
  236. Models []IndexModels `json:"Models"`
  237. Position string `json:"Position"`
  238. RangeData string `json:"RangeData"`
  239. ShowBlankLines bool `json:"ShowBlankLines"`
  240. StartDate string `json:"StartDate"`
  241. Transpose bool `json:"Transpose"`
  242. UpdateMode int64 `json:"UpdateMode"`
  243. LookModel struct {
  244. IsLast bool `json:"IsLast"`
  245. LookValue int64 `json:"LookValue"`
  246. LookType int64 `json:"lookType"`
  247. } `json:"lookModel"`
  248. Ver int64 `json:"ver"`
  249. }
  250. type IndexModels struct {
  251. DataFormat int64 `json:"DataFormat"`
  252. DataStartDate string `json:"DataStartDate"`
  253. DefineName string `json:"DefineName"`
  254. DefineUnit string `json:"DefineUnit"`
  255. DisplayIndexCode string `json:"DisplayIndexCode"`
  256. IndexCode string `json:"IndexCode"`
  257. IndexFormula string `json:"IndexFormula"`
  258. PointValue int64 `json:"PointValue"`
  259. UnionStart string `json:"UnionStart"`
  260. }
  261. func DataAnalysis(filePath string) {
  262. runMode := "debug"
  263. //runMode = "release"
  264. fmt.Println("filePath:", filePath)
  265. time.Sleep(1 * time.Second)
  266. if !utils.FileIsExist(filePath) {
  267. fmt.Println("filePath is not exist:" + filePath)
  268. return
  269. }
  270. //读取文件内容
  271. global.LOG.Info("WatchFile:" + filePath)
  272. f, err := excelize.OpenFile(filePath)
  273. global.LOG.Info("OpenFile:" + filePath)
  274. if err != nil {
  275. fmt.Println("OpenFile:" + filePath + ",Err:" + err.Error())
  276. return
  277. }
  278. defer func() {
  279. if err := f.Close(); err != nil {
  280. fmt.Println("FileClose Err:" + err.Error())
  281. return
  282. }
  283. }()
  284. indexObj := new(index.BaseFromMysteelChemicalIndex)
  285. var wg = sync.WaitGroup{}
  286. wg.Add(1)
  287. go func() {
  288. sheetList := f.GetSheetList()
  289. for _, sv := range sheetList {
  290. rows, err := f.GetRows(sv)
  291. if err != nil {
  292. fmt.Println("f.GetRows:err:" + err.Error())
  293. return
  294. }
  295. var nameArr []string
  296. unitArr := make([]string, 0)
  297. sourceArr := make([]string, 0)
  298. codeArr := make([]string, 0)
  299. frequencyArr := make([]string, 0)
  300. dateArr := make([]string, 0)
  301. describeArr := make([]string, 0)
  302. endDateArr := make([]string, 0)
  303. updateArr := make([]string, 0)
  304. indexDateArr := make([]string, 0)
  305. dataMap := make(map[string][]string)
  306. var nameLen int
  307. for rk, row := range rows {
  308. if rk == 0 {
  309. continue
  310. }
  311. if rk == 1 {
  312. for ck, colCell := range row {
  313. if ck >= 1 {
  314. nameArr = append(nameArr, colCell)
  315. }
  316. }
  317. nameLen = len(nameArr)
  318. unitArr = make([]string, nameLen)
  319. sourceArr = make([]string, nameLen)
  320. codeArr = make([]string, nameLen)
  321. frequencyArr = make([]string, nameLen)
  322. dateArr = make([]string, nameLen)
  323. describeArr = make([]string, nameLen)
  324. endDateArr = make([]string, nameLen)
  325. updateArr = make([]string, nameLen)
  326. } else if rk == 2 {
  327. for ck, colCell := range row {
  328. if ck >= 1 {
  329. unitArr[ck-1] = colCell
  330. }
  331. }
  332. } else if rk == 3 {
  333. for ck, colCell := range row {
  334. if ck >= 1 {
  335. //sourceArr = append(sourceArr, colCell)
  336. sourceArr[ck-1] = colCell
  337. }
  338. }
  339. } else if rk == 4 {
  340. for ck, colCell := range row {
  341. if ck >= 1 {
  342. //codeArr = append(codeArr, colCell)
  343. codeArr[ck-1] = colCell
  344. }
  345. }
  346. } else if rk == 5 {
  347. for ck, colCell := range row {
  348. if ck >= 1 {
  349. //frequencyArr = append(frequencyArr, colCell)
  350. frequencyArr[ck-1] = colCell
  351. }
  352. }
  353. } else if rk == 6 {
  354. for ck, colCell := range row {
  355. if ck >= 1 {
  356. //dateArr = append(dateArr, colCell)
  357. dateArr[ck-1] = colCell
  358. }
  359. }
  360. } else if rk == 7 {
  361. for ck, colCell := range row {
  362. if ck >= 1 {
  363. //describeArr = append(describeArr, colCell)
  364. describeArr[ck-1] = colCell
  365. }
  366. }
  367. } else if rk == 8 {
  368. for ck, colCell := range row {
  369. if ck >= 1 {
  370. //endDateArr = append(endDateArr, colCell)
  371. endDateArr[ck-1] = colCell
  372. }
  373. }
  374. } else if rk == 9 {
  375. for ck, colCell := range row {
  376. if ck >= 1 {
  377. //updateArr = append(updateArr, colCell)
  378. updateArr[ck-1] = colCell
  379. }
  380. }
  381. } else {
  382. var date string
  383. dataArr := make([]string, nameLen)
  384. for ck, colCell := range row {
  385. if ck == 0 {
  386. date = colCell
  387. indexDateArr = append(indexDateArr, date)
  388. } else {
  389. if colCell != "" {
  390. dataArr[ck-1] = colCell
  391. }
  392. }
  393. }
  394. dataMap[date] = dataArr
  395. }
  396. }
  397. var indexId int64
  398. existDataMap := make(map[string]string)
  399. for k, v := range nameArr {
  400. indexName := v
  401. indexCode := codeArr[k]
  402. unit := unitArr[k]
  403. source := sourceArr[k]
  404. describe := describeArr[k]
  405. dateStr := dateArr[k]
  406. frequency := frequencyArr[k]
  407. //判断指标是否存在
  408. var isAdd int
  409. item, err := indexObj.GetIndexItem(runMode, indexCode)
  410. if err != nil {
  411. if err.Error() == "record not found" {
  412. isAdd = 1
  413. } else {
  414. isAdd = -1
  415. fmt.Println("GetIndexItem Err:" + err.Error())
  416. return
  417. }
  418. }
  419. if item != nil && item.BaseFromMysteelChemicalIndexId > 0 {
  420. fmt.Println("item:", item)
  421. isAdd = 2
  422. } else {
  423. isAdd = 1
  424. }
  425. var startDate, endDate string
  426. startEndArr := strings.Split(dateStr, "~")
  427. if len(startEndArr) >= 2 {
  428. startDate = startEndArr[0]
  429. endDate = startEndArr[1]
  430. }
  431. if !strings.Contains(frequency, "度") {
  432. frequency = frequency + "度"
  433. }
  434. indexItem := new(index.BaseFromMysteelChemicalIndex)
  435. if isAdd == 1 {
  436. indexItem.IndexCode = indexCode
  437. indexItem.IndexName = indexName
  438. indexItem.Unit = unit
  439. indexItem.Source = source
  440. indexItem.Describe = describe
  441. indexItem.StartDate, _ = time.ParseInLocation(utils.FormatDate, startDate, time.Local)
  442. indexItem.EndDate, _ = time.ParseInLocation(utils.FormatDate, endDate, time.Local)
  443. indexItem.Frequency = frequency
  444. indexItem.FilePath = filePath
  445. indexItem.MergeFilePath = filePath
  446. err = indexItem.Add(runMode)
  447. if err != nil {
  448. fmt.Println("indexItem.add err:" + err.Error())
  449. return
  450. }
  451. indexId = indexObj.BaseFromMysteelChemicalIndexId
  452. } else if isAdd == 2 {
  453. indexItem.IndexCode = indexCode
  454. indexItem.IndexName = indexName
  455. indexItem.Unit = unit
  456. indexItem.Source = source
  457. indexItem.Describe = describe
  458. indexItem.StartDate, _ = time.ParseInLocation(utils.FormatDate, startDate, time.Local)
  459. indexItem.EndDate, _ = time.ParseInLocation(utils.FormatDate, endDate, time.Local)
  460. indexItem.Frequency = frequency
  461. indexItem.FilePath = filePath
  462. indexItem.ModifyTime = time.Now()
  463. indexId = item.BaseFromMysteelChemicalIndexId
  464. //修改数据
  465. updateColsArr := make([]string, 0)
  466. updateColsArr = append(updateColsArr, "index_name")
  467. updateColsArr = append(updateColsArr, "unit")
  468. updateColsArr = append(updateColsArr, "source")
  469. updateColsArr = append(updateColsArr, "frequency")
  470. updateColsArr = append(updateColsArr, "start_date")
  471. updateColsArr = append(updateColsArr, "end_date")
  472. updateColsArr = append(updateColsArr, "describe")
  473. updateColsArr = append(updateColsArr, "end_date")
  474. updateColsArr = append(updateColsArr, "modify_time")
  475. updateColsArr = append(updateColsArr, "file_path")
  476. err = indexItem.Update(runMode, updateColsArr)
  477. if err != nil {
  478. fmt.Println("indexObj.Update err:" + err.Error())
  479. return
  480. }
  481. dataObj := new(index.BaseFromMysteelChemicalData)
  482. //获取已存在的所有数据
  483. dataList, err := dataObj.GetIndexDataList(runMode, indexCode)
  484. if err != nil {
  485. fmt.Println("GetIndexDataList Err:" + err.Error())
  486. return
  487. }
  488. fmt.Println("dataListLen:", len(dataList))
  489. for _, v := range dataList {
  490. dateStr := v.DataTime.Format(utils.FormatDate)
  491. existDataMap[dateStr] = v.Value
  492. }
  493. }
  494. dataList := make([]index.BaseFromMysteelChemicalData, 0)
  495. for _, dv := range indexDateArr {
  496. dataArr := dataMap[dv]
  497. dataVal := dataArr[k]
  498. updateDate := updateArr[k]
  499. if dataVal != "" {
  500. if _, ok := existDataMap[dv]; !ok {
  501. dateTime, err := time.ParseInLocation(utils.FormatDate, dv, time.Local)
  502. if err != nil {
  503. fmt.Println("time.ParseInLocation Err:" + err.Error())
  504. return
  505. }
  506. dataItem := new(index.BaseFromMysteelChemicalData)
  507. dataItem.BaseFromMysteelChemicalIndexId = indexId
  508. dataItem.IndexCode = indexCode
  509. dataItem.DataTime = dateTime
  510. dataItem.Value = dataVal
  511. dataItem.UpdateDate = updateDate
  512. dataItem.CreateTime = time.Now()
  513. dataItem.ModifyTime = time.Now()
  514. dataList = append(dataList, *dataItem)
  515. }
  516. }
  517. }
  518. if len(dataList) > 0 {
  519. dataObj := new(index.BaseFromMysteelChemicalData)
  520. err = dataObj.Add(runMode, dataList)
  521. if err != nil {
  522. fmt.Println("dataObj.Add() Err:" + err.Error())
  523. return
  524. }
  525. }
  526. }
  527. }
  528. wg.Done()
  529. }()
  530. wg.Wait()
  531. }