Kaynağa Gözat

add:看板审批功能

zqbao 5 ay önce
ebeveyn
işleme
b89d321198

+ 54 - 0
controllers/bi_approve/bi_approve.go

@@ -1,10 +1,13 @@
 package biapprove
 
 import (
+	"encoding/json"
 	"eta_gn/eta_api/controllers"
 	"eta_gn/eta_api/models"
+	"eta_gn/eta_api/models/bi_approve/request"
 	biapprove "eta_gn/eta_api/services/bi_approve"
 	"eta_gn/eta_api/utils"
+	"fmt"
 	"time"
 )
 
@@ -143,3 +146,54 @@ func (this *BiApproveController) ClassifyList() {
 	br.Ret = 200
 	br.Success = true
 }
+
+// Approve
+// @Title 通过审批
+// @Description 通过审批
+// @Param	request	body report_approve.ReportApprovePassReq true "type json string"
+// @Success 200 string "操作成功"
+// @router /approve [post]
+func (this *BiApproveController) Approve() {
+	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.BiApprovePassReq
+	if e := json.Unmarshal(this.Ctx.Input.RequestBody, &req); e != nil {
+		br.Msg = "参数有误"
+		br.ErrMsg = "参数解析失败, Err: " + e.Error()
+		return
+	}
+	if req.BiApproveId <= 0 {
+		br.Msg = "参数有误"
+		br.ErrMsg = fmt.Sprintf("参数有误, ReportApproveId: %d", req.BiApproveId)
+		return
+	}
+
+	// 通过审批
+	msg, err := biapprove.PassReportApprove(req.BiApproveId, 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 = "操作成功"
+}

+ 13 - 1
models/bi_approve/bi_approve.go

@@ -14,7 +14,7 @@ type BiApprove struct {
 	FlowId        int       `gorm:"column:flow_id"`
 	FlowVersion   int       `gorm:"column:flow_version"`
 	StartNodeId   int       `gorm:"column:start_node_id"`
-	CurrentNodeId int       `gorm:"column:current_node_id"`
+	CurrNodeId    int       `gorm:"column:curr_node_id"`
 	ApplyUserId   int       `gorm:"column:apply_user_id"`
 	ApplyUserName string    `gorm:"column:apply_user_name"`
 	ApproveRemark string    `gorm:"column:approve_remark"`
@@ -27,8 +27,20 @@ func (b *BiApprove) TableName() string {
 	return "bi_approve"
 }
 
+func (b *BiApprove) Update(cols []string) (err error) {
+	db := global.DmSQL["rddp"]
+	err = db.Model(b).Select(cols).Updates(b).Error
+	return
+}
+
 func GetBiApproveByFlowIdAndVersionId(biFlowId int, flowVersion int) (item []*BiApprove, err error) {
 	db := global.DmSQL["rddp"]
 	err = db.Where("flow_id = ? AND flow_version = ?", biFlowId, flowVersion).Find(&item).Error
 	return
 }
+
+func GetBiApproveById(biApproveId int) (item *BiApprove, err error) {
+	db := global.DmSQL["rddp"]
+	err = db.Where("bi_approve_id = ?", biApproveId).First(&item).Error
+	return
+}

+ 22 - 3
models/bi_approve/bi_approve_message.go

@@ -1,8 +1,12 @@
 package biapprove
 
-import "time"
+import (
+	"eta_gn/eta_api/global"
+	"eta_gn/eta_api/utils"
+	"time"
+)
 
-type ReportApproveMessage struct {
+type BiApproveMessage struct {
 	Id            int       `gorm:"primaryKey;column:id"`
 	SendUserId    int       `gorm:"column:send_user_id"`      // 发送人Id
 	ReceiveUserId int       `gorm:"column:receive_user_id"`   // 接收者Id
@@ -15,6 +19,21 @@ type ReportApproveMessage struct {
 	ModifyTime    time.Time `gorm:"column:modify_time"`       // 修改时间
 }
 
-func (r *ReportApproveMessage) TableName() string {
+func (r *BiApproveMessage) TableName() string {
 	return "bi_approve_message"
 }
+
+func (r *BiApproveMessage) Create() (err error) {
+	o := global.DmSQL["rddp"]
+	err = o.Create(r).Error
+	return err
+}
+
+func (r *BiApproveMessage) CreateMulti(items []*BiApproveMessage) (err error) {
+	if len(items) == 0 {
+		return
+	}
+	o := global.DmSQL["rddp"]
+	err = o.CreateInBatches(items, utils.MultiAddNum).Error
+	return
+}

+ 10 - 0
models/bi_approve/bi_approve_node.go

@@ -37,6 +37,16 @@ func UpdateNextNodes(nodes []*BiApproveNode) (err error) {
 	return
 }
 
+func GetBiApproveNodeByCondition(condition string, pars []interface{}) (node []*BiApproveNode, err error) {
+	o := global.DmSQL["rddp"]
+	sql := "SELECT * FROM bi_approve_node WHERE 1=1 "
+	if condition != "" {
+		sql += " AND " + condition
+	}
+	err = o.Raw(sql, pars...).Find(&node).Error
+	return
+}
+
 func GetBiApproveNodeByFlowIdAndVersionId(flowId int, versionId int) (node []*BiApproveNode, err error) {
 	err = global.DmSQL["rddp"].Model(&BiApproveNode{}).Where("bi_approve_flow_id =? AND curr_version =?", flowId, versionId).Scan(&node).Error
 	return

+ 59 - 1
models/bi_approve/bi_approve_record.go

@@ -1,6 +1,11 @@
 package biapprove
 
-import "time"
+import (
+	"eta_gn/eta_api/global"
+	"eta_gn/eta_api/utils"
+	"fmt"
+	"time"
+)
 
 type BiApproveRecord struct {
 	BiApproveRecordId   int       `gorm:"column:bi_approve_record_id;primary_key"`
@@ -27,3 +32,56 @@ type BiApproveRecord struct {
 func (b *BiApproveRecord) TableName() string {
 	return "bi_approve_record"
 }
+
+func (b *BiApproveRecord) Create() (err error) {
+	o := global.DmSQL["rddp"]
+	err = o.Create(b).Error
+	return
+}
+
+func (b *BiApproveRecord) CreateMulti(items []*BiApproveRecord) (err error) {
+	if len(items) == 0 {
+		return
+	}
+	o := global.DmSQL["rddp"]
+	err = o.CreateInBatches(items, utils.MultiAddNum).Error
+	return
+}
+
+func (b *BiApproveRecord) Update(cols []string) (err error) {
+	o := global.DmSQL["rddp"]
+	err = o.Model(b).Select(cols).Updates(b).Error
+	return
+}
+
+func GetBiApproveRecordByCondition(condition string, pars []interface{}) (record *BiApproveRecord, err error) {
+	o := global.DmSQL["rddp"]
+	sql := `SELECT * FROM bi_approve_record WHERE 1=1 `
+	if condition != "" {
+		sql += condition
+	}
+	err = o.Raw(sql, pars...).First(&record).Error
+	return
+}
+
+func GetBiaApproveRecordItemsByCondition(condition string, pars []interface{}) (items []*BiApproveRecord, err error) {
+	order := `ORDER BY create_time DESC`
+	sql := fmt.Sprintf(`SELECT * FROM bi_approve_record WHERE 1=1 %s %s`, condition, order)
+	err = global.DmSQL["rddp"].Raw(sql, pars...).Find(&items).Error
+	return
+}
+
+func (b *BiApproveRecord) UpdateNodeState(biApproveId, nodeId, nodeState, nodeApproveUserId int, nodeApproveUserName string, nodeApproveTime time.Time) (err error) {
+	pars := make([]interface{}, 0)
+	pars = append(pars, nodeState, nodeApproveUserId, nodeApproveUserName, nodeApproveTime)
+
+	// 更新条件
+	whereParas := []interface{}{biApproveId, nodeId}
+	pars = append(pars, whereParas)
+
+	//o := orm.NewOrmUsingDB("rddp")
+	sql := fmt.Sprintf(`UPDATE %s SET node_state=?,node_approve_user_id=?,node_approve_user_name=?,node_approve_time=? WHERE report_approve_id = ? AND node_id = ?`, b.TableName())
+	//_, err = o.Raw(sql, pars).Exec()
+	err = global.DmSQL["rddp"].Exec(sql, pars...).Error
+	return
+}

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

@@ -0,0 +1,5 @@
+package request
+
+type BiApprovePassReq struct {
+	BiApproveId int `description:"审批ID"`
+}

+ 5 - 1
models/bi_dashboard/bi_dashboard.go

@@ -22,6 +22,11 @@ func (m *BiDashboard) TableName() string {
 	return "bi_dashboard"
 }
 
+func (m *BiDashboard) Update(cols []string) (err error) {
+	err = global.DEFAULT_DmSQL.Model(m).Select(cols).Updates(m).Error
+	return
+}
+
 // AddBiDashboard 新增看板
 func AddBiDashboard(item *BiDashboard) (lastId int64, err error) {
 	err = global.DEFAULT_DmSQL.Create(item).Error
@@ -59,7 +64,6 @@ func GetDashboardById(id int) (item *BiDashboard, err error) {
 	//o := orm.NewOrmUsingDB("rddp")
 	sql := `SELECT * FROM bi_dashboard WHERE bi_dashboard_classify_id = ? limit 1`
 
-
 	//sql += `ORDER BY create_time DESC LIMIT ?,?`
 	//_, err = o.Raw(sql).QueryRows(&items)
 	err = global.DEFAULT_DmSQL.Raw(sql, id).First(&item).Error

+ 394 - 1
services/bi_approve/bi_approve.go

@@ -1,6 +1,14 @@
 package biapprove
 
-import "eta_gn/eta_api/models/bi_dashboard"
+import (
+	biapprove "eta_gn/eta_api/models/bi_approve"
+	"eta_gn/eta_api/models/bi_approve/response"
+	"eta_gn/eta_api/models/bi_dashboard"
+	"eta_gn/eta_api/utils"
+	"fmt"
+	"sort"
+	"time"
+)
 
 func GetPulicBiClassifyList() (res []*bi_dashboard.BiDashboardClassifyItem, msg string, err error) {
 	classifyList, err := bi_dashboard.GetBiDashboardClassifyAllList()
@@ -12,6 +20,287 @@ func GetPulicBiClassifyList() (res []*bi_dashboard.BiDashboardClassifyItem, msg
 	return
 }
 
+func PassReportApprove(approveId int, adminId int) (msg string, err error) {
+	approveItem, e := biapprove.GetBiApproveById(approveId)
+	if e != nil {
+		if utils.IsErrNoRow(e) {
+			msg = "审批不存在, 请刷新页面"
+			return
+		}
+		msg = "操作失败"
+		return
+	}
+
+	if approveItem.State != BiApproveStateApproving {
+		msg = "审批状态有误, 请刷新页面"
+		err = fmt.Errorf("审批状态有误, State: %d", approveItem.State)
+		return
+	}
+
+	var ApprovePars []interface{}
+	Approveconds := ` AND bi_approve_id =? AND approve_user_id =? AND state =? `
+	ApprovePars = append(ApprovePars, approveId, adminId, BiApproveStateApproving)
+
+	recordItem, er := biapprove.GetBiApproveRecordByCondition(Approveconds, ApprovePars)
+	if er != nil {
+		if utils.IsErrNoRow(er) {
+			msg = "无权审批"
+			return
+		}
+		msg = "操作失败"
+		return
+	}
+
+	// 查询审批流和审批流节点
+	flowItem, e := biapprove.GetBiApproveFlowById(approveItem.FlowId)
+	if e != nil {
+		err = fmt.Errorf("获取审批流失败, Err: %s", e.Error())
+		return
+	}
+	nodePars := make([]interface{}, 0)
+	nodeCond := ` AND bi_approve_flow_id =? AND curr_version =? `
+	nodePars = append(nodePars, flowItem.BiApproveFlowId, flowItem.CurrVersion)
+	nodeItems, e := biapprove.GetBiApproveNodeByCondition(nodeCond, nodePars)
+	if e != nil {
+		err = fmt.Errorf("ApproveNodes GetItemsByCondition err: %s", e.Error())
+		return
+	}
+	if len(nodeItems) == 0 {
+		err = fmt.Errorf("无审批节点")
+		return
+	}
+	nodeMap := make(map[int]*biapprove.BiApproveNode)
+	for _, v := range nodeItems {
+		nodeMap[v.BiApproveNodeId] = v
+	}
+
+	// 取出审批记录的节点
+	currNodeItem := nodeMap[recordItem.NodeId]
+	if currNodeItem == nil {
+		err = fmt.Errorf("当前节点信息有误")
+		return
+	}
+	currNode, e := FormatBiApproveNode2Item(currNodeItem)
+	if e != nil {
+		err = fmt.Errorf("当前节点信息有误, Err: %s", e.Error())
+		return
+	}
+	now := time.Now().Local()
+	recordItem.State = BiApproveStatePass
+	recordItem.ApproveTime = now
+	recordItem.ModifyTime = now
+	recordItem.NodeState = BiApproveStatePass
+	recordItem.NodeApproveUserId = recordItem.ApproveUserId
+	recordItem.NodeApproveUserName = recordItem.ApproveUserName
+	recordItem.NodeApproveTime = now
+
+	recordCols := []string{"State", "ApproveTime", "ModifyTime", "NodeState", "NodeApproveUserId", "NodeApproveUserName", "NodeApproveTime"}
+	lastApprove := false
+
+	// 依次审批
+	if currNode.ApproveType == NodeApproveTypeRoll {
+		if e = recordItem.Update(recordCols); e != nil {
+			err = fmt.Errorf("更新审批记录状态失败, Err: %s", e.Error())
+			return
+		}
+
+		// 检查依次审批情况
+		sort.Slice(currNode.Users, func(k, j int) bool {
+			return currNode.Users[k].Sort < currNode.Users[j].Sort
+		})
+		userLen := len(currNode.Users)
+		//lastRoll := false
+		nextUser := new(response.BiApproveNodeUser) // 下一个审批人, 为nil则表示当前审批人即为最后
+		for k, v := range currNode.Users {
+			// 当前审批人
+			if v.UserId == adminId && recordItem.ApproveUserSort == v.Sort {
+				//if k == (userLen - 1) {
+				//	lastRoll = true
+				//	break
+				//}
+				if (k + 1) < userLen {
+					nextUser = currNode.Users[k+1]
+				}
+			}
+		}
+		//if lastRoll && currNode.NextNodeId == 0 {
+		//	lastApprove = true
+		//}
+
+		// 当前节点下一个审批人, 生成下一个审批记录且return
+		if nextUser.UserId > 0 {
+			newRecord := new(biapprove.BiApproveRecord)
+			newRecord.BiApproveId = recordItem.BiApproveId
+			newRecord.State = BiApproveStateApproving
+			newRecord.NodeId = currNode.BiApproveNodeId
+			newRecord.PrevNodeId = currNode.PrevNodeId
+			newRecord.NextNodeId = currNode.NextNodeId
+			newRecord.ApproveType = currNode.ApproveType
+			newRecord.ApproveUserId = nextUser.UserId
+			newRecord.ApproveUserName = nextUser.UserName
+			newRecord.ApproveUserSort = nextUser.Sort
+			newRecord.CreateTime = now
+			newRecord.ModifyTime = now
+			newRecord.NodeState = BiApproveStateApproving
+			if e = newRecord.Create(); e != nil {
+				err = fmt.Errorf("生成审批记录失败, Err: %s", e.Error())
+				return
+			}
+
+			// 推送审批消息
+			go func() {
+				messageItem := new(biapprove.BiApproveMessage)
+				messageItem.SendUserId = approveItem.ApplyUserId
+				messageItem.ReceiveUserId = nextUser.UserId
+				messageItem.Content = "您有新的待办任务"
+				messageItem.Remark = fmt.Sprintf("%s提交的【研报审批】需要您审批,请及时处理", approveItem.ApplyUserName)
+				messageItem.BiApproveId = approveItem.BiApproveId
+				messageItem.ApproveState = BiApproveStateApproving
+				messageItem.CreateTime = now
+				messageItem.ModifyTime = now
+				if e = messageItem.Create(); e != nil {
+					utils.FileLog.Info(fmt.Sprintf("PassReportApprove message err: %s", e.Error()))
+					return
+				}
+			}()
+			return
+		}
+
+		// 更新审批当前节点并进入下一个节点
+		if currNode.NextNodeId > 0 {
+			nextNode := nodeMap[currNode.NextNodeId]
+			approveItem.CurrNodeId = currNode.NextNodeId
+			approveItem.ModifyTime = now
+			if e = approveItem.Update([]string{"CurrNodeId", "ModifyTime"}); e != nil {
+				err = fmt.Errorf("更新审批当前节点失败, Err: %s", e.Error())
+				return
+			}
+			err = BuildNextNodeRecordAndMsg(nextNode, approveItem.BiApproveId, approveItem.ApplyUserId, approveItem.ApplyUserName)
+			return
+		} else {
+			// 最后一个节点
+			lastApprove = true
+		}
+	}
+
+	// 会签
+	if currNode.ApproveType == NodeApproveTypeAll {
+		// 查询其他审批人是否已审批
+		otherCond := ` AND bi_approve_id =? AND node_id =? AND approve_user_id <> ? `
+		otherPars := make([]interface{}, 0)
+		otherPars = append(otherPars, approveItem.BiApproveId, recordItem.NodeId, adminId)
+		otherRecords, e := biapprove.GetBiaApproveRecordItemsByCondition(otherCond, otherPars)
+		if e != nil {
+			err = fmt.Errorf("获取节点审批记录失败, Err: %s", e.Error())
+			return
+		}
+		otherPass := true
+		for _, v := range otherRecords {
+			if v.State != BiApproveStatePass {
+				otherPass = false
+			}
+		}
+
+		// 其他人未审批, 仅更新当前审批记录
+		if e = recordItem.Update(recordCols); e != nil {
+			err = fmt.Errorf("更新审批记录状态失败, Err: %s", e.Error())
+			return
+		}
+
+		// 其他人已审批且为最后节点
+		if otherPass && currNode.NextNodeId == 0 {
+			lastApprove = true
+		}
+
+		// 其他人已审批且不为最后节点, 进入下一节点
+		if otherPass && currNode.NextNodeId > 0 {
+			nextNode := nodeMap[currNode.NextNodeId]
+			approveItem.CurrNodeId = currNode.NextNodeId
+			approveItem.ModifyTime = now
+			if e = approveItem.Update([]string{"CurrNodeId", "ModifyTime"}); e != nil {
+				err = fmt.Errorf("更新审批当前节点失败, Err: %s", e.Error())
+				return
+			}
+			err = BuildNextNodeRecordAndMsg(nextNode, approveItem.BiApproveId, approveItem.ApplyUserId, approveItem.ApplyUserName)
+			return
+		}
+	}
+
+	// 或签
+	if currNode.ApproveType == NodeApproveTypeAny {
+		// 需检查一下审批的当前节点和记录的节点是否匹配, 不匹配可能是因为另外的审批人已通过, 所以此处应给提示
+		// 前端也有做相应的判断,但是两个人同时进入审批详情页时就可能出现这种情况
+		if approveItem.CurrNodeId != recordItem.NodeId {
+			msg = "该节点已完成审批, 请刷新页面"
+			return
+		}
+
+		if e = recordItem.Update(recordCols); e != nil {
+			err = fmt.Errorf("更新审批记录状态失败, Err: %s", e.Error())
+			return
+		}
+
+		// 将该审批的同一个节点的记录标记为已审批
+		if e = recordItem.UpdateNodeState(recordItem.BiApproveId, recordItem.NodeId, recordItem.NodeState, recordItem.NodeApproveUserId, recordItem.NodeApproveUserName, recordItem.NodeApproveTime); e != nil {
+			err = fmt.Errorf("更新同一节点的其他审批记录状态失败, Err: %s", e.Error())
+			return
+		}
+
+		if currNode.NextNodeId == 0 {
+			lastApprove = true
+		}
+		if currNode.NextNodeId > 0 {
+			nextNode := nodeMap[currNode.NextNodeId]
+			approveItem.CurrNodeId = currNode.NextNodeId
+			approveItem.ModifyTime = now
+			if e = approveItem.Update([]string{"CurrNodeId", "ModifyTime"}); e != nil {
+				err = fmt.Errorf("更新审批当前节点失败, Err: %s", e.Error())
+				return
+			}
+			err = BuildNextNodeRecordAndMsg(nextNode, approveItem.BiApproveId, approveItem.ApplyUserId, approveItem.ApplyUserName)
+			return
+		}
+	}
+
+	// 最后一个审批, 更新审批记录、审批、报告状态、推送消息给申请人
+	if lastApprove {
+		if e = recordItem.Update(recordCols); e != nil {
+			err = fmt.Errorf("更新审批记录状态失败, Err: %s", e.Error())
+			return
+		}
+		approveItem.State = BiApproveStatePass
+		approveItem.ApproveTime = now
+		approveItem.ModifyTime = now
+		approveCols := []string{"State", "ApproveTime", "ModifyTime"}
+		if e = approveItem.Update(approveCols); e != nil {
+			err = fmt.Errorf("更新审批信息失败, Err: %s", e.Error())
+			return
+		}
+		if e = updateBiApproveState(approveItem.BiId, approveItem.BiApproveId, BiStatePass); e != nil {
+			err = fmt.Errorf("更新报告审批状态失败, Err: %s", e.Error())
+			return
+		}
+
+		go func() {
+			messageItem := new(biapprove.BiApproveMessage)
+			messageItem.SendUserId = adminId
+			messageItem.ReceiveUserId = approveItem.ApplyUserId
+			messageItem.Content = "您提交的审批已通过"
+			messageItem.Remark = "您提交的【研报审批】已通过"
+			messageItem.BiApproveId = approveItem.BiApproveId
+			messageItem.ApproveState = BiApproveStatePass
+			messageItem.CreateTime = now
+			messageItem.ModifyTime = now
+			if e = messageItem.Create(); e != nil {
+				utils.FileLog.Info(fmt.Sprintf("PassReportApprove message err: %s", e.Error()))
+				return
+			}
+		}()
+	}
+	return
+
+}
+
 func toClassifyItem(src []*bi_dashboard.BiDashboardClassify) (dst []*bi_dashboard.BiDashboardClassifyItem) {
 	for _, item := range src {
 		dst = append(dst, &bi_dashboard.BiDashboardClassifyItem{
@@ -21,3 +310,107 @@ func toClassifyItem(src []*bi_dashboard.BiDashboardClassify) (dst []*bi_dashboar
 	}
 	return
 }
+
+// BuildNextNodeRecordAndMsg 生成下一个节点的审批记录并推送消息
+func BuildNextNodeRecordAndMsg(approveNodeItem *biapprove.BiApproveNode, approveId, sysAdminId int, sysAdminName string) (err error) {
+	if approveNodeItem == nil {
+		err = fmt.Errorf("approve node nil")
+		return
+	}
+
+	// 根据节点审批方式生成审批记录
+	now := time.Now().Local()
+	approveNode, e := FormatBiApproveNode2Item(approveNodeItem)
+	if e != nil {
+		err = fmt.Errorf("FormatReportApproveNode2Item err: %s", e.Error())
+		return
+	}
+	if len(approveNode.Users) == 0 {
+		err = fmt.Errorf("审批节点用户有误")
+		return
+	}
+	newRecords := make([]*biapprove.BiApproveRecord, 0)
+	sort.Slice(approveNode.Users, func(k, j int) bool {
+		return approveNode.Users[k].Sort < approveNode.Users[j].Sort
+	})
+	for _, u := range approveNode.Users {
+		r := new(biapprove.BiApproveRecord)
+		r.BiApproveId = approveId
+		r.State = BiApproveStateApproving
+		r.NodeId = approveNode.BiApproveNodeId
+		r.PrevNodeId = approveNode.PrevNodeId
+		r.NextNodeId = approveNode.NextNodeId
+		r.ApproveType = approveNode.ApproveType
+		r.ApproveUserId = u.UserId
+		r.ApproveUserName = u.UserName
+		r.ApproveUserSort = u.Sort
+		r.CreateTime = now
+		r.ModifyTime = now
+		r.NodeState = BiApproveStateApproving // 当前节点审批状态
+		newRecords = append(newRecords, r)
+		// 依次审批仅生成一条记录
+		if approveNode.ApproveType == NodeApproveTypeRoll {
+			break
+		}
+	}
+
+	recordOb := new(biapprove.BiApproveRecord)
+	if e = recordOb.CreateMulti(newRecords); e != nil {
+		err = fmt.Errorf("生成节点审批记录失败, Err: %s", e.Error())
+		return
+	}
+
+	// 推送审批消息
+	go func() {
+		messageOb := new(biapprove.BiApproveMessage)
+		messages := make([]*biapprove.BiApproveMessage, 0)
+		for _, v := range newRecords {
+			m := new(biapprove.BiApproveMessage)
+			m.SendUserId = sysAdminId
+			m.ReceiveUserId = v.ApproveUserId
+			m.Content = "您有新的待办任务"
+			m.Remark = fmt.Sprintf("%s提交的【研报审批】需要您审批,请及时处理", sysAdminName)
+			m.BiApproveId = approveId
+			m.ApproveState = BiApproveStateApproving
+			m.CreateTime = now
+			m.ModifyTime = now
+			messages = append(messages, m)
+		}
+		e = messageOb.CreateMulti(messages)
+		if e != nil {
+			utils.FileLog.Info(fmt.Sprintf("BuildNextNodeRecordAndMsg messages err: %s", e.Error()))
+			return
+		}
+	}()
+	return
+}
+
+// updateBiApproveState 更新Bi看板审批状态
+func updateBiApproveState(biId, approveId, state int) (err error) {
+	// updateCols := []string{"ApproveId", "State", "ModifyTime"}
+	updateCols := []string{"State", "ModifyTime"}
+	BiItem, e := bi_dashboard.GetDashboardById(biId)
+	if e != nil && !utils.IsErrNoRow(e) {
+		err = fmt.Errorf("获取智能研报失败, Err: %s", e.Error())
+		return
+	}
+	if BiItem != nil && BiItem.BiDashboardId > 0 {
+		// BiItem.ApproveId = approveId
+		BiItem.State = state
+		BiItem.ModifyTime = time.Now().Local()
+
+		// if state == models.ReportStatePass || state == models.ReportStateRefused {
+		// 	updateCols = append(updateCols, "ApproveTime")
+		// 	// BiItem.ApproveTime = time.Now().Local()
+		// }
+		// if state == models.ReportStatePass {
+		// 	updateCols = append(updateCols, "PublishTime")
+		// 	// BiItem.PublishTime = time.Now().Local()
+		// }
+		if e = BiItem.Update(updateCols); e != nil {
+			err = fmt.Errorf("更新Bi看板审批状态失败, Err: %s", e.Error())
+			return
+		}
+	}
+	return
+}

+ 2 - 2
services/bi_approve/bi_approve_flow.go

@@ -194,7 +194,7 @@ func CheckDeleteBiApproveFlow(flowId int) (ok bool, err error) {
 		return
 	}
 	for _, v := range approveList {
-		if v.State == BiApproveApproveStateApproving {
+		if v.State == BiApproveStateApproving {
 			return false, nil
 		}
 	}
@@ -231,7 +231,7 @@ func FormatFlowAndNodesItem2Detail(flowItem *biapprove.BiApproveFlow, nodeItems
 	detail.ModifyTime = utils.TimeTransferString(utils.FormatDateTime, flowItem.ModifyTime)
 	detail.Nodes = make([]*response.BiApproveNodeItem, 0)
 	for _, v := range nodeItems {
-		t, e := FormatReportApproveNode2Item(v)
+		t, e := FormatBiApproveNode2Item(v)
 		if e != nil {
 			err = fmt.Errorf("format node err: %s", e.Error())
 			return

+ 2 - 2
services/bi_approve/bi_approve_node.go

@@ -7,8 +7,8 @@ import (
 	"fmt"
 )
 
-// FormatReportApproveNode2Item 格式化报告审批节点信息
-func FormatReportApproveNode2Item(origin *biapprove.BiApproveNode) (item *response.BiApproveNodeItem, err error) {
+// FormatBiApproveNode2Item 格式化报告审批节点信息
+func FormatBiApproveNode2Item(origin *biapprove.BiApproveNode) (item *response.BiApproveNodeItem, err error) {
 	if origin == nil {
 		return
 	}

+ 14 - 4
services/bi_approve/constant.go

@@ -1,5 +1,15 @@
 package biapprove
 
+// 看板状态
+const (
+	BiStateUnpublished = 1 // 未发布
+	BiStatePublished   = 2 // 已发布
+	BiStateWaitSubmit  = 3 // 待提交
+	BiStateWaitApprove = 4 // 审批中
+	BiStateRefused     = 5 // 已驳回
+	BiStatePass        = 6 // 已通过
+)
+
 // 节点审批方式
 const (
 	NodeApproveTypeRoll = 1 // 依次审批
@@ -15,8 +25,8 @@ const (
 
 // 报告审批状态
 const (
-	BiApproveApproveStateApproving = 1 // 待审批
-	BiApproveApproveStatePass      = 2 // 已审批
-	BiApproveApproveStateRefuse    = 3 // 已驳回
-	BiApproveApproveStateCancel    = 4 // 已撤销
+	BiApproveStateApproving = 1 // 待审批
+	BiApproveStatePass      = 2 // 已审批
+	BiApproveStateRefuse    = 3 // 已驳回
+	BiApproveStateCancel    = 4 // 已撤销
 )