wf_flow.go 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414
  1. // ==========================================================================
  2. // 生成日期:2020-08-24 17:13:46
  3. // 生成人:gfast
  4. // ==========================================================================
  5. package admin
  6. import (
  7. "gfast/app/model/admin/sys_dept"
  8. "gfast/app/model/admin/user"
  9. flowModel "gfast/app/model/admin/wf_flow"
  10. "gfast/app/model/admin/wf_flow_process"
  11. "gfast/app/service/admin/dept_service"
  12. flowService "gfast/app/service/admin/flow_service"
  13. "gfast/app/service/admin/user_service"
  14. "gfast/app/service/common/work_flow_service"
  15. "gfast/library/response"
  16. "github.com/gogf/gf/frame/g"
  17. "github.com/gogf/gf/net/ghttp"
  18. "github.com/gogf/gf/util/gconv"
  19. "github.com/gogf/gf/util/gvalid"
  20. )
  21. //控制器
  22. type Flow struct{}
  23. //列表页
  24. func (c *Flow) List(r *ghttp.Request) {
  25. // 定义一个结构体存储请求参数
  26. var req *flowModel.SelectPageReq
  27. // 获取参数
  28. err := r.Parse(&req)
  29. if err != nil {
  30. response.FailJson(true, r, err.(*gvalid.Error).FirstString())
  31. }
  32. total, page, list, err := flowService.SelectListByPage(req)
  33. if err != nil {
  34. response.FailJson(true, r, err.Error())
  35. }
  36. //获取流程运行状态
  37. listData, err := flowService.GetRunningStatus(list)
  38. if err != nil {
  39. response.FailJson(true, r, err.Error())
  40. }
  41. result := g.Map{
  42. "currentPage": page,
  43. "total": total,
  44. "list": listData,
  45. }
  46. response.SusJson(true, r, "获取列表数据成功", result)
  47. }
  48. // 新增
  49. func (c *Flow) Add(r *ghttp.Request) {
  50. if r.Method == "POST" {
  51. var req *flowModel.AddReq
  52. // 通过Parse方法解析获取参数
  53. err := r.Parse(&req)
  54. if err != nil {
  55. response.FailJson(true, r, err.(*gvalid.Error).FirstString())
  56. }
  57. req.Uid = user_service.GetLoginID(r)
  58. // 调用service中的添加函数添加
  59. err = flowService.AddSave(req)
  60. if err != nil {
  61. response.FailJson(true, r, err.Error())
  62. }
  63. response.SusJson(true, r, "添加成功")
  64. }
  65. }
  66. // 修改
  67. func (c *Flow) Edit(r *ghttp.Request) {
  68. // 如果是post提交的请求就执行修改操作
  69. if r.Method == "POST" {
  70. var editReq *flowModel.EditReq
  71. // 通过Parse方法解析获取参数
  72. err := r.Parse(&editReq)
  73. if err != nil {
  74. response.FailJson(true, r, err.(*gvalid.Error).FirstString())
  75. }
  76. err = flowService.EditSave(editReq)
  77. if err != nil {
  78. response.FailJson(true, r, err.Error())
  79. }
  80. response.SusJson(true, r, "修改参数成功")
  81. }
  82. // 不是post提交的请求就到修改页面后查询出要修改的记录
  83. id := r.GetInt("id")
  84. params, err := flowService.GetByID(int64(id))
  85. if err != nil {
  86. response.FailJson(true, r, err.Error())
  87. }
  88. response.SusJson(true, r, "ok", params)
  89. }
  90. // 删除
  91. func (c *Flow) Delete(r *ghttp.Request) {
  92. var req *flowModel.RemoveReq
  93. //获取参数
  94. if err := r.Parse(&req); err != nil {
  95. response.FailJson(true, r, err.(*gvalid.Error).FirstString())
  96. }
  97. err := flowService.DeleteByIds(req.Ids)
  98. if err != nil {
  99. response.FailJson(true, r, "删除失败")
  100. }
  101. response.SusJson(true, r, "删除成功")
  102. }
  103. //设置状态
  104. func (c *Flow) StatusSetFlow(r *ghttp.Request) {
  105. var req *flowModel.StatusReq
  106. //获取参数
  107. if err := r.Parse(&req); err != nil {
  108. response.FailJson(true, r, err.(*gvalid.Error).FirstString())
  109. }
  110. err := flowService.SetStatus(req)
  111. if err != nil {
  112. response.FailJson(true, r, "状态设置失败")
  113. }
  114. response.SusJson(true, r, "状态设置成功")
  115. }
  116. //工作流设计页
  117. func (c *Flow) DesignFlow(r *ghttp.Request) {
  118. id := r.GetInt64("id")
  119. if id == 0 {
  120. response.FailJson(true, r, "参数错误")
  121. }
  122. //获取工作流信息
  123. flowInfo, err := work_flow_service.GetFlowInfoById(id)
  124. if err != nil {
  125. response.FailJson(true, r, err.Error())
  126. }
  127. if flowInfo == nil {
  128. response.FailJson(true, r, "未找到数据,请返回重试!")
  129. }
  130. total, processList, err := work_flow_service.ProcessAll(id)
  131. if err != nil {
  132. response.FailJson(true, r, err.Error())
  133. }
  134. processStep := make([]*wf_flow_process.ProcessStepData, 0, 20)
  135. for _, process := range processList {
  136. step, err := work_flow_service.GetProcessStep(process, processList)
  137. if err != nil {
  138. response.FailJson(true, r, err.Error())
  139. }
  140. if step != nil {
  141. processStep = append(processStep, step...)
  142. }
  143. }
  144. //获取流程对应表字段信息
  145. fields, err := work_flow_service.GetFlowTableFields(flowInfo.Type)
  146. if err != nil {
  147. response.FailJson(true, r, err.Error())
  148. }
  149. response.SusJson(true, r, "ok", g.Map{
  150. "flowInfo": flowInfo,
  151. "processList": processList,
  152. "total": total,
  153. "fields": fields,
  154. "processStep": processStep,
  155. })
  156. }
  157. //添加流程步骤
  158. func (c *Flow) AddProcess(r *ghttp.Request) {
  159. id := r.GetInt64("id")
  160. if id == 0 {
  161. response.FailJson(true, r, "参数错误")
  162. }
  163. //获取工作流信息
  164. flowInfo, err := work_flow_service.GetFlowInfoById(id)
  165. if err != nil {
  166. response.FailJson(true, r, err.Error())
  167. }
  168. if flowInfo == nil {
  169. response.FailJson(true, r, "添加失败,未找到流程")
  170. }
  171. err = work_flow_service.ProcessAdd(id)
  172. if err != nil {
  173. response.FailJson(true, r, err.Error())
  174. }
  175. response.SusJson(true, r, "添加成功")
  176. }
  177. //保存设计
  178. func (c *Flow) SaveProcess(r *ghttp.Request) {
  179. var req *wf_flow_process.SaveProcessReqBatch
  180. //获取参数
  181. if err := r.Parse(&req); err != nil {
  182. response.FailJson(true, r, err.(*gvalid.Error).FirstString())
  183. }
  184. for _, rq := range req.Data {
  185. // 使用结构体定义的校验规则和错误提示进行校验
  186. if err := gvalid.CheckStruct(rq, nil); err != nil {
  187. response.FailJson(true, r, err.FirstString())
  188. }
  189. }
  190. if err := work_flow_service.SaveProcess(req); err != nil {
  191. response.FailJson(true, r, err.Error())
  192. }
  193. response.SusJson(true, r, "保存成功")
  194. }
  195. //获取办理对象(人员/部门)
  196. func (c *Flow) GetManager(r *ghttp.Request) {
  197. manageType := r.GetString("type")
  198. //kid := r.GetString("kid")
  199. keyWords := r.GetString("key")
  200. if manageType == "getUser" {
  201. req := &user.SearchReq{
  202. KeyWords: keyWords,
  203. PageSize: 50,
  204. }
  205. _, _, userList, err := user_service.GetAdminList(req)
  206. if err != nil {
  207. response.FailJson(true, r, err.Error())
  208. }
  209. res := make(g.ListStrAny, len(userList))
  210. for k, v := range userList {
  211. res[k] = g.MapStrAny{
  212. "label": v.UserNickname,
  213. "value": v.Id,
  214. }
  215. }
  216. response.SusJson(true, r, "ok", res)
  217. } else if manageType == "getDepartment" {
  218. req := &sys_dept.SearchParams{
  219. DeptName: keyWords,
  220. }
  221. list, err := dept_service.GetList(req)
  222. if err != nil {
  223. response.FailJson(true, r, err.Error())
  224. }
  225. res := make(g.ListStrAny, len(list))
  226. for k, v := range list {
  227. res[k] = g.MapStrAny{
  228. "label": v.DeptName,
  229. "value": v.DeptID,
  230. }
  231. }
  232. response.SusJson(true, r, "ok", res)
  233. }
  234. response.FailJson(true, r, "参数错误")
  235. }
  236. //保存节点属性
  237. func (c *Flow) SaveAttr(r *ghttp.Request) {
  238. var req *wf_flow_process.SaveAttrReq
  239. //获取参数
  240. if err := r.Parse(&req); err != nil {
  241. response.FailJson(true, r, err.(*gvalid.Error).FirstString())
  242. }
  243. if err := work_flow_service.SaveProcessAttr(req); err != nil {
  244. response.FailJson(true, r, err.Error())
  245. }
  246. response.SusJson(true, r, "保存成功", req)
  247. }
  248. //删除节点
  249. func (c *Flow) DeleteProcess(r *ghttp.Request) {
  250. var req *wf_flow_process.DeleteProcessReq
  251. //获取参数
  252. if err := r.Parse(&req); err != nil {
  253. response.FailJson(true, r, err.(*gvalid.Error).FirstString())
  254. }
  255. if err := work_flow_service.ProcessDelete(req); err != nil {
  256. response.FailJson(true, r, err.Error())
  257. }
  258. response.SusJson(true, r, "删除成功")
  259. }
  260. //清除流程节点
  261. func (c *Flow) DeleteProcessAll(r *ghttp.Request) {
  262. flowId := r.GetInt("flow_id")
  263. if flowId == 0 {
  264. response.FailJson(true, r, "参数错误")
  265. }
  266. if err := work_flow_service.ProcessDeleteAll(flowId); err != nil {
  267. response.FailJson(true, r, err.Error())
  268. }
  269. response.SusJson(true, r, "清除成功")
  270. }
  271. //检查流程逻辑
  272. func (c *Flow) CheckFlow(r *ghttp.Request) {
  273. flowId := r.GetInt64("flow_id")
  274. if flowId == 0 {
  275. response.FailJson(true, r, "参数错误")
  276. }
  277. err := work_flow_service.CheckFlow(flowId)
  278. if err != nil {
  279. response.FailJson(true, r, err.Error())
  280. }
  281. response.SusJson(true, r, "简单逻辑检查通过,请自行检查转出条件!")
  282. }
  283. //发起选择工作流程
  284. func (c *Flow) WfStart(r *ghttp.Request) {
  285. var req *flowModel.StartFlowReq
  286. //获取参数
  287. if err := r.Parse(&req); err != nil {
  288. response.FailJson(true, r, err.(*gvalid.Error).FirstString())
  289. }
  290. flow, err := work_flow_service.GetWorkFlowByType(req.WfType)
  291. if err != nil {
  292. response.FailJson(true, r, err.Error())
  293. }
  294. response.SusJson(true, r, "ok", g.Map{
  295. "flow": flow,
  296. "info": req,
  297. })
  298. }
  299. //保存业务流程信息
  300. func (c *Flow) SaveStartWf(r *ghttp.Request) {
  301. var req *flowModel.SaveWfFlowReq
  302. //获取参数
  303. if err := r.Parse(&req); err != nil {
  304. response.FailJson(true, r, err.(*gvalid.Error).FirstString())
  305. }
  306. req.UserId = user_service.GetLoginID(r)
  307. err := work_flow_service.StartWorkFlow(req)
  308. if err != nil {
  309. response.FailJson(true, r, err.Error())
  310. }
  311. response.SusJson(true, r, "发起成功")
  312. }
  313. //审批
  314. func (c *Flow) WfCheck(r *ghttp.Request) {
  315. var req *flowModel.CheckWfReq
  316. //获取参数
  317. if err := r.Parse(&req); err != nil {
  318. response.FailJson(true, r, err.(*gvalid.Error).FirstString())
  319. }
  320. //当前用户信息
  321. userInfo := user_service.GetLoginAdminInfo(r)
  322. //获取流程信息
  323. flowInfo, err := work_flow_service.WorkFlowInfo(req.WfFid, req.WfType, userInfo.Id, userInfo.DeptId)
  324. if err != nil {
  325. response.FailJson(true, r, err.Error())
  326. }
  327. //获取流程审批日志信息
  328. flowLogs, err := work_flow_service.FlowLog("logs", req.WfFid, req.WfType)
  329. if err != nil {
  330. response.FailJson(true, r, err.Error())
  331. }
  332. //获取业务信息
  333. table, err := work_flow_service.GetBill(gconv.Int(req.WfFid), req.WfType)
  334. if err != nil {
  335. response.FailJson(true, r, err.Error())
  336. }
  337. response.SusJson(true, r, "ok", g.Map{
  338. "info": req,
  339. "flowInfo": flowInfo,
  340. "flowLogs": flowLogs,
  341. "table": table,
  342. })
  343. }
  344. //审批数据保存
  345. func (c *Flow) CheckSave(r *ghttp.Request) {
  346. var req *flowModel.CheckWfSaveReq
  347. //获取参数
  348. if err := r.Parse(&req); err != nil {
  349. response.FailJson(true, r, err.(*gvalid.Error).FirstString())
  350. }
  351. req.UserId = user_service.GetLoginID(r)
  352. err := work_flow_service.WorkCheckAction(req)
  353. if err != nil {
  354. response.FailJson(true, r, err.Error())
  355. }
  356. response.SusJson(true, r, "ok", req)
  357. }
  358. //获取回退步骤数据
  359. func (c *Flow) GetBackTodo(r *ghttp.Request) {
  360. var req *flowModel.BackTodoReq
  361. //获取参数
  362. if err := r.Parse(&req); err != nil {
  363. response.FailJson(true, r, err.(*gvalid.Error).FirstString())
  364. }
  365. todo, err := work_flow_service.GetBackTodo(req)
  366. if err != nil {
  367. response.FailJson(true, r, err.Error())
  368. }
  369. response.SusJson(true, r, "ok", todo)
  370. }
  371. //流程监控
  372. func (c *Flow) Monitoring(r *ghttp.Request) {
  373. list, err := work_flow_service.GetRunningFlow()
  374. if err != nil {
  375. response.FailJson(true, r, err.Error())
  376. }
  377. response.SusJson(true, r, "ok", list)
  378. }
  379. //终止流程
  380. func (c *Flow) StopFlow(r *ghttp.Request) {
  381. runId := r.GetUint("id")
  382. wfStatusField := r.GetString("WfStatusField")
  383. if runId == 0 || wfStatusField == "" {
  384. response.FailJson(true, r, "参数错误")
  385. }
  386. userId := user_service.GetLoginID(r)
  387. if err := work_flow_service.DoSupEnd(runId, userId, wfStatusField); err != nil {
  388. response.FailJson(true, r, err.Error())
  389. }
  390. response.SusJson(true, r, "终止成功")
  391. }