processor_business_logic.go 10 KB

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