shanghai_smm.go 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331
  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. for _, v := range req {
  207. indexCode := strings.Replace(v.IndexCode, " ", "", -1)
  208. indexInfo := ShanghaiSmmCodeToIndexMap[indexCode]
  209. if indexInfo == nil {
  210. fmt.Printf("指标名称或指标id有误v.IndexName:%s, v.IndexCode:%s", v.IndexName, v.IndexCode)
  211. return
  212. }
  213. ShanghaiSmmCodeToIndexCount[v.IndexCode] += 1
  214. if ShanghaiSmmCodeToIndexCount[v.IndexCode] > 1 {
  215. fmt.Printf("指标名称或指标id有误v.IndexName:%s, v.IndexCode:%s", v.IndexName, v.IndexCode)
  216. return
  217. }
  218. isAdd := false
  219. indexItem := new(models.BaseFromSmmIndex)
  220. indexItem.BaseFromSmmIndexId = indexInfo.BaseFromSmmIndexId
  221. startDate, _ := time.Parse(utils.FormatDate, indexInfo.StartDate)
  222. endDate, _ := time.Parse(utils.FormatDate, indexInfo.EndDate)
  223. if v.LastDate.After(endDate) {
  224. isAdd = true
  225. indexItem.EndDate = v.LastDate.Format(utils.FormatDate)
  226. } else {
  227. indexItem.EndDate = indexInfo.EndDate
  228. }
  229. if v.OldDate.Before(startDate) {
  230. isAdd = true
  231. indexItem.StartDate = v.OldDate.Format(utils.FormatDate)
  232. } else {
  233. indexItem.StartDate = indexInfo.StartDate
  234. }
  235. // 如果指标index有更新,那么需要添加指标数据
  236. if isAdd {
  237. indexItem.IndexName = v.IndexName
  238. indexItem.ModifyTime = time.Now()
  239. updateIndexList = append(updateIndexList, indexItem)
  240. for k, dv := range v.Data {
  241. dataItem := new(models.BaseFromSmmData)
  242. dataItem.BaseFromSmmIndexId = int(indexInfo.BaseFromSmmIndexId)
  243. dataItem.IndexCode = indexInfo.IndexCode
  244. dataItem.DataTime = k
  245. dataItem.Value = strconv.FormatFloat(dv, 'f', -1, 64)
  246. dataItem.CreateTime = time.Now()
  247. dataItem.ModifyTime = time.Now()
  248. dataItem.DataTimestamp = time.Now().UnixMilli()
  249. addDataList = append(addDataList, dataItem)
  250. }
  251. }
  252. }
  253. if len(addDataList) > 0 {
  254. err = models.AddBaseFromSmmData(addDataList)
  255. if err != nil {
  256. br.Msg = "插入指标数据失败"
  257. br.ErrMsg = "插入指标数据失败,Err:" + err.Error()
  258. return
  259. }
  260. }
  261. if len(updateIndexList) > 0 {
  262. for _, v := range updateIndexList {
  263. err = v.UpdateCols([]string{"end_date", "start_date", "modify_time"})
  264. if err != nil {
  265. br.Msg = "更新指标数据失败"
  266. br.ErrMsg = "更新指标失败,Err:" + err.Error()
  267. return
  268. }
  269. }
  270. }
  271. br.Ret = 200
  272. br.Success = true
  273. br.Msg = "数据刷新成功"
  274. }
  275. func ShanghaiSmmIndexCodeGenerator(indexName, indexCodeStr string) (indexCode string, needAdd bool) {
  276. strResult := ""
  277. //首字母
  278. a := pinyin.NewArgs()
  279. a.Fallback = func(r rune, a pinyin.Args) []string {
  280. return []string{string(r)}
  281. }
  282. rows := pinyin.Pinyin(indexCodeStr, a)
  283. for i := 0; i < len(rows); i++ {
  284. //strResult += rows[i][0]
  285. if len(rows[i]) != 0 {
  286. str := rows[i][0]
  287. pi := str[0:1]
  288. strResult += pi
  289. }
  290. }
  291. // 去除特殊符号
  292. strResult = strings.Replace(strResult, " ", "", -1)
  293. strResult = strings.Replace(strResult, "-", "", -1)
  294. strResult = strings.Replace(strResult, "/", "", -1)
  295. strResult = strings.Replace(strResult, "#", "", -1)
  296. strResult = strings.Replace(strResult, ":", "", -1)
  297. strResult = strings.Replace(strResult, "(", "", -1)
  298. strResult = strings.Replace(strResult, ")", "", -1)
  299. strResult = strings.Replace(strResult, "%", "", -1)
  300. strResult = strings.Replace(strResult, "<", "1", -1)
  301. strResult = strings.Replace(strResult, "\xe2", "2", -1) // ≥
  302. strResult = strings.Replace(strResult, ".", "", -1)
  303. strResult = strings.Replace(strResult, ",", "", -1)
  304. strResult = strings.Replace(strResult, ":", "", -1)
  305. needAdd = true
  306. indexCode = strings.Replace(strResult, " ", "", -1)
  307. indexCode = strings.ToLower(indexCode)
  308. if _, ok := ShanghaiSmmCodeToNameMap[indexCode]; !ok {
  309. ShanghaiSmmCodeToNameMap[indexCode] = indexName
  310. ShanghaiSmmNameToCodeMap[indexName] = indexCode
  311. } else {
  312. needAdd = false
  313. }
  314. return
  315. }