ACT_HI_PROCINST.go 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227
  1. package dao
  2. import (
  3. "gorm.io/gorm"
  4. "server/dao/flow"
  5. "server/global"
  6. "strings"
  7. "sync"
  8. )
  9. // ProcInst 流程实例
  10. type ProcInst struct {
  11. global.GVA_MODEL
  12. // 流程定义ID
  13. ProcDefID int `json:"procDefId"`
  14. // 流程定义名
  15. ProcDefName string `json:"procDefName"`
  16. // title 标题
  17. Title string `json:"title"`
  18. // 用户部门
  19. Department string `json:"department"`
  20. Company string `json:"company"`
  21. // 当前节点
  22. NodeID string `json:"nodeID"`
  23. // 审批人
  24. Candidate string `json:"candidate"`
  25. // 当前任务
  26. TaskID int `json:"taskID"`
  27. StartTime string `json:"startTime"`
  28. EndTime string `json:"endTime"`
  29. Duration int64 `json:"duration"`
  30. StartUserID string `json:"startUserId"`
  31. StartUserName string `json:"startUserName"`
  32. IsFinished bool `gorm:"default:false" json:"isFinished"`
  33. }
  34. // GroupsNotNull 候选组
  35. func GroupsNotNull(groups []string, sql string) func(db *gorm.DB) *gorm.DB {
  36. if len(groups) > 0 {
  37. return func(db *gorm.DB) *gorm.DB {
  38. return db.Or("candidate in (?) and "+sql, groups)
  39. }
  40. }
  41. return func(db *gorm.DB) *gorm.DB {
  42. return db
  43. }
  44. }
  45. // DepartmentsNotNull 分管部门
  46. func DepartmentsNotNull(departments []string, sql string) func(db *gorm.DB) *gorm.DB {
  47. if len(departments) > 0 {
  48. return func(db *gorm.DB) *gorm.DB {
  49. return db.Or("department in (?) and candidate=? and "+sql, departments, IdentityTypes[flow.MANAGER])
  50. }
  51. }
  52. return func(db *gorm.DB) *gorm.DB {
  53. return db
  54. }
  55. }
  56. // StartByMyself 我发起的流程
  57. func StartByMyself(userID, company string, pageIndex, pageSize int) ([]*ProcInst, int64, error) {
  58. maps := map[string]interface{}{
  59. "start_user_id": userID,
  60. "company": company,
  61. }
  62. return findProcInsts(maps, pageIndex, pageSize)
  63. }
  64. // FindProcInstByID FindProcInstByID
  65. func FindProcInstByID(id int) (*ProcInst, error) {
  66. var data = ProcInst{}
  67. err := global.GVA_DB.Where("id=?", id).Find(&data).Error
  68. if err != nil {
  69. return nil, err
  70. }
  71. return &data, nil
  72. }
  73. // FindProcNotify 查询抄送我的流程
  74. func FindProcNotify(userID, company string, groups []string, pageIndex, pageSize int) ([]*ProcInst, int64, error) {
  75. var datas []*ProcInst
  76. var count int64
  77. var sql string
  78. if len(groups) != 0 {
  79. var s []string
  80. for _, val := range groups {
  81. s = append(s, "\""+val+"\"")
  82. }
  83. sql = "select proc_inst_id from identitylink i where i.type='notifier' and i.company='" + company + "' and (i.user_id='" + userID + "' or i.group in (" + strings.Join(s, ",") + "))"
  84. } else {
  85. sql = "select proc_inst_id from identitylink i where i.type='notifier' and i.company='" + company + "' and i.user_id='" + userID + "'"
  86. }
  87. err := global.GVA_DB.Where("id in (" + sql + ")").Offset((pageIndex - 1) * pageSize).Limit(pageSize).Order("start_time desc").Find(&datas).Error
  88. if err != nil {
  89. return datas, count, err
  90. }
  91. err = global.GVA_DB.Model(&ProcInst{}).Where("id in (" + sql + ")").Count(&count).Error
  92. if err != nil {
  93. return nil, count, err
  94. }
  95. return datas, count, err
  96. }
  97. func findProcInsts(maps map[string]interface{}, pageIndex, pageSize int) ([]*ProcInst, int64, error) {
  98. var datas []*ProcInst
  99. var count int64
  100. selectDatas := func(in chan<- error, wg *sync.WaitGroup) {
  101. go func() {
  102. err := global.GVA_DB.Where(maps).Offset((pageIndex - 1) * pageSize).Limit(pageSize).Order("start_time desc").Find(&datas).Error
  103. in <- err
  104. wg.Done()
  105. }()
  106. }
  107. selectCount := func(in chan<- error, wg *sync.WaitGroup) {
  108. err := global.GVA_DB.Model(&ProcInst{}).Where(maps).Count(&count).Error
  109. in <- err
  110. wg.Done()
  111. }
  112. var err1 error
  113. var wg sync.WaitGroup
  114. numberOfRoutine := 2
  115. wg.Add(numberOfRoutine)
  116. errStream := make(chan error, numberOfRoutine)
  117. // defer fmt.Println("close channel")
  118. selectDatas(errStream, &wg)
  119. selectCount(errStream, &wg)
  120. wg.Wait()
  121. defer close(errStream) // 关闭通道
  122. for i := 0; i < numberOfRoutine; i++ {
  123. // log.Printf("send: %v", <-errStream)
  124. if err := <-errStream; err != nil {
  125. err1 = err
  126. }
  127. }
  128. // fmt.Println("结束")
  129. return datas, count, err1
  130. }
  131. // FindProcInsts FindProcInsts
  132. // 分页查询
  133. func FindProcInsts(userID, procName, company string, groups, departments []string, pageIndex, pageSize int) ([]*ProcInst, int64, error) {
  134. var datas []*ProcInst
  135. var count int64
  136. var sql = " company='" + company + "' and is_finished=0 "
  137. if len(procName) > 0 {
  138. sql += "and proc_def_name='" + procName + "'"
  139. }
  140. // fmt.Println(sql)
  141. selectDatas := func(in chan<- error, wg *sync.WaitGroup) {
  142. go func() {
  143. err := global.GVA_DB.Scopes(GroupsNotNull(groups, sql), DepartmentsNotNull(departments, sql)).
  144. Or("candidate=? and "+sql, userID).
  145. Offset((pageIndex - 1) * pageSize).Limit(pageSize).
  146. Order("start_time desc").
  147. Find(&datas).Error
  148. in <- err
  149. wg.Done()
  150. }()
  151. }
  152. selectCount := func(in chan<- error, wg *sync.WaitGroup) {
  153. go func() {
  154. err := global.GVA_DB.Scopes(GroupsNotNull(groups, sql), DepartmentsNotNull(departments, sql)).Model(&ProcInst{}).Or("candidate=? and "+sql, userID).Count(&count).Error
  155. in <- err
  156. wg.Done()
  157. }()
  158. }
  159. var err1 error
  160. var wg sync.WaitGroup
  161. numberOfRoutine := 2
  162. wg.Add(numberOfRoutine)
  163. errStream := make(chan error, numberOfRoutine)
  164. // defer fmt.Println("close channel")
  165. selectDatas(errStream, &wg)
  166. selectCount(errStream, &wg)
  167. wg.Wait()
  168. defer close(errStream) // 关闭通道
  169. for i := 0; i < numberOfRoutine; i++ {
  170. // log.Printf("send: %v", <-errStream)
  171. if err := <-errStream; err != nil {
  172. err1 = err
  173. }
  174. }
  175. // fmt.Println("结束")
  176. return datas, count, err1
  177. }
  178. // Save save
  179. func (p *ProcInst) Save() (int, error) {
  180. err := global.GVA_DB.Create(p).Error
  181. if err != nil {
  182. return 0, err
  183. }
  184. return int(p.ID), nil
  185. }
  186. // SaveTx SaveTx
  187. func (p *ProcInst) SaveTx(tx *gorm.DB) (int, error) {
  188. if err := tx.Create(p).Error; err != nil {
  189. tx.Rollback()
  190. return 0, err
  191. }
  192. return int(p.ID), nil
  193. }
  194. // DelProcInstByID DelProcInstByID
  195. func DelProcInstByID(id int) error {
  196. return global.GVA_DB.Where("id=?", id).Delete(&ProcInst{}).Error
  197. }
  198. // DelProcInstByIDTx DelProcInstByIDTx
  199. // 事务
  200. func DelProcInstByIDTx(id int, tx *gorm.DB) error {
  201. return tx.Where("id=?", id).Delete(&ProcInst{}).Error
  202. }
  203. // UpdateTx UpdateTx
  204. func (p *ProcInst) UpdateTx(tx *gorm.DB) error {
  205. return tx.Model(&ProcInst{}).Updates(p).Error
  206. }
  207. // FindFinishedProc FindFinishedProc
  208. func FindFinishedProc() ([]*ProcInst, error) {
  209. var datas []*ProcInst
  210. err := global.GVA_DB.Where("is_finished=1").Find(&datas).Error
  211. return datas, err
  212. }