manual.go 31 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022
  1. package data
  2. import (
  3. "errors"
  4. "eta/eta_api/models"
  5. "eta/eta_api/models/data_manage"
  6. "eta/eta_api/models/system"
  7. "eta/eta_api/utils"
  8. "fmt"
  9. "github.com/shopspring/decimal"
  10. "github.com/tealeg/xlsx"
  11. "strconv"
  12. "strings"
  13. "time"
  14. )
  15. func GetManualSysUser(keyWord string) (list []*data_manage.ManualSysUser, err error) {
  16. //departmentId := 1
  17. list = make([]*data_manage.ManualSysUser, 0)
  18. departmentItems, err := system.GetSysDepartmentAll()
  19. if err != nil {
  20. return list, err
  21. }
  22. for _, dv := range departmentItems {
  23. department := new(data_manage.ManualSysUser)
  24. department.ItemId = dv.DepartmentId * 10000
  25. department.ItemName = dv.DepartmentName
  26. fmt.Println(department.ItemId, department.ItemName)
  27. //GetSysuserList
  28. var condition string
  29. var pars []interface{}
  30. if keyWord != "" {
  31. condition += ` AND (real_name LIKE ? OR admin_name LIKE ? OR mobile LIKE ? ) `
  32. pars = utils.GetLikeKeywordPars(pars, keyWord, 3)
  33. }
  34. sysUsers, err := system.GetSysUserItems(condition, pars)
  35. if err != nil {
  36. return list, err
  37. }
  38. groups, err := system.GetSysGroupByDepartmentId(dv.DepartmentId)
  39. if err != nil {
  40. return list, err
  41. }
  42. dg := make([]*data_manage.ManualSysUser, 0)
  43. for _, v := range groups {
  44. group := new(data_manage.ManualSysUser)
  45. group.ItemId = v.DepartmentId * 100000
  46. group.ItemName = v.GroupName
  47. for _, sv := range sysUsers {
  48. user := new(data_manage.ManualSysUser)
  49. user.ItemId = sv.AdminId
  50. user.ItemName = sv.RealName
  51. if sv.GroupId == v.GroupId {
  52. group.Children = append(group.Children, user)
  53. }
  54. }
  55. if len(group.Children) > 0 {
  56. dg = append(dg, group)
  57. }
  58. }
  59. if len(groups) <= 0 {
  60. group := new(data_manage.ManualSysUser)
  61. group.ItemId = dv.DepartmentId * 100000
  62. group.ItemName = "无分组"
  63. for _, sv := range sysUsers {
  64. user := new(data_manage.ManualSysUser)
  65. user.ItemId = sv.AdminId
  66. user.ItemName = sv.RealName
  67. if sv.DepartmentId == dv.DepartmentId && sv.GroupId == 0 {
  68. group.Children = append(group.Children, user)
  69. }
  70. }
  71. if len(group.Children) > 0 {
  72. dg = append(dg, group)
  73. }
  74. }
  75. if len(dg) > 0 {
  76. department.Children = dg
  77. list = append(list, department)
  78. }
  79. }
  80. return
  81. }
  82. // GetManualEdbClassifyListByAdminId
  83. // @Description: 根据账户类型获取手工指标分类ID集合
  84. // @author: Roc
  85. // @datetime 2024-07-16 13:18:39
  86. // @param adminId int64
  87. // @return classifyIdList []int
  88. // @return err error
  89. func GetManualEdbClassifyListByAdminId(adminId int64) (classifyIdList []int, err error) {
  90. var list []*models.EdbdataClassify
  91. if adminId <= 0 {
  92. list, err = models.GetAllChildManualEdbClassify()
  93. } else {
  94. userClassifyList, _ := models.GetManualUserClassify(int(adminId))
  95. var userClassifyIdList []int
  96. for _, v := range userClassifyList {
  97. userClassifyIdList = append(userClassifyIdList, v.ClassifyId)
  98. }
  99. list, err = models.GetChildManualEdbClassifyByIdList(userClassifyIdList)
  100. }
  101. if err != nil {
  102. return
  103. }
  104. for _, classify := range list {
  105. classifyIdList = append(classifyIdList, classify.ClassifyId)
  106. }
  107. return
  108. }
  109. type ManualIndexSource2EdbReq struct {
  110. EdbCode string
  111. EdbName string
  112. Frequency string
  113. Unit string
  114. ClassifyId int
  115. AdminId int
  116. AdminRealName string
  117. }
  118. // ManualIndexSource2Edb 新增彭博数据源到指标库
  119. func ManualIndexSource2Edb(req ManualIndexSource2EdbReq, lang string) (edb *data_manage.EdbInfo, err error, errMsg string, skip bool) {
  120. if req.EdbCode == "" {
  121. err = fmt.Errorf("指标ID为空")
  122. return
  123. }
  124. defer func() {
  125. if err != nil {
  126. tips := fmt.Sprintf("ManualIndexSource2Edb新增失败, Err: %s", err.Error())
  127. fmt.Println(tips)
  128. utils.FileLog.Info(tips)
  129. }
  130. }()
  131. source := utils.DATA_SOURCE_MANUAL
  132. // 是否已有指标数据
  133. dataList, e := data_manage.GetEdbDataAllByEdbCode(req.EdbCode, source, utils.DATA_SUB_SOURCE_EDB, utils.EDB_DATA_LIMIT)
  134. if e != nil {
  135. err = fmt.Errorf("获取指标数据失败, Err: %s", e.Error())
  136. return
  137. }
  138. // 新增指标数据
  139. if len(dataList) == 0 {
  140. res, e := AddEdbData(source, req.EdbCode, req.Frequency)
  141. if e != nil {
  142. err = fmt.Errorf("index_lib: 新增指标数据失败, Err: %s", e.Error())
  143. return
  144. }
  145. if res == nil {
  146. err = fmt.Errorf("index_lib: 新增指标数据失败, res nil")
  147. return
  148. }
  149. if res.Ret != 200 {
  150. err = fmt.Errorf("index_lib: 新增指标数据失败, Ret: %d", res.Ret)
  151. return
  152. }
  153. }
  154. // 是否新增过指标
  155. exist, e := data_manage.GetEdbInfoByEdbCode(source, req.EdbCode)
  156. if e != nil && e.Error() != utils.ErrNoRow() {
  157. err = fmt.Errorf("获取指标是否存在失败, err: %s", e.Error())
  158. return
  159. }
  160. if exist != nil {
  161. skip = true
  162. return
  163. }
  164. // 开始结束时间
  165. var startDate, endDate string
  166. minMax, e := data_manage.GetEdbInfoMaxAndMinInfo(source, utils.DATA_SUB_SOURCE_EDB, req.EdbCode)
  167. if e != nil && e.Error() != utils.ErrNoRow() {
  168. err = fmt.Errorf("MinMax: 获取指标极值失败, err: %s", e.Error())
  169. return
  170. }
  171. if minMax != nil {
  172. startDate = minMax.MinDate
  173. endDate = minMax.MaxDate
  174. }
  175. // 新增指标库
  176. edbInfo, e, msg, _ := EdbInfoAdd(source, utils.DATA_SUB_SOURCE_EDB, req.ClassifyId, req.EdbCode, req.EdbName, req.Frequency, req.Unit, startDate, endDate, req.AdminId, req.AdminRealName, lang)
  177. if e != nil {
  178. errMsg = msg
  179. err = fmt.Errorf("EdbInfo: 新增指标失败, err: %s", e.Error())
  180. return
  181. }
  182. edb = edbInfo
  183. // 新增es
  184. go AddOrEditEdbInfoToEs(edbInfo.EdbInfoId)
  185. return
  186. }
  187. func ImportManualData(path string, sysUser *system.Admin) (err error, errMsg string) {
  188. errMsg = `导入失败`
  189. xlFile, err := xlsx.OpenFile(path)
  190. if err != nil {
  191. fmt.Println(err.Error())
  192. return
  193. }
  194. if len(xlFile.Sheets) <= 0 {
  195. errMsg = "导入模板异常"
  196. err = errors.New(errMsg)
  197. return
  198. }
  199. //导入成功数量
  200. successCount := 0
  201. //导入失败数据
  202. failDataList := make([]*models.EdbdataImportFail, 0)
  203. var indexDataList []ImportManualIndexData
  204. for _, sheet := range xlFile.Sheets {
  205. var tmpIndexDataList []ImportManualIndexData
  206. var tmpFailDataList []*models.EdbdataImportFail
  207. rowList := sheet.Rows
  208. if len(rowList) <= 0 {
  209. errMsg = sheet.Name + "页异常"
  210. err = errors.New(errMsg)
  211. return
  212. }
  213. headerCell := rowList[0].Cells
  214. if len(headerCell) < 7 {
  215. errMsg = sheet.Name + "页模板异常"
  216. err = errors.New(errMsg)
  217. return
  218. }
  219. templateName := headerCell[6].String()
  220. switch templateName {
  221. case "导入模板2/Import Template 2":
  222. // 模板2需要走对应的取数逻辑
  223. tmpIndexDataList, tmpFailDataList, err, errMsg = getDataByTemplate2(sheet)
  224. default:
  225. // 模板1需要走对应的取数逻辑
  226. tmpIndexDataList, tmpFailDataList, err, errMsg = getDataByTemplate1(sheet)
  227. }
  228. indexDataList = append(indexDataList, tmpIndexDataList...)
  229. failDataList = append(failDataList, tmpFailDataList...)
  230. }
  231. //超管账号可以查看分类下的所有频度数据
  232. userId := sysUser.AdminId
  233. if sysUser.RoleTypeCode == utils.ROLE_TYPE_CODE_ADMIN {
  234. userId = 0
  235. }
  236. //获取账户所拥有权限的分类id集合
  237. classifyNameStrList, edbDataClassifyMap, err := GetEdbClassifyNameListByAdminId(int64(userId))
  238. if err != nil {
  239. errMsg = "获取分类数据失败"
  240. return
  241. }
  242. ////指标map
  243. //targetMap := make(map[string]*models.Edbinfo)
  244. //defer func() {
  245. // for _, target := range targetMap {
  246. // //结束后,清除掉对应的缓存
  247. // key := "import:edbinfo:data:" + target.TradeCode
  248. // utils.Rc.Delete(key)
  249. //
  250. // //将该指标的code加入到 “手工数据导入后刷新” 缓存
  251. // if utils.Re == nil {
  252. // err := utils.Rc.LPush(utils.CACHE_IMPORT_MANUAL_DATA, target.TradeCode)
  253. // if err != nil {
  254. // fmt.Println("CACHE_IMPORT_MANUAL_DATA LPush Err:" + err.Error())
  255. // }
  256. // }
  257. // }
  258. //}()
  259. //
  260. //// 所有的指标数据map
  261. //edbCodeDataMap := make(map[string]map[string]string)
  262. // 确定模板
  263. // 遍历sheet页读取
  264. //for _, sheet := range xlFile.Sheets {
  265. // fmt.Println("sheet name: ", sheet.Name)
  266. // //遍历行读取
  267. // maxRow := sheet.MaxRow
  268. // fmt.Println("maxRow:", maxRow)
  269. // fmt.Println("maxRow")
  270. // for i := 0; i < maxRow; i++ {
  271. // if i == 1 {
  272. // row := sheet.Row(i)
  273. // cells := row.Cells
  274. // if len(cells) < 6 {
  275. // br.ErrMsg = "导入文件异常,请下载最新导入模板文件"
  276. // br.Msg = "导入文件异常,请下载最新导入模板文件"
  277. // return
  278. // }
  279. // templateFail := false
  280. // if cells[0].Value != "品种分类" && cells[0].Value != "Species Category" {
  281. // templateFail = true
  282. // }
  283. // if cells[1].Value != "录入日期" && cells[1].Value != "Input Date" {
  284. // templateFail = true
  285. // }
  286. // if cells[2].Value != "指标名称" && cells[2].Value != "Indicator Name Indicator Name" {
  287. // templateFail = true
  288. // }
  289. // if cells[3].Value != "值" && cells[3].Value != "Value" {
  290. // templateFail = true
  291. // }
  292. // if cells[4].Value != "频度" && cells[4].Value != "Frequency" {
  293. // templateFail = true
  294. // }
  295. // if cells[5].Value != "单位" && cells[5].Value != "Unit" {
  296. // templateFail = true
  297. // }
  298. // if templateFail {
  299. // br.ErrMsg = "导入文件异常,请下载最新导入模板文件"
  300. // br.Msg = "导入文件异常,请下载最新导入模板文件"
  301. // return
  302. // }
  303. // }
  304. // if i > 1 {
  305. // row := sheet.Row(i)
  306. // cells := row.Cells
  307. // if len(cells) >= 6 {
  308. // classifyName := cells[0].Value //分类
  309. // if classifyName == "" { //过滤空白行
  310. // continue
  311. // }
  312. // cell1 := cells[1].Value
  313. // //createDate := utils.ConvertToFormatDay(cell1) //录入日期
  314. // createDate := cell1
  315. // cell2 := cells[2].Value //指标名称
  316. // secName := utils.TrimStr(cell2)
  317. // frequency := cells[4].Value //频度
  318. // unit := cells[5].Value //单位
  319. //
  320. // closeVal := cells[3].Value //值
  321. // if strings.Contains(closeVal, "#N/A") {
  322. // continue
  323. // }
  324. //
  325. // //校验表格中的日期格式
  326. // if strings.Contains(createDate, "-") {
  327. // //如果是带有 - 的普通日期格式文本
  328. // _, timeErr := time.Parse("2006-1-2", createDate)
  329. // if timeErr != nil {
  330. // failItem := new(models.EdbdataImportFail)
  331. // failItem.SysUserId = strconv.Itoa(sysUser.AdminId)
  332. // failItem.ClassifyName = classifyName
  333. // failItem.CreateDate = createDate
  334. // failItem.SecName = secName
  335. // failItem.Close = closeVal
  336. // failItem.Remark = "日期格式异常"
  337. // failItem.Frequency = frequency
  338. // failItem.Unit = unit
  339. // failDataList = append(failDataList, failItem)
  340. // //go utils.SendEmail(utils.APPNAME+"失败提醒", "导入数据 获取分类:Err:"+err.Error(), utils.EmailSendToUsers)
  341. // continue
  342. // }
  343. // } else if strings.Contains(createDate, "/") {
  344. // //如果是带有 / 的普通日期格式文本
  345. // createDateTime, timeErr := time.Parse("2006/1/2", createDate)
  346. // if timeErr != nil {
  347. // failItem := new(models.EdbdataImportFail)
  348. // failItem.SysUserId = strconv.Itoa(sysUser.AdminId)
  349. // failItem.ClassifyName = classifyName
  350. // failItem.CreateDate = createDate
  351. // failItem.SecName = secName
  352. // failItem.Close = closeVal
  353. // failItem.Remark = "日期格式异常"
  354. // failItem.Frequency = frequency
  355. // failItem.Unit = unit
  356. // failDataList = append(failDataList, failItem)
  357. // //go utils.SendEmail(utils.APPNAME+"失败提醒", "导入数据 获取分类:Err:"+err.Error(), utils.EmailSendToUsers)
  358. // continue
  359. // }
  360. // createDate = createDateTime.Format("2006-01-02")
  361. // } else {
  362. // //可能是excel的日期格式
  363. // _, tmpErr := strconv.Atoi(createDate)
  364. // if tmpErr != nil {
  365. // failItem := new(models.EdbdataImportFail)
  366. // failItem.SysUserId = strconv.Itoa(sysUser.AdminId)
  367. // failItem.ClassifyName = classifyName
  368. // failItem.CreateDate = createDate
  369. // failItem.SecName = secName
  370. // failItem.Close = closeVal
  371. // failItem.Remark = "日期格式异常"
  372. // failItem.Frequency = frequency
  373. // failItem.Unit = unit
  374. // failDataList = append(failDataList, failItem)
  375. // //go utils.SendEmail(utils.APPNAME+"失败提醒", "导入数据 获取分类:Err:"+err.Error(), utils.EmailSendToUsers)
  376. // continue
  377. // }
  378. // createDate = utils.ConvertToFormatDay(createDate) //录入日期
  379. // }
  380. //
  381. // closeValFloat, err := cells[3].Float() //值
  382. //
  383. // if err != nil {
  384. // failItem := new(models.EdbdataImportFail)
  385. // failItem.SysUserId = strconv.Itoa(sysUser.AdminId)
  386. // failItem.ClassifyName = classifyName
  387. // failItem.CreateDate = createDate
  388. // failItem.SecName = secName
  389. // failItem.Close = cells[3].Value
  390. // failItem.Remark = "值类型异常"
  391. // failItem.Frequency = frequency
  392. // failItem.Unit = unit
  393. // failDataList = append(failDataList, failItem)
  394. // continue
  395. // }
  396. // newDecimal := decimal.NewFromFloat(closeValFloat)
  397. // newDecimal.Round(4)
  398. // closeVal = newDecimal.String()
  399. // if strings.Contains(closeVal, "#N/A") {
  400. // continue
  401. // }
  402. // //closeVal := closeValFloat.
  403. //
  404. // //判断指标,类型,等数据是否正常
  405. // classifyName = strings.Trim(classifyName, " ")
  406. // frequency = utils.TrimStr(frequency)
  407. // unit = utils.TrimStr(unit)
  408. //
  409. // // 成功数量超过20个指标,那就不导入了
  410. // if len(targetMap) >= 150 {
  411. // failItem := new(models.EdbdataImportFail)
  412. // failItem.SysUserId = strconv.Itoa(sysUser.AdminId)
  413. // failItem.ClassifyName = classifyName
  414. // failItem.CreateDate = createDate
  415. // failItem.SecName = secName
  416. // failItem.Close = closeVal
  417. // failItem.Remark = "导入指标数量过多"
  418. // failItem.Frequency = frequency
  419. // failItem.Unit = unit
  420. // failDataList = append(failDataList, failItem)
  421. // //go utils.SendEmail(utils.APPNAME+"失败提醒", "导入数据 获取分类:Err:"+err.Error(), utils.EmailSendToUsers)
  422. // continue
  423. // }
  424. //
  425. // if !strings.Contains(strings.Join(classifyNameStrList, ","), classifyName) {
  426. // failItem := new(models.EdbdataImportFail)
  427. // failItem.SysUserId = strconv.Itoa(sysUser.AdminId)
  428. // failItem.ClassifyName = classifyName
  429. // failItem.CreateDate = createDate
  430. // failItem.SecName = secName
  431. // failItem.Close = closeVal
  432. // failItem.Remark = "没有该品种分类权限"
  433. // failItem.Frequency = frequency
  434. // failItem.Unit = unit
  435. // failDataList = append(failDataList, failItem)
  436. // continue
  437. // }
  438. // //fmt.Println(classifyName, createDate, secName, closeVal)
  439. //
  440. // //获取指标分类信息
  441. // classify, ok := edbDataClassifyMap[classifyName]
  442. // if !ok {
  443. // failItem := new(models.EdbdataImportFail)
  444. // failItem.SysUserId = strconv.Itoa(sysUser.AdminId)
  445. // failItem.ClassifyName = classifyName
  446. // failItem.CreateDate = createDate
  447. // failItem.SecName = secName
  448. // failItem.Close = closeVal
  449. // failItem.Remark = "指标分类不存在"
  450. // failItem.Frequency = frequency
  451. // failItem.Unit = unit
  452. // failDataList = append(failDataList, failItem)
  453. // //go utils.SendEmail(utils.APPNAME+"失败提醒", "导入数据 获取分类:Err:"+err.Error(), utils.EmailSendToUsers)
  454. // continue
  455. // }
  456. //
  457. // //判断指标是否存在
  458. // target, ok := targetMap[secName]
  459. // if !ok {
  460. // tmpTarget, err := models.GetTargetBySecName(secName)
  461. // if err != nil {
  462. // //如果是找不到该指标,那么新增指标
  463. // if err.Error() == utils.ErrNoRow() {
  464. // if frequency == "" {
  465. // failItem := new(models.EdbdataImportFail)
  466. // failItem.SysUserId = strconv.Itoa(sysUser.AdminId)
  467. // failItem.ClassifyName = classifyName
  468. // failItem.CreateDate = createDate
  469. // failItem.SecName = secName
  470. // failItem.Close = closeVal
  471. // failItem.Remark = "新增指标失败,频度字段为空"
  472. // failItem.Frequency = frequency
  473. // failItem.Unit = unit
  474. // failDataList = append(failDataList, failItem)
  475. // continue
  476. // }
  477. // if unit == "" {
  478. // failItem := new(models.EdbdataImportFail)
  479. // failItem.SysUserId = strconv.Itoa(sysUser.AdminId)
  480. // failItem.ClassifyName = classifyName
  481. // failItem.CreateDate = createDate
  482. // failItem.SecName = secName
  483. // failItem.Close = closeVal
  484. // failItem.Remark = "新增指标失败,单位字段为空"
  485. // failItem.Frequency = frequency
  486. // failItem.Unit = unit
  487. // failDataList = append(failDataList, failItem)
  488. // continue
  489. // }
  490. // tmpErr := data.AddEdbInfo(secName, unit, frequency, "", sysUser.Mobile, classify.ClassifyId, sysUser.AdminId)
  491. // if tmpErr != nil {
  492. // fmt.Println("line 158")
  493. // failItem := new(models.EdbdataImportFail)
  494. // failItem.SysUserId = strconv.Itoa(sysUser.AdminId)
  495. // failItem.ClassifyName = classifyName
  496. // failItem.CreateDate = createDate
  497. // failItem.SecName = secName
  498. // failItem.Close = closeVal
  499. // failItem.Remark = "新增指标失败"
  500. // failItem.Frequency = frequency
  501. // failItem.Unit = unit
  502. // failDataList = append(failDataList, failItem)
  503. // continue
  504. // }
  505. // tmpTarget, tmpErr := models.GetTargetBySecName(secName)
  506. // target = tmpTarget
  507. // targetMap[secName] = target
  508. // } else {
  509. // fmt.Println("导入数据 获取指标:Err:" + err.Error())
  510. // }
  511. // } else {
  512. // target = tmpTarget
  513. // targetMap[secName] = target
  514. // }
  515. //
  516. // //设置10分钟缓存,不允许其他地方删除
  517. // key := "import:edbinfo:data:" + target.TradeCode
  518. // utils.Rc.SetNX(key, 1, time.Second*600)
  519. // }
  520. //
  521. // if target == nil {
  522. // fmt.Println("指标不存在")
  523. // failItem := new(models.EdbdataImportFail)
  524. // failItem.SysUserId = strconv.Itoa(sysUser.AdminId)
  525. // failItem.ClassifyName = classifyName
  526. // failItem.CreateDate = createDate
  527. // failItem.SecName = secName
  528. // failItem.Close = closeVal
  529. // failItem.Remark = "指标不存在"
  530. // failItem.Frequency = frequency
  531. // failItem.Unit = unit
  532. // failDataList = append(failDataList, failItem)
  533. // continue
  534. // }
  535. //
  536. // //更新指标信息
  537. // updateCols := make([]string, 0)
  538. // //更新指标分类
  539. // if target.ClassifyId <= 0 && classify.ClassifyId > 0 {
  540. // target.ClassifyId = classify.ClassifyId
  541. // updateCols = append(updateCols, "ClassifyId")
  542. // }
  543. // if target.Frequency != frequency {
  544. // target.Frequency = frequency
  545. // target.NoticeTime = ""
  546. // updateCols = append(updateCols, "Frequency", "NoticeTime")
  547. // }
  548. // if target.Unit != unit {
  549. // target.Unit = unit
  550. // updateCols = append(updateCols, "Unit")
  551. // }
  552. // if len(updateCols) > 0 {
  553. // _ = target.Update(updateCols)
  554. // }
  555. //
  556. // // 判断指标数据列表是否已经存在
  557. // tmpDataMap, ok := edbCodeDataMap[target.TradeCode]
  558. // if !ok {
  559. // tmpDataMap = make(map[string]string)
  560. // dataList, tmpErr := models.GetTargetsDataList(target.TradeCode)
  561. // if tmpErr != nil {
  562. // go alarm_msg.SendAlarmMsg("导入数据"+target.TradeCode+" 获取指标的数据失败,Err:"+err.Error(), 3)
  563. // }
  564. // for _, tmpData := range dataList {
  565. // tmpDataMap[tmpData.Dt] = tmpData.Close
  566. // }
  567. // edbCodeDataMap[target.TradeCode] = tmpDataMap
  568. // }
  569. //
  570. // //判断数据是否已经存在
  571. // tmpVal, ok := tmpDataMap[createDate]
  572. // //数据已存在,进行更新操作
  573. // if ok {
  574. // if tmpVal != closeVal {
  575. // err = models.ModifyTargetsDataByImport(target.TradeCode, createDate, closeVal)
  576. // if err != nil {
  577. // go alarm_msg.SendAlarmMsg("导入数据 修改数据失败,Err:"+err.Error(), 3)
  578. // //go utils.SendEmail(utils.APPNAME+"失败提醒", "导入数据 修改数据失败:Err:"+err.Error(), utils.EmailSendToUsers)
  579. // }
  580. // }
  581. // } else { //数据不存在,进行新增操作
  582. // if target.TradeCode != "" && createDate != "" && closeVal != "" {
  583. // models.AddTargetsDataByImport(target.TradeCode, createDate, closeVal)
  584. // if err != nil {
  585. // go alarm_msg.SendAlarmMsg("导入数据 新增数据失败,Err:"+err.Error(), 3)
  586. // //go utils.SendEmail(utils.APPNAME+"失败提醒", "导入数据 新增数据失败:Err:"+err.Error(), utils.EmailSendToUsers)
  587. // }
  588. // tmpDataMap[createDate] = closeVal
  589. // edbCodeDataMap[target.TradeCode] = tmpDataMap
  590. // }
  591. // }
  592. // successCount++
  593. // } else {
  594. // //br.ErrMsg = "请填写导入内容"
  595. // //br.Msg = "请填写导入内容"
  596. // //return
  597. // }
  598. // }
  599. // }
  600. //}
  601. return
  602. }
  603. // ImportManualIndexData
  604. // @Description: excel模板后的内容
  605. type ImportManualIndexData struct {
  606. IndexName string `description:"指标名称"`
  607. Unit string `description:"单位"`
  608. ClassName string `description:"所属品种"`
  609. Frequency string `description:"频度"`
  610. DataMap map[string]string `description:"时间数据"`
  611. }
  612. // TODO 模板数据获取异常的结果记录
  613. // getDataByTemplate1
  614. // @Description: 根据模板1获取数据
  615. // @author: Roc
  616. // @datetime 2024-07-24 16:17:45
  617. // @param sheet *xlsx.Sheet
  618. // @return indexDataList []ImportManualIndexData
  619. // @return err error
  620. // @return errMsg string
  621. func getDataByTemplate1(sheet *xlsx.Sheet, sysUserId int) (indexDataList []ImportManualIndexData, failDataList []*models.EdbdataImportFail, err error, errMsg string) {
  622. fmt.Println("sheet name: ", sheet.Name)
  623. indexDataList = make([]ImportManualIndexData, 0)
  624. indexDataListMap := make(map[string]ImportManualIndexData, 0)
  625. failDataList = make([]*models.EdbdataImportFail, 0)
  626. //遍历行读取
  627. maxRow := sheet.MaxRow
  628. fmt.Println("maxRow:", maxRow)
  629. // 表头信息
  630. if maxRow <= 2 {
  631. errMsg = "模板异常1"
  632. err = errors.New(errMsg)
  633. return
  634. }
  635. // 表头校验
  636. {
  637. headerRow := sheet.Row(1)
  638. cells := headerRow.Cells
  639. if len(cells) < 6 {
  640. errMsg = "导入文件异常,请下载最新导入模板文件"
  641. err = errors.New(errMsg)
  642. return
  643. }
  644. templateFail := false
  645. if cells[0].Value != "品种/Variety" {
  646. templateFail = true
  647. }
  648. if cells[1].Value != "指标名称/Indicator Name" {
  649. templateFail = true
  650. }
  651. if cells[2].Value != "指标日期/Indicator Date" {
  652. templateFail = true
  653. }
  654. if cells[3].Value != "值/Value" {
  655. templateFail = true
  656. }
  657. if cells[4].Value != "频度/Frequency" {
  658. templateFail = true
  659. }
  660. if cells[5].Value != "单位/Unit" {
  661. templateFail = true
  662. }
  663. if templateFail {
  664. errMsg = "导入文件异常,请下载最新导入模板文件"
  665. err = errors.New(errMsg)
  666. return
  667. }
  668. }
  669. for i := 2; i < maxRow; i++ {
  670. row := sheet.Row(i)
  671. cells := row.Cells
  672. if len(cells) < 6 {
  673. errMsg = "导入文件异常,请下载最新导入模板文件"
  674. err = errors.New(errMsg)
  675. return
  676. }
  677. classifyName := strings.TrimSpace(cells[0].Value) //分类
  678. if classifyName == "" { //过滤空白行
  679. continue
  680. }
  681. // 指标名称
  682. cell1 := cells[1].Value
  683. indexName := strings.TrimSpace(cell1)
  684. if indexName == "" { //过滤空白行
  685. continue
  686. }
  687. //createDate := utils.ConvertToFormatDay(cell1) //录入日期
  688. createDate := cells[2].Value //指标日期
  689. frequency := strings.TrimSpace(cells[4].String()) //频度
  690. unit := strings.TrimSpace(cells[5].String()) //单位
  691. closeVal := cells[3].Value //值
  692. if strings.Contains(closeVal, "#N/A") {
  693. continue
  694. }
  695. currDate, tmpErr := getExcelDate(createDate)
  696. if tmpErr != nil {
  697. failDataList = append(failDataList, &models.EdbdataImportFail{
  698. //Id: 0,
  699. ClassifyName: classifyName,
  700. CreateDate: createDate,
  701. SecName: indexName,
  702. Close: closeVal,
  703. Remark: "日期格式异常",
  704. SysUserId: strconv.Itoa(sysUserId),
  705. Frequency: frequency,
  706. Unit: unit,
  707. })
  708. continue
  709. }
  710. closeValFloat, tmpErr := cells[3].Float() //值
  711. if tmpErr != nil {
  712. failDataList = append(failDataList, &models.EdbdataImportFail{
  713. //Id: 0,
  714. ClassifyName: classifyName,
  715. CreateDate: currDate,
  716. SecName: indexName,
  717. Close: cells[3].Value,
  718. Remark: "值类型异常",
  719. SysUserId: strconv.Itoa(sysUserId),
  720. Frequency: frequency,
  721. Unit: unit,
  722. })
  723. continue
  724. }
  725. newDecimal := decimal.NewFromFloat(closeValFloat)
  726. newDecimal.Round(4)
  727. closeVal = newDecimal.String()
  728. if strings.Contains(closeVal, "#N/A") {
  729. continue
  730. }
  731. _, ok := indexDataListMap[indexName]
  732. if !ok {
  733. indexDataListMap[indexName] = ImportManualIndexData{
  734. IndexName: indexName,
  735. Unit: unit,
  736. ClassName: classifyName,
  737. Frequency: frequency,
  738. DataMap: make(map[string]string),
  739. }
  740. }
  741. indexDataListMap[indexName].DataMap[currDate] = closeVal
  742. }
  743. for _, v := range indexDataListMap {
  744. indexDataList = append(indexDataList, v)
  745. }
  746. return
  747. }
  748. // getDataByTemplate2
  749. // @Description: 根据模板2获取数据
  750. // @author: Roc
  751. // @datetime 2024-07-24 16:17:56
  752. // @param sheet *xlsx.Sheet
  753. // @return indexDataList []ImportManualIndexData
  754. // @return err error
  755. // @return errMsg string
  756. func getDataByTemplate2(sheet *xlsx.Sheet, sysUserId int) (indexDataList []ImportManualIndexData, failDataList []*models.EdbdataImportFail, err error, errMsg string) {
  757. fmt.Println("sheet name: ", sheet.Name)
  758. indexDataList = make([]ImportManualIndexData, 0)
  759. failDataList = make([]*models.EdbdataImportFail, 0)
  760. //遍历行读取
  761. maxRow := sheet.MaxRow
  762. fmt.Println("maxRow:", maxRow)
  763. varietyList := make([]string, 0)
  764. indexNameList := make([]string, 0)
  765. unitList := make([]string, 0)
  766. frequencyList := make([]string, 0)
  767. // make(map[指标下标]map[日期]值)
  768. indexDateValueMap := make(map[int]map[string]string)
  769. // 表头信息
  770. if maxRow <= 4 {
  771. errMsg = "模板异常1"
  772. err = errors.New(errMsg)
  773. return
  774. }
  775. for i := 1; i < maxRow; i++ {
  776. row := sheet.Row(i)
  777. cells := row.Cells
  778. //if len(cells) < 1 {
  779. // errMsg = "模板异常2"
  780. // err = errors.New(errMsg)
  781. // return
  782. //}
  783. // 表头处理
  784. if i <= 4 {
  785. switch i {
  786. case 1:
  787. for k, v := range cells {
  788. if k == 0 {
  789. continue
  790. }
  791. varietyList = append(varietyList, strings.TrimSpace(v.String()))
  792. }
  793. case 2:
  794. for k, v := range cells {
  795. if k == 0 {
  796. continue
  797. }
  798. indexNameList = append(indexNameList, strings.TrimSpace(v.String()))
  799. }
  800. case 3:
  801. for k, v := range cells {
  802. if k == 0 {
  803. continue
  804. }
  805. unitList = append(unitList, strings.TrimSpace(v.String()))
  806. }
  807. case 4:
  808. for k, v := range cells {
  809. if k == 0 {
  810. continue
  811. }
  812. frequencyList = append(frequencyList, strings.TrimSpace(v.String()))
  813. }
  814. }
  815. continue
  816. }
  817. // 当前日期
  818. var currDate string
  819. // 日期是否异常,异常的话,就跳过,进入下一行数据处理
  820. var dateErr bool
  821. // 数据处理
  822. for k, v := range cells {
  823. if k == 0 {
  824. tmpCurrDate, tmpErr := getExcelDate(v.Value)
  825. if tmpErr != nil {
  826. // TODO 错误数据记录
  827. //failItem := new(models.EdbdataImportFail)
  828. //failItem.SysUserId = strconv.Itoa(sysUser.AdminId)
  829. //failItem.ClassifyName = classifyName
  830. //failItem.CreateDate = createDate
  831. //failItem.SecName = secName
  832. //failItem.Close = closeVal
  833. //failItem.Remark = "日期格式异常"
  834. //failItem.Frequency = frequency
  835. //failItem.Unit = unit
  836. //failDataList = append(failDataList, failItem)
  837. //go utils.SendEmail(utils.APPNAME+"失败提醒", "导入数据 获取分类:Err:"+err.Error(), utils.EmailSendToUsers)
  838. dateErr = true
  839. }
  840. currDate = tmpCurrDate
  841. continue
  842. }
  843. key := k - 1
  844. // 日期异常,所以不处理该行了
  845. if dateErr {
  846. varietyList[key]
  847. failDataList = append(failDataList, &models.EdbdataImportFail{
  848. //Id: 0,
  849. ClassifyName: classifyName,
  850. CreateDate: currDate,
  851. SecName: indexName,
  852. Close: cells[3].Value,
  853. Remark: "值类型异常",
  854. SysUserId: strconv.Itoa(sysUserId),
  855. Frequency: frequency,
  856. Unit: unit,
  857. })
  858. continue
  859. }
  860. _, ok := indexDateValueMap[key]
  861. if !ok {
  862. indexDateValueMap[key] = make(map[string]string)
  863. }
  864. closeVal := v.Value //值
  865. // 没有数据,说明是空串
  866. if strings.Contains(closeVal, "#N/A") {
  867. indexDateValueMap[key][currDate] = ""
  868. continue
  869. }
  870. closeValFloat, tmpErr := v.Float() //值
  871. if tmpErr != nil {
  872. // TODO 错误数据记录
  873. //failItem := new(models.EdbdataImportFail)
  874. //failItem.SysUserId = strconv.Itoa(sysUser.AdminId)
  875. //failItem.ClassifyName = classifyName
  876. //failItem.CreateDate = createDate
  877. //failItem.SecName = secName
  878. //failItem.Close = cells[3].Value
  879. //failItem.Remark = "值类型异常"
  880. //failItem.Frequency = frequency
  881. //failItem.Unit = unit
  882. //failDataList = append(failDataList, failItem)
  883. indexDateValueMap[key][currDate] = ""
  884. continue
  885. }
  886. newDecimal := decimal.NewFromFloat(closeValFloat)
  887. newDecimal.Round(4)
  888. closeVal = newDecimal.String()
  889. if strings.Contains(closeVal, "#N/A") {
  890. indexDateValueMap[key][currDate] = ""
  891. continue
  892. }
  893. indexDateValueMap[key][currDate] = closeVal
  894. }
  895. }
  896. maxUnitIndex := len(unitList) - 1
  897. maxClassNameIndex := len(varietyList) - 1
  898. maxFrequencyIndex := len(frequencyList) - 1
  899. for i, indexName := range indexNameList {
  900. var unit, classifyName, frequency string
  901. if i <= maxUnitIndex {
  902. unit = unitList[i]
  903. }
  904. if i <= maxClassNameIndex {
  905. classifyName = varietyList[i]
  906. }
  907. if i <= maxFrequencyIndex {
  908. frequency = frequencyList[i]
  909. }
  910. indexData := ImportManualIndexData{
  911. IndexName: indexName,
  912. Unit: unit,
  913. ClassName: classifyName,
  914. Frequency: frequency,
  915. DataMap: indexDateValueMap[i],
  916. }
  917. indexDataList = append(indexDataList, indexData)
  918. }
  919. return
  920. }
  921. // getExcelDate
  922. // @Description: 获取excel的日期
  923. // @author: Roc
  924. // @datetime 2024-07-23 17:26:12
  925. // @param createDate string
  926. // @return newCreateDate string
  927. // @return err error
  928. func getExcelDate(createDate string) (newCreateDate string, err error) {
  929. if strings.Contains(createDate, "-") {
  930. //如果是带有 - 的普通日期格式文本
  931. _, err = time.Parse("2006-1-2", createDate)
  932. if err == nil {
  933. newCreateDate = createDate
  934. }
  935. } else if strings.Contains(createDate, "/") {
  936. //如果是带有 / 的普通日期格式文本
  937. createDateTime, timeErr := time.Parse("2006/1/2", createDate)
  938. if timeErr != nil {
  939. err = timeErr
  940. } else {
  941. newCreateDate = createDateTime.Format("2006-01-02")
  942. }
  943. } else {
  944. //可能是excel的日期格式
  945. _, tmpErr := strconv.Atoi(createDate)
  946. if tmpErr != nil {
  947. err = tmpErr
  948. } else {
  949. newCreateDate = utils.ConvertToFormatDay(createDate) //录入日期
  950. }
  951. }
  952. return
  953. }