approval_flow_node.go 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126
  1. package system
  2. import (
  3. "github.com/beego/beego/v2/client/orm"
  4. "time"
  5. )
  6. //审批流程节点路线表
  7. type ApprovalFlowNode struct {
  8. NodeId int `orm:"column(node_id);pk";json:"node_id"` // 流程节点id
  9. FlowId int `orm:"column(flow_id);";json:"flow_id"` // 流程id
  10. NodeName string `orm:"column(node_name);" json:"node_name"` // 流程节点名称
  11. PrevNodeId int `orm:"column(prev_node_id);" json:"prev_node_id"` //上级节点id,为0代表是开始节点
  12. NextNodeId int `orm:"column(next_node_id);" json:"next_node_id"` //下级节点id,为0代表是结束节点
  13. NodeType string `orm:"column(node_type);" json:"node_type"` //节点类型,审批人:check;抄送人:cc(Carbon Copy),默认是:check
  14. AuditType int `orm:"column(audit_type);" json:"audit_type"` //多人审批时,1:或签(一名审批人同意即可),2:会签(需所有审批人同意)
  15. User string `orm:"column(user);" json:"user"` //所属用户,多个用英文,隔开;用户类型为user代表指定人id,manager代表几级主管,role代表角色类型
  16. Version int `orm:"column(version);" json:"version"` // 所属流程版本
  17. CreateTime time.Time `orm:"column(create_time);" json:"create_time"` // 创建时间
  18. }
  19. //审批列表数据
  20. type ApprovalFlowNodeList struct {
  21. NodeId int `description:"流程节点id"` // 流程节点id
  22. FlowId int `description:"流程id"` // 流程id
  23. NodeName string `description:"流程节点名称"` // 流程节点名称
  24. PrevNodeId int `description:"上级节点id,为0代表是开始节点"` //上级节点id,为0代表是开始节点
  25. NextNodeId int `description:"下级节点id,为0代表是结束节点"` //下级节点id,为0代表是结束节点
  26. NodeType string `description:"节点类型,审批人:check;抄送人:cc(Carbon Copy),默认是:check"` //节点类型,审批人:check;抄送人:cc(Carbon Copy),默认是:check
  27. AuditType int `description:"多人审批时,1:或签(一名审批人同意即可),2:会签(需所有审批人同意)"` //多人审批时,1:或签(一名审批人同意即可),2:会签(需所有审批人同意)
  28. User string `description:"用户列表"` //所属用户,多个用英文,隔开;用户类型为user代表指定人id,manager代表几级主管,role代表角色类型
  29. UserArr []NodeUser `json:"User";description:"节点用户"` //所属用户,多个用英文,隔开;用户类型为user代表指定人id,manager代表几级主管,role代表角色类型
  30. Version int `description:"所属流程版本"` // 所属流程版本
  31. CreateTime time.Time `description:"创建时间"` // 创建时间
  32. UserList []User `description:"审批人、抄送人列表信息"` // 审批人、抄送人列表信息
  33. }
  34. //审批人、抄送人信息
  35. type User struct {
  36. AdminId int `description:"人员id(审批人、抄送人)"`
  37. RoleId int `description:"人员角色id(审批人、抄送人)"`
  38. Name string `description:"人员名称(审批人、抄送人)"`
  39. RoleName string `description:"人员角色名称(审批人、抄送人)"`
  40. RoleTypeCode string `description:"人员角色类型(审批人、抄送人)"`
  41. Mobile string `description:"手机号(审批人、抄送人)"`
  42. }
  43. //根据流程id获取整个审批流程节点路线
  44. func GetListByFlowId(flowId, version int) (items []*ApprovalFlowNodeList, err error) {
  45. sql := `SELECT * FROM approval_flow_node WHERE flow_id=? AND version=? order by node_id asc `
  46. o := orm.NewOrm()
  47. _, err = o.Raw(sql, flowId, version).QueryRows(&items)
  48. return
  49. }
  50. //根据节点id获取节点信息
  51. func GetByNodeId(nodeId int) (item *ApprovalFlowNode, err error) {
  52. sql := `SELECT * FROM approval_flow_node WHERE node_id=? LIMIT 1 `
  53. o := orm.NewOrm()
  54. err = o.Raw(sql, nodeId).QueryRow(&item)
  55. return
  56. }
  57. //更新审批流
  58. func UpdateFlow(flowId int, flowNodeList []*ApprovalFlowNode) (err error) {
  59. o := orm.NewOrm()
  60. to, err := o.Begin()
  61. if err != nil {
  62. return
  63. }
  64. defer func() {
  65. if err != nil {
  66. _ = to.Rollback()
  67. } else {
  68. _ = to.Commit()
  69. }
  70. }()
  71. var item ApprovalFlow
  72. sql := `SELECT * FROM approval_flow WHERE flow_id=? FOR UPDATE `
  73. err = to.Raw(sql, flowId).QueryRow(&item)
  74. if err != nil {
  75. return
  76. }
  77. //新版本号
  78. newVer := item.CurrVersion + 1
  79. item.CurrVersion = newVer
  80. _, err = to.Update(&item, "CurrVersion")
  81. if err != nil {
  82. return
  83. }
  84. //新增节点
  85. prevNodeId := 0
  86. for _, node := range flowNodeList {
  87. node.Version = newVer
  88. node.PrevNodeId = prevNodeId //上级节点
  89. nodeId, tmpErr := to.Insert(node)
  90. if tmpErr != nil {
  91. err = tmpErr
  92. return
  93. }
  94. //记录节点id
  95. node.NodeId = int(nodeId)
  96. //上一级节点id
  97. prevNodeId = int(nodeId)
  98. }
  99. //修改对应节点的下级节点
  100. nextNodeId := 0
  101. lenNodeList := len(flowNodeList) - 1
  102. for i := lenNodeList; i >= 0; i-- {
  103. node := flowNodeList[i]
  104. node.NextNodeId = nextNodeId
  105. _, tmpErr := to.Update(node, "NextNodeId")
  106. if tmpErr != nil {
  107. err = tmpErr
  108. return
  109. }
  110. nextNodeId = node.NodeId
  111. }
  112. return
  113. }