edb_info_calculate_tbz.go 33 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024
  1. package data_manage
  2. import (
  3. "errors"
  4. "fmt"
  5. "github.com/beego/beego/v2/client/orm"
  6. "github.com/shopspring/decimal"
  7. "hongze/hongze_chart_lib/utils"
  8. "strconv"
  9. "strings"
  10. "time"
  11. )
  12. type EdbInfoCalculateTbz struct {
  13. EdbInfoCalculateTbzId int `orm:"column(edb_info_calculate_tbz_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 AddCalculateTbz(req *EdbInfoCalculateBatchSaveReq, fromEdbInfo *EdbInfo, edbCode, uniqueCode string, sysUserId int, sysUserRealName string) (edbInfoId int, err error) {
  28. fmt.Println("AddCalculateTbz")
  29. o := orm.NewOrmUsingDB("data")
  30. o.Begin()
  31. defer func() {
  32. if err != nil {
  33. o.Rollback()
  34. } else {
  35. o.Commit()
  36. }
  37. }()
  38. if req.EdbInfoId <= 0 {
  39. edbInfo := new(EdbInfo)
  40. edbInfo.Source = utils.DATA_SOURCE_CALCULATE_TBZ
  41. edbInfo.SourceName = "同比值"
  42. edbInfo.EdbCode = edbCode
  43. edbInfo.EdbName = req.EdbName
  44. edbInfo.EdbNameSource = req.EdbName
  45. edbInfo.Frequency = req.Frequency
  46. edbInfo.Unit = req.Unit
  47. edbInfo.ClassifyId = req.ClassifyId
  48. edbInfo.SysUserId = sysUserId
  49. edbInfo.SysUserRealName = sysUserRealName
  50. edbInfo.CreateTime = time.Now()
  51. edbInfo.ModifyTime = time.Now()
  52. edbInfo.UniqueCode = uniqueCode
  53. edbInfo.CalculateFormula = req.Formula
  54. edbInfo.EdbType = 2
  55. newEdbInfoId, err := o.Insert(edbInfo)
  56. if err != nil {
  57. return edbInfoId, err
  58. }
  59. edbInfoId = int(newEdbInfoId)
  60. //calculateItem := new(EdbInfoCalculateTbz)
  61. //calculateItem.CreateTime = time.Now()
  62. //calculateItem.ModifyTime = time.Now()
  63. //calculateItem.Sort = 1
  64. //calculateItem.EdbCode = edbCode
  65. //calculateItem.EdbInfoId = edbInfoId
  66. //calculateItem.FromEdbInfoId = fromEdbInfo.EdbInfoId
  67. //calculateItem.FromEdbCode = fromEdbInfo.EdbCode
  68. //calculateItem.FromEdbName = fromEdbInfo.EdbName
  69. //calculateItem.FromSource = fromEdbInfo.Source
  70. //calculateItem.FromSourceName = fromEdbInfo.SourceName
  71. //
  72. //_, err = o.Insert(calculateItem)
  73. //if err != nil {
  74. // return edbInfoId, err
  75. //}
  76. //关联关系
  77. {
  78. calculateMappingItem := new(EdbInfoCalculateMapping)
  79. calculateMappingItem.CreateTime = time.Now()
  80. calculateMappingItem.ModifyTime = time.Now()
  81. calculateMappingItem.Sort = 1
  82. calculateMappingItem.EdbCode = edbCode
  83. calculateMappingItem.EdbInfoId = edbInfoId
  84. calculateMappingItem.FromEdbInfoId = fromEdbInfo.EdbInfoId
  85. calculateMappingItem.FromEdbCode = fromEdbInfo.EdbCode
  86. calculateMappingItem.FromEdbName = fromEdbInfo.EdbName
  87. calculateMappingItem.FromSource = fromEdbInfo.Source
  88. calculateMappingItem.FromSourceName = fromEdbInfo.SourceName
  89. calculateMappingItem.FromTag = ""
  90. calculateMappingItem.Source = edbInfo.Source
  91. calculateMappingItem.SourceName = edbInfo.SourceName
  92. go o.Insert(calculateMappingItem)
  93. }
  94. } else {
  95. edbInfoId = req.EdbInfoId
  96. dataTableName := GetEdbDataTableName(utils.DATA_SOURCE_CALCULATE_TBZ)
  97. deleteSql := ` DELETE FROM %s WHERE edb_info_id=? `
  98. deleteSql = fmt.Sprintf(deleteSql, dataTableName)
  99. _, err = o.Raw(deleteSql, req.EdbInfoId).Exec()
  100. }
  101. edbInfoIdStr := strconv.Itoa(edbInfoId)
  102. //计算数据
  103. var condition string
  104. var pars []interface{}
  105. condition += " AND edb_info_id=? "
  106. if req.EdbInfoId <= 0 {
  107. pars = append(pars, req.FromEdbInfoId)
  108. } else {
  109. pars = append(pars, fromEdbInfo.EdbInfoId)
  110. }
  111. dataList, err := GetEdbDataListAll(condition, pars, fromEdbInfo.Source, 0)
  112. if err != nil {
  113. return edbInfoId, err
  114. }
  115. var dateArr []string
  116. dataMap := make(map[string]*EdbInfoSearchData)
  117. for _, v := range dataList {
  118. dateArr = append(dateArr, v.DataTime)
  119. dataMap[v.DataTime] = v
  120. }
  121. addSql := ` INSERT INTO edb_data_calculate_tbz(edb_info_id,edb_code,data_time,value,create_time,modify_time,status,data_timestamp) values `
  122. var isAdd bool
  123. existMap := make(map[string]string)
  124. for _, av := range dateArr {
  125. //fmt.Println(ak, av)
  126. currentItem := dataMap[av]
  127. if currentItem != nil {
  128. //当前日期
  129. currentDate, err := time.Parse(utils.FormatDate, av)
  130. if err != nil {
  131. return edbInfoId, err
  132. }
  133. //上一年的日期
  134. preDate := currentDate.AddDate(-1, 0, 0)
  135. preDateStr := preDate.Format(utils.FormatDate)
  136. if findItem, ok := dataMap[preDateStr]; ok { //上一年同期找到
  137. //dataTime, _ := time.Parse(utils.FormatDate, date)
  138. if _, ok := existMap[edbCode+av]; !ok {
  139. timestamp := currentDate.UnixNano() / 1e6
  140. timestampStr := fmt.Sprintf("%d", timestamp)
  141. val := TbzDiv(currentItem.Value, findItem.Value)
  142. addSql += GetAddSql(edbInfoIdStr, edbCode, av, timestampStr, val)
  143. isAdd = true
  144. utils.FileLog.Info("同期找到:" + av + ";" + preDateStr)
  145. }
  146. existMap[edbCode+av] = av
  147. } else {
  148. if fromEdbInfo.Frequency == "月度" { //向上和向下,各找一个月
  149. nextDateDay := preDate
  150. preDateDay := preDate
  151. for i := 0; i <= 35; i++ {
  152. nextDateDayStr := nextDateDay.Format(utils.FormatDate)
  153. if findItem, ok := dataMap[nextDateDayStr]; ok { //上一年同期->下一个月找到
  154. if _, ok := existMap[edbCode+av]; !ok {
  155. timestamp := currentDate.UnixNano() / 1e6
  156. timestampStr := fmt.Sprintf("%d", timestamp)
  157. val := TbzDiv(currentItem.Value, findItem.Value)
  158. addSql += GetAddSql(edbInfoIdStr, edbCode, av, timestampStr, val)
  159. isAdd = true
  160. }
  161. existMap[edbCode+av] = av
  162. break
  163. } else {
  164. preDateDayStr := preDateDay.Format(utils.FormatDate)
  165. if findItem, ok := dataMap[preDateDayStr]; ok { //上一年同期->上一个月找到
  166. if _, ok := existMap[edbCode+av]; !ok {
  167. timestamp := currentDate.UnixNano() / 1e6
  168. timestampStr := fmt.Sprintf("%d", timestamp)
  169. val := TbzDiv(currentItem.Value, findItem.Value)
  170. addSql += GetAddSql(edbInfoIdStr, edbCode, av, timestampStr, val)
  171. isAdd = true
  172. }
  173. existMap[edbCode+av] = av
  174. break
  175. }
  176. }
  177. nextDateDay = nextDateDay.AddDate(0, 0, 1)
  178. preDateDay = preDateDay.AddDate(0, 0, -1)
  179. }
  180. } else if fromEdbInfo.Frequency == "季度" || fromEdbInfo.Frequency == "年度" {
  181. if findItem, ok := dataMap[preDateStr]; ok { //上一年同期->下一个月找到
  182. if _, ok := existMap[edbCode+av]; !ok {
  183. timestamp := currentDate.UnixNano() / 1e6
  184. timestampStr := fmt.Sprintf("%d", timestamp)
  185. val := TbzDiv(currentItem.Value, findItem.Value)
  186. addSql += GetAddSql(edbInfoIdStr, edbCode, av, timestampStr, val)
  187. isAdd = true
  188. }
  189. existMap[edbCode+av] = av
  190. break
  191. }
  192. } else {
  193. nextDateDay := preDate
  194. preDateDay := preDate
  195. for i := 0; i < 35; i++ {
  196. nextDateDayStr := nextDateDay.Format(utils.FormatDate)
  197. if findItem, ok := dataMap[nextDateDayStr]; ok { //上一年同期->下一个月找到
  198. if _, ok := existMap[edbCode+av]; !ok {
  199. timestamp := currentDate.UnixNano() / 1e6
  200. timestampStr := fmt.Sprintf("%d", timestamp)
  201. val := TbzDiv(currentItem.Value, findItem.Value)
  202. addSql += GetAddSql(edbInfoIdStr, edbCode, av, timestampStr, val)
  203. isAdd = true
  204. }
  205. existMap[edbCode+av] = av
  206. break
  207. } else {
  208. preDateDayStr := preDateDay.Format(utils.FormatDate)
  209. if findItem, ok := dataMap[preDateDayStr]; ok { //上一年同期->上一个月找到
  210. if _, ok := existMap[edbCode+av]; !ok {
  211. timestamp := currentDate.UnixNano() / 1e6
  212. timestampStr := fmt.Sprintf("%d", timestamp)
  213. val := TbzDiv(currentItem.Value, findItem.Value)
  214. addSql += GetAddSql(edbInfoIdStr, edbCode, av, timestampStr, val)
  215. isAdd = true
  216. }
  217. existMap[edbCode+av] = av
  218. break
  219. } else {
  220. //fmt.Println("pre not find:", preDateStr, "i:", i)
  221. }
  222. }
  223. nextDateDay = nextDateDay.AddDate(0, 0, 1)
  224. preDateDay = preDateDay.AddDate(0, 0, -1)
  225. }
  226. }
  227. }
  228. }
  229. }
  230. if isAdd {
  231. addSql = strings.TrimRight(addSql, ",")
  232. _, err = o.Raw(addSql).Exec()
  233. if err != nil {
  234. return edbInfoId, err
  235. }
  236. }
  237. return
  238. }
  239. func GetAddSql(edbInfoId, edbCode, dataTime, timestampStr string, value string) (addSql string) {
  240. nowStr := time.Now().Format(utils.FormatDateTime)
  241. addSql += "("
  242. addSql += edbInfoId + "," + "'" + edbCode + "'" + "," + "'" + dataTime + "'" + "," + value + "," + "'" + nowStr + "'" +
  243. "," + "'" + nowStr + "'" + "," + "1"
  244. addSql += "," + "'" + timestampStr + "'"
  245. addSql += "),"
  246. return
  247. }
  248. func TbzDiv(a, b float64) string {
  249. var valStr string
  250. if b != 0 {
  251. af := decimal.NewFromFloat(float64(a))
  252. bf := decimal.NewFromFloat(float64(b))
  253. val, _ := af.Div(bf).Float64()
  254. val = val - 1
  255. valStr = utils.SubFloatToString(val, 4)
  256. } else {
  257. valStr = "0"
  258. }
  259. return valStr
  260. }
  261. //同比值
  262. func EditCalculateTbz(req *EdbInfoCalculateBatchEditReq, fromEdbInfo *EdbInfo, edbCode string) (edbInfoId int, err error) {
  263. edbInfoId = req.EdbInfoId
  264. o := orm.NewOrmUsingDB("data")
  265. o.Begin()
  266. defer func() {
  267. if err != nil {
  268. o.Rollback()
  269. } else {
  270. o.Commit()
  271. }
  272. }()
  273. //修改指标信息
  274. sql := ` UPDATE edb_info
  275. SET
  276. edb_name =?,
  277. edb_name_source=?,
  278. frequency = ?,
  279. unit = ?,
  280. classify_id = ?,
  281. modify_time = NOW()
  282. WHERE edb_info_id = ? `
  283. _, err = o.Raw(sql, req.EdbName, req.EdbName, req.Frequency, req.Unit, req.ClassifyId, edbInfoId).Exec()
  284. if err != nil {
  285. return
  286. }
  287. var existCondition string
  288. var existPars []interface{}
  289. existCondition += " AND edb_info_id=? "
  290. existPars = append(existPars, edbInfoId)
  291. existCondition += " AND from_edb_info_id=? "
  292. existPars = append(existPars, req.FromEdbInfoId)
  293. //判断计算指标是否被更换
  294. count, err := GetEdbInfoCalculateCountByCondition(req.Source, existCondition, existPars)
  295. if err != nil {
  296. err = errors.New("判断指标是否改变失败,Err:" + err.Error())
  297. return
  298. }
  299. if count <= 0 {
  300. //删除指标关联计算指标
  301. //sql := ` DELETE FROM edb_info_calculate_tbz WHERE edb_info_id = ? `
  302. //_, err = o.Raw(sql, edbInfoId).Exec()
  303. //if err != nil {
  304. // return
  305. //}
  306. //
  307. //calculateItem := new(EdbInfoCalculateTbz)
  308. //calculateItem.CreateTime = time.Now()
  309. //calculateItem.ModifyTime = time.Now()
  310. //calculateItem.Sort = 1
  311. //calculateItem.EdbCode = edbCode
  312. //calculateItem.EdbInfoId = edbInfoId
  313. //calculateItem.FromEdbInfoId = fromEdbInfo.EdbInfoId
  314. //calculateItem.FromEdbCode = fromEdbInfo.EdbCode
  315. //calculateItem.FromEdbName = fromEdbInfo.EdbName
  316. //calculateItem.FromSource = fromEdbInfo.Source
  317. //calculateItem.FromSourceName = fromEdbInfo.SourceName
  318. //
  319. //_, err = o.Insert(calculateItem)
  320. //if err != nil {
  321. // return
  322. //}
  323. //删除,计算指标关联的,基础指标的关联关系
  324. sql = ` DELETE FROM edb_info_calculate_mapping WHERE edb_info_id = ? `
  325. _, err = o.Raw(sql, edbInfoId).Exec()
  326. if err != nil {
  327. return edbInfoId, err
  328. }
  329. //清空原有数据
  330. sql = ` DELETE FROM edb_data_calculate_tbz WHERE edb_info_id = ? `
  331. _, err = o.Raw(sql, edbInfoId).Exec()
  332. if err != nil {
  333. return edbInfoId, err
  334. }
  335. //关联关系
  336. {
  337. calculateMappingItem := new(EdbInfoCalculateMapping)
  338. calculateMappingItem.CreateTime = time.Now()
  339. calculateMappingItem.ModifyTime = time.Now()
  340. calculateMappingItem.Sort = 1
  341. calculateMappingItem.EdbCode = edbCode
  342. calculateMappingItem.EdbInfoId = edbInfoId
  343. calculateMappingItem.FromEdbInfoId = fromEdbInfo.EdbInfoId
  344. calculateMappingItem.FromEdbCode = fromEdbInfo.EdbCode
  345. calculateMappingItem.FromEdbName = fromEdbInfo.EdbName
  346. calculateMappingItem.FromSource = fromEdbInfo.Source
  347. calculateMappingItem.FromSourceName = fromEdbInfo.SourceName
  348. calculateMappingItem.FromTag = ""
  349. calculateMappingItem.Source = utils.DATA_SOURCE_CALCULATE_TBZ
  350. calculateMappingItem.SourceName = "同比值"
  351. o.Insert(calculateMappingItem)
  352. }
  353. edbInfoIdStr := strconv.Itoa(edbInfoId)
  354. //计算数据
  355. var condition string
  356. var pars []interface{}
  357. condition += " AND edb_info_id=? "
  358. pars = append(pars, req.FromEdbInfoId)
  359. fmt.Println("EdbInfoId:", req.FromEdbInfoId)
  360. dataList, err := GetEdbDataListAll(condition, pars, fromEdbInfo.Source, 0)
  361. if err != nil {
  362. return edbInfoId, err
  363. }
  364. var dateArr []string
  365. dataMap := make(map[string]*EdbInfoSearchData)
  366. for _, v := range dataList {
  367. dateArr = append(dateArr, v.DataTime)
  368. dataMap[v.DataTime] = v
  369. }
  370. addSql := ` INSERT INTO edb_data_calculate_tbz(edb_info_id,edb_code,data_time,value,create_time,modify_time,status,data_timestamp) values `
  371. var isAdd bool
  372. for _, av := range dateArr {
  373. currentItem := dataMap[av]
  374. if currentItem != nil {
  375. //当前日期
  376. currentDate, err := time.Parse(utils.FormatDate, av)
  377. if err != nil {
  378. return edbInfoId, err
  379. }
  380. //上一年的日期
  381. preDate := currentDate.AddDate(-1, 0, 0)
  382. preDateStr := preDate.Format(utils.FormatDate)
  383. if findItem, ok := dataMap[preDateStr]; ok { //上一年同期找到
  384. //dataTime, _ := time.Parse(utils.FormatDate, date)
  385. timestamp := currentDate.UnixNano() / 1e6
  386. timestampStr := fmt.Sprintf("%d", timestamp)
  387. val := TbzDiv(currentItem.Value, findItem.Value)
  388. addSql += GetAddSql(edbInfoIdStr, edbCode, av, timestampStr, val)
  389. isAdd = true
  390. utils.FileLog.Info("同期找到:" + av + ";" + preDateStr)
  391. continue
  392. } else {
  393. if fromEdbInfo.Frequency == "月度" { //向上和向下,各找一个月
  394. nextDateDay := preDate.AddDate(0, 1, 0)
  395. nextDateDayStr := nextDateDay.Format(utils.FormatDate)
  396. preDateDay := preDate.AddDate(0, -1, 0)
  397. preDateDayStr := preDateDay.Format(utils.FormatDate)
  398. for i := 0; i <= 6; i++ {
  399. if i >= 1 {
  400. nextDateDay = nextDateDay.AddDate(0, 0, i)
  401. nextDateDayStr = nextDateDay.Format(utils.FormatDate)
  402. }
  403. if findItem, ok := dataMap[nextDateDayStr]; ok { //上一年同期->下一个月找到
  404. timestamp := currentDate.UnixNano() / 1e6
  405. timestampStr := fmt.Sprintf("%d", timestamp)
  406. val := TbzDiv(currentItem.Value, findItem.Value)
  407. addSql += GetAddSql(edbInfoIdStr, edbCode, av, timestampStr, val)
  408. isAdd = true
  409. break
  410. } else {
  411. if i >= 1 {
  412. preDateDay = preDate.AddDate(0, 0, -i)
  413. preDateDayStr = nextDateDay.Format(utils.FormatDate)
  414. }
  415. if findItem, ok := dataMap[preDateDayStr]; ok { //上一年同期->上一个月找到
  416. timestamp := currentDate.UnixNano() / 1e6
  417. timestampStr := fmt.Sprintf("%d", timestamp)
  418. val := TbzDiv(currentItem.Value, findItem.Value)
  419. addSql += GetAddSql(edbInfoIdStr, edbCode, av, timestampStr, val)
  420. isAdd = true
  421. }
  422. break
  423. }
  424. }
  425. } else if fromEdbInfo.Frequency == "季度" || fromEdbInfo.Frequency == "年度" {
  426. if findItem, ok := dataMap[preDateStr]; ok { //上一年同期->下一个月找到
  427. timestamp := currentDate.UnixNano() / 1e6
  428. timestampStr := fmt.Sprintf("%d", timestamp)
  429. val := TbzDiv(currentItem.Value, findItem.Value)
  430. addSql += GetAddSql(edbInfoIdStr, edbCode, av, timestampStr, val)
  431. isAdd = true
  432. break
  433. }
  434. } else {
  435. nextDateDay := preDate.AddDate(0, 0, 1)
  436. nextDateDayStr := nextDateDay.Format(utils.FormatDate)
  437. preDateDay := preDate.AddDate(0, 0, -1)
  438. preDateDayStr := preDateDay.Format(utils.FormatDate)
  439. for i := 0; i < 35; i++ {
  440. if i >= 1 {
  441. nextDateDay = nextDateDay.AddDate(0, 0, i)
  442. nextDateDayStr = nextDateDay.Format(utils.FormatDate)
  443. }
  444. if findItem, ok := dataMap[nextDateDayStr]; ok { //上一年同期->下一个月找到
  445. timestamp := currentDate.UnixNano() / 1e6
  446. timestampStr := fmt.Sprintf("%d", timestamp)
  447. val := TbzDiv(currentItem.Value, findItem.Value)
  448. addSql += GetAddSql(edbInfoIdStr, edbCode, av, timestampStr, val)
  449. isAdd = true
  450. break
  451. } else {
  452. if i >= 1 {
  453. preDateDay = preDate.AddDate(0, 0, -i)
  454. preDateDayStr = nextDateDay.Format(utils.FormatDate)
  455. }
  456. if findItem, ok := dataMap[preDateDayStr]; ok { //上一年同期->上一个月找到
  457. timestamp := currentDate.UnixNano() / 1e6
  458. timestampStr := fmt.Sprintf("%d", timestamp)
  459. val := TbzDiv(currentItem.Value, findItem.Value)
  460. addSql += GetAddSql(edbInfoIdStr, edbCode, av, timestampStr, val)
  461. isAdd = true
  462. }
  463. break
  464. }
  465. }
  466. }
  467. }
  468. }
  469. }
  470. if isAdd {
  471. addSql = strings.TrimRight(addSql, ",")
  472. _, err = o.Raw(addSql).Exec()
  473. if err != nil {
  474. return edbInfoId, err
  475. }
  476. }
  477. }
  478. return
  479. }
  480. //刷新同比值数据
  481. func RefreshCalculateTbz(edbInfoId int, fromEdbInfo *EdbInfo, edbCode, startDate, endDate string) (err error) {
  482. o := orm.NewOrmUsingDB("data")
  483. o.Begin()
  484. defer func() {
  485. if err != nil {
  486. o.Rollback()
  487. } else {
  488. o.Commit()
  489. }
  490. }()
  491. if err != nil {
  492. return
  493. }
  494. edbInfoIdStr := strconv.Itoa(edbInfoId)
  495. //计算数据
  496. //计算数据
  497. var condition string
  498. var pars []interface{}
  499. condition += " AND edb_info_id=? "
  500. pars = append(pars, fromEdbInfo.EdbInfoId)
  501. if startDate != "" {
  502. condition += " AND data_time>=? "
  503. pars = append(pars, startDate)
  504. }
  505. if endDate != "" {
  506. condition += " AND data_time<=? "
  507. pars = append(pars, endDate)
  508. }
  509. dataList, err := GetEdbDataListAll(condition, pars, fromEdbInfo.Source, 0)
  510. if err != nil {
  511. return err
  512. }
  513. var dateArr []string
  514. dataMap := make(map[string]*EdbInfoSearchData)
  515. for _, v := range dataList {
  516. dateArr = append(dateArr, v.DataTime)
  517. dataMap[v.DataTime] = v
  518. }
  519. addSql := ` INSERT INTO edb_data_calculate_tbz(edb_info_id,edb_code,data_time,value,create_time,modify_time,status,data_timestamp) values `
  520. var isAdd bool
  521. for _, av := range dateArr {
  522. currentItem := dataMap[av]
  523. if currentItem != nil {
  524. //当前日期
  525. currentDate, err := time.Parse(utils.FormatDate, av)
  526. if err != nil {
  527. return err
  528. }
  529. //上一年的日期
  530. preDate := currentDate.AddDate(-1, 0, 0)
  531. preDateStr := preDate.Format(utils.FormatDate)
  532. if findItem, ok := dataMap[preDateStr]; ok { //上一年同期找到
  533. //dataTime, _ := time.Parse(utils.FormatDate, date)
  534. timestamp := currentDate.UnixNano() / 1e6
  535. timestampStr := fmt.Sprintf("%d", timestamp)
  536. val := TbzDiv(currentItem.Value, findItem.Value)
  537. count, err := GetEdbDataCalculateTbzByCodeAndDate(edbCode, av)
  538. if err != nil && err.Error() != utils.ErrNoRow() {
  539. return err
  540. }
  541. if count <= 0 {
  542. addSql += GetAddSql(edbInfoIdStr, edbCode, av, timestampStr, val)
  543. isAdd = true
  544. } else {
  545. err = ModifyEdbDataCalculateTbz(int64(edbInfoId), av, val)
  546. if err != nil {
  547. return err
  548. }
  549. }
  550. utils.FileLog.Info("同期找到:" + av + ";" + preDateStr)
  551. continue
  552. } else {
  553. if fromEdbInfo.Frequency == "月度" { //向上和向下,各找一个月
  554. for i := 0; i <= 35; i++ {
  555. nextDateDay := preDate.AddDate(0, 0, i)
  556. nextDateDayStr := nextDateDay.Format(utils.FormatDate)
  557. if findItem, ok := dataMap[nextDateDayStr]; ok { //上一年同期->下一个月找到
  558. timestamp := currentDate.UnixNano() / 1e6
  559. timestampStr := fmt.Sprintf("%d", timestamp)
  560. fmt.Println(currentItem.Value, findItem.Value)
  561. val := TbzDiv(currentItem.Value, findItem.Value)
  562. count, err := GetEdbDataCalculateTbzByCodeAndDate(edbCode, av)
  563. if err != nil && err.Error() != utils.ErrNoRow() {
  564. return err
  565. }
  566. if count <= 0 {
  567. addSql += GetAddSql(edbInfoIdStr, edbCode, av, timestampStr, val)
  568. isAdd = true
  569. } else {
  570. err = ModifyEdbDataCalculateTbz(int64(edbInfoId), av, val)
  571. if err != nil {
  572. return err
  573. }
  574. }
  575. break
  576. } else {
  577. preDateDay := preDate.AddDate(0, 0, -i)
  578. preDateDayStr := preDateDay.Format(utils.FormatDate)
  579. if findItem, ok := dataMap[preDateDayStr]; ok { //上一年同期->上一个月找到
  580. timestamp := currentDate.UnixNano() / 1e6
  581. timestampStr := fmt.Sprintf("%d", timestamp)
  582. val := TbzDiv(currentItem.Value, findItem.Value)
  583. count, err := GetEdbDataCalculateTbzByCodeAndDate(edbCode, av)
  584. if err != nil && err.Error() != utils.ErrNoRow() {
  585. return err
  586. }
  587. if count <= 0 {
  588. addSql += GetAddSql(edbInfoIdStr, edbCode, av, timestampStr, val)
  589. isAdd = true
  590. } else {
  591. err = ModifyEdbDataCalculateTbz(int64(edbInfoId), av, val)
  592. if err != nil {
  593. return err
  594. }
  595. }
  596. break
  597. }
  598. }
  599. }
  600. } else if fromEdbInfo.Frequency == "季度" || fromEdbInfo.Frequency == "年度" {
  601. if findItem, ok := dataMap[preDateStr]; ok { //上一年同期->下一个月找到
  602. timestamp := currentDate.UnixNano() / 1e6
  603. timestampStr := fmt.Sprintf("%d", timestamp)
  604. val := TbzDiv(currentItem.Value, findItem.Value)
  605. count, err := GetEdbDataCalculateTbzByCodeAndDate(edbCode, av)
  606. if err != nil && err.Error() != utils.ErrNoRow() {
  607. return err
  608. }
  609. if count <= 0 {
  610. addSql += GetAddSql(edbInfoIdStr, edbCode, av, timestampStr, val)
  611. isAdd = true
  612. } else {
  613. err = ModifyEdbDataCalculateTbz(int64(edbInfoId), av, val)
  614. if err != nil {
  615. return err
  616. }
  617. }
  618. break
  619. }
  620. } else {
  621. nextDateDay := preDate.AddDate(0, 0, 1)
  622. nextDateDayStr := nextDateDay.Format(utils.FormatDate)
  623. preDateDay := preDate.AddDate(0, 0, -1)
  624. preDateDayStr := preDateDay.Format(utils.FormatDate)
  625. for i := 0; i < 35; i++ {
  626. if i >= 1 {
  627. nextDateDay = nextDateDay.AddDate(0, 0, i)
  628. nextDateDayStr = nextDateDay.Format(utils.FormatDate)
  629. }
  630. if findItem, ok := dataMap[nextDateDayStr]; ok { //上一年同期->下一个月找到
  631. timestamp := currentDate.UnixNano() / 1e6
  632. timestampStr := fmt.Sprintf("%d", timestamp)
  633. val := TbzDiv(currentItem.Value, findItem.Value)
  634. count, err := GetEdbDataCalculateTbzByCodeAndDate(edbCode, av)
  635. if err != nil && err.Error() != utils.ErrNoRow() {
  636. return err
  637. }
  638. if count <= 0 {
  639. addSql += GetAddSql(edbInfoIdStr, edbCode, av, timestampStr, val)
  640. isAdd = true
  641. } else {
  642. err = ModifyEdbDataCalculateTbz(int64(edbInfoId), av, val)
  643. if err != nil {
  644. return err
  645. }
  646. }
  647. break
  648. } else {
  649. if i >= 1 {
  650. preDateDay = preDate.AddDate(0, 0, -i)
  651. preDateDayStr = nextDateDay.Format(utils.FormatDate)
  652. }
  653. if findItem, ok := dataMap[preDateDayStr]; ok { //上一年同期->上一个月找到
  654. timestamp := currentDate.UnixNano() / 1e6
  655. timestampStr := fmt.Sprintf("%d", timestamp)
  656. val := TbzDiv(currentItem.Value, findItem.Value)
  657. count, err := GetEdbDataCalculateTbzByCodeAndDate(edbCode, av)
  658. if err != nil && err.Error() != utils.ErrNoRow() {
  659. return err
  660. }
  661. if count <= 0 {
  662. addSql += GetAddSql(edbInfoIdStr, edbCode, av, timestampStr, val)
  663. isAdd = true
  664. } else {
  665. err = ModifyEdbDataCalculateTbz(int64(edbInfoId), av, val)
  666. if err != nil {
  667. return err
  668. }
  669. }
  670. }
  671. break
  672. }
  673. }
  674. }
  675. }
  676. }
  677. }
  678. if isAdd {
  679. addSql = strings.TrimRight(addSql, ",")
  680. _, err = o.Raw(addSql).Exec()
  681. if err != nil {
  682. return err
  683. }
  684. }
  685. return
  686. }
  687. type EdbInfoCalculateTbzDetail struct {
  688. EdbInfoCalculateTbzId int `orm:"column(edb_info_calculate_tbz_id);pk"`
  689. EdbInfoId int `description:"指标id"`
  690. EdbCode string `description:"指标编码"`
  691. FromEdbInfoId int `description:"计算指标id"`
  692. FromEdbCode string `description:"计算指标编码"`
  693. FromEdbName string `description:"计算指标名称"`
  694. FromSource int `description:"计算指标来源"`
  695. FromSourceName string `description:"计算指标来源名称"`
  696. FromTag string `description:"来源指标标签"`
  697. Sort int `description:"计算指标名称排序"`
  698. CreateTime time.Time `description:"创建时间"`
  699. ModifyTime time.Time `description:"修改时间"`
  700. StartDate string `description:"开始日期"`
  701. EndDate string `description:"结束日期"`
  702. }
  703. func GetEdbInfoCalculateTbzDetail(edbInfoId int) (item *EdbInfoCalculateTbzDetail, err error) {
  704. o := orm.NewOrmUsingDB("data")
  705. sql := ` SELECT a.*,b.start_date,b.end_date FROM edb_info_calculate_mapping AS a
  706. INNER JOIN edb_info AS b ON a.from_edb_info_id=b.edb_info_id
  707. WHERE a.edb_info_id=? `
  708. err = o.Raw(sql, edbInfoId).QueryRow(&item)
  709. return
  710. }
  711. func GetEdbDataCalculateTbzByCodeAndDate(edbCode string, startDate string) (count int, err error) {
  712. o := orm.NewOrmUsingDB("data")
  713. sql := ` SELECT COUNT(1) AS count FROM edb_data_calculate_tbz WHERE edb_code=? AND data_time=? `
  714. err = o.Raw(sql, edbCode, startDate).QueryRow(&count)
  715. return
  716. }
  717. func ModifyEdbDataCalculateTbz(edbInfoId int64, dataTime, value string) (err error) {
  718. o := orm.NewOrmUsingDB("data")
  719. sql := ` UPDATE edb_data_calculate_tbz SET value=?,modify_time=NOW() WHERE edb_info_id=? AND data_time=? `
  720. _, err = o.Raw(sql, value, edbInfoId, dataTime).Exec()
  721. return
  722. }
  723. //刷新所有同比值数据
  724. func RefreshAllCalculateTbz(edbInfoId, source int, fromEdbInfo *EdbInfo, edbCode, startDate, endDate string) (err error) {
  725. o := orm.NewOrmUsingDB("data")
  726. o.Begin()
  727. defer func() {
  728. if err != nil {
  729. o.Rollback()
  730. } else {
  731. o.Commit()
  732. }
  733. }()
  734. if err != nil {
  735. return
  736. }
  737. edbInfoIdStr := strconv.Itoa(edbInfoId)
  738. //计算数据
  739. //计算数据
  740. var condition string
  741. var pars []interface{}
  742. condition += " AND edb_info_id=? "
  743. pars = append(pars, fromEdbInfo.EdbInfoId)
  744. if startDate != "" {
  745. condition += " AND data_time>=? "
  746. pars = append(pars, startDate)
  747. }
  748. if endDate != "" {
  749. condition += " AND data_time<=? "
  750. pars = append(pars, endDate)
  751. }
  752. dataList, err := GetEdbDataListAll(condition, pars, fromEdbInfo.Source, 0)
  753. if err != nil {
  754. return err
  755. }
  756. var dateArr []string
  757. dataMap := make(map[string]*EdbInfoSearchData)
  758. for _, v := range dataList {
  759. dateArr = append(dateArr, v.DataTime)
  760. dataMap[v.DataTime] = v
  761. }
  762. fmt.Println("source:", source)
  763. //获取指标所有数据
  764. existDataList := make([]*EdbDataBase, 0)
  765. dataTableName := GetEdbDataTableName(source)
  766. fmt.Println("dataTableName:", dataTableName)
  767. sql := `SELECT * FROM %s WHERE edb_info_id=? `
  768. sql = fmt.Sprintf(sql, dataTableName)
  769. _, err = o.Raw(sql, edbInfoId).QueryRows(&existDataList)
  770. if err != nil {
  771. return err
  772. }
  773. existDataMap := make(map[string]string)
  774. for _, v := range existDataList {
  775. existDataMap[v.DataTime] = v.Value
  776. }
  777. fmt.Println("existDataMap:", existDataMap)
  778. addSql := ` INSERT INTO edb_data_calculate_tbz(edb_info_id,edb_code,data_time,value,create_time,modify_time,status,data_timestamp) values `
  779. var isAdd bool
  780. existAddDataMap := make(map[string]string)
  781. for _, av := range dateArr {
  782. currentItem := dataMap[av]
  783. if currentItem != nil {
  784. //当前日期
  785. currentDate, err := time.Parse(utils.FormatDate, av)
  786. if err != nil {
  787. return err
  788. }
  789. //上一年的日期
  790. preDate := currentDate.AddDate(-1, 0, 0)
  791. preDateStr := preDate.Format(utils.FormatDate)
  792. if findItem, ok := dataMap[preDateStr]; ok { //上一年同期找到
  793. //dataTime, _ := time.Parse(utils.FormatDate, date)
  794. timestamp := currentDate.UnixNano() / 1e6
  795. timestampStr := fmt.Sprintf("%d", timestamp)
  796. val := TbzDiv(currentItem.Value, findItem.Value)
  797. if existVal, ok := existDataMap[av]; !ok {
  798. if _, existOk := existAddDataMap[av]; !existOk {
  799. addSql += GetAddSql(edbInfoIdStr, edbCode, av, timestampStr, val)
  800. isAdd = true
  801. }
  802. existAddDataMap[av] = av
  803. } else {
  804. if existVal != val {
  805. sql := ` UPDATE %s SET value=?,modify_time=NOW() WHERE edb_info_id=? AND data_time=? `
  806. sql = fmt.Sprintf(sql, dataTableName)
  807. _, err = o.Raw(sql, val, edbInfoId, av).Exec()
  808. if err != nil {
  809. return err
  810. }
  811. }
  812. }
  813. continue
  814. } else {
  815. if fromEdbInfo.Frequency == "月度" { //向上和向下,各找一个月
  816. for i := 0; i <= 35; i++ {
  817. nextDateDay := preDate.AddDate(0, 0, i)
  818. nextDateDayStr := nextDateDay.Format(utils.FormatDate)
  819. if findItem, ok := dataMap[nextDateDayStr]; ok { //上一年同期->下一个月找到
  820. timestamp := currentDate.UnixNano() / 1e6
  821. timestampStr := fmt.Sprintf("%d", timestamp)
  822. val := TbzDiv(currentItem.Value, findItem.Value)
  823. if existVal, ok := existDataMap[av]; !ok {
  824. if _, existOk := existAddDataMap[av]; !existOk {
  825. addSql += GetAddSql(edbInfoIdStr, edbCode, av, timestampStr, val)
  826. isAdd = true
  827. }
  828. existAddDataMap[av] = av
  829. } else {
  830. if existVal != val {
  831. sql := ` UPDATE %s SET value=?,modify_time=NOW() WHERE edb_info_id=? AND data_time=? `
  832. sql = fmt.Sprintf(sql, dataTableName)
  833. _, err = o.Raw(sql, val, edbInfoId, av).Exec()
  834. if err != nil {
  835. return err
  836. }
  837. }
  838. }
  839. break
  840. } else {
  841. preDateDay := preDate.AddDate(0, 0, -i)
  842. preDateDayStr := preDateDay.Format(utils.FormatDate)
  843. if findItem, ok := dataMap[preDateDayStr]; ok { //上一年同期->上一个月找到
  844. timestamp := currentDate.UnixNano() / 1e6
  845. timestampStr := fmt.Sprintf("%d", timestamp)
  846. val := TbzDiv(currentItem.Value, findItem.Value)
  847. if existVal, ok := existDataMap[av]; !ok {
  848. if _, existOk := existAddDataMap[av]; !existOk {
  849. addSql += GetAddSql(edbInfoIdStr, edbCode, av, timestampStr, val)
  850. isAdd = true
  851. }
  852. existAddDataMap[av] = av
  853. } else {
  854. if existVal != val {
  855. sql := ` UPDATE %s SET value=?,modify_time=NOW() WHERE edb_info_id=? AND data_time=? `
  856. sql = fmt.Sprintf(sql, dataTableName)
  857. _, err = o.Raw(sql, val, edbInfoId, av).Exec()
  858. if err != nil {
  859. return err
  860. }
  861. }
  862. }
  863. break
  864. }
  865. }
  866. }
  867. } else if fromEdbInfo.Frequency == "季度" || fromEdbInfo.Frequency == "年度" {
  868. if findItem, ok := dataMap[preDateStr]; ok { //上一年同期->下一个月找到
  869. timestamp := currentDate.UnixNano() / 1e6
  870. timestampStr := fmt.Sprintf("%d", timestamp)
  871. val := TbzDiv(currentItem.Value, findItem.Value)
  872. if existVal, ok := existDataMap[av]; !ok {
  873. if _, existOk := existAddDataMap[av]; !existOk {
  874. addSql += GetAddSql(edbInfoIdStr, edbCode, av, timestampStr, val)
  875. isAdd = true
  876. }
  877. existAddDataMap[av] = av
  878. } else {
  879. if existVal != val {
  880. sql := ` UPDATE %s SET value=?,modify_time=NOW() WHERE edb_info_id=? AND data_time=? `
  881. sql = fmt.Sprintf(sql, dataTableName)
  882. _, err = o.Raw(sql, val, edbInfoId, av).Exec()
  883. if err != nil {
  884. return err
  885. }
  886. }
  887. }
  888. break
  889. }
  890. } else {
  891. nextDateDay := preDate.AddDate(0, 0, 1)
  892. nextDateDayStr := nextDateDay.Format(utils.FormatDate)
  893. preDateDay := preDate.AddDate(0, 0, -1)
  894. preDateDayStr := preDateDay.Format(utils.FormatDate)
  895. for i := 0; i < 35; i++ {
  896. if i >= 1 {
  897. nextDateDay = nextDateDay.AddDate(0, 0, i)
  898. nextDateDayStr = nextDateDay.Format(utils.FormatDate)
  899. }
  900. if findItem, ok := dataMap[nextDateDayStr]; ok { //上一年同期->下一个月找到
  901. timestamp := currentDate.UnixNano() / 1e6
  902. timestampStr := fmt.Sprintf("%d", timestamp)
  903. val := TbzDiv(currentItem.Value, findItem.Value)
  904. if existVal, ok := existDataMap[av]; !ok {
  905. if _, existOk := existAddDataMap[av]; !existOk {
  906. addSql += GetAddSql(edbInfoIdStr, edbCode, av, timestampStr, val)
  907. isAdd = true
  908. }
  909. existAddDataMap[av] = av
  910. } else {
  911. if existVal != val {
  912. sql := ` UPDATE %s SET value=?,modify_time=NOW() WHERE edb_info_id=? AND data_time=? `
  913. sql = fmt.Sprintf(sql, dataTableName)
  914. _, err = o.Raw(sql, val, edbInfoId, av).Exec()
  915. if err != nil {
  916. return err
  917. }
  918. }
  919. }
  920. break
  921. } else {
  922. if i >= 1 {
  923. preDateDay = preDate.AddDate(0, 0, -i)
  924. preDateDayStr = nextDateDay.Format(utils.FormatDate)
  925. }
  926. if findItem, ok := dataMap[preDateDayStr]; ok { //上一年同期->上一个月找到
  927. timestamp := currentDate.UnixNano() / 1e6
  928. timestampStr := fmt.Sprintf("%d", timestamp)
  929. val := TbzDiv(currentItem.Value, findItem.Value)
  930. if existVal, ok := existDataMap[av]; !ok {
  931. if _, existOk := existAddDataMap[av]; !existOk {
  932. addSql += GetAddSql(edbInfoIdStr, edbCode, av, timestampStr, val)
  933. isAdd = true
  934. }
  935. existAddDataMap[av] = av
  936. } else {
  937. if existVal != val {
  938. sql := ` UPDATE %s SET value=?,modify_time=NOW() WHERE edb_info_id=? AND data_time=? `
  939. sql = fmt.Sprintf(sql, dataTableName)
  940. _, err = o.Raw(sql, val, edbInfoId, av).Exec()
  941. if err != nil {
  942. return err
  943. }
  944. }
  945. }
  946. }
  947. break
  948. }
  949. }
  950. }
  951. }
  952. }
  953. }
  954. if isAdd {
  955. addSql = strings.TrimRight(addSql, ",")
  956. _, err = o.Raw(addSql).Exec()
  957. if err != nil {
  958. return err
  959. }
  960. }
  961. return
  962. }