resource.go 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820
  1. package knowledge
  2. import (
  3. "errors"
  4. "eta_gn/eta_api/models"
  5. "eta_gn/eta_api/models/knowledge"
  6. "eta_gn/eta_api/models/system"
  7. "eta_gn/eta_api/services"
  8. "eta_gn/eta_api/services/alarm_msg"
  9. "eta_gn/eta_api/utils"
  10. "fmt"
  11. "github.com/tealeg/xlsx"
  12. "html"
  13. "strconv"
  14. "strings"
  15. "time"
  16. )
  17. func AddResource(req *knowledge.AddReq, sysUser *system.Admin) (item *knowledge.KnowledgeResource, err error, errMsg string) {
  18. var startTime time.Time
  19. var endTime time.Time
  20. if req.StartTime != "" {
  21. startTime, err = time.ParseInLocation(utils.FormatDateTime, req.StartTime, time.Local)
  22. if err != nil { // 如果时间格式不正确,则返回错误信息
  23. errMsg = "开始时间格式不正确"
  24. err = fmt.Errorf("开始时间格式不正确,Err:" + err.Error())
  25. return
  26. }
  27. }
  28. if req.EndTime != "" {
  29. endTime, err = time.ParseInLocation(utils.FormatDateTime, req.EndTime, time.Local)
  30. if err != nil { // 如果时间格式不正确,则返回错误信息
  31. errMsg = "结束时间格式不正确"
  32. err = fmt.Errorf("结束时间格式不正确,Err:" + err.Error())
  33. return
  34. }
  35. }
  36. if req.Content != "" {
  37. e := utils.ContentXssCheck(req.Content)
  38. if e != nil {
  39. errMsg = "存在非法标签"
  40. err = fmt.Errorf("存在非法标签, Err: " + e.Error())
  41. return
  42. }
  43. content, e := services.FilterReportContentBr(req.Content)
  44. if e != nil {
  45. errMsg = "内容去除前后空格失败"
  46. err = fmt.Errorf("内容去除前后空格失败, Err: " + e.Error())
  47. return
  48. }
  49. req.Content = content
  50. /*contentSub, err = services.GetReportContentSub(req.Content)
  51. if err != nil {
  52. go alarm_msg.SendAlarmMsg("ContentSub 失败,Err:"+err.Error(), 3)
  53. //utils.SendEmail(utils.APPNAME+"失败提醒", "解析 ContentSub 失败,Err:"+err.Error(), utils.EmailSendToUsers)
  54. return
  55. }*/
  56. }
  57. classifyObj := new(knowledge.KnowledgeClassify)
  58. classifyItem, err := classifyObj.GetClassifyById(req.ClassifyId)
  59. if err != nil {
  60. if utils.IsErrNoRow(err) {
  61. err = fmt.Errorf("分类不存在,Err:" + err.Error())
  62. errMsg = "分类不存在"
  63. return
  64. }
  65. errMsg = "获取分类失败"
  66. err = fmt.Errorf("获取分类失败,Err:" + err.Error())
  67. return
  68. }
  69. if req.ClassifyId != classifyItem.ClassifyId { // 如果传进来的分类id和数据库中查到的分类id不一致,说明传进来的分类id是错误的
  70. errMsg = "错误分类"
  71. err = fmt.Errorf("错误分类")
  72. return
  73. }
  74. // todo 校验标签
  75. item = new(knowledge.KnowledgeResource)
  76. item.ClassifyId = req.ClassifyId
  77. item.TagId = req.TagId
  78. item.SourceFrom = req.SourceFrom
  79. item.ResourceType = req.ResourceType
  80. item.Title = req.Title
  81. item.State = 1
  82. item.Content = html.EscapeString(req.Content)
  83. timestamp := strconv.FormatInt(time.Now().UnixNano(), 10)
  84. item.ResourceCode = utils.MD5(utils.CHART_PREFIX + "_" + timestamp)
  85. //todo 内容前5行
  86. //item.ContentSub = html.EscapeString(contentSub)
  87. if !startTime.IsZero() {
  88. item.StartTime = &startTime
  89. } else {
  90. item.StartTime = nil
  91. }
  92. if !endTime.IsZero() {
  93. item.EndTime = &endTime
  94. } else {
  95. item.EndTime = nil
  96. }
  97. item.ModifyTime = time.Now()
  98. item.AdminId = sysUser.AdminId
  99. item.AdminRealName = sysUser.RealName
  100. //item.LastModifyAdminId = sysUser.AdminId
  101. //item.LastModifyAdminName = sysUser.RealName
  102. item.ModifyTime = time.Now()
  103. item.CreateTime = time.Now()
  104. err = item.Add(item)
  105. if err != nil {
  106. errMsg = "保存失败"
  107. err = fmt.Errorf("保存失败,Err:" + err.Error())
  108. return
  109. }
  110. //todo 是否需要保存到es中
  111. return
  112. }
  113. func EditResource(resourceInfo *knowledge.KnowledgeResource, req knowledge.EditReq, sysUser *system.Admin) (err error, errMsg string) {
  114. errMsg = `保存失败`
  115. var startTime time.Time
  116. var endTime time.Time
  117. if req.StartTime != "" {
  118. startTime, err = time.ParseInLocation(utils.FormatDateTime, req.StartTime, time.Local)
  119. if err != nil { // 如果时间格式不正确,则返回错误信息
  120. errMsg = "开始时间格式不正确"
  121. err = fmt.Errorf("开始时间格式不正确,Err:" + err.Error())
  122. return
  123. }
  124. }
  125. if req.EndTime != "" {
  126. endTime, err = time.ParseInLocation(utils.FormatDateTime, req.EndTime, time.Local)
  127. if err != nil { // 如果时间格式不正确,则返回错误信息
  128. errMsg = "结束时间格式不正确"
  129. err = fmt.Errorf("结束时间格式不正确,Err:" + err.Error())
  130. return
  131. }
  132. }
  133. if req.Content != "" {
  134. e := utils.ContentXssCheck(req.Content)
  135. if e != nil {
  136. errMsg = "存在非法标签"
  137. err = fmt.Errorf("存在非法标签, Err: " + e.Error())
  138. return
  139. }
  140. content, e := services.FilterReportContentBr(req.Content)
  141. if e != nil {
  142. errMsg = "内容去除前后空格失败"
  143. err = fmt.Errorf("内容去除前后空格失败, Err: " + e.Error())
  144. return
  145. }
  146. req.Content = content
  147. /*contentSub, err = services.GetReportContentSub(req.Content)
  148. if err != nil {
  149. go alarm_msg.SendAlarmMsg("ContentSub 失败,Err:"+err.Error(), 3)
  150. //utils.SendEmail(utils.APPNAME+"失败提醒", "解析 ContentSub 失败,Err:"+err.Error(), utils.EmailSendToUsers)
  151. return
  152. }*/
  153. }
  154. classifyObj := new(knowledge.KnowledgeClassify)
  155. classifyItem, err := classifyObj.GetClassifyById(req.ClassifyId)
  156. if err != nil {
  157. if utils.IsErrNoRow(err) {
  158. err = fmt.Errorf("分类不存在,Err:" + err.Error())
  159. errMsg = "分类不存在"
  160. return
  161. }
  162. errMsg = "获取分类失败"
  163. err = fmt.Errorf("获取分类失败,Err:" + err.Error())
  164. return
  165. }
  166. if req.ClassifyId != classifyItem.ClassifyId { // 如果传进来的分类id和数据库中查到的分类id不一致,说明传进来的分类id是错误的
  167. errMsg = "错误分类"
  168. err = fmt.Errorf("错误分类")
  169. return
  170. }
  171. resourceInfo.ClassifyId = req.ClassifyId
  172. resourceInfo.SourceFrom = req.SourceFrom
  173. resourceInfo.TagId = req.TagId
  174. resourceInfo.Title = req.Title
  175. resourceInfo.Content = html.EscapeString(req.Content)
  176. if !startTime.IsZero() {
  177. resourceInfo.StartTime = &startTime
  178. }
  179. if !endTime.IsZero() {
  180. resourceInfo.EndTime = &endTime
  181. }
  182. //resourceInfo.LastModifyAdminId = sysUser.AdminId
  183. //resourceInfo.LastModifyAdminName = sysUser.RealName
  184. resourceInfo.ModifyTime = time.Now()
  185. updateCols := []string{"ClassifyId", "SourceFrom", "TagId", "Title", "Content", "StartTime", "EndTime", "ModifyTime"}
  186. // 修改报告的基本信息,以及报告的授权用户
  187. err = resourceInfo.Update(updateCols)
  188. if err != nil {
  189. return
  190. }
  191. return
  192. }
  193. // ImportResourceData
  194. // @Description: 数据导入
  195. // @author: Roc
  196. // @datetime 2024-08-01 11:27:21
  197. // @param path string
  198. // @param sysUser *system.Admin
  199. // @return successCount int
  200. // @return failCount int
  201. // @return err error
  202. // @return errMsg string
  203. func ImportResourceData(path string, resourceType int, sysUser *system.Admin) (successCount, failCount int, err error, errMsg string) {
  204. // 错误信息
  205. errMsgList := make([]string, 0)
  206. // 操作记录
  207. recordMap := make(map[string]string)
  208. defer func() {
  209. recordList := make([]*models.EdbinfoOpRecord, 0)
  210. for tradeCode, remark := range recordMap {
  211. recordList = append(recordList, &models.EdbinfoOpRecord{
  212. TradeCode: tradeCode,
  213. Remark: remark,
  214. UserId: sysUser.AdminId,
  215. UserName: sysUser.RealName,
  216. CreateTime: time.Now(),
  217. })
  218. }
  219. if len(recordList) > 0 {
  220. go func() {
  221. obj := models.EdbinfoOpRecord{}
  222. _ = obj.MulCreate(recordList)
  223. }()
  224. }
  225. // 错误信息记录
  226. if len(errMsgList) > 0 {
  227. utils.FileLog.Info("导入失败, errMsgList: %v", strings.Join(errMsgList, "\n"))
  228. }
  229. }()
  230. errMsg = `导入失败`
  231. xlFile, err := xlsx.OpenFile(path)
  232. if err != nil {
  233. fmt.Println(err.Error())
  234. return
  235. }
  236. if len(xlFile.Sheets) <= 0 {
  237. errMsg = "导入模板异常"
  238. err = errors.New(errMsg)
  239. return
  240. }
  241. //导入失败数据
  242. failDataList := make([]*knowledge.KnowledgeImportFail, 0)
  243. var indexDataList []knowledge.ResourceImportData
  244. // 模板校验,然后处理成标准化格式
  245. for _, sheet := range xlFile.Sheets {
  246. var tmpFailDataList []*knowledge.KnowledgeImportFail
  247. var tmpIndexDataList []knowledge.ResourceImportData
  248. rowList := sheet.Rows
  249. if len(rowList) <= 0 {
  250. errMsg = sheet.Name + "页异常"
  251. err = errors.New(errMsg)
  252. return
  253. }
  254. templateType := 1 // 模板类型
  255. minCellNum := 6 // 模板最小列数
  256. headerCell := rowList[0].Cells
  257. // 确定模板
  258. for _, v := range headerCell {
  259. if v.String() == "导入模板2/Import Template 2" {
  260. templateType = 2
  261. minCellNum = 2
  262. break
  263. }
  264. }
  265. // 如果小于最少列数,则报错
  266. if len(headerCell) < minCellNum {
  267. errMsg = sheet.Name + "页模板异常"
  268. err = errors.New(errMsg)
  269. return
  270. }
  271. tmpIndexDataList, tmpFailDataList, err, errMsg = getDataByTemplateEvent(sheet, sysUser.AdminId, templateType)
  272. if err != nil {
  273. return
  274. }
  275. fmt.Println("tmpIndexDataList: ", tmpIndexDataList)
  276. fmt.Println("tmpFailDataList: ", tmpFailDataList)
  277. indexDataList = append(indexDataList, tmpIndexDataList...)
  278. failDataList = append(failDataList, tmpFailDataList...)
  279. }
  280. if len(indexDataList) <= 0 {
  281. if len(failDataList) > 0 {
  282. errMsg = failDataList[0].Remark
  283. err = errors.New(errMsg)
  284. }
  285. return
  286. }
  287. // 遍历获取所有分类
  288. classifyNames := make([]string, 0)
  289. for _, v := range indexDataList {
  290. if v.ClassifyFirstName != "" {
  291. classifyNames = append(classifyNames, v.ClassifyFirstName)
  292. }
  293. if v.ClassifySecondName != "" {
  294. classifyNames = append(classifyNames, v.ClassifySecondName)
  295. }
  296. if v.ClassifyThirdName != "" {
  297. classifyNames = append(classifyNames, v.ClassifyThirdName)
  298. }
  299. }
  300. fmt.Println(classifyNames)
  301. classifyList, err := knowledge.GetFullClassifyListByName(classifyNames)
  302. if err != nil {
  303. err = fmt.Errorf("获取分类数据失败 Err: %s", err.Error())
  304. errMsg = "获取分类数据失败"
  305. return
  306. }
  307. classifyNameMap := make(map[string]int)
  308. for _, v := range classifyList {
  309. name := fmt.Sprintf("%s/%s/%s", v.RootName, v.ParentName, v.ClassifyName)
  310. classifyNameMap[name] = v.ClassifyId
  311. }
  312. // todo 获取所有tag
  313. //tagNameMap := make(map[string]int)
  314. //// TODO 成功数量超过20个指标,那就不导入了
  315. /* if len(targetMap) >= 100 {
  316. failItem := new(knowledge.KnowledgeImportFail)
  317. failItem.SysUserId = strconv.Itoa(sysUser.AdminId)
  318. failItem.ClassifyName = classifyName
  319. failItem.CreateDate = createDate
  320. failItem.SecName = secName
  321. failItem.Close = closeVal
  322. failItem.Remark = "导入指标数量过多"
  323. failItem.Frequency = frequency
  324. failItem.Unit = unit
  325. failDataList = append(failDataList, failItem)
  326. //go utils.SendEmail(utils.APPNAME+"失败提醒", "导入数据 获取分类:Err:"+err.Error(), utils.EmailSendToUsers)
  327. continue
  328. }*/
  329. for _, v := range indexDataList {
  330. // 判断分类是否存在
  331. classifyName := fmt.Sprintf("%s/%s/%s", v.ClassifyFirstName, v.ClassifySecondName, v.ClassifyThirdName)
  332. fmt.Println("classifyName: ", classifyName)
  333. classifyId, ok := classifyNameMap[classifyName]
  334. if !ok {
  335. failItem := &knowledge.KnowledgeImportFail{
  336. Title: v.Title,
  337. Content: v.Content,
  338. SourceFrom: v.SourceFrom,
  339. ClassifyFirst: v.ClassifyFirstName,
  340. ClassifySecond: v.ClassifySecondName,
  341. ClassifyThird: v.ClassifyThirdName,
  342. ResourceType: resourceType,
  343. StartDate: v.StartDate,
  344. EndDate: v.EndDate,
  345. StartTime: v.StartTime,
  346. EndTime: v.EndTime,
  347. Remark: "指标分类不存在",
  348. SysUserId: fmt.Sprint(sysUser.AdminId),
  349. CreateTime: time.Now(),
  350. }
  351. failDataList = append(failDataList, failItem)
  352. continue
  353. }
  354. //todo 处理tag信息
  355. /*tagId, ok := tagNameMap[v.Tag]
  356. if !ok {
  357. failItem := &knowledge.KnowledgeImportFail{
  358. Title: v.Title,
  359. Content: v.Content,
  360. SourceFrom: v.SourceFrom,
  361. ClassifyFirst: v.ClassifyFirstName,
  362. ClassifySecond: v.ClassifySecondName,
  363. ClassifyThird: v.ClassifyThirdName,
  364. ResourceType: resourceType,
  365. StartDate: v.StartDate,
  366. EndDate: v.EndDate,
  367. StartTime: v.StartTime,
  368. EndTime: v.EndTime,
  369. Remark: "标签不存在",
  370. SysUserId: fmt.Sprint(sysUser.AdminId),
  371. CreateTime: time.Now(),
  372. }
  373. failDataList = append(failDataList, failItem)
  374. continue
  375. }*/
  376. req := new(knowledge.AddReq)
  377. req.Title = v.Title
  378. req.Content = v.Content
  379. req.SourceFrom = v.SourceFrom
  380. req.ClassifyId = classifyId
  381. //req.TagId = tagId
  382. req.ResourceType = resourceType
  383. if v.StartDate != "" {
  384. req.StartTime = fmt.Sprintf("%s %s", v.StartDate, v.StartTime)
  385. }
  386. if v.EndDate != "" {
  387. req.EndTime = fmt.Sprintf("%s %s", v.EndDate, v.EndTime)
  388. }
  389. tmpErr, msg := addExcelResource(req, sysUser)
  390. if tmpErr != nil {
  391. failItem := &knowledge.KnowledgeImportFail{
  392. Title: v.Title,
  393. Content: v.Content,
  394. SourceFrom: v.SourceFrom,
  395. ClassifyFirst: v.ClassifyFirstName,
  396. ClassifySecond: v.ClassifySecondName,
  397. ClassifyThird: v.ClassifyThirdName,
  398. ResourceType: resourceType,
  399. StartDate: v.StartDate,
  400. EndDate: v.EndDate,
  401. StartTime: v.StartTime,
  402. EndTime: v.EndTime,
  403. Remark: "新增事件失败:" + msg,
  404. SysUserId: fmt.Sprint(sysUser.AdminId),
  405. CreateTime: time.Now(),
  406. }
  407. failDataList = append(failDataList, failItem)
  408. continue
  409. } else {
  410. successCount++
  411. }
  412. }
  413. // 失败数量
  414. failCount = len(failDataList)
  415. //fmt.Println("failDataList:", len(failDataList))
  416. if failCount > 0 {
  417. failObj := new(knowledge.KnowledgeImportFail)
  418. //先删除导入失败记录
  419. _ = failObj.Delete(sysUser.AdminId)
  420. // 批量添加导入失败记录
  421. err = failObj.MultiAdd(failDataList)
  422. if err != nil {
  423. go alarm_msg.SendAlarmMsg("导入数据 新增失败记录失败,Err:"+err.Error(), 3)
  424. //go utils.SendEmail(utils.APPNAME+"失败提醒", "导入数据 新增失败记录失败:Err:"+err.Error(), utils.EmailSendToUsers)
  425. }
  426. {
  427. //错误信息字符串切片,最后作为发送邮件通知使用
  428. failContents := make([]string, 0)
  429. for _, v := range failDataList {
  430. failContents = append(failContents, fmt.Sprint(v.Title, "导入失败:", v.Remark))
  431. }
  432. utils.FileLog.Info("导入数据 存在部分数据导入失败:" + strings.Join(failContents, ";"))
  433. //导入失败的话,最后统一邮件提醒就好啦,不需要每次都去提醒
  434. go alarm_msg.SendAlarmMsg("导入数据 存在部分数据导入失败:"+strings.Join(failContents, ";"), 3)
  435. }
  436. }
  437. return
  438. }
  439. // getDataByTemplateEvent
  440. func getDataByTemplateEvent(sheet *xlsx.Sheet, sysUserId, resourceType int) (indexDataList []knowledge.ResourceImportData, failDataList []*knowledge.KnowledgeImportFail, err error, errMsg string) {
  441. fmt.Println("sheet name: ", sheet.Name)
  442. indexDataList = make([]knowledge.ResourceImportData, 0)
  443. failDataList = make([]*knowledge.KnowledgeImportFail, 0)
  444. //遍历行读取
  445. maxRow := sheet.MaxRow
  446. fmt.Println("maxRow:", maxRow)
  447. // 表头信息
  448. if maxRow <= 3 {
  449. errMsg = "模板异常1"
  450. err = errors.New(errMsg)
  451. return
  452. }
  453. // 表头校验
  454. {
  455. headerRow := sheet.Row(1)
  456. cells := headerRow.Cells
  457. fmt.Println("cells:", len(cells))
  458. if len(cells) < 11 {
  459. errMsg = "导入文件异常,请下载最新导入模板文件"
  460. err = errors.New(errMsg)
  461. return
  462. }
  463. // 循环打印每个单元格
  464. for k, v := range cells {
  465. fmt.Println("第", k, "个单元格", v.Value)
  466. }
  467. templateFail := false
  468. if cells[0].Value != "开始时间" {
  469. templateFail = true
  470. }
  471. if cells[2].Value != "结束时间(非必填)" {
  472. templateFail = true
  473. }
  474. if cells[4].Value != "标题" {
  475. templateFail = true
  476. }
  477. if cells[5].Value != "正文" {
  478. templateFail = true
  479. }
  480. if cells[6].Value != "来源" {
  481. templateFail = true
  482. }
  483. if cells[7].Value != "一级分类" {
  484. templateFail = true
  485. }
  486. if cells[8].Value != "二级分类" {
  487. templateFail = true
  488. }
  489. if cells[9].Value != "三级分类" {
  490. templateFail = true
  491. }
  492. if cells[10].Value != "标签" {
  493. templateFail = true
  494. }
  495. headerRow2 := sheet.Row(2)
  496. cells2 := headerRow2.Cells
  497. for k, v := range cells2 {
  498. fmt.Println("2第", k, "个单元格", v.Value)
  499. }
  500. if len(cells2) < 11 {
  501. templateFail = true
  502. } else {
  503. if cells2[0].Value != "日期" {
  504. templateFail = true
  505. }
  506. if cells2[1].Value != "时间" {
  507. templateFail = true
  508. }
  509. if cells2[2].Value != "日期" {
  510. templateFail = true
  511. }
  512. if cells2[3].Value != "时间" {
  513. templateFail = true
  514. }
  515. }
  516. if templateFail {
  517. fmt.Println("头部信息校验失败")
  518. errMsg = "导入文件异常,请下载最新导入模板文件"
  519. err = errors.New(errMsg)
  520. return
  521. }
  522. }
  523. for i := 3; i < maxRow; i++ {
  524. row := sheet.Row(i)
  525. cells := row.Cells
  526. lenCell := len(cells)
  527. for k, v := range cells {
  528. fmt.Println("数据第行", i, "第", k, "个单元格", v.Value)
  529. }
  530. // 过滤空白行
  531. if lenCell <= 0 {
  532. continue
  533. }
  534. fmt.Println("lenCell:", lenCell)
  535. if lenCell < 12 {
  536. if cells[0].Value == `` {
  537. continue
  538. }
  539. errMsg = "导入文件异常,请下载最新导入模板文件"
  540. err = errors.New(errMsg)
  541. return
  542. }
  543. startDate := strings.TrimSpace(cells[0].Value) //开始时间
  544. startTime := strings.TrimSpace(cells[1].Value) //开始时间
  545. endDate := strings.TrimSpace(cells[2].Value) //结束时间
  546. endTime := strings.TrimSpace(cells[3].Value) //结束时间
  547. startDateO := startDate
  548. endDateO := endDate
  549. startTimeO := startTime
  550. endTimeO := endTime
  551. title := strings.TrimSpace(cells[4].Value) //标题
  552. content := strings.TrimSpace(cells[5].Value) //正文
  553. sourceFrom := strings.TrimSpace(cells[6].Value) //来源
  554. classifyName1 := strings.TrimSpace(cells[7].Value) //一级分类
  555. classifyName2 := strings.TrimSpace(cells[8].Value) //二级分类
  556. classifyName3 := strings.TrimSpace(cells[9].Value) //三级分类
  557. tag := strings.TrimSpace(cells[10].Value) //标签
  558. if title == "" || content == "" || sourceFrom == "" || classifyName1 == "" { //过滤空白行
  559. continue
  560. }
  561. // 校验日期格式
  562. if startDate != "" {
  563. // 判断9:09:14日期格式是否正确
  564. // 判断是否是数字
  565. _, tmpErr := strconv.Atoi(startDate)
  566. if tmpErr == nil {
  567. startDate = utils.ExcelDateToDate(startDate).Format(utils.FormatDate)
  568. fmt.Println(startDate)
  569. } else {
  570. startDate, tmpErr = getExcelDate(startDate)
  571. if tmpErr != nil {
  572. failDataList = append(failDataList, &knowledge.KnowledgeImportFail{
  573. //Id: 0,
  574. Title: title,
  575. Content: content,
  576. SourceFrom: sourceFrom,
  577. ClassifyFirst: classifyName1,
  578. ClassifySecond: classifyName2,
  579. ClassifyThird: classifyName3,
  580. ResourceType: resourceType,
  581. StartDate: startDateO,
  582. EndDate: endDateO,
  583. StartTime: startTimeO,
  584. EndTime: endTimeO,
  585. Remark: "日期格式异常",
  586. SysUserId: strconv.Itoa(sysUserId),
  587. CreateTime: time.Now(),
  588. })
  589. continue
  590. }
  591. }
  592. if startTime != "" {
  593. // 判断9:09:14日期格式是否正确
  594. startTimeVal, tmpErr := strconv.ParseFloat(startTime, 64)
  595. if tmpErr == nil {
  596. startTime = utils.ExcelTimeToTime(startTimeVal).Format(utils.FormatTime)
  597. fmt.Println(startTime)
  598. } else {
  599. _, tmpErr = time.Parse(utils.FormatDateTime, startDate+" "+startTime)
  600. if tmpErr != nil {
  601. failDataList = append(failDataList, &knowledge.KnowledgeImportFail{
  602. //Id: 0,
  603. Title: title,
  604. Content: content,
  605. SourceFrom: sourceFrom,
  606. ClassifyFirst: classifyName1,
  607. ClassifySecond: classifyName2,
  608. ClassifyThird: classifyName3,
  609. ResourceType: resourceType,
  610. StartDate: startDateO,
  611. EndDate: endDateO,
  612. StartTime: startTimeO,
  613. EndTime: endTimeO,
  614. Remark: "日期格式异常",
  615. SysUserId: strconv.Itoa(sysUserId),
  616. CreateTime: time.Now(),
  617. })
  618. continue
  619. }
  620. }
  621. }
  622. }
  623. if endDate != "" {
  624. _, tmpErr := strconv.Atoi(endDate)
  625. if tmpErr == nil {
  626. endDate = utils.ExcelDateToDate(endDate).Format(utils.FormatDate)
  627. } else {
  628. endDate, tmpErr = getExcelDate(endDate)
  629. if tmpErr != nil {
  630. failDataList = append(failDataList, &knowledge.KnowledgeImportFail{
  631. //Id: 0,
  632. Title: title,
  633. Content: content,
  634. SourceFrom: sourceFrom,
  635. ClassifyFirst: classifyName1,
  636. ClassifySecond: classifyName2,
  637. ClassifyThird: classifyName3,
  638. ResourceType: resourceType,
  639. StartDate: startDateO,
  640. EndDate: endDateO,
  641. StartTime: startTimeO,
  642. EndTime: endTimeO,
  643. Remark: "日期格式异常",
  644. SysUserId: strconv.Itoa(sysUserId),
  645. CreateTime: time.Now(),
  646. })
  647. continue
  648. }
  649. }
  650. if endTime != "" {
  651. // 判断9:09:14日期格式是否正确
  652. endTimeVal, tmpErr := strconv.ParseFloat(endTime, 64)
  653. if tmpErr == nil {
  654. endTime = utils.ExcelTimeToTime(endTimeVal).Format(utils.FormatTime)
  655. fmt.Println(endTime)
  656. } else {
  657. _, tmpErr = time.Parse(utils.FormatDateTime, endDate+" "+endTime)
  658. if tmpErr != nil {
  659. failDataList = append(failDataList, &knowledge.KnowledgeImportFail{
  660. //Id: 0,
  661. Title: title,
  662. Content: content,
  663. SourceFrom: sourceFrom,
  664. ClassifyFirst: classifyName1,
  665. ClassifySecond: classifyName2,
  666. ClassifyThird: classifyName3,
  667. ResourceType: resourceType,
  668. StartDate: startDate,
  669. EndDate: endDate,
  670. StartTime: startTimeO,
  671. EndTime: endTimeO,
  672. Remark: "日期格式异常",
  673. SysUserId: strconv.Itoa(sysUserId),
  674. CreateTime: time.Now(),
  675. })
  676. continue
  677. }
  678. }
  679. }
  680. }
  681. resourceItem := knowledge.ResourceImportData{
  682. Title: title,
  683. StartDate: startDate,
  684. EndDate: endDate,
  685. StartTime: startTime,
  686. EndTime: endTime,
  687. Content: content,
  688. Tag: tag,
  689. SourceFrom: sourceFrom,
  690. ClassifyFirstName: classifyName1,
  691. ClassifySecondName: classifyName2,
  692. ClassifyThirdName: classifyName3,
  693. }
  694. indexDataList = append(indexDataList, resourceItem)
  695. }
  696. return
  697. }
  698. func getExcelDate(createDate string) (newCreateDate string, err error) {
  699. if strings.Contains(createDate, "-") {
  700. //如果是带有 - 的普通日期格式文本
  701. _, err = time.Parse("2006-1-2", createDate)
  702. if err == nil {
  703. newCreateDate = createDate
  704. }
  705. } else if strings.Contains(createDate, "/") {
  706. //如果是带有 / 的普通日期格式文本
  707. createDateTime, timeErr := time.Parse("2006/1/2", createDate)
  708. if timeErr != nil {
  709. err = timeErr
  710. } else {
  711. newCreateDate = createDateTime.Format("2006-01-02")
  712. }
  713. } else {
  714. //可能是excel的日期格式
  715. _, tmpErr := strconv.Atoi(createDate)
  716. if tmpErr != nil {
  717. err = tmpErr
  718. } else {
  719. newCreateDate = utils.ConvertToFormatDay(createDate) //录入日期
  720. }
  721. }
  722. return
  723. }
  724. func addExcelResource(req *knowledge.AddReq, sysUser *system.Admin) (err error, errMsg string) {
  725. var startTime time.Time
  726. var endTime time.Time
  727. if req.StartTime != "" {
  728. startTime, err = time.ParseInLocation(utils.FormatDateTime, req.StartTime, time.Local)
  729. if err != nil { // 如果时间格式不正确,则返回错误信息
  730. errMsg = "开始时间格式不正确"
  731. err = fmt.Errorf("开始时间格式不正确,Err:" + err.Error())
  732. return
  733. }
  734. }
  735. if req.EndTime != "" {
  736. endTime, err = time.ParseInLocation(utils.FormatDateTime, req.EndTime, time.Local)
  737. if err != nil { // 如果时间格式不正确,则返回错误信息
  738. errMsg = "结束时间格式不正确"
  739. err = fmt.Errorf("结束时间格式不正确,Err:" + err.Error())
  740. return
  741. }
  742. }
  743. item := new(knowledge.KnowledgeResource)
  744. item.ClassifyId = req.ClassifyId
  745. item.TagId = req.TagId
  746. item.SourceFrom = req.SourceFrom
  747. item.ResourceType = req.ResourceType
  748. item.Title = req.Title
  749. item.State = 1
  750. item.Content = html.EscapeString(req.Content)
  751. timestamp := strconv.FormatInt(time.Now().UnixNano(), 10)
  752. item.ResourceCode = utils.MD5(utils.CHART_PREFIX + "_" + timestamp)
  753. //todo 内容前5行
  754. //item.ContentSub = html.EscapeString(contentSub)
  755. if !startTime.IsZero() {
  756. item.StartTime = &startTime
  757. }
  758. if !endTime.IsZero() {
  759. item.EndTime = &endTime
  760. }
  761. item.ModifyTime = time.Now()
  762. item.AdminId = sysUser.AdminId
  763. item.AdminRealName = sysUser.RealName
  764. //item.LastModifyAdminId = sysUser.AdminId
  765. //item.LastModifyAdminName = sysUser.RealName
  766. item.ModifyTime = time.Now()
  767. item.CreateTime = time.Now()
  768. err = item.Add(item)
  769. if err != nil {
  770. errMsg = "保存失败"
  771. err = fmt.Errorf("保存失败,Err:" + err.Error())
  772. return
  773. }
  774. //todo 是否需要保存到es中
  775. return
  776. }