Quellcode durchsuchen

Merge branch 'feature/eta_1.7.8'

hsun vor 10 Monaten
Ursprung
Commit
75c47fb324

+ 372 - 0
controllers/fe_calendar/fe_calendar_matter.go

@@ -0,0 +1,372 @@
+package fe_calendar
+
+import (
+	"encoding/json"
+	"eta/eta_api/controllers"
+	"eta/eta_api/models"
+	"eta/eta_api/models/fe_calendar"
+	"eta/eta_api/utils"
+	"fmt"
+	"strings"
+	"time"
+)
+
+// FeCalendarMatterController 外汇日历-事项
+type FeCalendarMatterController struct {
+	controllers.BaseAuthController
+}
+
+// List
+// @Title 事项列表
+// @Description 事项列表
+// @Param   ChartPermissionId	query	int		true	"品种ID"
+// @Param   StartDate			query	string	true	"开始日期"
+// @Param   EndDate				query   string	true	"结束日期"
+// @Success 200 {object} fe_calendar.FeCalendarMatterListItem
+// @router /matter/list [get]
+func (this *FeCalendarMatterController) List() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		if br.ErrMsg == "" {
+			br.IsSendEmail = false
+		}
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+	sysUser := this.SysUser
+	if sysUser == nil {
+		br.Msg = "请登录"
+		br.ErrMsg = "请登录,SysUser Is Empty"
+		br.Ret = 408
+		return
+	}
+	params := new(fe_calendar.FeCalendarMatterListReq)
+	if e := this.ParseForm(params); e != nil {
+		br.Msg = "获取失败"
+		br.ErrMsg = "入参解析失败, Err: " + e.Error()
+		return
+	}
+	if params.ChartPermissionId <= 0 {
+		br.Msg = "请选择品种"
+		return
+	}
+
+	cond := ``
+	pars := make([]interface{}, 0)
+	if params.ChartPermissionId > 0 {
+		cond += fmt.Sprintf(` AND %s = ?`, fe_calendar.FeCalendarMatterCols.ChartPermissionId)
+		pars = append(pars, params.ChartPermissionId)
+	}
+	if params.StartDate != "" && params.EndDate != "" {
+		_, e := time.Parse(utils.FormatDate, params.StartDate)
+		if e != nil {
+			br.Msg = "开始日期格式有误"
+			return
+		}
+		_, e = time.Parse(utils.FormatDate, params.EndDate)
+		if e != nil {
+			br.Msg = "结束日期格式有误"
+			return
+		}
+		cond += fmt.Sprintf(` AND %s >= ? AND %s <= ?`, fe_calendar.FeCalendarMatterCols.MatterDate, fe_calendar.FeCalendarMatterCols.MatterDate)
+		pars = append(pars, params.StartDate, params.EndDate)
+	}
+
+	matterOb := new(fe_calendar.FeCalendarMatter)
+	order := fmt.Sprintf(`%s ASC, %s ASC`, fe_calendar.FeCalendarMatterCols.MatterDate, fe_calendar.FeCalendarMatterCols.Sort)
+	matters, e := matterOb.GetItemsByCondition(cond, pars, []string{}, order)
+	if e != nil {
+		br.Msg = "获取失败"
+		br.ErrMsg = "获取事项列表失败, Err: " + e.Error()
+		return
+	}
+
+	dateMatter := make(map[string][]*fe_calendar.FeCalendarMatterItem)
+	for _, v := range matters {
+		d := v.MatterDate.Format(utils.FormatDate)
+		if dateMatter[d] == nil {
+			dateMatter[d] = make([]*fe_calendar.FeCalendarMatterItem, 0)
+		}
+		dateMatter[d] = append(dateMatter[d], fe_calendar.FormatFeCalendarMatter2Item(v))
+	}
+	dateExist := make(map[string]bool)
+	resp := make([]*fe_calendar.FeCalendarMatterListItem, 0)
+	for _, v := range matters {
+		d := v.MatterDate.Format(utils.FormatDate)
+		if dateExist[d] {
+			continue
+		}
+		dateExist[d] = true
+		resp = append(resp, &fe_calendar.FeCalendarMatterListItem{
+			Date:    d,
+			Matters: dateMatter[d],
+		})
+	}
+
+	br.Data = resp
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "获取成功"
+}
+
+// Detail
+// @Title 事项详情
+// @Description 事项详情
+// @Param   ChartPermissionId  query  int  true  "品种ID"
+// @Param   MatterDate  query  string  true  "事项日期"
+// @Success 200 {object} fe_calendar.FeCalendarMatterItem
+// @router /matter/detail [get]
+func (this *FeCalendarMatterController) Detail() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		if br.ErrMsg == "" {
+			br.IsSendEmail = false
+		}
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+	sysUser := this.SysUser
+	if sysUser == nil {
+		br.Msg = "请登录"
+		br.ErrMsg = "请登录,SysUser Is Empty"
+		br.Ret = 408
+		return
+	}
+	permissionId, _ := this.GetInt("ChartPermissionId")
+	if permissionId <= 0 {
+		br.Msg = "请选择品种"
+		return
+	}
+	matterDate := this.GetString("MatterDate")
+	if matterDate == "" {
+		br.Msg = "请选择日期"
+		return
+	}
+	_, e := time.Parse(utils.FormatDate, matterDate)
+	if e != nil {
+		br.Msg = "日期格式有误"
+		return
+	}
+
+	matterOb := new(fe_calendar.FeCalendarMatter)
+	cond := fmt.Sprintf(` AND %s = ? AND %s = ?`, fe_calendar.FeCalendarMatterCols.ChartPermissionId, fe_calendar.FeCalendarMatterCols.MatterDate)
+	pars := make([]interface{}, 0)
+	pars = append(pars, permissionId, matterDate)
+	order := fmt.Sprintf(`%s ASC`, fe_calendar.FeCalendarMatterCols.Sort)
+	matters, e := matterOb.GetItemsByCondition(cond, pars, []string{}, order)
+	if e != nil {
+		br.Msg = "获取失败"
+		br.ErrMsg = "获取事项列表失败, Err: " + e.Error()
+		return
+	}
+	resp := make([]*fe_calendar.FeCalendarMatterItem, 0)
+	for _, v := range matters {
+		resp = append(resp, fe_calendar.FormatFeCalendarMatter2Item(v))
+	}
+
+	br.Data = resp
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "获取成功"
+}
+
+// Save
+// @Title 保存事项
+// @Description 保存事项
+// @Param	request	body fe_calendar.FeCalendarMatterSaveReq true "type json string"
+// @Success 200 string "操作成功"
+// @router /matter/save [post]
+func (this *FeCalendarMatterController) Save() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		if br.ErrMsg == "" {
+			br.IsSendEmail = false
+		}
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+	sysUser := this.SysUser
+	if sysUser == nil {
+		br.Msg = "请登录"
+		br.ErrMsg = "请登录,SysUser Is Empty"
+		br.Ret = 408
+		return
+	}
+	var req fe_calendar.FeCalendarMatterSaveReq
+	if e := json.Unmarshal(this.Ctx.Input.RequestBody, &req); e != nil {
+		br.Msg = "参数有误"
+		br.ErrMsg = "参数解析失败, Err: " + e.Error()
+		return
+	}
+	// 参数校验
+	if req.ChartPermissionId <= 0 {
+		br.Msg = "请选择品种"
+		return
+	}
+	if req.MatterDate == "" {
+		br.Msg = "请选择日期"
+		return
+	}
+	var matterMonth string
+	matterDate, e := time.ParseInLocation(utils.FormatDate, req.MatterDate, time.Local)
+	if e != nil {
+		br.Msg = "日期格式有误"
+		return
+	}
+	matterMonth = matterDate.Format("2006-01")
+	if len(req.Matters) > 0 {
+		for _, v := range req.Matters {
+			if v.MatterType != fe_calendar.MatterTypeFree && v.MatterType != fe_calendar.MatterTypeEdb && v.MatterType != fe_calendar.MatterTypePredict {
+				br.Msg = "事项类型有误"
+				br.ErrMsg = fmt.Sprintf("事项类型有误, MatterType: %d", v.MatterType)
+				return
+			}
+			v.Title = strings.TrimSpace(v.Title)
+			if v.Title == "" {
+				br.Msg = "请输入指标/事项名称"
+				return
+			}
+			if len([]rune(v.Title)) > 15 {
+				br.Msg = "名称超出15个字,请重新编辑"
+				return
+			}
+			if v.MatterType == fe_calendar.MatterTypeEdb || v.MatterType == fe_calendar.MatterTypePredict {
+				if v.EdbInfoId <= 0 || v.EdbUniqueCode == "" || v.EdbCode == "" {
+					br.Msg = "指标信息有误"
+					br.ErrMsg = fmt.Sprintf("指标信息有误, EdbInfoId: %d, EdbUniqueCode: %s, EdbCode: %s", v.EdbInfoId, v.EdbUniqueCode, v.EdbCode)
+					return
+				}
+			}
+		}
+	}
+
+	// 品种信息
+	permissionItem, e := models.GetChartPermissionById(req.ChartPermissionId)
+	if e != nil {
+		br.Msg = "操作失败"
+		br.ErrMsg = "获取品种失败, Err: " + e.Error()
+		return
+	}
+
+	// 获取已有事项
+	matterOb := new(fe_calendar.FeCalendarMatter)
+	cond := fmt.Sprintf(` AND %s = ? AND %s = ?`, fe_calendar.FeCalendarMatterCols.ChartPermissionId, fe_calendar.FeCalendarMatterCols.MatterDate)
+	pars := make([]interface{}, 0)
+	pars = append(pars, req.ChartPermissionId, req.MatterDate)
+	order := fmt.Sprintf(`%s ASC`, fe_calendar.FeCalendarMatterCols.Sort)
+	matters, e := matterOb.GetItemsByCondition(cond, pars, []string{}, order)
+	if e != nil {
+		br.Msg = "操作失败"
+		br.ErrMsg = "获取已有事项列表失败, Err: " + e.Error()
+		return
+	}
+
+	addMatters := make([]*fe_calendar.FeCalendarMatter, 0)
+	editMatters := make([]*fe_calendar.FeCalendarMatter, 0)
+	removeMatters := make([]*fe_calendar.FeCalendarMatter, 0)
+	updateCols := []string{fe_calendar.FeCalendarMatterCols.Title, fe_calendar.FeCalendarMatterCols.FontColor, fe_calendar.FeCalendarMatterCols.FillingColor, fe_calendar.FeCalendarMatterCols.FontBold, fe_calendar.FeCalendarMatterCols.Sort, fe_calendar.FeCalendarMatterCols.ChartPermissionName, fe_calendar.FeCalendarMatterCols.ModifyTime}
+
+	editIds := make([]int, 0)
+	editMatterMap := make(map[int]*fe_calendar.FeCalendarMatterSaveItem)
+	for _, v := range req.Matters {
+		// 更新的事项map
+		if v.FeCalendarMatterId > 0 {
+			editIds = append(editIds, v.FeCalendarMatterId)
+			editMatterMap[v.FeCalendarMatterId] = v
+			continue
+		}
+		// 新增事项
+		addMatters = append(addMatters, &fe_calendar.FeCalendarMatter{
+			ChartPermissionId:   req.ChartPermissionId,
+			ChartPermissionName: permissionItem.PermissionName,
+			MatterMonth:         matterMonth,
+			MatterDate:          matterDate,
+			Title:               strings.TrimSpace(v.Title),
+			MatterType:          v.MatterType,
+			EdbInfoId:           v.EdbInfoId,
+			EdbUniqueCode:       v.EdbUniqueCode,
+			EdbCode:             v.EdbCode,
+			FontColor:           v.FontColor,
+			FillingColor:        v.FillingColor,
+			FontBold:            v.FontBold,
+			Sort:                v.Sort,
+			SysUserId:           sysUser.AdminId,
+			SysUserName:         sysUser.RealName,
+			CreateTime:          time.Now().Local(),
+			ModifyTime:          time.Now().Local(),
+		})
+	}
+	for _, v := range matters {
+		// 移除的事项
+		if !utils.InArrayByInt(editIds, v.FeCalendarMatterId) {
+			removeMatters = append(removeMatters, v)
+			continue
+		}
+		// 编辑的事项
+		ed := editMatterMap[v.FeCalendarMatterId]
+		if ed != nil {
+			v.Title = strings.TrimSpace(ed.Title)
+			v.FontColor = ed.FontColor
+			v.FillingColor = ed.FillingColor
+			v.FontBold = ed.FontBold
+			v.Sort = ed.Sort
+			v.ChartPermissionName = permissionItem.PermissionName
+			v.ModifyTime = time.Now().Local()
+			editMatters = append(editMatters, v)
+		}
+	}
+
+	// 保存/删除
+	if e = matterOb.Save(addMatters, editMatters, removeMatters, updateCols); e != nil {
+		br.Msg = "操作失败"
+		br.ErrMsg = "保存事项失败, Err: " + e.Error()
+		return
+	}
+
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "操作成功"
+}
+
+// PermissionList
+// @Title 品种列表
+// @Description 品种列表
+// @Success 200 {object} models.SimpleChartPermission
+// @router /permission/list [get]
+func (this *FeCalendarMatterController) PermissionList() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		if br.ErrMsg == "" {
+			br.IsSendEmail = false
+		}
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+
+	permissions, e := models.GetChartPermissionsByProductId()
+	if e != nil {
+		br.Msg = "获取失败"
+		br.ErrMsg = "获取品种列表失败, Err: " + e.Error()
+		return
+	}
+	resp := make([]*models.SimpleChartPermission, 0)
+	parentPermissions := make(map[int][]*models.SimpleChartPermission, 0)
+	for _, v := range permissions {
+		if v.ParentId > 0 {
+			if parentPermissions[v.ParentId] == nil {
+				parentPermissions[v.ParentId] = make([]*models.SimpleChartPermission, 0)
+			}
+			parentPermissions[v.ParentId] = append(parentPermissions[v.ParentId], models.FormatChartPermission2Simple(v))
+			continue
+		}
+		resp = append(resp, models.FormatChartPermission2Simple(v))
+	}
+	for _, v := range resp {
+		v.Children = parentPermissions[v.ChartPermissionId]
+	}
+
+	br.Data = resp
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "获取成功"
+}

+ 46 - 0
models/chart_permission.go

@@ -7,6 +7,10 @@ import (
 	"time"
 )
 
+const (
+	FiccProductId = 1
+)
+
 // ChartPermission 报告权限表
 type ChartPermission struct {
 	ChartPermissionId     int       `orm:"column(chart_permission_id);pk" description:"问题ID" json:"chart_permission_id"`
@@ -210,3 +214,45 @@ func (c *ChartPermission) GetFirstChartPermissionByParentId(parentId int) (item
 	err = o.Raw(sql, parentId).QueryRow(&item)
 	return
 }
+
+// GetChartPermissionById 主键获取品种
+func GetChartPermissionById(permissionId int) (item *ChartPermission, err error) {
+	o := orm.NewOrmUsingDB("rddp")
+	sql := `SELECT * FROM chart_permission WHERE chart_permission_id = ?`
+	err = o.Raw(sql, permissionId).QueryRow(&item)
+	return
+}
+
+// GetSecondaryChartPermissions 获取二级权限列表
+func GetSecondaryChartPermissions() (list []*ChartPermission, err error) {
+	o := orm.NewOrmUsingDB("rddp")
+	sql := `SELECT * FROM chart_permission WHERE product_id = ? AND parent_id > 0 AND enabled = 1 ORDER BY parent_id ASC, sort ASC, created_time ASC`
+	_, err = o.Raw(sql, FiccProductId).QueryRows(&list)
+	return
+}
+
+type SimpleChartPermission struct {
+	ChartPermissionId   int                      `description:"品种ID"`
+	ChartPermissionName string                   `description:"品种名称"`
+	Sort                int                      `description:"排序"`
+	Children            []*SimpleChartPermission `description:"子分类"`
+}
+
+func FormatChartPermission2Simple(origin *ChartPermission) (item *SimpleChartPermission) {
+	if origin == nil {
+		return
+	}
+	item = new(SimpleChartPermission)
+	item.ChartPermissionId = origin.ChartPermissionId
+	item.ChartPermissionName = origin.PermissionName
+	item.Sort = origin.Sort
+	return
+}
+
+// GetChartPermissionsByProductId 获取权限列表
+func GetChartPermissionsByProductId() (list []*ChartPermission, err error) {
+	o := orm.NewOrmUsingDB("rddp")
+	sql := `SELECT * FROM chart_permission WHERE product_id = ? AND enabled = 1 ORDER BY parent_id ASC, sort ASC, created_time ASC`
+	_, err = o.Raw(sql, FiccProductId).QueryRows(&list)
+	return
+}

+ 11 - 0
models/db.go

@@ -13,6 +13,7 @@ import (
 	"eta/eta_api/models/data_manage/supply_analysis"
 	"eta/eta_api/models/data_stat"
 	"eta/eta_api/models/eta_trial"
+	"eta/eta_api/models/fe_calendar"
 	"eta/eta_api/models/ppt_english"
 	"eta/eta_api/models/report_approve"
 	"eta/eta_api/models/sandbox"
@@ -194,6 +195,9 @@ func init() {
 	// 初始化数据资产权限的一些表
 	initDataMangePerMission()
 
+	// 初始化外汇日历
+	initFeCalendar()
+
 	// 初始化部分数据表变量(直接init会有顺序问题=_=!)
 	data_manage.InitEdbSourceVar()
 }
@@ -595,3 +599,10 @@ func initDataMangePerMission() {
 		new(data_manage_permission.DataPermissionNoAuthRecord),              // 资产数据权限设置记录表
 	)
 }
+
+// initFeCalendar 初始化外汇日历
+func initFeCalendar() {
+	orm.RegisterModel(
+		new(fe_calendar.FeCalendarMatter), // 事项表
+	)
+}

+ 303 - 0
models/fe_calendar/fe_calendar_matter.go

@@ -0,0 +1,303 @@
+package fe_calendar
+
+import (
+	"eta/eta_api/utils"
+	"fmt"
+	"github.com/beego/beego/v2/client/orm"
+	"strings"
+	"time"
+)
+
+const (
+	MatterTypeFree    = 1 // 事项类型-自定义事项
+	MatterTypeEdb     = 2 // 事项类型-基础指标
+	MatterTypePredict = 3 // 事项类型-预测指标
+)
+
+// FeCalendarMatter 外汇日历-事项表
+type FeCalendarMatter struct {
+	FeCalendarMatterId  int       `orm:"column(fe_calendar_matter_id);pk" description:"事项ID"`
+	ChartPermissionId   int       `description:"品种ID"`
+	ChartPermissionName string    `description:"品种名称"`
+	MatterMonth         string    `description:"事项年月:格式2006-01"`
+	MatterDate          time.Time `description:"事项日期"`
+	Title               string    `description:"标题"`
+	MatterType          int       `description:"事项类型:1-自定义事项;2-基础指标;3-预测指标"`
+	EdbInfoId           int       `description:"指标ID"`
+	EdbUniqueCode       string    `description:"指标唯一编码"`
+	EdbCode             string    `description:"指标编码"`
+	FontColor           string    `description:"字体颜色"`
+	FillingColor        string    `description:"填充颜色"`
+	FontBold            int       `description:"字体加粗:0-否;1-是"`
+	Sort                int       `description:"排序"`
+	SysUserId           int       `description:"创建人ID"`
+	SysUserName         string    `description:"创建人姓名"`
+	CreateTime          time.Time `description:"创建时间"`
+	ModifyTime          time.Time `description:"更新时间"`
+}
+
+var FeCalendarMatterCols = struct {
+	FeCalendarMatterId  string
+	ChartPermissionId   string
+	ChartPermissionName string
+	MatterMonth         string
+	MatterDate          string
+	Title               string
+	MatterType          string
+	EdbInfoId           string
+	EdbUniqueCode       string
+	EdbCode             string
+	FontColor           string
+	FillingColor        string
+	FontBold            string
+	Sort                string
+	SysUserId           string
+	SysUserName         string
+	CreateTime          string
+	ModifyTime          string
+}{
+	FeCalendarMatterId:  "fe_calendar_matter_id",
+	ChartPermissionId:   "chart_permission_id",
+	ChartPermissionName: "chart_permission_name",
+	MatterMonth:         "matter_month",
+	MatterDate:          "matter_date",
+	Title:               "title",
+	MatterType:          "matter_type",
+	EdbInfoId:           "edb_info_id",
+	EdbUniqueCode:       "edb_unique_code",
+	EdbCode:             "edb_code",
+	FontColor:           "font_color",
+	FillingColor:        "filling_color",
+	FontBold:            "font_bold",
+	Sort:                "sort",
+	SysUserId:           "sys_user_id",
+	SysUserName:         "sys_user_name",
+	CreateTime:          "create_time",
+	ModifyTime:          "modify_time",
+}
+
+func (m *FeCalendarMatter) TableName() string {
+	return "fe_calendar_matter"
+}
+
+func (m *FeCalendarMatter) PrimaryId() string {
+	return FeCalendarMatterCols.FeCalendarMatterId
+}
+
+func (m *FeCalendarMatter) Create() (err error) {
+	o := orm.NewOrmUsingDB("data")
+	id, err := o.Insert(m)
+	if err != nil {
+		return
+	}
+	m.FeCalendarMatterId = int(id)
+	return
+}
+
+func (m *FeCalendarMatter) CreateMulti(items []*FeCalendarMatter) (err error) {
+	if len(items) == 0 {
+		return
+	}
+	o := orm.NewOrmUsingDB("data")
+	_, err = o.InsertMulti(len(items), items)
+	return
+}
+
+func (m *FeCalendarMatter) Update(cols []string) (err error) {
+	o := orm.NewOrmUsingDB("data")
+	_, err = o.Update(m, cols...)
+	return
+}
+
+func (m *FeCalendarMatter) Del() (err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := fmt.Sprintf(`DELETE FROM %s WHERE %s = ? LIMIT 1`, m.TableName(), m.PrimaryId())
+	_, err = o.Raw(sql, m.FeCalendarMatterId).Exec()
+	return
+}
+
+func (m *FeCalendarMatter) MultiDel(menuIds []int) (err error) {
+	if len(menuIds) == 0 {
+		return
+	}
+	o := orm.NewOrmUsingDB("data")
+	sql := fmt.Sprintf(`DELETE FROM %s WHERE %s IN (%s)`, m.TableName(), m.PrimaryId(), utils.GetOrmInReplace(len(menuIds)))
+	_, err = o.Raw(sql, menuIds).Exec()
+	return
+}
+
+func (m *FeCalendarMatter) GetItemById(id int) (item *FeCalendarMatter, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := fmt.Sprintf(`SELECT * FROM %s WHERE %s = ? LIMIT 1`, m.TableName(), m.PrimaryId())
+	err = o.Raw(sql, id).QueryRow(&item)
+	return
+}
+
+func (m *FeCalendarMatter) GetItemByCondition(condition string, pars []interface{}, orderRule string) (item *FeCalendarMatter, err error) {
+	o := orm.NewOrmUsingDB("data")
+	order := ``
+	if orderRule != "" {
+		order = ` ORDER BY ` + orderRule
+	}
+	sql := fmt.Sprintf(`SELECT * FROM %s WHERE 1=1 %s %s LIMIT 1`, m.TableName(), condition, order)
+	err = o.Raw(sql, pars).QueryRow(&item)
+	return
+}
+
+func (m *FeCalendarMatter) GetCountByCondition(condition string, pars []interface{}) (count int, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := fmt.Sprintf(`SELECT COUNT(1) FROM %s WHERE 1=1 %s`, m.TableName(), condition)
+	err = o.Raw(sql, pars).QueryRow(&count)
+	return
+}
+
+func (m *FeCalendarMatter) GetItemsByCondition(condition string, pars []interface{}, fieldArr []string, orderRule string) (items []*FeCalendarMatter, err error) {
+	o := orm.NewOrmUsingDB("data")
+	fields := strings.Join(fieldArr, ",")
+	if len(fieldArr) == 0 {
+		fields = `*`
+	}
+	order := fmt.Sprintf(`ORDER BY %s DESC`, FeCalendarMatterCols.CreateTime)
+	if orderRule != "" {
+		order = ` ORDER BY ` + orderRule
+	}
+	sql := fmt.Sprintf(`SELECT %s FROM %s WHERE 1=1 %s %s`, fields, m.TableName(), condition, order)
+	_, err = o.Raw(sql, pars).QueryRows(&items)
+	return
+}
+
+func (m *FeCalendarMatter) GetPageItemsByCondition(condition string, pars []interface{}, fieldArr []string, orderRule string, startSize, pageSize int) (items []*FeCalendarMatter, err error) {
+	o := orm.NewOrmUsingDB("data")
+	fields := strings.Join(fieldArr, ",")
+	if len(fieldArr) == 0 {
+		fields = `*`
+	}
+	order := fmt.Sprintf(`ORDER BY %s DESC`, FeCalendarMatterCols.CreateTime)
+	if orderRule != "" {
+		order = ` ORDER BY ` + orderRule
+	}
+	sql := fmt.Sprintf(`SELECT %s FROM %s WHERE 1=1 %s %s LIMIT ?,?`, fields, m.TableName(), condition, order)
+	_, err = o.Raw(sql, pars, startSize, pageSize).QueryRows(&items)
+	return
+}
+
+type FeCalendarMatterItem struct {
+	FeCalendarMatterId  int    `description:"事项ID"`
+	ChartPermissionId   int    `description:"品种ID"`
+	ChartPermissionName string `description:"品种名称"`
+	MatterDate          string `description:"事项日期"`
+	Title               string `description:"标题"`
+	MatterType          int    `description:"事项类型:1-自定义事项;2-基础指标;3-预测指标"`
+	EdbInfoId           int    `description:"指标ID"`
+	EdbUniqueCode       string `description:"指标唯一编码"`
+	EdbCode             string `description:"指标编码"`
+	FontColor           string `description:"字体颜色"`
+	FillingColor        string `description:"填充颜色"`
+	FontBold            int    `description:"字体加粗:0-否;1-是"`
+	Sort                int    `description:"排序"`
+}
+
+func FormatFeCalendarMatter2Item(origin *FeCalendarMatter) (item *FeCalendarMatterItem) {
+	if origin == nil {
+		return
+	}
+	item = new(FeCalendarMatterItem)
+	item.FeCalendarMatterId = origin.FeCalendarMatterId
+	item.ChartPermissionId = origin.ChartPermissionId
+	item.ChartPermissionName = origin.ChartPermissionName
+	item.MatterDate = utils.TimeTransferString(utils.FormatDate, origin.MatterDate)
+	item.Title = origin.Title
+	item.MatterType = origin.MatterType
+	item.EdbInfoId = origin.EdbInfoId
+	item.EdbUniqueCode = origin.EdbUniqueCode
+	item.EdbCode = origin.EdbCode
+	item.FontColor = origin.FontColor
+	item.FillingColor = origin.FillingColor
+	item.FontBold = origin.FontBold
+	item.Sort = origin.Sort
+	return
+}
+
+// FeCalendarMatterListReq 事项列表请求体
+type FeCalendarMatterListReq struct {
+	ChartPermissionId int    `form:"ChartPermissionId" description:"品种ID"`
+	StartDate         string `form:"StartDate" description:"开始日期"`
+	EndDate           string `form:"EndDate" description:"结束日期"`
+}
+
+// FeCalendarMatterListItem 事项列表
+type FeCalendarMatterListItem struct {
+	Date    string                  `description:"日期"`
+	Matters []*FeCalendarMatterItem `description:"日期事项"`
+}
+
+// FeCalendarMatterSaveReq 保存事项请求体
+type FeCalendarMatterSaveReq struct {
+	ChartPermissionId int                         `description:"品种ID"`
+	MatterDate        string                      `description:"日期"`
+	Matters           []*FeCalendarMatterSaveItem `description:"事项"`
+}
+
+type FeCalendarMatterSaveItem struct {
+	FeCalendarMatterId int    `description:"事项ID"`
+	Title              string `description:"标题"`
+	MatterType         int    `description:"事项类型:1-自定义事项;2-基础指标;3-预测指标"`
+	EdbInfoId          int    `description:"指标ID"`
+	EdbUniqueCode      string `description:"指标唯一编码"`
+	EdbCode            string `description:"指标编码"`
+	FontColor          string `description:"字体颜色"`
+	FillingColor       string `description:"填充颜色"`
+	FontBold           int    `description:"字体加粗:0-否;1-是"`
+	Sort               int    `description:"排序"`
+}
+
+func (m *FeCalendarMatter) Save(addMatters, editMatters, removeMatters []*FeCalendarMatter, updateCols []string) (err error) {
+	o := orm.NewOrmUsingDB("data")
+	tx, e := o.Begin()
+	if e != nil {
+		err = fmt.Errorf("begin tx err: %s", e.Error())
+		return
+	}
+	defer func() {
+		if err != nil {
+			_ = tx.Rollback()
+			return
+		}
+		_ = tx.Commit()
+	}()
+
+	if len(addMatters) > 0 {
+		_, e = tx.InsertMulti(len(addMatters), addMatters)
+		if e != nil {
+			err = fmt.Errorf("insert multi err: %s", e.Error())
+			return
+		}
+	}
+	if len(editMatters) > 0 {
+		for _, v := range editMatters {
+			_, e = tx.Update(v, updateCols...)
+			if e != nil {
+				err = fmt.Errorf("update err: %s", e.Error())
+				return
+			}
+		}
+	}
+	if len(removeMatters) > 0 {
+		p, e := tx.Raw(fmt.Sprintf(`DELETE FROM %s WHERE %s = ? LIMIT 1`, m.TableName(), m.PrimaryId())).Prepare()
+		if e != nil {
+			err = fmt.Errorf("remove prepare err: %s", e.Error())
+			return
+		}
+		defer func() {
+			_ = p.Close()
+		}()
+		for _, v := range removeMatters {
+			_, e = p.Exec(v.FeCalendarMatterId)
+			if e != nil {
+				err = fmt.Errorf("remove exec err: %s", e.Error())
+				return
+			}
+		}
+	}
+	return
+}

+ 36 - 0
routers/commentsRouter.go

@@ -5416,6 +5416,42 @@ func init() {
             Filters: nil,
             Params: nil})
 
+    beego.GlobalControllerRouter["eta/eta_api/controllers/fe_calendar:FeCalendarMatterController"] = append(beego.GlobalControllerRouter["eta/eta_api/controllers/fe_calendar:FeCalendarMatterController"],
+        beego.ControllerComments{
+            Method: "Detail",
+            Router: `/matter/detail`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["eta/eta_api/controllers/fe_calendar:FeCalendarMatterController"] = append(beego.GlobalControllerRouter["eta/eta_api/controllers/fe_calendar:FeCalendarMatterController"],
+        beego.ControllerComments{
+            Method: "List",
+            Router: `/matter/list`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["eta/eta_api/controllers/fe_calendar:FeCalendarMatterController"] = append(beego.GlobalControllerRouter["eta/eta_api/controllers/fe_calendar:FeCalendarMatterController"],
+        beego.ControllerComments{
+            Method: "Save",
+            Router: `/matter/save`,
+            AllowHTTPMethods: []string{"post"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["eta/eta_api/controllers/fe_calendar:FeCalendarMatterController"] = append(beego.GlobalControllerRouter["eta/eta_api/controllers/fe_calendar:FeCalendarMatterController"],
+        beego.ControllerComments{
+            Method: "PermissionList",
+            Router: `/permission/list`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
     beego.GlobalControllerRouter["eta/eta_api/controllers/report_approve:ReportApproveController"] = append(beego.GlobalControllerRouter["eta/eta_api/controllers/report_approve:ReportApproveController"],
         beego.ControllerComments{
             Method: "Approve",

+ 6 - 0
routers/router.go

@@ -23,6 +23,7 @@ import (
 	"eta/eta_api/controllers/data_stat"
 	"eta/eta_api/controllers/english_report"
 	"eta/eta_api/controllers/eta_trial"
+	"eta/eta_api/controllers/fe_calendar"
 	"eta/eta_api/controllers/report_approve"
 	"eta/eta_api/controllers/roadshow"
 	"eta/eta_api/controllers/sandbox"
@@ -366,6 +367,11 @@ func init() {
 				&controllers.MessageController{},
 			),
 		),
+		web.NSNamespace("/fe_calendar",
+			web.NSInclude(
+				&fe_calendar.FeCalendarMatterController{},
+			),
+		),
 	)
 	web.AddNamespace(ns)
 }