edb_info_calculate_tbz.go 33 KB

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