Browse Source

excel模版导入

xyxie 5 months ago
parent
commit
4913832740

+ 180 - 8
controllers/knowledge_resource.go

@@ -7,9 +7,12 @@ import (
 	knowledgeServ "eta_gn/eta_api/services/knowledge"
 	knowledgeServ "eta_gn/eta_api/services/knowledge"
 	"eta_gn/eta_api/utils"
 	"eta_gn/eta_api/utils"
 	"github.com/rdlucklib/rdluck_tools/paging"
 	"github.com/rdlucklib/rdluck_tools/paging"
+	"github.com/tealeg/xlsx"
 	"html"
 	"html"
+	"os"
 	"strconv"
 	"strconv"
 	"strings"
 	"strings"
+	"time"
 )
 )
 
 
 // 分类
 // 分类
@@ -112,7 +115,7 @@ func (this *KnowledgeResourceController) List() {
 		br.ErrMsg = "获取失败,Err:" + err.Error()
 		br.ErrMsg = "获取失败,Err:" + err.Error()
 		return
 		return
 	}
 	}
-	list, err = knowledge.GetKnowledgeResourceList(condition, pars, startSize, pageSize)
+	listTmp, err := knowledge.GetKnowledgeResourceList(condition, pars, startSize, pageSize)
 	if err != nil {
 	if err != nil {
 		br.Msg = "获取失败"
 		br.Msg = "获取失败"
 		br.ErrMsg = "获取失败,Err:" + err.Error()
 		br.ErrMsg = "获取失败,Err:" + err.Error()
@@ -121,7 +124,7 @@ func (this *KnowledgeResourceController) List() {
 	// 整理分类ID
 	// 整理分类ID
 	classifyFullNameMap := make(map[int]string)
 	classifyFullNameMap := make(map[int]string)
 	classifyIdsArr := make([]int, 0)
 	classifyIdsArr := make([]int, 0)
-	for _, v := range list {
+	for _, v := range listTmp {
 		classifyIdsArr = append(classifyIdsArr, v.ClassifyId)
 		classifyIdsArr = append(classifyIdsArr, v.ClassifyId)
 	}
 	}
 	// 获取分类列表
 	// 获取分类列表
@@ -145,7 +148,7 @@ func (this *KnowledgeResourceController) List() {
 	/* // 整理标签ID
 	/* // 整理标签ID
 	    tagNameMap := make(map[int]string)
 	    tagNameMap := make(map[int]string)
 	    tagIdsArr := make([]int, 0)
 	    tagIdsArr := make([]int, 0)
-	    for _, v := range list {
+	    for _, v := range listTmp {
 	        tagIdsArr = append(tagIdsArr, v.TagId)
 	        tagIdsArr = append(tagIdsArr, v.TagId)
 	    }
 	    }
 	    // 获取标签列表
 	    // 获取标签列表
@@ -155,7 +158,33 @@ func (this *KnowledgeResourceController) List() {
 	        br.ErrMsg = "获取失败,Err:" + err.Error()
 	        br.ErrMsg = "获取失败,Err:" + err.Error()
 		}*/
 		}*/
 
 
-	for _, item := range list {
+	for _, v := range listTmp {
+		var startTime, endTime string
+		if !v.StartTime.IsZero() {
+			startTime = v.StartTime.In(time.Local).Format(utils.FormatDateTime)
+		}
+		if !v.EndTime.IsZero() {
+			endTime = v.EndTime.In(time.Local).Format(utils.FormatDateTime)
+		}
+		modifyTime := v.ModifyTime.In(time.Local).Format(utils.FormatDateTime)
+		createTime := v.CreateTime.In(time.Local).Format(utils.FormatDateTime)
+		tmp := &knowledge.KnowledgeResourceList{
+			KnowledgeResourceId: v.KnowledgeResourceId,
+			ResourceType:        v.ResourceType,
+			ClassifyId:          v.ClassifyId,
+			Title:               v.Title,
+			CreateTime:          createTime,
+			ModifyTime:          modifyTime,
+			State:               v.State,
+			ResourceCode:        v.ResourceCode,
+			AdminId:             v.AdminId,
+			AdminRealName:       v.AdminRealName,
+			SourceFrom:          v.SourceFrom,
+			TagId:               v.TagId,
+			StartTime:           startTime,
+			EndTime:             endTime,
+		}
+
 		// todo 编辑状态
 		// todo 编辑状态
 		/*markStatus, err := services.UpdateReportEditMark(item.Id, 0, this.SysUser.AdminId, 2, this.SysUser.RealName, this.Lang)
 		/*markStatus, err := services.UpdateReportEditMark(item.Id, 0, this.SysUser.AdminId, 2, this.SysUser.RealName, this.Lang)
 		if err != nil {
 		if err != nil {
@@ -168,14 +197,15 @@ func (this *KnowledgeResourceController) List() {
 		} else {
 		} else {
 			item.Editor = markStatus.Editor
 			item.Editor = markStatus.Editor
 		}*/
 		}*/
-		classifyName, ok := classifyFullNameMap[item.ClassifyId]
+		classifyName, ok := classifyFullNameMap[tmp.ClassifyId]
 		if ok {
 		if ok {
-			item.ClassifyFullName = classifyName
+			tmp.ClassifyFullName = classifyName
 		}
 		}
-		/*tagName, ok := tagNameMap[item.TagId]
+		/*tagName, ok := tagNameMap[v.TagId]
 		if ok {
 		if ok {
-			item.TagName = tagName
+			v.TagName = tagName
 		*/
 		*/
+		list = append(list, tmp)
 	}
 	}
 
 
 	page := paging.GetPaging(currentIndex, pageSize, total)
 	page := paging.GetPaging(currentIndex, pageSize, total)
@@ -697,3 +727,145 @@ func (this *KnowledgeResourceController) Delete() {
 	br.Success = true
 	br.Success = true
 	br.Msg = "删除成功"
 	br.Msg = "删除成功"
 }
 }
+
+// ImportData
+// @Title Excel导入事件
+// @Description Excel导入事件
+// @Param   EntryFile   query   file  true       "文件"
+// @Success 200 Ret=200 录入成功
+// @router /resource/import_add [post]
+func (c *KnowledgeResourceController) ImportData() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		c.Data["json"] = br
+		c.ServeJSON()
+	}()
+	sysUser := c.SysUser
+	if sysUser == nil {
+		br.Msg = "请重新登录"
+		return
+	}
+	resourceType, _ := c.GetInt("ResourceType")
+	file, _, err := c.GetFile("EntryFile")
+	if err != nil {
+		br.Msg = "获取文件失败"
+		br.ErrMsg = "获取文件失败,Err:" + err.Error()
+		return
+	}
+	path := "./static/知识资源导入_" + strconv.Itoa(resourceType) + "_" + time.Now().Format(utils.FormatDateTimeUnSpace) + ".xlsx"
+	defer file.Close()
+	err = c.SaveToFile("EntryFile", path)
+	if err != nil {
+		br.Msg = "文件保存失败"
+		br.ErrMsg = "文件保存失败,Err:" + err.Error()
+		return
+	}
+	if utils.RunMode == "debug" {
+		defer os.Remove(path)
+	}
+
+	successCount, failCount, err, errMsg := knowledgeServ.ImportResourceData(path, resourceType, sysUser)
+	if err != nil {
+		br.Msg = errMsg
+		br.ErrMsg = err.Error()
+		return
+	}
+
+	resp := models.EdbdataImportResp{
+		SuccessCount: successCount,
+		FailCount:    failCount,
+	}
+	if failCount > 0 {
+		if successCount == 0 {
+			resp.Status = -1
+			resp.Msg = "导入失败"
+		} else {
+			resp.Status = 1
+			resp.Msg = "存在部分导入失败"
+		}
+	} else {
+		resp.Status = 0
+	}
+	br.Msg = "导入成功"
+	br.Ret = 200
+	br.Success = true
+	br.Data = resp
+}
+
+// ImportFailListDownload
+// @Title 下载失败列表
+// @Description 下载失败列表
+// @Success 200 {object} models.EdbdataClassifyResp
+// @router /resource/download_fail [get]
+func (this *KnowledgeResourceController) ImportFailListDownload() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+	sysUser := this.SysUser
+	if sysUser == nil {
+		br.Msg = "请重新登录"
+		return
+	}
+	resourceType, _ := this.GetInt("ResourceType")
+	failObj := new(knowledge.KnowledgeImportFail)
+	item, err := failObj.GetListBySysUserId(sysUser.AdminId, resourceType)
+	if err != nil {
+		br.Msg = "获取数据失败"
+		br.Msg = "获取数据失败,Err:" + err.Error()
+		return
+	}
+	xlsxFile := xlsx.NewFile()
+	SheetName := "导入失败数据"
+	if this.Lang == utils.EnLangVersion {
+		SheetName = "Import Fail List"
+	}
+	sheet, err := xlsxFile.AddSheet(SheetName)
+	headRow := sheet.AddRow()
+	headRow.AddCell().SetValue("开始日期")
+	headRow.AddCell().SetValue("开始时间")
+	headRow.AddCell().SetValue("结束日期")
+	headRow.AddCell().SetValue("结束时间")
+	headRow.AddCell().SetValue("标题")
+	headRow.AddCell().SetValue("正文")
+	headRow.AddCell().SetValue("来源")
+	headRow.AddCell().SetValue("一级分类")
+	headRow.AddCell().SetValue("二级分类")
+	headRow.AddCell().SetValue("三级分类")
+	headRow.AddCell().SetValue("标签")
+	headRow.AddCell().SetValue("备注")
+
+	for _, v := range item {
+		row := sheet.AddRow()
+		row.AddCell().SetValue(v.StartDate)
+		row.AddCell().SetValue(v.StartTime)
+		row.AddCell().SetValue(v.EndDate)
+		row.AddCell().SetValue(v.EndTime)
+		row.AddCell().SetValue(v.Title)
+		row.AddCell().SetValue(v.Content)
+		row.AddCell().SetValue(v.SourceFrom)
+		row.AddCell().SetValue(v.ClassifyFirst)
+		row.AddCell().SetValue(v.ClassifySecond)
+		row.AddCell().SetValue(v.ClassifyThird)
+		row.AddCell().SetValue(v.Tag)
+		row.AddCell().SetValue(v.Remark)
+	}
+	fileName := time.Now().Format(utils.FormatDateTimeUnSpace) + ".xlsx"
+	savePath := "./static/" + fileName
+	err = xlsxFile.Save(savePath)
+	if err != nil {
+		br.Msg = "文件保存失败"
+		br.ErrMsg = "文件保存失败,Err:" + err.Error()
+		return
+	}
+	defer func() {
+		os.Remove(savePath)
+	}()
+	finalFileName := "失败列表.xlsx"
+
+	if this.Lang == utils.EnLangVersion {
+		finalFileName = "Failure List.xlsx"
+	}
+	this.Ctx.Output.Download(savePath, finalFileName)
+}

+ 15 - 2
models/knowledge/knowledge_classify.go

@@ -324,7 +324,7 @@ func (k *KnowledgeClassify) GetMaxSortByParentId(parentId int) (maxSort int, err
 	//o := orm.NewOrmUsingDB("rddp")
 	//o := orm.NewOrmUsingDB("rddp")
 	//sql := `SELECT max(sort) AS sort FROM knowledge_classify WHERE parent_id = ? `
 	//sql := `SELECT max(sort) AS sort FROM knowledge_classify WHERE parent_id = ? `
 	//err = o.Raw(sql, parentId).QueryRow(&maxSort)
 	//err = o.Raw(sql, parentId).QueryRow(&maxSort)
-	sql := `SELECT max(sort) AS sort FROM knowledge_classify WHERE parent_id = ? `
+	sql := `SELECT COALESCE(MAX(sort),0) AS sort FROM knowledge_classify WHERE parent_id = ? `
 	err = global.DmSQL["rddp"].Raw(sql, parentId).Scan(&maxSort).Error
 	err = global.DmSQL["rddp"].Raw(sql, parentId).Scan(&maxSort).Error
 	return
 	return
 }
 }
@@ -334,7 +334,7 @@ func (k *KnowledgeClassify) GetMaxSort() (maxSort int, err error) {
 	//o := orm.NewOrmUsingDB("rddp")
 	//o := orm.NewOrmUsingDB("rddp")
 	//sql := `SELECT max(sort) AS sort FROM classify`
 	//sql := `SELECT max(sort) AS sort FROM classify`
 	//err = o.Raw(sql).QueryRow(&maxSort)
 	//err = o.Raw(sql).QueryRow(&maxSort)
-	sql := `SELECT max(sort) AS sort FROM classify`
+	sql := `SELECT COALESCE(MAX(sort),0) AS sort FROM knowledge_classify`
 	err = global.DmSQL["rddp"].Raw(sql).Scan(&maxSort).Error
 	err = global.DmSQL["rddp"].Raw(sql).Scan(&maxSort).Error
 	return
 	return
 }
 }
@@ -482,3 +482,16 @@ LEFT JOIN knowledge_classify kc3 ON kc2.parent_id = kc3.classify_id WHERE kc1.cl
 	err = global.DmSQL["rddp"].Raw(sql, classifyIdList).Find(&items).Error
 	err = global.DmSQL["rddp"].Raw(sql, classifyIdList).Find(&items).Error
 	return
 	return
 }
 }
+
+func GetFullClassifyListByName(classifyNames []string) (items []*KnowledgeFullClassify, err error) {
+	num := len(classifyNames)
+	if num <= 0 {
+		return
+	}
+	sql := `SELECT kc1.*, kc2.classify_name AS parent_name, kc3.classify_name AS root_name  
+FROM knowledge_classify kc1  
+LEFT JOIN knowledge_classify kc2 ON kc1.parent_id = kc2.classify_id
+LEFT JOIN knowledge_classify kc3 ON kc2.parent_id = kc3.classify_id WHERE kc1.classify_name in (?)`
+	err = global.DmSQL["rddp"].Raw(sql, classifyNames).Find(&items).Error
+	return
+}

+ 52 - 0
models/knowledge/knowledge_import_fail.go

@@ -0,0 +1,52 @@
+package knowledge
+
+import (
+	"eta_gn/eta_api/global"
+	"eta_gn/eta_api/utils"
+	"fmt"
+	"time"
+)
+
+type KnowledgeImportFail struct {
+	Id             int       `gorm:"column:id;primaryKey;autoIncrement" description:"主键ID"`
+	ResourceType   int       `gorm:"column:resource_type;"`
+	Title          string    `gorm:"column:title;"`
+	Content        string    `gorm:"column:content"`
+	SourceFrom     string    `gorm:"column:source_from"`
+	Tag            int       `gorm:"column:tag"`
+	ClassifyFirst  string    `gorm:"column:classify_first;"`
+	ClassifySecond string    `gorm:"column:classify_second;"`
+	ClassifyThird  string    `gorm:"column:classify_third;"`
+	StartTime      string    `gorm:"column:start_time"`
+	EndTime        string    `gorm:"column:end_time"`
+	StartDate      string    `gorm:"column:start_date"`
+	EndDate        string    `gorm:"column:end_date"`
+	Remark         string    `gorm:"column:remark" description:"备注"`
+	SysUserId      string    `gorm:"column:sys_user_id" description:"系统用户ID"`
+	CreateTime     time.Time `gorm:"column:create_time" description:"创建时间"`
+}
+
+func (m *KnowledgeImportFail) TableName() string {
+	return "knowledge_import_fail"
+}
+
+func (m *KnowledgeImportFail) Add(item *KnowledgeImportFail) (err error) {
+	err = global.DmSQL["rddp"].Create(item).Error
+	return
+}
+
+func (m *KnowledgeImportFail) MultiAdd(items []*KnowledgeImportFail) (err error) {
+	err = global.DmSQL["rddp"].CreateInBatches(items, utils.MultiAddNum).Error
+	return err
+}
+
+func (m *KnowledgeImportFail) Delete(userId int) (err error) {
+	sql := fmt.Sprintf(`delete from %s where sys_user_id=?`, m.TableName())
+	err = global.DmSQL["rddp"].Exec(sql, userId).Error
+	return err
+}
+func (m *KnowledgeImportFail) GetListBySysUserId(sysUserId, resourceType int) (items []*KnowledgeImportFail, err error) {
+	sql := fmt.Sprintf(` SELECT * FROM %s WHERE sys_user_id=? `, m.TableName())
+	err = global.DmSQL["edb"].Raw(sql, sysUserId, resourceType).Find(&items).Error
+	return
+}

+ 49 - 30
models/knowledge/knowledge_resource.go

@@ -22,21 +22,21 @@ const (
 )
 )
 
 
 type KnowledgeResource struct {
 type KnowledgeResource struct {
-	KnowledgeResourceId int       `gorm:"column:knowledge_resource_id;;primaryKey;autoIncrement"`
-	ResourceType        int       `gorm:"column:resource_type;"`
-	ClassifyId          int       `gorm:"column:classify_id"`
-	Title               string    `gorm:"column:title;"`
-	CreateTime          string    `gorm:"column:create_time" description:"创建时间"`
-	ModifyTime          time.Time `gorm:"column:modify_time;autoUpdateTime" description:"修改时间"`
-	State               int       `gorm:"column:state" description:"0:未发布;1:已发布;"`
-	Content             string    `gorm:"column:content"`
-	ResourceCode        string    `gorm:"column:resource_code"`
-	AdminId             int       `gorm:"column:admin_id" description:"创建者账号"`
-	AdminRealName       string    `gorm:"column:admin_real_name" description:"创建者姓名"`
-	SourceFrom          string    `gorm:"column:source_from"`
-	TagId               int       `gorm:"column:tag_id;default:0;NOT NULL"`
-	StartTime           string    `gorm:"column:start_time"`
-	EndTime             string    `gorm:"column:end_time"`
+	KnowledgeResourceId int        `gorm:"column:knowledge_resource_id;;primaryKey;autoIncrement"`
+	ResourceType        int        `gorm:"column:resource_type;"`
+	ClassifyId          int        `gorm:"column:classify_id"`
+	Title               string     `gorm:"column:title;"`
+	CreateTime          time.Time  `gorm:"column:create_time" description:"创建时间"`
+	ModifyTime          time.Time  `gorm:"column:modify_time;autoUpdateTime" description:"修改时间"`
+	State               int        `gorm:"column:state" description:"0:未发布;1:已发布;"`
+	Content             string     `gorm:"column:content"`
+	ResourceCode        string     `gorm:"column:resource_code"`
+	AdminId             int        `gorm:"column:admin_id" description:"创建者账号"`
+	AdminRealName       string     `gorm:"column:admin_real_name" description:"创建者姓名"`
+	SourceFrom          string     `gorm:"column:source_from"`
+	TagId               int        `gorm:"column:tag_id;default:0;NOT NULL"`
+	StartTime           *time.Time `gorm:"column:start_time"`
+	EndTime             *time.Time `gorm:"column:end_time"`
 }
 }
 
 
 func (m *KnowledgeResource) TableName() string {
 func (m *KnowledgeResource) TableName() string {
@@ -49,20 +49,20 @@ func (m *KnowledgeResource) QueryList(condition string, pars []interface{}) (ite
 }
 }
 
 
 type KnowledgeResourceList struct {
 type KnowledgeResourceList struct {
-	KnowledgeResourceId int       `gorm:"column:knowledge_resource_id;;primaryKey;autoIncrement"`
-	ResourceType        int       `gorm:"column:resource_type;"`
-	ClassifyId          int       `gorm:"column:classify_id"`
-	Title               string    `gorm:"column:title;"`
-	CreateTime          string    `gorm:"column:create_time" description:"创建时间"`
-	ModifyTime          time.Time `gorm:"column:modify_time;autoUpdateTime" description:"修改时间"`
-	State               int       `gorm:"column:state" description:"1:未发布;2:已发布;3-待提交;4-待审批;5-已驳回;6-已通过"`
-	ResourceCode        string    `gorm:"column:resource_code"`
-	AdminId             int       `gorm:"column:admin_id" description:"创建者账号"`
-	AdminRealName       string    `gorm:"column:admin_real_name" description:"创建者姓名"`
-	SourceFrom          string    `gorm:"column:source_from"`
-	TagId               int       `gorm:"column:tag_id;default:0;NOT NULL"`
-	StartTime           string    `gorm:"column:start_time"`
-	EndTime             string    `gorm:"column:end_time"`
+	KnowledgeResourceId int    `gorm:"column:knowledge_resource_id;;primaryKey;autoIncrement"`
+	ResourceType        int    `gorm:"column:resource_type;"`
+	ClassifyId          int    `gorm:"column:classify_id"`
+	Title               string `gorm:"column:title;"`
+	CreateTime          string `gorm:"column:create_time" description:"创建时间"`
+	ModifyTime          string `gorm:"column:modify_time;autoUpdateTime" description:"修改时间"`
+	State               int    `gorm:"column:state" description:"1:未发布;2:已发布;3-待提交;4-待审批;5-已驳回;6-已通过"`
+	ResourceCode        string `gorm:"column:resource_code"`
+	AdminId             int    `gorm:"column:admin_id" description:"创建者账号"`
+	AdminRealName       string `gorm:"column:admin_real_name" description:"创建者姓名"`
+	SourceFrom          string `gorm:"column:source_from"`
+	TagId               int    `gorm:"column:tag_id;default:0;NOT NULL"`
+	StartTime           string `gorm:"column:start_time"`
+	EndTime             string `gorm:"column:end_time"`
 	ClassifyFullName    string
 	ClassifyFullName    string
 	TagName             string
 	TagName             string
 	// todo 是否需要记录最后更新人
 	// todo 是否需要记录最后更新人
@@ -78,7 +78,7 @@ type KnowledgeResourceListResp struct {
 	Paging *paging.PagingItem `description:"分页数据"`
 	Paging *paging.PagingItem `description:"分页数据"`
 }
 }
 
 
-func GetKnowledgeResourceList(condition string, pars []interface{}, startSize, pageSize int) (items []*KnowledgeResourceList, err error) {
+func GetKnowledgeResourceList(condition string, pars []interface{}, startSize, pageSize int) (items []*KnowledgeResource, err error) {
 
 
 	sql := `SELECT * FROM knowledge_resource WHERE 1=1  `
 	sql := `SELECT * FROM knowledge_resource WHERE 1=1  `
 	if condition != "" {
 	if condition != "" {
@@ -158,6 +158,11 @@ func (m *KnowledgeResource) Add(item *KnowledgeResource) (err error) {
 	return
 	return
 }
 }
 
 
+func (m *KnowledgeResource) AddBatch(item []*KnowledgeResource) (err error) {
+	err = global.DmSQL["rddp"].CreateInBatches(item, 50).Error
+	return
+}
+
 type EditReq struct {
 type EditReq struct {
 	KnowledgeResourceId int64  `description:"事件id"`
 	KnowledgeResourceId int64  `description:"事件id"`
 	ResourceType        int    `gorm:"column:resource_type;"`
 	ResourceType        int    `gorm:"column:resource_type;"`
@@ -384,3 +389,17 @@ func GetReportFieldsByIds(ids []int, fields []string) (items []*KnowledgeResourc
 type KnowledgeResourceDetailView struct {
 type KnowledgeResourceDetailView struct {
 	*KnowledgeResource
 	*KnowledgeResource
 }
 }
+
+type ResourceImportData struct {
+	Title              string `description:"标题"`
+	StartDate          string `description:"开始日期"`
+	EndDate            string `description:"开始时间"`
+	StartTime          string `description:"结束日期"`
+	EndTime            string `description:"结束时间"`
+	Content            string `description:"正文"`
+	Tag                string `description:"标签"`
+	SourceFrom         string `description:"来源"`
+	ClassifyFirstName  string `description:"一级分类"`
+	ClassifySecondName string `description:"二级分类"`
+	ClassifyThirdName  string `description:"三级分类"`
+}

+ 18 - 0
routers/commentsRouter.go

@@ -8557,6 +8557,15 @@ func init() {
             Filters: nil,
             Filters: nil,
             Params: nil})
             Params: nil})
 
 
+    beego.GlobalControllerRouter["eta_gn/eta_api/controllers:KnowledgeResourceController"] = append(beego.GlobalControllerRouter["eta_gn/eta_api/controllers:KnowledgeResourceController"],
+        beego.ControllerComments{
+            Method: "ImportFailListDownload",
+            Router: `/resource/download_fail`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
     beego.GlobalControllerRouter["eta_gn/eta_api/controllers:KnowledgeResourceController"] = append(beego.GlobalControllerRouter["eta_gn/eta_api/controllers:KnowledgeResourceController"],
     beego.GlobalControllerRouter["eta_gn/eta_api/controllers:KnowledgeResourceController"] = append(beego.GlobalControllerRouter["eta_gn/eta_api/controllers:KnowledgeResourceController"],
         beego.ControllerComments{
         beego.ControllerComments{
             Method: "Edit",
             Method: "Edit",
@@ -8566,6 +8575,15 @@ func init() {
             Filters: nil,
             Filters: nil,
             Params: nil})
             Params: nil})
 
 
+    beego.GlobalControllerRouter["eta_gn/eta_api/controllers:KnowledgeResourceController"] = append(beego.GlobalControllerRouter["eta_gn/eta_api/controllers:KnowledgeResourceController"],
+        beego.ControllerComments{
+            Method: "ImportData",
+            Router: `/resource/import_add`,
+            AllowHTTPMethods: []string{"post"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
     beego.GlobalControllerRouter["eta_gn/eta_api/controllers:KnowledgeResourceController"] = append(beego.GlobalControllerRouter["eta_gn/eta_api/controllers:KnowledgeResourceController"],
     beego.GlobalControllerRouter["eta_gn/eta_api/controllers:KnowledgeResourceController"] = append(beego.GlobalControllerRouter["eta_gn/eta_api/controllers:KnowledgeResourceController"],
         beego.ControllerComments{
         beego.ControllerComments{
             Method: "List",
             Method: "List",

+ 674 - 6
services/knowledge/resource.go

@@ -1,17 +1,40 @@
 package knowledge
 package knowledge
 
 
 import (
 import (
+	"errors"
+	"eta_gn/eta_api/models"
 	"eta_gn/eta_api/models/knowledge"
 	"eta_gn/eta_api/models/knowledge"
 	"eta_gn/eta_api/models/system"
 	"eta_gn/eta_api/models/system"
 	"eta_gn/eta_api/services"
 	"eta_gn/eta_api/services"
+	"eta_gn/eta_api/services/alarm_msg"
 	"eta_gn/eta_api/utils"
 	"eta_gn/eta_api/utils"
 	"fmt"
 	"fmt"
+	"github.com/tealeg/xlsx"
 	"html"
 	"html"
 	"strconv"
 	"strconv"
+	"strings"
 	"time"
 	"time"
 )
 )
 
 
 func AddResource(req *knowledge.AddReq, sysUser *system.Admin) (item *knowledge.KnowledgeResource, err error, errMsg string) {
 func AddResource(req *knowledge.AddReq, sysUser *system.Admin) (item *knowledge.KnowledgeResource, err error, errMsg string) {
+	var startTime time.Time
+	var endTime time.Time
+	if req.StartTime != "" {
+		startTime, err = time.ParseInLocation(utils.FormatDateTime, req.StartTime, time.Local)
+		if err != nil { // 如果时间格式不正确,则返回错误信息
+			errMsg = "开始时间格式不正确"
+			err = fmt.Errorf("开始时间格式不正确,Err:" + err.Error())
+			return
+		}
+	}
+	if req.EndTime != "" {
+		endTime, err = time.ParseInLocation(utils.FormatDateTime, req.EndTime, time.Local)
+		if err != nil { // 如果时间格式不正确,则返回错误信息
+			errMsg = "结束时间格式不正确"
+			err = fmt.Errorf("结束时间格式不正确,Err:" + err.Error())
+			return
+		}
+	}
 	if req.Content != "" {
 	if req.Content != "" {
 		e := utils.ContentXssCheck(req.Content)
 		e := utils.ContentXssCheck(req.Content)
 		if e != nil {
 		if e != nil {
@@ -67,15 +90,23 @@ func AddResource(req *knowledge.AddReq, sysUser *system.Admin) (item *knowledge.
 	item.ResourceCode = utils.MD5(utils.CHART_PREFIX + "_" + timestamp)
 	item.ResourceCode = utils.MD5(utils.CHART_PREFIX + "_" + timestamp)
 	//todo 内容前5行
 	//todo 内容前5行
 	//item.ContentSub = html.EscapeString(contentSub)
 	//item.ContentSub = html.EscapeString(contentSub)
-	item.StartTime = req.StartTime
-	item.EndTime = req.EndTime
+	if !startTime.IsZero() {
+		item.StartTime = &startTime
+	} else {
+		item.StartTime = nil
+	}
+	if !endTime.IsZero() {
+		item.EndTime = &endTime
+	} else {
+		item.EndTime = nil
+	}
 	item.ModifyTime = time.Now()
 	item.ModifyTime = time.Now()
 	item.AdminId = sysUser.AdminId
 	item.AdminId = sysUser.AdminId
 	item.AdminRealName = sysUser.RealName
 	item.AdminRealName = sysUser.RealName
 	//item.LastModifyAdminId = sysUser.AdminId
 	//item.LastModifyAdminId = sysUser.AdminId
 	//item.LastModifyAdminName = sysUser.RealName
 	//item.LastModifyAdminName = sysUser.RealName
 	item.ModifyTime = time.Now()
 	item.ModifyTime = time.Now()
-	item.CreateTime = time.Now().Format(utils.FormatDateTime)
+	item.CreateTime = time.Now()
 
 
 	err = item.Add(item)
 	err = item.Add(item)
 	if err != nil {
 	if err != nil {
@@ -88,7 +119,24 @@ func AddResource(req *knowledge.AddReq, sysUser *system.Admin) (item *knowledge.
 }
 }
 func EditResource(resourceInfo *knowledge.KnowledgeResource, req knowledge.EditReq, sysUser *system.Admin) (err error, errMsg string) {
 func EditResource(resourceInfo *knowledge.KnowledgeResource, req knowledge.EditReq, sysUser *system.Admin) (err error, errMsg string) {
 	errMsg = `保存失败`
 	errMsg = `保存失败`
-
+	var startTime time.Time
+	var endTime time.Time
+	if req.StartTime != "" {
+		startTime, err = time.ParseInLocation(utils.FormatDateTime, req.StartTime, time.Local)
+		if err != nil { // 如果时间格式不正确,则返回错误信息
+			errMsg = "开始时间格式不正确"
+			err = fmt.Errorf("开始时间格式不正确,Err:" + err.Error())
+			return
+		}
+	}
+	if req.EndTime != "" {
+		endTime, err = time.ParseInLocation(utils.FormatDateTime, req.EndTime, time.Local)
+		if err != nil { // 如果时间格式不正确,则返回错误信息
+			errMsg = "结束时间格式不正确"
+			err = fmt.Errorf("结束时间格式不正确,Err:" + err.Error())
+			return
+		}
+	}
 	if req.Content != "" {
 	if req.Content != "" {
 		e := utils.ContentXssCheck(req.Content)
 		e := utils.ContentXssCheck(req.Content)
 		if e != nil {
 		if e != nil {
@@ -135,8 +183,12 @@ func EditResource(resourceInfo *knowledge.KnowledgeResource, req knowledge.EditR
 	resourceInfo.TagId = req.TagId
 	resourceInfo.TagId = req.TagId
 	resourceInfo.Title = req.Title
 	resourceInfo.Title = req.Title
 	resourceInfo.Content = html.EscapeString(req.Content)
 	resourceInfo.Content = html.EscapeString(req.Content)
-	resourceInfo.StartTime = req.StartTime
-	resourceInfo.EndTime = req.EndTime
+	if !startTime.IsZero() {
+		resourceInfo.StartTime = &startTime
+	}
+	if !endTime.IsZero() {
+		resourceInfo.EndTime = &endTime
+	}
 	//resourceInfo.LastModifyAdminId = sysUser.AdminId
 	//resourceInfo.LastModifyAdminId = sysUser.AdminId
 	//resourceInfo.LastModifyAdminName = sysUser.RealName
 	//resourceInfo.LastModifyAdminName = sysUser.RealName
 	resourceInfo.ModifyTime = time.Now()
 	resourceInfo.ModifyTime = time.Now()
@@ -150,3 +202,619 @@ func EditResource(resourceInfo *knowledge.KnowledgeResource, req knowledge.EditR
 	}
 	}
 	return
 	return
 }
 }
+
+// ImportResourceData
+// @Description: 数据导入
+// @author: Roc
+// @datetime 2024-08-01 11:27:21
+// @param path string
+// @param sysUser *system.Admin
+// @return successCount int
+// @return failCount int
+// @return err error
+// @return errMsg string
+func ImportResourceData(path string, resourceType int, sysUser *system.Admin) (successCount, failCount int, err error, errMsg string) {
+	// 错误信息
+	errMsgList := make([]string, 0)
+	// 操作记录
+	recordMap := make(map[string]string)
+	defer func() {
+		recordList := make([]*models.EdbinfoOpRecord, 0)
+		for tradeCode, remark := range recordMap {
+			recordList = append(recordList, &models.EdbinfoOpRecord{
+				TradeCode:  tradeCode,
+				Remark:     remark,
+				UserId:     sysUser.AdminId,
+				UserName:   sysUser.RealName,
+				CreateTime: time.Now(),
+			})
+		}
+		if len(recordList) > 0 {
+			go func() {
+				obj := models.EdbinfoOpRecord{}
+				_ = obj.MulCreate(recordList)
+			}()
+		}
+
+		// 错误信息记录
+		if len(errMsgList) > 0 {
+			utils.FileLog.Info("导入失败, errMsgList: %v", strings.Join(errMsgList, "\n"))
+		}
+	}()
+	errMsg = `导入失败`
+	xlFile, err := xlsx.OpenFile(path)
+	if err != nil {
+		fmt.Println(err.Error())
+		return
+	}
+	if len(xlFile.Sheets) <= 0 {
+		errMsg = "导入模板异常"
+		err = errors.New(errMsg)
+		return
+	}
+
+	//导入失败数据
+	failDataList := make([]*knowledge.KnowledgeImportFail, 0)
+	var indexDataList []knowledge.ResourceImportData
+
+	// 模板校验,然后处理成标准化格式
+	for _, sheet := range xlFile.Sheets {
+		var tmpFailDataList []*knowledge.KnowledgeImportFail
+		var tmpIndexDataList []knowledge.ResourceImportData
+		rowList := sheet.Rows
+		if len(rowList) <= 0 {
+			errMsg = sheet.Name + "页异常"
+			err = errors.New(errMsg)
+			return
+		}
+
+		templateType := 1 // 模板类型
+		minCellNum := 6   // 模板最小列数
+		headerCell := rowList[0].Cells
+
+		// 确定模板
+		for _, v := range headerCell {
+			if v.String() == "导入模板2/Import Template 2" {
+				templateType = 2
+				minCellNum = 2
+				break
+			}
+		}
+
+		// 如果小于最少列数,则报错
+		if len(headerCell) < minCellNum {
+			errMsg = sheet.Name + "页模板异常"
+			err = errors.New(errMsg)
+			return
+		}
+		tmpIndexDataList, tmpFailDataList, err, errMsg = getDataByTemplateEvent(sheet, sysUser.AdminId, templateType)
+		if err != nil {
+			return
+		}
+		fmt.Println("tmpIndexDataList: ", tmpIndexDataList)
+		fmt.Println("tmpFailDataList: ", tmpFailDataList)
+		indexDataList = append(indexDataList, tmpIndexDataList...)
+		failDataList = append(failDataList, tmpFailDataList...)
+	}
+
+	if len(indexDataList) <= 0 {
+		if len(failDataList) > 0 {
+			errMsg = failDataList[0].Remark
+			err = errors.New(errMsg)
+		}
+		return
+	}
+
+	// 遍历获取所有分类
+	classifyNames := make([]string, 0)
+	for _, v := range indexDataList {
+		if v.ClassifyFirstName != "" {
+			classifyNames = append(classifyNames, v.ClassifyFirstName)
+		}
+		if v.ClassifySecondName != "" {
+			classifyNames = append(classifyNames, v.ClassifySecondName)
+		}
+		if v.ClassifyThirdName != "" {
+			classifyNames = append(classifyNames, v.ClassifyThirdName)
+		}
+	}
+	fmt.Println(classifyNames)
+	classifyList, err := knowledge.GetFullClassifyListByName(classifyNames)
+	if err != nil {
+		err = fmt.Errorf("获取分类数据失败 Err: %s", err.Error())
+		errMsg = "获取分类数据失败"
+		return
+	}
+	classifyNameMap := make(map[string]int)
+	for _, v := range classifyList {
+		name := fmt.Sprintf("%s/%s/%s", v.RootName, v.ParentName, v.ClassifyName)
+		classifyNameMap[name] = v.ClassifyId
+	}
+	// todo 获取所有tag
+	//tagNameMap := make(map[string]int)
+	//// TODO 成功数量超过20个指标,那就不导入了
+	/*	if len(targetMap) >= 100 {
+		failItem := new(knowledge.KnowledgeImportFail)
+		failItem.SysUserId = strconv.Itoa(sysUser.AdminId)
+		failItem.ClassifyName = classifyName
+		failItem.CreateDate = createDate
+		failItem.SecName = secName
+		failItem.Close = closeVal
+		failItem.Remark = "导入指标数量过多"
+		failItem.Frequency = frequency
+		failItem.Unit = unit
+		failDataList = append(failDataList, failItem)
+		//go utils.SendEmail(utils.APPNAME+"失败提醒", "导入数据 获取分类:Err:"+err.Error(), utils.EmailSendToUsers)
+		continue
+	}*/
+
+	for _, v := range indexDataList {
+		// 判断分类是否存在
+		classifyName := fmt.Sprintf("%s/%s/%s", v.ClassifyFirstName, v.ClassifySecondName, v.ClassifyThirdName)
+		fmt.Println("classifyName: ", classifyName)
+		classifyId, ok := classifyNameMap[classifyName]
+		if !ok {
+			failItem := &knowledge.KnowledgeImportFail{
+				Title:          v.Title,
+				Content:        v.Content,
+				SourceFrom:     v.SourceFrom,
+				ClassifyFirst:  v.ClassifyFirstName,
+				ClassifySecond: v.ClassifySecondName,
+				ClassifyThird:  v.ClassifyThirdName,
+				ResourceType:   resourceType,
+				StartDate:      v.StartDate,
+				EndDate:        v.EndDate,
+				StartTime:      v.StartTime,
+				EndTime:        v.EndTime,
+				Remark:         "指标分类不存在",
+				SysUserId:      fmt.Sprint(sysUser.AdminId),
+				CreateTime:     time.Now(),
+			}
+			failDataList = append(failDataList, failItem)
+			continue
+
+		}
+
+		//todo 处理tag信息
+		/*tagId, ok := tagNameMap[v.Tag]
+		if !ok {
+			failItem := &knowledge.KnowledgeImportFail{
+				Title:          v.Title,
+				Content:        v.Content,
+				SourceFrom:     v.SourceFrom,
+				ClassifyFirst:  v.ClassifyFirstName,
+				ClassifySecond: v.ClassifySecondName,
+				ClassifyThird:  v.ClassifyThirdName,
+				ResourceType:   resourceType,
+				StartDate:      v.StartDate,
+				EndDate:        v.EndDate,
+				StartTime:      v.StartTime,
+				EndTime:        v.EndTime,
+				Remark:         "标签不存在",
+				SysUserId:      fmt.Sprint(sysUser.AdminId),
+		CreateTime:     time.Now(),
+			}
+			failDataList = append(failDataList, failItem)
+			continue
+		}*/
+
+		req := new(knowledge.AddReq)
+		req.Title = v.Title
+		req.Content = v.Content
+		req.SourceFrom = v.SourceFrom
+		req.ClassifyId = classifyId
+		//req.TagId = tagId
+		req.ResourceType = resourceType
+		if v.StartDate != "" {
+			req.StartTime = fmt.Sprintf("%s %s", v.StartDate, v.StartTime)
+		}
+		if v.EndDate != "" {
+			req.EndTime = fmt.Sprintf("%s %s", v.EndDate, v.EndTime)
+		}
+		tmpErr, msg := addExcelResource(req, sysUser)
+		if tmpErr != nil {
+			failItem := &knowledge.KnowledgeImportFail{
+				Title:          v.Title,
+				Content:        v.Content,
+				SourceFrom:     v.SourceFrom,
+				ClassifyFirst:  v.ClassifyFirstName,
+				ClassifySecond: v.ClassifySecondName,
+				ClassifyThird:  v.ClassifyThirdName,
+				ResourceType:   resourceType,
+				StartDate:      v.StartDate,
+				EndDate:        v.EndDate,
+				StartTime:      v.StartTime,
+				EndTime:        v.EndTime,
+				Remark:         "新增事件失败:" + msg,
+				SysUserId:      fmt.Sprint(sysUser.AdminId),
+				CreateTime:     time.Now(),
+			}
+			failDataList = append(failDataList, failItem)
+			continue
+		} else {
+			successCount++
+		}
+	}
+
+	// 失败数量
+	failCount = len(failDataList)
+	//fmt.Println("failDataList:", len(failDataList))
+	if failCount > 0 {
+		failObj := new(knowledge.KnowledgeImportFail)
+		//先删除导入失败记录
+		_ = failObj.Delete(sysUser.AdminId)
+
+		// 批量添加导入失败记录
+		err = failObj.MultiAdd(failDataList)
+		if err != nil {
+			go alarm_msg.SendAlarmMsg("导入数据 新增失败记录失败,Err:"+err.Error(), 3)
+			//go utils.SendEmail(utils.APPNAME+"失败提醒", "导入数据 新增失败记录失败:Err:"+err.Error(), utils.EmailSendToUsers)
+		}
+
+		{
+			//错误信息字符串切片,最后作为发送邮件通知使用
+			failContents := make([]string, 0)
+			for _, v := range failDataList {
+				failContents = append(failContents, fmt.Sprint(v.Title, "导入失败:", v.Remark))
+			}
+			utils.FileLog.Info("导入数据 存在部分数据导入失败:" + strings.Join(failContents, ";"))
+			//导入失败的话,最后统一邮件提醒就好啦,不需要每次都去提醒
+			go alarm_msg.SendAlarmMsg("导入数据 存在部分数据导入失败:"+strings.Join(failContents, ";"), 3)
+		}
+	}
+
+	return
+}
+
+// getDataByTemplateEvent
+func getDataByTemplateEvent(sheet *xlsx.Sheet, sysUserId, resourceType int) (indexDataList []knowledge.ResourceImportData, failDataList []*knowledge.KnowledgeImportFail, err error, errMsg string) {
+	fmt.Println("sheet name: ", sheet.Name)
+	indexDataList = make([]knowledge.ResourceImportData, 0)
+	failDataList = make([]*knowledge.KnowledgeImportFail, 0)
+
+	//遍历行读取
+	maxRow := sheet.MaxRow
+	fmt.Println("maxRow:", maxRow)
+
+	// 表头信息
+	if maxRow <= 3 {
+		errMsg = "模板异常1"
+		err = errors.New(errMsg)
+		return
+	}
+
+	// 表头校验
+	{
+		headerRow := sheet.Row(1)
+		cells := headerRow.Cells
+		fmt.Println("cells:", len(cells))
+		if len(cells) < 11 {
+			errMsg = "导入文件异常,请下载最新导入模板文件"
+			err = errors.New(errMsg)
+			return
+		}
+		// 循环打印每个单元格
+		for k, v := range cells {
+			fmt.Println("第", k, "个单元格", v.Value)
+		}
+		templateFail := false
+		if cells[0].Value != "开始时间" {
+			templateFail = true
+		}
+		if cells[2].Value != "结束时间(非必填)" {
+			templateFail = true
+		}
+		if cells[4].Value != "标题" {
+			templateFail = true
+		}
+		if cells[5].Value != "正文" {
+			templateFail = true
+		}
+		if cells[6].Value != "来源" {
+			templateFail = true
+		}
+		if cells[7].Value != "一级分类" {
+			templateFail = true
+		}
+		if cells[8].Value != "二级分类" {
+			templateFail = true
+		}
+		if cells[9].Value != "三级分类" {
+			templateFail = true
+		}
+		if cells[10].Value != "标签" {
+			templateFail = true
+		}
+
+		headerRow2 := sheet.Row(2)
+		cells2 := headerRow2.Cells
+		for k, v := range cells2 {
+			fmt.Println("2第", k, "个单元格", v.Value)
+		}
+		if len(cells2) < 11 {
+			templateFail = true
+		} else {
+			if cells2[0].Value != "日期" {
+				templateFail = true
+			}
+			if cells2[1].Value != "时间" {
+				templateFail = true
+			}
+			if cells2[2].Value != "日期" {
+				templateFail = true
+			}
+			if cells2[3].Value != "时间" {
+				templateFail = true
+			}
+		}
+
+		if templateFail {
+			fmt.Println("头部信息校验失败")
+			errMsg = "导入文件异常,请下载最新导入模板文件"
+			err = errors.New(errMsg)
+			return
+		}
+	}
+
+	for i := 3; i < maxRow; i++ {
+		row := sheet.Row(i)
+		cells := row.Cells
+		lenCell := len(cells)
+		for k, v := range cells {
+			fmt.Println("数据第行", i, "第", k, "个单元格", v.Value)
+		}
+		// 过滤空白行
+		if lenCell <= 0 {
+			continue
+		}
+		fmt.Println("lenCell:", lenCell)
+		if lenCell < 12 {
+			if cells[0].Value == `` {
+				continue
+			}
+			errMsg = "导入文件异常,请下载最新导入模板文件"
+			err = errors.New(errMsg)
+			return
+		}
+		startDate := strings.TrimSpace(cells[0].Value) //开始时间
+		startTime := strings.TrimSpace(cells[1].Value) //开始时间
+		endDate := strings.TrimSpace(cells[2].Value)   //结束时间
+		endTime := strings.TrimSpace(cells[3].Value)   //结束时间
+		startDateO := startDate
+		endDateO := endDate
+		startTimeO := startTime
+		endTimeO := endTime
+		title := strings.TrimSpace(cells[4].Value)         //标题
+		content := strings.TrimSpace(cells[5].Value)       //正文
+		sourceFrom := strings.TrimSpace(cells[6].Value)    //来源
+		classifyName1 := strings.TrimSpace(cells[7].Value) //一级分类
+		classifyName2 := strings.TrimSpace(cells[8].Value) //二级分类
+		classifyName3 := strings.TrimSpace(cells[9].Value) //三级分类
+		tag := strings.TrimSpace(cells[10].Value)          //标签
+
+		if title == "" || content == "" || sourceFrom == "" || classifyName1 == "" { //过滤空白行
+			continue
+		}
+
+		// 校验日期格式
+		if startDate != "" {
+			// 判断9:09:14日期格式是否正确
+			// 判断是否是数字
+			_, tmpErr := strconv.Atoi(startDate)
+			if tmpErr == nil {
+				startDate = utils.ExcelDateToDate(startDate).Format(utils.FormatDate)
+				fmt.Println(startDate)
+			} else {
+				startDate, tmpErr = getExcelDate(startDate)
+				if tmpErr != nil {
+					failDataList = append(failDataList, &knowledge.KnowledgeImportFail{
+						//Id:           0,
+						Title:          title,
+						Content:        content,
+						SourceFrom:     sourceFrom,
+						ClassifyFirst:  classifyName1,
+						ClassifySecond: classifyName2,
+						ClassifyThird:  classifyName3,
+						ResourceType:   resourceType,
+						StartDate:      startDateO,
+						EndDate:        endDateO,
+						StartTime:      startTimeO,
+						EndTime:        endTimeO,
+						Remark:         "日期格式异常",
+						SysUserId:      strconv.Itoa(sysUserId),
+						CreateTime:     time.Now(),
+					})
+					continue
+				}
+			}
+			if startTime != "" {
+				// 判断9:09:14日期格式是否正确
+				startTimeVal, tmpErr := strconv.ParseFloat(startTime, 64)
+				if tmpErr == nil {
+					startTime = utils.ExcelTimeToTime(startTimeVal).Format(utils.FormatTime)
+					fmt.Println(startTime)
+				} else {
+					_, tmpErr = time.Parse(utils.FormatDateTime, startDate+" "+startTime)
+					if tmpErr != nil {
+						failDataList = append(failDataList, &knowledge.KnowledgeImportFail{
+							//Id:           0,
+							Title:          title,
+							Content:        content,
+							SourceFrom:     sourceFrom,
+							ClassifyFirst:  classifyName1,
+							ClassifySecond: classifyName2,
+							ClassifyThird:  classifyName3,
+							ResourceType:   resourceType,
+							StartDate:      startDateO,
+							EndDate:        endDateO,
+							StartTime:      startTimeO,
+							EndTime:        endTimeO,
+							Remark:         "日期格式异常",
+							SysUserId:      strconv.Itoa(sysUserId),
+							CreateTime:     time.Now(),
+						})
+						continue
+					}
+				}
+			}
+		}
+		if endDate != "" {
+			_, tmpErr := strconv.Atoi(endDate)
+			if tmpErr == nil {
+				endDate = utils.ExcelDateToDate(endDate).Format(utils.FormatDate)
+			} else {
+				endDate, tmpErr = getExcelDate(endDate)
+				if tmpErr != nil {
+					failDataList = append(failDataList, &knowledge.KnowledgeImportFail{
+						//Id:           0,
+						Title:          title,
+						Content:        content,
+						SourceFrom:     sourceFrom,
+						ClassifyFirst:  classifyName1,
+						ClassifySecond: classifyName2,
+						ClassifyThird:  classifyName3,
+						ResourceType:   resourceType,
+						StartDate:      startDateO,
+						EndDate:        endDateO,
+						StartTime:      startTimeO,
+						EndTime:        endTimeO,
+						Remark:         "日期格式异常",
+						SysUserId:      strconv.Itoa(sysUserId),
+						CreateTime:     time.Now(),
+					})
+					continue
+				}
+			}
+			if endTime != "" {
+				// 判断9:09:14日期格式是否正确
+				endTimeVal, tmpErr := strconv.ParseFloat(endTime, 64)
+				if tmpErr == nil {
+					endTime = utils.ExcelTimeToTime(endTimeVal).Format(utils.FormatTime)
+					fmt.Println(endTime)
+				} else {
+					_, tmpErr = time.Parse(utils.FormatDateTime, endDate+" "+endTime)
+					if tmpErr != nil {
+						failDataList = append(failDataList, &knowledge.KnowledgeImportFail{
+							//Id:           0,
+							Title:          title,
+							Content:        content,
+							SourceFrom:     sourceFrom,
+							ClassifyFirst:  classifyName1,
+							ClassifySecond: classifyName2,
+							ClassifyThird:  classifyName3,
+							ResourceType:   resourceType,
+							StartDate:      startDate,
+							EndDate:        endDate,
+							StartTime:      startTimeO,
+							EndTime:        endTimeO,
+							Remark:         "日期格式异常",
+							SysUserId:      strconv.Itoa(sysUserId),
+							CreateTime:     time.Now(),
+						})
+						continue
+					}
+				}
+			}
+		}
+
+		resourceItem := knowledge.ResourceImportData{
+			Title:              title,
+			StartDate:          startDate,
+			EndDate:            endDate,
+			StartTime:          startTime,
+			EndTime:            endTime,
+			Content:            content,
+			Tag:                tag,
+			SourceFrom:         sourceFrom,
+			ClassifyFirstName:  classifyName1,
+			ClassifySecondName: classifyName2,
+			ClassifyThirdName:  classifyName3,
+		}
+		indexDataList = append(indexDataList, resourceItem)
+	}
+	return
+}
+
+func getExcelDate(createDate string) (newCreateDate string, err error) {
+	if strings.Contains(createDate, "-") {
+		//如果是带有 - 的普通日期格式文本
+		_, err = time.Parse("2006-1-2", createDate)
+		if err == nil {
+			newCreateDate = createDate
+		}
+	} else if strings.Contains(createDate, "/") {
+		//如果是带有 / 的普通日期格式文本
+		createDateTime, timeErr := time.Parse("2006/1/2", createDate)
+		if timeErr != nil {
+			err = timeErr
+		} else {
+			newCreateDate = createDateTime.Format("2006-01-02")
+		}
+	} else {
+		//可能是excel的日期格式
+		_, tmpErr := strconv.Atoi(createDate)
+		if tmpErr != nil {
+			err = tmpErr
+		} else {
+			newCreateDate = utils.ConvertToFormatDay(createDate) //录入日期
+		}
+	}
+
+	return
+}
+
+func addExcelResource(req *knowledge.AddReq, sysUser *system.Admin) (err error, errMsg string) {
+	var startTime time.Time
+	var endTime time.Time
+	if req.StartTime != "" {
+		startTime, err = time.ParseInLocation(utils.FormatDateTime, req.StartTime, time.Local)
+		if err != nil { // 如果时间格式不正确,则返回错误信息
+			errMsg = "开始时间格式不正确"
+			err = fmt.Errorf("开始时间格式不正确,Err:" + err.Error())
+			return
+		}
+	}
+	if req.EndTime != "" {
+		endTime, err = time.ParseInLocation(utils.FormatDateTime, req.EndTime, time.Local)
+		if err != nil { // 如果时间格式不正确,则返回错误信息
+			errMsg = "结束时间格式不正确"
+			err = fmt.Errorf("结束时间格式不正确,Err:" + err.Error())
+			return
+		}
+	}
+	item := new(knowledge.KnowledgeResource)
+	item.ClassifyId = req.ClassifyId
+	item.TagId = req.TagId
+	item.SourceFrom = req.SourceFrom
+	item.ResourceType = req.ResourceType
+	item.Title = req.Title
+	item.State = 1
+	item.Content = html.EscapeString(req.Content)
+	timestamp := strconv.FormatInt(time.Now().UnixNano(), 10)
+	item.ResourceCode = utils.MD5(utils.CHART_PREFIX + "_" + timestamp)
+	//todo 内容前5行
+	//item.ContentSub = html.EscapeString(contentSub)
+
+	if !startTime.IsZero() {
+		item.StartTime = &startTime
+	}
+	if !endTime.IsZero() {
+		item.EndTime = &endTime
+	}
+	item.ModifyTime = time.Now()
+	item.AdminId = sysUser.AdminId
+	item.AdminRealName = sysUser.RealName
+	//item.LastModifyAdminId = sysUser.AdminId
+	//item.LastModifyAdminName = sysUser.RealName
+	item.ModifyTime = time.Now()
+	item.CreateTime = time.Now()
+
+	err = item.Add(item)
+	if err != nil {
+		errMsg = "保存失败"
+		err = fmt.Errorf("保存失败,Err:" + err.Error())
+		return
+	}
+	//todo 是否需要保存到es中
+	return
+}

+ 21 - 0
utils/common.go

@@ -2687,3 +2687,24 @@ func AppendPars(pars []interface{}, values ...interface{}) []interface{} {
 	}
 	}
 	return append(pars, values...)
 	return append(pars, values...)
 }
 }
+
+func ExcelDateToDate(excelDate string) time.Time {
+	excelTime := time.Date(1899, time.December, 30, 0, 0, 0, 0, time.UTC)
+	var days, _ = strconv.Atoi(excelDate)
+	return excelTime.Add(time.Second * time.Duration(days*86400))
+}
+
+// ExcelTimeToTime 将 Excel 中的时间浮点数转换为 Go 的 time.Time(只包含时间部分)
+func ExcelTimeToTime(excelTime float64) time.Time {
+	// Excel 中的时间是从 0(1900-01-00 00:00:00,注意 Excel 的日期基准问题)开始的浮点数天数
+	// 这里我们假设日期部分为 0(即只处理时间),并创建一个基准时间(可以是任意日期,因为我们只关心时间)
+	baseTime := time.Date(1899, time.December, 30, 0, 0, 0, 0, time.UTC) // 注意:这里使用 1899-12-30 是因为 Excel 的日期系统从这一天开始(考虑到 1900 年错误)
+
+	// 计算小时、分钟和秒
+	hours := int(excelTime * 24)
+	minutes := int(math.Mod(excelTime*24*60, 60))
+	seconds := int(math.Mod(excelTime*24*60*60, 60))
+
+	// 创建一个只包含时间部分的 time.Time 对象
+	return time.Date(baseTime.Year(), baseTime.Month(), baseTime.Day(), hours, minutes, seconds, 0, time.UTC)
+}