manual.go 27 KB

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