bi_approve.go 38 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181
  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. 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, approveItem.BiApproveId, 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 = "您提交的【看板审批】已被驳回"
  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, 0, BiStateWaitSubmit)
  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提交的【看板审批】已撤回", sysAdminName)
  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 && !utils.IsErrNoRow(e) {
  932. err = fmt.Errorf("ApproveFlow GetItemByCondition err: %s", e.Error())
  933. return
  934. }
  935. if utils.IsErrNoRow(e) {
  936. return
  937. }
  938. // 开启审批/有审批流
  939. if openApprove && (flowItem != nil) {
  940. opening = true
  941. return
  942. }
  943. return
  944. }
  945. // CheckBiCurrState 校验报告当前应有的状态
  946. func CheckBiCurrState(classifyId, operate int) (state int, err error) {
  947. // 获取审批配置
  948. confMap, e := models.GetBusinessConf()
  949. if e != nil {
  950. err = fmt.Errorf("GetBusinessConf err: %s", e.Error())
  951. return
  952. }
  953. openMap := map[string]bool{"false": false, "true": true}
  954. openApprove := openMap[confMap[models.BusinessConfIsBIApprove]]
  955. // 查询对应分类是否有审批流
  956. flowOb := new(biapprove.BiApproveFlow)
  957. flowCond := fmt.Sprintf(` AND %s = ?`, biapprove.BiApproveFlowCols.ClassifyId)
  958. flowPars := make([]interface{}, 0)
  959. flowPars = append(flowPars, classifyId)
  960. flowItem, e := flowOb.GetItemByCondition(flowCond, flowPars, "")
  961. if e != nil && !utils.IsErrNoRow(e) {
  962. err = fmt.Errorf("ApproveFlow GetItemByCondition err: %s", e.Error())
  963. return
  964. }
  965. // 开启审批/有审批流
  966. if openApprove && (flowItem != nil) {
  967. // 操作为无审批的操作时, 会转为有审批的初始状态-待提交
  968. stateMap := map[int]int{
  969. BiOperateAdd: BiStateWaitSubmit, // 新增
  970. BiOperateEdit: BiStateWaitSubmit, // 编辑
  971. BiOperatePublish: BiStateWaitSubmit, // 发布
  972. BiOperateCancelPublish: BiStateWaitSubmit, // 取消发布
  973. BiOperateSubmitApprove: BiStateWaitApprove, // 提审
  974. BiOperateCancelApprove: BiStateWaitSubmit, // 撤回
  975. }
  976. state = stateMap[operate]
  977. return
  978. }
  979. // 关闭审批/分类无审批
  980. // 操作为有审批的操作时, 会转为无审批的初始状态-未发布
  981. stateMap := map[int]int{
  982. BiOperateAdd: BiStateUnpublished, // 新增
  983. BiOperateEdit: BiStateUnpublished, // 编辑
  984. BiOperatePublish: BiStatePublished, // 发布
  985. BiOperateCancelPublish: BiStateUnpublished, // 取消发布
  986. BiOperateSubmitApprove: BiStateUnpublished, // 提审
  987. BiOperateCancelApprove: BiStateUnpublished, // 撤回
  988. }
  989. state = stateMap[operate]
  990. return
  991. }
  992. // SubmitBiApprove 提交审批
  993. func SubmitBiApprove(biId int, biTitle string, classifyId int, sysAdminId int, sysAdminName string) (approveId int, err error) {
  994. // 默认内部审批, 如果是走的第三方审批, 那么仅修改状态
  995. confMap, e := models.GetBusinessConf()
  996. if e != nil {
  997. err = fmt.Errorf("GetBusinessConf err: %s", e.Error())
  998. return
  999. }
  1000. openMap := map[string]bool{"false": false, "true": true}
  1001. openApprove := openMap[confMap[models.BusinessConfIsBIApprove]]
  1002. if !openApprove {
  1003. err = fmt.Errorf("未开启审批")
  1004. return
  1005. }
  1006. // 查询审批流
  1007. flowOb := new(biapprove.BiApproveFlow)
  1008. flowCond := fmt.Sprintf(` AND %s = ?`, biapprove.BiApproveFlowCols.ClassifyId)
  1009. flowPars := make([]interface{}, 0)
  1010. flowPars = append(flowPars, classifyId)
  1011. flowItem, e := flowOb.GetItemByCondition(flowCond, flowPars, "")
  1012. if e != nil {
  1013. err = fmt.Errorf("ApproveFlow GetItemByCondition err: %s", e.Error())
  1014. return
  1015. }
  1016. // 查询审批节点
  1017. nodeOb := new(biapprove.BiApproveNode)
  1018. nodeCond := fmt.Sprintf(` AND %s = ? AND %s = ?`, biapprove.BiApproveNodeCols.BiApproveFlowId, biapprove.BiApproveNodeCols.CurrVersion)
  1019. nodePars := make([]interface{}, 0)
  1020. nodePars = append(nodePars, flowItem.BiApproveFlowId, flowItem.CurrVersion)
  1021. nodeItems, e := nodeOb.GetItemsByCondition(nodeCond, nodePars, []string{}, "")
  1022. if e != nil {
  1023. err = fmt.Errorf("ApproveNodes GetItemsByCondition err: %s", e.Error())
  1024. return
  1025. }
  1026. if len(nodeItems) == 0 {
  1027. err = fmt.Errorf("无审批节点")
  1028. return
  1029. }
  1030. // 取出首个节点
  1031. firstNodeItem := new(biapprove.BiApproveNode)
  1032. for _, v := range nodeItems {
  1033. if v.PrevNodeId == 0 {
  1034. firstNodeItem = v
  1035. continue
  1036. }
  1037. }
  1038. if firstNodeItem == nil {
  1039. err = fmt.Errorf("首个审批节点有误")
  1040. return
  1041. }
  1042. // 审批信息
  1043. now := time.Now().Local()
  1044. newApprove := new(biapprove.BiApprove)
  1045. newApprove.BiId = biId
  1046. newApprove.BiTitle = biTitle
  1047. newApprove.ClassifyId = classifyId
  1048. newApprove.State = BiApproveStateApproving
  1049. newApprove.FlowId = flowItem.BiApproveFlowId
  1050. newApprove.FlowVersion = flowItem.CurrVersion
  1051. newApprove.StartNodeId = firstNodeItem.BiApproveNodeId
  1052. newApprove.CurrNodeId = firstNodeItem.BiApproveNodeId
  1053. newApprove.ApplyUserId = sysAdminId
  1054. newApprove.ApplyUserName = sysAdminName
  1055. newApprove.CreateTime = now
  1056. newApprove.ModifyTime = now
  1057. if e = newApprove.Create(); e != nil {
  1058. err = fmt.Errorf("生成审批信息失败, Err: %s", e.Error())
  1059. return
  1060. }
  1061. approveId = newApprove.BiApproveId
  1062. // 生成节点审批记录
  1063. err = BuildNextNodeRecordAndMsg(firstNodeItem, newApprove.BiApproveId, sysAdminId, sysAdminName)
  1064. return
  1065. }
  1066. func toBiApproveItemOrmResp(src []*biapprove.BiApproveItemOrm) (res []*response.BiApproveItemOrmResp) {
  1067. for _, v := range src {
  1068. r := new(response.BiApproveItemOrmResp)
  1069. r.BiApproveId = v.BiApproveId
  1070. r.BiApproveRecordId = v.BiApproveRecordId
  1071. r.BiId = v.BiId
  1072. r.BiTitle = v.BiTitle
  1073. r.ClassifyId = v.ClassifyId
  1074. r.State = v.State
  1075. r.RecordState = v.RecordState
  1076. r.FlowId = v.FlowId
  1077. r.FlowVersion = v.FlowVersion
  1078. r.StartNodeId = v.StartNodeId
  1079. r.CurrNodeId = v.CurrNodeId
  1080. r.ApplyUserId = v.ApplyUserId
  1081. r.ApplyUserName = v.ApplyUserName
  1082. r.ApproveRemark = v.ApproveRemark
  1083. r.ApproveTime = v.ApproveTime.Format(utils.FormatDateTime)
  1084. r.HandleTime = v.HandleTime.Format(utils.FormatDateTime)
  1085. r.CreateTime = v.CreateTime.Format(utils.FormatDateTime)
  1086. r.ModifyTime = v.ModifyTime.Format(utils.FormatDateTime)
  1087. r.NodeState = v.NodeState
  1088. res = append(res, r)
  1089. }
  1090. return
  1091. }
  1092. func GetBiClassifyAll() (list []*bi_dashboard.BiDashboardClassify, msg string, err error) {
  1093. ClassifyList, e := bi_dashboard.GetBiDashboardClassifyAllList()
  1094. if e != nil {
  1095. msg = "获取失败"
  1096. err = fmt.Errorf("GetBiDashboardClassifyAllList err: %s", e.Error())
  1097. return
  1098. }
  1099. list = ClassifyList
  1100. return
  1101. }