瀏覽代碼

add:BI审批列表

zqbao 6 月之前
父節點
當前提交
a74c5c3d97

+ 161 - 22
controllers/bi_approve/bi_approve.go

@@ -312,30 +312,169 @@ func (this *BiApproveController) Cancel() {
 		return
 	}
 
-	// approveOb := new(report_approve.BiApprove)
-	// approveItem, e := approveOb.GetItemById(req.BiApproveId)
-	// if e != nil {
-	// 	if utils.IsErrNoRow(e) {
-	// 		br.Msg = "审批已被删除, 请刷新页面"
-	// 		return
-	// 	}
-	// 	br.Msg = "操作失败"
-	// 	br.ErrMsg = "获取审批失败, Err: " + e.Error()
-	// 	return
-	// }
-	// if approveItem.ApplyUserId != sysUser.AdminId {
-	// 	br.Msg = "非申请人不可撤销"
-	// 	return
-	// }
+	// 撤销审批
+	msg, e := biapprove.BiApproveCancel(req.BiApproveId, sysUser.AdminId, sysUser.RealName)
+	if e != nil {
+		if msg != "" {
+			br.Msg = msg
+		} else {
+			br.Msg = "操作失败"
+		}
+		br.ErrMsg = "撤销审批失败, Err: " + e.Error()
+		return
+	}
+
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "操作成功"
+}
+
+// MessageList
+// @Title 审批消息列表
+// @Description 审批消息列表
+// @Param   PageSize			query	int		true	"每页数据条数"
+// @Param   CurrentIndex		query	int		true	"当前页页码"
+// @Success 200 {object} report_approve.BiApproveMessageListResp
+// @router /message/list [get]
+func (this *BiApproveController) MessageList() {
+	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
+	}
+	currentIndex, _ := this.GetInt("currentIndex")
+	pageSize, _ := this.GetInt("pageSize")
+	// 分页
+	var startSize int
+	if pageSize <= 0 {
+		pageSize = utils.PageSize20
+	}
+	if currentIndex <= 0 {
+		currentIndex = 1
+	}
+	startSize = utils.StartIndex(currentIndex, pageSize)
+
+	resp := new(response.BiApproveMessageListResp)
+	resp.List = make([]*response.BiApproveMessageItem, 0)
+	list, total, unRead, msg, err := biapprove.GetBiApproveMessage(sysUser.AdminId, startSize, pageSize)
+	if err != nil {
+		if msg != "" {
+			br.Msg = msg
+		} else {
+			br.Msg = "获取审批消息失败"
+		}
+		br.ErrMsg = "获取审批消息失败, Err: " + err.Error()
+		return
+	}
+	resp.List = list
+	resp.UnreadTotal = unRead
 
-	// // 撤销审批
-	// e = services.CancelBiApprove(approveItem.BiType, approveItem.BiId, approveItem.BiApproveId, sysUser.AdminId, sysUser.RealName)
-	// if e != nil {
-	// 	br.Msg = "操作失败"
-	// 	br.ErrMsg = "撤销审批失败, Err: " + e.Error()
-	// 	return
-	// }
+	page := paging.GetPaging(currentIndex, pageSize, total)
+	resp.Paging = page
+	br.Data = resp
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "获取成功"
+}
+
+// MessageRead
+// @Title 消息已读
+// @Description 消息已读
+// @Param	request	body report_approve.BiApproveMessageReadReq true "type json string"
+// @Success 200 string "操作成功"
+// @router /message/read [post]
+func (this *BiApproveController) MessageRead() {
+	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 request.BiApproveMessageReadReq
+	if e := json.Unmarshal(this.Ctx.Input.RequestBody, &req); e != nil {
+		br.Msg = "参数有误"
+		br.ErrMsg = "参数解析失败, Err: " + e.Error()
+		return
+	}
+	if req.MessageId <= 0 {
+		br.Msg = "参数有误"
+		br.ErrMsg = fmt.Sprintf("参数有误, MessageId: %d", req.MessageId)
+		return
+	}
+
+	msg, err := biapprove.ReadBiMessage(req.MessageId, sysUser.AdminId)
+	if err != nil {
+		if msg != "" {
+			br.Msg = msg
+		} else {
+			br.Msg = "操作失败"
+		}
+		br.ErrMsg = "消息已读失败, Err: " + err.Error()
+		return
+	}
+
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "操作成功"
+}
+
+// CheckApproveOpen
+// @Title 校验分类是否开启审批
+// @Description 校验分类是否开启审批
+// @Param	request	body report_approve.BiApproveCheckApproveOpenReq true "type json string"
+// @Success 200 string "操作成功"
+// @router /classify/check_open [post]
+func (this *BiApproveController) CheckApproveOpen() {
+	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 request.BiApproveCheckApproveOpenReq
+	if e := json.Unmarshal(this.Ctx.Input.RequestBody, &req); e != nil {
+		br.Msg = "参数有误"
+		br.ErrMsg = "参数解析失败, Err: " + e.Error()
+		return
+	}
+
+	// 校验是否开启了审批流
+	opening, e := biapprove.CheckBiOpenApprove(req.ClassifyId)
+	if e != nil {
+		br.Msg = "操作失败"
+		br.ErrMsg = "校验报告是否开启审批流失败, Err: " + e.Error()
+		return
+	}
 
+	br.Data = opening
 	br.Ret = 200
 	br.Success = true
 	br.Msg = "操作成功"

+ 28 - 0
models/bi_approve/bi_approve_flow.go

@@ -16,6 +16,24 @@ type BiApproveFlow struct {
 	ModifyTime      time.Time `gorm:"column:modify_time"`
 }
 
+var BiApproveFlowCols = struct {
+	BiApproveFlowId string
+	FlowName        string
+	BiType          string
+	ClassifyId      string
+	CurrVersion     string
+	CreateTime      string
+	ModifyTime      string
+}{
+	BiApproveFlowId: "bi_approve_flow_id",
+	FlowName:        "flow_name",
+	BiType:          "report_type",
+	ClassifyId:      "classify_id",
+	CurrVersion:     "curr_version",
+	CreateTime:      "create_time",
+	ModifyTime:      "modify_time",
+}
+
 func (b *BiApproveFlow) TableName() string {
 	return "bi_approve_flow"
 }
@@ -120,6 +138,16 @@ func (b *BiApproveFlow) Delete() error {
 	return global.DmSQL["rddp"].Delete(b).Error
 }
 
+func (m *BiApproveFlow) GetItemByCondition(condition string, pars []interface{}, orderRule string) (item *BiApproveFlow, err error) {
+	order := ``
+	if orderRule != "" {
+		order = ` ORDER BY ` + orderRule
+	}
+	sql := fmt.Sprintf(`SELECT * FROM %s WHERE 1=1 %s %s `, m.TableName(), condition, order)
+	err = global.DmSQL["rddp"].Raw(sql, pars...).First(&item).Error
+	return
+}
+
 func GetBiApproveFlowById(biApproveFlowId int) (item *BiApproveFlow, err error) {
 	err = global.DmSQL["rddp"].Where("bi_approve_flow_id = ?", biApproveFlowId).First(&item).Error
 	return

+ 75 - 0
models/bi_approve/bi_approve_message.go

@@ -3,6 +3,8 @@ package biapprove
 import (
 	"eta_gn/eta_api/global"
 	"eta_gn/eta_api/utils"
+	"fmt"
+	"strings"
 	"time"
 )
 
@@ -19,6 +21,30 @@ type BiApproveMessage struct {
 	ModifyTime    time.Time `gorm:"column:modify_time"`     // 修改时间
 }
 
+var BiApproveMessageCols = struct {
+	Id            string
+	SendUserId    string
+	ReceiveUserId string
+	Content       string
+	Remark        string
+	BiApproveId   string
+	ApproveState  string
+	IsRead        string
+	CreateTime    string
+	ModifyTime    string
+}{
+	Id:            "id",
+	SendUserId:    "send_user_id",
+	ReceiveUserId: "receive_user_id",
+	Content:       "content",
+	Remark:        "remark",
+	BiApproveId:   "bi_approve_id",
+	ApproveState:  "approve_state",
+	IsRead:        "is_read",
+	CreateTime:    "create_time",
+	ModifyTime:    "modify_time",
+}
+
 func (r *BiApproveMessage) TableName() string {
 	return "bi_approve_message"
 }
@@ -29,6 +55,10 @@ func (r *BiApproveMessage) Create() (err error) {
 	return err
 }
 
+func (m *BiApproveMessage) PrimaryId() string {
+	return BiApproveMessageCols.Id
+}
+
 func (r *BiApproveMessage) CreateMulti(items []*BiApproveMessage) (err error) {
 	if len(items) == 0 {
 		return
@@ -37,3 +67,48 @@ func (r *BiApproveMessage) CreateMulti(items []*BiApproveMessage) (err error) {
 	err = o.CreateInBatches(items, utils.MultiAddNum).Error
 	return
 }
+
+func (m *BiApproveMessage) GetCountByCondition(condition string, pars []interface{}) (count int, err error) {
+	sql := fmt.Sprintf(`SELECT COUNT(1) FROM %s WHERE 1=1 %s`, m.TableName(), condition)
+	err = global.DmSQL["rddp"].Raw(sql, pars...).Scan(&count).Error
+	return
+}
+
+func (m *BiApproveMessage) GetItemsByCondition(condition string, pars []interface{}, fieldArr []string, orderRule string) (items []*BiApproveMessage, err error) {
+	fields := strings.Join(fieldArr, ",")
+	if len(fieldArr) == 0 {
+		fields = `*`
+	}
+	order := `ORDER BY create_time DESC`
+	if orderRule != "" {
+		order = ` ORDER BY ` + orderRule
+	}
+	sql := fmt.Sprintf(`SELECT %s FROM %s WHERE 1=1 %s %s`, fields, m.TableName(), condition, order)
+	err = global.DmSQL["rddp"].Raw(sql, pars...).Find(&items).Error
+	return
+}
+
+func (m *BiApproveMessage) GetPageItemsByCondition(condition string, pars []interface{}, fieldArr []string, orderRule string, startSize, pageSize int) (items []*BiApproveMessage, err error) {
+	fields := strings.Join(fieldArr, ",")
+	if len(fieldArr) == 0 {
+		fields = `*`
+	}
+	order := `ORDER BY create_time DESC`
+	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 = global.DmSQL["rddp"].Raw(sql, pars...).Find(&items).Error
+	return
+}
+
+func (m *BiApproveMessage) GetItemById(id int) (item *BiApproveMessage, err error) {
+	sql := fmt.Sprintf(`SELECT * FROM %s WHERE %s = ? LIMIT 1`, m.TableName(), m.PrimaryId())
+	err = global.DmSQL["rddp"].Raw(sql, id).First(&item).Error
+	return
+}
+
+func (m *BiApproveMessage) Update(cols []string) (err error) {
+	err = global.DmSQL["rddp"].Model(m).Select(cols).Updates(m).Error
+	return
+}

+ 5 - 0
models/bi_approve/request/bi_approve.go

@@ -14,3 +14,8 @@ type BiApproveRefuseReq struct {
 type BiApproveCancelReq struct {
 	BiApproveId int `description:"审批ID"`
 }
+
+// BiApproveCheckApproveOpenReq 校验分类是否打开审批请求体
+type BiApproveCheckApproveOpenReq struct {
+	ClassifyId int `description:"一级分类ID"`
+}

+ 5 - 0
models/bi_approve/request/bi_approve_message.go

@@ -0,0 +1,5 @@
+package request
+
+type BiApproveMessageReadReq struct {
+	MessageId int `description:"审批消息ID"`
+}

+ 24 - 0
models/bi_approve/response/bi_approve_message.go

@@ -0,0 +1,24 @@
+package response
+
+import "github.com/rdlucklib/rdluck_tools/paging"
+
+// BiApproveMessageListResp 审批消息列表响应体
+type BiApproveMessageListResp struct {
+	List        []*BiApproveMessageItem
+	Paging      *paging.PagingItem `description:"分页数据"`
+	UnreadTotal int                `description:"消息未读数"`
+}
+
+// BiApproveMessageItem 报告审批消息信息
+type BiApproveMessageItem struct {
+	Id            int
+	SendUserId    int    `description:"发送人ID"`
+	ReceiveUserId int    `description:"接收者ID"`
+	Content       string `description:"消息内容"`
+	Remark        string `description:"备注信息"`
+	BiApproveId   int    `description:"审批ID"`
+	ApproveState  int    `description:"审批状态:1-待审批;2-已审批;3-已驳回;4-已撤回"`
+	IsRead        int    `description:"是否已读:0-未读;1-已读"`
+	CreateTime    string `description:"创建时间"`
+	ModifyTime    string `description:"修改时间"`
+}

+ 1 - 0
models/business_conf.go

@@ -17,6 +17,7 @@ const (
 	BusinessConfXfVcn                     = "XfVcn"
 	BusinessConfEnPptCoverImgs            = "EnPptCoverImgs"
 	BusinessConfIsReportApprove           = "IsReportApprove"
+	BusinessConfIsBIApprove               = "IsBIApprove"
 	BusinessConfReportApproveType         = "ReportApproveType"
 	BusinessConfCompanyName               = "CompanyName"
 	BusinessConfCompanyWatermark          = "CompanyWatermark"

+ 27 - 0
routers/commentsRouter.go

@@ -259,6 +259,15 @@ func init() {
             Filters: nil,
             Params: nil})
 
+    beego.GlobalControllerRouter["eta_gn/eta_api/controllers/bi_approve:BiApproveController"] = append(beego.GlobalControllerRouter["eta_gn/eta_api/controllers/bi_approve:BiApproveController"],
+        beego.ControllerComments{
+            Method: "CheckApproveOpen",
+            Router: `/classify/check_open`,
+            AllowHTTPMethods: []string{"post"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
     beego.GlobalControllerRouter["eta_gn/eta_api/controllers/bi_approve:BiApproveController"] = append(beego.GlobalControllerRouter["eta_gn/eta_api/controllers/bi_approve:BiApproveController"],
         beego.ControllerComments{
             Method: "ClassifyList",
@@ -286,6 +295,24 @@ func init() {
             Filters: nil,
             Params: nil})
 
+    beego.GlobalControllerRouter["eta_gn/eta_api/controllers/bi_approve:BiApproveController"] = append(beego.GlobalControllerRouter["eta_gn/eta_api/controllers/bi_approve:BiApproveController"],
+        beego.ControllerComments{
+            Method: "MessageList",
+            Router: `/message/list`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["eta_gn/eta_api/controllers/bi_approve:BiApproveController"] = append(beego.GlobalControllerRouter["eta_gn/eta_api/controllers/bi_approve:BiApproveController"],
+        beego.ControllerComments{
+            Method: "MessageRead",
+            Router: `/message/read`,
+            AllowHTTPMethods: []string{"post"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
     beego.GlobalControllerRouter["eta_gn/eta_api/controllers/bi_approve:BiApproveController"] = append(beego.GlobalControllerRouter["eta_gn/eta_api/controllers/bi_approve:BiApproveController"],
         beego.ControllerComments{
             Method: "Refuse",

+ 134 - 0
services/bi_approve/bi_approve.go

@@ -2,6 +2,7 @@ package biapprove
 
 import (
 	"encoding/json"
+	"eta_gn/eta_api/models"
 	biapprove "eta_gn/eta_api/models/bi_approve"
 	"eta_gn/eta_api/models/bi_approve/response"
 	"eta_gn/eta_api/models/bi_dashboard"
@@ -864,3 +865,136 @@ func RefuseBiApprove(approveItem *biapprove.BiApprove, recordItem *biapprove.BiA
 	}()
 	return
 }
+
+func BiApproveCancel(biApproveId, adminId int, adminName string) (msg string, err error) {
+	approveItem, e := biapprove.GetBiApproveById(biApproveId)
+	if e != nil {
+		if utils.IsErrNoRow(e) {
+			msg = "审批已被删除, 请刷新页面"
+			return
+		}
+		msg = "操作失败"
+		err = fmt.Errorf("GetBiApproveById err: %s", e.Error())
+		return
+	}
+	if approveItem.ApplyUserId != adminId {
+		msg = "非申请人不可撤销"
+		err = fmt.Errorf("非申请人不可撤销")
+		return
+	}
+
+	// 撤销审批
+	e = cancelBiApprove(approveItem.BiId, approveItem.BiApproveId, adminId, adminName)
+	if e != nil {
+		msg = "操作失败"
+		err = fmt.Errorf("cancelBiApprove err: %s", e.Error())
+		return
+	}
+	return
+}
+
+// cancelBiApprove 撤回审批
+func cancelBiApprove(biId, approveId, sysAdminId int, sysAdminName string) (err error) {
+	// 默认内部审批, 如果是走的第三方审批, 那么仅修改状态
+	confMap, e := models.GetBusinessConf()
+	if e != nil {
+		err = fmt.Errorf("GetBusinessConf err: %s", e.Error())
+		return
+	}
+	openMap := map[string]bool{"false": false, "true": true}
+	openApprove := openMap[confMap[models.BusinessConfIsBIApprove]]
+	if !openApprove {
+		//err = fmt.Errorf("未开启审批")
+		return
+	}
+
+	// 修改审批信息状态
+	approveItem, e := biapprove.GetBiApproveById(approveId)
+	if e != nil {
+		if utils.IsErrNoRow(e) {
+			return
+		}
+		err = fmt.Errorf("approve GetItemById err: %s", e.Error())
+		return
+	}
+	if approveItem.State == BiApproveStateCancel {
+		return
+	}
+	approveItem.State = BiApproveStateCancel
+	approveItem.ModifyTime = time.Now()
+	cols := []string{"State", "ModifyTime"}
+	if e = approveItem.Update(cols); e != nil {
+		err = fmt.Errorf("approve Update err: %s", e.Error())
+		return
+	}
+
+	// 修改报告状态
+	e = updateBiApproveState(biId, 0, BiStateWaitSubmit)
+	if e != nil {
+		err = fmt.Errorf("更新报告审批撤回失败, Err: %s", e.Error())
+		return
+	}
+
+	// 推送撤回消息
+	go func() {
+		recordOb := new(biapprove.BiApproveRecord)
+		recordCond := fmt.Sprintf(` AND %s = ?`, biapprove.BiApproveRecordCols.BiApproveId)
+		recordPars := make([]interface{}, 0)
+		recordPars = append(recordPars, approveId)
+		recordItems, e := recordOb.GetItemsByCondition(recordCond, recordPars, []string{}, "")
+		if e != nil {
+			utils.FileLog.Info(fmt.Sprintf("approve record GetItemsByCondition err: %s", e.Error()))
+			return
+		}
+
+		messageOb := new(biapprove.BiApproveMessage)
+		messages := make([]*biapprove.BiApproveMessage, 0)
+		for _, v := range recordItems {
+			m := new(biapprove.BiApproveMessage)
+			m.SendUserId = sysAdminId
+			m.ReceiveUserId = v.ApproveUserId
+			m.Content = fmt.Sprintf("%s提交的【看板审批】已撤回", sysAdminName)
+			m.BiApproveId = approveId
+			m.ApproveState = BiApproveStateCancel
+			m.CreateTime = time.Now().Local()
+			m.ModifyTime = time.Now().Local()
+			messages = append(messages, m)
+		}
+		e = messageOb.CreateMulti(messages)
+		if e != nil {
+			utils.FileLog.Info(fmt.Sprintf("CancelBiApprove messages err: %s", e.Error()))
+			return
+		}
+	}()
+	return
+}
+
+// CheckBiOpenApprove 校验报告是否开启了审批流
+func CheckBiOpenApprove(classifyId int) (opening bool, err error) {
+	// 获取审批配置
+	confMap, e := models.GetBusinessConf()
+	if e != nil {
+		err = fmt.Errorf("GetBusinessConf err: %s", e.Error())
+		return
+	}
+	openMap := map[string]bool{"false": false, "true": true}
+	openApprove := openMap[confMap[models.BusinessConfIsBIApprove]]
+
+	// 查询对应分类是否有审批流
+	flowOb := new(biapprove.BiApproveFlow)
+	flowCond := fmt.Sprintf(` AND %s = ?`, biapprove.BiApproveFlowCols.ClassifyId)
+	flowPars := make([]interface{}, 0)
+	flowPars = append(flowPars, classifyId)
+	flowItem, e := flowOb.GetItemByCondition(flowCond, flowPars, "")
+	if e != nil && !utils.IsErrNoRow(e) {
+		err = fmt.Errorf("ApproveFlow GetItemByCondition err: %s", e.Error())
+		return
+	}
+
+	// 开启审批/有审批流
+	if openApprove && (flowItem != nil) {
+		opening = true
+		return
+	}
+	return
+}

+ 88 - 0
services/bi_approve/bi_approve_message.go

@@ -0,0 +1,88 @@
+package biapprove
+
+import (
+	biapprove "eta_gn/eta_api/models/bi_approve"
+	"eta_gn/eta_api/models/bi_approve/response"
+	"eta_gn/eta_api/utils"
+	"fmt"
+	"time"
+)
+
+func GetBiApproveMessage(adminId, startSize, pageSize int) (list []*response.BiApproveMessageItem, total, unread int, msg string, err error) {
+	cond := fmt.Sprintf(` AND %s = ?`, biapprove.BiApproveMessageCols.ReceiveUserId)
+	pars := make([]interface{}, 0)
+	pars = append(pars, adminId)
+	order := fmt.Sprintf(`%s ASC, %s DESC`, biapprove.BiApproveMessageCols.IsRead, biapprove.BiApproveMessageCols.CreateTime)
+
+	messageOb := new(biapprove.BiApproveMessage)
+	total, e := messageOb.GetCountByCondition(cond, pars)
+	if e != nil {
+		msg = "获取失败"
+		err = fmt.Errorf("message.GetCountByCondition, Err: %s", e.Error())
+		return
+	}
+	tmpList, e := messageOb.GetPageItemsByCondition(cond, pars, []string{}, order, startSize, pageSize)
+	if e != nil {
+		msg = "获取失败"
+		err = fmt.Errorf("message.GetPageItemsByCondition, Err: %s", e.Error())
+		return
+	}
+	for _, v := range tmpList {
+		t := FormatBiApproveMessage2Item(v)
+		list = append(list, t)
+	}
+
+	// 未读消息数
+	cond += fmt.Sprintf(` AND %s = ?`, biapprove.BiApproveMessageCols.IsRead)
+	pars = append(pars, 0)
+	unreadTotal, e := messageOb.GetCountByCondition(cond, pars)
+	if e != nil {
+		msg = "获取失败"
+		err = fmt.Errorf("message.GetCountByCondition, Err: %s", e.Error())
+		return
+	}
+	unread = unreadTotal
+	return
+}
+
+func ReadBiMessage(msgId int, adminId int) (msg string, err error) {
+	messageOb := new(biapprove.BiApproveMessage)
+	messageItem, e := messageOb.GetItemById(msgId)
+	if e != nil {
+		if utils.IsErrNoRow(e) {
+			msg = "消息不存在, 请刷新页面"
+			return
+		}
+		msg = "获取失败"
+		err = fmt.Errorf("message.GetItemById, Err: %s", e.Error())
+		return
+	}
+	messageItem.IsRead = 1
+	messageItem.ModifyTime = time.Now().Local()
+	cols := []string{"IsRead", "ModifyTime"}
+	if e = messageItem.Update(cols); e != nil {
+		msg = "操作失败"
+		err = fmt.Errorf("message.Update, Err: %s", e.Error())
+		return
+	}
+	return
+}
+
+// FormatBiApproveMessage2Item 格式化报告审批消息
+func FormatBiApproveMessage2Item(origin *biapprove.BiApproveMessage) (item *response.BiApproveMessageItem) {
+	item = new(response.BiApproveMessageItem)
+	if origin == nil {
+		return
+	}
+	item.Id = origin.Id
+	item.SendUserId = origin.SendUserId
+	item.ReceiveUserId = origin.ReceiveUserId
+	item.Content = origin.Content
+	item.Remark = origin.Remark
+	item.BiApproveId = origin.BiApproveId
+	item.ApproveState = origin.ApproveState
+	item.IsRead = origin.IsRead
+	item.CreateTime = utils.TimeTransferString(utils.FormatDateTime, origin.CreateTime)
+	item.ModifyTime = utils.TimeTransferString(utils.FormatDateTime, origin.ModifyTime)
+	return
+}