chart_info.go 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395
  1. package chart
  2. import (
  3. "errors"
  4. "fmt"
  5. "hongze/hongze_yb/global"
  6. chartEdbMappingModel "hongze/hongze_yb/models/tables/chart_edb_mapping"
  7. chartInfoModel "hongze/hongze_yb/models/tables/chart_info"
  8. company2 "hongze/hongze_yb/models/tables/company"
  9. edbDataModel "hongze/hongze_yb/models/tables/edb_data"
  10. edbInfoModel "hongze/hongze_yb/models/tables/edb_info"
  11. "hongze/hongze_yb/models/tables/my_chart_classify"
  12. "hongze/hongze_yb/models/tables/yb_chart_daily_visit_log"
  13. "hongze/hongze_yb/models/tables/yb_chart_visit_log"
  14. "hongze/hongze_yb/services/alarm_msg"
  15. "hongze/hongze_yb/services/user"
  16. "hongze/hongze_yb/utils"
  17. "sort"
  18. "strconv"
  19. "strings"
  20. "time"
  21. )
  22. // ModifyChartInfoAndMapping 修改图表信息
  23. func ModifyChartInfoAndMapping(edbInfoIdStr string, req *chartInfoModel.SaveChartInfoReq, chartType int) (err error) {
  24. // 开启事务
  25. tx := global.MYSQL["data"].Begin()
  26. defer func() {
  27. if err != nil {
  28. tx.Rollback()
  29. } else {
  30. tx.Commit()
  31. }
  32. }()
  33. // 更新图表信息
  34. if chartType == 1 {
  35. sql := ` UPDATE chart_info
  36. SET
  37. edb_info_ids = ?,
  38. modify_time = NOW(),
  39. date_type = ?,
  40. start_date = ?,
  41. end_date = ?,
  42. left_min = ?,
  43. left_max = ?,
  44. right_min = ?,
  45. right_max = ?
  46. WHERE chart_info_id = ?`
  47. err = tx.Exec(sql, edbInfoIdStr, req.DateType, req.StartDate, req.EndDate, req.LeftMin, req.LeftMax, req.RightMin, req.RightMax, req.ChartInfoId).Error
  48. } else {
  49. sql := ` UPDATE chart_info
  50. SET
  51. edb_info_ids = ?,
  52. modify_time = NOW(),
  53. calendar = ?,
  54. season_start_date = ?,
  55. season_end_date = ?,
  56. left_min = ?,
  57. left_max = ?,
  58. right_min = ?,
  59. right_max = ?
  60. WHERE chart_info_id = ?`
  61. err = tx.Exec(sql, edbInfoIdStr, req.Calendar, req.SeasonStartDate, req.SeasonEndDate, req.LeftMin, req.LeftMax, req.RightMin, req.RightMax, req.ChartInfoId).Error
  62. }
  63. if err != nil {
  64. fmt.Println("UPDATE chart_info Err:", err.Error())
  65. return
  66. }
  67. var edbInfoIdArr []string
  68. mapList := make([]*chartEdbMappingModel.ChartEdbMapping, 0)
  69. for _, v := range req.ChartEdbInfoList {
  70. edbInfoIdArr = append(edbInfoIdArr, strconv.Itoa(v.EdbInfoId))
  71. var count int
  72. csql := ` SELECT COUNT(1) AS count FROM chart_edb_mapping WHERE chart_info_id = ? AND edb_info_id = ? `
  73. err = tx.Raw(csql, req.ChartInfoId, v.EdbInfoId).Scan(&count).Error
  74. if err != nil {
  75. fmt.Println("QueryRow Err:", err.Error())
  76. return err
  77. }
  78. if count > 0 {
  79. // 更新指标
  80. msql := `UPDATE chart_edb_mapping
  81. SET
  82. modify_time = NOW(),
  83. max_data = ?,
  84. min_data = ?,
  85. is_order = ?,
  86. is_axis = ?,
  87. edb_info_type = ?,
  88. lead_value = ?,
  89. lead_unit = ?,
  90. chart_style = ?,
  91. chart_color = ?,
  92. chart_width = ?
  93. WHERE chart_info_id =? AND edb_info_id=? `
  94. err = tx.Exec(msql, v.MaxData, v.MinData, v.IsOrder, v.IsAxis, v.EdbInfoType, v.LeadValue, v.LeadUnit, v.ChartStyle, v.ChartColor, v.ChartWidth, req.ChartInfoId, v.EdbInfoId).Error
  95. if err != nil {
  96. fmt.Println("chart_edb_mapping Err:" + err.Error())
  97. return err
  98. }
  99. } else {
  100. mapItem := new(chartEdbMappingModel.ChartEdbMapping)
  101. mapItem.ChartInfoId = req.ChartInfoId
  102. mapItem.EdbInfoId = v.EdbInfoId
  103. mapItem.CreateTime = time.Now()
  104. mapItem.ModifyTime = time.Now()
  105. timestamp := strconv.FormatInt(time.Now().UnixNano(), 10)
  106. mapItem.UniqueCode = utils.MD5(utils.CHART_PREFIX + "_" + timestamp)
  107. mapItem.MaxData = v.MaxData
  108. mapItem.MinData = v.MinData
  109. mapItem.IsOrder = 0
  110. if v.IsOrder {
  111. mapItem.IsOrder = 1
  112. }
  113. mapItem.IsAxis = v.IsAxis
  114. mapItem.EdbInfoType = v.EdbInfoType
  115. mapItem.LeadValue = v.LeadValue
  116. mapItem.LeadUnit = v.LeadUnit
  117. mapItem.ChartStyle = v.ChartStyle
  118. mapItem.ChartColor = v.ChartColor
  119. mapItem.ChartWidth = v.ChartWidth
  120. mapList = append(mapList, mapItem)
  121. }
  122. }
  123. // 批量新增指标
  124. if len(mapList) > 0 {
  125. err = tx.Create(mapList).Error
  126. if err != nil {
  127. fmt.Println("AddChartEdbMapping Err:" + err.Error())
  128. return err
  129. }
  130. }
  131. // 清除原图表指标
  132. if len(edbInfoIdArr) > 0 {
  133. edbInfoIdStr := strings.Join(edbInfoIdArr, ",")
  134. if edbInfoIdStr != "" {
  135. dsql := `DELETE FROM chart_edb_mapping WHERE chart_info_id=? AND edb_info_id NOT IN(` + edbInfoIdStr + `)`
  136. err = tx.Exec(dsql, req.ChartInfoId).Error
  137. if err != nil {
  138. fmt.Println("delete err:" + err.Error())
  139. return err
  140. }
  141. }
  142. }
  143. return
  144. }
  145. // GetChartInfoRefreshData 获取需要刷新的指标
  146. func GetChartInfoRefreshData(chartInfoId int) (baseEdbInfoArr, calculateInfoArr []*edbInfoModel.EdbInfo, err error) {
  147. sql := ` SELECT b.* FROM chart_edb_mapping AS a
  148. INNER JOIN edb_info AS b ON a.edb_info_id=b.edb_info_id
  149. WHERE a.chart_info_id=? `
  150. edbInfoList := make([]*edbInfoModel.EdbInfo, 0)
  151. err = global.MYSQL["data"].Raw(sql, chartInfoId).Scan(&edbInfoList).Error
  152. if err != nil {
  153. return
  154. }
  155. for _, v := range edbInfoList {
  156. fmt.Println(v.EdbInfoId, v.EdbType)
  157. if v.EdbType == 1 {
  158. baseEdbInfoArr = append(baseEdbInfoArr, v)
  159. } else {
  160. calculateInfoArr = append(calculateInfoArr, v)
  161. newBaseEdbInfoArr, newCalculateInfoArr, err := GetChartRefreshEdbInfo(v.EdbInfoId, v.Source, 0)
  162. if err != nil {
  163. return baseEdbInfoArr, calculateInfoArr, err
  164. }
  165. baseEdbInfoArr = append(baseEdbInfoArr, newBaseEdbInfoArr...)
  166. calculateInfoArr = append(calculateInfoArr, newCalculateInfoArr...)
  167. }
  168. }
  169. return
  170. }
  171. // GetChartRefreshEdbInfo
  172. func GetChartRefreshEdbInfo(edbInfoId, source, n int) (baseEdbInfoArr, calculateInfoArr []*edbInfoModel.EdbInfo, err error) {
  173. calculateList, err := GetEdbInfoCalculateMap(edbInfoId, source)
  174. if err != nil && err != utils.ErrNoRow {
  175. return
  176. }
  177. n++
  178. for _, item := range calculateList {
  179. fmt.Println(item.EdbInfoId)
  180. if item.EdbType == 1 {
  181. baseEdbInfoArr = append(baseEdbInfoArr, item)
  182. } else {
  183. calculateInfoArr = append(calculateInfoArr, item)
  184. if n > 10 {
  185. return
  186. }
  187. newBaseEdbInfoArr, newCalculateInfoArr, _ := GetChartRefreshEdbInfo(item.EdbInfoId, item.Source, n)
  188. baseEdbInfoArr = append(baseEdbInfoArr, newBaseEdbInfoArr...)
  189. calculateInfoArr = append(calculateInfoArr, newCalculateInfoArr...)
  190. }
  191. }
  192. return
  193. }
  194. func GetEdbInfoCalculateMap(edbInfoId, source int) (list []*edbInfoModel.EdbInfo, err error) {
  195. sql := ` SELECT b.* FROM edb_info_calculate_mapping AS a
  196. INNER JOIN edb_info AS b ON a.from_edb_info_id=b.edb_info_id
  197. WHERE a.edb_info_id=? ORDER BY sort ASC `
  198. err = global.MYSQL["data"].Exec(sql, edbInfoId).Error
  199. return
  200. }
  201. // SaveChartVisitLog 保存图表访问记录
  202. func SaveChartVisitLog(userInfo user.UserInfo, chartInfo *chartInfoModel.ChartInfoView, myChartClassifyId int) (err error) {
  203. userId := int(userInfo.UserID)
  204. companyId := int(userInfo.CompanyID)
  205. chartInfoId := chartInfo.ChartInfoId
  206. // 访问记录
  207. visitLog := new(yb_chart_visit_log.YbChartVisitLog)
  208. visitLog.CompanyId = companyId
  209. companyInfo, err := company2.GetByCompanyId(userInfo.CompanyID)
  210. if err == nil {
  211. visitLog.CompanyName = companyInfo.CompanyName
  212. }
  213. visitLog.UserId = userId
  214. visitLog.RealName = userInfo.RealName
  215. visitLog.Mobile = userInfo.Mobile
  216. visitLog.Email = userInfo.Email
  217. visitLog.ChartInfoId = chartInfoId
  218. visitLog.ChartName = chartInfo.ChartName
  219. visitLog.CreateTime = time.Now().Local()
  220. visitLog.Create()
  221. // 每日访问记录,用户/天/图仅记录一次
  222. if myChartClassifyId > 0 {
  223. // 今日是否已访问
  224. nowTime := time.Now().Local()
  225. startTime := time.Date(nowTime.Year(), nowTime.Month(), nowTime.Day(), 0, 0, 0, 0, time.Local)
  226. endTime := time.Date(nowTime.Year(), nowTime.Month(), nowTime.Day(), 23, 59, 59, 0, time.Local)
  227. _, tmpErr := yb_chart_daily_visit_log.GetTodayVisitLog(userId, chartInfoId, myChartClassifyId, startTime, endTime)
  228. if tmpErr == nil {
  229. return
  230. }
  231. myChartClassify, tmpErr := my_chart_classify.GetClassifyById(myChartClassifyId)
  232. if tmpErr != nil {
  233. return
  234. }
  235. dailyLog := new(yb_chart_daily_visit_log.YbChartDailyVisitLog)
  236. dailyLog.CompanyId = companyId
  237. if companyInfo != nil {
  238. dailyLog.CompanyName = companyInfo.CompanyName
  239. }
  240. dailyLog.UserId = userId
  241. dailyLog.RealName = userInfo.RealName
  242. dailyLog.Mobile = userInfo.Mobile
  243. dailyLog.Email = userInfo.Email
  244. dailyLog.ChartInfoId = chartInfoId
  245. dailyLog.ChartName = chartInfo.ChartName
  246. dailyLog.MyChartClassifyId = myChartClassifyId
  247. dailyLog.MyChartClassifyName = myChartClassify.MyChartClassifyName
  248. dailyLog.CreateTime = time.Now().Local()
  249. dailyLog.Create()
  250. }
  251. return
  252. }
  253. // RefreshChart 图表刷新
  254. func RefreshChart(chartInfoId int) (err error) {
  255. var errMsg string
  256. defer func() {
  257. if err != nil {
  258. if global.CONFIG.Serve.RunMode == "release" {
  259. //go services.SendEmail(utils.APPNAME+"【"+global.CONFIG.Serve.RunMode+"】"+"失败提醒", "RefreshChart:"+errMsg, utils.EmailSendToUsers)
  260. go alarm_msg.SendAlarmMsg("RefreshChart Err:"+errMsg, 3)
  261. }
  262. fmt.Println("RefreshChart Err:" + errMsg)
  263. }
  264. }()
  265. // 获取需要刷新的指标
  266. baseEdbInfoArr, calculateInfoArr, err := GetChartInfoRefreshData(chartInfoId)
  267. if err != nil {
  268. errMsg = "获取需要刷新的指标失败:Err:" + err.Error()
  269. return
  270. }
  271. newBaseEdbInfoArr := make([]*edbInfoModel.EdbInfo, 0)
  272. baseMap := make(map[int]*edbInfoModel.EdbInfo)
  273. for _, bv := range baseEdbInfoArr {
  274. if _, ok := baseMap[bv.EdbInfoId]; !ok {
  275. newBaseEdbInfoArr = append(newBaseEdbInfoArr, bv)
  276. }
  277. baseMap[bv.EdbInfoId] = bv
  278. }
  279. newCalculateInfoArr := make([]*edbInfoModel.EdbInfo, 0)
  280. calculateMap := make(map[int]*edbInfoModel.EdbInfo)
  281. var calculateArr []int
  282. for _, bv := range calculateInfoArr {
  283. if _, ok := calculateMap[bv.EdbInfoId]; !ok {
  284. newCalculateInfoArr = append(newCalculateInfoArr, bv)
  285. calculateArr = append(calculateArr, bv.EdbInfoId)
  286. }
  287. calculateMap[bv.EdbInfoId] = bv
  288. }
  289. sort.Ints(calculateArr)
  290. // 刷新指标
  291. var startDate string
  292. for _, bv := range newBaseEdbInfoArr {
  293. source := bv.Source
  294. edbInfoId := bv.EdbInfoId
  295. edbCode := bv.EdbCode
  296. startDate = bv.StartDate.Format(utils.FormatDate)
  297. frequency := bv.Frequency
  298. if startDate == "0000-00-00" {
  299. continue
  300. }
  301. sTime := bv.EndDate
  302. var limitDay int
  303. startDate := ""
  304. switch frequency {
  305. case "日度":
  306. limitDay = utils.DATA_START_REFRESH_LIMIT
  307. case "周度":
  308. limitDay = utils.DATA_START_REFRESH_LIMIT * 7
  309. case "月度":
  310. limitDay = utils.DATA_START_REFRESH_LIMIT * 30
  311. case "季度":
  312. limitDay = utils.DATA_START_REFRESH_LIMIT * 90
  313. case "年度":
  314. limitDay = utils.DATA_START_REFRESH_LIMIT * 365
  315. default:
  316. limitDay = utils.DATA_START_REFRESH_LIMIT
  317. }
  318. startDate = sTime.AddDate(0, 0, -limitDay).Format(utils.FormatDate)
  319. fmt.Println("source:", source)
  320. respItem, err := RefreshEdbData(edbInfoId, source, edbCode, startDate)
  321. if err != nil {
  322. errMsg = errors.New("RefreshEdbData Err:" + err.Error()).Error()
  323. return err
  324. }
  325. if respItem.Ret != 200 {
  326. errMsg = errors.New(respItem.ErrMsg + ";EdbCode:" + edbCode).Error()
  327. return err
  328. }
  329. maxAndMinItem, err := edbDataModel.GetEdbInfoMaxAndMinInfo(source, edbCode)
  330. if err != nil {
  331. return err
  332. }
  333. if maxAndMinItem != nil {
  334. err = edbDataModel.ModifyEdbInfoMaxAndMinInfo(edbInfoId, maxAndMinItem)
  335. if err != nil {
  336. return err
  337. }
  338. }
  339. }
  340. // 刷新计算指标
  341. for _, v := range calculateArr {
  342. edbInfo := calculateMap[v]
  343. if edbInfo == nil {
  344. return err
  345. }
  346. startDate = edbInfo.StartDate.Format(utils.FormatDate)
  347. source := edbInfo.Source
  348. if source == utils.DATA_SOURCE_CALCULATE {
  349. sTime := edbInfo.EndDate
  350. startDate = sTime.Format(utils.FormatDate)
  351. }
  352. result, err := RefreshEdbCalculateData(edbInfo.EdbInfoId, edbInfo.EdbCode, startDate)
  353. if err != nil {
  354. fmt.Println(v, "RefreshEdbCalculateData err", time.Now())
  355. errMsg = "RefreshEdbCalculateData Err:" + err.Error()
  356. return err
  357. }
  358. if result.Ret != 200 {
  359. fmt.Println(v, "RefreshEdbCalculateData err;msg:", result.Msg, ";errMsg:", result.ErrMsg)
  360. errMsg = fmt.Sprint(v, "RefreshEdbCalculateData err;msg:", result.Msg, ";errMsg:", result.ErrMsg)
  361. return fmt.Errorf("刷新失败")
  362. }
  363. }
  364. return
  365. }