Browse Source

fix:保存审批流

zqbao 5 months ago
parent
commit
8480136451

+ 161 - 3
controllers/bi_approve/bi_approve.go

@@ -32,7 +32,7 @@ type BiApproveController struct {
 // @Param   EndTime				query	string	false	"结束时间"
 // @Param   SortField			query	int		false	"排序字段:1-提交时间;2-处理时间;3-审批时间"
 // @Param   SortRule			query	int		false	"排序方式: 1-正序; 2-倒序(默认)"
-// @Success 200 {object} report_approve.ReportApproveListResp
+// @Success 200 {object} report_approve.BiApproveListResp
 // @router /list [get]
 func (this *BiApproveController) List() {
 	br := new(models.BaseResponse).Init()
@@ -104,7 +104,7 @@ func (this *BiApproveController) List() {
 // list
 // @Title 公共看板分类列表
 // @Description 公共看板分类列表
-// @Success 200 {object} report_approve.ReportApproveFlowDetailItem
+// @Success 200 {object} report_approve.BiApproveFlowDetailItem
 // @router /classify/list [get]
 func (this *BiApproveController) ClassifyList() {
 	br := new(models.BaseResponse).Init()
@@ -135,7 +135,7 @@ func (this *BiApproveController) ClassifyList() {
 // Approve
 // @Title 通过审批
 // @Description 通过审批
-// @Param	request	body report_approve.ReportApprovePassReq true "type json string"
+// @Param	request	body report_approve.BiApprovePassReq true "type json string"
 // @Success 200 string "操作成功"
 // @router /approve [post]
 func (this *BiApproveController) Approve() {
@@ -182,3 +182,161 @@ func (this *BiApproveController) Approve() {
 	br.Success = true
 	br.Msg = "操作成功"
 }
+
+// Detail
+// @Title 审批详情
+// @Description 审批详情
+// @Param   BiApproveId  query  int  true  "审批ID"
+// @Success 200 {object} report_approve.BiApproveDetail
+// @router /detail [get]
+func (this *BiApproveController) 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
+	}
+	approveId, _ := this.GetInt("BiApproveId")
+	if approveId <= 0 {
+		br.Msg = "参数有误"
+		br.ErrMsg = fmt.Sprintf("参数有误, BiApproveId: %d", approveId)
+		return
+	}
+
+	resp, msg, err := biapprove.GetApproveDetail(approveId)
+	if err != nil {
+		if msg != "" {
+			br.Msg = msg
+		} else {
+			br.Msg = "获取审批详情失败"
+		}
+		br.ErrMsg = "获取审批详情失败, Err: " + err.Error()
+		return
+	}
+
+	br.Data = resp
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "获取成功"
+}
+
+// Refuse
+// @Title 驳回审批
+// @Description 驳回审批
+// @Param	request	body request.BiApproveRefuseReq true "type json string"
+// @Success 200 string "操作成功"
+// @router /refuse [post]
+func (this *BiApproveController) Refuse() {
+	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.BiApproveRefuseReq
+	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("参数有误, BiApproveId: %d", req.BiApproveId)
+		return
+	}
+	msg, err := biapprove.BiApproveRefuse(req.BiApproveId, sysUser.AdminId, req.ApproveRemark)
+	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 = "操作成功"
+}
+
+// Cancel
+// @Title 撤销审批
+// @Description 撤销审批
+// @Param	request	body report_approve.BiApproveCancelReq true "type json string"
+// @Success 200 string "操作成功"
+// @router /cancel [post]
+func (this *BiApproveController) Cancel() {
+	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.BiApproveCancelReq
+	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("参数有误, BiApproveId: %d", req.BiApproveId)
+		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
+	// }
+
+	// // 撤销审批
+	// e = services.CancelBiApprove(approveItem.BiType, approveItem.BiId, approveItem.BiApproveId, sysUser.AdminId, sysUser.RealName)
+	// if e != nil {
+	// 	br.Msg = "操作失败"
+	// 	br.ErrMsg = "撤销审批失败, Err: " + e.Error()
+	// 	return
+	// }
+
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "操作成功"
+}

+ 9 - 9
models/bi_approve/bi_approve_message.go

@@ -8,15 +8,15 @@ import (
 
 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
-	Content       string    `gorm:"column:content"`           // 消息内容
-	Remark        string    `gorm:"column:remark"`            // 备注信息
-	BiApproveId   int       `gorm:"column:report_approve_id"` // 审批Id
-	ApproveState  int       `gorm:"column:approve_state"`     // 审批状态:1-待审批;2-已审批;3-已驳回;4-已撤回
-	IsRead        int       `gorm:"column:is_read"`           // 是否已读:0-未读;1-已读
-	CreateTime    time.Time `gorm:"column:create_time"`       // 创建时间
-	ModifyTime    time.Time `gorm:"column:modify_time"`       // 修改时间
+	SendUserId    int       `gorm:"column:send_user_id"`    // 发送人Id
+	ReceiveUserId int       `gorm:"column:receive_user_id"` // 接收者Id
+	Content       string    `gorm:"column:content"`         // 消息内容
+	Remark        string    `gorm:"column:remark"`          // 备注信息
+	BiApproveId   int       `gorm:"column:bi_approve_id"`   // 审批Id
+	ApproveState  int       `gorm:"column:approve_state"`   // 审批状态:1-待审批;2-已审批;3-已驳回;4-已撤回
+	IsRead        int       `gorm:"column:is_read"`         // 是否已读:0-未读;1-已读
+	CreateTime    time.Time `gorm:"column:create_time"`     // 创建时间
+	ModifyTime    time.Time `gorm:"column:modify_time"`     // 修改时间
 }
 
 func (r *BiApproveMessage) TableName() string {

+ 37 - 0
models/bi_approve/bi_approve_node.go

@@ -3,6 +3,7 @@ package biapprove
 import (
 	"eta_gn/eta_api/global"
 	"fmt"
+	"strings"
 	"time"
 )
 
@@ -18,10 +19,46 @@ type BiApproveNode struct {
 	CreatedTime     time.Time `gorm:"column:created_time"`
 }
 
+var BiApproveNodeCols = struct {
+	BiApproveNodeId string
+	BiApproveFlowId string
+	PrevNodeId      string
+	NextNodeId      string
+	NodeType        string
+	ApproveType     string
+	Users           string
+	CurrVersion     string
+	CreateTime      string
+}{
+	BiApproveNodeId: "bi_approve_node_id",
+	BiApproveFlowId: "bi_approve_flow_id",
+	PrevNodeId:      "prev_node_id",
+	NextNodeId:      "next_node_id",
+	NodeType:        "node_type",
+	ApproveType:     "approve_type",
+	Users:           "users",
+	CurrVersion:     "curr_version",
+	CreateTime:      "create_time",
+}
+
 func (b *BiApproveNode) TableName() string {
 	return "bi_approve_node"
 }
 
+func (m *BiApproveNode) GetItemsByCondition(condition string, pars []interface{}, fieldArr []string, orderRule string) (items []*BiApproveNode, err error) {
+	fields := strings.Join(fieldArr, ",")
+	if len(fieldArr) == 0 {
+		fields = `*`
+	}
+	order := `ORDER BY create_time DESC, bi_approve_node_id ASC`
+	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 UpdateNextNodes(nodes []*BiApproveNode) (err error) {
 	if len(nodes) == 0 {
 		return

+ 27 - 4
models/bi_approve/bi_approve_record.go

@@ -4,6 +4,7 @@ import (
 	"eta_gn/eta_api/global"
 	"eta_gn/eta_api/utils"
 	"fmt"
+	"strings"
 	"time"
 )
 
@@ -106,7 +107,7 @@ func GetBiApproveRecordByCondition(condition string, pars []interface{}) (record
 	return
 }
 
-func GetBiaApproveRecordItemsByCondition(condition string, pars []interface{}) (items []*BiApproveRecord, err error) {
+func GetBiApproveRecordItemsByCondition(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
@@ -121,9 +122,31 @@ func (b *BiApproveRecord) UpdateNodeState(biApproveId, nodeId, nodeState, nodeAp
 	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()
+	sql := fmt.Sprintf(`UPDATE %s SET node_state=?,node_approve_user_id=?,node_approve_user_name=?,node_approve_time=? WHERE bi_approve_id = ? AND node_id = ?`, b.TableName())
 	err = global.DmSQL["rddp"].Exec(sql, pars...).Error
 	return
 }
+
+func (m *BiApproveRecord) GetItemsByCondition(condition string, pars []interface{}, fieldArr []string, orderRule string) (items []*BiApproveRecord, 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 *BiApproveRecord) GetItemByCondition(condition string, pars []interface{}, orderRule string) (item *BiApproveRecord, err error) {
+	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 = global.DmSQL["rddp"].Raw(sql, pars...).First(&item).Error
+	return
+}

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

@@ -3,3 +3,14 @@ package request
 type BiApprovePassReq struct {
 	BiApproveId int `description:"审批ID"`
 }
+
+// BiApproveRefuseReq 审批驳回请求体
+type BiApproveRefuseReq struct {
+	BiApproveId   int    `description:"审批ID"`
+	ApproveRemark string `description:"驳回理由"`
+}
+
+// BiApproveCancelReq 撤销审批请求体
+type BiApproveCancelReq struct {
+	BiApproveId int `description:"审批ID"`
+}

+ 66 - 0
models/bi_approve/response/bi_approve.go

@@ -0,0 +1,66 @@
+package response
+
+// BiApproveDetail 审批详情信息
+type BiApproveDetail struct {
+	Bi               *BiApproveDetailBi      `description:"报告信息"`
+	Approve          *BiApproveDetailItem    `description:"审批信息"`
+	ApproveFlowNodes []*BiApproveDetailNodes `description:"审批节点信息"`
+}
+
+// BiApproveDetailBi 审批详情-报告信息
+type BiApproveDetailBi struct {
+	BiId       int    `description:"看板ID"`
+	BiTitle    string `description:"看板标题"`
+	BiCode     string `description:"看板code"`
+	BiClassify string `description:"看板分类"`
+}
+
+// BiApproveDetailItem 审批详情-审批信息
+type BiApproveDetailItem struct {
+	BiApproveId   int    `description:"审批ID"`
+	State         int    `description:"审批状态:1-待审批;2-已审批;3-已驳回;4-已撤回"`
+	FlowId        int    `description:"审批流ID"`
+	FlowVersion   int    `description:"审批流版本"`
+	StartNodeId   int    `description:"开始节点ID"`
+	CurrNodeId    int    `description:"当前节点ID"`
+	ApplyUserId   int    `description:"申请人ID"`
+	ApplyUserName string `description:"申请人姓名"`
+	ApproveTime   string `description:"审批时间"`
+	CreateTime    string `description:"创建时间"`
+	ModifyTime    string `description:"修改时间"`
+}
+
+// BiApproveDetailNodes 审批详情-节点信息
+type BiApproveDetailNodes struct {
+	BiApproveNodeId int                        `description:"看板审批节点ID"`
+	BiApproveFlowId int                        `description:"看板审批流ID"`
+	PrevNodeId      int                        `description:"上一个节点ID(0为开始节点)"`
+	NextNodeId      int                        `description:"下一个节点ID(0为结束节点)"`
+	NodeType        int                        `description:"节点类型:0-审批;1-抄送"`
+	ApproveType     int                        `description:"审批类型:1-依次审批;2-会签;3-或签"`
+	Users           []*BiApproveDetailNodeUser `description:"审批人信息"`
+}
+
+// BiApproveDetailNodeUser 审批详情-节点用户信息
+type BiApproveDetailNodeUser struct {
+	BiApproveNodeUserReq
+	ApproveRecord *BiApproveDetailNodeUserRecord `description:"用户审批记录"`
+}
+
+// BiApproveNodeUserReq 报告审批节点用户请求体
+type BiApproveNodeUserReq struct {
+	UserType string `description:"审批人类型: user-用户; role-角色"`
+	UserId   int    `description:"用户/角色ID"`
+	UserName string `description:"用户/角色姓名"`
+	Sort     int    `description:"排序"`
+}
+
+// BiApproveDetailNodeUserRecord 审批详情-节点用户审批记录
+type BiApproveDetailNodeUserRecord struct {
+	BiApproveRecordId int    `description:"审批记录ID"`
+	State             int    `description:"审批状态:1-待审批;2-已审批;3-已驳回;4-已撤回"`
+	ApproveUserId     int    `description:"审批人ID"`
+	ApproveUserName   string `description:"审批人姓名"`
+	ApproveRemark     string `description:"审批备注"`
+	ApproveTime       string `description:"审批时间"`
+}

+ 36 - 0
routers/commentsRouter.go

@@ -241,6 +241,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: "Approve",
+            Router: `/approve`,
+            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: "Cancel",
+            Router: `/cancel`,
+            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",
@@ -250,6 +268,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: "Detail",
+            Router: `/detail`,
+            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: "List",
@@ -259,6 +286,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: "Refuse",
+            Router: `/refuse`,
+            AllowHTTPMethods: []string{"post"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
     beego.GlobalControllerRouter["eta_gn/eta_api/controllers/bi_approve:BiApproveFlowController"] = append(beego.GlobalControllerRouter["eta_gn/eta_api/controllers/bi_approve:BiApproveFlowController"],
         beego.ControllerComments{
             Method: "Add",

+ 252 - 24
services/bi_approve/bi_approve.go

@@ -1,6 +1,7 @@
 package biapprove
 
 import (
+	"encoding/json"
 	biapprove "eta_gn/eta_api/models/bi_approve"
 	"eta_gn/eta_api/models/bi_approve/response"
 	"eta_gn/eta_api/models/bi_dashboard"
@@ -13,7 +14,7 @@ import (
 
 var (
 	timeField   = map[int]string{1: fmt.Sprintf("a.%s", biapprove.BiApproveCols.CreateTime), 2: fmt.Sprintf("a.%s", biapprove.BiApproveCols.ApproveTime), 3: fmt.Sprintf("b.%s", biapprove.BiApproveCols.ApproveTime)}
-	myTimeField = map[int]string{1: fmt.Sprintf("%s", biapprove.BiApproveCols.CreateTime), 3: fmt.Sprintf("%s", biapprove.BiApproveCols.ApproveTime)}
+	myTimeField = map[int]string{1: biapprove.BiApproveCols.CreateTime, 3: biapprove.BiApproveCols.ApproveTime}
 	orderRules  = map[int]string{1: "ASC", 2: "DESC"}
 )
 
@@ -196,7 +197,7 @@ func PassBiApprove(approveId int, adminId int) (msg string, err error) {
 		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)
+		otherRecords, e := biapprove.GetBiApproveRecordItemsByCondition(otherCond, otherPars)
 		if e != nil {
 			err = fmt.Errorf("获取节点审批记录失败, Err: %s", e.Error())
 			return
@@ -406,11 +407,11 @@ func updateBiApproveState(biId, approveId, state int) (err error) {
 		BiItem.State = state
 		BiItem.ModifyTime = time.Now().Local()
 
-		// if state == models.ReportStatePass || state == models.ReportStateRefused {
+		// if state == models.BiStatePass || state == models.BiStateRefused {
 		// 	updateCols = append(updateCols, "ApproveTime")
 		// 	// BiItem.ApproveTime = time.Now().Local()
 		// }
-		// if state == models.ReportStatePass {
+		// if state == models.BiStatePass {
 		// 	updateCols = append(updateCols, "PublishTime")
 		// 	// BiItem.PublishTime = time.Now().Local()
 		// }
@@ -423,14 +424,14 @@ func updateBiApproveState(biId, approveId, state int) (err error) {
 }
 
 func ProcessingBiApprove(adminId, classifyId, timeType, sortField, sortRule, startSize, pageSize int, adminName, startTime, endTime, keyword string) (ormList []*biapprove.BiApproveItemOrm, respTotal int, msg string, err error) {
+	cond := fmt.Sprintf(` AND a.%s = ? AND b.%s = ? AND a.%s = ?`, biapprove.BiApproveRecordCols.State, biapprove.BiApproveCols.State, biapprove.BiApproveRecordCols.ApproveUserId)
 	pars := make([]interface{}, 0)
-	cond := ` AND a.state = ? AND b.state = ? AND a."approve_user_id" = ?`
 	pars = append(pars, BiApproveStateApproving, BiApproveStateApproving, adminId)
 	order := ""
 
 	// 筛选条件
 	if classifyId > 0 {
-		cond += ` AND b.classify_id = ?`
+		cond += fmt.Sprintf(` AND b.%s = ?`, biapprove.BiApproveCols.ClassifyId)
 		pars = append(pars, classifyId)
 	}
 	if timeType <= 0 {
@@ -450,43 +451,38 @@ func ProcessingBiApprove(adminId, classifyId, timeType, sortField, sortRule, sta
 			return
 		}
 		tmpEndTime = tmpEndTime.AddDate(0, 0, 1)
-		cond += ` AND (b.create_time BETWEEN ? AND ?)`
+		cond += fmt.Sprintf(` AND (b.%s BETWEEN ? AND ?)`, biapprove.BiApproveCols.CreateTime)
 		pars = append(pars, startTime, tmpEndTime)
 	}
 	keyword = strings.TrimSpace(keyword)
 	if keyword != "" {
 		kw := fmt.Sprint("%", keyword, "%")
-		cond += ` AND b.bi_title LIKE ?`
+		cond += fmt.Sprintf(` AND b.%s LIKE ?`, biapprove.BiApproveCols.BiTitle)
 		pars = append(pars, kw)
 	}
 	if sortField > 0 && sortRule > 0 {
-		var orderField, orderRule string
-		switch sortField {
-		case 1:
-			orderField = "b.create_time"
-		case 2:
-			orderField = "a.approve_time"
-		case 3:
-			orderField = "b.approve_time"
-		}
-		switch sortRule {
-		case 1:
-			orderRule = "ASC"
-		case 2:
-			orderRule = "DESC"
+		orderField := timeField[sortField]
+		if orderField == "" {
+			msg = "时间排序字段有误"
+			return
+		}
+		orderRule := orderRules[sortRule]
+		if orderRule == "" {
+			msg = "时间排序方式有误"
+			return
 		}
 		order = fmt.Sprintf("%s %s", orderField, orderRule)
 	}
 	total, e := biapprove.GetApprovingBiApproveCount(cond, pars)
 	if e != nil {
 		msg = "获取失败"
-		err = e
+		err = fmt.Errorf("GetApprovingBiApproveCount err: %s", e.Error())
 		return
 	}
 	list, e := biapprove.GetApprovingBiApprovePageList(cond, pars, order, startSize, pageSize)
 	if e != nil {
 		msg = "获取失败"
-		err = e
+		err = fmt.Errorf("GetApprovingBiApprovePageList err: %s", e.Error())
 		return
 	}
 	respTotal = total
@@ -636,3 +632,235 @@ func MyApplyBiApproves(adminId, classifyId, timeType, sortField, sortRule, appro
 	ormList = list
 	return
 }
+
+func GetApproveDetail(approveId int) (resp response.BiApproveDetail, msg string, err error) {
+	approveItem, e := biapprove.GetBiApproveById(approveId)
+	if e != nil {
+		if utils.IsErrNoRow(e) {
+			msg = "审批已被删除, 请刷新页面"
+			return
+		}
+		msg = "获取失败"
+		err = fmt.Errorf("GetItemById err: %s", e.Error())
+		return
+	}
+
+	// 审批信息
+	detail := new(response.BiApproveDetail)
+	detail.Approve = new(response.BiApproveDetailItem)
+	detail.Approve.BiApproveId = approveItem.BiApproveId
+	detail.Approve.State = approveItem.State
+	detail.Approve.FlowId = approveItem.FlowId
+	detail.Approve.FlowVersion = approveItem.FlowVersion
+	detail.Approve.StartNodeId = approveItem.StartNodeId
+	detail.Approve.CurrNodeId = approveItem.CurrNodeId
+	detail.Approve.ApplyUserId = approveItem.ApplyUserId
+	detail.Approve.ApplyUserName = approveItem.ApplyUserName
+	detail.Approve.ApproveTime = utils.TimeTransferString(utils.FormatDateTime, approveItem.ApproveTime)
+	detail.Approve.CreateTime = utils.TimeTransferString(utils.FormatDateTime, approveItem.CreateTime)
+	detail.Approve.ModifyTime = utils.TimeTransferString(utils.FormatDateTime, approveItem.ModifyTime)
+
+	// 审批节点
+	nodeOb := new(biapprove.BiApproveNode)
+	nodeCond := fmt.Sprintf(` AND %s = ? AND %s = ?`, biapprove.BiApproveNodeCols.BiApproveFlowId, biapprove.BiApproveNodeCols.CurrVersion)
+	nodePars := make([]interface{}, 0)
+	nodePars = append(nodePars, approveItem.FlowId, approveItem.FlowVersion)
+	nodeItems, e := nodeOb.GetItemsByCondition(nodeCond, nodePars, []string{}, "")
+	if e != nil {
+		msg = "获取失败"
+		err = fmt.Errorf("GetItemsByCondition err: %s", e.Error())
+		return
+	}
+
+	// 审批记录
+	recordOb := new(biapprove.BiApproveRecord)
+	recordCond := fmt.Sprintf(` AND %s = ?`, biapprove.BiApproveRecordCols.BiApproveId)
+	recordPars := make([]interface{}, 0)
+	recordPars = append(recordPars, approveItem.BiApproveId)
+	recordItems, e := recordOb.GetItemsByCondition(recordCond, recordPars, []string{}, fmt.Sprintf("%s DESC", biapprove.BiApproveRecordCols.ApproveTime))
+	if e != nil {
+		msg = "获取失败"
+		err = fmt.Errorf("GetItemsByCondition err: %s", e.Error())
+		return
+	}
+	recordMap := make(map[string]*biapprove.BiApproveRecord)
+	for _, v := range recordItems {
+		k := fmt.Sprintf("%d-%d", v.NodeId, v.ApproveUserId)
+		recordMap[k] = v
+	}
+
+	// 审批流节点详情
+	detail.ApproveFlowNodes = make([]*response.BiApproveDetailNodes, 0)
+	for _, v := range nodeItems {
+		t := new(response.BiApproveDetailNodes)
+		t.BiApproveNodeId = v.BiApproveNodeId
+		t.BiApproveFlowId = v.BiApproveFlowId
+		t.PrevNodeId = v.PrevNodeId
+		t.NextNodeId = v.NextNodeId
+		t.NodeType = v.NodeType
+		t.ApproveType = v.ApproveType
+		t.Users = make([]*response.BiApproveDetailNodeUser, 0)
+		us := make([]*response.BiApproveNodeUserReq, 0)
+		if v.Users != "" {
+			e = json.Unmarshal([]byte(v.Users), &us)
+			if e != nil {
+				msg = "获取失败"
+				err = fmt.Errorf("json.Unmarshal err: %s", e.Error())
+				return
+			}
+		}
+		for _, vu := range us {
+			u := new(response.BiApproveDetailNodeUser)
+			u.UserType = vu.UserType
+			u.UserId = vu.UserId
+			u.UserName = vu.UserName
+			u.Sort = vu.Sort
+			// 审批记录
+			k := fmt.Sprintf("%d-%d", v.BiApproveNodeId, vu.UserId)
+			r := recordMap[k]
+			if r != nil {
+				u.ApproveRecord = new(response.BiApproveDetailNodeUserRecord)
+				u.ApproveRecord.BiApproveRecordId = r.BiApproveRecordId
+				u.ApproveRecord.State = r.State
+				u.ApproveRecord.ApproveUserId = r.ApproveUserId
+				u.ApproveRecord.ApproveUserName = r.ApproveUserName
+				u.ApproveRecord.ApproveRemark = r.ApproveRemark
+				u.ApproveRecord.ApproveTime = utils.TimeTransferString(utils.FormatDateTime, r.ApproveTime)
+			}
+			t.Users = append(t.Users, u)
+		}
+		sort.Slice(t.Users, func(k, j int) bool {
+			return t.Users[k].Sort < t.Users[j].Sort
+		})
+		detail.ApproveFlowNodes = append(detail.ApproveFlowNodes, t)
+	}
+
+	// 看板信息
+	cnClassifyIdName := make(map[int]string)
+	cnClassify, e := bi_dashboard.GetBiDashboardClassifyAllList()
+	if e != nil {
+		msg = "获取失败"
+		err = fmt.Errorf("GetBiDashboardClassifyAllList err: %s", e.Error())
+		return
+	}
+	for _, v := range cnClassify {
+		cnClassifyIdName[v.BiDashboardClassifyId] = v.BiDashboardClassifyName
+	}
+	detail.Bi = new(response.BiApproveDetailBi)
+	detail.Bi.BiId = approveItem.BiId
+	detail.Bi.BiTitle = approveItem.BiTitle
+	detail.Bi.BiClassify = cnClassifyIdName[approveItem.ClassifyId]
+	return
+}
+
+func BiApproveRefuse(biApproveId, adminId int, approveRemark 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.State != BiApproveStateApproving {
+		msg = "审批状态有误, 请刷新页面"
+		err = fmt.Errorf("审批状态有误, State: %d", approveItem.State)
+		return
+	}
+
+	// 校验审批记录和审批
+	recordOb := new(biapprove.BiApproveRecord)
+	recordCond := fmt.Sprintf(` AND %s = ? AND %s = ? AND %s = ?`, biapprove.BiApproveRecordCols.BiApproveId, biapprove.BiApproveRecordCols.ApproveUserId, biapprove.BiApproveRecordCols.State)
+	recordPars := make([]interface{}, 0)
+	recordPars = append(recordPars, approveItem.BiApproveId, adminId, BiApproveStateApproving)
+	recordItem, e := recordOb.GetItemByCondition(recordCond, recordPars, "")
+	if e != nil {
+		if utils.IsErrNoRow(e) {
+			msg = "无权审批"
+			return
+		}
+		msg = "操作失败"
+		err = fmt.Errorf("GetItemByCondition err: %s", e.Error())
+		return
+	}
+
+	// 驳回审批
+	if e = RefuseBiApprove(approveItem, recordItem, approveRemark, adminId); e != nil {
+		msg = "操作失败"
+		err = fmt.Errorf("RefuseBiApprove err: %s", e.Error())
+		return
+	}
+	return
+}
+
+// RefuseBiApprove 驳回审批
+func RefuseBiApprove(approveItem *biapprove.BiApprove, recordItem *biapprove.BiApproveRecord, approveRemark string, sysAdminId int) (err error) {
+	if approveItem == nil {
+		err = fmt.Errorf("审批信息有误")
+		return
+	}
+	if recordItem == nil {
+		err = fmt.Errorf("审批记录有误")
+		return
+	}
+
+	// 更新审批记录
+	now := time.Now().Local()
+	recordItem.State = BiApproveStateRefuse
+	recordItem.ApproveRemark = approveRemark
+	recordItem.ApproveTime = now
+	recordItem.ModifyTime = now
+
+	recordItem.NodeState = BiApproveStateRefuse
+	recordItem.NodeApproveUserId = recordItem.ApproveUserId
+	recordItem.NodeApproveUserName = recordItem.ApproveUserName
+	recordItem.NodeApproveTime = now
+
+	recordCols := []string{"State", "ApproveRemark", "ApproveTime", "ModifyTime", "NodeState", "NodeApproveUserId", "NodeApproveUserName", "NodeApproveTime"}
+	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
+	}
+
+	// 驳回-更新审批, 报告状态, 推送消息
+	approveItem.State = BiApproveStateRefuse
+	approveItem.ApproveRemark = approveRemark
+	approveItem.ApproveTime = now
+	approveItem.ModifyTime = now
+	approveCols := []string{"State", "ApproveRemark", "ApproveTime", "ModifyTime"}
+	if e := approveItem.Update(approveCols); e != nil {
+		err = fmt.Errorf("更新审批状态失败, Err: %s", e.Error())
+		return
+	}
+
+	if e := updateBiApproveState(approveItem.BiId, approveItem.BiApproveId, BiStateRefused); e != nil {
+		err = fmt.Errorf("更新报告状态失败, Err: %s", e.Error())
+		return
+	}
+
+	// 推送驳回消息给申请人
+	go func() {
+		messageItem := new(biapprove.BiApproveMessage)
+		messageItem.SendUserId = sysAdminId
+		messageItem.ReceiveUserId = approveItem.ApplyUserId
+		messageItem.Content = "您提交的审批被驳回"
+		messageItem.Remark = "您提交的【研报审批】已被驳回"
+		messageItem.BiApproveId = approveItem.BiApproveId
+		messageItem.ApproveState = BiApproveStateRefuse
+		messageItem.CreateTime = now
+		messageItem.ModifyTime = now
+		if e := messageItem.Create(); e != nil {
+			utils.FileLog.Info(fmt.Sprintf("ApproveBi message err: %s", e.Error()))
+			return
+		}
+	}()
+	return
+}

+ 1 - 1
services/bi_approve/bi_approve_flow.go

@@ -44,7 +44,7 @@ func SaveBiApproveFlow(flow *request.BiApproveFlowSaveReq) (ok bool, msg string,
 	}
 	if flow.BiApproveFlowId == 0 {
 		tmp, er := biapprove.GetBiApproveFlowByClassifyId(flow.ClassifyId)
-		if er != nil {
+		if er != nil && !utils.IsErrNoRow(er) {
 			msg = "保存审批流失败"
 			err = er
 			return