bi_approve.go 38 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180
  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.BiApproveCols.CreateTime), 2: fmt.Sprintf("a.%s", biapprove.BiApproveCols.ApproveTime), 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)
  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)
  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)
  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, approveItem.BiApproveId, 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 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提交的【看板审批】需要您审批,请及时处理", sysAdminName)
  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, approveId, 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("获取智能看板失败, 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.State)
  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. tmpEndTime = tmpEndTime.AddDate(0, 0, 1)
  556. cond += fmt.Sprintf(` AND (%s BETWEEN ? AND ?)`, timeField[timeType])
  557. pars = append(pars, startTime, tmpEndTime)
  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. return
  712. }
  713. func BiApproveRefuse(biApproveId, adminId int, approveRemark string) (msg string, err error) {
  714. approveItem, e := biapprove.GetBiApproveById(biApproveId)
  715. if e != nil {
  716. if utils.IsErrNoRow(e) {
  717. msg = "审批不存在, 请刷新页面"
  718. err = e
  719. return
  720. }
  721. msg = "操作失败"
  722. err = fmt.Errorf("GetBiApproveById err: %s", e.Error())
  723. return
  724. }
  725. if approveItem.State != BiApproveStateApproving {
  726. msg = "审批状态有误, 请刷新页面"
  727. err = fmt.Errorf("审批状态有误, State: %d", approveItem.State)
  728. return
  729. }
  730. // 校验审批记录和审批
  731. recordOb := new(biapprove.BiApproveRecord)
  732. recordCond := fmt.Sprintf(` AND %s = ? AND %s = ? AND %s = ?`, biapprove.BiApproveRecordCols.BiApproveId, biapprove.BiApproveRecordCols.ApproveUserId, biapprove.BiApproveRecordCols.State)
  733. recordPars := make([]interface{}, 0)
  734. recordPars = append(recordPars, approveItem.BiApproveId, adminId, BiApproveStateApproving)
  735. recordItem, e := recordOb.GetItemByCondition(recordCond, recordPars, "")
  736. if e != nil {
  737. if utils.IsErrNoRow(e) {
  738. msg = "无权审批"
  739. err = e
  740. return
  741. }
  742. msg = "操作失败"
  743. err = fmt.Errorf("GetItemByCondition err: %s", e.Error())
  744. return
  745. }
  746. // 驳回审批
  747. if e = RefuseBiApprove(approveItem, recordItem, approveRemark, adminId); e != nil {
  748. msg = "操作失败"
  749. err = fmt.Errorf("RefuseBiApprove err: %s", e.Error())
  750. return
  751. }
  752. return
  753. }
  754. // RefuseBiApprove 驳回审批
  755. func RefuseBiApprove(approveItem *biapprove.BiApprove, recordItem *biapprove.BiApproveRecord, approveRemark string, sysAdminId int) (err error) {
  756. if approveItem == nil {
  757. err = fmt.Errorf("审批信息有误")
  758. return
  759. }
  760. if recordItem == nil {
  761. err = fmt.Errorf("审批记录有误")
  762. return
  763. }
  764. // 更新审批记录
  765. now := time.Now().Local()
  766. recordItem.State = BiApproveStateRefuse
  767. recordItem.ApproveRemark = approveRemark
  768. recordItem.ApproveTime = now
  769. recordItem.ModifyTime = now
  770. recordItem.NodeState = BiApproveStateRefuse
  771. recordItem.NodeApproveUserId = recordItem.ApproveUserId
  772. recordItem.NodeApproveUserName = recordItem.ApproveUserName
  773. recordItem.NodeApproveTime = now
  774. recordCols := []string{"State", "ApproveRemark", "ApproveTime", "ModifyTime", "NodeState", "NodeApproveUserId", "NodeApproveUserName", "NodeApproveTime"}
  775. if e := recordItem.Update(recordCols); e != nil {
  776. err = fmt.Errorf("更新审批记录状态失败, Err: %s", e.Error())
  777. return
  778. }
  779. // 将该审批的同一个节点的记录标记为已审批
  780. if e := recordItem.UpdateNodeState(recordItem.BiApproveId, recordItem.NodeId, recordItem.NodeState, recordItem.NodeApproveUserId, recordItem.NodeApproveUserName, recordItem.NodeApproveTime); e != nil {
  781. err = fmt.Errorf("更新同一节点的其他审批记录状态失败, Err: %s", e.Error())
  782. return
  783. }
  784. // 驳回-更新审批, 报告状态, 推送消息
  785. approveItem.State = BiApproveStateRefuse
  786. approveItem.ApproveRemark = approveRemark
  787. approveItem.ApproveTime = now
  788. approveItem.ModifyTime = now
  789. approveCols := []string{"State", "ApproveRemark", "ApproveTime", "ModifyTime"}
  790. if e := approveItem.Update(approveCols); e != nil {
  791. err = fmt.Errorf("更新审批状态失败, Err: %s", e.Error())
  792. return
  793. }
  794. if e := updateBiApproveState(approveItem.BiId, approveItem.BiApproveId, BiStateRefused); e != nil {
  795. err = fmt.Errorf("更新报告状态失败, Err: %s", e.Error())
  796. return
  797. }
  798. // 推送驳回消息给申请人
  799. go func() {
  800. messageItem := new(biapprove.BiApproveMessage)
  801. messageItem.SendUserId = sysAdminId
  802. messageItem.ReceiveUserId = approveItem.ApplyUserId
  803. messageItem.Content = "您提交的审批被驳回"
  804. messageItem.Remark = "您提交的【看板审批】已被驳回"
  805. messageItem.BiApproveId = approveItem.BiApproveId
  806. messageItem.ApproveState = BiApproveStateRefuse
  807. messageItem.CreateTime = now
  808. messageItem.ModifyTime = now
  809. if e := messageItem.Create(); e != nil {
  810. utils.FileLog.Info(fmt.Sprintf("ApproveBi message err: %s", e.Error()))
  811. return
  812. }
  813. }()
  814. return
  815. }
  816. func BiApproveCancel(biApproveId, adminId int, adminName string) (msg string, err error) {
  817. approveItem, e := biapprove.GetBiApproveById(biApproveId)
  818. if e != nil {
  819. if utils.IsErrNoRow(e) {
  820. msg = "审批已被删除, 请刷新页面"
  821. err = e
  822. return
  823. }
  824. msg = "操作失败"
  825. err = fmt.Errorf("GetBiApproveById err: %s", e.Error())
  826. return
  827. }
  828. if approveItem.ApplyUserId != adminId {
  829. msg = "非申请人不可撤销"
  830. err = fmt.Errorf("非申请人不可撤销")
  831. return
  832. }
  833. // 撤销审批
  834. e = cancelBiApprove(approveItem.BiId, approveItem.BiApproveId, adminId, adminName)
  835. if e != nil {
  836. msg = "操作失败"
  837. err = fmt.Errorf("cancelBiApprove err: %s", e.Error())
  838. return
  839. }
  840. return
  841. }
  842. // cancelBiApprove 撤回审批
  843. func cancelBiApprove(biId, approveId, sysAdminId int, sysAdminName string) (err error) {
  844. // 默认内部审批, 如果是走的第三方审批, 那么仅修改状态
  845. confMap, e := models.GetBusinessConf()
  846. if e != nil {
  847. err = fmt.Errorf("GetBusinessConf err: %s", e.Error())
  848. return
  849. }
  850. openMap := map[string]bool{"false": false, "true": true}
  851. openApprove := openMap[confMap[models.BusinessConfIsBIApprove]]
  852. if !openApprove {
  853. //err = fmt.Errorf("未开启审批")
  854. return
  855. }
  856. // 修改审批信息状态
  857. approveItem, e := biapprove.GetBiApproveById(approveId)
  858. if e != nil {
  859. if utils.IsErrNoRow(e) {
  860. err = e
  861. return
  862. }
  863. err = fmt.Errorf("approve GetItemById err: %s", e.Error())
  864. return
  865. }
  866. if approveItem.State == BiApproveStateCancel {
  867. return
  868. }
  869. approveItem.State = BiApproveStateCancel
  870. approveItem.ModifyTime = time.Now()
  871. cols := []string{"State", "ModifyTime"}
  872. if e = approveItem.Update(cols); e != nil {
  873. err = fmt.Errorf("approve Update err: %s", e.Error())
  874. return
  875. }
  876. // 修改报告状态
  877. e = updateBiApproveState(biId, 0, BiStateWaitSubmit)
  878. if e != nil {
  879. err = fmt.Errorf("更新报告审批撤回失败, Err: %s", e.Error())
  880. return
  881. }
  882. // 推送撤回消息
  883. go func() {
  884. recordOb := new(biapprove.BiApproveRecord)
  885. recordCond := fmt.Sprintf(` AND %s = ?`, biapprove.BiApproveRecordCols.BiApproveId)
  886. recordPars := make([]interface{}, 0)
  887. recordPars = append(recordPars, approveId)
  888. recordItems, e := recordOb.GetItemsByCondition(recordCond, recordPars, []string{}, "")
  889. if e != nil {
  890. utils.FileLog.Info(fmt.Sprintf("approve record GetItemsByCondition err: %s", e.Error()))
  891. return
  892. }
  893. messageOb := new(biapprove.BiApproveMessage)
  894. messages := make([]*biapprove.BiApproveMessage, 0)
  895. for _, v := range recordItems {
  896. m := new(biapprove.BiApproveMessage)
  897. m.SendUserId = sysAdminId
  898. m.ReceiveUserId = v.ApproveUserId
  899. m.Content = fmt.Sprintf("%s提交的【看板审批】已撤回", sysAdminName)
  900. m.BiApproveId = approveId
  901. m.ApproveState = BiApproveStateCancel
  902. m.CreateTime = time.Now().Local()
  903. m.ModifyTime = time.Now().Local()
  904. messages = append(messages, m)
  905. }
  906. e = messageOb.CreateMulti(messages)
  907. if e != nil {
  908. utils.FileLog.Info(fmt.Sprintf("CancelBiApprove messages err: %s", e.Error()))
  909. return
  910. }
  911. }()
  912. return
  913. }
  914. // CheckBiOpenApprove 校验报告是否开启了审批流
  915. func CheckBiOpenApprove(classifyId int) (opening bool, err error) {
  916. // 获取审批配置
  917. confMap, e := models.GetBusinessConf()
  918. if e != nil {
  919. err = fmt.Errorf("GetBusinessConf err: %s", e.Error())
  920. return
  921. }
  922. openMap := map[string]bool{"false": false, "true": true}
  923. openApprove := openMap[confMap[models.BusinessConfIsBIApprove]]
  924. // 查询对应分类是否有审批流
  925. flowOb := new(biapprove.BiApproveFlow)
  926. flowCond := fmt.Sprintf(` AND %s = ?`, biapprove.BiApproveFlowCols.ClassifyId)
  927. flowPars := make([]interface{}, 0)
  928. flowPars = append(flowPars, classifyId)
  929. flowItem, e := flowOb.GetItemByCondition(flowCond, flowPars, "")
  930. if e != nil && !utils.IsErrNoRow(e) {
  931. err = fmt.Errorf("ApproveFlow GetItemByCondition err: %s", e.Error())
  932. return
  933. }
  934. if utils.IsErrNoRow(e) {
  935. return
  936. }
  937. // 开启审批/有审批流
  938. if openApprove && (flowItem != nil) {
  939. opening = true
  940. return
  941. }
  942. return
  943. }
  944. // CheckBiCurrState 校验报告当前应有的状态
  945. func CheckBiCurrState(classifyId, operate int) (state int, err error) {
  946. // 获取审批配置
  947. confMap, e := models.GetBusinessConf()
  948. if e != nil {
  949. err = fmt.Errorf("GetBusinessConf err: %s", e.Error())
  950. return
  951. }
  952. openMap := map[string]bool{"false": false, "true": true}
  953. openApprove := openMap[confMap[models.BusinessConfIsBIApprove]]
  954. // 查询对应分类是否有审批流
  955. flowOb := new(biapprove.BiApproveFlow)
  956. flowCond := fmt.Sprintf(` AND %s = ?`, biapprove.BiApproveFlowCols.ClassifyId)
  957. flowPars := make([]interface{}, 0)
  958. flowPars = append(flowPars, classifyId)
  959. flowItem, e := flowOb.GetItemByCondition(flowCond, flowPars, "")
  960. if e != nil && !utils.IsErrNoRow(e) {
  961. err = fmt.Errorf("ApproveFlow GetItemByCondition err: %s", e.Error())
  962. return
  963. }
  964. // 开启审批/有审批流
  965. if openApprove && (flowItem != nil) {
  966. // 操作为无审批的操作时, 会转为有审批的初始状态-待提交
  967. stateMap := map[int]int{
  968. BiOperateAdd: BiStateWaitSubmit, // 新增
  969. BiOperateEdit: BiStateWaitSubmit, // 编辑
  970. BiOperatePublish: BiStateWaitSubmit, // 发布
  971. BiOperateCancelPublish: BiStateWaitSubmit, // 取消发布
  972. BiOperateSubmitApprove: BiStateWaitApprove, // 提审
  973. BiOperateCancelApprove: BiStateWaitSubmit, // 撤回
  974. }
  975. state = stateMap[operate]
  976. return
  977. }
  978. // 关闭审批/分类无审批
  979. // 操作为有审批的操作时, 会转为无审批的初始状态-未发布
  980. stateMap := map[int]int{
  981. BiOperateAdd: BiStateUnpublished, // 新增
  982. BiOperateEdit: BiStateUnpublished, // 编辑
  983. BiOperatePublish: BiStatePublished, // 发布
  984. BiOperateCancelPublish: BiStateUnpublished, // 取消发布
  985. BiOperateSubmitApprove: BiStateUnpublished, // 提审
  986. BiOperateCancelApprove: BiStateUnpublished, // 撤回
  987. }
  988. state = stateMap[operate]
  989. return
  990. }
  991. // SubmitBiApprove 提交审批
  992. func SubmitBiApprove(biId int, reportTitle string, classifyId int, sysAdminId int, sysAdminName string) (approveId int, err error) {
  993. // 默认内部审批, 如果是走的第三方审批, 那么仅修改状态
  994. confMap, e := models.GetBusinessConf()
  995. if e != nil {
  996. err = fmt.Errorf("GetBusinessConf err: %s", e.Error())
  997. return
  998. }
  999. openMap := map[string]bool{"false": false, "true": true}
  1000. openApprove := openMap[confMap[models.BusinessConfIsBIApprove]]
  1001. if !openApprove {
  1002. err = fmt.Errorf("未开启审批")
  1003. return
  1004. }
  1005. // 查询审批流
  1006. flowOb := new(biapprove.BiApproveFlow)
  1007. flowCond := fmt.Sprintf(` AND %s = ?`, biapprove.BiApproveFlowCols.ClassifyId)
  1008. flowPars := make([]interface{}, 0)
  1009. flowPars = append(flowPars, classifyId)
  1010. flowItem, e := flowOb.GetItemByCondition(flowCond, flowPars, "")
  1011. if e != nil {
  1012. err = fmt.Errorf("ApproveFlow GetItemByCondition err: %s", e.Error())
  1013. return
  1014. }
  1015. // 查询审批节点
  1016. nodeOb := new(biapprove.BiApproveNode)
  1017. nodeCond := fmt.Sprintf(` AND %s = ? AND %s = ?`, biapprove.BiApproveNodeCols.BiApproveFlowId, biapprove.BiApproveNodeCols.CurrVersion)
  1018. nodePars := make([]interface{}, 0)
  1019. nodePars = append(nodePars, flowItem.BiApproveFlowId, flowItem.CurrVersion)
  1020. nodeItems, e := nodeOb.GetItemsByCondition(nodeCond, nodePars, []string{}, "")
  1021. if e != nil {
  1022. err = fmt.Errorf("ApproveNodes GetItemsByCondition err: %s", e.Error())
  1023. return
  1024. }
  1025. if len(nodeItems) == 0 {
  1026. err = fmt.Errorf("无审批节点")
  1027. return
  1028. }
  1029. // 取出首个节点
  1030. firstNodeItem := new(biapprove.BiApproveNode)
  1031. for _, v := range nodeItems {
  1032. if v.PrevNodeId == 0 {
  1033. firstNodeItem = v
  1034. continue
  1035. }
  1036. }
  1037. if firstNodeItem == nil {
  1038. err = fmt.Errorf("首个审批节点有误")
  1039. return
  1040. }
  1041. // 审批信息
  1042. now := time.Now().Local()
  1043. newApprove := new(biapprove.BiApprove)
  1044. newApprove.BiId = biId
  1045. newApprove.BiTitle = reportTitle
  1046. newApprove.ClassifyId = classifyId
  1047. newApprove.State = BiApproveStateApproving
  1048. newApprove.FlowId = flowItem.BiApproveFlowId
  1049. newApprove.FlowVersion = flowItem.CurrVersion
  1050. newApprove.StartNodeId = firstNodeItem.BiApproveNodeId
  1051. newApprove.CurrNodeId = firstNodeItem.BiApproveNodeId
  1052. newApprove.ApplyUserId = sysAdminId
  1053. newApprove.ApplyUserName = sysAdminName
  1054. newApprove.CreateTime = now
  1055. newApprove.ModifyTime = now
  1056. if e = newApprove.Create(); e != nil {
  1057. err = fmt.Errorf("生成审批信息失败, Err: %s", e.Error())
  1058. return
  1059. }
  1060. approveId = newApprove.BiApproveId
  1061. // 生成节点审批记录
  1062. err = BuildNextNodeRecordAndMsg(firstNodeItem, newApprove.BiApproveId, sysAdminId, sysAdminName)
  1063. return
  1064. }
  1065. func toBiApproveItemOrmResp(src []*biapprove.BiApproveItemOrm) (res []*response.BiApproveItemOrmResp) {
  1066. for _, v := range src {
  1067. r := new(response.BiApproveItemOrmResp)
  1068. r.BiApproveId = v.BiApproveId
  1069. r.BiApproveRecordId = v.BiApproveRecordId
  1070. r.BiId = v.BiId
  1071. r.BiTitle = v.BiTitle
  1072. r.ClassifyId = v.ClassifyId
  1073. r.State = v.State
  1074. r.RecordState = v.RecordState
  1075. r.FlowId = v.FlowId
  1076. r.FlowVersion = v.FlowVersion
  1077. r.StartNodeId = v.StartNodeId
  1078. r.CurrNodeId = v.CurrNodeId
  1079. r.ApplyUserId = v.ApplyUserId
  1080. r.ApplyUserName = v.ApplyUserName
  1081. r.ApproveRemark = v.ApproveRemark
  1082. r.ApproveTime = v.ApproveTime.Format(utils.FormatDateTime)
  1083. r.HandleTime = v.HandleTime.Format(utils.FormatDateTime)
  1084. r.CreateTime = v.CreateTime.Format(utils.FormatDateTime)
  1085. r.ModifyTime = v.ModifyTime.Format(utils.FormatDateTime)
  1086. r.NodeState = v.NodeState
  1087. res = append(res, r)
  1088. }
  1089. return
  1090. }
  1091. func GetBiClassifyAll() (list []*bi_dashboard.BiDashboardClassify, msg string, err error) {
  1092. ClassifyList, e := bi_dashboard.GetBiDashboardClassifyAllList()
  1093. if e != nil {
  1094. msg = "获取失败"
  1095. err = fmt.Errorf("GetBiDashboardClassifyAllList err: %s", e.Error())
  1096. return
  1097. }
  1098. list = ClassifyList
  1099. return
  1100. }