shanghai_smm.go 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379
  1. package controllers
  2. import (
  3. "encoding/json"
  4. "eta/eta_index_lib/models"
  5. shanghaismm "eta/eta_index_lib/services/shanghai_smm"
  6. "eta/eta_index_lib/utils"
  7. "fmt"
  8. "strconv"
  9. "strings"
  10. "time"
  11. "github.com/mozillazg/go-pinyin"
  12. )
  13. type ShanghaiSmmController struct {
  14. BaseAuthController
  15. }
  16. var ShanghaiSmmNameToIndexMap = make(map[string]*models.BaseFromSmmIndex)
  17. var ShanghaiSmmCodeToNameMap = make(map[string]string)
  18. var ShanghaiSmmNameToCodeMap = make(map[string]string)
  19. // @Title 刷新数据
  20. // @Description 刷新数据接口
  21. // @Param request body models.AddEdbClassifyReq true "type json string"
  22. // @Success 200 {object} models.EdbClassify
  23. // @router /refresh/list [post]
  24. func (this *ShanghaiSmmController) RefreshData() {
  25. br := new(models.BaseResponse).Init()
  26. defer func() {
  27. this.Data["json"] = br
  28. this.ServeJSON()
  29. }()
  30. var req []*shanghaismm.EdbInfoData
  31. if err := json.Unmarshal(this.Ctx.Input.RequestBody, &req); err != nil {
  32. br.Msg = "参数解析异常!"
  33. br.ErrMsg = "参数解析失败,Err:" + err.Error()
  34. return
  35. }
  36. allIndex, err := models.GetBaseFromSmmIndex()
  37. if err != nil {
  38. fmt.Println("select Code err:", err)
  39. utils.FileLog.Info("GetBaseFromSci99Index err:", err)
  40. return
  41. }
  42. for _, item := range allIndex {
  43. ShanghaiSmmNameToIndexMap[item.IndexName] = item
  44. ShanghaiSmmNameToCodeMap[item.IndexName] = item.IndexCode
  45. }
  46. // 检查指标是否存在,如果不存在添加指标
  47. addIndexList := make([]*models.BaseFromSmmIndex, 0)
  48. updateIndexList := make([]*models.BaseFromSmmIndex, 0)
  49. addDateList := make([]*models.BaseFromSmmData, 0)
  50. readyDateList := make([]*models.BaseFromSmmData, 0)
  51. for _, v := range req {
  52. indexInfo := ShanghaiSmmNameToIndexMap[v.IndexName]
  53. if indexInfo == nil {
  54. // 指标不存在,需要添加指标索引
  55. indexCodeStr := "smm" + v.IndexName
  56. indexCodeStr, needAdd := ShanghaiSmmIndexCodeGenerator(v.IndexName, indexCodeStr)
  57. // 添加指标
  58. if needAdd {
  59. fmt.Printf("Name:%s, indexCode:%s \n", v.IndexName, indexCodeStr)
  60. // 添加指标
  61. item := new(models.BaseFromSmmIndex)
  62. item.IndexCode = indexCodeStr
  63. item.IndexName = v.IndexName
  64. item.Frequency = v.Frequency
  65. item.StartDate = v.RenewDate
  66. item.EndDate = v.RenewDate
  67. item.CreateTime = time.Now()
  68. item.Unit = v.Unit
  69. item.ModifyTime = time.Now()
  70. addIndexList = append(addIndexList, item)
  71. // 添加指标数据
  72. itemDate := new(models.BaseFromSmmData)
  73. itemDate.IndexCode = indexCodeStr
  74. itemDate.DataTime = v.RenewDate
  75. if v.Value == "highs" {
  76. itemDate.Value = strconv.FormatFloat(v.Highs, 'f', -1, 64)
  77. } else if v.Value == "low" {
  78. itemDate.Value = strconv.FormatFloat(v.Low, 'f', -1, 64)
  79. } else {
  80. itemDate.Value = strconv.FormatFloat(v.Average, 'f', -1, 64)
  81. }
  82. itemDate.CreateTime = time.Now()
  83. itemDate.ModifyTime = time.Now()
  84. itemDate.DataTimestamp = time.Now().UnixMilli()
  85. readyDateList = append(readyDateList, itemDate)
  86. } else {
  87. fmt.Printf("有重复的指标或指标名称 Name:%s, indexCode:%s \n", v.IndexName, indexCodeStr)
  88. return
  89. }
  90. } else {
  91. //存在指标,检查是否需要更新指标索引,及指标数据
  92. if indexInfo.EndDate != v.RenewDate {
  93. // 指标日期更新
  94. t := new(models.BaseFromSmmIndex)
  95. t.BaseFromSmmIndexId = indexInfo.BaseFromSmmIndexId
  96. t.EndDate = v.RenewDate
  97. updateIndexList = append(updateIndexList, t)
  98. // 指标数据更新
  99. item := new(models.BaseFromSmmData)
  100. item.BaseFromSmmIndexId = int(indexInfo.BaseFromSmmIndexId)
  101. item.IndexCode = indexInfo.IndexCode
  102. item.DataTime = v.RenewDate
  103. if v.Value == "highs" {
  104. item.Value = strconv.FormatFloat(v.Highs, 'f', -1, 64)
  105. } else if v.Value == "low" {
  106. item.Value = strconv.FormatFloat(v.Low, 'f', -1, 64)
  107. } else {
  108. item.Value = strconv.FormatFloat(v.Average, 'f', -1, 64)
  109. }
  110. item.CreateTime = time.Now()
  111. item.ModifyTime = time.Now()
  112. item.DataTimestamp = time.Now().UnixMilli()
  113. addDateList = append(addDateList, item)
  114. }
  115. }
  116. }
  117. if len(addIndexList) > 0 {
  118. _, err = models.AddBaseFromSmmIndex(addIndexList)
  119. if err != nil {
  120. utils.FileLog.Info("Error 插入指标库失败:", err)
  121. br.Msg = "插入指标库失败"
  122. br.ErrMsg = "插入指标库失败,Err:" + err.Error()
  123. return
  124. }
  125. }
  126. if len(updateIndexList) > 0 {
  127. for _, v := range updateIndexList {
  128. err = models.ModifyBaseFromSmmIndexDate(v)
  129. if err != nil {
  130. br.Msg = "更新指标数据失败"
  131. br.ErrMsg = "更新指标失败,Err:" + err.Error()
  132. return
  133. }
  134. }
  135. }
  136. if len(addDateList) > 0 {
  137. err = models.AddBaseFromSmmData(addDateList)
  138. if err != nil {
  139. utils.FileLog.Info("Error 插入指标数据失败:", err)
  140. br.Msg = "插入指标数据失败"
  141. br.ErrMsg = "插入指标数据失败,Err:" + err.Error()
  142. return
  143. }
  144. }
  145. allIndex, err = models.GetBaseFromSmmIndex()
  146. if err != nil {
  147. fmt.Println("select Code err:", err)
  148. utils.FileLog.Info("GetBaseFromSci99Index err:", err)
  149. return
  150. }
  151. // 获得更新后的数据
  152. for _, item := range allIndex {
  153. ShanghaiSmmNameToIndexMap[item.IndexName] = item
  154. ShanghaiSmmNameToCodeMap[item.IndexName] = item.IndexCode
  155. }
  156. for _, v := range readyDateList {
  157. indexName := ShanghaiSmmCodeToNameMap[v.IndexCode]
  158. baseSmmIndex := ShanghaiSmmNameToIndexMap[indexName]
  159. v.BaseFromSmmIndexId = int(baseSmmIndex.BaseFromSmmIndexId)
  160. }
  161. if len(readyDateList) > 0 {
  162. err = models.AddBaseFromSmmData(readyDateList)
  163. if err != nil {
  164. utils.FileLog.Info("Error 插入指标数据失败:", err)
  165. br.Msg = "插入指标数据失败"
  166. br.ErrMsg = "插入指标数据失败,Err:" + err.Error()
  167. return
  168. }
  169. }
  170. br.Msg = "数据刷新成功"
  171. br.Success = true
  172. br.Ret = 200
  173. }
  174. // @Title 刷新数据
  175. // @Description 刷新数据接口
  176. // @Param request body models.AddEdbClassifyReq true "type json string"
  177. // @Success 200 {object} models.EdbClassify
  178. // @router /refresh/excel [post]
  179. func (this *ShanghaiSmmController) RefreshExcel() {
  180. br := new(models.BaseResponse).Init()
  181. defer func() {
  182. this.Data["json"] = br
  183. this.ServeJSON()
  184. }()
  185. var req []*shanghaismm.EdbInfoData
  186. if err := json.Unmarshal(this.Ctx.Input.RequestBody, &req); err != nil {
  187. br.Msg = "参数解析异常!"
  188. br.ErrMsg = "参数解析失败,Err:" + err.Error()
  189. return
  190. }
  191. allIndex, err := models.GetBaseFromSmmIndex()
  192. if err != nil {
  193. fmt.Println("select Code err:", err)
  194. utils.FileLog.Info("GetBaseFromSci99Index err:", err)
  195. return
  196. }
  197. ShanghaiSmmCodeToIndexMap := make(map[string]*models.BaseFromSmmIndex)
  198. ShanghaiSmmCodeToIndexCount := make(map[string]int)
  199. for _, item := range allIndex {
  200. ShanghaiSmmCodeToIndexMap[item.IndexCode] = item
  201. ShanghaiSmmCodeToIndexCount[item.IndexCode] = 0
  202. ShanghaiSmmNameToCodeMap[item.IndexCode] = item.IndexName
  203. }
  204. updateIndexList := make([]*models.BaseFromSmmIndex, 0)
  205. addDataList := make([]*models.BaseFromSmmData, 0)
  206. updateDataList := make([]*models.BaseFromSmmData, 0)
  207. queryIndexIds := make([]int, 0)
  208. for _, v := range req {
  209. indexCode := strings.Replace(v.IndexCode, " ", "", -1)
  210. indexInfo := ShanghaiSmmCodeToIndexMap[indexCode]
  211. if indexInfo == nil {
  212. fmt.Printf("指标名称或指标id有误v.IndexName:%s, v.IndexCode:%s", v.IndexName, v.IndexCode)
  213. return
  214. }
  215. ShanghaiSmmCodeToIndexCount[v.IndexCode] += 1
  216. if ShanghaiSmmCodeToIndexCount[v.IndexCode] > 1 {
  217. fmt.Printf("指标名称或指标id有误v.IndexName:%s, v.IndexCode:%s", v.IndexName, v.IndexCode)
  218. return
  219. }
  220. queryIndexIds = append(queryIndexIds, int(indexInfo.BaseFromSmmIndexId))
  221. }
  222. list, err := models.GetBaseFromSmmDataByIds(queryIndexIds)
  223. if err != nil {
  224. br.Msg = "查询指标数据失败"
  225. br.ErrMsg = "查询指标数据失败,Err:" + err.Error()
  226. return
  227. }
  228. dateDataMap := make(map[int]map[string]string)
  229. for _, v := range list {
  230. dataMap, ok := dateDataMap[v.BaseFromSmmIndexId]
  231. if ok {
  232. dataMap[v.DataTime] = v.Value
  233. } else {
  234. dateDataMap[v.BaseFromSmmIndexId] = map[string]string{
  235. v.DataTime: v.Value,
  236. }
  237. }
  238. }
  239. for _, v := range req {
  240. indexCode := strings.Replace(v.IndexCode, " ", "", -1)
  241. indexInfo := ShanghaiSmmCodeToIndexMap[indexCode]
  242. isAdd := false
  243. indexItem := new(models.BaseFromSmmIndex)
  244. indexItem.BaseFromSmmIndexId = indexInfo.BaseFromSmmIndexId
  245. startDate, _ := time.Parse(utils.FormatDate, indexInfo.StartDate)
  246. endDate, _ := time.Parse(utils.FormatDate, indexInfo.EndDate)
  247. if v.LastDate.After(endDate) {
  248. isAdd = true
  249. indexItem.EndDate = v.LastDate.Format(utils.FormatDate)
  250. } else {
  251. indexItem.EndDate = indexInfo.EndDate
  252. }
  253. if v.OldDate.Before(startDate) {
  254. isAdd = true
  255. indexItem.StartDate = v.OldDate.Format(utils.FormatDate)
  256. } else {
  257. indexItem.StartDate = indexInfo.StartDate
  258. }
  259. if isAdd {
  260. indexItem.IndexName = v.IndexName
  261. indexItem.ModifyTime = time.Now()
  262. updateIndexList = append(updateIndexList, indexItem)
  263. }
  264. for k, dv := range v.Data {
  265. valueStr := strconv.FormatFloat(dv, 'f', -1, 64)
  266. valueRaw := dateDataMap[int(indexInfo.BaseFromSmmIndexId)][k]
  267. if valueRaw == "" {
  268. dataItem := new(models.BaseFromSmmData)
  269. dataItem.BaseFromSmmIndexId = int(indexInfo.BaseFromSmmIndexId)
  270. dataItem.IndexCode = indexInfo.IndexCode
  271. dataItem.DataTime = k
  272. dataItem.Value = valueStr
  273. dataItem.CreateTime = time.Now()
  274. dataItem.ModifyTime = time.Now()
  275. dataItem.DataTimestamp = time.Now().UnixMilli()
  276. addDataList = append(addDataList, dataItem)
  277. } else if valueStr != "" && valueRaw != valueStr {
  278. dataItem := new(models.BaseFromSmmData)
  279. dataItem.BaseFromSmmIndexId = int(indexInfo.BaseFromSmmIndexId)
  280. dataItem.IndexCode = indexInfo.IndexCode
  281. dataItem.DataTime = k
  282. dataItem.Value = valueStr
  283. dataItem.ModifyTime = time.Now()
  284. dataItem.DataTimestamp = time.Now().UnixMilli()
  285. updateDataList = append(updateDataList, dataItem)
  286. }
  287. }
  288. }
  289. if len(addDataList) > 0 {
  290. err = models.AddBaseFromSmmData(addDataList)
  291. if err != nil {
  292. br.Msg = "插入指标数据失败"
  293. br.ErrMsg = "插入指标数据失败,Err:" + err.Error()
  294. return
  295. }
  296. }
  297. if len(updateIndexList) > 0 {
  298. for _, v := range updateIndexList {
  299. err = v.UpdateCols([]string{"end_date", "start_date", "modify_time"})
  300. if err != nil {
  301. br.Msg = "更新指标索引失败"
  302. br.ErrMsg = "更新指标索引失败,Err:" + err.Error()
  303. return
  304. }
  305. }
  306. }
  307. // 不修改
  308. fmt.Println(len(updateDataList))
  309. // if len(updateDataList) > 0 {
  310. // err = models.UpdateBaseFromSmmDataListByIndexCode(updateDataList)
  311. // if err != nil {
  312. // br.Msg = "更新指标数据失败"
  313. // br.ErrMsg = "更新指标失败,Err:" + err.Error()
  314. // return
  315. // }
  316. // }
  317. br.Ret = 200
  318. br.Success = true
  319. br.Msg = "数据刷新成功"
  320. }
  321. func ShanghaiSmmIndexCodeGenerator(indexName, indexCodeStr string) (indexCode string, needAdd bool) {
  322. strResult := ""
  323. //首字母
  324. a := pinyin.NewArgs()
  325. a.Fallback = func(r rune, a pinyin.Args) []string {
  326. return []string{string(r)}
  327. }
  328. rows := pinyin.Pinyin(indexCodeStr, a)
  329. for i := 0; i < len(rows); i++ {
  330. //strResult += rows[i][0]
  331. if len(rows[i]) != 0 {
  332. str := rows[i][0]
  333. pi := str[0:1]
  334. strResult += pi
  335. }
  336. }
  337. // 去除特殊符号
  338. strResult = strings.Replace(strResult, " ", "", -1)
  339. strResult = strings.Replace(strResult, "-", "", -1)
  340. strResult = strings.Replace(strResult, "/", "", -1)
  341. strResult = strings.Replace(strResult, "#", "", -1)
  342. strResult = strings.Replace(strResult, ":", "", -1)
  343. strResult = strings.Replace(strResult, "(", "", -1)
  344. strResult = strings.Replace(strResult, ")", "", -1)
  345. strResult = strings.Replace(strResult, "%", "", -1)
  346. strResult = strings.Replace(strResult, "<", "1", -1)
  347. strResult = strings.Replace(strResult, "\xe2", "2", -1) // ≥
  348. strResult = strings.Replace(strResult, ".", "", -1)
  349. strResult = strings.Replace(strResult, ",", "", -1)
  350. strResult = strings.Replace(strResult, ":", "", -1)
  351. needAdd = true
  352. indexCode = strings.Replace(strResult, " ", "", -1)
  353. indexCode = strings.ToLower(indexCode)
  354. if _, ok := ShanghaiSmmCodeToNameMap[indexCode]; !ok {
  355. ShanghaiSmmCodeToNameMap[indexCode] = indexName
  356. ShanghaiSmmNameToCodeMap[indexName] = indexCode
  357. } else {
  358. needAdd = false
  359. }
  360. return
  361. }