manual.go 29 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085
  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. // ImportManualData
  198. // @Description: 数据导入
  199. // @author: Roc
  200. // @datetime 2024-08-01 11:27:21
  201. // @param path string
  202. // @param sysUser *system.Admin
  203. // @return successCount int
  204. // @return failCount int
  205. // @return err error
  206. // @return errMsg string
  207. func ImportManualData(path string, sysUser *system.Admin) (successCount, failCount int, err error, errMsg string) {
  208. // 错误信息
  209. errMsgList := make([]string, 0)
  210. // 操作记录
  211. recordMap := make(map[string]string)
  212. defer func() {
  213. recordList := make([]*models.EdbinfoOpRecord, 0)
  214. for tradeCode, remark := range recordMap {
  215. recordList = append(recordList, &models.EdbinfoOpRecord{
  216. TradeCode: tradeCode,
  217. Remark: remark,
  218. UserId: sysUser.AdminId,
  219. UserName: sysUser.RealName,
  220. CreateTime: time.Now(),
  221. })
  222. // 修改最大最小值
  223. go ModifyManualEdbMaxMinDate(tradeCode)
  224. }
  225. if len(recordList) > 0 {
  226. go func() {
  227. obj := models.EdbinfoOpRecord{}
  228. _ = obj.MulCreate(recordList)
  229. }()
  230. }
  231. // 错误信息记录
  232. if len(errMsgList) > 0 {
  233. utils.FileLog.Info("导入失败, errMsgList: %v", strings.Join(errMsgList, "\n"))
  234. }
  235. }()
  236. errMsg = `导入失败`
  237. xlFile, err := xlsx.OpenFile(path)
  238. if err != nil {
  239. fmt.Println(err.Error())
  240. return
  241. }
  242. if len(xlFile.Sheets) <= 0 {
  243. errMsg = "导入模板异常"
  244. err = errors.New(errMsg)
  245. return
  246. }
  247. //导入失败数据
  248. failDataList := make([]*models.EdbdataImportFail, 0)
  249. var indexDataList []ImportManualIndexData
  250. // 指标名称列表
  251. indexNameList := make([]string, 0)
  252. // 模板校验,然后处理成标准化格式
  253. for _, sheet := range xlFile.Sheets {
  254. var tmpIndexDataList []ImportManualIndexData
  255. var tmpFailDataList []*models.EdbdataImportFail
  256. rowList := sheet.Rows
  257. if len(rowList) <= 0 {
  258. errMsg = sheet.Name + "页异常"
  259. err = errors.New(errMsg)
  260. return
  261. }
  262. headerCell := rowList[0].Cells
  263. if len(headerCell) < 7 {
  264. errMsg = sheet.Name + "页模板异常"
  265. err = errors.New(errMsg)
  266. return
  267. }
  268. templateName := headerCell[6].String()
  269. switch templateName {
  270. case "导入模板2/Import Template 2":
  271. // 模板2需要走对应的取数逻辑
  272. tmpIndexDataList, tmpFailDataList, err, errMsg = getDataByTemplate2(sheet, sysUser.AdminId)
  273. default:
  274. // 模板1需要走对应的取数逻辑
  275. tmpIndexDataList, tmpFailDataList, err, errMsg = getDataByTemplate1(sheet, sysUser.AdminId)
  276. }
  277. indexDataList = append(indexDataList, tmpIndexDataList...)
  278. failDataList = append(failDataList, tmpFailDataList...)
  279. }
  280. indexDataListMap := make(map[string]ImportManualIndexData)
  281. for _, v := range indexDataList {
  282. indexData, ok := indexDataListMap[v.IndexName]
  283. if !ok {
  284. // 没有就赋值
  285. indexDataListMap[v.IndexName] = v
  286. indexNameList = append(indexNameList, v.IndexName)
  287. continue
  288. }
  289. indexData.Unit = v.Unit
  290. indexData.ClassName = v.ClassName
  291. indexData.Frequency = v.Frequency
  292. indexData.DataMap = v.DataMap
  293. }
  294. if len(indexNameList) <= 0 {
  295. return
  296. }
  297. //超管账号可以查看分类下的所有频度数据
  298. userId := sysUser.AdminId
  299. if sysUser.RoleTypeCode == utils.ROLE_TYPE_CODE_ADMIN {
  300. userId = 0
  301. }
  302. //获取账户所拥有权限的分类id集合
  303. classifyNameStrList, edbDataClassifyMap, err := GetEdbClassifyNameListByAdminId(int64(userId))
  304. if err != nil {
  305. errMsg = "获取分类数据失败"
  306. return
  307. }
  308. //指标map
  309. targetMap := make(map[string]*models.Edbinfo)
  310. defer func() {
  311. for _, target := range targetMap {
  312. //结束后,清除掉对应的缓存
  313. key := "import:edbinfo:data:" + target.TradeCode
  314. utils.Rc.Delete(key)
  315. //将该指标的code加入到 “手工数据导入后刷新” 缓存
  316. if utils.Re == nil {
  317. err := utils.Rc.LPush(utils.CACHE_IMPORT_MANUAL_DATA, target.TradeCode)
  318. if err != nil {
  319. fmt.Println("CACHE_IMPORT_MANUAL_DATA LPush Err:" + err.Error())
  320. }
  321. }
  322. }
  323. }()
  324. // 所有的指标数据map
  325. edbCodeDataMap := make(map[string]map[string]string)
  326. {
  327. // 获取指标信息
  328. manualIndexList, tmpErr := models.GetEdbinfoListBySecNameList(indexNameList)
  329. if tmpErr != nil {
  330. err = tmpErr
  331. errMsg = "获取指标信息失败"
  332. return
  333. }
  334. tradeCodeList := make([]string, 0)
  335. for _, v := range manualIndexList {
  336. targetMap[v.SecName] = v
  337. tradeCodeList = append(tradeCodeList, v.TradeCode)
  338. recordMap[v.TradeCode] = "更新数据"
  339. }
  340. // 获取明细数据
  341. dataList, tmpErr := models.GetTargetsDataListByCodeList(tradeCodeList)
  342. if tmpErr != nil {
  343. err = tmpErr
  344. errMsg = "获取指标明细数据失败"
  345. return
  346. }
  347. for _, tmpData := range dataList {
  348. _, ok := edbCodeDataMap[tmpData.TradeCode]
  349. if !ok {
  350. edbCodeDataMap[tmpData.TradeCode] = make(map[string]string)
  351. }
  352. edbCodeDataMap[tmpData.TradeCode][tmpData.Dt] = tmpData.Close
  353. }
  354. }
  355. //// TODO 成功数量超过20个指标,那就不导入了
  356. //if len(targetMap) >= 150 {
  357. // failItem := new(models.EdbdataImportFail)
  358. // failItem.SysUserId = strconv.Itoa(sysUser.AdminId)
  359. // failItem.ClassifyName = classifyName
  360. // failItem.CreateDate = createDate
  361. // failItem.SecName = secName
  362. // failItem.Close = closeVal
  363. // failItem.Remark = "导入指标数量过多"
  364. // failItem.Frequency = frequency
  365. // failItem.Unit = unit
  366. // failDataList = append(failDataList, failItem)
  367. // //go utils.SendEmail(utils.APPNAME+"失败提醒", "导入数据 获取分类:Err:"+err.Error(), utils.EmailSendToUsers)
  368. // continue
  369. //}
  370. addDataList := make([]*models.Edbdata, 0)
  371. for _, v := range indexDataListMap {
  372. if len(v.DataMap) <= 0 {
  373. continue
  374. }
  375. var tmpDate, tmpValue string
  376. for date, val := range v.DataMap {
  377. tmpDate = date
  378. tmpValue = val
  379. break
  380. }
  381. if !strings.Contains(strings.Join(classifyNameStrList, ","), v.ClassName) {
  382. failItem := &models.EdbdataImportFail{
  383. ClassifyName: v.ClassName,
  384. CreateDate: tmpDate,
  385. SecName: v.IndexName,
  386. Close: tmpValue,
  387. Remark: "没有该品种分类权限",
  388. SysUserId: fmt.Sprint(sysUser.AdminId),
  389. Frequency: v.Frequency,
  390. Unit: v.Unit,
  391. }
  392. failDataList = append(failDataList, failItem)
  393. continue
  394. }
  395. //获取指标分类信息
  396. classify, ok := edbDataClassifyMap[v.ClassName]
  397. if !ok {
  398. failItem := &models.EdbdataImportFail{
  399. ClassifyName: v.ClassName,
  400. CreateDate: tmpDate,
  401. SecName: v.IndexName,
  402. Close: tmpValue,
  403. Remark: "指标分类不存在",
  404. SysUserId: fmt.Sprint(sysUser.AdminId),
  405. Frequency: v.Frequency,
  406. Unit: v.Unit,
  407. }
  408. failDataList = append(failDataList, failItem)
  409. continue
  410. }
  411. target, ok := targetMap[v.IndexName]
  412. if !ok {
  413. if v.Frequency == "" {
  414. failItem := &models.EdbdataImportFail{
  415. ClassifyName: v.ClassName,
  416. CreateDate: tmpDate,
  417. SecName: v.IndexName,
  418. Close: tmpValue,
  419. Remark: "新增指标失败,频度字段为空",
  420. SysUserId: fmt.Sprint(sysUser.AdminId),
  421. Frequency: v.Frequency,
  422. Unit: v.Unit,
  423. }
  424. failDataList = append(failDataList, failItem)
  425. continue
  426. }
  427. if v.Unit == "" {
  428. failItem := &models.EdbdataImportFail{
  429. ClassifyName: v.ClassName,
  430. CreateDate: tmpDate,
  431. SecName: v.IndexName,
  432. Close: tmpValue,
  433. Remark: "新增指标失败,单位字段为空",
  434. SysUserId: fmt.Sprint(sysUser.AdminId),
  435. Frequency: v.Frequency,
  436. Unit: v.Unit,
  437. }
  438. failDataList = append(failDataList, failItem)
  439. continue
  440. }
  441. tmpErr := AddEdbInfo(v.IndexName, v.Unit, v.Frequency, "", sysUser.Mobile, classify.ClassifyId, sysUser.AdminId, sysUser.RealName)
  442. if tmpErr != nil {
  443. fmt.Println("line 158")
  444. failItem := &models.EdbdataImportFail{
  445. ClassifyName: v.ClassName,
  446. CreateDate: tmpDate,
  447. SecName: v.IndexName,
  448. Close: tmpValue,
  449. Remark: "新增指标失败",
  450. SysUserId: fmt.Sprint(sysUser.AdminId),
  451. Frequency: v.Frequency,
  452. Unit: v.Unit,
  453. }
  454. failDataList = append(failDataList, failItem)
  455. continue
  456. }
  457. tmpTarget, tmpErr := models.GetTargetBySecName(v.IndexName)
  458. target = tmpTarget
  459. targetMap[v.IndexName] = target
  460. recordMap[target.TradeCode] = "创建指标"
  461. }
  462. if target == nil {
  463. fmt.Println("指标不存在")
  464. failItem := &models.EdbdataImportFail{
  465. ClassifyName: v.ClassName,
  466. CreateDate: tmpDate,
  467. SecName: v.IndexName,
  468. Close: tmpValue,
  469. Remark: "指标不存在",
  470. SysUserId: fmt.Sprint(sysUser.AdminId),
  471. Frequency: v.Frequency,
  472. Unit: v.Unit,
  473. }
  474. failDataList = append(failDataList, failItem)
  475. continue
  476. }
  477. //设置10分钟缓存,不允许其他地方删除
  478. key := "import:edbinfo:data:" + target.TradeCode
  479. utils.Rc.SetNX(key, 1, time.Second*600)
  480. //更新指标信息
  481. {
  482. updateCols := make([]string, 0)
  483. //更新指标分类
  484. if target.ClassifyId <= 0 && classify.ClassifyId > 0 {
  485. target.ClassifyId = classify.ClassifyId
  486. updateCols = append(updateCols, "ClassifyId")
  487. }
  488. if target.Frequency != v.Frequency {
  489. target.Frequency = v.Frequency
  490. target.NoticeTime = ""
  491. updateCols = append(updateCols, "Frequency", "NoticeTime")
  492. }
  493. if target.Unit != v.Unit {
  494. target.Unit = v.Unit
  495. updateCols = append(updateCols, "Unit")
  496. }
  497. if len(updateCols) > 0 {
  498. _ = target.Update(updateCols)
  499. }
  500. }
  501. {
  502. // 判断指标数据列表是否已经存在
  503. tmpDataMap, ok := edbCodeDataMap[target.TradeCode]
  504. if !ok {
  505. tmpDataMap = make(map[string]string)
  506. edbCodeDataMap[target.TradeCode] = tmpDataMap
  507. }
  508. for createDate, closeVal := range v.DataMap {
  509. //判断数据是否已经存在
  510. tmpVal, ok := tmpDataMap[createDate]
  511. //数据已存在,进行更新操作
  512. if ok {
  513. if tmpVal != closeVal {
  514. edbCodeDataMap[target.TradeCode][createDate] = closeVal
  515. tmpErr := models.ModifyTargetsDataByImport(target.TradeCode, createDate, closeVal)
  516. if tmpErr != nil {
  517. errMsgList = append(errMsgList, fmt.Sprintf("%s修改数据失败,日期:%s,值:%v,Err:%s", target.TradeCode, createDate, closeVal, tmpErr.Error()))
  518. }
  519. }
  520. } else { //数据不存在,进行新增操作
  521. if target.TradeCode != "" && createDate != "" && closeVal != "" {
  522. addDataList = append(addDataList, &models.Edbdata{
  523. TradeCode: target.TradeCode,
  524. Dt: createDate,
  525. Close: closeVal,
  526. ModifyTime: time.Now(),
  527. })
  528. edbCodeDataMap[target.TradeCode][createDate] = closeVal
  529. }
  530. }
  531. successCount++
  532. }
  533. }
  534. }
  535. // 批量添加明细数据
  536. if len(addDataList) > 0 {
  537. tmpErr := models.OnlyMultiAddEdbdata(addDataList)
  538. if tmpErr != nil {
  539. fmt.Println("line 221")
  540. errMsgList = append(errMsgList, fmt.Sprintf("批量添加明细数据失败,Err:%s", tmpErr.Error()))
  541. }
  542. }
  543. // 失败数量
  544. failCount = len(failDataList)
  545. //fmt.Println("failDataList:", len(failDataList))
  546. if failCount > 0 {
  547. //先删除导入失败记录
  548. _ = models.DelEdbDataImportFail(sysUser.AdminId)
  549. // 批量添加导入失败记录
  550. err = models.MultiAddEdbdataImportFail(failDataList)
  551. if err != nil {
  552. go alarm_msg.SendAlarmMsg("导入数据 新增失败记录失败,Err:"+err.Error(), 3)
  553. //go utils.SendEmail(utils.APPNAME+"失败提醒", "导入数据 新增失败记录失败:Err:"+err.Error(), utils.EmailSendToUsers)
  554. }
  555. {
  556. //错误信息字符串切片,最后作为发送邮件通知使用
  557. failContents := make([]string, 0)
  558. for _, v := range failDataList {
  559. failContents = append(failContents, fmt.Sprint(v.SecName, "导入失败:", v.Remark))
  560. }
  561. utils.FileLog.Info("导入数据 存在部分数据导入失败:" + strings.Join(failContents, ";"))
  562. //导入失败的话,最后统一邮件提醒就好啦,不需要每次都去提醒
  563. go alarm_msg.SendAlarmMsg("导入数据 存在部分数据导入失败:"+strings.Join(failContents, ";"), 3)
  564. }
  565. }
  566. return
  567. }
  568. // ImportManualIndexData
  569. // @Description: excel模板后的内容
  570. type ImportManualIndexData struct {
  571. IndexName string `description:"指标名称"`
  572. Unit string `description:"单位"`
  573. ClassName string `description:"所属品种"`
  574. Frequency string `description:"频度"`
  575. DataMap map[string]string `description:"时间数据"`
  576. }
  577. // getDataByTemplate1
  578. // @Description: 根据模板1获取数据
  579. // @author: Roc
  580. // @datetime 2024-07-24 16:17:45
  581. // @param sheet *xlsx.Sheet
  582. // @return indexDataList []ImportManualIndexData
  583. // @return err error
  584. // @return errMsg string
  585. func getDataByTemplate1(sheet *xlsx.Sheet, sysUserId int) (indexDataList []ImportManualIndexData, failDataList []*models.EdbdataImportFail, err error, errMsg string) {
  586. fmt.Println("sheet name: ", sheet.Name)
  587. indexDataList = make([]ImportManualIndexData, 0)
  588. indexDataListMap := make(map[string]ImportManualIndexData, 0)
  589. failDataList = make([]*models.EdbdataImportFail, 0)
  590. //遍历行读取
  591. maxRow := sheet.MaxRow
  592. fmt.Println("maxRow:", maxRow)
  593. // 表头信息
  594. if maxRow <= 2 {
  595. errMsg = "模板异常1"
  596. err = errors.New(errMsg)
  597. return
  598. }
  599. // 表头校验
  600. {
  601. headerRow := sheet.Row(1)
  602. cells := headerRow.Cells
  603. if len(cells) < 6 {
  604. errMsg = "导入文件异常,请下载最新导入模板文件"
  605. err = errors.New(errMsg)
  606. return
  607. }
  608. templateFail := false
  609. if cells[0].Value != "品种/Variety" {
  610. templateFail = true
  611. }
  612. if cells[1].Value != "指标名称/Indicator Name" {
  613. templateFail = true
  614. }
  615. if cells[2].Value != "指标日期/Indicator Date" {
  616. templateFail = true
  617. }
  618. if cells[3].Value != "值/Value" {
  619. templateFail = true
  620. }
  621. if cells[4].Value != "频度/Frequency" {
  622. templateFail = true
  623. }
  624. if cells[5].Value != "单位/Unit" {
  625. templateFail = true
  626. }
  627. if templateFail {
  628. errMsg = "导入文件异常,请下载最新导入模板文件"
  629. err = errors.New(errMsg)
  630. return
  631. }
  632. }
  633. for i := 2; i < maxRow; i++ {
  634. row := sheet.Row(i)
  635. cells := row.Cells
  636. if len(cells) < 6 {
  637. errMsg = "导入文件异常,请下载最新导入模板文件"
  638. err = errors.New(errMsg)
  639. return
  640. }
  641. classifyName := strings.TrimSpace(cells[0].Value) //分类
  642. if classifyName == "" { //过滤空白行
  643. continue
  644. }
  645. // 指标名称
  646. cell1 := cells[1].Value
  647. indexName := strings.TrimSpace(cell1)
  648. if indexName == "" { //过滤空白行
  649. continue
  650. }
  651. //createDate := utils.ConvertToFormatDay(cell1) //录入日期
  652. createDate := cells[2].Value //指标日期
  653. frequency := strings.TrimSpace(cells[4].String()) //频度
  654. unit := strings.TrimSpace(cells[5].String()) //单位
  655. closeVal := cells[3].Value //值
  656. if strings.Contains(closeVal, "#N/A") {
  657. continue
  658. }
  659. currDate, tmpErr := getExcelDate(createDate)
  660. if tmpErr != nil {
  661. failDataList = append(failDataList, &models.EdbdataImportFail{
  662. //Id: 0,
  663. ClassifyName: classifyName,
  664. CreateDate: createDate,
  665. SecName: indexName,
  666. Close: closeVal,
  667. Remark: "日期格式异常",
  668. SysUserId: strconv.Itoa(sysUserId),
  669. Frequency: frequency,
  670. Unit: unit,
  671. })
  672. continue
  673. }
  674. closeValFloat, tmpErr := cells[3].Float() //值
  675. if tmpErr != nil {
  676. failDataList = append(failDataList, &models.EdbdataImportFail{
  677. //Id: 0,
  678. ClassifyName: classifyName,
  679. CreateDate: currDate,
  680. SecName: indexName,
  681. Close: cells[3].Value,
  682. Remark: "值类型异常",
  683. SysUserId: strconv.Itoa(sysUserId),
  684. Frequency: frequency,
  685. Unit: unit,
  686. })
  687. continue
  688. }
  689. newDecimal := decimal.NewFromFloat(closeValFloat)
  690. newDecimal.Round(4)
  691. closeVal = newDecimal.String()
  692. if strings.Contains(closeVal, "#N/A") {
  693. continue
  694. }
  695. _, ok := indexDataListMap[indexName]
  696. if !ok {
  697. indexDataListMap[indexName] = ImportManualIndexData{
  698. IndexName: indexName,
  699. Unit: unit,
  700. ClassName: classifyName,
  701. Frequency: frequency,
  702. DataMap: make(map[string]string),
  703. }
  704. }
  705. indexDataListMap[indexName].DataMap[currDate] = closeVal
  706. }
  707. for _, v := range indexDataListMap {
  708. indexDataList = append(indexDataList, v)
  709. }
  710. return
  711. }
  712. // getDataByTemplate2
  713. // @Description: 根据模板2获取数据
  714. // @author: Roc
  715. // @datetime 2024-07-24 16:17:56
  716. // @param sheet *xlsx.Sheet
  717. // @return indexDataList []ImportManualIndexData
  718. // @return err error
  719. // @return errMsg string
  720. func getDataByTemplate2(sheet *xlsx.Sheet, sysUserId int) (indexDataList []ImportManualIndexData, failDataList []*models.EdbdataImportFail, err error, errMsg string) {
  721. fmt.Println("sheet name: ", sheet.Name)
  722. indexDataList = make([]ImportManualIndexData, 0)
  723. failDataList = make([]*models.EdbdataImportFail, 0)
  724. //遍历行读取
  725. maxRow := sheet.MaxRow
  726. fmt.Println("maxRow:", maxRow)
  727. varietyList := make([]string, 0)
  728. indexNameList := make([]string, 0)
  729. unitList := make([]string, 0)
  730. frequencyList := make([]string, 0)
  731. // make(map[指标下标]map[日期]值)
  732. indexDateValueMap := make(map[int]map[string]string)
  733. // 表头信息
  734. if maxRow <= 4 {
  735. errMsg = "模板异常1"
  736. err = errors.New(errMsg)
  737. return
  738. }
  739. // 表头处理
  740. for i := 1; i <= 4; i++ {
  741. row := sheet.Row(i)
  742. cells := row.Cells
  743. //if len(cells) < 1 {
  744. // errMsg = "模板异常2"
  745. // err = errors.New(errMsg)
  746. // return
  747. //}
  748. switch i {
  749. case 1:
  750. for k, v := range cells {
  751. if k == 0 {
  752. continue
  753. }
  754. varietyList = append(varietyList, strings.TrimSpace(v.String()))
  755. }
  756. case 2:
  757. for k, v := range cells {
  758. if k == 0 {
  759. continue
  760. }
  761. indexNameList = append(indexNameList, strings.TrimSpace(v.String()))
  762. }
  763. case 3:
  764. for k, v := range cells {
  765. if k == 0 {
  766. continue
  767. }
  768. unitList = append(unitList, strings.TrimSpace(v.String()))
  769. }
  770. case 4:
  771. for k, v := range cells {
  772. if k == 0 {
  773. continue
  774. }
  775. frequencyList = append(frequencyList, strings.TrimSpace(v.String()))
  776. }
  777. }
  778. }
  779. maxNameIndex := len(indexNameList) - 1
  780. maxUnitIndex := len(unitList) - 1
  781. maxClassNameIndex := len(varietyList) - 1
  782. maxFrequencyIndex := len(frequencyList) - 1
  783. // 数据处理
  784. for i := 5; i < maxRow; i++ {
  785. row := sheet.Row(i)
  786. cells := row.Cells
  787. //if len(cells) < 1 {
  788. // errMsg = "模板异常2"
  789. // err = errors.New(errMsg)
  790. // return
  791. //}
  792. // 当前日期
  793. var currDate string
  794. // 日期是否异常,异常的话,就跳过,进入下一行数据处理
  795. var dateErr bool
  796. // 数据处理
  797. for k, v := range cells {
  798. if k == 0 {
  799. tmpCurrDate, tmpErr := getExcelDate(v.Value)
  800. if tmpErr != nil {
  801. // TODO 错误数据记录
  802. //failItem := new(models.EdbdataImportFail)
  803. //failItem.SysUserId = strconv.Itoa(sysUser.AdminId)
  804. //failItem.ClassifyName = classifyName
  805. //failItem.CreateDate = createDate
  806. //failItem.SecName = secName
  807. //failItem.Close = closeVal
  808. //failItem.Remark = "日期格式异常"
  809. //failItem.Frequency = frequency
  810. //failItem.Unit = unit
  811. //failDataList = append(failDataList, failItem)
  812. //go utils.SendEmail(utils.APPNAME+"失败提醒", "导入数据 获取分类:Err:"+err.Error(), utils.EmailSendToUsers)
  813. dateErr = true
  814. }
  815. currDate = tmpCurrDate
  816. continue
  817. }
  818. key := k - 1
  819. // 日期异常,所以不处理该行了
  820. if dateErr {
  821. var indexName, unit, classifyName, frequency string
  822. if key <= maxNameIndex {
  823. indexName = indexNameList[key]
  824. }
  825. if key <= maxUnitIndex {
  826. unit = unitList[key]
  827. }
  828. if key <= maxClassNameIndex {
  829. classifyName = varietyList[key]
  830. }
  831. if key <= maxFrequencyIndex {
  832. frequency = frequencyList[key]
  833. }
  834. failDataList = append(failDataList, &models.EdbdataImportFail{
  835. //Id: 0,
  836. ClassifyName: classifyName,
  837. CreateDate: currDate,
  838. SecName: indexName,
  839. Close: v.Value,
  840. Remark: "日期格式异常",
  841. SysUserId: strconv.Itoa(sysUserId),
  842. Frequency: frequency,
  843. Unit: unit,
  844. })
  845. continue
  846. }
  847. _, ok := indexDateValueMap[key]
  848. if !ok {
  849. indexDateValueMap[key] = make(map[string]string)
  850. }
  851. closeVal := v.Value //值
  852. // 没有数据,说明是空串
  853. if strings.Contains(closeVal, "#N/A") {
  854. indexDateValueMap[key][currDate] = ""
  855. continue
  856. }
  857. closeValFloat, tmpErr := v.Float() //值
  858. if tmpErr != nil {
  859. // TODO 错误数据记录
  860. //failItem := new(models.EdbdataImportFail)
  861. //failItem.SysUserId = strconv.Itoa(sysUser.AdminId)
  862. //failItem.ClassifyName = classifyName
  863. //failItem.CreateDate = createDate
  864. //failItem.SecName = secName
  865. //failItem.Close = cells[3].Value
  866. //failItem.Remark = "值类型异常"
  867. //failItem.Frequency = frequency
  868. //failItem.Unit = unit
  869. //failDataList = append(failDataList, failItem)
  870. indexDateValueMap[key][currDate] = ""
  871. continue
  872. }
  873. newDecimal := decimal.NewFromFloat(closeValFloat)
  874. newDecimal.Round(4)
  875. closeVal = newDecimal.String()
  876. if strings.Contains(closeVal, "#N/A") {
  877. indexDateValueMap[key][currDate] = ""
  878. continue
  879. }
  880. indexDateValueMap[key][currDate] = closeVal
  881. }
  882. }
  883. for i, indexName := range indexNameList {
  884. var unit, classifyName, frequency string
  885. if i <= maxUnitIndex {
  886. unit = unitList[i]
  887. }
  888. if i <= maxClassNameIndex {
  889. classifyName = varietyList[i]
  890. }
  891. if i <= maxFrequencyIndex {
  892. frequency = frequencyList[i]
  893. }
  894. indexData := ImportManualIndexData{
  895. IndexName: indexName,
  896. Unit: unit,
  897. ClassName: classifyName,
  898. Frequency: frequency,
  899. DataMap: indexDateValueMap[i],
  900. }
  901. indexDataList = append(indexDataList, indexData)
  902. }
  903. return
  904. }
  905. // getExcelDate
  906. // @Description: 获取excel的日期
  907. // @author: Roc
  908. // @datetime 2024-07-23 17:26:12
  909. // @param createDate string
  910. // @return newCreateDate string
  911. // @return err error
  912. func getExcelDate(createDate string) (newCreateDate string, err error) {
  913. if strings.Contains(createDate, "-") {
  914. //如果是带有 - 的普通日期格式文本
  915. _, err = time.Parse("2006-1-2", createDate)
  916. if err == nil {
  917. newCreateDate = createDate
  918. }
  919. } else if strings.Contains(createDate, "/") {
  920. //如果是带有 / 的普通日期格式文本
  921. createDateTime, timeErr := time.Parse("2006/1/2", createDate)
  922. if timeErr != nil {
  923. err = timeErr
  924. } else {
  925. newCreateDate = createDateTime.Format("2006-01-02")
  926. }
  927. } else {
  928. //可能是excel的日期格式
  929. _, tmpErr := strconv.Atoi(createDate)
  930. if tmpErr != nil {
  931. err = tmpErr
  932. } else {
  933. newCreateDate = utils.ConvertToFormatDay(createDate) //录入日期
  934. }
  935. }
  936. return
  937. }
  938. // ModifyManualEdbMaxMinDate
  939. // @Description: 修改手动录入的edb数据的最大最小日期
  940. // @author: Roc
  941. // @datetime 2024-08-01 15:34:31
  942. // @param tradeCode string
  943. func ModifyManualEdbMaxMinDate(tradeCode string) {
  944. // 获取最大最小日期
  945. item, err := models.GetEdbdataMaxMinDate(tradeCode)
  946. if err != nil {
  947. return
  948. }
  949. // 最新值
  950. latestValue, err := models.GetEdbdataLatestValue(tradeCode)
  951. if err != nil {
  952. return
  953. }
  954. // 修改指标的最大最小日期和最新值
  955. err = models.ModifyEdbinfoMaxMinDate(tradeCode, item.MinDate, item.MaxDate, latestValue)
  956. return
  957. }
  958. // GetUserManualClassifyIdList
  959. // @Description: 获取用户手动录入的分类id列表
  960. // @author: Roc
  961. // @datetime 2024-08-02 15:09:11
  962. // @param userId int
  963. // @return classifyIdList []int
  964. // @return err error
  965. func GetUserManualClassifyIdList(userId int) (classifyIdList []int, err error) {
  966. classifyIdList = make([]int, 0)
  967. // 获取有用权限的分类
  968. classifyList, err := models.GetEdbdataClassify(int64(userId))
  969. if err != nil {
  970. return
  971. }
  972. if len(classifyList) > 0 {
  973. for _, v := range classifyList {
  974. classifyIdList = append(classifyIdList, v.ClassifyId)
  975. if v.Child != nil && len(v.Child) > 0 {
  976. for _, v2 := range v.Child {
  977. classifyIdList = append(classifyIdList, v2.ClassifyId)
  978. }
  979. }
  980. }
  981. }
  982. return
  983. }