bi_approve.go 37 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138
  1. package biapprove
  2. import (
  3. "encoding/json"
  4. "eta_gn/eta_api/models"
  5. biapprove "eta_gn/eta_api/models/bi_approve"
  6. "eta_gn/eta_api/models/bi_approve/response"
  7. "eta_gn/eta_api/models/bi_dashboard"
  8. "eta_gn/eta_api/utils"
  9. "fmt"
  10. "sort"
  11. "strings"
  12. "time"
  13. )
  14. var (
  15. timeField = map[int]string{1: fmt.Sprintf("a.%s", biapprove.BiApproveRecordCols.CreateTime), 2: fmt.Sprintf("a.%s", biapprove.BiApproveRecordCols.NodeApproveTime), 3: fmt.Sprintf("b.%s", biapprove.BiApproveCols.ApproveTime)}
  16. myTimeField = map[int]string{1: biapprove.BiApproveCols.CreateTime, 3: biapprove.BiApproveCols.ApproveTime}
  17. orderRules = map[int]string{1: "ASC", 2: "DESC"}
  18. )
  19. func GetPulicBiClassifyList() (res []*bi_dashboard.BiDashboardClassifyItem, msg string, err error) {
  20. classifyList, err := bi_dashboard.GetBiDashboardClassifyAllList()
  21. if err != nil {
  22. msg = "获取公共分类列表失败"
  23. return
  24. }
  25. res = toClassifyItem(classifyList)
  26. return
  27. }
  28. func PassBiApprove(approveId int, adminId int) (msg string, err error) {
  29. approveItem, e := biapprove.GetBiApproveById(approveId)
  30. if e != nil {
  31. if utils.IsErrNoRow(e) {
  32. msg = "审批不存在, 请刷新页面"
  33. err = e
  34. return
  35. }
  36. msg = "操作失败"
  37. return
  38. }
  39. if approveItem.State != BiApproveStateApproving {
  40. msg = "审批状态有误, 请刷新页面"
  41. err = fmt.Errorf("审批状态有误, State: %d", approveItem.State)
  42. return
  43. }
  44. var ApprovePars []interface{}
  45. Approveconds := ` AND bi_approve_id =? AND approve_user_id =? AND state =? `
  46. ApprovePars = append(ApprovePars, approveId, adminId, BiApproveStateApproving)
  47. recordItem, er := biapprove.GetBiApproveRecordByCondition(Approveconds, ApprovePars)
  48. if er != nil {
  49. if utils.IsErrNoRow(er) {
  50. msg = "无权审批"
  51. err = er
  52. return
  53. }
  54. msg = "操作失败"
  55. return
  56. }
  57. // 查询审批流和审批流节点
  58. flowItem, e := biapprove.GetBiApproveFlowById(approveItem.FlowId)
  59. if e != nil {
  60. err = fmt.Errorf("获取审批流失败, Err: %s", e.Error())
  61. return
  62. }
  63. nodePars := make([]interface{}, 0)
  64. nodeCond := ` AND bi_approve_flow_id =? AND curr_version =? `
  65. nodePars = append(nodePars, flowItem.BiApproveFlowId, flowItem.CurrVersion)
  66. nodeItems, e := biapprove.GetBiApproveNodeByCondition(nodeCond, nodePars)
  67. if e != nil {
  68. err = fmt.Errorf("ApproveNodes GetItemsByCondition err: %s", e.Error())
  69. return
  70. }
  71. if len(nodeItems) == 0 {
  72. err = fmt.Errorf("无审批节点")
  73. return
  74. }
  75. nodeMap := make(map[int]*biapprove.BiApproveNode)
  76. for _, v := range nodeItems {
  77. nodeMap[v.BiApproveNodeId] = v
  78. }
  79. // 取出审批记录的节点
  80. currNodeItem := nodeMap[recordItem.NodeId]
  81. if currNodeItem == nil {
  82. err = fmt.Errorf("当前节点信息有误")
  83. return
  84. }
  85. currNode, e := FormatBiApproveNode2Item(currNodeItem)
  86. if e != nil {
  87. err = fmt.Errorf("当前节点信息有误, Err: %s", e.Error())
  88. return
  89. }
  90. now := time.Now().Local()
  91. recordItem.State = BiApproveStatePass
  92. recordItem.ApproveTime = now
  93. recordItem.ModifyTime = now
  94. recordItem.NodeState = BiApproveStatePass
  95. recordItem.NodeApproveUserId = recordItem.ApproveUserId
  96. recordItem.NodeApproveUserName = recordItem.ApproveUserName
  97. recordItem.NodeApproveTime = now
  98. recordCols := []string{"State", "ApproveTime", "ModifyTime", "NodeState", "NodeApproveUserId", "NodeApproveUserName", "NodeApproveTime"}
  99. lastApprove := false
  100. // 依次审批
  101. if currNode.ApproveType == NodeApproveTypeRoll {
  102. if e = recordItem.Update(recordCols); e != nil {
  103. err = fmt.Errorf("更新审批记录状态失败, Err: %s", e.Error())
  104. return
  105. }
  106. // 检查依次审批情况
  107. sort.Slice(currNode.Users, func(k, j int) bool {
  108. return currNode.Users[k].Sort < currNode.Users[j].Sort
  109. })
  110. userLen := len(currNode.Users)
  111. //lastRoll := false
  112. nextUser := new(response.BiApproveNodeUser) // 下一个审批人, 为nil则表示当前审批人即为最后
  113. for k, v := range currNode.Users {
  114. // 当前审批人
  115. if v.UserId == adminId && recordItem.ApproveUserSort == v.Sort {
  116. //if k == (userLen - 1) {
  117. // lastRoll = true
  118. // break
  119. //}
  120. if (k + 1) < userLen {
  121. nextUser = currNode.Users[k+1]
  122. }
  123. }
  124. }
  125. //if lastRoll && currNode.NextNodeId == 0 {
  126. // lastApprove = true
  127. //}
  128. // 当前节点下一个审批人, 生成下一个审批记录且return
  129. if nextUser.UserId > 0 {
  130. newRecord := new(biapprove.BiApproveRecord)
  131. newRecord.BiApproveId = recordItem.BiApproveId
  132. newRecord.State = BiApproveStateApproving
  133. newRecord.NodeId = currNode.BiApproveNodeId
  134. newRecord.PrevNodeId = currNode.PrevNodeId
  135. newRecord.NextNodeId = currNode.NextNodeId
  136. newRecord.ApproveType = currNode.ApproveType
  137. newRecord.ApproveUserId = nextUser.UserId
  138. newRecord.ApproveUserName = nextUser.UserName
  139. newRecord.ApproveUserSort = nextUser.Sort
  140. newRecord.CreateTime = now
  141. newRecord.ModifyTime = now
  142. newRecord.NodeState = BiApproveStateApproving
  143. if e = newRecord.Create(); e != nil {
  144. err = fmt.Errorf("生成审批记录失败, Err: %s", e.Error())
  145. return
  146. }
  147. // 推送审批消息
  148. go func() {
  149. messageItem := new(biapprove.BiApproveMessage)
  150. messageItem.SendUserId = approveItem.ApplyUserId
  151. messageItem.ReceiveUserId = nextUser.UserId
  152. messageItem.Content = "您有新的待办任务"
  153. messageItem.Remark = fmt.Sprintf("%s提交的【%s】需要您审批,请及时处理", approveItem.ApplyUserName, approveItem.BiTitle)
  154. messageItem.BiApproveId = approveItem.BiApproveId
  155. messageItem.ApproveState = BiApproveStateApproving
  156. messageItem.CreateTime = now
  157. messageItem.ModifyTime = now
  158. if e = messageItem.Create(); e != nil {
  159. utils.FileLog.Info(fmt.Sprintf("PassBiApprove message err: %s", e.Error()))
  160. return
  161. }
  162. }()
  163. return
  164. }
  165. // 更新审批当前节点并进入下一个节点
  166. if currNode.NextNodeId > 0 {
  167. nextNode := nodeMap[currNode.NextNodeId]
  168. approveItem.CurrNodeId = currNode.NextNodeId
  169. approveItem.ModifyTime = now
  170. if e = approveItem.Update([]string{"CurrNodeId", "ModifyTime"}); e != nil {
  171. err = fmt.Errorf("更新审批当前节点失败, Err: %s", e.Error())
  172. return
  173. }
  174. err = BuildNextNodeRecordAndMsg(nextNode, approveItem.BiApproveId, approveItem.ApplyUserId, approveItem.ApplyUserName, approveItem.BiTitle)
  175. return
  176. } else {
  177. // 最后一个节点
  178. lastApprove = true
  179. }
  180. }
  181. // 会签
  182. if currNode.ApproveType == NodeApproveTypeAll {
  183. // 查询其他审批人是否已审批
  184. otherCond := ` AND bi_approve_id =? AND node_id =? AND approve_user_id <> ? `
  185. otherPars := make([]interface{}, 0)
  186. otherPars = append(otherPars, approveItem.BiApproveId, recordItem.NodeId, adminId)
  187. otherRecords, e := biapprove.GetBiApproveRecordItemsByCondition(otherCond, otherPars)
  188. if e != nil {
  189. err = fmt.Errorf("获取节点审批记录失败, Err: %s", e.Error())
  190. return
  191. }
  192. otherPass := true
  193. for _, v := range otherRecords {
  194. if v.State != BiApproveStatePass {
  195. otherPass = false
  196. }
  197. }
  198. // 其他人未审批, 仅更新当前审批记录
  199. if e = recordItem.Update(recordCols); e != nil {
  200. err = fmt.Errorf("更新审批记录状态失败, Err: %s", e.Error())
  201. return
  202. }
  203. // 其他人已审批且为最后节点
  204. if otherPass && currNode.NextNodeId == 0 {
  205. lastApprove = true
  206. }
  207. // 其他人已审批且不为最后节点, 进入下一节点
  208. if otherPass && currNode.NextNodeId > 0 {
  209. nextNode := nodeMap[currNode.NextNodeId]
  210. approveItem.CurrNodeId = currNode.NextNodeId
  211. approveItem.ModifyTime = now
  212. if e = approveItem.Update([]string{"CurrNodeId", "ModifyTime"}); e != nil {
  213. err = fmt.Errorf("更新审批当前节点失败, Err: %s", e.Error())
  214. return
  215. }
  216. err = BuildNextNodeRecordAndMsg(nextNode, approveItem.BiApproveId, approveItem.ApplyUserId, approveItem.ApplyUserName, approveItem.BiTitle)
  217. return
  218. }
  219. }
  220. // 或签
  221. if currNode.ApproveType == NodeApproveTypeAny {
  222. // 需检查一下审批的当前节点和记录的节点是否匹配, 不匹配可能是因为另外的审批人已通过, 所以此处应给提示
  223. // 前端也有做相应的判断,但是两个人同时进入审批详情页时就可能出现这种情况
  224. if approveItem.CurrNodeId != recordItem.NodeId {
  225. msg = "该节点已完成审批, 请刷新页面"
  226. return
  227. }
  228. if e = recordItem.Update(recordCols); e != nil {
  229. err = fmt.Errorf("更新审批记录状态失败, Err: %s", e.Error())
  230. return
  231. }
  232. // 将该审批的同一个节点的记录标记为已审批
  233. if e = recordItem.UpdateNodeState(recordItem.BiApproveId, recordItem.NodeId, recordItem.NodeState, recordItem.NodeApproveUserId, recordItem.NodeApproveUserName, recordItem.NodeApproveTime); e != nil {
  234. err = fmt.Errorf("更新同一节点的其他审批记录状态失败, Err: %s", e.Error())
  235. return
  236. }
  237. if currNode.NextNodeId == 0 {
  238. lastApprove = true
  239. }
  240. if currNode.NextNodeId > 0 {
  241. nextNode := nodeMap[currNode.NextNodeId]
  242. approveItem.CurrNodeId = currNode.NextNodeId
  243. approveItem.ModifyTime = now
  244. if e = approveItem.Update([]string{"CurrNodeId", "ModifyTime"}); e != nil {
  245. err = fmt.Errorf("更新审批当前节点失败, Err: %s", e.Error())
  246. return
  247. }
  248. err = BuildNextNodeRecordAndMsg(nextNode, approveItem.BiApproveId, approveItem.ApplyUserId, approveItem.ApplyUserName, approveItem.BiTitle)
  249. return
  250. }
  251. }
  252. // 最后一个审批, 更新审批记录、审批、报告状态、推送消息给申请人
  253. if lastApprove {
  254. if e = recordItem.Update(recordCols); e != nil {
  255. err = fmt.Errorf("更新审批记录状态失败, Err: %s", e.Error())
  256. return
  257. }
  258. approveItem.State = BiApproveStatePass
  259. approveItem.ApproveTime = now
  260. approveItem.ModifyTime = now
  261. approveCols := []string{"State", "ApproveTime", "ModifyTime"}
  262. if e = approveItem.Update(approveCols); e != nil {
  263. err = fmt.Errorf("更新审批信息失败, Err: %s", e.Error())
  264. return
  265. }
  266. if e = updateBiApproveState(approveItem.BiId, BiStatePass); e != nil {
  267. err = fmt.Errorf("更新报告审批状态失败, Err: %s", e.Error())
  268. return
  269. }
  270. go func() {
  271. messageItem := new(biapprove.BiApproveMessage)
  272. messageItem.SendUserId = adminId
  273. messageItem.ReceiveUserId = approveItem.ApplyUserId
  274. messageItem.Content = "您提交的审批已通过"
  275. messageItem.Remark = fmt.Sprintf("您提交的【%s】已通过", approveItem.BiTitle)
  276. messageItem.BiApproveId = approveItem.BiApproveId
  277. messageItem.ApproveState = BiApproveStatePass
  278. messageItem.CreateTime = now
  279. messageItem.ModifyTime = now
  280. if e = messageItem.Create(); e != nil {
  281. utils.FileLog.Info(fmt.Sprintf("PassBiApprove message err: %s", e.Error()))
  282. return
  283. }
  284. }()
  285. }
  286. return
  287. }
  288. func toClassifyItem(src []*bi_dashboard.BiDashboardClassify) (dst []*bi_dashboard.BiDashboardClassifyItem) {
  289. for _, item := range src {
  290. dst = append(dst, &bi_dashboard.BiDashboardClassifyItem{
  291. BiDashboardClassifyId: item.BiDashboardClassifyId,
  292. BiDashboardClassifyName: item.BiDashboardClassifyName,
  293. })
  294. }
  295. return
  296. }
  297. // BuildNextNodeRecordAndMsg 生成下一个节点的审批记录并推送消息
  298. func BuildNextNodeRecordAndMsg(approveNodeItem *biapprove.BiApproveNode, approveId, sysAdminId int, sysAdminName, biTitle string) (err error) {
  299. if approveNodeItem == nil {
  300. err = fmt.Errorf("approve node nil")
  301. return
  302. }
  303. // 根据节点审批方式生成审批记录
  304. now := time.Now().Local()
  305. approveNode, e := FormatBiApproveNode2Item(approveNodeItem)
  306. if e != nil {
  307. err = fmt.Errorf("FormatBiApproveNode2Item err: %s", e.Error())
  308. return
  309. }
  310. if len(approveNode.Users) == 0 {
  311. err = fmt.Errorf("审批节点用户有误")
  312. return
  313. }
  314. newRecords := make([]*biapprove.BiApproveRecord, 0)
  315. sort.Slice(approveNode.Users, func(k, j int) bool {
  316. return approveNode.Users[k].Sort < approveNode.Users[j].Sort
  317. })
  318. for _, u := range approveNode.Users {
  319. r := new(biapprove.BiApproveRecord)
  320. r.BiApproveId = approveId
  321. r.State = BiApproveStateApproving
  322. r.NodeId = approveNode.BiApproveNodeId
  323. r.PrevNodeId = approveNode.PrevNodeId
  324. r.NextNodeId = approveNode.NextNodeId
  325. r.ApproveType = approveNode.ApproveType
  326. r.ApproveUserId = u.UserId
  327. r.ApproveUserName = u.UserName
  328. r.ApproveUserSort = u.Sort
  329. r.CreateTime = now
  330. r.ModifyTime = now
  331. r.NodeState = BiApproveStateApproving // 当前节点审批状态
  332. newRecords = append(newRecords, r)
  333. // 依次审批仅生成一条记录
  334. if approveNode.ApproveType == NodeApproveTypeRoll {
  335. break
  336. }
  337. }
  338. recordOb := new(biapprove.BiApproveRecord)
  339. if e = recordOb.CreateMulti(newRecords); e != nil {
  340. err = fmt.Errorf("生成节点审批记录失败, Err: %s", e.Error())
  341. return
  342. }
  343. // 推送审批消息
  344. go func() {
  345. messageOb := new(biapprove.BiApproveMessage)
  346. messages := make([]*biapprove.BiApproveMessage, 0)
  347. for _, v := range newRecords {
  348. m := new(biapprove.BiApproveMessage)
  349. m.SendUserId = sysAdminId
  350. m.ReceiveUserId = v.ApproveUserId
  351. m.Content = "您有新的待办任务"
  352. m.Remark = fmt.Sprintf("%s提交的【%s】需要您审批,请及时处理", sysAdminName, biTitle)
  353. m.BiApproveId = approveId
  354. m.ApproveState = BiApproveStateApproving
  355. m.CreateTime = now
  356. m.ModifyTime = now
  357. messages = append(messages, m)
  358. }
  359. e = messageOb.CreateMulti(messages)
  360. if e != nil {
  361. utils.FileLog.Info(fmt.Sprintf("BuildNextNodeRecordAndMsg messages err: %s", e.Error()))
  362. return
  363. }
  364. }()
  365. return
  366. }
  367. // updateBiApproveState 更新Bi看板审批状态
  368. func updateBiApproveState(biId, state int) (err error) {
  369. // updateCols := []string{"ApproveId", "State", "ModifyTime"}
  370. updateCols := []string{"State", "ModifyTime"}
  371. BiItem, e := bi_dashboard.GetDashboardById(biId)
  372. if e != nil && !utils.IsErrNoRow(e) {
  373. err = fmt.Errorf("获取Bi看板失败, Err: %s", e.Error())
  374. return
  375. }
  376. if BiItem != nil && BiItem.BiDashboardId > 0 {
  377. // BiItem.ApproveId = approveId
  378. BiItem.State = state
  379. BiItem.ModifyTime = time.Now().Local()
  380. // if state == models.BiStatePass || state == models.BiStateRefused {
  381. // updateCols = append(updateCols, "ApproveTime")
  382. // // BiItem.ApproveTime = time.Now().Local()
  383. // }
  384. // if state == models.BiStatePass {
  385. // updateCols = append(updateCols, "PublishTime")
  386. // // BiItem.PublishTime = time.Now().Local()
  387. // }
  388. if e = BiItem.Update(updateCols); e != nil {
  389. err = fmt.Errorf("更新Bi看板审批状态失败, Err: %s", e.Error())
  390. return
  391. }
  392. }
  393. return
  394. }
  395. func ProcessingBiApprove(adminId, classifyId, timeType, sortField, sortRule, startSize, pageSize int, adminName, startTime, endTime, keyword string) (respList []*response.BiApproveItemOrmResp, respTotal int, msg string, err error) {
  396. cond := fmt.Sprintf(` AND a.%s = ? AND b.%s = ? AND a.%s = ?`, biapprove.BiApproveRecordCols.State, biapprove.BiApproveCols.State, biapprove.BiApproveRecordCols.ApproveUserId)
  397. pars := make([]interface{}, 0)
  398. pars = append(pars, BiApproveStateApproving, BiApproveStateApproving, adminId)
  399. order := ""
  400. // 筛选条件
  401. if classifyId > 0 {
  402. cond += fmt.Sprintf(` AND b.%s = ?`, biapprove.BiApproveCols.ClassifyId)
  403. pars = append(pars, classifyId)
  404. }
  405. if timeType <= 0 {
  406. timeType = 1
  407. }
  408. if timeType == 1 && startTime != "" && endTime != "" {
  409. _, e := time.Parse(utils.FormatDate, startTime)
  410. if e != nil {
  411. msg = "开始时间格式有误"
  412. err = e
  413. return
  414. }
  415. tmpEndTime, e := time.Parse(utils.FormatDate, endTime)
  416. if e != nil {
  417. msg = "结束时间格式有误"
  418. err = e
  419. return
  420. }
  421. tmpEndTime = tmpEndTime.AddDate(0, 0, 1)
  422. cond += fmt.Sprintf(` AND (b.%s BETWEEN ? AND ?)`, biapprove.BiApproveCols.CreateTime)
  423. pars = append(pars, startTime, tmpEndTime)
  424. }
  425. keyword = strings.TrimSpace(keyword)
  426. if keyword != "" {
  427. kw := fmt.Sprint("%", keyword, "%")
  428. cond += fmt.Sprintf(` AND b.%s LIKE ?`, biapprove.BiApproveCols.BiTitle)
  429. pars = append(pars, kw)
  430. }
  431. if sortField > 0 && sortRule > 0 {
  432. orderField := timeField[sortField]
  433. if orderField == "" {
  434. msg = "时间排序字段有误"
  435. return
  436. }
  437. orderRule := orderRules[sortRule]
  438. if orderRule == "" {
  439. msg = "时间排序方式有误"
  440. return
  441. }
  442. order = fmt.Sprintf("%s %s", orderField, orderRule)
  443. }
  444. total, e := biapprove.GetApprovingBiApproveCount(cond, pars)
  445. if e != nil {
  446. msg = "获取失败"
  447. err = fmt.Errorf("GetApprovingBiApproveCount err: %s", e.Error())
  448. return
  449. }
  450. list, e := biapprove.GetApprovingBiApprovePageList(cond, pars, order, startSize, pageSize)
  451. if e != nil {
  452. msg = "获取失败"
  453. err = fmt.Errorf("GetApprovingBiApprovePageList err: %s", e.Error())
  454. return
  455. }
  456. respList = toBiApproveItemOrmResp(list)
  457. respTotal = total
  458. return
  459. }
  460. // SolvedBiApprove 已处理的审批
  461. func SolvedBiApprove(adminId, classifyId, timeType, sortField, sortRule, approveState, startSize, pageSize int, adminName, startTime, endTime, keyword string) (respList []*response.BiApproveItemOrmResp, respTotal int, msg string, err error) {
  462. cond := fmt.Sprintf(` AND a.%s = ? AND a.%s IN (?)`, biapprove.BiApproveRecordCols.ApproveUserId, biapprove.BiApproveRecordCols.NodeState)
  463. pars := make([]interface{}, 0)
  464. pars = append(pars, adminId, []int{BiApproveStatePass, BiApproveStateRefuse})
  465. order := ""
  466. // 筛选条件
  467. if classifyId > 0 {
  468. cond += fmt.Sprintf(` AND b.%s = ?`, biapprove.BiApproveCols.ClassifyId)
  469. pars = append(pars, classifyId)
  470. }
  471. if timeType > 0 && startTime != "" && endTime != "" {
  472. _, e := time.Parse(utils.FormatDate, startTime)
  473. if e != nil {
  474. msg = "开始时间格式有误"
  475. err = e
  476. return
  477. }
  478. tmpEndTime, e := time.Parse(utils.FormatDate, endTime)
  479. if e != nil {
  480. msg = "结束时间格式有误"
  481. err = e
  482. return
  483. }
  484. tmpEndTime = tmpEndTime.AddDate(0, 0, 1)
  485. cond += fmt.Sprintf(` AND (%s BETWEEN ? AND ?)`, timeField[timeType])
  486. pars = append(pars, startTime, tmpEndTime)
  487. }
  488. keyword = strings.TrimSpace(keyword)
  489. if keyword != "" {
  490. kw := fmt.Sprint("%", keyword, "%")
  491. cond += fmt.Sprintf(` AND b.%s LIKE ?`, biapprove.BiApproveCols.BiTitle)
  492. pars = append(pars, kw)
  493. }
  494. if sortField > 0 && sortRule > 0 {
  495. orderField := timeField[sortField]
  496. if orderField == "" {
  497. msg = "时间排序字段有误"
  498. return
  499. }
  500. orderRule := orderRules[sortRule]
  501. if orderRule == "" {
  502. msg = "时间排序方式有误"
  503. return
  504. }
  505. order = fmt.Sprintf("%s %s", orderField, orderRule)
  506. }
  507. if approveState > 0 {
  508. cond += fmt.Sprintf(` AND a.%s = ?`, biapprove.BiApproveRecordCols.NodeState)
  509. pars = append(pars, approveState)
  510. }
  511. total, e := biapprove.GetApprovedBiApproveCount(cond, pars)
  512. if e != nil {
  513. msg = "获取失败"
  514. err = fmt.Errorf("GetApprovedBiApproveCount err: %s", e.Error())
  515. return
  516. }
  517. list, e := biapprove.GetApprovedBiApprovePageList(cond, pars, order, startSize, pageSize)
  518. if e != nil {
  519. msg = "获取失败"
  520. err = fmt.Errorf("GetApprovedBiApprovePageList err: %s", e.Error())
  521. return
  522. }
  523. for _, v := range list {
  524. // 这个时候的状态,用审批状态
  525. v.RecordState = v.NodeState
  526. v.ApproveTime = v.NodeApproveTime
  527. }
  528. respList = toBiApproveItemOrmResp(list)
  529. respTotal = total
  530. return
  531. }
  532. func MyApplyBiApproves(adminId, classifyId, timeType, sortField, sortRule, approveState, startSize, pageSize int, adminName, startTime, endTime, keyword string) (respList []*response.BiApproveItemOrmResp, respTotal int, msg string, err error) {
  533. cond := fmt.Sprintf(` AND a.%s = ?`, biapprove.BiApproveCols.ApplyUserId)
  534. pars := make([]interface{}, 0)
  535. pars = append(pars, adminId)
  536. order := ""
  537. // 筛选条件
  538. if classifyId > 0 {
  539. cond += fmt.Sprintf(` AND a.%s = ?`, biapprove.BiApproveCols.ClassifyId)
  540. pars = append(pars, classifyId)
  541. }
  542. if timeType > 0 && startTime != "" && endTime != "" {
  543. _, e := time.Parse(utils.FormatDate, startTime)
  544. if e != nil {
  545. msg = "开始时间格式有误"
  546. err = e
  547. return
  548. }
  549. tmpEndTime, e := time.Parse(utils.FormatDate, endTime)
  550. if e != nil {
  551. msg = "结束时间格式有误"
  552. err = e
  553. return
  554. }
  555. tmpEndTimeStr := tmpEndTime.AddDate(0, 0, 1).Format(utils.FormatDate)
  556. cond += fmt.Sprintf(` AND (%s BETWEEN ? AND ?)`, myTimeField[timeType])
  557. pars = append(pars, startTime, tmpEndTimeStr)
  558. }
  559. keyword = strings.TrimSpace(keyword)
  560. if keyword != "" {
  561. kw := fmt.Sprint("%", keyword, "%")
  562. cond += fmt.Sprintf(` AND a.%s LIKE ?`, biapprove.BiApproveCols.BiTitle)
  563. pars = append(pars, kw)
  564. }
  565. if sortField > 0 && sortRule > 0 {
  566. orderField := myTimeField[sortField]
  567. if orderField == "" {
  568. msg = "时间排序字段有误"
  569. return
  570. }
  571. orderRule := orderRules[sortRule]
  572. if orderRule == "" {
  573. msg = "时间排序方式有误"
  574. return
  575. }
  576. order = fmt.Sprintf("%s %s", orderField, orderRule)
  577. }
  578. if approveState > 0 {
  579. cond += fmt.Sprintf(` AND a.%s = ?`, biapprove.BiApproveRecordCols.State)
  580. pars = append(pars, approveState)
  581. }
  582. total, e := biapprove.GetApplyBiApproveCount(cond, pars)
  583. if e != nil {
  584. msg = "获取失败"
  585. err = fmt.Errorf("GetApplyBiApproveCount err: %s", e.Error())
  586. return
  587. }
  588. respTotal = total
  589. list, e := biapprove.GetApplyBiApprovePageList(cond, pars, order, startSize, pageSize)
  590. if e != nil {
  591. msg = "获取失败"
  592. err = fmt.Errorf("GetApplyBiApprovePageList err: %s", e.Error())
  593. return
  594. }
  595. respList = toBiApproveItemOrmResp(list)
  596. return
  597. }
  598. func GetApproveDetail(approveId int) (resp *response.BiApproveDetail, msg string, err error) {
  599. approveItem, e := biapprove.GetBiApproveById(approveId)
  600. if e != nil {
  601. if utils.IsErrNoRow(e) {
  602. msg = "审批已被删除, 请刷新页面"
  603. err = e
  604. return
  605. }
  606. msg = "获取失败"
  607. err = fmt.Errorf("GetItemById err: %s", e.Error())
  608. return
  609. }
  610. // 审批信息
  611. detail := new(response.BiApproveDetail)
  612. detail.Approve = new(response.BiApproveDetailItem)
  613. detail.Approve.BiApproveId = approveItem.BiApproveId
  614. detail.Approve.State = approveItem.State
  615. detail.Approve.FlowId = approveItem.FlowId
  616. detail.Approve.FlowVersion = approveItem.FlowVersion
  617. detail.Approve.StartNodeId = approveItem.StartNodeId
  618. detail.Approve.CurrNodeId = approveItem.CurrNodeId
  619. detail.Approve.ApplyUserId = approveItem.ApplyUserId
  620. detail.Approve.ApplyUserName = approveItem.ApplyUserName
  621. detail.Approve.ApproveTime = utils.TimeTransferString(utils.FormatDateTime, approveItem.ApproveTime)
  622. detail.Approve.CreateTime = utils.TimeTransferString(utils.FormatDateTime, approveItem.CreateTime)
  623. detail.Approve.ModifyTime = utils.TimeTransferString(utils.FormatDateTime, approveItem.ModifyTime)
  624. // 审批节点
  625. nodeOb := new(biapprove.BiApproveNode)
  626. nodeCond := fmt.Sprintf(` AND %s = ? AND %s = ?`, biapprove.BiApproveNodeCols.BiApproveFlowId, biapprove.BiApproveNodeCols.CurrVersion)
  627. nodePars := make([]interface{}, 0)
  628. nodePars = append(nodePars, approveItem.FlowId, approveItem.FlowVersion)
  629. nodeItems, e := nodeOb.GetItemsByCondition(nodeCond, nodePars, []string{}, "")
  630. if e != nil {
  631. msg = "获取失败"
  632. err = fmt.Errorf("GetItemsByCondition err: %s", e.Error())
  633. return
  634. }
  635. // 审批记录
  636. recordOb := new(biapprove.BiApproveRecord)
  637. recordCond := fmt.Sprintf(` AND %s = ?`, biapprove.BiApproveRecordCols.BiApproveId)
  638. recordPars := make([]interface{}, 0)
  639. recordPars = append(recordPars, approveItem.BiApproveId)
  640. recordItems, e := recordOb.GetItemsByCondition(recordCond, recordPars, []string{}, fmt.Sprintf("%s DESC", biapprove.BiApproveRecordCols.ApproveTime))
  641. if e != nil {
  642. msg = "获取失败"
  643. err = fmt.Errorf("GetItemsByCondition err: %s", e.Error())
  644. return
  645. }
  646. recordMap := make(map[string]*biapprove.BiApproveRecord)
  647. for _, v := range recordItems {
  648. k := fmt.Sprintf("%d-%d", v.NodeId, v.ApproveUserId)
  649. recordMap[k] = v
  650. }
  651. // 审批流节点详情
  652. detail.ApproveFlowNodes = make([]*response.BiApproveDetailNodes, 0)
  653. for _, v := range nodeItems {
  654. t := new(response.BiApproveDetailNodes)
  655. t.BiApproveNodeId = v.BiApproveNodeId
  656. t.BiApproveFlowId = v.BiApproveFlowId
  657. t.PrevNodeId = v.PrevNodeId
  658. t.NextNodeId = v.NextNodeId
  659. t.NodeType = v.NodeType
  660. t.ApproveType = v.ApproveType
  661. t.Users = make([]*response.BiApproveDetailNodeUser, 0)
  662. us := make([]*response.BiApproveNodeUserReq, 0)
  663. if v.Users != "" {
  664. e = json.Unmarshal([]byte(v.Users), &us)
  665. if e != nil {
  666. msg = "获取失败"
  667. err = fmt.Errorf("json.Unmarshal err: %s", e.Error())
  668. return
  669. }
  670. }
  671. for _, vu := range us {
  672. u := new(response.BiApproveDetailNodeUser)
  673. u.UserType = vu.UserType
  674. u.UserId = vu.UserId
  675. u.UserName = vu.UserName
  676. u.Sort = vu.Sort
  677. // 审批记录
  678. k := fmt.Sprintf("%d-%d", v.BiApproveNodeId, vu.UserId)
  679. r := recordMap[k]
  680. if r != nil {
  681. u.ApproveRecord = new(response.BiApproveDetailNodeUserRecord)
  682. u.ApproveRecord.BiApproveRecordId = r.BiApproveRecordId
  683. u.ApproveRecord.State = r.State
  684. u.ApproveRecord.ApproveUserId = r.ApproveUserId
  685. u.ApproveRecord.ApproveUserName = r.ApproveUserName
  686. u.ApproveRecord.ApproveRemark = r.ApproveRemark
  687. u.ApproveRecord.ApproveTime = utils.TimeTransferString(utils.FormatDateTime, r.ApproveTime)
  688. }
  689. t.Users = append(t.Users, u)
  690. }
  691. sort.Slice(t.Users, func(k, j int) bool {
  692. return t.Users[k].Sort < t.Users[j].Sort
  693. })
  694. detail.ApproveFlowNodes = append(detail.ApproveFlowNodes, t)
  695. }
  696. // 看板信息
  697. cnClassifyIdName := make(map[int]string)
  698. cnClassify, e := bi_dashboard.GetBiDashboardClassifyAllList()
  699. if e != nil {
  700. msg = "获取失败"
  701. err = fmt.Errorf("GetBiDashboardClassifyAllList err: %s", e.Error())
  702. return
  703. }
  704. for _, v := range cnClassify {
  705. cnClassifyIdName[v.BiDashboardClassifyId] = v.BiDashboardClassifyName
  706. }
  707. detail.Bi = new(response.BiApproveDetailBi)
  708. detail.Bi.BiId = approveItem.BiId
  709. detail.Bi.BiTitle = approveItem.BiTitle
  710. detail.Bi.BiClassify = cnClassifyIdName[approveItem.ClassifyId]
  711. resp = detail
  712. return
  713. }
  714. func BiApproveRefuse(biApproveId, adminId int, approveRemark string) (msg string, err error) {
  715. approveItem, e := biapprove.GetBiApproveById(biApproveId)
  716. if e != nil {
  717. if utils.IsErrNoRow(e) {
  718. msg = "审批不存在, 请刷新页面"
  719. err = e
  720. return
  721. }
  722. msg = "操作失败"
  723. err = fmt.Errorf("GetBiApproveById err: %s", e.Error())
  724. return
  725. }
  726. if approveItem.State != BiApproveStateApproving {
  727. msg = "审批状态有误, 请刷新页面"
  728. err = fmt.Errorf("审批状态有误, State: %d", approveItem.State)
  729. return
  730. }
  731. // 校验审批记录和审批
  732. recordOb := new(biapprove.BiApproveRecord)
  733. recordCond := fmt.Sprintf(` AND %s = ? AND %s = ? AND %s = ?`, biapprove.BiApproveRecordCols.BiApproveId, biapprove.BiApproveRecordCols.ApproveUserId, biapprove.BiApproveRecordCols.State)
  734. recordPars := make([]interface{}, 0)
  735. recordPars = append(recordPars, approveItem.BiApproveId, adminId, BiApproveStateApproving)
  736. recordItem, e := recordOb.GetItemByCondition(recordCond, recordPars, "")
  737. if e != nil {
  738. if utils.IsErrNoRow(e) {
  739. msg = "无权审批"
  740. err = e
  741. return
  742. }
  743. msg = "操作失败"
  744. err = fmt.Errorf("GetItemByCondition err: %s", e.Error())
  745. return
  746. }
  747. // 驳回审批
  748. if e = refuseBiApprove(approveItem, recordItem, approveRemark, adminId); e != nil {
  749. msg = "操作失败"
  750. err = fmt.Errorf("RefuseBiApprove err: %s", e.Error())
  751. return
  752. }
  753. return
  754. }
  755. // refuseBiApprove 驳回审批
  756. func refuseBiApprove(approveItem *biapprove.BiApprove, recordItem *biapprove.BiApproveRecord, approveRemark string, sysAdminId int) (err error) {
  757. if approveItem == nil {
  758. err = fmt.Errorf("审批信息有误")
  759. return
  760. }
  761. if recordItem == nil {
  762. err = fmt.Errorf("审批记录有误")
  763. return
  764. }
  765. // 更新审批记录
  766. now := time.Now().Local()
  767. recordItem.State = BiApproveStateRefuse
  768. recordItem.ApproveRemark = approveRemark
  769. recordItem.ApproveTime = now
  770. recordItem.ModifyTime = now
  771. recordItem.NodeState = BiApproveStateRefuse
  772. recordItem.NodeApproveUserId = recordItem.ApproveUserId
  773. recordItem.NodeApproveUserName = recordItem.ApproveUserName
  774. recordItem.NodeApproveTime = now
  775. recordCols := []string{"State", "ApproveRemark", "ApproveTime", "ModifyTime", "NodeState", "NodeApproveUserId", "NodeApproveUserName", "NodeApproveTime"}
  776. if e := recordItem.Update(recordCols); e != nil {
  777. err = fmt.Errorf("更新审批记录状态失败, Err: %s", e.Error())
  778. return
  779. }
  780. // 将该审批的同一个节点的记录标记为已审批
  781. if e := recordItem.UpdateNodeState(recordItem.BiApproveId, recordItem.NodeId, recordItem.NodeState, recordItem.NodeApproveUserId, recordItem.NodeApproveUserName, recordItem.NodeApproveTime); e != nil {
  782. err = fmt.Errorf("更新同一节点的其他审批记录状态失败, Err: %s", e.Error())
  783. return
  784. }
  785. // 驳回-更新审批, 报告状态, 推送消息
  786. approveItem.State = BiApproveStateRefuse
  787. approveItem.ApproveRemark = approveRemark
  788. approveItem.ApproveTime = now
  789. approveItem.ModifyTime = now
  790. approveCols := []string{"State", "ApproveRemark", "ApproveTime", "ModifyTime"}
  791. if e := approveItem.Update(approveCols); e != nil {
  792. err = fmt.Errorf("更新审批状态失败, Err: %s", e.Error())
  793. return
  794. }
  795. if e := updateBiApproveState(approveItem.BiId, BiStateRefused); e != nil {
  796. err = fmt.Errorf("更新报告状态失败, Err: %s", e.Error())
  797. return
  798. }
  799. // 推送驳回消息给申请人
  800. go func() {
  801. messageItem := new(biapprove.BiApproveMessage)
  802. messageItem.SendUserId = sysAdminId
  803. messageItem.ReceiveUserId = approveItem.ApplyUserId
  804. messageItem.Content = "您提交的审批被驳回"
  805. messageItem.Remark = fmt.Sprintf("您提交的【%s】已被驳回", approveItem.BiTitle)
  806. messageItem.BiApproveId = approveItem.BiApproveId
  807. messageItem.ApproveState = BiApproveStateRefuse
  808. messageItem.CreateTime = now
  809. messageItem.ModifyTime = now
  810. if e := messageItem.Create(); e != nil {
  811. utils.FileLog.Info(fmt.Sprintf("ApproveBi message err: %s", e.Error()))
  812. return
  813. }
  814. }()
  815. return
  816. }
  817. func BiApproveCancel(biApproveId, adminId int, adminName string) (msg string, err error) {
  818. approveItem, e := biapprove.GetBiApproveById(biApproveId)
  819. if e != nil {
  820. if utils.IsErrNoRow(e) {
  821. msg = "审批已被删除, 请刷新页面"
  822. err = e
  823. return
  824. }
  825. msg = "操作失败"
  826. err = fmt.Errorf("GetBiApproveById err: %s", e.Error())
  827. return
  828. }
  829. if approveItem.ApplyUserId != adminId {
  830. msg = "非申请人不可撤销"
  831. err = fmt.Errorf("非申请人不可撤销")
  832. return
  833. }
  834. // 撤销审批
  835. e = cancelBiApprove(approveItem.BiId, approveItem.BiApproveId, adminId, adminName)
  836. if e != nil {
  837. msg = "操作失败"
  838. err = fmt.Errorf("cancelBiApprove err: %s", e.Error())
  839. return
  840. }
  841. return
  842. }
  843. // cancelBiApprove 撤回审批
  844. func cancelBiApprove(biId, approveId, sysAdminId int, sysAdminName string) (err error) {
  845. // 默认内部审批, 如果是走的第三方审批, 那么仅修改状态
  846. confMap, e := models.GetBusinessConf()
  847. if e != nil {
  848. err = fmt.Errorf("GetBusinessConf err: %s", e.Error())
  849. return
  850. }
  851. openMap := map[string]bool{"false": false, "true": true}
  852. openApprove := openMap[confMap[models.BusinessConfIsBIApprove]]
  853. if !openApprove {
  854. //err = fmt.Errorf("未开启审批")
  855. return
  856. }
  857. // 修改审批信息状态
  858. approveItem, e := biapprove.GetBiApproveById(approveId)
  859. if e != nil {
  860. if utils.IsErrNoRow(e) {
  861. err = e
  862. return
  863. }
  864. err = fmt.Errorf("approve GetItemById err: %s", e.Error())
  865. return
  866. }
  867. if approveItem.State == BiApproveStateCancel {
  868. return
  869. }
  870. approveItem.State = BiApproveStateCancel
  871. approveItem.ModifyTime = time.Now()
  872. cols := []string{"State", "ModifyTime"}
  873. if e = approveItem.Update(cols); e != nil {
  874. err = fmt.Errorf("approve Update err: %s", e.Error())
  875. return
  876. }
  877. // 修改报告状态
  878. e = updateBiApproveState(biId, BiStateUnpublished)
  879. if e != nil {
  880. err = fmt.Errorf("更新报告审批撤回失败, Err: %s", e.Error())
  881. return
  882. }
  883. // 推送撤回消息
  884. go func() {
  885. recordOb := new(biapprove.BiApproveRecord)
  886. recordCond := fmt.Sprintf(` AND %s = ?`, biapprove.BiApproveRecordCols.BiApproveId)
  887. recordPars := make([]interface{}, 0)
  888. recordPars = append(recordPars, approveId)
  889. recordItems, e := recordOb.GetItemsByCondition(recordCond, recordPars, []string{}, "")
  890. if e != nil {
  891. utils.FileLog.Info(fmt.Sprintf("approve record GetItemsByCondition err: %s", e.Error()))
  892. return
  893. }
  894. messageOb := new(biapprove.BiApproveMessage)
  895. messages := make([]*biapprove.BiApproveMessage, 0)
  896. for _, v := range recordItems {
  897. m := new(biapprove.BiApproveMessage)
  898. m.SendUserId = sysAdminId
  899. m.ReceiveUserId = v.ApproveUserId
  900. m.Content = fmt.Sprintf("%s提交的【%s】已撤回", sysAdminName, approveItem.BiTitle)
  901. m.BiApproveId = approveId
  902. m.ApproveState = BiApproveStateCancel
  903. m.CreateTime = time.Now().Local()
  904. m.ModifyTime = time.Now().Local()
  905. messages = append(messages, m)
  906. }
  907. e = messageOb.CreateMulti(messages)
  908. if e != nil {
  909. utils.FileLog.Info(fmt.Sprintf("CancelBiApprove messages err: %s", e.Error()))
  910. return
  911. }
  912. }()
  913. return
  914. }
  915. // CheckBiOpenApprove 校验报告是否开启了审批流
  916. func CheckBiOpenApprove(classifyId int) (opening bool, err error) {
  917. // 获取审批配置
  918. confMap, e := models.GetBusinessConf()
  919. if e != nil {
  920. err = fmt.Errorf("GetBusinessConf err: %s", e.Error())
  921. return
  922. }
  923. openMap := map[string]bool{"false": false, "true": true}
  924. openApprove := openMap[confMap[models.BusinessConfIsBIApprove]]
  925. // 查询对应分类是否有审批流
  926. flowOb := new(biapprove.BiApproveFlow)
  927. flowCond := fmt.Sprintf(` AND %s = ?`, biapprove.BiApproveFlowCols.ClassifyId)
  928. flowPars := make([]interface{}, 0)
  929. flowPars = append(flowPars, classifyId)
  930. flowItem, e := flowOb.GetItemByCondition(flowCond, flowPars, "")
  931. if e != nil {
  932. err = fmt.Errorf("ApproveFlow GetItemByCondition err: %s", e.Error())
  933. return
  934. }
  935. // 开启审批/有审批流
  936. if openApprove && (flowItem != nil) {
  937. opening = true
  938. return
  939. }
  940. return
  941. }
  942. // SubmitBiApprove 提交审批
  943. func SubmitBiApprove(biId int, biTitle string, classifyId int, sysAdminId int, sysAdminName string) (approveId int, err error) {
  944. // 默认内部审批, 如果是走的第三方审批, 那么仅修改状态
  945. confMap, e := models.GetBusinessConf()
  946. if e != nil {
  947. err = fmt.Errorf("GetBusinessConf err: %s", e.Error())
  948. return
  949. }
  950. openMap := map[string]bool{"false": false, "true": true}
  951. openApprove := openMap[confMap[models.BusinessConfIsBIApprove]]
  952. if !openApprove {
  953. err = fmt.Errorf("未开启审批")
  954. return
  955. }
  956. // 查询审批流
  957. flowOb := new(biapprove.BiApproveFlow)
  958. flowCond := fmt.Sprintf(` AND %s = ?`, biapprove.BiApproveFlowCols.ClassifyId)
  959. flowPars := make([]interface{}, 0)
  960. flowPars = append(flowPars, classifyId)
  961. flowItem, e := flowOb.GetItemByCondition(flowCond, flowPars, "")
  962. if e != nil {
  963. err = fmt.Errorf("ApproveFlow GetItemByCondition err: %s", e.Error())
  964. return
  965. }
  966. // 查询审批节点
  967. nodeOb := new(biapprove.BiApproveNode)
  968. nodeCond := fmt.Sprintf(` AND %s = ? AND %s = ?`, biapprove.BiApproveNodeCols.BiApproveFlowId, biapprove.BiApproveNodeCols.CurrVersion)
  969. nodePars := make([]interface{}, 0)
  970. nodePars = append(nodePars, flowItem.BiApproveFlowId, flowItem.CurrVersion)
  971. nodeItems, e := nodeOb.GetItemsByCondition(nodeCond, nodePars, []string{}, "")
  972. if e != nil {
  973. err = fmt.Errorf("ApproveNodes GetItemsByCondition err: %s", e.Error())
  974. return
  975. }
  976. if len(nodeItems) == 0 {
  977. err = fmt.Errorf("无审批节点")
  978. return
  979. }
  980. // 取出首个节点
  981. firstNodeItem := new(biapprove.BiApproveNode)
  982. for _, v := range nodeItems {
  983. if v.PrevNodeId == 0 {
  984. firstNodeItem = v
  985. continue
  986. }
  987. }
  988. if firstNodeItem == nil {
  989. err = fmt.Errorf("首个审批节点有误")
  990. return
  991. }
  992. // 审批信息
  993. now := time.Now().Local()
  994. newApprove := new(biapprove.BiApprove)
  995. newApprove.BiId = biId
  996. newApprove.BiTitle = biTitle
  997. newApprove.ClassifyId = classifyId
  998. newApprove.State = BiApproveStateApproving
  999. newApprove.FlowId = flowItem.BiApproveFlowId
  1000. newApprove.FlowVersion = flowItem.CurrVersion
  1001. newApprove.StartNodeId = firstNodeItem.BiApproveNodeId
  1002. newApprove.CurrNodeId = firstNodeItem.BiApproveNodeId
  1003. newApprove.ApplyUserId = sysAdminId
  1004. newApprove.ApplyUserName = sysAdminName
  1005. newApprove.CreateTime = now
  1006. newApprove.ModifyTime = now
  1007. if e = newApprove.Create(); e != nil {
  1008. err = fmt.Errorf("生成审批信息失败, Err: %s", e.Error())
  1009. return
  1010. }
  1011. approveId = newApprove.BiApproveId
  1012. // 生成节点审批记录
  1013. err = BuildNextNodeRecordAndMsg(firstNodeItem, newApprove.BiApproveId, sysAdminId, sysAdminName, newApprove.BiTitle)
  1014. return
  1015. }
  1016. func toBiApproveItemOrmResp(src []*biapprove.BiApproveItemOrm) (res []*response.BiApproveItemOrmResp) {
  1017. for _, v := range src {
  1018. r := new(response.BiApproveItemOrmResp)
  1019. r.BiApproveId = v.BiApproveId
  1020. r.BiApproveRecordId = v.BiApproveRecordId
  1021. r.BiId = v.BiId
  1022. r.BiTitle = v.BiTitle
  1023. r.ClassifyId = v.ClassifyId
  1024. r.State = v.State
  1025. r.RecordState = v.RecordState
  1026. r.FlowId = v.FlowId
  1027. r.FlowVersion = v.FlowVersion
  1028. r.StartNodeId = v.StartNodeId
  1029. r.CurrNodeId = v.CurrNodeId
  1030. r.ApplyUserId = v.ApplyUserId
  1031. r.ApplyUserName = v.ApplyUserName
  1032. r.ApproveRemark = v.ApproveRemark
  1033. r.ApproveTime = utils.TimeTransferString(utils.FormatDateTime, v.ApproveTime)
  1034. r.HandleTime = utils.TimeTransferString(utils.FormatDateTime, v.HandleTime)
  1035. r.CreateTime = utils.TimeTransferString(utils.FormatDateTime, v.CreateTime)
  1036. r.ModifyTime = utils.TimeTransferString(utils.FormatDateTime, v.ModifyTime)
  1037. r.NodeState = v.NodeState
  1038. res = append(res, r)
  1039. }
  1040. return
  1041. }
  1042. func GetBiClassifyAll() (list []*bi_dashboard.BiDashboardClassify, msg string, err error) {
  1043. ClassifyList, e := bi_dashboard.GetBiDashboardClassifyAllList()
  1044. if e != nil {
  1045. msg = "获取失败"
  1046. err = fmt.Errorf("GetBiDashboardClassifyAllList err: %s", e.Error())
  1047. return
  1048. }
  1049. list = ClassifyList
  1050. return
  1051. }
  1052. func CheckHasApprovingBi() (ok bool, err error) {
  1053. count, err := biapprove.GetBiApproveCountByState(BiApproveStateApproving)
  1054. if err != nil {
  1055. return
  1056. }
  1057. if count > 0 {
  1058. ok = true
  1059. }
  1060. return
  1061. }