edb_info_calculate_ljztbpj.go 29 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892
  1. package data_manage
  2. import (
  3. "errors"
  4. "fmt"
  5. "github.com/shopspring/decimal"
  6. "hongze/hongze_chart_lib/utils"
  7. "github.com/rdlucklib/rdluck_tools/orm"
  8. "sort"
  9. "strings"
  10. "time"
  11. )
  12. // AddCalculateLjztbpj 新增累计值同比拼接数据
  13. func AddCalculateLjztbpj(req *EdbInfoCalculateBatchSaveReq, firstEdbInfo, secondEdbInfo *EdbInfo, edbCode, uniqueCode string, sysUserId int, sysUserRealName string) (edbInfoId int, err error) {
  14. fmt.Println("AddCalculateLjztbpj")
  15. o := orm.NewOrm()
  16. o.Using("data")
  17. o.Begin()
  18. defer func() {
  19. if err != nil {
  20. fmt.Println("AddCalculateLjztbpj,Err:" + err.Error())
  21. o.Rollback()
  22. } else {
  23. o.Commit()
  24. }
  25. }()
  26. //待拼接指标map
  27. pjDataMap := make(map[string]float64)
  28. //拼接指标的日期切片数据
  29. pjEdbDataTimeList := make([]string, 0)
  30. //最近开始的时间
  31. var lastDateTime time.Time
  32. //获取待拼接指标
  33. {
  34. var condition string
  35. var pars []interface{}
  36. //获取待拼接指标最近的个12月31日有值的年份
  37. condition += " AND data_time like ? AND edb_info_id=? "
  38. pars = append(pars, "%12-31", firstEdbInfo.EdbInfoId)
  39. lastEdbData, tmpErr := GetLastEdbData(condition, pars, firstEdbInfo.Source)
  40. if tmpErr != nil {
  41. return edbInfoId, tmpErr
  42. }
  43. lastDateTime, _ = time.ParseInLocation(utils.FormatDate, lastEdbData.DataTime, time.Local)
  44. //获取待拼接指标的数据列表
  45. condition = ``
  46. pars = make([]interface{}, 0)
  47. condition += " AND data_time <= ? AND edb_info_id=? "
  48. pars = append(pars, lastEdbData.DataTime, firstEdbInfo.EdbInfoId)
  49. firstDataList, tmpErr := GetEdbDataListAll(condition, pars, firstEdbInfo.Source, 0)
  50. if tmpErr != nil {
  51. return edbInfoId, tmpErr
  52. }
  53. for _, v := range firstDataList {
  54. pjDataMap[v.DataTime] = v.Value
  55. pjEdbDataTimeList = append(pjEdbDataTimeList, v.DataTime)
  56. }
  57. }
  58. var edbInfo *EdbInfo
  59. if req.EdbInfoId <= 0 {
  60. edbInfo = &EdbInfo{
  61. SourceName: "累计值同比拼接",
  62. Source: utils.DATA_SOURCE_CALCULATE_LJZTBPJ,
  63. EdbCode: edbCode,
  64. EdbName: req.EdbName,
  65. EdbNameSource: req.EdbName,
  66. Frequency: req.Frequency,
  67. Unit: req.Unit,
  68. StartDate: firstEdbInfo.StartDate,
  69. EndDate: firstEdbInfo.EndDate,
  70. ClassifyId: req.ClassifyId,
  71. SysUserId: sysUserId,
  72. SysUserRealName: sysUserRealName,
  73. UniqueCode: uniqueCode,
  74. CreateTime: time.Now(),
  75. ModifyTime: time.Now(),
  76. CalculateFormula: lastDateTime.Format(utils.FormatDate),
  77. EdbType: 2,
  78. }
  79. newEdbInfoId, err := o.Insert(edbInfo)
  80. if err != nil {
  81. return edbInfoId, err
  82. }
  83. edbInfoId = int(newEdbInfoId)
  84. } else {
  85. edbInfoId = req.EdbInfoId
  86. //查询
  87. tmpEdbInfo, tmpErr := GetEdbInfoById(edbInfoId)
  88. if tmpErr != nil {
  89. err = tmpErr
  90. return
  91. }
  92. tmpEdbInfo.EdbName = req.EdbName
  93. tmpEdbInfo.ClassifyId = req.ClassifyId
  94. tmpEdbInfo.Frequency = req.Frequency
  95. tmpEdbInfo.Unit = req.Unit
  96. tmpEdbInfo.CalculateFormula = req.Formula
  97. edbInfo = tmpEdbInfo
  98. //删除指标数据
  99. dataTableName := GetEdbDataTableName(utils.DATA_SOURCE_CALCULATE_LJZTBPJ)
  100. fmt.Println("dataTableName:" + dataTableName)
  101. deleteSql := ` DELETE FROM %s WHERE edb_info_id=? `
  102. deleteSql = fmt.Sprintf(deleteSql, dataTableName)
  103. _, err = o.Raw(deleteSql, req.EdbInfoId).Exec()
  104. if err != nil {
  105. return 0, err
  106. }
  107. //删除指标关系
  108. sql := ` DELETE FROM edb_info_calculate_mapping WHERE edb_info_id=? `
  109. _, err = o.Raw(sql, edbInfoId).Exec()
  110. }
  111. //关联关系
  112. //拼接指标
  113. {
  114. calculateMappingItem := new(EdbInfoCalculateMapping)
  115. calculateMappingItem.CreateTime = time.Now()
  116. calculateMappingItem.ModifyTime = time.Now()
  117. calculateMappingItem.Sort = 1
  118. calculateMappingItem.EdbCode = edbCode
  119. calculateMappingItem.EdbInfoId = edbInfoId
  120. calculateMappingItem.FromEdbInfoId = firstEdbInfo.EdbInfoId
  121. calculateMappingItem.FromEdbCode = firstEdbInfo.EdbCode
  122. calculateMappingItem.FromEdbName = firstEdbInfo.EdbName
  123. calculateMappingItem.FromSource = firstEdbInfo.Source
  124. calculateMappingItem.FromSourceName = firstEdbInfo.SourceName
  125. calculateMappingItem.FromTag = "A"
  126. calculateMappingItem.Source = edbInfo.Source
  127. calculateMappingItem.SourceName = edbInfo.SourceName
  128. go o.Insert(calculateMappingItem)
  129. }
  130. //同比值指标
  131. {
  132. calculateMappingItem := new(EdbInfoCalculateMapping)
  133. calculateMappingItem.CreateTime = time.Now()
  134. calculateMappingItem.ModifyTime = time.Now()
  135. calculateMappingItem.Sort = 1
  136. calculateMappingItem.EdbCode = edbCode
  137. calculateMappingItem.EdbInfoId = edbInfoId
  138. calculateMappingItem.FromEdbInfoId = secondEdbInfo.EdbInfoId
  139. calculateMappingItem.FromEdbCode = secondEdbInfo.EdbCode
  140. calculateMappingItem.FromEdbName = secondEdbInfo.EdbName
  141. calculateMappingItem.FromSource = secondEdbInfo.Source
  142. calculateMappingItem.FromSourceName = secondEdbInfo.SourceName
  143. calculateMappingItem.FromTag = "B"
  144. calculateMappingItem.Source = edbInfo.Source
  145. calculateMappingItem.SourceName = edbInfo.SourceName
  146. go o.Insert(calculateMappingItem)
  147. }
  148. //同比值指标map
  149. tbzEdbDataMap := make(map[string]float64)
  150. //同比值日期切片列表
  151. tbzEdbDataTimeList := make([]string, 0)
  152. //同比值指标
  153. {
  154. var condition string
  155. var pars []interface{}
  156. condition += " AND data_time > ? AND edb_info_id = ? "
  157. pars = append(pars, lastDateTime, secondEdbInfo.EdbInfoId)
  158. //同比值指标的数据列表
  159. secondDataList, tmpErr := GetEdbDataListAll(condition, pars, secondEdbInfo.Source, 0)
  160. if tmpErr != nil {
  161. return edbInfoId, tmpErr
  162. }
  163. for _, v := range secondDataList {
  164. tbzEdbDataMap[v.DataTime] = v.Value
  165. tbzEdbDataTimeList = append(tbzEdbDataTimeList, v.DataTime)
  166. }
  167. }
  168. sort.Strings(tbzEdbDataTimeList)
  169. for _, v := range tbzEdbDataTimeList {
  170. tbzDataTime, _ := time.ParseInLocation(utils.FormatDate, v, time.Local)
  171. //获取拼接指标上一年同一天的数据
  172. var pjDataTime time.Time
  173. if tbzDataTime.Month() == 2 {
  174. pjDataTime = tbzDataTime.AddDate(0, -11, 0)
  175. pjDataTime = time.Date(pjDataTime.Year(), pjDataTime.Month(), 1, 0, 0, 0, 0, time.Now().Location()).AddDate(0, 0, -1)
  176. } else {
  177. pjDataTime = tbzDataTime.AddDate(-1, 0, 0)
  178. }
  179. //如果存在数据,那么就去计算当前的数据
  180. if pjDataValue, ok := pjDataMap[pjDataTime.Format(utils.FormatDate)]; ok {
  181. tbzDataValue := tbzEdbDataMap[v] //同比值
  182. currValue := pjDataValue * (1 + tbzDataValue/100)
  183. currValue, _ = decimal.NewFromFloat(currValue).Truncate(4).Float64()
  184. //将计算后的数据存入待拼接指标map里面,以便后续计算
  185. pjDataMap[v] = currValue
  186. pjEdbDataTimeList = append(pjEdbDataTimeList, v)
  187. }
  188. }
  189. addDataList := make([]*EdbDataCalculateLjztbpj, 0)
  190. //日期排序下
  191. sort.Strings(pjEdbDataTimeList)
  192. //这么做的目的是为了让数据插入的时候,可以正序插入(业务上没啥卵用,就是为了让我看数据的时候舒服点,手动狗头-_-|)
  193. for _, dataTime := range pjEdbDataTimeList {
  194. if dataValue, ok := pjDataMap[dataTime]; ok {
  195. //时间戳
  196. currentDate, _ := time.Parse(utils.FormatDate, dataTime)
  197. timestamp := currentDate.UnixNano() / 1e6
  198. edbDataLjztbpj := &EdbDataCalculateLjztbpj{
  199. EdbInfoId: edbInfoId,
  200. EdbCode: edbInfo.EdbCode,
  201. DataTime: dataTime,
  202. Value: dataValue,
  203. Status: 1,
  204. CreateTime: time.Now(),
  205. ModifyTime: time.Now(),
  206. DataTimestamp: timestamp,
  207. }
  208. addDataList = append(addDataList, edbDataLjztbpj)
  209. }
  210. }
  211. //数据入库
  212. tmpAddDataList := make([]*EdbDataCalculateLjztbpj, 0)
  213. for _, v := range addDataList {
  214. tmpAddDataList = append(tmpAddDataList, v)
  215. if len(tmpAddDataList) >= 200 {
  216. _, tmpErr := o.InsertMulti(len(tmpAddDataList), tmpAddDataList)
  217. if tmpErr != nil {
  218. err = tmpErr
  219. return
  220. }
  221. //重新初始化需要加入的数据切片
  222. tmpAddDataList = make([]*EdbDataCalculateLjztbpj, 0)
  223. }
  224. }
  225. //最后如果还有需要新增的数据,那么就统一入库
  226. if len(tmpAddDataList) > 0 {
  227. _, tmpErr := o.InsertMulti(len(tmpAddDataList), tmpAddDataList)
  228. if tmpErr != nil {
  229. err = tmpErr
  230. return
  231. }
  232. }
  233. return
  234. }
  235. // EditCalculateLjztbpj 编辑累计值同比拼接数据
  236. func EditCalculateLjztbpj(req *EdbInfoCalculateBatchEditReq, nowEdbInfo, firstEdbInfo, secondEdbInfo *EdbInfo) (edbInfoId int, err error) {
  237. edbInfoId = req.EdbInfoId
  238. o := orm.NewOrm()
  239. o.Using("data")
  240. o.Begin()
  241. defer func() {
  242. if err != nil {
  243. o.Rollback()
  244. } else {
  245. o.Commit()
  246. }
  247. }()
  248. sql := ``
  249. var existCondition string
  250. var existPars []interface{}
  251. existCondition += " AND edb_info_id=? "
  252. existPars = append(existPars, edbInfoId)
  253. //查询出所有的关联指标
  254. existList, err := GetEdbInfoCalculateListByCondition(existCondition, existPars)
  255. if err != nil {
  256. err = errors.New("判断指标是否改变失败,Err:" + err.Error())
  257. return
  258. }
  259. var existItemA, existItemB *EdbInfoCalculateMapping
  260. for _, existItem := range existList {
  261. if existItem.FromTag == "A" {
  262. existItemA = existItem
  263. } else if existItem.FromTag == "B" {
  264. existItemB = existItem
  265. }
  266. }
  267. // 原数据开始计算日期
  268. startCalculationDate, _ := time.ParseInLocation(utils.FormatDate, nowEdbInfo.CalculateFormula, time.Local)
  269. //待拼接指标map
  270. pjDataMap := make(map[string]float64) //需要入库的数据
  271. nowEdbDataMap := make(map[string]float64) //当前指标的数据(已经在库里了,不需要重新)
  272. //拼接指标的日期切片数据
  273. pjEdbDataTimeList := make([]string, 0)
  274. //最近开始的时间
  275. lastDateTime := startCalculationDate
  276. //待拼接指标数据
  277. {
  278. //如果拼接指标变更了,那么需要删除所有的指标进行重新拼接
  279. if existItemA.FromEdbInfoId != firstEdbInfo.EdbInfoId {
  280. //删除旧的指标数据
  281. {
  282. //删除之前的A指标关联关系
  283. sql = ` DELETE FROM edb_info_calculate_mapping WHERE edb_info_id = ? and from_edb_info_id = ?`
  284. _, err = o.Raw(sql, edbInfoId, existItemA.FromEdbInfoId).Exec()
  285. if err != nil {
  286. err = errors.New("删除拼接日期之前的指标关联关系失败,Err:" + err.Error())
  287. return
  288. }
  289. //如果拼接指标变更了,那么需要删除所有的指标数据
  290. tableName := GetEdbDataTableName(nowEdbInfo.Source)
  291. sql = fmt.Sprintf(` DELETE FROM %s WHERE edb_info_id = ? `, tableName)
  292. _, err = o.Raw(sql, edbInfoId).Exec()
  293. if err != nil {
  294. err = errors.New("删除所有的累计值同比拼接指标数据失败,Err:" + err.Error())
  295. return
  296. }
  297. }
  298. //添加新的指标关系
  299. {
  300. calculateMappingItem := new(EdbInfoCalculateMapping)
  301. calculateMappingItem.CreateTime = time.Now()
  302. calculateMappingItem.ModifyTime = time.Now()
  303. calculateMappingItem.Sort = 1
  304. calculateMappingItem.EdbCode = nowEdbInfo.EdbCode
  305. calculateMappingItem.EdbInfoId = edbInfoId
  306. calculateMappingItem.FromEdbInfoId = firstEdbInfo.EdbInfoId
  307. calculateMappingItem.FromEdbCode = firstEdbInfo.EdbCode
  308. calculateMappingItem.FromEdbName = firstEdbInfo.EdbName
  309. calculateMappingItem.FromSource = firstEdbInfo.Source
  310. calculateMappingItem.FromSourceName = firstEdbInfo.SourceName
  311. calculateMappingItem.FromTag = "A"
  312. calculateMappingItem.Source = nowEdbInfo.Source
  313. calculateMappingItem.SourceName = nowEdbInfo.SourceName
  314. go o.Insert(calculateMappingItem)
  315. }
  316. var condition string
  317. var pars []interface{}
  318. //获取待拼接指标最近的个12月31日有值的年份
  319. condition += " AND data_time like ? AND edb_info_id=? "
  320. pars = append(pars, "%12-31", firstEdbInfo.EdbInfoId)
  321. //获取最新的待拼接指标
  322. lastEdbData, tmpErr := GetLastEdbData(condition, pars, firstEdbInfo.Source)
  323. if tmpErr != nil {
  324. return edbInfoId, tmpErr
  325. }
  326. lastDateTime, _ = time.ParseInLocation(utils.FormatDate, lastEdbData.DataTime, time.Local)
  327. //获取待拼接指标的数据列表
  328. condition = ``
  329. pars = make([]interface{}, 0)
  330. condition += " AND data_time <= ? AND edb_info_id=? "
  331. pars = append(pars, lastEdbData.DataTime, firstEdbInfo.EdbInfoId)
  332. firstDataList, tmpErr := GetEdbDataListAll(condition, pars, firstEdbInfo.Source, 0)
  333. if tmpErr != nil {
  334. return edbInfoId, tmpErr
  335. }
  336. for _, v := range firstDataList {
  337. pjDataMap[v.DataTime] = v.Value
  338. pjEdbDataTimeList = append(pjEdbDataTimeList, v.DataTime)
  339. //将新的数据存入已入库指标map里面,以便后续计算
  340. nowEdbDataMap[v.DataTime] = v.Value
  341. }
  342. } else {
  343. // 获取当前指标的所有数据
  344. var condition string
  345. var pars []interface{}
  346. condition += " AND edb_info_id=? and data_time <= ?"
  347. pars = append(pars, nowEdbInfo.EdbInfoId, nowEdbInfo.CalculateFormula)
  348. nowEdbDataList, tmpErr := GetEdbDataListAll(condition, pars, nowEdbInfo.Source, 0)
  349. if tmpErr != nil {
  350. return edbInfoId, tmpErr
  351. }
  352. for _, v := range nowEdbDataList {
  353. nowEdbDataMap[v.DataTime] = v.Value
  354. pjEdbDataTimeList = append(pjEdbDataTimeList, v.DataTime)
  355. }
  356. }
  357. }
  358. //同比值指标map
  359. tbzEdbDataMap := make(map[string]float64)
  360. //同比值日期切片列表
  361. tbzEdbDataTimeList := make([]string, 0)
  362. //同比值指标
  363. {
  364. if existItemB.FromEdbInfoId != secondEdbInfo.EdbInfoId {
  365. //删除通过B指标生成的数据
  366. {
  367. //删除之前的B指标关联关系
  368. sql = ` DELETE FROM edb_info_calculate_mapping WHERE edb_info_id = ? and from_edb_info_id = ?`
  369. _, err = o.Raw(sql, edbInfoId, existItemB.FromEdbInfoId).Exec()
  370. if err != nil {
  371. err = errors.New("删除拼接日期之后的指标关联关系失败,Err:" + err.Error())
  372. return
  373. }
  374. //如果同比值指标变更了,那么需要删除所有计算出来的指标数据
  375. tableName := GetEdbDataTableName(nowEdbInfo.Source)
  376. sql = fmt.Sprintf(` DELETE FROM %s WHERE edb_info_id = ? and data_time > ? `, tableName)
  377. _, err = o.Raw(sql, edbInfoId, nowEdbInfo.CalculateFormula).Exec()
  378. if err != nil {
  379. err = errors.New("删除计算出来的累计值同比拼接指标数据失败,Err:" + err.Error())
  380. return
  381. }
  382. }
  383. //添加新的指标关系
  384. {
  385. calculateMappingItem := new(EdbInfoCalculateMapping)
  386. calculateMappingItem.CreateTime = time.Now()
  387. calculateMappingItem.ModifyTime = time.Now()
  388. calculateMappingItem.Sort = 1
  389. calculateMappingItem.EdbCode = nowEdbInfo.EdbCode
  390. calculateMappingItem.EdbInfoId = edbInfoId
  391. calculateMappingItem.FromEdbInfoId = secondEdbInfo.EdbInfoId
  392. calculateMappingItem.FromEdbCode = secondEdbInfo.EdbCode
  393. calculateMappingItem.FromEdbName = secondEdbInfo.EdbName
  394. calculateMappingItem.FromSource = secondEdbInfo.Source
  395. calculateMappingItem.FromSourceName = secondEdbInfo.SourceName
  396. calculateMappingItem.FromTag = "B"
  397. calculateMappingItem.Source = nowEdbInfo.Source
  398. calculateMappingItem.SourceName = nowEdbInfo.SourceName
  399. go o.Insert(calculateMappingItem)
  400. }
  401. }
  402. var condition string
  403. var pars []interface{}
  404. condition += " AND data_time > ? AND edb_info_id = ? "
  405. pars = append(pars, lastDateTime, secondEdbInfo.EdbInfoId)
  406. //同比值指标的数据列表
  407. secondDataList, tmpErr := GetEdbDataListAll(condition, pars, secondEdbInfo.Source, 0)
  408. if tmpErr != nil {
  409. return edbInfoId, tmpErr
  410. }
  411. for _, v := range secondDataList {
  412. tbzEdbDataMap[v.DataTime] = v.Value
  413. tbzEdbDataTimeList = append(tbzEdbDataTimeList, v.DataTime)
  414. }
  415. }
  416. sort.Strings(tbzEdbDataTimeList)
  417. // 遍历现有的数据,判断拼接指标中是否存在该日期数据,如果拼接指标无此数据,那么需要删除该日期数据(日期的判断:需要在开始计算日期之后)
  418. removeDateList := make([]string, 0)
  419. for nowEdbDate := range nowEdbDataMap {
  420. nowEdbDateTime, _ := time.ParseInLocation(utils.FormatDate, nowEdbDate, time.Local)
  421. //校验日期 需要 大于 拼接前日期
  422. if startCalculationDate.Before(nowEdbDateTime) {
  423. if _, ok := tbzEdbDataMap[nowEdbDate]; !ok {
  424. // 同比指标中,不存在该日期数据,那么需要移除 现有数据 中该日期的数据
  425. removeDateList = append(removeDateList, nowEdbDate)
  426. }
  427. }
  428. }
  429. //待修改的指标数据map(index:日期,value:值)
  430. updateEdbDataMap := make(map[string]float64)
  431. for _, v := range tbzEdbDataTimeList {
  432. tbzDataTime, _ := time.ParseInLocation(utils.FormatDate, v, time.Local)
  433. //获取拼接指标上一年同一天的数据
  434. var pjDataTime time.Time
  435. if tbzDataTime.Month() == 2 {
  436. pjDataTime = tbzDataTime.AddDate(0, -11, 0)
  437. pjDataTime = time.Date(pjDataTime.Year(), pjDataTime.Month(), 1, 0, 0, 0, 0, time.Now().Location()).AddDate(0, 0, -1)
  438. } else {
  439. pjDataTime = tbzDataTime.AddDate(-1, 0, 0)
  440. }
  441. //校验现有数据中,是否存在该日期的数据,如果存在的话,那么就要去校验 最新计算数据 与 现有数据 是否一致
  442. if nowEdbDataValue, isHas := nowEdbDataMap[v]; isHas {
  443. //获取去年今日的数据,获取到后,然后是去修改该日期的数据
  444. if lastYearEdbDataValue, ok := nowEdbDataMap[pjDataTime.Format(utils.FormatDate)]; ok {
  445. tbzDataValue := tbzEdbDataMap[v] //同比值
  446. currValue := lastYearEdbDataValue * (1 + tbzDataValue/100)
  447. currValue, _ = decimal.NewFromFloat(currValue).Truncate(4).Float64() //保留4位小数
  448. //如果计算出来的值与库里面的值不匹配,那么就去修改该值
  449. if nowEdbDataValue != currValue {
  450. //将计算后的数据存入待拼接指标map里面,以便后续计算
  451. updateEdbDataMap[v] = currValue
  452. }
  453. }
  454. } else {
  455. //因为 现有数据中 不存在该日期数据,那么需要做新增数据处理
  456. //如果去年今日存在该数据,那么就去计算当前的数据
  457. if pjDataValue, ok := nowEdbDataMap[pjDataTime.Format(utils.FormatDate)]; ok {
  458. tbzDataValue := tbzEdbDataMap[v] //同比值
  459. currValue := pjDataValue * (1 + tbzDataValue/100)
  460. currValue, _ = decimal.NewFromFloat(currValue).Truncate(4).Float64()
  461. //将计算后的数据存入已入库指标map里面,以便后续计算
  462. nowEdbDataMap[v] = currValue
  463. //将计算后的数据存入待拼接指标map里面,以便后续入库
  464. pjDataMap[v] = currValue
  465. pjEdbDataTimeList = append(pjEdbDataTimeList, v)
  466. }
  467. }
  468. }
  469. //新增的数据入库
  470. {
  471. addDataList := make([]*EdbDataCalculateLjztbpj, 0)
  472. for dataTime, dataValue := range pjDataMap {
  473. //时间戳
  474. currentDate, _ := time.Parse(utils.FormatDate, dataTime)
  475. timestamp := currentDate.UnixNano() / 1e6
  476. edbDataLjztbpj := &EdbDataCalculateLjztbpj{
  477. EdbInfoId: edbInfoId,
  478. EdbCode: nowEdbInfo.EdbCode,
  479. DataTime: dataTime,
  480. Value: dataValue,
  481. Status: 1,
  482. CreateTime: time.Now(),
  483. ModifyTime: time.Now(),
  484. DataTimestamp: timestamp,
  485. }
  486. addDataList = append(addDataList, edbDataLjztbpj)
  487. }
  488. tmpAddDataList := make([]*EdbDataCalculateLjztbpj, 0)
  489. for _, v := range addDataList {
  490. tmpAddDataList = append(tmpAddDataList, v)
  491. if len(tmpAddDataList) >= 200 {
  492. _, tmpErr := o.InsertMulti(len(tmpAddDataList), tmpAddDataList)
  493. if tmpErr != nil {
  494. err = tmpErr
  495. return
  496. }
  497. //重新初始化需要加入的数据切片
  498. tmpAddDataList = make([]*EdbDataCalculateLjztbpj, 0)
  499. }
  500. }
  501. //最后如果还有需要新增的数据,那么就统一入库
  502. if len(tmpAddDataList) > 0 {
  503. _, tmpErr := o.InsertMulti(len(tmpAddDataList), tmpAddDataList)
  504. if tmpErr != nil {
  505. err = tmpErr
  506. return
  507. }
  508. }
  509. }
  510. //删除已经不存在的累计同比拼接指标数据(由于同比值当日的数据删除了)
  511. {
  512. if len(removeDateList) > 0 {
  513. removeDateStr := strings.Join(removeDateList, `","`)
  514. removeDateStr = `"` + removeDateStr + `"`
  515. //如果拼接指标变更了,那么需要删除所有的指标数据
  516. tableName := GetEdbDataTableName(nowEdbInfo.Source)
  517. sql = fmt.Sprintf(` DELETE FROM %s WHERE edb_info_id = ? and data_time in (%s) `, tableName, removeDateStr)
  518. _, err = o.Raw(sql, edbInfoId).Exec()
  519. if err != nil {
  520. err = errors.New("删除不存在的累计值同比拼接指标数据失败,Err:" + err.Error())
  521. return
  522. }
  523. }
  524. }
  525. //修改现有的数据中对应的值
  526. {
  527. tableName := GetEdbDataTableName(nowEdbInfo.Source)
  528. for edbDate, edbDataValue := range updateEdbDataMap {
  529. sql = fmt.Sprintf(` UPDATE %s set value = %f,modify_time=now() WHERE edb_info_id = ? and data_time = %s `, tableName, edbDataValue, edbDate)
  530. _, err = o.Raw(sql, edbInfoId).Exec()
  531. if err != nil {
  532. err = errors.New("更新现有的累计值同比拼接指标数据失败,Err:" + err.Error())
  533. return
  534. }
  535. }
  536. }
  537. //修改指标信息
  538. sql = ` UPDATE edb_info SET
  539. edb_name =?,
  540. edb_name_source=?,
  541. frequency = ?,
  542. unit = ?,
  543. classify_id = ?,
  544. calculate_formula=?,
  545. modify_time = NOW()
  546. WHERE edb_info_id = ? `
  547. _, err = o.Raw(sql, req.EdbName, req.EdbName, req.Frequency, req.Unit, req.ClassifyId, lastDateTime.Format(utils.FormatDate), edbInfoId).Exec()
  548. if err != nil {
  549. return
  550. }
  551. return
  552. }
  553. // RefreshAllCalculateLjztbpj 刷新所有 累计值同比拼接 数据
  554. func RefreshAllCalculateLjztbpj(edbInfo *EdbInfo) (err error) {
  555. o := orm.NewOrm()
  556. o.Using("data")
  557. o.Begin()
  558. defer func() {
  559. if err != nil {
  560. o.Rollback()
  561. } else {
  562. o.Commit()
  563. }
  564. }()
  565. //查询当前指标现有的数据
  566. var condition string
  567. var pars []interface{}
  568. condition += " AND edb_info_id=? "
  569. pars = append(pars, edbInfo.EdbInfoId)
  570. //所有的数据
  571. dataList, err := GetAllEdbDataCalculateLjztbpjByEdbInfoId(edbInfo.EdbInfoId)
  572. if err != nil {
  573. return err
  574. }
  575. //待拼接指标map
  576. pjDataMap := make(map[string]float64) //需要入库的数据
  577. nowEdbDataMap := make(map[string]float64) //当前指标的数据(已经在库里了,不需要重新)
  578. //拼接指标的日期切片数据
  579. pjEdbDataTimeList := make([]string, 0)
  580. dataMap := make(map[string]*EdbDataCalculateLjztbpj)
  581. for _, v := range dataList {
  582. pjEdbDataTimeList = append(pjEdbDataTimeList, v.DataTime)
  583. dataMap[v.DataTime] = v
  584. nowEdbDataMap[v.DataTime] = v.Value
  585. }
  586. //查询关联指标信息
  587. var existCondition string
  588. var existPars []interface{}
  589. existCondition += " AND edb_info_id=? "
  590. existPars = append(existPars, edbInfo.EdbInfoId)
  591. existList, err := GetEdbInfoCalculateListByCondition(existCondition, existPars)
  592. if err != nil {
  593. err = errors.New("判断指标是否改变失败,Err:" + err.Error())
  594. return
  595. }
  596. var existItemA, existItemB *EdbInfoCalculateMapping
  597. for _, existItem := range existList {
  598. if existItem.FromTag == "A" {
  599. existItemA = existItem
  600. } else if existItem.FromTag == "B" {
  601. existItemB = existItem
  602. }
  603. }
  604. // 原数据开始计算日期
  605. startCalculationDate, _ := time.ParseInLocation(utils.FormatDate, edbInfo.CalculateFormula, time.Local)
  606. //待拼接指标
  607. {
  608. var condition string
  609. var pars []interface{}
  610. condition += " AND data_time <= ? AND edb_info_id=? "
  611. pars = append(pars, startCalculationDate, existItemA.FromEdbInfoId)
  612. //第一个指标的数据列表
  613. firstDataList, tmpErr := GetEdbDataListAll(condition, pars, existItemA.FromSource, 0)
  614. if tmpErr != nil {
  615. return tmpErr
  616. }
  617. for _, v := range firstDataList {
  618. //时间戳
  619. if edbData, ok := dataMap[v.DataTime]; ok {
  620. if edbData.Value != v.Value {
  621. //更新指标数据
  622. edbData.Value = v.Value
  623. o.Update(edbData, "Value")
  624. //将新的数据存入已入库指标map里面,以便后续计算
  625. nowEdbDataMap[edbData.DataTime] = v.Value
  626. }
  627. }
  628. }
  629. }
  630. //同比值指标map
  631. tbzEdbDataMap := make(map[string]float64)
  632. //同比值日期切片列表
  633. tbzEdbDataTimeList := make([]string, 0)
  634. //同比值指标
  635. {
  636. var condition string
  637. var pars []interface{}
  638. condition += " AND data_time > ? AND edb_info_id = ? "
  639. pars = append(pars, startCalculationDate, existItemB.FromEdbInfoId)
  640. //第二个指标的数据列表
  641. secondDataList, tmpErr := GetEdbDataListAll(condition, pars, existItemB.FromSource, 0)
  642. if tmpErr != nil {
  643. return tmpErr
  644. }
  645. for _, v := range secondDataList {
  646. tbzEdbDataMap[v.DataTime] = v.Value
  647. tbzEdbDataTimeList = append(tbzEdbDataTimeList, v.DataTime)
  648. }
  649. }
  650. sort.Strings(tbzEdbDataTimeList)
  651. // 遍历现有的数据,判断拼接指标中是否存在该日期数据,如果拼接指标无此数据,那么需要删除该日期数据(日期的判断:需要在开始计算日期之后)
  652. removeDateList := make([]string, 0)
  653. for nowEdbDate := range nowEdbDataMap {
  654. nowEdbDateTime, _ := time.ParseInLocation(utils.FormatDate, nowEdbDate, time.Local)
  655. //校验日期 需要 大于 拼接前日期
  656. if startCalculationDate.Before(nowEdbDateTime) {
  657. if _, ok := tbzEdbDataMap[nowEdbDate]; !ok {
  658. // 同比指标中,不存在该日期数据,那么需要移除 现有数据 中该日期的数据
  659. removeDateList = append(removeDateList, nowEdbDate)
  660. }
  661. }
  662. }
  663. //待修改的指标数据map(index:日期,value:值)
  664. updateEdbDataMap := make(map[string]float64)
  665. for _, v := range tbzEdbDataTimeList {
  666. tbzDataTime, _ := time.ParseInLocation(utils.FormatDate, v, time.Local)
  667. //获取拼接指标上一年同一天的数据
  668. var pjDataTime time.Time
  669. if tbzDataTime.Month() == 2 {
  670. pjDataTime = tbzDataTime.AddDate(0, -11, 0)
  671. pjDataTime = time.Date(pjDataTime.Year(), pjDataTime.Month(), 1, 0, 0, 0, 0, time.Now().Location()).AddDate(0, 0, -1)
  672. } else {
  673. pjDataTime = tbzDataTime.AddDate(-1, 0, 0)
  674. }
  675. //校验现有数据中,是否存在该日期的数据,如果存在的话,那么就要去校验 最新计算数据 与 现有数据 是否一致
  676. if nowEdbDataValue, isHas := nowEdbDataMap[v]; isHas {
  677. //获取去年今日的数据,获取到后,然后是去修改该日期的数据
  678. if lastYearEdbDataValue, ok := nowEdbDataMap[pjDataTime.Format(utils.FormatDate)]; ok {
  679. if v == "2021-08-31" {
  680. fmt.Println("进来了")
  681. }
  682. tbzDataValue := tbzEdbDataMap[v] //同比值
  683. currValue := lastYearEdbDataValue * (1 + tbzDataValue/100)
  684. currValue, _ = decimal.NewFromFloat(currValue).Truncate(4).Float64() //保留4位小数
  685. //如果计算出来的值与库里面的值不匹配,那么就去修改该值
  686. if nowEdbDataValue != currValue {
  687. //将计算后的数据存入待拼接指标map里面,以便后续计算
  688. updateEdbDataMap[v] = currValue
  689. }
  690. }
  691. } else {
  692. //因为 现有数据中 不存在该日期数据,那么需要做新增数据处理
  693. //如果去年今日存在该数据,那么就去计算当前的数据
  694. if pjDataValue, ok := nowEdbDataMap[pjDataTime.Format(utils.FormatDate)]; ok {
  695. tbzDataValue := tbzEdbDataMap[v] //同比值
  696. currValue := pjDataValue * (1 + tbzDataValue/100)
  697. currValue, _ = decimal.NewFromFloat(currValue).Truncate(4).Float64()
  698. //将计算后的数据存入已入库指标map里面,以便后续计算
  699. nowEdbDataMap[v] = currValue
  700. //将计算后的数据存入待拼接指标map里面,以便后续入库
  701. pjDataMap[v] = currValue
  702. pjEdbDataTimeList = append(pjEdbDataTimeList, v)
  703. }
  704. }
  705. }
  706. //新增的数据入库
  707. {
  708. addDataList := make([]*EdbDataCalculateLjztbpj, 0)
  709. for dataTime, dataValue := range pjDataMap {
  710. //时间戳
  711. currentDate, _ := time.Parse(utils.FormatDate, dataTime)
  712. timestamp := currentDate.UnixNano() / 1e6
  713. edbDataLjztbpj := &EdbDataCalculateLjztbpj{
  714. EdbInfoId: edbInfo.EdbInfoId,
  715. EdbCode: edbInfo.EdbCode,
  716. DataTime: dataTime,
  717. Value: dataValue,
  718. Status: 1,
  719. CreateTime: time.Now(),
  720. ModifyTime: time.Now(),
  721. DataTimestamp: timestamp,
  722. }
  723. addDataList = append(addDataList, edbDataLjztbpj)
  724. }
  725. tmpAddDataList := make([]*EdbDataCalculateLjztbpj, 0)
  726. for _, v := range addDataList {
  727. tmpAddDataList = append(tmpAddDataList, v)
  728. if len(tmpAddDataList) >= 200 {
  729. _, tmpErr := o.InsertMulti(len(tmpAddDataList), tmpAddDataList)
  730. if tmpErr != nil {
  731. err = tmpErr
  732. return
  733. }
  734. //重新初始化需要加入的数据切片
  735. tmpAddDataList = make([]*EdbDataCalculateLjztbpj, 0)
  736. }
  737. }
  738. //最后如果还有需要新增的数据,那么就统一入库
  739. if len(tmpAddDataList) > 0 {
  740. _, tmpErr := o.InsertMulti(len(tmpAddDataList), tmpAddDataList)
  741. if tmpErr != nil {
  742. err = tmpErr
  743. return
  744. }
  745. }
  746. }
  747. //删除已经不存在的累计同比拼接指标数据(由于同比值当日的数据删除了)
  748. {
  749. if len(removeDateList) > 0 {
  750. removeDateStr := strings.Join(removeDateList, `","`)
  751. removeDateStr = `"` + removeDateStr + `"`
  752. //如果拼接指标变更了,那么需要删除所有的指标数据
  753. tableName := GetEdbDataTableName(edbInfo.Source)
  754. sql := fmt.Sprintf(` DELETE FROM %s WHERE edb_info_id = ? and data_time in (%s) `, tableName, removeDateStr)
  755. _, err = o.Raw(sql, edbInfo.EdbInfoId).Exec()
  756. if err != nil {
  757. err = errors.New("删除不存在的累计值同比拼接指标数据失败,Err:" + err.Error())
  758. return
  759. }
  760. }
  761. }
  762. //修改现有的数据中对应的值
  763. {
  764. tableName := GetEdbDataTableName(edbInfo.Source)
  765. for edbDate, edbDataValue := range updateEdbDataMap {
  766. sql := fmt.Sprintf(` UPDATE %s set value = ?,modify_time=now() WHERE edb_info_id = ? and data_time = ? `, tableName)
  767. _, err = o.Raw(sql, edbDataValue, edbInfo.EdbInfoId, edbDate).Exec()
  768. if err != nil {
  769. err = errors.New("更新现有的累计值同比拼接指标数据失败,Err:" + err.Error())
  770. return
  771. }
  772. }
  773. }
  774. return
  775. }