edb_info_calculate_tcz.go 33 KB

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