edb_info_calculate_ljzzy.go 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777
  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 EdbInfoCalculateLjzzy struct {
  13. EdbInfoCalculateLjzzyId int `orm:"column(edb_info_calculate_ljzzy_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. func AddEdbInfoCalculateLjzzyMulti(items []*EdbInfoCalculateLjzzy) (err error) {
  27. o := orm.NewOrmUsingDB("data")
  28. _, err = o.InsertMulti(1, items)
  29. return
  30. }
  31. //累计值转月
  32. func AddCalculateLjzzy(req *EdbInfoCalculateBatchSaveReq, fromEdbInfo *EdbInfo, edbCode, uniqueCode string, sysUserId int, sysUserRealName string) (edbInfoId int, err error) {
  33. o := orm.NewOrmUsingDB("data")
  34. o.Begin()
  35. defer func() {
  36. if err != nil {
  37. o.Rollback()
  38. } else {
  39. o.Commit()
  40. }
  41. }()
  42. if req.EdbInfoId <= 0 {
  43. edbInfo := new(EdbInfo)
  44. edbInfo.Source = utils.DATA_SOURCE_CALCULATE_LJZZY
  45. edbInfo.SourceName = "累计值转月值"
  46. edbInfo.EdbCode = edbCode
  47. edbInfo.EdbName = req.EdbName
  48. edbInfo.EdbNameSource = req.EdbName
  49. edbInfo.Frequency = req.Frequency
  50. edbInfo.Unit = req.Unit
  51. edbInfo.ClassifyId = req.ClassifyId
  52. edbInfo.SysUserId = sysUserId
  53. edbInfo.SysUserRealName = sysUserRealName
  54. edbInfo.CreateTime = time.Now()
  55. edbInfo.ModifyTime = time.Now()
  56. edbInfo.UniqueCode = uniqueCode
  57. edbInfo.CalculateFormula = req.Formula
  58. edbInfo.EdbType = 2
  59. newEdbInfoId, err := o.Insert(edbInfo)
  60. if err != nil {
  61. return int(newEdbInfoId), err
  62. }
  63. edbInfoId = int(newEdbInfoId)
  64. //calculateItem := new(EdbInfoCalculateLjzzy)
  65. //calculateItem.CreateTime = time.Now()
  66. //calculateItem.ModifyTime = time.Now()
  67. //calculateItem.Sort = 1
  68. //calculateItem.EdbCode = edbCode
  69. //calculateItem.EdbInfoId = edbInfoId
  70. //calculateItem.FromEdbInfoId = fromEdbInfo.EdbInfoId
  71. //calculateItem.FromEdbCode = fromEdbInfo.EdbCode
  72. //calculateItem.FromEdbName = fromEdbInfo.EdbName
  73. //calculateItem.FromSource = fromEdbInfo.Source
  74. //calculateItem.FromSourceName = fromEdbInfo.SourceName
  75. //_, err = o.Insert(calculateItem)
  76. //if err != nil {
  77. // return edbInfoId, err
  78. //}
  79. //关联关系
  80. {
  81. calculateMappingItem := new(EdbInfoCalculateMapping)
  82. calculateMappingItem.CreateTime = time.Now()
  83. calculateMappingItem.ModifyTime = time.Now()
  84. calculateMappingItem.Sort = 1
  85. calculateMappingItem.EdbCode = edbCode
  86. calculateMappingItem.EdbInfoId = edbInfoId
  87. calculateMappingItem.FromEdbInfoId = fromEdbInfo.EdbInfoId
  88. calculateMappingItem.FromEdbCode = fromEdbInfo.EdbCode
  89. calculateMappingItem.FromEdbName = fromEdbInfo.EdbName
  90. calculateMappingItem.FromSource = fromEdbInfo.Source
  91. calculateMappingItem.FromSourceName = fromEdbInfo.SourceName
  92. calculateMappingItem.FromTag = ""
  93. calculateMappingItem.Source = edbInfo.Source
  94. calculateMappingItem.SourceName = edbInfo.SourceName
  95. go o.Insert(calculateMappingItem)
  96. }
  97. } else {
  98. edbInfoId = req.EdbInfoId
  99. dataTableName := GetEdbDataTableName(utils.DATA_SOURCE_CALCULATE_LJZZY)
  100. deleteSql := ` DELETE FROM %s WHERE edb_info_id=? `
  101. deleteSql = fmt.Sprintf(deleteSql, dataTableName)
  102. _, err = o.Raw(deleteSql, req.EdbInfoId).Exec()
  103. }
  104. edbInfoIdStr := strconv.Itoa(edbInfoId)
  105. //计算数据
  106. var condition string
  107. var pars []interface{}
  108. condition += " AND edb_info_id=? "
  109. if req.EdbInfoId <= 0 {
  110. pars = append(pars, req.FromEdbInfoId)
  111. } else {
  112. pars = append(pars, fromEdbInfo.EdbInfoId)
  113. }
  114. fmt.Println("EdbInfoId:", req.FromEdbInfoId)
  115. dataList, err := GetEdbDataListAll(condition, pars, fromEdbInfo.Source, 1)
  116. if err != nil {
  117. return edbInfoId, err
  118. }
  119. yearMap := make(map[int]map[int]*EdbInfoSearchData)
  120. dataLen := len(dataList)
  121. for i := 0; i < dataLen; i++ {
  122. item := dataList[i]
  123. //日其中获取年
  124. itemDate, err := time.Parse(utils.FormatDate, item.DataTime)
  125. if err != nil {
  126. return edbInfoId, err
  127. }
  128. year := itemDate.Year()
  129. month := int(itemDate.Month())
  130. if monthMap, yok := yearMap[year]; yok {
  131. monthMap[month] = item
  132. yearMap[year] = monthMap
  133. } else {
  134. monthMap = make(map[int]*EdbInfoSearchData)
  135. monthMap[month] = item
  136. yearMap[year] = monthMap
  137. }
  138. }
  139. addSql := ` INSERT INTO edb_data_calculate_ljzzy(edb_info_id,edb_code,data_time,value,create_time,modify_time,status,data_timestamp) values `
  140. var isAdd bool
  141. existMap := make(map[string]string)
  142. for yk, yv := range yearMap {
  143. _, oneMonthOk := yv[1]
  144. _, twoMonthOk := yv[2]
  145. if !oneMonthOk && !twoMonthOk {
  146. continue
  147. }
  148. for i := 1; i <= 12; i++ {
  149. fmt.Println(yk, i, yv[i])
  150. dataCurrentItem := yv[i]
  151. fmt.Println("i:", i, yk, dataCurrentItem)
  152. var date string
  153. var val float64
  154. if i == 1 || i == 2 {
  155. if _, mok := yv[1]; mok { //1月有值
  156. if i == 1 {
  157. date = dataCurrentItem.DataTime
  158. val, _ = decimal.NewFromFloat(dataCurrentItem.Value).Float64() //a.Div(b).Float64()
  159. }
  160. if i == 2 {
  161. dataOneItem := yv[1]
  162. if dataCurrentItem != nil {
  163. date = dataCurrentItem.DataTime
  164. twoMonth := decimal.NewFromFloat(dataCurrentItem.Value)
  165. oneMonth := decimal.NewFromFloat(dataOneItem.Value)
  166. val, _ = twoMonth.Sub(oneMonth).Float64()
  167. } else {
  168. continue
  169. }
  170. }
  171. } else { //1月无值
  172. dataTwoItem := yv[2]
  173. if i == 1 {
  174. date = strconv.Itoa(yk) + "-01-31"
  175. a := decimal.NewFromFloat(dataTwoItem.Value)
  176. b := decimal.NewFromFloat(2.0)
  177. val, _ = a.Div(b).Float64()
  178. }
  179. if i == 2 {
  180. date = dataCurrentItem.DataTime
  181. a := decimal.NewFromFloat(dataTwoItem.Value)
  182. b := decimal.NewFromFloat(2.0)
  183. val, _ = a.Div(b).Float64()
  184. }
  185. }
  186. } else {
  187. dataPreItem := yv[i-1]
  188. if dataCurrentItem != nil && dataPreItem != nil {
  189. date = dataCurrentItem.DataTime
  190. //val, _ = decimal.NewFromFloat(dataCurrentItem.Value).Sub(decimal.NewFromFloat(dataPreItem.Value)).Float64()
  191. a := decimal.NewFromFloat(dataCurrentItem.Value)
  192. b := decimal.NewFromFloat(dataPreItem.Value)
  193. val, _ = a.Sub(b).Float64()
  194. }
  195. }
  196. if date != "" {
  197. dataTime, _ := time.Parse(utils.FormatDate, date)
  198. timestamp := dataTime.UnixNano() / 1e6
  199. timeStr := fmt.Sprintf("%d", timestamp)
  200. if _, ok := existMap[edbCode+date]; !ok {
  201. addSql += GetAddSql(edbInfoIdStr, edbCode, date, timeStr, utils.SubFloatToString(val, 4))
  202. isAdd = true
  203. }
  204. existMap[edbCode+date] = date
  205. }
  206. }
  207. }
  208. if isAdd {
  209. addSql = strings.TrimRight(addSql, ",")
  210. _, err = o.Raw(addSql).Exec()
  211. if err != nil {
  212. return edbInfoId, err
  213. }
  214. }
  215. return
  216. }
  217. //修改累计值转月
  218. func EditCalculateLjzzy(req *EdbInfoCalculateBatchEditReq, fromEdbInfo *EdbInfo, edbCode string) (edbInfoId int, err error) {
  219. edbInfoId = req.EdbInfoId
  220. o := orm.NewOrmUsingDB("data")
  221. o.Begin()
  222. defer func() {
  223. if err != nil {
  224. o.Rollback()
  225. } else {
  226. o.Commit()
  227. }
  228. }()
  229. //修改指标信息
  230. sql := ` UPDATE edb_info
  231. SET
  232. edb_name =?,
  233. edb_name_source=?,
  234. frequency = ?,
  235. unit = ?,
  236. classify_id = ?,
  237. modify_time = NOW()
  238. WHERE edb_info_id = ? `
  239. _, err = o.Raw(sql, req.EdbName, req.EdbName, req.Frequency, req.Unit, req.ClassifyId, edbInfoId).Exec()
  240. if err != nil {
  241. return
  242. }
  243. var existCondition string
  244. var existPars []interface{}
  245. existCondition += " AND edb_info_id=? "
  246. existPars = append(existPars, edbInfoId)
  247. existCondition += " AND from_edb_info_id=? "
  248. existPars = append(existPars, req.FromEdbInfoId)
  249. //判断计算指标是否被更换
  250. count, err := GetEdbInfoCalculateCountByCondition(req.Source, existCondition, existPars)
  251. if err != nil {
  252. err = errors.New("判断指标是否改变失败,Err:" + err.Error())
  253. return
  254. }
  255. if count <= 0 {
  256. //删除指标关联计算指标
  257. //sql := ` DELETE FROM edb_info_calculate_ljzzy WHERE edb_info_id = ? `
  258. //_, err = o.Raw(sql, edbInfoId).Exec()
  259. //if err != nil {
  260. // return
  261. //}
  262. //calculateItem := new(EdbInfoCalculateLjzzy)
  263. //calculateItem.CreateTime = time.Now()
  264. //calculateItem.ModifyTime = time.Now()
  265. //calculateItem.Sort = 1
  266. //calculateItem.EdbCode = edbCode
  267. //calculateItem.EdbInfoId = edbInfoId
  268. //calculateItem.FromEdbInfoId = fromEdbInfo.EdbInfoId
  269. //calculateItem.FromEdbCode = fromEdbInfo.EdbCode
  270. //calculateItem.FromEdbName = fromEdbInfo.EdbName
  271. //calculateItem.FromSource = fromEdbInfo.Source
  272. //calculateItem.FromSourceName = fromEdbInfo.SourceName
  273. //_, err = o.Insert(calculateItem)
  274. //if err != nil {
  275. // return
  276. //}
  277. //删除,计算指标关联的,基础指标的关联关系
  278. sql = ` DELETE FROM edb_info_calculate_mapping WHERE edb_info_id = ? `
  279. o.Raw(sql, edbInfoId).Exec()
  280. //清空原有数据
  281. sql = ` DELETE FROM edb_data_calculate_ljzzy WHERE edb_info_id = ? `
  282. _, err = o.Raw(sql, edbInfoId).Exec()
  283. if err != nil {
  284. return edbInfoId, err
  285. }
  286. //关联关系
  287. {
  288. calculateMappingItem := new(EdbInfoCalculateMapping)
  289. calculateMappingItem.CreateTime = time.Now()
  290. calculateMappingItem.ModifyTime = time.Now()
  291. calculateMappingItem.Sort = 1
  292. calculateMappingItem.EdbCode = edbCode
  293. calculateMappingItem.EdbInfoId = edbInfoId
  294. calculateMappingItem.FromEdbInfoId = fromEdbInfo.EdbInfoId
  295. calculateMappingItem.FromEdbCode = fromEdbInfo.EdbCode
  296. calculateMappingItem.FromEdbName = fromEdbInfo.EdbName
  297. calculateMappingItem.FromSource = fromEdbInfo.Source
  298. calculateMappingItem.FromSourceName = fromEdbInfo.SourceName
  299. calculateMappingItem.FromTag = ""
  300. calculateMappingItem.Source = utils.DATA_SOURCE_CALCULATE_LJZZY
  301. calculateMappingItem.SourceName = "累计值转月"
  302. o.Insert(calculateMappingItem)
  303. }
  304. //计算数据
  305. var condition string
  306. var pars []interface{}
  307. condition += " AND edb_info_id=? "
  308. pars = append(pars, req.FromEdbInfoId)
  309. fmt.Println("EdbInfoId:", req.FromEdbInfoId)
  310. dataList, err := GetEdbDataListAll(condition, pars, fromEdbInfo.Source, 1)
  311. if err != nil {
  312. return edbInfoId, err
  313. }
  314. yearMap := make(map[int]map[int]*EdbInfoSearchData)
  315. dataLen := len(dataList)
  316. for i := 0; i < dataLen; i++ {
  317. item := dataList[i]
  318. //日其中获取年
  319. itemDate, err := time.Parse(utils.FormatDate, item.DataTime)
  320. if err != nil {
  321. return edbInfoId, err
  322. }
  323. year := itemDate.Year()
  324. month := int(itemDate.Month())
  325. if monthMap, yok := yearMap[year]; yok {
  326. monthMap[month] = item
  327. yearMap[year] = monthMap
  328. } else {
  329. monthMap = make(map[int]*EdbInfoSearchData)
  330. monthMap[month] = item
  331. yearMap[year] = monthMap
  332. }
  333. }
  334. addSql := ` INSERT INTO edb_data_calculate_ljzzy(edb_info_id,edb_code,data_time,value,create_time,modify_time,status,data_timestamp) values `
  335. nowStr := time.Now().Format(utils.FormatDateTime)
  336. var isAdd bool
  337. for yk, yv := range yearMap {
  338. _, oneMonthOk := yv[1]
  339. _, twoMonthOk := yv[2]
  340. if !oneMonthOk && !twoMonthOk {
  341. continue
  342. }
  343. for i := 1; i <= 12; i++ {
  344. fmt.Println(yk, i, yv[i])
  345. dataCurrentItem := yv[i]
  346. var date string
  347. var val float64
  348. if i == 1 || i == 2 {
  349. if _, mok := yv[1]; mok { //1月有值
  350. if i == 1 {
  351. date = dataCurrentItem.DataTime
  352. val, _ = decimal.NewFromFloat(dataCurrentItem.Value).Float64() //a.Div(b).Float64()
  353. }
  354. if i == 2 {
  355. dataOneItem := yv[1]
  356. date = dataCurrentItem.DataTime
  357. twoMonth := decimal.NewFromFloat(dataCurrentItem.Value)
  358. oneMonth := decimal.NewFromFloat(dataOneItem.Value)
  359. val, _ = twoMonth.Sub(oneMonth).Float64()
  360. }
  361. } else { //1月无值
  362. dataTwoItem := yv[2]
  363. if i == 1 {
  364. date = strconv.Itoa(yk) + "-01-31"
  365. a := decimal.NewFromFloat(dataTwoItem.Value)
  366. b := decimal.NewFromFloat(2.0)
  367. val, _ = a.Div(b).Float64()
  368. }
  369. if i == 2 {
  370. date = dataCurrentItem.DataTime
  371. a := decimal.NewFromFloat(dataTwoItem.Value)
  372. b := decimal.NewFromFloat(2.0)
  373. val, _ = a.Div(b).Float64()
  374. }
  375. }
  376. } else {
  377. dataPreItem := yv[i-1]
  378. if dataCurrentItem != nil && dataPreItem != nil {
  379. date = dataCurrentItem.DataTime
  380. //val = dataCurrentItem.Value - dataPreItem.Value
  381. a := decimal.NewFromFloat(dataCurrentItem.Value)
  382. b := decimal.NewFromFloat(dataPreItem.Value)
  383. val, _ = a.Sub(b).Float64()
  384. }
  385. }
  386. if date != "" {
  387. dataTime, _ := time.Parse(utils.FormatDate, date)
  388. timestamp := dataTime.UnixNano() / 1e6
  389. timeStr := fmt.Sprintf("%d", timestamp)
  390. addSql += "("
  391. addSql += strconv.Itoa(edbInfoId) + "," + "'" + edbCode + "'" + "," + "'" + date + "'" + "," + utils.SubFloatToString(val, 4) + "," + "'" + nowStr + "'" +
  392. "," + "'" + nowStr + "'" + "," + "1"
  393. addSql += "," + "'" + timeStr + "'"
  394. addSql += "),"
  395. isAdd = true
  396. }
  397. }
  398. }
  399. if isAdd {
  400. addSql = strings.TrimRight(addSql, ",")
  401. _, err = o.Raw(addSql).Exec()
  402. if err != nil {
  403. return edbInfoId, err
  404. }
  405. }
  406. }
  407. return
  408. }
  409. //刷新累计值转月值数据
  410. func RefreshCalculateLjzzy(edbInfoId int, fromEdbInfo *EdbInfo, edbCode, startDate, endDate string) (err error) {
  411. o := orm.NewOrmUsingDB("data")
  412. o.Begin()
  413. defer func() {
  414. if err != nil {
  415. o.Rollback()
  416. } else {
  417. o.Commit()
  418. }
  419. }()
  420. if err != nil {
  421. return
  422. }
  423. edbInfoIdStr := strconv.Itoa(edbInfoId)
  424. //计算数据
  425. var condition string
  426. var pars []interface{}
  427. condition += " AND edb_info_id=? "
  428. pars = append(pars, fromEdbInfo.EdbInfoId)
  429. if startDate != "" {
  430. condition += " AND data_time>=? "
  431. pars = append(pars, startDate)
  432. }
  433. if endDate != "" {
  434. condition += " AND data_time<=? "
  435. pars = append(pars, endDate)
  436. }
  437. dataList, err := GetEdbDataListAll(condition, pars, fromEdbInfo.Source, 1)
  438. if err != nil {
  439. return err
  440. }
  441. yearMap := make(map[int]map[int]*EdbInfoSearchData)
  442. dataLen := len(dataList)
  443. for i := 0; i < dataLen; i++ {
  444. item := dataList[i]
  445. //日其中获取年
  446. itemDate, err := time.Parse(utils.FormatDate, item.DataTime)
  447. if err != nil {
  448. return err
  449. }
  450. year := itemDate.Year()
  451. month := int(itemDate.Month())
  452. if monthMap, yok := yearMap[year]; yok {
  453. monthMap[month] = item
  454. yearMap[year] = monthMap
  455. } else {
  456. monthMap = make(map[int]*EdbInfoSearchData)
  457. monthMap[month] = item
  458. yearMap[year] = monthMap
  459. }
  460. }
  461. addSql := ` INSERT INTO edb_data_calculate_ljzzy(edb_info_id,edb_code,data_time,value,create_time,modify_time,status,data_timestamp) values `
  462. nowStr := time.Now().Format(utils.FormatDateTime)
  463. var isAdd bool
  464. for yk, yv := range yearMap {
  465. _, oneMonthOk := yv[1]
  466. _, twoMonthOk := yv[2]
  467. if !oneMonthOk && !twoMonthOk {
  468. continue
  469. }
  470. for i := 1; i <= 12; i++ {
  471. fmt.Println(yk, i, yv[i])
  472. dataCurrentItem := yv[i]
  473. var date string
  474. var val float64
  475. if i == 1 || i == 2 {
  476. if _, mok := yv[1]; mok { //1月有值
  477. if i == 1 {
  478. date = dataCurrentItem.DataTime
  479. val, _ = decimal.NewFromFloat(dataCurrentItem.Value).Float64() //a.Div(b).Float64()
  480. }
  481. if i == 2 {
  482. dataOneItem := yv[1]
  483. date = dataCurrentItem.DataTime
  484. twoMonth := decimal.NewFromFloat(dataCurrentItem.Value)
  485. oneMonth := decimal.NewFromFloat(dataOneItem.Value)
  486. val, _ = twoMonth.Sub(oneMonth).Float64()
  487. }
  488. } else { //1月无值
  489. dataTwoItem := yv[2]
  490. if i == 1 {
  491. date = strconv.Itoa(yk) + "-01-31"
  492. a := decimal.NewFromFloat(dataTwoItem.Value)
  493. b := decimal.NewFromFloat(2.0)
  494. val, _ = a.Div(b).Float64()
  495. }
  496. if i == 2 {
  497. date = dataCurrentItem.DataTime
  498. a := decimal.NewFromFloat(dataTwoItem.Value)
  499. b := decimal.NewFromFloat(2.0)
  500. val, _ = a.Div(b).Float64()
  501. }
  502. }
  503. } else {
  504. dataPreItem := yv[i-1]
  505. if dataCurrentItem != nil && dataPreItem != nil {
  506. date = dataCurrentItem.DataTime
  507. //val = dataCurrentItem.Value - dataPreItem.Value
  508. a := decimal.NewFromFloat(dataCurrentItem.Value)
  509. b := decimal.NewFromFloat(dataPreItem.Value)
  510. val, _ = a.Sub(b).Float64()
  511. }
  512. }
  513. if date != "" {
  514. //判断数据是否存在
  515. count, err := GetEdbDataCalculateLjzzyByCodeAndDate(edbCode, date)
  516. if err != nil && err.Error() != utils.ErrNoRow() {
  517. return err
  518. }
  519. if count <= 0 {
  520. dataTime, _ := time.Parse(utils.FormatDate, date)
  521. timestamp := dataTime.UnixNano() / 1e6
  522. timeStr := fmt.Sprintf("%d", timestamp)
  523. addSql += "("
  524. addSql += edbInfoIdStr + "," + "'" + edbCode + "'" + "," + "'" + date + "'" + "," + utils.SubFloatToString(val, 4) + "," + "'" + nowStr + "'" +
  525. "," + "'" + nowStr + "'" + "," + "1"
  526. addSql += "," + "'" + timeStr + "'"
  527. addSql += "),"
  528. isAdd = true
  529. } else {
  530. valStr := utils.SubFloatToString(val, 4)
  531. err = ModifyEdbDataCalculateLjzzy(int64(edbInfoId), date, valStr)
  532. if err != nil {
  533. return err
  534. }
  535. }
  536. }
  537. }
  538. }
  539. if isAdd {
  540. addSql = strings.TrimRight(addSql, ",")
  541. _, err = o.Raw(addSql).Exec()
  542. if err != nil {
  543. return err
  544. }
  545. }
  546. return
  547. }
  548. type EdbInfoCalculateLjzzyDetail struct {
  549. EdbInfoCalculateLjzzyId int `orm:"column(edb_info_calculate_ljzzy_id);pk"`
  550. EdbInfoId int `description:"指标id"`
  551. EdbCode string `description:"指标编码"`
  552. FromEdbInfoId int `description:"计算指标id"`
  553. FromEdbCode string `description:"计算指标编码"`
  554. FromEdbName string `description:"计算指标名称"`
  555. FromSource int `description:"计算指标来源"`
  556. FromSourceName string `description:"计算指标来源名称"`
  557. FromTag string `description:"来源指标标签"`
  558. Sort int `description:"计算指标名称排序"`
  559. CreateTime time.Time `description:"创建时间"`
  560. ModifyTime time.Time `description:"修改时间"`
  561. StartDate string `description:"开始日期"`
  562. EndDate string `description:"结束日期"`
  563. }
  564. func GetEdbInfoCalculateLjzzyDetail(edbInfoId int) (item *EdbInfoCalculateLjzzyDetail, err error) {
  565. o := orm.NewOrmUsingDB("data")
  566. sql := ` SELECT a.*,b.start_date,b.end_date FROM edb_info_calculate_mapping AS a
  567. INNER JOIN edb_info AS b ON a.from_edb_info_id=b.edb_info_id
  568. WHERE a.edb_info_id=? `
  569. err = o.Raw(sql, edbInfoId).QueryRow(&item)
  570. return
  571. }
  572. func GetEdbDataCalculateLjzzyByCodeAndDate(edbCode string, startDate string) (count int, err error) {
  573. o := orm.NewOrmUsingDB("data")
  574. sql := ` SELECT COUNT(1) AS count FROM edb_data_calculate_ljzzy WHERE edb_code=? AND data_time=? `
  575. err = o.Raw(sql, edbCode, startDate).QueryRow(&count)
  576. return
  577. }
  578. func ModifyEdbDataCalculateLjzzy(edbInfoId int64, dataTime, value string) (err error) {
  579. o := orm.NewOrmUsingDB("data")
  580. sql := ` UPDATE edb_data_calculate_ljzzy SET value=?,modify_time=NOW() WHERE edb_info_id=? AND data_time=? `
  581. _, err = o.Raw(sql, value, edbInfoId, dataTime).Exec()
  582. return
  583. }
  584. //刷新全部数据
  585. func RefreshAllCalculateLjzzy(edbInfoId, source int, fromEdbInfo *EdbInfo, edbCode, startDate, endDate string) (err error) {
  586. o := orm.NewOrmUsingDB("data")
  587. o.Begin()
  588. defer func() {
  589. if err != nil {
  590. o.Rollback()
  591. } else {
  592. o.Commit()
  593. }
  594. }()
  595. if err != nil {
  596. return
  597. }
  598. edbInfoIdStr := strconv.Itoa(edbInfoId)
  599. //计算数据
  600. var condition string
  601. var pars []interface{}
  602. condition += " AND edb_info_id=? "
  603. pars = append(pars, fromEdbInfo.EdbInfoId)
  604. if startDate != "" {
  605. condition += " AND data_time>=? "
  606. pars = append(pars, startDate)
  607. }
  608. if endDate != "" {
  609. condition += " AND data_time<=? "
  610. pars = append(pars, endDate)
  611. }
  612. dataList, err := GetEdbDataListAll(condition, pars, fromEdbInfo.Source, 1)
  613. if err != nil {
  614. return err
  615. }
  616. yearMap := make(map[int]map[int]*EdbInfoSearchData)
  617. dataLen := len(dataList)
  618. for i := 0; i < dataLen; i++ {
  619. item := dataList[i]
  620. //日其中获取年
  621. itemDate, err := time.Parse(utils.FormatDate, item.DataTime)
  622. if err != nil {
  623. return err
  624. }
  625. year := itemDate.Year()
  626. month := int(itemDate.Month())
  627. if monthMap, yok := yearMap[year]; yok {
  628. monthMap[month] = item
  629. yearMap[year] = monthMap
  630. } else {
  631. monthMap = make(map[int]*EdbInfoSearchData)
  632. monthMap[month] = item
  633. yearMap[year] = monthMap
  634. }
  635. }
  636. addSql := ` INSERT INTO edb_data_calculate_ljzzy(edb_info_id,edb_code,data_time,value,create_time,modify_time,status,data_timestamp) values `
  637. var isAdd bool
  638. //获取指标所有数据
  639. existDataList := make([]*EdbDataBase, 0)
  640. dataTableName := GetEdbDataTableName(source)
  641. sql := `SELECT * FROM %s WHERE edb_info_id=? `
  642. sql = fmt.Sprintf(sql, dataTableName)
  643. _, err = o.Raw(sql, edbInfoId).QueryRows(&existDataList)
  644. if err != nil {
  645. return err
  646. }
  647. dataMap := make(map[string]string)
  648. for _, v := range existDataList {
  649. dataMap[v.DataTime] = v.Value
  650. }
  651. existDataMap := make(map[string]string)
  652. for yk, yv := range yearMap {
  653. _, oneMonthOk := yv[1]
  654. _, twoMonthOk := yv[2]
  655. if !oneMonthOk && !twoMonthOk {
  656. continue
  657. }
  658. for i := 1; i <= 12; i++ {
  659. fmt.Println(yk, i, yv[i])
  660. dataCurrentItem := yv[i]
  661. var date string
  662. var val float64
  663. if i == 1 || i == 2 {
  664. if _, mok := yv[1]; mok { //1月有值
  665. if i == 1 {
  666. date = dataCurrentItem.DataTime
  667. val, _ = decimal.NewFromFloat(dataCurrentItem.Value).Float64() //a.Div(b).Float64()
  668. }
  669. if i == 2 {
  670. dataOneItem := yv[1]
  671. date = dataCurrentItem.DataTime
  672. twoMonth := decimal.NewFromFloat(dataCurrentItem.Value)
  673. oneMonth := decimal.NewFromFloat(dataOneItem.Value)
  674. val, _ = twoMonth.Sub(oneMonth).Float64()
  675. }
  676. } else { //1月无值
  677. dataTwoItem := yv[2]
  678. if i == 1 {
  679. date = strconv.Itoa(yk) + "-01-31"
  680. a := decimal.NewFromFloat(dataTwoItem.Value)
  681. b := decimal.NewFromFloat(2.0)
  682. val, _ = a.Div(b).Float64()
  683. }
  684. if i == 2 {
  685. date = dataCurrentItem.DataTime
  686. a := decimal.NewFromFloat(dataTwoItem.Value)
  687. b := decimal.NewFromFloat(2.0)
  688. val, _ = a.Div(b).Float64()
  689. }
  690. }
  691. } else {
  692. dataPreItem := yv[i-1]
  693. if dataCurrentItem != nil && dataPreItem != nil {
  694. date = dataCurrentItem.DataTime
  695. //val = dataCurrentItem.Value - dataPreItem.Value
  696. a := decimal.NewFromFloat(dataCurrentItem.Value)
  697. b := decimal.NewFromFloat(dataPreItem.Value)
  698. val, _ = a.Sub(b).Float64()
  699. }
  700. }
  701. if date != "" {
  702. saveValue := utils.SubFloatToString(val, 4)
  703. //判断数据是否存在
  704. if existVal, ok := dataMap[date]; !ok {
  705. dataTime, _ := time.Parse(utils.FormatDate, date)
  706. timestamp := dataTime.UnixNano() / 1e6
  707. timeStr := fmt.Sprintf("%d", timestamp)
  708. if _, existOk := existDataMap[date]; !existOk {
  709. addSql += GetAddSql(edbInfoIdStr, edbCode, date, timeStr, saveValue)
  710. isAdd = true
  711. }
  712. existDataMap[date] = date
  713. } else {
  714. if existVal != saveValue {
  715. sql := ` UPDATE %s SET value=?,modify_time=NOW() WHERE edb_info_id=? AND data_time=? `
  716. sql = fmt.Sprintf(sql, dataTableName)
  717. _, err = o.Raw(sql, saveValue, edbInfoId, date).Exec()
  718. if err != nil {
  719. return err
  720. }
  721. }
  722. }
  723. }
  724. }
  725. }
  726. if isAdd {
  727. addSql = strings.TrimRight(addSql, ",")
  728. _, err = o.Raw(addSql).Exec()
  729. if err != nil {
  730. fmt.Println("RefreshAllCalculateLjzzy add Err", err.Error())
  731. return
  732. }
  733. }
  734. return
  735. }