AppEngineController.java 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420
  1. package com.cloud.sa.api;
  2. import com.alibaba.fastjson.JSONObject;
  3. import com.cloud.sa.flow.commom.domain.UserTaskQueryForm;
  4. import com.cloud.sa.flow.commom.common.model.StCodeMsg;
  5. import com.cloud.sa.flow.commom.common.model.StResult;
  6. import com.cloud.sa.flow.commom.common.utils.StString;
  7. import com.cloud.sa.flow.commom.domain.virentity.ViewFormTop;
  8. import com.cloud.sa.flow.commom.service.setting.StSettingService;
  9. import com.cloud.sa.flow.engine.service.StFlowService;
  10. import com.cloud.sa.flow.commom.service.flow.StTaskItemService;
  11. import com.cloud.sa.flow.commom.domain.entity.StFlowMenu;
  12. import com.cloud.sa.flow.commom.domain.entity.StFlowTemplate;
  13. import com.cloud.sa.flow.commom.domain.entity.StTaskitem;
  14. import com.cloud.sa.flow.commom.domain.virentity.FlowEnteredParam;
  15. import com.cloud.sa.flow.commom.service.StMenuService;
  16. import io.swagger.v3.oas.annotations.Operation;
  17. import io.swagger.v3.oas.annotations.tags.Tag;
  18. import org.springframework.beans.factory.annotation.Autowired;
  19. import org.springframework.http.HttpHeaders;
  20. import org.springframework.http.MediaType;
  21. import org.springframework.http.MediaTypeFactory;
  22. import org.springframework.validation.annotation.Validated;
  23. import org.springframework.web.bind.annotation.*;
  24. import org.springframework.web.multipart.MultipartFile;
  25. import javax.servlet.http.HttpServletRequest;
  26. import javax.servlet.http.HttpServletResponse;
  27. import javax.validation.Valid;
  28. import java.io.IOException;
  29. import java.io.OutputStream;
  30. import java.net.URLEncoder;
  31. import java.time.LocalDateTime;
  32. import java.time.format.DateTimeFormatter;
  33. import java.util.List;
  34. import java.util.Map;
  35. import java.util.concurrent.ExecutionException;
  36. /**
  37. * @author lc
  38. * @date 2024/6/19 17:50
  39. */
  40. @Tag(name = "流程中心")
  41. @RequestMapping("/bpm/core")
  42. @RestController
  43. public class AppEngineController {
  44. @Autowired
  45. StTaskItemService taskItemService;
  46. @Autowired
  47. StMenuService stMenuService;
  48. @Autowired
  49. StFlowService flowService;
  50. @Autowired
  51. StSettingService settingService;
  52. /**
  53. * 保存并提交 【前台定义一个taskid,点提交时,如果taskid没有值则调用此接口 】
  54. *
  55. * @param flowEnteredParam
  56. * @return
  57. */
  58. @Operation(summary = "提交流程")
  59. @PostMapping("/instance/savesubmit")
  60. public StResult SaveSubmitInstance(@Validated @RequestBody FlowEnteredParam flowEnteredParam) {
  61. StTaskitem taskitem = null;
  62. if (StString.isNotEmpty(flowEnteredParam.getTableData())) {
  63. //如果不是批量的审批通过,则先走一下保存
  64. taskitem = flowService.Save(flowEnteredParam, false);
  65. flowEnteredParam.setTaskid(taskitem.getObjectid());
  66. }
  67. try {
  68. flowService.Submit(flowEnteredParam);
  69. return StResult.success(taskitem);
  70. } catch (Exception e) {
  71. settingService.FlowCommonExceptionRecord(e, taskitem.getObjectid(), "提交");
  72. return StResult.error(StCodeMsg.SERVER_EXCEPTION, e.getMessage());
  73. }
  74. }
  75. /**
  76. * 保存流程
  77. * 一、流程发起后首次保存,点击保存按钮。
  78. * 1、保存流程实例+任务+step,并返回流程实例id。
  79. * 2、保存业务数据到数据库
  80. * 二、其他时候,点击保存按钮。
  81. * 1、仅保存修改了的业务数据到数据库
  82. *
  83. * @param flowEnteredParam flowCode,flowVersion,bizObjectid ,tableData四个个参数
  84. * @return taskid
  85. */
  86. @PostMapping("/instance/save")
  87. public StResult SaveInstance(@Validated @RequestBody FlowEnteredParam flowEnteredParam) {
  88. StTaskitem taskitem = flowService.Save(flowEnteredParam, true);
  89. return StResult.success(taskitem);
  90. }
  91. /**
  92. * 已阅流程
  93. *
  94. * @param flowEnteredParam taskid可能是通过保存接口获得,或者是从代办任务中的链接中获得
  95. * @return
  96. */
  97. @PostMapping("/instance/handleRead")
  98. public StResult handleRead(@Validated @RequestBody FlowEnteredParam flowEnteredParam) {
  99. try {
  100. flowService.Submit(flowEnteredParam);
  101. return StResult.success();
  102. } catch (Exception e) {
  103. return StResult.error(StCodeMsg.SERVER_EXCEPTION, e.getMessage());
  104. }
  105. }
  106. /**
  107. * 驳回到开始
  108. *
  109. * @param flowEnteredParam
  110. * @return
  111. */
  112. @PostMapping("/instance/rejectstart")
  113. public StResult RejectToStart(@Validated @RequestBody FlowEnteredParam flowEnteredParam) {
  114. try {
  115. return StResult.success(flowService.RejectToStart(flowEnteredParam));
  116. } catch (Exception e) {
  117. settingService.FlowCommonExceptionRecord(e, flowEnteredParam.getTaskid(), "驳回");
  118. return StResult.error(StCodeMsg.SERVER_EXCEPTION, e.getMessage());
  119. }
  120. }
  121. /**
  122. * 转发
  123. *
  124. * @param flowEnteredParam
  125. * @return
  126. */
  127. @PostMapping("/instance/turn/one")
  128. public StResult handleTurnOne(@Validated @RequestBody FlowEnteredParam flowEnteredParam) {
  129. try {
  130. return StResult.success(flowService.handleTurnOne(flowEnteredParam));
  131. } catch (Exception e) {
  132. settingService.FlowCommonExceptionRecord(e, flowEnteredParam.getTaskid(), "转发");
  133. return StResult.error(StCodeMsg.SERVER_EXCEPTION, e.getMessage());
  134. }
  135. }
  136. /**
  137. * 加签
  138. *
  139. * @param flowEnteredParam
  140. * @return
  141. */
  142. @PostMapping("/instance/add/one")
  143. public StResult handleAddOne(@Validated @RequestBody FlowEnteredParam flowEnteredParam) {
  144. try {
  145. return StResult.success(flowService.handleAddOne(flowEnteredParam));
  146. } catch (Exception e) {
  147. settingService.FlowCommonExceptionRecord(e, flowEnteredParam.getTaskid(), "加签");
  148. return StResult.error(StCodeMsg.SERVER_EXCEPTION, e.getMessage());
  149. }
  150. }
  151. /**
  152. * 传阅
  153. *
  154. * @param flowEnteredParam
  155. * @return
  156. */
  157. @PostMapping("/instance/circulate/one")
  158. public StResult handleCirculated(@Validated @RequestBody FlowEnteredParam flowEnteredParam) {
  159. try {
  160. return StResult.success(flowService.handleCirculated(flowEnteredParam));
  161. } catch (Exception e) {
  162. settingService.FlowCommonExceptionRecord(e, flowEnteredParam.getTaskid(), "传阅");
  163. return StResult.error(StCodeMsg.SERVER_EXCEPTION, e.getMessage());
  164. }
  165. }
  166. /**
  167. * 插入模版
  168. *
  169. * @param saveOrPublish 0表示保存,1表示发布
  170. * @param stFlowTemplate
  171. * @return
  172. */
  173. @PostMapping("/istStFlowTemplate")
  174. public StResult istStFlowTemplate(String saveOrPublish, @Valid @RequestBody StFlowTemplate stFlowTemplate) {
  175. if (StString.isEmpty(saveOrPublish)) {
  176. return StResult.error(StCodeMsg.PARAMETER_ISNULL, "saveOrPublish为空");
  177. }
  178. flowService.istStFlowTemplate(saveOrPublish, stFlowTemplate);
  179. return StResult.success();
  180. }
  181. /**
  182. * 插入功能菜单
  183. *
  184. * @param stFlowMenu
  185. * @return
  186. */
  187. @PostMapping("/istStFlowMenu")
  188. public StResult istStFlowMenu(@Valid @RequestBody StFlowMenu stFlowMenu) {
  189. stMenuService.istStFlowMenu(stFlowMenu);
  190. return StResult.success();
  191. }
  192. /**
  193. * 获取功能菜单
  194. *
  195. * @param id
  196. * @return
  197. */
  198. @GetMapping("/getStFlowMenu")
  199. public String getStFlowMenu(int id) {
  200. StFlowMenu stFlowMenu = stMenuService.getStFlowMenu(id);
  201. return stFlowMenu.toString();
  202. }
  203. @GetMapping("/getAllStFlowMenu")
  204. public StResult getAllStFlowMenu(String queryMenuName) {
  205. return StResult.success(stMenuService.getAllStFlowMenu(queryMenuName));
  206. }
  207. @PostMapping("/delProcess")
  208. public StResult delProcess(@RequestBody JSONObject params) {
  209. stMenuService.delProcess(params.getString("flowCode"));
  210. return StResult.success();
  211. }
  212. @GetMapping("/getStartStFlowMenu")
  213. public StResult getStartStFlowMenu(String queryMenuName) {
  214. return StResult.success(stMenuService.getStartStFlowMenu(queryMenuName));
  215. }
  216. @GetMapping("/getQueryStFlowMenu")
  217. public StResult getQueryStFlowMenu(String queryMenuName) {
  218. return StResult.success(stMenuService.getQueryStFlowMenu(queryMenuName));
  219. }
  220. /**
  221. * 子流程选择流程模版
  222. *
  223. * @return
  224. */
  225. @GetMapping("/getChildFlowStFlowMenu")
  226. public StResult getChildFlowStFlowMenu() {
  227. return StResult.success(stMenuService.getChildFlowStFlowMenu());
  228. }
  229. /**
  230. * 根据流程编号获取流程实例
  231. *
  232. * @param enteredParam flowCode:流程编号, flowVersion:流程版本(不带此参数表示获取最新版本)
  233. * @return
  234. */
  235. @PostMapping("/getStFlowTemplate")
  236. public StResult getStFlowTemplate(@Validated @RequestBody FlowEnteredParam enteredParam) {
  237. StFlowTemplate stFlowTemplate = flowService.getStFlowTemplate(enteredParam.getFlowCode(), enteredParam.getFlowVersion());
  238. return StResult.success(stFlowTemplate);
  239. }
  240. /**
  241. * 获取当前用户的任务列表
  242. * 当前代办任务
  243. *
  244. * @return
  245. */
  246. @GetMapping("/getUserTaskList/todo")
  247. public StResult getUserTaskListTodo(UserTaskQueryForm form) {
  248. return StResult.success(taskItemService.getUserTaskListTodo(form));
  249. }
  250. @GetMapping("/getUserTaskNum")
  251. public StResult getUserTaskNum() throws ExecutionException, InterruptedException {
  252. return StResult.success(taskItemService.getUserTaskNum());
  253. }
  254. @GetMapping("/getNotices")
  255. public StResult getNotices() {
  256. return StResult.success(taskItemService.getNotices());
  257. }
  258. /**
  259. * 查询已办任务接口
  260. *
  261. * @param form
  262. * @return
  263. */
  264. @GetMapping("/getUserTaskList/done")
  265. public StResult getUserTaskListDone(UserTaskQueryForm form) {
  266. return StResult.success(taskItemService.getUserTaskListDone(form));
  267. }
  268. /**
  269. * 查询传阅流程
  270. *
  271. * @param form
  272. * @return
  273. */
  274. @GetMapping("/getUserTaskList/circulation")
  275. public StResult getUserTaskListCirculation(UserTaskQueryForm form) {
  276. return StResult.success(taskItemService.getUserTaskListCirculation(form));
  277. }
  278. /**
  279. * 查询我的流程
  280. *
  281. * @param form
  282. * @return
  283. */
  284. @GetMapping("/getUserTaskList/myTask")
  285. public StResult getUserTaskListMyTask(UserTaskQueryForm form) {
  286. return StResult.success(taskItemService.getUserTaskListMyTask(form));
  287. }
  288. @GetMapping("/getUserTaskList/queryTask")
  289. public StResult getUserTaskListQueryTask(UserTaskQueryForm form) {
  290. return StResult.success(taskItemService.getUserTaskListQueryTask(form));
  291. }
  292. /**
  293. * 流程图查看
  294. *
  295. * @param instanceid
  296. * @return
  297. */
  298. @GetMapping("/instance/view")
  299. public StResult View(String instanceid) {
  300. return StResult.success(flowService.ViewProcess(instanceid));
  301. }
  302. /**
  303. * 查看横向审批人
  304. *
  305. * @param instanceid
  306. * @return
  307. */
  308. @GetMapping("/instance/viewList")
  309. public StResult ViewList(String instanceid) {
  310. return StResult.success(flowService.ViewProcessList(instanceid));
  311. }
  312. @PostMapping("/addStFlowMenu")
  313. public StResult addStFlowMenu(@RequestBody JSONObject params) throws Exception {
  314. flowService.addStFlowMenu(params);
  315. return StResult.success();
  316. }
  317. /**
  318. * 查看流程下放的审批信息
  319. *
  320. * @param instanceid
  321. * @return
  322. */
  323. @GetMapping("/instance/task")
  324. public StResult getStTaskitemListByInstanceid(String instanceid) {
  325. JSONObject stTaskItemList = flowService.getStTaskItemList(instanceid);
  326. return StResult.success(stTaskItemList);
  327. }
  328. /**
  329. * 获取审批流查看页面的顶部信息
  330. *
  331. * @return
  332. */
  333. @GetMapping("/instance/view/top")
  334. public StResult getStViewFormTop(String instanceid) {
  335. ViewFormTop stViewFormTop = flowService.getStViewFormTop(instanceid);
  336. return StResult.success(stViewFormTop);
  337. }
  338. @GetMapping("/instance/getFlowTemplateHistory")
  339. public StResult getFlowTemplateHistory(String flowCode) {
  340. List<Map> flowTemplateHistory = flowService.getFlowTemplateHistory(flowCode);
  341. return StResult.success(flowTemplateHistory);
  342. }
  343. @GetMapping("/instance/getFlowTemplateForVersion")
  344. public StResult getFlowTemplateForVersion(String flowCode, Integer version) {
  345. StFlowTemplate stFlowTemplate = flowService.getStFlowTemplate(flowCode, version);
  346. return StResult.success(stFlowTemplate);
  347. }
  348. @GetMapping("/exportData")
  349. public void exportData(@RequestParam String flowCode, HttpServletRequest request, HttpServletResponse response) {
  350. // 设置文件名
  351. LocalDateTime now = LocalDateTime.now();
  352. DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
  353. String formattedDateTime = now.format(formatter);
  354. String fileName = flowCode + formattedDateTime + ".txt";
  355. try {
  356. response.setHeader(HttpHeaders.CONTENT_TYPE, MediaTypeFactory.getMediaType(fileName).orElse(MediaType.APPLICATION_OCTET_STREAM) + ";charset=utf-8");
  357. response.setHeader(HttpHeaders.CONTENT_DISPOSITION, "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8").replaceAll("\\+", "%20"));
  358. response.setHeader(HttpHeaders.ACCESS_CONTROL_EXPOSE_HEADERS, HttpHeaders.CONTENT_DISPOSITION);
  359. String exportData = flowService.getExportData(flowCode);
  360. // 写入数据到响应流
  361. OutputStream outputStream = response.getOutputStream();
  362. outputStream.write(exportData.getBytes("UTF-8"));
  363. outputStream.flush();
  364. outputStream.close();
  365. } catch (IOException e) {
  366. e.printStackTrace();
  367. // 处理异常
  368. }
  369. }
  370. @PostMapping("/importData")
  371. public StResult importData(@RequestParam MultipartFile file) {
  372. return flowService.importData(file);
  373. }
  374. }