report_approve.go 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334
  1. package services
  2. import (
  3. "eta/eta_api/models"
  4. "eta/eta_api/models/report_approve"
  5. "eta/eta_api/models/smart_report"
  6. "eta/eta_api/utils"
  7. "fmt"
  8. "sort"
  9. "time"
  10. )
  11. // GetReportClassifyTreeRecursive 递归获取报告分类树
  12. func GetReportClassifyTreeRecursive(list []*models.Classify, parentId int) []*report_approve.ReportClassifyTreeItem {
  13. res := make([]*report_approve.ReportClassifyTreeItem, 0)
  14. for _, v := range list {
  15. if v.ParentId == parentId {
  16. t := new(report_approve.ReportClassifyTreeItem)
  17. t.ClassifyId = v.Id
  18. t.ClassifyName = v.ClassifyName
  19. t.ParentId = v.ParentId
  20. t.Children = GetReportClassifyTreeRecursive(list, v.Id)
  21. res = append(res, t)
  22. }
  23. }
  24. return res
  25. }
  26. // CheckReportApproveFlowChange 校验是否可变更分类
  27. func CheckReportApproveFlowChange(reportType, classifyFirstId, classifySecondId int) (ok bool, err error) {
  28. var count int
  29. cond := ` AND classify_id_first = ? AND classify_id_second = ? AND state = ?`
  30. pars := make([]interface{}, 0)
  31. pars = append(pars, classifyFirstId, classifySecondId, models.ReportStateWaitApprove)
  32. switch reportType {
  33. case report_approve.FlowReportTypeChinese:
  34. ct, e := models.GetReportListCount(cond, pars, "")
  35. if e != nil {
  36. err = fmt.Errorf("GetReportListCount err: %s", e.Error())
  37. return
  38. }
  39. count = ct
  40. case report_approve.FlowReportTypeEnglish:
  41. ct, e := models.GetEnglishReportListCount(cond, pars, "")
  42. if e != nil {
  43. err = fmt.Errorf("GetEnglishReportListCount err: %s", e.Error())
  44. return
  45. }
  46. count = ct
  47. case report_approve.FlowReportTypeSmart:
  48. ob := new(smart_report.SmartReport)
  49. ct, e := ob.GetCountByCondition(cond, pars)
  50. if e != nil {
  51. err = fmt.Errorf("SmartReport GetCountByCondition err: %s", e.Error())
  52. return
  53. }
  54. count = ct
  55. default:
  56. err = fmt.Errorf("报告类型有误")
  57. return
  58. }
  59. if count <= 0 {
  60. ok = true
  61. }
  62. return
  63. }
  64. // CheckReportCurrState 校验报告当前应有的状态
  65. func CheckReportCurrState(reportType, firstId, secondId, operate int) (state int, err error) {
  66. // 获取审批配置
  67. confMap, e := models.GetBusinessConf()
  68. if e != nil {
  69. err = fmt.Errorf("GetBusinessConf err: %s", e.Error())
  70. return
  71. }
  72. openMap := map[string]bool{"false": false, "true": true}
  73. openApprove := openMap[confMap[models.BusinessConfIsReportApprove]]
  74. // 查询对应分类是否有审批流
  75. flowOb := new(report_approve.ReportApproveFlow)
  76. flowCond := fmt.Sprintf(` AND %s = ? AND %s = ? AND %s = ?`, report_approve.ReportApproveFlowCols.ReportType, report_approve.ReportApproveFlowCols.ClassifyFirstId, report_approve.ReportApproveFlowCols.ClassifySecondId)
  77. flowPars := make([]interface{}, 0)
  78. flowPars = append(flowPars, reportType, firstId, secondId)
  79. flowItem, e := flowOb.GetItemByCondition(flowCond, flowPars, "")
  80. if e != nil && e.Error() != utils.ErrNoRow() {
  81. err = fmt.Errorf("ApproveFlow GetItemByCondition err: %s", e.Error())
  82. return
  83. }
  84. // 开启审批/有审批流
  85. if openApprove && (flowItem != nil || confMap[models.BusinessConfReportApproveType] == models.BusinessConfReportApproveTypeOther) {
  86. // 操作为无审批的操作时, 会转为有审批的初始状态-待提交
  87. stateMap := map[int]int{
  88. models.ReportOperateAdd: models.ReportStateWaitSubmit, // 新增
  89. models.ReportOperateEdit: models.ReportStateWaitSubmit, // 编辑
  90. models.ReportOperatePublish: models.ReportStateWaitSubmit, // 发布
  91. models.ReportOperateSubmitApprove: models.ReportStateWaitApprove, // 提审
  92. models.ReportOperateCancelApprove: models.ReportStateWaitSubmit, // 撤回
  93. }
  94. state = stateMap[operate]
  95. return
  96. }
  97. // 关闭审批/分类无审批
  98. // 操作为有审批的操作时, 会转为无审批的初始状态-未发布
  99. stateMap := map[int]int{
  100. models.ReportOperateAdd: models.ReportStateUnpublished, // 新增
  101. models.ReportOperateEdit: models.ReportStateUnpublished, // 编辑
  102. models.ReportOperatePublish: models.ReportStatePublished, // 发布
  103. models.ReportOperateSubmitApprove: models.ReportStateUnpublished, // 提审
  104. models.ReportOperateCancelApprove: models.ReportStateUnpublished, // 撤回
  105. }
  106. state = stateMap[operate]
  107. return
  108. }
  109. //type SubmitReportApprovePars struct {
  110. // ReportType int
  111. // ReportId int
  112. // ReportTitle string
  113. // FirstId int
  114. // SecondId int
  115. // SysAdminId int
  116. // SysAdminName string
  117. //}
  118. // SubmitReportApprove 提交审批
  119. func SubmitReportApprove(reportType, reportId int, reportTitle string, firstId, secondId int, sysAdminId int, sysAdminName string) (approveId int, err error) {
  120. // 如果是走的第三方审批, 那么仅修改状态
  121. confMap, e := models.GetBusinessConf()
  122. if e != nil {
  123. err = fmt.Errorf("GetBusinessConf err: %s", e.Error())
  124. return
  125. }
  126. openMap := map[string]bool{"false": false, "true": true}
  127. openApprove := openMap[confMap[models.BusinessConfIsReportApprove]]
  128. if openApprove && confMap[models.BusinessConfReportApproveType] == models.BusinessConfReportApproveTypeOther {
  129. return
  130. }
  131. // 查询审批流
  132. flowOb := new(report_approve.ReportApproveFlow)
  133. flowCond := fmt.Sprintf(` AND %s = ? AND %s = ? AND %s = ?`, report_approve.ReportApproveFlowCols.ReportType, report_approve.ReportApproveFlowCols.ClassifyFirstId, report_approve.ReportApproveFlowCols.ClassifySecondId)
  134. flowPars := make([]interface{}, 0)
  135. flowPars = append(flowPars, reportType, firstId, secondId)
  136. flowItem, e := flowOb.GetItemByCondition(flowCond, flowPars, "")
  137. if e != nil {
  138. err = fmt.Errorf("ApproveFlow GetItemByCondition err: %s", e.Error())
  139. return
  140. }
  141. // 查询审批节点
  142. nodeOb := new(report_approve.ReportApproveNode)
  143. nodeCond := fmt.Sprintf(` AND %s = ? AND %s = ?`, report_approve.ReportApproveNodeCols.ReportApproveFlowId, report_approve.ReportApproveNodeCols.CurrVersion)
  144. nodePars := make([]interface{}, 0)
  145. nodePars = append(nodePars, flowItem.ReportApproveFlowId, flowItem.CurrVersion)
  146. nodeItems, e := nodeOb.GetItemsByCondition(nodeCond, nodePars, []string{}, "")
  147. if e != nil {
  148. err = fmt.Errorf("ApproveNodes GetItemsByCondition err: %s", e.Error())
  149. return
  150. }
  151. if len(nodeItems) == 0 {
  152. err = fmt.Errorf("无审批节点")
  153. return
  154. }
  155. // 取出首个节点
  156. firstNodeItem := new(report_approve.ReportApproveNode)
  157. for _, v := range nodeItems {
  158. if v.PrevNodeId == 0 {
  159. firstNodeItem = v
  160. continue
  161. }
  162. }
  163. if firstNodeItem == nil {
  164. err = fmt.Errorf("首个审批节点有误")
  165. return
  166. }
  167. firstNode, e := report_approve.FormatReportApproveNode2Item(firstNodeItem)
  168. if e != nil {
  169. err = fmt.Errorf("首个审批节点信息有误, Err: %s", e.Error())
  170. return
  171. }
  172. if len(firstNode.Users) == 0 {
  173. err = fmt.Errorf("首个审批节点审批人信息有误")
  174. return
  175. }
  176. // 审批信息
  177. now := time.Now().Local()
  178. newApprove := new(report_approve.ReportApprove)
  179. newApprove.ReportType = reportType
  180. newApprove.ReportId = reportId
  181. newApprove.ReportTitle = reportTitle
  182. newApprove.ClassifyFirstId = firstId
  183. newApprove.ClassifySecondId = secondId
  184. newApprove.State = report_approve.ReportApproveStateApproving
  185. newApprove.FlowId = flowItem.ReportApproveFlowId
  186. newApprove.FlowVersion = flowItem.CurrVersion
  187. newApprove.StartNodeId = firstNodeItem.ReportApproveNodeId
  188. newApprove.CurrNodeId = firstNodeItem.ReportApproveNodeId
  189. newApprove.ApplyUserId = sysAdminId
  190. newApprove.ApplyUserName = sysAdminName
  191. newApprove.CreateTime = now
  192. newApprove.ModifyTime = now
  193. // 根据节点审批方式生成审批记录
  194. newRecords := make([]*report_approve.ReportApproveRecord, 0)
  195. sort.Slice(firstNode.Users, func(k, j int) bool {
  196. return firstNode.Users[k].Sort < firstNode.Users[j].Sort
  197. })
  198. for _, u := range firstNode.Users {
  199. r := new(report_approve.ReportApproveRecord)
  200. r.State = report_approve.ReportApproveStateApproving
  201. r.NodeId = firstNode.ReportApproveNodeId
  202. r.PrevNodeId = firstNode.PrevNodeId
  203. r.NextNodeId = firstNode.NextNodeId
  204. r.ApproveType = firstNode.ApproveType
  205. r.ApproveUserId = u.UserId
  206. r.ApproveUserName = u.UserName
  207. r.ApproveUserSort = u.Sort
  208. r.CreateTime = now
  209. r.ModifyTime = now
  210. newRecords = append(newRecords, r)
  211. // 依次审批仅生成一条记录
  212. if firstNode.ApproveType == report_approve.NodeApproveTypeRoll {
  213. break
  214. }
  215. }
  216. // 新增审批和审批记录
  217. if e = newApprove.CreateApproveAndRecord(newApprove, newRecords); e != nil {
  218. err = fmt.Errorf("CreateApproveAndRecord err: %s", e.Error())
  219. return
  220. }
  221. approveId = newApprove.ReportApproveId
  222. // 推送审批消息
  223. go func() {
  224. messageOb := new(report_approve.ReportApproveMessage)
  225. messages := make([]*report_approve.ReportApproveMessage, 0)
  226. for _, v := range newRecords {
  227. m := new(report_approve.ReportApproveMessage)
  228. m.SendUserId = sysAdminId
  229. m.ReceiveUserId = v.ApproveUserId
  230. m.Content = "您有新的待办任务"
  231. m.Remark = fmt.Sprintf("%s提交的【研报审批】需要您审批,请及时处理", sysAdminName)
  232. m.ReportApproveId = newApprove.ReportApproveId
  233. m.ApproveState = report_approve.ReportApproveStateApproving
  234. m.CreateTime = now
  235. m.ModifyTime = now
  236. messages = append(messages, m)
  237. }
  238. e = messageOb.CreateMulti(messages)
  239. if e != nil {
  240. utils.FileLog.Info(fmt.Sprintf("SubmitReportApprove messages err: %s", e.Error()))
  241. return
  242. }
  243. }()
  244. return
  245. }
  246. // CancelReportApprove 撤回审批
  247. func CancelReportApprove(approveId, sysAdminId int, sysAdminName string) (err error) {
  248. // 如果是走的第三方审批, 那么仅修改状态
  249. confMap, e := models.GetBusinessConf()
  250. if e != nil {
  251. err = fmt.Errorf("GetBusinessConf err: %s", e.Error())
  252. return
  253. }
  254. openMap := map[string]bool{"false": false, "true": true}
  255. openApprove := openMap[confMap[models.BusinessConfIsReportApprove]]
  256. if openApprove && confMap[models.BusinessConfReportApproveType] == models.BusinessConfReportApproveTypeOther {
  257. return
  258. }
  259. // 修改审批信息状态
  260. approveOb := new(report_approve.ReportApprove)
  261. approveItem, e := approveOb.GetItemById(approveId)
  262. if e != nil {
  263. if e.Error() == utils.ErrNoRow() {
  264. return
  265. }
  266. err = fmt.Errorf("approve GetItemById err: %s", e.Error())
  267. return
  268. }
  269. if approveItem.State == report_approve.ReportApproveStateCancel {
  270. return
  271. }
  272. approveItem.State = report_approve.ReportApproveStateCancel
  273. cols := []string{"State", "ModifyTime"}
  274. if e = approveItem.Update(cols); e != nil {
  275. err = fmt.Errorf("approve Update err: %s", e.Error())
  276. return
  277. }
  278. // 推送撤回消息
  279. go func() {
  280. recordOb := new(report_approve.ReportApproveRecord)
  281. recordCond := fmt.Sprintf(` AND %s = ?`, report_approve.ReportApproveRecordCols.ReportApproveId)
  282. recordPars := make([]interface{}, 0)
  283. recordPars = append(recordPars, approveId)
  284. recordItems, e := recordOb.GetItemsByCondition(recordCond, recordPars, []string{}, "")
  285. if e != nil {
  286. utils.FileLog.Info(fmt.Sprintf("approve record GetItemsByCondition err: %s", e.Error()))
  287. return
  288. }
  289. messageOb := new(report_approve.ReportApproveMessage)
  290. messages := make([]*report_approve.ReportApproveMessage, 0)
  291. for _, v := range recordItems {
  292. m := new(report_approve.ReportApproveMessage)
  293. m.SendUserId = sysAdminId
  294. m.ReceiveUserId = v.ApproveUserId
  295. m.Content = fmt.Sprintf("%s提交的【研报审批】已撤回", sysAdminName)
  296. m.ReportApproveId = approveId
  297. m.ApproveState = report_approve.ReportApproveStateCancel
  298. m.CreateTime = time.Now().Local()
  299. m.ModifyTime = time.Now().Local()
  300. messages = append(messages, m)
  301. }
  302. e = messageOb.CreateMulti(messages)
  303. if e != nil {
  304. utils.FileLog.Info(fmt.Sprintf("CancelReportApprove messages err: %s", e.Error()))
  305. return
  306. }
  307. }()
  308. return
  309. }
  310. // ApproveReport 报告审批
  311. func ApproveReport() (err error) {
  312. return
  313. }