processor_business_logic.go 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370
  1. // Package ruizide
  2. // @Author gmy 2024/10/21 10:50:00
  3. package main
  4. import (
  5. "encoding/json"
  6. "eta/eta_data_analysis/models"
  7. "eta/eta_data_analysis/utils"
  8. "fmt"
  9. "github.com/beego/beego/v2/core/logs"
  10. "math"
  11. "strconv"
  12. "strings"
  13. "unicode"
  14. )
  15. var classifyMap = map[string]string{
  16. "Road Index": "analytics library",
  17. "Road Active Fleet": "analytics library",
  18. "Aviation Index": "analytics library",
  19. "Aviation Active Fleet": "analytics library",
  20. "Demand-Gasoline": "analytics library",
  21. "Demand - Diesel": "analytics library",
  22. "Demand - Jet Fuel": "analytics library",
  23. "Demand - Maritime Bunker": "analytics library",
  24. "Oil_Demand_Signals_Weekly_Report": "analytics library",
  25. }
  26. // RoadIndexProcessor
  27. // @Description: AnalyticsLibrary处理器
  28. type RoadIndexProcessor struct{}
  29. func (p *RoadIndexProcessor) Process(tableName string, sheetName string, rowIndex int, rowData []string) ([]models.BaseFromRzdData, error) {
  30. logs.Info("Processing AnalyticsLibrary...")
  31. if rowIndex < 4 {
  32. return nil, nil
  33. }
  34. frequency := "日度"
  35. unit := "%"
  36. indexNameColOne := "Index"
  37. indexNameColTwo := "Index 7DMA"
  38. // step_1: 分类
  39. classifyId, err := dealClassify(tableName, sheetName)
  40. if err != nil {
  41. return nil, err
  42. }
  43. logs.Info("classifyId: %v", classifyId)
  44. // step_2: 指标
  45. indexOneId, indexTwoId, indexCodeOne, indexCodeTwo, err := dealIndex(sheetName, rowData, indexNameColOne, indexNameColTwo, frequency, unit, classifyId)
  46. if err != nil {
  47. return nil, err
  48. }
  49. logs.Info("indexOneId: %v, indexTwoId: %v, indexCodeOne: %v, indexCodeTwo: %v", indexOneId, indexTwoId, indexCodeOne, indexCodeTwo)
  50. // step_3: 指标数据
  51. dataList, err := dealData(indexOneId, indexTwoId, indexCodeOne, indexCodeTwo, rowData)
  52. if err != nil {
  53. return nil, err
  54. }
  55. logs.Info("dataList: %v", dataList)
  56. return dataList, err
  57. }
  58. // ReDashboardExportOneProcessor
  59. // @Description: ReDashboardExportOneProcessor处理器
  60. type ReDashboardExportOneProcessor struct{}
  61. func (p *ReDashboardExportOneProcessor) Process(tableName string, sheetName string, rowIndex int, rowData []string) ([]models.BaseFromRzdData, error) {
  62. logs.Info("Processing ReDashboardExportOne...")
  63. if rowIndex < 4 {
  64. return nil, nil
  65. }
  66. frequency := "季度"
  67. unit := "千桶每天"
  68. indexNameColOne := "Index"
  69. indexNameColTwo := "Index 7DMA"
  70. // step_1: 分类
  71. classifyId, err := dealClassify("cube dashboards", "Supply Revision Analysis")
  72. if err != nil {
  73. return nil, err
  74. }
  75. logs.Info("classifyId: %v", classifyId)
  76. // step_2: 指标
  77. indexOneId, indexTwoId, indexCodeOne, indexCodeTwo, err := dealIndex(sheetName, rowData, indexNameColOne, indexNameColTwo, frequency, unit, classifyId)
  78. if err != nil {
  79. return nil, err
  80. }
  81. logs.Info("indexOneId: %v, indexTwoId: %v, indexCodeOne: %v, indexCodeTwo: %v", indexOneId, indexTwoId, indexCodeOne, indexCodeTwo)
  82. // step_3: 指标数据
  83. dataList, err := dealData(indexOneId, indexTwoId, indexCodeOne, indexCodeTwo, rowData)
  84. if err != nil {
  85. return nil, err
  86. }
  87. logs.Info("dataList: %v", dataList)
  88. return dataList, err
  89. }
  90. func dealData(indexOneId, indexTwoId int, indexCodeOne, indexCodeTwo string, rowData []string) ([]models.BaseFromRzdData, error) {
  91. var dataList []models.BaseFromRzdData
  92. valueOne, err := strconv.ParseFloat(rowData[len(rowData)-2], 64)
  93. if err != nil {
  94. return nil, err
  95. }
  96. valueOne = math.Round(valueOne*10000) / 10000
  97. dataTimeOne := rowData[1]
  98. formatOne, err := utils.ConvertDateFormat(dataTimeOne)
  99. if err != nil {
  100. return nil, err
  101. }
  102. dataTimeOne = formatOne
  103. paramsLib := make(map[string]interface{})
  104. paramsLib["IndexCode"] = indexCodeOne
  105. paramsLib["DataTime"] = dataTimeOne
  106. postEdbLib, err := httpRequestFill(paramsLib, utils.GET_RZD_INDEX_DATA_BY_CODE_AND_TIME)
  107. if err != nil {
  108. return nil, err
  109. }
  110. var requestResponse models.RequestResponse[models.BaseFromRzdData]
  111. err = json.Unmarshal(postEdbLib, &requestResponse)
  112. if err != nil {
  113. return nil, err
  114. }
  115. if requestResponse.Data.BaseFromRzdIndexId == 0 {
  116. dataOne := models.BaseFromRzdData{
  117. BaseFromRzdIndexId: indexOneId,
  118. CreateTime: utils.GetCurrentTime(),
  119. DataTime: dataTimeOne,
  120. IndexCode: indexCodeOne,
  121. ModifyTime: utils.GetCurrentTime(),
  122. Value: valueOne,
  123. }
  124. dataList = append(dataList, dataOne)
  125. }
  126. valueTwo, err := strconv.ParseFloat(rowData[len(rowData)-2], 64)
  127. if err != nil {
  128. return nil, err
  129. }
  130. valueTwo = math.Round(valueTwo*10000) / 10000
  131. dataTimeTwo := rowData[1]
  132. formatTwo, err := utils.ConvertDateFormat(dataTimeTwo)
  133. if err != nil {
  134. return nil, err
  135. }
  136. dataTimeTwo = formatTwo
  137. paramsLib = make(map[string]interface{})
  138. paramsLib["indexCode"] = indexCodeTwo
  139. paramsLib["dataTime"] = dataTimeTwo
  140. postEdbLib, err = httpRequestFill(paramsLib, utils.GET_RZD_INDEX_DATA_BY_CODE_AND_TIME)
  141. if err != nil {
  142. return nil, err
  143. }
  144. var requestResponseTwo models.RequestResponse[models.BaseFromRzdData]
  145. err = json.Unmarshal(postEdbLib, &requestResponseTwo)
  146. if err != nil {
  147. return nil, err
  148. }
  149. if requestResponseTwo.Data.BaseFromRzdIndexId == 0 {
  150. dataTwo := models.BaseFromRzdData{
  151. BaseFromRzdIndexId: indexTwoId,
  152. CreateTime: utils.GetCurrentTime(),
  153. DataTime: dataTimeTwo,
  154. IndexCode: indexCodeTwo,
  155. ModifyTime: utils.GetCurrentTime(),
  156. Value: valueTwo,
  157. }
  158. dataList = append(dataList, dataTwo)
  159. }
  160. return dataList, nil
  161. }
  162. func dealIndex(sheetName string, rowData []string, indexNameColOne string, indexNameColTwo string, frequency string, unit string, classifyId int) (indexOneId, indexTwoId int, indexCodeOne, indexCodeTwo string, err error) {
  163. // 指标名称
  164. indexNameOne := sheetName + "/" + rowData[len(rowData)-3] + "/" + indexNameColOne
  165. indexNameTwo := sheetName + "/" + rowData[len(rowData)-3] + "/" + indexNameColTwo
  166. // 生成指标编码
  167. indexCodeOne, err = getIndexId(sheetName, strings.ToLower(rowData[len(rowData)-3]), indexNameColOne)
  168. indexCodeTwo, err = getIndexId(sheetName, strings.ToLower(rowData[len(rowData)-3]), indexNameColTwo)
  169. // 处理第一个指标
  170. paramsLib := make(map[string]interface{})
  171. paramsLib["indexCode"] = indexCodeOne
  172. postEdbLib, err := httpRequestFill(paramsLib, utils.GET_RZD_INDEX_BY_CODE)
  173. if err != nil {
  174. return 0, 0, "0", "0", fmt.Errorf("getIndexId() : Failed to get rzd index by code: %v", err)
  175. }
  176. var requestResponse models.RequestResponse[models.BaseFromRzdIndex]
  177. err = json.Unmarshal(postEdbLib, &requestResponse)
  178. if err != nil {
  179. return 0, 0, "0", "0", err
  180. }
  181. if requestResponse.Data.BaseFromRzdIndexId == 0 {
  182. indexOne := models.BaseFromRzdIndex{
  183. CreateTime: utils.GetCurrentTime(),
  184. ModifyTime: utils.GetCurrentTime(),
  185. BaseFromLyClassifyId: classifyId,
  186. IndexCode: indexCodeOne,
  187. IndexName: indexNameOne,
  188. Frequency: frequency,
  189. Unit: unit,
  190. }
  191. // 这里避免服务器宕机 出现唯一索引异常,进行分开保存
  192. postEdbLib, err = httpRequestFill(indexOne, utils.ADD_RZD_INDEX)
  193. if err != nil {
  194. return 0, 0, "0", "0", fmt.Errorf("getIndexId() : Failed to get rzd index by code: %v", err)
  195. }
  196. var requestResponse models.RequestResponse[int]
  197. err = json.Unmarshal(postEdbLib, &requestResponse)
  198. if err != nil {
  199. return 0, 0, "0", "0", err
  200. }
  201. indexOneId = requestResponse.Data
  202. logs.Info("indexOneId: %v", indexOneId)
  203. } else {
  204. indexOneId = requestResponse.Data.BaseFromRzdIndexId
  205. }
  206. // 处理第二个指标
  207. paramsLib = make(map[string]interface{})
  208. paramsLib["indexCode"] = indexCodeTwo
  209. postEdbLib, err = httpRequestFill(paramsLib, utils.GET_RZD_INDEX_BY_CODE)
  210. if err != nil {
  211. return 0, 0, "0", "0", fmt.Errorf("getIndexId() : Failed to get rzd index by code: %v", err)
  212. }
  213. var requestResponseTwo models.RequestResponse[models.BaseFromRzdIndex]
  214. err = json.Unmarshal(postEdbLib, &requestResponseTwo)
  215. if err != nil {
  216. return 0, 0, "0", "0", err
  217. }
  218. if requestResponseTwo.Data.BaseFromRzdIndexId == 0 {
  219. indexTwo := models.BaseFromRzdIndex{
  220. CreateTime: utils.GetCurrentTime(),
  221. ModifyTime: utils.GetCurrentTime(),
  222. BaseFromLyClassifyId: classifyId,
  223. IndexCode: indexCodeTwo,
  224. IndexName: indexNameTwo,
  225. Frequency: frequency,
  226. Unit: unit,
  227. }
  228. // 这里避免服务器宕机 出现唯一索引异常,进行分开保存
  229. var requestResponse models.RequestResponse[int]
  230. postEdbLib, err = httpRequestFill(indexTwo, utils.ADD_RZD_INDEX)
  231. if err != nil {
  232. return 0, 0, "0", "0", fmt.Errorf("getIndexId() : Failed to get rzd index by code: %v", err)
  233. }
  234. err = json.Unmarshal(postEdbLib, &requestResponse)
  235. if err != nil {
  236. return 0, 0, "0", "0", err
  237. }
  238. indexTwoId = requestResponse.Data
  239. logs.Info("indexTwoId: %v", indexTwoId)
  240. } else {
  241. indexTwoId = requestResponseTwo.Data.BaseFromRzdIndexId
  242. }
  243. return indexOneId, indexTwoId, indexCodeOne, indexCodeTwo, nil
  244. }
  245. func getIndexId(prefix string, area string, suffix string) (string, error) {
  246. prefixWords := strings.Fields(prefix) // 分割字符串为单词
  247. firstLetters := ""
  248. for _, word := range prefixWords {
  249. if len(word) > 0 {
  250. firstLetters += string(unicode.ToLower(rune(word[0]))) // 获取小写的第一个字母
  251. }
  252. }
  253. suffixWords := strings.Fields(suffix) // 分割字符串为单词
  254. SecondLetters := ""
  255. for _, word := range suffixWords {
  256. if len(word) > 0 {
  257. SecondLetters += string(unicode.ToLower(rune(word[0]))) // 获取小写的第一个字母
  258. }
  259. }
  260. indexCode := "rzd" + firstLetters + area + SecondLetters
  261. return indexCode, nil
  262. }
  263. // 处理分类
  264. func dealClassify(tableName, sheetName string) (int, error) {
  265. // 查询一级分类是否存在
  266. paramsLib := make(map[string]interface{})
  267. paramsLib["classifyName"] = classifyMap[tableName]
  268. postEdbLib, err := httpRequestFill(paramsLib, utils.GET_RZD_CLASSIFY_BY_NAME)
  269. if err != nil {
  270. return 0, fmt.Errorf("AnalyticsLibraryProcessor Process() : failed to get classify: %v", err)
  271. }
  272. var requestResponse models.RequestResponse[models.BaseFromRzdClassify]
  273. err = json.Unmarshal(postEdbLib, &requestResponse)
  274. if err != nil {
  275. return 0, err
  276. }
  277. // 处理一级分类
  278. var parentId int
  279. if requestResponse.Data.BaseFromRzdClassifyId == 0 {
  280. // 一级分类不存在,新增一级分类
  281. paramsLib = make(map[string]interface{})
  282. paramsLib["parentId"] = 0
  283. paramsLib["classifyName"] = classifyMap[tableName]
  284. postEdbLib, err = httpRequestFill(paramsLib, utils.ADD_RZD_CLASSIFY)
  285. if err != nil {
  286. return 0, fmt.Errorf("AnalyticsLibraryProcessor Process() : failed to add classify: %v", err)
  287. }
  288. var requestResponse models.RequestResponse[int]
  289. err = json.Unmarshal(postEdbLib, &requestResponse)
  290. if err != nil {
  291. return 0, err
  292. }
  293. parentId = requestResponse.Data
  294. } else {
  295. // 一级分类已存在,使用其 ID
  296. parentId = requestResponse.Data.BaseFromRzdClassifyId
  297. }
  298. // 查询二级分类是否存在
  299. paramsSubLib := make(map[string]interface{})
  300. paramsSubLib["classifyName"] = sheetName // 这里替换成实际的二级分类名称
  301. postSubEdbLib, err := httpRequestFill(paramsSubLib, utils.GET_RZD_CLASSIFY_BY_NAME)
  302. if err != nil {
  303. return 0, fmt.Errorf("AnalyticsLibraryProcessor Process() : failed to get sub classify: %v", err)
  304. }
  305. var subRequestResponse models.RequestResponse[models.BaseFromRzdClassify]
  306. err = json.Unmarshal(postSubEdbLib, &subRequestResponse)
  307. if err != nil {
  308. return 0, err
  309. }
  310. // 新增二级分类
  311. var classifyId int
  312. if subRequestResponse.Data.BaseFromRzdClassifyId == 0 {
  313. paramsLib = make(map[string]interface{})
  314. paramsLib["parentId"] = parentId
  315. paramsLib["classifyName"] = sheetName
  316. postEdbLib, err = httpRequestFill(paramsLib, utils.ADD_RZD_CLASSIFY)
  317. if err != nil {
  318. return 0, fmt.Errorf("AnalyticsLibraryProcessor Process() : failed to add classify: %v", err)
  319. }
  320. var requestResponse models.RequestResponse[int]
  321. err = json.Unmarshal(postEdbLib, &requestResponse)
  322. if err != nil {
  323. return 0, err
  324. }
  325. classifyId = requestResponse.Data
  326. } else {
  327. classifyId = subRequestResponse.Data.BaseFromRzdClassifyId
  328. }
  329. return classifyId, nil
  330. }