edb_info_calculate_hbz.go 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510
  1. package data_manage
  2. import (
  3. "errors"
  4. "fmt"
  5. "hongze/hongze_chart_lib/utils"
  6. "github.com/rdlucklib/rdluck_tools/orm"
  7. "strconv"
  8. "strings"
  9. "time"
  10. "github.com/shopspring/decimal"
  11. )
  12. type EdbInfoCalculateHbz struct {
  13. EdbInfoCalculateHbzId int `orm:"column(edb_info_calculate_hbz_id);pk"`
  14. EdbInfoId int `description:"指标id"`
  15. EdbCode string `description:"指标编码"`
  16. FromEdbInfoId int `description:"计算指标id"`
  17. FromEdbCode string `description:"计算指标编码"`
  18. FromEdbName string `description:"计算指标名称"`
  19. FromSource int `description:"计算指标来源"`
  20. FromSourceName string `description:"计算指标来源名称"`
  21. FromTag string `description:"来源指标标签"`
  22. Sort int `description:"计算指标名称排序"`
  23. CreateTime time.Time `description:"创建时间"`
  24. ModifyTime time.Time `description:"修改时间"`
  25. }
  26. //环比值
  27. func AddCalculateHbz(req *EdbInfoCalculateBatchSaveReq, fromEdbInfo *EdbInfo, edbCode, uniqueCode string, sysUserId int, sysUserRealName string, formulaInt int) (edbInfoId int, err error) {
  28. fmt.Println("AddCalculateHbz")
  29. o := orm.NewOrm()
  30. o.Using("data")
  31. o.Begin()
  32. defer func() {
  33. if err != nil {
  34. fmt.Println("AddCalculateHbz,Err:" + err.Error())
  35. o.Rollback()
  36. } else {
  37. o.Commit()
  38. }
  39. }()
  40. if req.EdbInfoId <= 0 {
  41. edbInfo := new(EdbInfo)
  42. edbInfo.Source = utils.DATA_SOURCE_CALCULATE_HBZ
  43. edbInfo.SourceName = "环比值"
  44. edbInfo.EdbCode = edbCode
  45. edbInfo.EdbName = req.EdbName
  46. edbInfo.EdbNameSource = req.EdbName
  47. edbInfo.Frequency = req.Frequency
  48. edbInfo.Unit = req.Unit
  49. edbInfo.ClassifyId = req.ClassifyId
  50. edbInfo.SysUserId = sysUserId
  51. edbInfo.SysUserRealName = sysUserRealName
  52. edbInfo.CreateTime = time.Now()
  53. edbInfo.ModifyTime = time.Now()
  54. edbInfo.UniqueCode = uniqueCode
  55. edbInfo.CalculateFormula = req.Formula
  56. edbInfo.EdbType = 2
  57. newEdbInfoId, err := o.Insert(edbInfo)
  58. if err != nil {
  59. return edbInfoId, err
  60. }
  61. edbInfoId = int(newEdbInfoId)
  62. //关联关系
  63. {
  64. calculateMappingItem := new(EdbInfoCalculateMapping)
  65. calculateMappingItem.CreateTime = time.Now()
  66. calculateMappingItem.ModifyTime = time.Now()
  67. calculateMappingItem.Sort = 1
  68. calculateMappingItem.EdbCode = edbCode
  69. calculateMappingItem.EdbInfoId = edbInfoId
  70. calculateMappingItem.FromEdbInfoId = fromEdbInfo.EdbInfoId
  71. calculateMappingItem.FromEdbCode = fromEdbInfo.EdbCode
  72. calculateMappingItem.FromEdbName = fromEdbInfo.EdbName
  73. calculateMappingItem.FromSource = fromEdbInfo.Source
  74. calculateMappingItem.FromSourceName = fromEdbInfo.SourceName
  75. calculateMappingItem.FromTag = ""
  76. calculateMappingItem.Source = edbInfo.Source
  77. calculateMappingItem.SourceName = edbInfo.SourceName
  78. go o.Insert(calculateMappingItem)
  79. }
  80. } else {
  81. edbInfoId = req.EdbInfoId
  82. dataTableName := GetEdbDataTableName(utils.DATA_SOURCE_CALCULATE_HBZ)
  83. deleteSql := ` DELETE FROM %s WHERE edb_info_id=? `
  84. deleteSql = fmt.Sprintf(deleteSql, dataTableName)
  85. _, err = o.Raw(deleteSql, req.EdbInfoId).Exec()
  86. }
  87. edbInfoIdStr := strconv.Itoa(edbInfoId)
  88. fmt.Println("edbInfoIdStr:" + edbInfoIdStr)
  89. //计算数据
  90. var condition string
  91. var pars []interface{}
  92. condition += " AND edb_info_id=? "
  93. if req.EdbInfoId <= 0 {
  94. pars = append(pars, req.FromEdbInfoId)
  95. } else {
  96. pars = append(pars, fromEdbInfo.EdbInfoId)
  97. }
  98. dataList, err := GetEdbDataListAll(condition, pars, fromEdbInfo.Source, 0)
  99. if err != nil {
  100. return edbInfoId, err
  101. }
  102. addSql := ` INSERT INTO edb_data_calculate_hbz(edb_info_id,edb_code,data_time,value,create_time,modify_time,status,data_timestamp) values `
  103. var isAdd bool
  104. existMap := make(map[string]string)
  105. dataLen := len(dataList)
  106. for i := 0; i < dataLen; i++ {
  107. j := i + formulaInt
  108. if j < dataLen {
  109. //当期
  110. currentItem := dataList[i]
  111. preItem := dataList[j]
  112. fmt.Println("preItem.Value:", preItem.Value)
  113. if currentItem != nil && preItem != nil && preItem.Value != 0 {
  114. existKey := edbCode + currentItem.DataTime
  115. if _, ok := existMap[existKey]; !ok {
  116. currentDate, _ := time.Parse(utils.FormatDate, currentItem.DataTime)
  117. timestamp := currentDate.UnixNano() / 1e6
  118. timestampStr := fmt.Sprintf("%d", timestamp)
  119. val := HbzDiv(currentItem.Value, preItem.Value)
  120. if val != "" {
  121. addSql += GetAddSql(edbInfoIdStr, edbCode, currentItem.DataTime, timestampStr, val)
  122. isAdd = true
  123. }
  124. }
  125. existMap[existKey] = currentItem.DataTime
  126. }
  127. }
  128. }
  129. if isAdd {
  130. addSql = strings.TrimRight(addSql, ",")
  131. _, err = o.Raw(addSql).Exec()
  132. if err != nil {
  133. return edbInfoId, err
  134. }
  135. }
  136. return
  137. }
  138. //环比值,current:当期,pre:上期 公式: (当期-上期)/上期
  139. func HbzDiv(current, pre float64) string {
  140. if pre == 0 {
  141. return ""
  142. }
  143. currentVal := decimal.NewFromFloat(float64(current))
  144. preVal := decimal.NewFromFloat(float64(pre))
  145. val, _ := currentVal.Sub(preVal).Div(preVal).Float64()
  146. valStr := utils.SubFloatToString(val, 4)
  147. return valStr
  148. }
  149. //环比值
  150. func EditCalculateHbz(req *EdbInfoCalculateBatchEditReq, fromEdbInfo *EdbInfo, edbCode string, formulaInt int, calculateFormula string) (edbInfoId int, err error) {
  151. edbInfoId = req.EdbInfoId
  152. o := orm.NewOrm()
  153. o.Using("data")
  154. o.Begin()
  155. defer func() {
  156. if err != nil {
  157. o.Rollback()
  158. } else {
  159. o.Commit()
  160. }
  161. }()
  162. //修改指标信息
  163. sql := ` UPDATE edb_info
  164. SET
  165. edb_name =?,
  166. edb_name_source=?,
  167. frequency = ?,
  168. unit = ?,
  169. classify_id = ?,
  170. calculate_formula=?,
  171. modify_time = NOW()
  172. WHERE edb_info_id = ? `
  173. _, err = o.Raw(sql, req.EdbName, req.EdbName, req.Frequency, req.Unit, req.ClassifyId, req.Formula, edbInfoId).Exec()
  174. if err != nil {
  175. return
  176. }
  177. var existCondition string
  178. var existPars []interface{}
  179. existCondition += " AND edb_info_id=? "
  180. existPars = append(existPars, edbInfoId)
  181. existCondition += " AND from_edb_info_id=? "
  182. existPars = append(existPars, req.FromEdbInfoId)
  183. //判断计算指标是否被更换
  184. count, err := GetEdbInfoCalculateCountByCondition(req.Source, existCondition, existPars)
  185. if err != nil {
  186. err = errors.New("判断指标是否改变失败,Err:" + err.Error())
  187. return
  188. }
  189. if count <= 0 || strconv.Itoa(formulaInt) != calculateFormula {
  190. //删除,计算指标关联的,基础指标的关联关系
  191. if count <= 0 {
  192. sql = ` DELETE FROM edb_info_calculate_mapping WHERE edb_info_id = ? `
  193. o.Raw(sql, edbInfoId).Exec()
  194. //关联关系
  195. {
  196. calculateMappingItem := new(EdbInfoCalculateMapping)
  197. calculateMappingItem.CreateTime = time.Now()
  198. calculateMappingItem.ModifyTime = time.Now()
  199. calculateMappingItem.Sort = 1
  200. calculateMappingItem.EdbCode = edbCode
  201. calculateMappingItem.EdbInfoId = edbInfoId
  202. calculateMappingItem.FromEdbInfoId = fromEdbInfo.EdbInfoId
  203. calculateMappingItem.FromEdbCode = fromEdbInfo.EdbCode
  204. calculateMappingItem.FromEdbName = fromEdbInfo.EdbName
  205. calculateMappingItem.FromSource = fromEdbInfo.Source
  206. calculateMappingItem.FromSourceName = fromEdbInfo.SourceName
  207. calculateMappingItem.FromTag = ""
  208. calculateMappingItem.Source = utils.DATA_SOURCE_CALCULATE_HBZ
  209. calculateMappingItem.SourceName = "环比值"
  210. o.Insert(calculateMappingItem)
  211. }
  212. }
  213. //清空原有数据
  214. sql = ` DELETE FROM edb_data_calculate_hbz WHERE edb_info_id = ? `
  215. _, err = o.Raw(sql, edbInfoId).Exec()
  216. if err != nil {
  217. return edbInfoId, err
  218. }
  219. edbInfoIdStr := strconv.Itoa(edbInfoId)
  220. //计算数据
  221. var condition string
  222. var pars []interface{}
  223. condition += " AND edb_info_id=? "
  224. pars = append(pars, req.FromEdbInfoId)
  225. dataList, err := GetEdbDataListAll(condition, pars, fromEdbInfo.Source, 0)
  226. if err != nil {
  227. return edbInfoId, err
  228. }
  229. addSql := ` INSERT INTO edb_data_calculate_hbz(edb_info_id,edb_code,data_time,value,create_time,modify_time,status,data_timestamp) values `
  230. var isAdd bool
  231. existMap := make(map[string]string)
  232. dataLen := len(dataList)
  233. for i := 0; i < dataLen; i++ {
  234. j := i + formulaInt
  235. if j < dataLen {
  236. //当期
  237. currentItem := dataList[i]
  238. preItem := dataList[j]
  239. if currentItem != nil && preItem != nil {
  240. existKey := edbCode + currentItem.DataTime
  241. if _, ok := existMap[existKey]; !ok {
  242. currentDate, _ := time.Parse(utils.FormatDate, currentItem.DataTime)
  243. timestamp := currentDate.UnixNano() / 1e6
  244. timestampStr := fmt.Sprintf("%d", timestamp)
  245. val := HbzDiv(currentItem.Value, preItem.Value)
  246. if val != "" {
  247. addSql += GetAddSql(edbInfoIdStr, edbCode, currentItem.DataTime, timestampStr, val)
  248. isAdd = true
  249. }
  250. }
  251. existMap[existKey] = currentItem.DataTime
  252. }
  253. }
  254. }
  255. if isAdd {
  256. addSql = strings.TrimRight(addSql, ",")
  257. _, err = o.Raw(addSql).Exec()
  258. if err != nil {
  259. return edbInfoId, err
  260. }
  261. }
  262. }
  263. return
  264. }
  265. //刷新环比值数据
  266. func RefreshCalculateHbz(edbInfoId, source int, fromEdbInfo *EdbInfo, edbCode, startDate, endDate string) (err error) {
  267. o := orm.NewOrm()
  268. o.Using("data")
  269. o.Begin()
  270. defer func() {
  271. if err != nil {
  272. o.Rollback()
  273. } else {
  274. o.Commit()
  275. }
  276. }()
  277. if err != nil {
  278. return
  279. }
  280. edbInfoIdStr := strconv.Itoa(edbInfoId)
  281. var condition string
  282. var pars []interface{}
  283. condition += " AND edb_info_id=? "
  284. pars = append(pars, fromEdbInfo.EdbInfoId)
  285. if startDate != "" {
  286. condition += " AND data_time>=? "
  287. pars = append(pars, startDate)
  288. }
  289. if endDate != "" {
  290. condition += " AND data_time<=? "
  291. pars = append(pars, endDate)
  292. }
  293. dataList, err := GetEdbDataListAll(condition, pars, fromEdbInfo.Source, 0)
  294. if err != nil {
  295. return err
  296. }
  297. //获取指标所有数据
  298. existDataList := make([]*EdbDataBase, 0)
  299. dataTableName := GetEdbDataTableName(source)
  300. fmt.Println("dataTableName:", dataTableName)
  301. sql := `SELECT * FROM %s WHERE edb_info_id=? `
  302. sql = fmt.Sprintf(sql, dataTableName)
  303. _, err = o.Raw(sql, edbInfoId).QueryRows(&existDataList)
  304. if err != nil {
  305. return err
  306. }
  307. existDataMap := make(map[string]string)
  308. for _, v := range existDataList {
  309. existDataMap[v.DataTime] = v.Value
  310. }
  311. addSql := ` INSERT INTO edb_data_calculate_hbz(edb_info_id,edb_code,data_time,value,create_time,modify_time,status,data_timestamp) values `
  312. var isAdd bool
  313. existMap := make(map[string]string)
  314. dataLen := len(dataList)
  315. fmt.Println("dataLen:", dataLen)
  316. for i := 0; i < dataLen; i++ {
  317. j := i + 1
  318. if j < dataLen {
  319. //当期
  320. currentItem := dataList[i]
  321. preItem := dataList[j]
  322. if currentItem != nil && preItem != nil {
  323. existKey := edbCode + currentItem.DataTime
  324. if _, ok := existMap[existKey]; !ok {
  325. currentDate, _ := time.Parse(utils.FormatDate, currentItem.DataTime)
  326. timestamp := currentDate.UnixNano() / 1e6
  327. timestampStr := fmt.Sprintf("%d", timestamp)
  328. val := HbzDiv(currentItem.Value, preItem.Value)
  329. if val != "" {
  330. if existVal, findOk := existDataMap[currentItem.DataTime]; !findOk {
  331. addSql += GetAddSql(edbInfoIdStr, edbCode, currentItem.DataTime, timestampStr, val)
  332. isAdd = true
  333. } else {
  334. if existVal != val {
  335. sql := ` UPDATE %s SET value=?,modify_time=NOW() WHERE edb_info_id=? AND data_time=? `
  336. sql = fmt.Sprintf(sql, dataTableName)
  337. _, err = o.Raw(sql, val, edbInfoId, currentItem.DataTime).Exec()
  338. if err != nil {
  339. return err
  340. }
  341. }
  342. }
  343. }
  344. }
  345. existMap[existKey] = currentItem.DataTime
  346. }
  347. }
  348. }
  349. if isAdd {
  350. addSql = strings.TrimRight(addSql, ",")
  351. _, err = o.Raw(addSql).Exec()
  352. if err != nil {
  353. return err
  354. }
  355. }
  356. return
  357. }
  358. type EdbInfoCalculateHbzDetail struct {
  359. EdbInfoCalculateTbzId int `orm:"column(edb_info_calculate_tbz_id);pk"`
  360. EdbInfoId int `description:"指标id"`
  361. EdbCode string `description:"指标编码"`
  362. FromEdbInfoId int `description:"计算指标id"`
  363. FromEdbCode string `description:"计算指标编码"`
  364. FromEdbName string `description:"计算指标名称"`
  365. FromSource int `description:"计算指标来源"`
  366. FromSourceName string `description:"计算指标来源名称"`
  367. FromTag string `description:"来源指标标签"`
  368. Sort int `description:"计算指标名称排序"`
  369. CreateTime time.Time `description:"创建时间"`
  370. ModifyTime time.Time `description:"修改时间"`
  371. StartDate string `description:"开始日期"`
  372. EndDate string `description:"结束日期"`
  373. }
  374. func GetEdbInfoCalculateHbzDetail(edbInfoId int) (item *EdbInfoCalculateTbzDetail, err error) {
  375. o := orm.NewOrm()
  376. o.Using("data")
  377. sql := ` SELECT a.*,b.start_date,b.end_date FROM edb_info_calculate_mapping AS a
  378. INNER JOIN edb_info AS b ON a.from_edb_info_id=b.edb_info_id
  379. WHERE a.edb_info_id=? `
  380. err = o.Raw(sql, edbInfoId).QueryRow(&item)
  381. return
  382. }
  383. //刷新所有环比值数据
  384. func RefreshAllCalculateHbz(edbInfoId, source int, fromEdbInfo *EdbInfo, edbCode, startDate, endDate string, formulaInt int) (err error) {
  385. o := orm.NewOrm()
  386. o.Using("data")
  387. o.Begin()
  388. defer func() {
  389. if err != nil {
  390. o.Rollback()
  391. } else {
  392. o.Commit()
  393. }
  394. }()
  395. if err != nil {
  396. return
  397. }
  398. edbInfoIdStr := strconv.Itoa(edbInfoId)
  399. //计算数据
  400. //计算数据
  401. var condition string
  402. var pars []interface{}
  403. condition += " AND edb_info_id=? "
  404. pars = append(pars, fromEdbInfo.EdbInfoId)
  405. if startDate != "" {
  406. condition += " AND data_time>=? "
  407. pars = append(pars, startDate)
  408. }
  409. if endDate != "" {
  410. condition += " AND data_time<=? "
  411. pars = append(pars, endDate)
  412. }
  413. dataList, err := GetEdbDataListAll(condition, pars, fromEdbInfo.Source, 0)
  414. if err != nil {
  415. return err
  416. }
  417. var dateArr []string
  418. dataMap := make(map[string]*EdbInfoSearchData)
  419. for _, v := range dataList {
  420. dateArr = append(dateArr, v.DataTime)
  421. dataMap[v.DataTime] = v
  422. }
  423. fmt.Println("source:", source)
  424. //获取指标所有数据
  425. existDataList := make([]*EdbDataBase, 0)
  426. dataTableName := GetEdbDataTableName(source)
  427. fmt.Println("dataTableName:", dataTableName)
  428. sql := `SELECT * FROM %s WHERE edb_info_id=? `
  429. sql = fmt.Sprintf(sql, dataTableName)
  430. _, err = o.Raw(sql, edbInfoId).QueryRows(&existDataList)
  431. if err != nil {
  432. return err
  433. }
  434. existDataMap := make(map[string]string)
  435. for _, v := range existDataList {
  436. existDataMap[v.DataTime] = v.Value
  437. }
  438. addSql := ` INSERT INTO edb_data_calculate_hbz(edb_info_id,edb_code,data_time,value,create_time,modify_time,status,data_timestamp) values `
  439. var isAdd bool
  440. existMap := make(map[string]string)
  441. dataLen := len(dataList)
  442. fmt.Println("dataLen:", dataLen)
  443. for i := 0; i < dataLen; i++ {
  444. j := i + formulaInt
  445. if j < dataLen {
  446. //当期
  447. currentItem := dataList[i]
  448. preItem := dataList[j]
  449. if currentItem != nil && preItem != nil {
  450. existKey := edbCode + currentItem.DataTime
  451. if _, ok := existMap[existKey]; !ok {
  452. currentDate, _ := time.Parse(utils.FormatDate, currentItem.DataTime)
  453. timestamp := currentDate.UnixNano() / 1e6
  454. timestampStr := fmt.Sprintf("%d", timestamp)
  455. val := HbzDiv(currentItem.Value, preItem.Value)
  456. if val != "" {
  457. if existVal, findOk := existDataMap[currentItem.DataTime]; !findOk {
  458. addSql += GetAddSql(edbInfoIdStr, edbCode, currentItem.DataTime, timestampStr, val)
  459. isAdd = true
  460. } else {
  461. if existVal != val {
  462. sql := ` UPDATE %s SET value=?,modify_time=NOW() WHERE edb_info_id=? AND data_time=? `
  463. sql = fmt.Sprintf(sql, dataTableName)
  464. _, err = o.Raw(sql, val, edbInfoId, currentItem.DataTime).Exec()
  465. if err != nil {
  466. return err
  467. }
  468. }
  469. }
  470. }
  471. }
  472. existMap[existKey] = currentItem.DataTime
  473. }
  474. }
  475. }
  476. if isAdd {
  477. addSql = strings.TrimRight(addSql, ",")
  478. _, err = o.Raw(addSql).Exec()
  479. if err != nil {
  480. return err
  481. }
  482. }
  483. return
  484. }