|
@@ -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
|
|
|
+}
|