edb_info_calculate_ljzzy.go 23 KB

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