TaskServiceImpl.java 92 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968
  1. package jnpf.flowable.service.impl;
  2. import cn.hutool.core.bean.BeanUtil;
  3. import cn.hutool.core.collection.CollectionUtil;
  4. import cn.hutool.core.util.ObjectUtil;
  5. import com.baomidou.dynamic.datasource.annotation.DSTransactional;
  6. import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
  7. import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
  8. import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
  9. import com.baomidou.mybatisplus.core.metadata.IPage;
  10. import com.baomidou.mybatisplus.core.toolkit.support.SFunction;
  11. import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
  12. import com.github.yulichang.toolkit.JoinWrappers;
  13. import com.github.yulichang.wrapper.MPJLambdaWrapper;
  14. import com.google.common.collect.ImmutableList;
  15. import com.google.common.collect.ImmutableMap;
  16. import jnpf.base.UserInfo;
  17. import jnpf.base.entity.DictionaryDataEntity;
  18. import jnpf.base.entity.SystemEntity;
  19. import jnpf.base.entity.VisualdevEntity;
  20. import jnpf.base.model.flow.FlowFormDataModel;
  21. import jnpf.base.model.module.ModuleModel;
  22. import jnpf.base.service.SuperServiceImpl;
  23. import jnpf.constant.JnpfConst;
  24. import jnpf.constant.MsgCode;
  25. import jnpf.exception.WorkFlowException;
  26. import jnpf.flowable.entity.*;
  27. import jnpf.flowable.enums.*;
  28. import jnpf.flowable.mapper.TaskMapper;
  29. import jnpf.flowable.model.candidates.CandidateCheckFo;
  30. import jnpf.flowable.model.candidates.CandidateCheckVo;
  31. import jnpf.flowable.model.candidates.CandidateListModel;
  32. import jnpf.flowable.model.candidates.CandidateUserVo;
  33. import jnpf.flowable.model.flowable.FlowAbleUrl;
  34. import jnpf.flowable.model.flowable.FlowableNodeModel;
  35. import jnpf.flowable.model.flowable.NextOrPrevFo;
  36. import jnpf.flowable.model.message.FlowMsgModel;
  37. import jnpf.flowable.model.monitor.MonitorVo;
  38. import jnpf.flowable.model.operator.OperatorVo;
  39. import jnpf.flowable.model.record.NodeRecordModel;
  40. import jnpf.flowable.model.task.*;
  41. import jnpf.flowable.model.template.BeforeInfoVo;
  42. import jnpf.flowable.model.templatejson.TemplateJsonInfoVO;
  43. import jnpf.flowable.model.templatenode.ButtonModel;
  44. import jnpf.flowable.model.templatenode.TaskNodeModel;
  45. import jnpf.flowable.model.templatenode.nodejson.Assign;
  46. import jnpf.flowable.model.templatenode.nodejson.CounterSignConfig;
  47. import jnpf.flowable.model.templatenode.nodejson.FileConfig;
  48. import jnpf.flowable.model.templatenode.nodejson.NodeModel;
  49. import jnpf.flowable.model.util.FlowConstant;
  50. import jnpf.flowable.model.util.FlowContextHolder;
  51. import jnpf.flowable.model.util.FlowNature;
  52. import jnpf.flowable.service.*;
  53. import jnpf.flowable.util.*;
  54. import jnpf.permission.entity.UserEntity;
  55. import jnpf.permission.model.authorize.AuthorizeVO;
  56. import jnpf.util.*;
  57. import jnpf.util.context.RequestContext;
  58. import org.springframework.beans.factory.annotation.Autowired;
  59. import org.springframework.stereotype.Service;
  60. import java.util.*;
  61. import java.util.stream.Collectors;
  62. /**
  63. * 类的描述
  64. *
  65. * @author JNPF@YinMai Info. Co., Ltd
  66. * @version 5.0.x
  67. * @since 2024/4/17 15:09
  68. */
  69. @Service
  70. public class TaskServiceImpl extends SuperServiceImpl<TaskMapper, TaskEntity> implements TaskService {
  71. @Autowired
  72. private TemplateService templateService;
  73. @Autowired
  74. private TemplateJsonService templateJsonService;
  75. @Autowired
  76. private TemplateNodeService templateNodeService;
  77. @Autowired
  78. private FlowAbleUrl flowAbleUrl;
  79. @Autowired
  80. private LaunchUserService launchUserService;
  81. @Autowired
  82. private ServiceUtil serviceUtil;
  83. @Autowired
  84. private ConditionService conditionService;
  85. @Autowired
  86. private CandidatesService candidatesService;
  87. @Autowired
  88. private OperatorService operatorService;
  89. @Autowired
  90. private RecordUtil recordUtil;
  91. @Autowired
  92. private RecordService recordService;
  93. @Autowired
  94. private CirculateService circulateService;
  95. @Autowired
  96. private NodeUtil nodeUtil;
  97. @Autowired
  98. private OperatorUtil operatorUtil;
  99. @Autowired
  100. private MsgUtil msgUtil;
  101. @Autowired
  102. private CommentService commentService;
  103. @Autowired
  104. private RejectDataService rejectDataService;
  105. @Autowired
  106. private TaskUtil taskUtil;
  107. @Autowired
  108. private ButtonUtil buttonUtil;
  109. @Autowired
  110. private DelegateService delegateService;
  111. @Autowired
  112. private NodeRecordService nodeRecordService;
  113. @Autowired
  114. private TaskLineService taskLineService;
  115. @Autowired
  116. private RevokeService revokeService;
  117. @Autowired
  118. private TriggerTaskService triggerTaskService;
  119. @Autowired
  120. private EventLogService eventLogService;
  121. @Autowired
  122. private TemplateUseNumService templateUseNumService;
  123. @Override
  124. public TaskEntity getInfoSubmit(String id, SFunction<TaskEntity, ?>... columns) {
  125. List<TaskEntity> list = getInfosSubmit(new String[]{id}, columns);
  126. if (list.isEmpty()) {
  127. return null;
  128. }
  129. return list.get(0);
  130. }
  131. @Override
  132. public List<TaskEntity> getInfosSubmit(String[] ids, SFunction<TaskEntity, ?>... columns) {
  133. List<TaskEntity> resultList = Collections.emptyList();
  134. if (ids == null || ids.length == 0) {
  135. return resultList;
  136. }
  137. LambdaQueryWrapper<TaskEntity> queryWrapper = new LambdaQueryWrapper<>();
  138. if (ids.length == 1) {
  139. queryWrapper.select(columns).and(
  140. t -> t.eq(TaskEntity::getId, ids[0])
  141. );
  142. resultList = this.list(queryWrapper);
  143. if (resultList.isEmpty()) {
  144. queryWrapper = new LambdaQueryWrapper<>();
  145. queryWrapper.select(columns).and(
  146. t -> t.eq(TaskEntity::getFlowId, ids[0])
  147. );
  148. resultList = this.list(queryWrapper);
  149. }
  150. } else {
  151. queryWrapper.select(TaskEntity::getId).and(t -> {
  152. t.in(TaskEntity::getId, ids).or().in(TaskEntity::getId, ids);
  153. });
  154. List<String> resultIds = this.listObjs(queryWrapper, Object::toString);
  155. if (!resultIds.isEmpty()) {
  156. queryWrapper = new LambdaQueryWrapper<>();
  157. queryWrapper.select(columns).in(TaskEntity::getId, resultIds);
  158. resultList = this.list(queryWrapper);
  159. }
  160. }
  161. return resultList;
  162. }
  163. @Override
  164. public List<TaskVo> getList(TaskPagination pagination) {
  165. String userId = UserProvider.getUser().getUserId();
  166. List<Integer> templateStatusList = ImmutableList.of(TemplateStatueEnum.up.getCode(), TemplateStatueEnum.downContinue.getCode());
  167. List<Integer> taskStatusList = ImmutableList.of(TaskStatusEnum.TO_BE_SUBMIT.getCode(),
  168. TaskStatusEnum.RUNNING.getCode(), TaskStatusEnum.PAUSED.getCode(),
  169. TaskStatusEnum.BACKED.getCode(), TaskStatusEnum.RECALL.getCode());
  170. MPJLambdaWrapper<TaskEntity> queryWrapper = JoinWrappers.lambda(TaskEntity.class)
  171. .select(TaskEntity::getId, TaskEntity::getFullName, TaskEntity::getStartTime,
  172. TaskEntity::getCurrentNodeName, TaskEntity::getFlowName, TaskEntity::getFlowType,
  173. TaskEntity::getFlowVersion, TaskEntity::getParentId, TaskEntity::getStatus,
  174. TaskEntity::getFlowCategory, TaskEntity::getFlowCode, TaskEntity::getFlowId,
  175. TaskEntity::getInstanceId, TaskEntity::getTemplateId
  176. )
  177. .selectAs(TaskEntity::getDelegateUserId, TaskVo::getDelegateUser)
  178. .selectAs(TaskEntity::getUrgent, TaskVo::getFlowUrgent)
  179. .selectAs(TemplateEntity::getSystemId, TaskVo::getSystemName)
  180. .selectAs(TaskEntity::getCreatorUserId, TaskVo::getCreatorUser)
  181. .leftJoin(TemplateEntity.class, TemplateEntity::getId, TaskEntity::getTemplateId)
  182. .and(e -> e.in(TemplateEntity::getStatus, templateStatusList)
  183. .or(t -> t.eq(TemplateEntity::getStatus, TemplateStatueEnum.downHidden.getCode()).notIn(TaskEntity::getStatus, taskStatusList))
  184. );
  185. List<DelegateEntity> delegateList = delegateService.getByToUserId(userId, 0);
  186. queryWrapper.and(t -> {
  187. t.eq(TaskEntity::getCreatorUserId, userId);
  188. for (DelegateEntity delegate : delegateList) {
  189. if (StringUtil.isNotEmpty(delegate.getFlowId())) {
  190. String[] flowIds = delegate.getFlowId().split(",");
  191. t.or(tw -> tw.in(TaskEntity::getTemplateId, flowIds)
  192. .eq(TaskEntity::getCreatorUserId, delegate.getUserId()).eq(TaskEntity::getDelegateUserId, userId)
  193. .between(TaskEntity::getStartTime, delegate.getStartTime(), delegate.getEndTime())
  194. );
  195. } else {
  196. t.or().eq(TaskEntity::getCreatorUserId, delegate.getUserId()).eq(TaskEntity::getDelegateUserId, userId)
  197. .between(TaskEntity::getStartTime, delegate.getStartTime(), delegate.getEndTime());
  198. }
  199. }
  200. });
  201. //关键字(流程名称、流程编码)
  202. String keyWord = pagination.getKeyword();
  203. if (ObjectUtil.isNotEmpty(keyWord)) {
  204. queryWrapper.and(t -> t.like(TaskEntity::getEnCode, keyWord).or().like(TaskEntity::getFullName, keyWord));
  205. }
  206. //日期范围(近7天、近1月、近3月、自定义)
  207. if (ObjectUtil.isNotEmpty(pagination.getStartTime()) && ObjectUtil.isNotEmpty(pagination.getEndTime())) {
  208. queryWrapper.between(TaskEntity::getStartTime, new Date(pagination.getStartTime()), new Date(pagination.getEndTime()));
  209. }
  210. //所属流程
  211. String templateId = pagination.getTemplateId();
  212. if (ObjectUtil.isNotEmpty(templateId)) {
  213. queryWrapper.eq(TaskEntity::getTemplateId, templateId);
  214. }
  215. //流程状态
  216. Integer status = pagination.getStatus();
  217. if (ObjectUtil.isNotEmpty(status)) {
  218. if (status.equals(0)) {// 待提交
  219. List<Integer> list = ImmutableList.of(TaskStatusEnum.TO_BE_SUBMIT.getCode(), TaskStatusEnum.BACKED.getCode()
  220. , TaskStatusEnum.RECALL.getCode());
  221. queryWrapper.in(TaskEntity::getStatus, list);
  222. } else if (status.equals(1)) { // 进行中
  223. List<Integer> list = ImmutableList.of(TaskStatusEnum.RUNNING.getCode(), TaskStatusEnum.PAUSED.getCode());
  224. queryWrapper.in(TaskEntity::getStatus, list);
  225. } else { // 已完成
  226. List<Integer> list = ImmutableList.of(TaskStatusEnum.PASSED.getCode(), TaskStatusEnum.REJECTED.getCode(),
  227. TaskStatusEnum.CANCEL.getCode(), TaskStatusEnum.REVOKED.getCode());
  228. queryWrapper.in(TaskEntity::getStatus, list);
  229. }
  230. }
  231. //紧急程度
  232. Integer flowUrgent = pagination.getFlowUrgent();
  233. if (ObjectUtil.isNotEmpty(flowUrgent)) {
  234. queryWrapper.eq(TaskEntity::getUrgent, flowUrgent);
  235. }
  236. //所属分类
  237. String flowCategory = pagination.getFlowCategory();
  238. if (ObjectUtil.isNotEmpty(flowCategory)) {
  239. queryWrapper.eq(TaskEntity::getFlowCategory, flowCategory);
  240. }
  241. //应用主键
  242. String systemId = pagination.getSystemId();
  243. if (ObjectUtil.isNotEmpty(systemId)) {
  244. queryWrapper.eq(TemplateEntity::getSystemId, systemId);
  245. }
  246. //排序
  247. queryWrapper.orderByAsc(TaskEntity::getStatus).orderByDesc(TaskEntity::getStartTime);
  248. Page<TaskVo> page = new Page<>(pagination.getCurrentPage(), pagination.getPageSize());
  249. IPage<TaskVo> taskEntityPage = this.selectJoinListPage(page, TaskVo.class, queryWrapper);
  250. return pagination.setData(taskEntityPage.getRecords(), page.getTotal());
  251. }
  252. @Override
  253. public List<MonitorVo> getMonitorList(TaskPagination pagination) {
  254. // 定义变量判断是否需要使用修改时间倒序
  255. boolean flag = false;
  256. MPJLambdaWrapper<TaskEntity> wrapper = JoinWrappers.lambda(TaskEntity.class)
  257. .select(TaskEntity::getId, TaskEntity::getFullName, TaskEntity::getFlowName, TaskEntity::getStartTime,
  258. TaskEntity::getCurrentNodeName, TaskEntity::getFlowCode, TaskEntity::getIsFile, TaskEntity::getFlowId,
  259. TaskEntity::getFlowType, TaskEntity::getStatus, TaskEntity::getFlowType, TaskEntity::getFlowVersion
  260. )
  261. .selectAs(TaskEntity::getCreatorUserId, MonitorVo::getCreatorUser)
  262. .selectAs(TaskEntity::getUrgent, MonitorVo::getFlowUrgent)
  263. .selectAs(TaskEntity::getFlowName, MonitorVo::getFlowName)
  264. .selectAs(TemplateEntity::getSystemId, MonitorVo::getSystemName)
  265. .leftJoin(TemplateEntity.class, TemplateEntity::getId, TaskEntity::getTemplateId)
  266. .isNotNull(TaskEntity::getStartTime)
  267. .gt(TaskEntity::getStatus, TaskStatusEnum.TO_BE_SUBMIT.getCode());
  268. //关键字(流程名称、流程编码)
  269. String keyWord = pagination.getKeyword();
  270. if (ObjectUtil.isNotEmpty(keyWord)) {
  271. flag = true;
  272. wrapper.and(t -> t.like(TaskEntity::getEnCode, keyWord).or().like(TaskEntity::getFullName, keyWord));
  273. }
  274. //日期范围(近7天、近1月、近3月、自定义)
  275. if (ObjectUtil.isNotEmpty(pagination.getStartTime()) && ObjectUtil.isNotEmpty(pagination.getEndTime())) {
  276. wrapper.between(TaskEntity::getStartTime, new Date(pagination.getStartTime()), new Date(pagination.getEndTime()));
  277. }
  278. //所属流程
  279. String templateId = pagination.getTemplateId();
  280. if (ObjectUtil.isNotEmpty(templateId)) {
  281. flag = true;
  282. wrapper.eq(TaskEntity::getTemplateId, templateId);
  283. }
  284. //流程状态
  285. Integer status = pagination.getStatus();
  286. if (ObjectUtil.isNotEmpty(status)) {
  287. flag = true;
  288. wrapper.eq(TaskEntity::getStatus, status);
  289. }
  290. //紧急程度
  291. Integer flowUrgent = pagination.getFlowUrgent();
  292. if (ObjectUtil.isNotEmpty(flowUrgent)) {
  293. flag = true;
  294. wrapper.eq(TaskEntity::getUrgent, flowUrgent);
  295. }
  296. //所属分类
  297. String flowCategory = pagination.getFlowCategory();
  298. if (ObjectUtil.isNotEmpty(flowCategory)) {
  299. flag = true;
  300. wrapper.eq(TaskEntity::getFlowCategory, flowCategory);
  301. }
  302. // 发起人员
  303. String creatorUserId = pagination.getCreatorUserId();
  304. if (StringUtil.isNotBlank(creatorUserId)) {
  305. flag = true;
  306. wrapper.eq(TaskEntity::getCreatorUserId, creatorUserId);
  307. }
  308. //应用主建
  309. String systemId = pagination.getSystemId();
  310. if (ObjectUtil.isNotEmpty(systemId)) {
  311. wrapper.eq(TemplateEntity::getSystemId, systemId);
  312. }
  313. wrapper.orderByDesc(TaskEntity::getStartTime);
  314. if (flag) {
  315. wrapper.orderByDesc(TaskEntity::getLastModifyTime);
  316. }
  317. Page<MonitorVo> page = new Page<>(pagination.getCurrentPage(), pagination.getPageSize());
  318. Page<MonitorVo> iPage = this.selectJoinListPage(page, MonitorVo.class, wrapper);
  319. return pagination.setData(iPage.getRecords(), page.getTotal());
  320. }
  321. @Override
  322. public TaskEntity getInfo(String id) throws WorkFlowException {
  323. QueryWrapper<TaskEntity> queryWrapper = new QueryWrapper<>();
  324. queryWrapper.lambda().eq(TaskEntity::getId, id == null ? "" : id);
  325. TaskEntity entity = this.getOne(queryWrapper);
  326. if (null == entity) {
  327. throw new WorkFlowException(MsgCode.FA001.get());
  328. }
  329. return entity;
  330. }
  331. // 发起、审批详情
  332. @Override
  333. public BeforeInfoVo getInfo(String id, FlowModel fo) throws WorkFlowException {
  334. BeforeInfoVo vo = new BeforeInfoVo();
  335. TemplateJsonInfoVO jsonInfoVO = null;
  336. TemplateEntity template = null;
  337. if (!StringUtil.equals(FlowNature.ParentId, id)) {
  338. TaskEntity taskEntity = this.getById(id);
  339. if (null != taskEntity) {
  340. jsonInfoVO = templateJsonService.getInfoVo(taskEntity.getFlowId());
  341. template = templateService.getInfo(taskEntity.getTemplateId());
  342. }
  343. vo.setLineKeyList(taskLineService.getLineKeyList(id));
  344. }
  345. if (null == jsonInfoVO) {
  346. template = null == template ? templateService.getInfo(fo.getFlowId()) : template;
  347. jsonInfoVO = templateJsonService.getInfoVo(template.getFlowId());
  348. }
  349. fo.setTemplateEntity(template);
  350. vo.setFlowInfo(jsonInfoVO);
  351. fo.setDeploymentId(jsonInfoVO.getFlowableId());
  352. // 节点
  353. List<TemplateNodeEntity> nodeEntities = templateNodeService.getList(jsonInfoVO.getFlowId());
  354. TemplateNodeEntity nodeEntity = null;
  355. OperatorEntity operatorEntity = new OperatorEntity();
  356. RecordEntity recordEntity = new RecordEntity();
  357. Map<String, Object> map = new HashMap<>();
  358. Map<String, Object> draft = new HashMap<>();
  359. String operatorId = ObjectUtil.isNotEmpty(fo.getOperatorId()) ? fo.getOperatorId() : "";
  360. OpTypeEnum type = OpTypeEnum.getType(fo.getOpType());
  361. switch (type) {
  362. case LaunchCreate:
  363. case Sign:// 待签
  364. case Todo:// 待办
  365. case Doing:// 在办
  366. OperatorEntity operator = operatorService.getInfo(operatorId);
  367. if (null != operator) {
  368. nodeEntity = nodeEntities.stream()
  369. .filter(e -> StringUtil.equals(operator.getNodeCode(), e.getNodeCode())).findFirst().orElse(null);
  370. operatorEntity = operator;
  371. }
  372. break;
  373. case Done:// 已办
  374. RecordEntity record = recordService.getInfo(operatorId);
  375. if (null != record) {
  376. nodeEntity = nodeEntities.stream()
  377. .filter(e -> StringUtil.equals(record.getNodeCode(), e.getNodeCode())).findFirst().orElse(null);
  378. if (StringUtil.isNotBlank(record.getOperatorId())) {
  379. OperatorEntity op = operatorService.getById(record.getOperatorId());
  380. if (null != op) {
  381. operatorEntity = op;
  382. }
  383. }
  384. recordEntity = record;
  385. }
  386. break;
  387. case Circulate:// 抄送
  388. CirculateEntity circulateEntity = circulateService.getById(operatorId);
  389. if (null != circulateEntity) {
  390. nodeEntity = nodeEntities.stream()
  391. .filter(e -> StringUtil.equals(circulateEntity.getNodeCode(), e.getNodeCode())).findFirst().orElse(null);
  392. circulateEntity.setCirculateRead(1);
  393. circulateService.updateById(circulateEntity);
  394. if (StringUtil.isNotBlank(circulateEntity.getOperatorId())) {
  395. OperatorEntity ope = operatorService.getById(circulateEntity.getOperatorId());
  396. if (null != ope) {
  397. operatorEntity = ope;
  398. }
  399. }
  400. }
  401. break;
  402. }
  403. //发起流程添加使用次数
  404. if (Objects.equals(fo.getIsFlow(), 1)) {
  405. templateUseNumService.insertOrUpdateUseNum(fo.getFlowId());
  406. }
  407. if (null == nodeEntity) {
  408. // 默认获取开始节点
  409. nodeEntity = nodeEntities.stream()
  410. .filter(e -> StringUtil.equals(NodeEnum.start.getType(), e.getNodeType())).findFirst().orElse(null);
  411. }
  412. if (null == nodeEntity) {
  413. throw new WorkFlowException(MsgCode.WF076.get());
  414. }
  415. if (null != operatorEntity.getDraftData()) {
  416. Map<String, Object> draftData = JsonUtil.stringToMap(operatorEntity.getDraftData());
  417. draftData.forEach((k, v) -> {
  418. if (ObjectUtil.isNotEmpty(v) && !Objects.equals(TableFeildsEnum.VERSION.getField(), k)) {
  419. map.put(k, v);
  420. }
  421. });
  422. draft.putAll(draftData);
  423. }
  424. String formId = nodeEntity.getFormId();
  425. NodeModel currentNode = JsonUtil.getJsonToBean(nodeEntity.getNodeJson(), NodeModel.class);
  426. vo.setFormOperates(currentNode.getFormOperates());
  427. // 表单数据
  428. if (!StringUtil.equals(FlowNature.ParentId, id)) {
  429. Map<String, Object> formData = serviceUtil.infoData(formId, id);
  430. vo.setFormData(formData);
  431. fo.setFormData(formData);
  432. formData.putAll(map);
  433. draft.putAll(formData);
  434. String flowTaskID = Objects.nonNull(formData.get(FlowFormConstant.FLOWTASKID)) ? formData.get(FlowFormConstant.FLOWTASKID).toString() : "";
  435. id = StringUtil.isNotBlank(flowTaskID) ? flowTaskID : id;
  436. TaskEntity taskEntity = this.getById(id);
  437. if (null != taskEntity) {
  438. TaskVo taskVo = JsonUtil.getJsonToBean(taskEntity, TaskVo.class);
  439. taskVo.setFlowUrgent(taskEntity.getUrgent());
  440. UserEntity user = serviceUtil.getUserInfo(taskEntity.getCreatorUserId());
  441. taskVo.setCreatorUser(user.getRealName());
  442. taskVo.setHeadIcon(UploaderUtil.uploaderImg(user.getHeadIcon()));
  443. String flowCategory = taskEntity.getFlowCategory();
  444. // 分类名称
  445. List<String> categoryIds = ImmutableList.of(flowCategory);
  446. List<DictionaryDataEntity> dictionName = serviceUtil.getDictionName(categoryIds);
  447. taskVo.setFlowCategory(dictionName.stream().map(DictionaryDataEntity::getFullName).collect(Collectors.joining(",")));
  448. vo.setTaskInfo(taskVo);
  449. fo.setTaskEntity(taskEntity);
  450. // 流转记录
  451. List<RecordEntity> records = recordService.getList(taskEntity.getId());
  452. vo.setRecordList(recordUtil.getRecordList(records, nodeEntities));
  453. FlowModel flowModel = new FlowModel();
  454. flowModel.setFormData(formData);
  455. flowModel.setDeploymentId(fo.getDeploymentId());
  456. flowModel.setTaskEntity(taskEntity);
  457. flowModel.setNodeEntityList(nodeEntities);
  458. flowModel.setNodeEntity(nodeEntity);
  459. flowModel.setOpType(fo.getOpType());
  460. flowModel.setRecordEntity(recordEntity);
  461. // 节点
  462. List<TaskNodeModel> nodeList = nodeUtil.getNodeList(flowModel);
  463. vo.setNodeList(nodeList);
  464. fo.setNodeList(nodeList);
  465. vo.setFlowInfo(jsonInfoVO);
  466. Map<String, Object> nodeProperties = jsonInfoVO.getFlowNodes().get(nodeEntity.getNodeCode());
  467. nodeUtil.setFlowFile(currentNode, taskEntity, nodeProperties);
  468. vo.setNodeProperties(nodeProperties);
  469. vo.setProgressList(!Objects.equals(type, OpTypeEnum.Monitor) ? recordUtil.getProgressList(flowModel) : new ArrayList<>());
  470. }
  471. }
  472. // 判断按钮
  473. fo.setOperatorEntity(operatorEntity);
  474. fo.setNodeEntity(nodeEntity);
  475. fo.setRecordEntity(recordEntity);
  476. fo.setNodeEntityList(nodeEntities);
  477. fo.setFlowId(jsonInfoVO.getFlowId());
  478. ButtonModel model = buttonUtil.handleButton(fo);
  479. vo.setBtnInfo(model);
  480. //vo.setDraftData(draft);
  481. RevokeEntity revokeEntity = revokeService.getRevokeTask(id);
  482. if (null != revokeEntity) {
  483. Map<String, Object> revokeMap = JsonUtil.stringToMap(revokeEntity.getFormData());
  484. vo.setFormData(revokeMap);
  485. VisualdevEntity formInfo = new VisualdevEntity();
  486. formInfo.setEnCode(FlowNature.REVOKE_FORM_CODE);
  487. formInfo.setType(2);
  488. vo.setFormInfo(formInfo);
  489. TaskVo taskInfo = vo.getTaskInfo();
  490. if (null != taskInfo) {
  491. taskInfo.setIsRevokeTask(true);
  492. }
  493. } else {
  494. vo.setFormData(draft);
  495. // 获取表单
  496. if (null != formId) {
  497. VisualdevEntity formInfo = serviceUtil.getFormInfo(formId);
  498. vo.setFormInfo(formInfo);
  499. }
  500. }
  501. return vo;
  502. }
  503. @Override
  504. public CandidateCheckVo checkCandidates(String id, CandidateCheckFo fo) throws WorkFlowException {
  505. CandidateCheckVo vo = new CandidateCheckVo();
  506. List<CandidateListModel> list = new ArrayList<>();
  507. String flowId = fo.getFlowId();
  508. String nodeCode = null;
  509. Map<String, Object> formData = fo.getFormData();
  510. String taskId = fo.getId();
  511. TemplateEntity template;
  512. TemplateJsonEntity jsonEntity = templateJsonService.getById(flowId);
  513. if (null == jsonEntity) {
  514. template = templateService.getInfo(flowId);
  515. jsonEntity = templateJsonService.getInfo(template.getFlowId());
  516. } else {
  517. template = templateService.getInfo(jsonEntity.getTemplateId());
  518. }
  519. if (ObjectUtil.equals(id, FlowNature.ParentId)) {
  520. if (!ObjectUtil.equals(template.getStatus(), TemplateStatueEnum.up.getCode())) {
  521. throw new WorkFlowException(MsgCode.WF140.get());
  522. }
  523. } else {
  524. List<Integer> templateStatus = ImmutableList.of(TemplateStatueEnum.up.getCode(), TemplateStatueEnum.downContinue.getCode());
  525. if (!templateStatus.contains(template.getStatus())) {
  526. throw new WorkFlowException(MsgCode.WF140.get());
  527. }
  528. }
  529. if (StringUtil.isNotBlank(fo.getDelegateUser())) {
  530. List<String> launchPermission = serviceUtil.getPermission(fo.getDelegateUser());
  531. if (ObjectUtil.equals(template.getVisibleType(), FlowNature.Authority) && !launchPermission.contains(template.getId())) {
  532. throw new WorkFlowException(MsgCode.WF129.get());
  533. }
  534. }
  535. List<TemplateNodeEntity> nodeEntities = templateNodeService.getList(jsonEntity.getId());
  536. Map<String, NodeModel> nodes = new HashMap<>();
  537. for (TemplateNodeEntity nodeEntity : nodeEntities) {
  538. nodes.put(nodeEntity.getNodeCode(), JsonUtil.getJsonToBean(nodeEntity.getNodeJson(), NodeModel.class));
  539. }
  540. NodeModel global = nodes.get(NodeEnum.global.getType());
  541. TemplateNodeEntity currentNode;
  542. OperatorEntity operatorEntity = new OperatorEntity();
  543. // 默认获取开始节点编码
  544. if (StringUtil.equals(id, FlowNature.ParentId)) {
  545. currentNode = nodeEntities.stream()
  546. .filter(e -> StringUtil.equals(NodeEnum.start.getType(), e.getNodeType())).findFirst().orElse(null);
  547. } else {
  548. operatorEntity = operatorService.getInfo(id);
  549. if (operatorEntity == null) {
  550. throw new WorkFlowException(MsgCode.FA001.get());
  551. }
  552. // 加签的经办无需选择候选人
  553. if (!ObjectUtil.equals(operatorEntity.getParentId(), FlowNature.ParentId)) {
  554. vo.setList(list);
  555. return vo;
  556. }
  557. String finalNodeCode = operatorEntity.getNodeCode();
  558. currentNode = nodeEntities.stream().filter(e -> StringUtil.equals(finalNodeCode, e.getNodeCode())).findFirst().orElse(null);
  559. taskId = operatorEntity.getTaskId();
  560. }
  561. RevokeEntity revokeEntity = revokeService.getRevokeTask(taskId);
  562. if (null != revokeEntity) {
  563. vo.setList(list);
  564. return vo;
  565. }
  566. if (null == currentNode) {
  567. throw new WorkFlowException(MsgCode.WF076.get());
  568. }
  569. nodeCode = currentNode.getNodeCode();
  570. NodeModel currentNodeModel = nodes.get(nodeCode);
  571. String divideRule = currentNodeModel.getDivideRule();
  572. boolean branchFlow = ObjectUtil.equals(DivideRuleEnum.CHOOSE.getType(), divideRule);
  573. UserInfo userInfo = UserProvider.getUser();
  574. // 判断条件
  575. TaskEntity taskEntity = this.getById(taskId);
  576. if (taskEntity == null) {
  577. FlowModel flowModel = new FlowModel();
  578. flowModel.setFlowId(flowId);
  579. flowModel.setFormData(formData);
  580. flowModel.setDelegateUser(fo.getDelegateUser());
  581. flowModel.setUserInfo(userInfo);
  582. flowModel.setJsonEntity(jsonEntity);
  583. taskEntity = this.createEntity(flowModel, template, nodes);
  584. }
  585. if (ObjectUtil.isNotEmpty(taskEntity.getRejectDataId())) {
  586. return vo;
  587. }
  588. taskUtil.getGlobalParam(taskEntity, nodes.get(nodeCode), nodes.get(NodeEnum.global.getType()), formData);
  589. FlowMethod flowMethod = new FlowMethod();
  590. flowMethod.setDeploymentId(jsonEntity.getFlowableId());
  591. flowMethod.setNodeCode(nodeCode);
  592. flowMethod.setFormData(formData);
  593. flowMethod.setNodes(nodes);
  594. flowMethod.setTaskEntity(taskEntity);
  595. flowMethod.setUserInfo(userInfo);
  596. flowMethod.setIsCandidates(false);
  597. Map<String, Boolean> resMap = conditionService.handleCondition(flowMethod);
  598. CounterSignConfig counterSignConfig = currentNodeModel.getCounterSignConfig();
  599. boolean delay = ObjectUtil.equals(counterSignConfig.getCalculateType(), FlowNature.CALCULATE_TYPE_DELAY);
  600. // 全是false,说明没有分支可走
  601. if (!branchFlow && !delay) {
  602. // 拒绝 且 配置拒绝不允许继续流转 直接返回
  603. if (ObjectUtil.equals(fo.getHandleStatus(), FlowNature.RejectCompletion) && !global.getHasContinueAfterReject()) {
  604. vo.setList(list);
  605. return vo;
  606. }
  607. conditionService.checkCondition(resMap, nodes);
  608. } else {
  609. // 选择分支、且不是最后一个审批人,直接返回
  610. // 删除原先存在的下一级候选人
  611. NextOrPrevFo nextOrPrevFo = new NextOrPrevFo();
  612. nextOrPrevFo.setDeploymentId(jsonEntity.getFlowableId());
  613. nextOrPrevFo.setTaskKey(currentNode.getNodeCode());
  614. List<FlowableNodeModel> nextModels = flowAbleUrl.getNext(nextOrPrevFo);
  615. List<String> nextCodes = nextModels.stream().map(FlowableNodeModel::getId).collect(Collectors.toList());
  616. if (CollectionUtil.isNotEmpty(nextCodes)) {
  617. candidatesService.deleteByCodes(taskId, nextCodes);
  618. }
  619. operatorEntity.setHandleStatus(fo.getHandleStatus());
  620. flowMethod.setOperatorEntity(operatorEntity);
  621. flowMethod.setNodeModel(currentNodeModel);
  622. flowMethod.setHandleStatus(fo.getHandleStatus());
  623. flowMethod.setAuditFlag(true);
  624. boolean auditRes = operatorUtil.checkAudit(flowMethod);
  625. if (!auditRes) {
  626. return vo;
  627. }
  628. if (ObjectUtil.equals(flowMethod.getHandleStatus(), FlowNature.RejectCompletion) && !global.getHasContinueAfterReject()) {
  629. return vo;
  630. }
  631. }
  632. List<String> typeList = ImmutableList.of(NodeEnum.eventTrigger.getType(), NodeEnum.timeTrigger.getType(),
  633. NodeEnum.noticeTrigger.getType(), NodeEnum.webhookTrigger.getType(), NodeEnum.trigger.getType());
  634. List<String> connectList = global.getConnectList();
  635. List<String> flows = flowMethod.getOutgoingFlows();
  636. // 判断排他
  637. boolean isExclusive = ObjectUtil.equals(currentNodeModel.getDivideRule(), DivideRuleEnum.EXCLUSIVE.getType());
  638. boolean exclusive = false;
  639. // 根据true的分支获取节点
  640. for (String key : flows) {
  641. if (!connectList.contains(key)) {
  642. continue;
  643. }
  644. if (!branchFlow) {
  645. if (!resMap.get(key)) {
  646. continue;
  647. }
  648. if (exclusive) { // 标识为true,说明排他的第一个条件为true
  649. break;
  650. }
  651. if (isExclusive) {// 排他网关 变更标识
  652. exclusive = true;
  653. }
  654. }
  655. // 获取连接线的目标节点
  656. List<String> nodeKey = flowAbleUrl.getTaskKeyAfterFlow(jsonEntity.getFlowableId(), key);
  657. if (CollectionUtil.isEmpty(nodeKey)) {
  658. continue;
  659. }
  660. NodeModel nodeModel = nodes.get(nodeKey.get(0));
  661. if (null == nodeModel) {
  662. continue;
  663. }
  664. if (typeList.contains(nodeModel.getType())) {
  665. continue;
  666. }
  667. //处理全局的数据传递
  668. Map<String, Object> dataMap = new HashMap<>();
  669. for (String dataKey : formData.keySet()) {
  670. dataMap.put(dataKey, formData.get(dataKey));
  671. dataMap.put(dataKey + FlowNature.FORM_FIELD_SUFFIX, formData.get(dataKey));
  672. }
  673. FlowMethod jsonToBean = JsonUtil.getJsonToBean(flowMethod, FlowMethod.class);
  674. jsonToBean.setNodeModel(nodeModel);
  675. jsonToBean.setNodeEntityList(nodeEntities);
  676. jsonToBean.setDeploymentId(jsonEntity.getFlowableId());
  677. List<Assign> assignList = nodeModel.getAssignList().stream().filter(t -> t.getNodeId().equals(currentNode.getNodeCode())).collect(Collectors.toList());
  678. Map<String, Object> nodeDataAll = taskUtil.formData(dataMap, assignList, taskEntity, jsonToBean);
  679. taskUtil.getGlobalParam(taskEntity, nodeModel, nodes.get(NodeEnum.global.getType()), nodeDataAll);
  680. operatorEntity.setHandleId(StringUtil.isEmpty(operatorEntity.getHandleId()) ? taskEntity.getCreatorUserId() : operatorEntity.getHandleId());
  681. jsonToBean.setNodeEntityList(nodeEntities);
  682. jsonToBean.setNodeEntity(nodeEntities.stream().filter(t -> t.getNodeCode().equals(nodeKey.get(0))).findFirst().orElse(new TemplateNodeEntity()));
  683. FlowModel flowModel = new FlowModel();
  684. flowModel.setOperatorEntity(operatorEntity);
  685. flowModel.setDeploymentId(jsonEntity.getFlowableId());
  686. flowModel.setFormData(nodeDataAll);
  687. jsonToBean.setFlowModel(flowModel);
  688. getCandidateListModel(jsonToBean, list);
  689. List<String> nextTypeList = ImmutableList.of(NodeEnum.subFlow.getType(), NodeEnum.outside.getType());
  690. if (nextTypeList.contains(nodeModel.getType())) {
  691. // 判断子流程、外部节点,获取审批节点
  692. jsonToBean.setNodeCode(nodeModel.getNodeId());
  693. jsonToBean.setNextSubFlow(true);
  694. List<NodeModel> nextApprover = taskUtil.getNextApprover(jsonToBean);
  695. for (NodeModel node : nextApprover) {
  696. List<Assign> nodeAssignList = node.getAssignList().stream().filter(t -> t.getNodeId().equals(currentNode.getNodeCode())).collect(Collectors.toList());
  697. flowModel.setFormData(taskUtil.formData(dataMap, nodeAssignList, taskEntity, jsonToBean));
  698. taskUtil.getGlobalParam(taskEntity, node, nodes.get(NodeEnum.global.getType()), nodeDataAll);
  699. jsonToBean.setNodeModel(node);
  700. jsonToBean.setNodeEntity(nodeEntities.stream().filter(t -> t.getNodeCode().equals(node.getNodeId())).findFirst().orElse(new TemplateNodeEntity()));
  701. getCandidateListModel(jsonToBean, list);
  702. }
  703. }
  704. }
  705. // 获取已选择的候选人
  706. Integer counterSign = currentNodeModel.getCounterSign();
  707. if (StringUtil.isNotBlank(taskId) && !ObjectUtil.equals(counterSign, FlowNature.FixedApprover)) {
  708. for (CandidateListModel model : list) {
  709. List<CandidatesEntity> candidates = candidatesService.getList(taskId, model.getNodeCode());
  710. String candidateStr = candidates.stream().map(CandidatesEntity::getCandidates).collect(Collectors.joining(","));
  711. if (StringUtil.isNotEmpty(candidateStr)) {
  712. List<String> selected = new ArrayList<>();
  713. List<String> userIds = Arrays.stream(candidateStr.split(",")).distinct().collect(Collectors.toList());
  714. List<UserEntity> userList = serviceUtil.getUserName(userIds);
  715. for (UserEntity user : userList) {
  716. selected.add(user.getRealName() + "/" + user.getAccount());
  717. }
  718. model.setSelected(String.join(";", selected));
  719. }
  720. }
  721. }
  722. if (branchFlow) {
  723. vo.setType(1);
  724. list = list.stream().peek(e -> e.setIsBranchFlow(true)).collect(Collectors.toList());
  725. } else {
  726. CandidateListModel listModel = list.stream().filter(e -> ObjectUtil.equals(e.getIsCandidates(), true)).findFirst().orElse(null);
  727. if (null != listModel) {
  728. vo.setType(2);
  729. }
  730. }
  731. vo.setList(list);
  732. return vo;
  733. }
  734. public void getCandidateListModel(FlowMethod flowMethod, List<CandidateListModel> list) throws WorkFlowException {
  735. NodeModel nodeModel = flowMethod.getNodeModel();
  736. CandidateListModel listModel = list.stream().filter(e -> ObjectUtil.equals(nodeModel.getNodeId(), e.getNodeCode())).findFirst().orElse(null);
  737. if (null != listModel) {
  738. return;
  739. }
  740. CandidateListModel model = new CandidateListModel();
  741. model.setNodeCode(nodeModel.getNodeId());
  742. model.setNodeName(nodeModel.getNodeName());
  743. boolean isCandidate = nodeModel.getIsCandidates();
  744. model.setIsCandidates(isCandidate);
  745. if (isCandidate) {
  746. List<String> userIds = taskUtil.userListAll(flowMethod);
  747. List<UserEntity> users = serviceUtil.getUserName(userIds, true);
  748. model.setHasCandidates(!users.isEmpty());
  749. model.setSelectIdList(users.stream().map(UserEntity::getId).collect(Collectors.toList()));
  750. }
  751. list.add(model);
  752. }
  753. @Override
  754. public List<CandidateUserVo> getCandidateUser(String id, CandidateCheckFo fo) throws WorkFlowException {
  755. TemplateJsonEntity jsonEntity = templateJsonService.getById(fo.getFlowId());
  756. if (null == jsonEntity) {
  757. TemplateEntity template = templateService.getInfo(fo.getFlowId());
  758. jsonEntity = templateJsonService.getInfo(template.getFlowId());
  759. }
  760. List<TemplateNodeEntity> nodeEntities = templateNodeService.getList(jsonEntity.getId());
  761. Map<String, NodeModel> nodes = new HashMap<>();
  762. for (TemplateNodeEntity nodeEntity : nodeEntities) {
  763. nodes.put(nodeEntity.getNodeCode(), JsonUtil.getJsonToBean(nodeEntity.getNodeJson(), NodeModel.class));
  764. }
  765. NodeModel nodeModel = nodes.get(fo.getNodeCode());
  766. if (null == nodeModel) {
  767. throw new WorkFlowException(MsgCode.WF076.get());
  768. }
  769. // 获取候选人
  770. CandidateCheckVo candidateCheckVo = checkCandidates(id, fo);
  771. List<CandidateListModel> list = candidateCheckVo.getList();
  772. Map<String, List<CandidateListModel>> nodeMap = list.stream().collect(Collectors.groupingBy(CandidateListModel::getNodeCode));
  773. List<CandidateListModel> candidateList = nodeMap.get(fo.getNodeCode()) != null ? nodeMap.get(fo.getNodeCode()) : new ArrayList<>();
  774. List<String> userIds = new ArrayList<>();
  775. for (CandidateListModel model : candidateList) {
  776. userIds.addAll(model.getSelectIdList());
  777. }
  778. // 候选人范围过滤
  779. UserInfo userInfo = UserProvider.getUser();
  780. UserEntity userEntity = serviceUtil.getUserInfo(userInfo.getUserId());
  781. OperatorEntity operator = operatorService.getById(id);
  782. if (null != operator) {
  783. userEntity = serviceUtil.getUserInfo(operator.getHandleId());
  784. } else {
  785. if (StringUtil.isNotBlank(fo.getDelegateUser())) {
  786. userEntity = serviceUtil.getUserInfo(fo.getDelegateUser());
  787. }
  788. }
  789. LaunchUserEntity flowUser = new LaunchUserEntity();
  790. taskUtil.launchUser(flowUser, userEntity);
  791. taskUtil.rule(userIds, flowUser, nodeModel.getExtraRule());
  792. List<CandidateUserVo> vos = taskUtil.getUserModel(userIds, fo);
  793. return vos;
  794. }
  795. @DSTransactional
  796. @Override
  797. public void batchSaveOrSubmit(FlowModel flowModel) throws Exception {
  798. UserInfo userInfo = flowModel.getUserInfo();
  799. if (null == userInfo) {
  800. userInfo = UserProvider.getUser();
  801. flowModel.setUserInfo(userInfo);
  802. }
  803. String delegateUser = flowModel.getDelegateUser();
  804. if (StringUtil.isBlank(delegateUser)) {
  805. this.saveOrSubmit(flowModel);
  806. } else {
  807. FlowModel model = JsonUtil.getJsonToBean(flowModel, FlowModel.class);
  808. model.setDelegateUser(userInfo.getUserId());
  809. model.setUserId(delegateUser);
  810. UserEntity userEntity = serviceUtil.getUserInfo(delegateUser);
  811. if (null != userEntity) {
  812. UserInfo info = model.getUserInfo();
  813. info.setUserName(userEntity.getRealName());
  814. info.setUserAccount(userEntity.getAccount());
  815. info.setUserId(userEntity.getId());
  816. model.setUserInfo(info);
  817. }
  818. this.saveOrSubmit(model);
  819. // 赋值给原来的FlowModel
  820. BeanUtil.copyProperties(model, flowModel);
  821. }
  822. // 保存表单数据
  823. FlowContextHolder.deleteFormOperator();
  824. Map<String, Map<String, Object>> allData = FlowContextHolder.getAllData();
  825. Map<String, List<Map<String, Object>>> formOperates = FlowContextHolder.getFormOperates();
  826. List<String> writeIdList = FlowContextHolder.getWriteIdList();
  827. for (String idAll : writeIdList) {
  828. String[] idList = idAll.split(JnpfConst.SIDE_MARK);
  829. List<Map<String, Object>> operates = formOperates.get(idAll);
  830. Map<String, Object> formData = allData.get(idAll);
  831. formData = formData == null ? new HashMap<>() : formData;
  832. String flowId = (String) formData.get(FlowFormConstant.FLOWID);
  833. FlowFormDataModel formDataModel = FlowFormDataModel.builder().formId(idList[1]).id(idList[0]).map(formData).formOperates(operates).flowId(flowId).isTransfer(true).build();
  834. serviceUtil.saveOrUpdateFormData(formDataModel);
  835. }
  836. FlowContextHolder.clearAll();
  837. }
  838. // 提交或暂存
  839. @Override
  840. public void saveOrSubmit(FlowModel flowModel) throws Exception {
  841. TemplateEntity templateEntity = null;
  842. TemplateJsonEntity jsonEntity = templateJsonService.getById(flowModel.getFlowId());
  843. if (null == jsonEntity) {
  844. templateEntity = templateService.getInfo(flowModel.getFlowId());
  845. jsonEntity = templateJsonService.getInfo(templateEntity.getFlowId());
  846. } else {
  847. templateEntity = templateService.getInfo(jsonEntity.getTemplateId());
  848. }
  849. UserInfo userInfo = flowModel.getUserInfo();
  850. List<String> branchList = flowModel.getBranchList();
  851. //taskUtil.checkLaunchPermission(userInfo.getUserId(), templateEntity);
  852. // 获取节点
  853. List<TemplateNodeEntity> nodeEntityList = templateNodeService.getList(jsonEntity.getId());
  854. if (CollectionUtil.isEmpty(nodeEntityList)) {
  855. throw new WorkFlowException(MsgCode.WF076.get());
  856. }
  857. Map<String, NodeModel> nodes = new HashMap<>();
  858. for (TemplateNodeEntity nodeEntity : nodeEntityList) {
  859. nodes.put(nodeEntity.getNodeCode(), JsonUtil.getJsonToBean(nodeEntity.getNodeJson(), NodeModel.class));
  860. }
  861. flowModel.setJsonEntity(jsonEntity);
  862. TaskEntity entity = this.createEntity(flowModel, templateEntity, nodes);
  863. // 开始节点
  864. TemplateNodeEntity nodeEntity = nodeEntityList.stream()
  865. .filter(e -> StringUtil.equals(NodeEnum.start.getType(), e.getNodeType())).findFirst().orElse(null);
  866. if (null == nodeEntity) {
  867. throw new WorkFlowException(MsgCode.WF076.get());
  868. }
  869. String nodeCode = nodeEntity.getNodeCode();
  870. // 传递部署id、节点集合
  871. String deploymentId = jsonEntity.getFlowableId();
  872. flowModel.setDeploymentId(deploymentId);
  873. flowModel.setNodeEntityList(nodeEntityList);
  874. flowModel.setNodes(nodes);
  875. flowModel.setNodeEntity(nodeEntity);
  876. NodeModel nodeModel = JsonUtil.getJsonToBean(nodeEntity.getNodeJson(), NodeModel.class);
  877. // 表单主键
  878. String formId = nodeEntity.getFormId();
  879. Map<String, Object> data = flowModel.getFormData();
  880. data.put(FlowFormConstant.FLOWID, jsonEntity.getId());
  881. FlowMethod flowMethod = new FlowMethod();
  882. flowMethod.setDeploymentId(deploymentId);
  883. flowMethod.setNodeCode(nodeCode);
  884. flowMethod.setFormData(data);
  885. flowMethod.setNodes(nodes);
  886. flowMethod.setTaskEntity(entity);
  887. // flowMethod.setJsonEntity(jsonEntity);
  888. operatorUtil.addTask(ImmutableList.of(entity.getId()));
  889. FlowFormDataModel model = new FlowFormDataModel();
  890. model.setFormId(formId);
  891. model.setId(entity.getId());
  892. model.setFormOperates(nodeModel.getFormOperates());
  893. model.setMap(flowModel.getFormData());
  894. model.setFlowId(jsonEntity.getId());
  895. if (ObjectUtil.equals(TaskStatusEnum.TO_BE_SUBMIT.getCode(), flowModel.getStatus())) {
  896. // 生成任务,保存表单数据
  897. if (flowModel.getSubFlow()) {
  898. model.setIsTransfer(true);
  899. }
  900. // 菜单入口、编辑
  901. if (Objects.equals(flowModel.getIsFlow(), 0)) {
  902. serviceUtil.saveOrUpdateFormData(model);
  903. entity.setLastModifyTime(new Date());
  904. entity.setLastModifyUserId(null != userInfo ? userInfo.getUserId() : UserProvider.getLoginUserId());
  905. this.updateById(entity);
  906. flowModel.setTaskEntity(entity);
  907. return;
  908. }
  909. if (StringUtil.isEmpty(flowModel.getId())) {
  910. entity.setStatus(TaskStatusEnum.TO_BE_SUBMIT.getCode());
  911. if (this.save(entity)) {
  912. // 保存表单数据
  913. serviceUtil.saveOrUpdateFormData(model);
  914. }
  915. } else {
  916. // 我发起的暂存 直接修改表单数据
  917. serviceUtil.saveOrUpdateFormData(model);
  918. }
  919. flowModel.setTaskEntity(entity);
  920. } else if (ObjectUtil.equals(TaskStatusEnum.RUNNING.getCode(), flowModel.getStatus())) {
  921. // 退回到发起
  922. if (null != entity.getRejectDataId()) {
  923. serviceUtil.saveOrUpdateFormData(model);
  924. RejectDataEntity rejectData = rejectDataService.getInfo(entity.getRejectDataId());
  925. String taskJson = rejectData.getTaskJson();
  926. TaskEntity srcTask = JsonUtil.getJsonToBean(taskJson, TaskEntity.class);
  927. srcTask.setRejectDataId(rejectData.getId());
  928. OperatorEntity operator = new OperatorEntity();
  929. operator.setNodeCode(rejectData.getNodeCode());
  930. flowModel.setOperatorEntity(operator);
  931. flowModel.setTaskEntity(srcTask);
  932. operatorUtil.handleRejectData(flowModel);
  933. // 记录
  934. flowMethod.setFlowModel(flowModel);
  935. flowMethod.setType(RecordEnum.submit.getCode());
  936. OperatorEntity operatorEntity = new OperatorEntity();
  937. operatorEntity.setNodeCode(nodeEntity.getNodeCode());
  938. operatorEntity.setNodeName(nodeModel.getNodeName());
  939. operatorEntity.setTaskId(entity.getId());
  940. if (StringUtil.isNotBlank(flowModel.getUserId())) {
  941. flowMethod.setHandId(flowModel.getUserId());
  942. }
  943. flowMethod.setOperatorEntity(operatorEntity);
  944. recordUtil.createRecord(flowMethod);
  945. return;
  946. }
  947. // 判断条件
  948. Map<String, Boolean> resMap = new HashMap<>();
  949. if (branchList.isEmpty()) {
  950. resMap = conditionService.handleCondition(flowMethod);
  951. // 全是false,说明没有分支可走
  952. conditionService.checkCondition(resMap, nodes);
  953. // 判断候选人
  954. //checkCandidateOfSubmit(flowModel.getCandidateList(), flowModel.getFlowId(), flowModel.getFormData(), entity.getId());
  955. // Map<String, List<String>> errorRuleUserList = flowModel.getErrorRuleUserList();
  956. // if (CollectionUtil.isEmpty(errorRuleUserList)) {
  957. // List<NodeModel> nextApprover = taskUtil.getNextApprover(flowMethod);
  958. // flowModel.setTaskEntity(entity);
  959. // taskUtil.checkNextError(flowModel, nextApprover);
  960. // }
  961. } else {
  962. // 选择分支的处理
  963. resMap = conditionService.getForBranch(flowMethod, branchList);
  964. }
  965. // 引擎启动的变量
  966. Map<String, Object> variables = new HashMap<>(resMap);
  967. // 生成引擎实例
  968. String instanceId = entity.getInstanceId();
  969. if (entity.getInstanceId() == null) {
  970. taskLineService.create(entity.getId(), resMap);
  971. instanceId = flowAbleUrl.startInstance(jsonEntity.getFlowableId(), variables);
  972. entity.setInstanceId(instanceId);
  973. }
  974. entity.setEngineType(1);
  975. entity.setStatus(TaskStatusEnum.RUNNING.getCode());
  976. entity.setStartTime(new Date());
  977. // 生成任务
  978. try {
  979. TaskEntity task = this.getById(entity.getId());
  980. if (null == task) {
  981. this.save(entity);
  982. } else {
  983. entity.setStatus(TaskStatusEnum.RUNNING.getCode());
  984. this.updateById(entity);
  985. }
  986. flowModel.setTaskEntity(entity);
  987. serviceUtil.saveOrUpdateFormData(model);
  988. data = serviceUtil.infoData(formId, entity.getId());
  989. // 表单数据存储
  990. data.put(FlowFormConstant.FLOWID, jsonEntity.getId());
  991. FlowContextHolder.addChildData(entity.getId(), nodeEntity.getFormId(), data, nodeModel.getFormOperates(), false);
  992. flowModel.setFormData(data);
  993. // 流程参数
  994. NodeModel global = nodes.get(NodeEnum.global.getType());
  995. taskUtil.updateGlobalParam(entity, nodeModel, global, flowModel.getFormData());
  996. // 记录
  997. flowMethod.setFlowModel(flowModel);
  998. flowMethod.setType(RecordEnum.submit.getCode());
  999. OperatorEntity operatorEntity = new OperatorEntity();
  1000. operatorEntity.setNodeCode(nodeEntity.getNodeCode());
  1001. operatorEntity.setNodeName(nodeModel.getNodeName());
  1002. operatorEntity.setTaskId(entity.getId());
  1003. if (StringUtil.isNotBlank(flowModel.getUserId())) {
  1004. flowMethod.setHandId(flowModel.getUserId());
  1005. }
  1006. operatorEntity.setHandleTime(entity.getStartTime());
  1007. flowMethod.setOperatorEntity(operatorEntity);
  1008. recordUtil.createRecord(flowMethod);
  1009. // 节点记录
  1010. NodeRecordModel nodeRecordModel = new NodeRecordModel();
  1011. nodeRecordModel.setTaskId(entity.getId());
  1012. nodeRecordModel.setNodeCode(nodeEntity.getNodeCode());
  1013. nodeRecordModel.setNodeName(nodeModel.getNodeName());
  1014. nodeRecordModel.setNodeStatus(NodeStateEnum.submit.getCode());
  1015. nodeRecordService.create(nodeRecordModel);
  1016. // 保存候选人、异常人
  1017. candidatesService.create(flowModel, entity.getId(), nodeEntityList, null);
  1018. // 保存发起用户信息
  1019. launchUserService.createLaunchUser(entity.getId(), entity.getCreatorUserId());
  1020. // 生成经办
  1021. List<OperatorEntity> operatorEntities = operatorService.handleOperator(flowModel);
  1022. // 系统审批
  1023. operatorUtil.systemAudit();
  1024. // 消息
  1025. FlowMsgModel flowMsgModel = new FlowMsgModel();
  1026. flowMsgModel.setNodeList(nodeEntityList);
  1027. flowMsgModel.setTaskEntity(entity);
  1028. flowMsgModel.setFlowModel(flowModel);
  1029. flowMsgModel.setOperatorList(operatorEntities);
  1030. flowMsgModel.setFormData(FlowContextHolder.getAllData());
  1031. msgUtil.message(flowMsgModel);
  1032. } catch (WorkFlowException e) {
  1033. log.error("提交异常", e);
  1034. // 异常,手动删除实例
  1035. flowAbleUrl.deleteInstance(instanceId, "submitException");
  1036. throw e;
  1037. }
  1038. }
  1039. }
  1040. public TaskEntity createEntity(FlowModel fo, TemplateEntity templateEntity, Map<String, NodeModel> nodes) throws WorkFlowException {
  1041. UserInfo user = UserProvider.getUser();
  1042. String userName = user.getUserName();
  1043. String userId = user.getUserId();
  1044. UserInfo userInfo = fo.getUserInfo();
  1045. if (null != userInfo) {
  1046. if (StringUtil.isBlank(fo.getUserId())) {
  1047. fo.setUserId(userInfo.getUserId());
  1048. }
  1049. userName = userInfo.getUserName();
  1050. userId = userInfo.getUserId();
  1051. }
  1052. Map<String, Object> data = fo.getFormData() == null ? new HashMap<>() : fo.getFormData();
  1053. data.put(FlowConstant.FLOW_FULL_NAME, templateEntity.getFullName());
  1054. data.put(FlowConstant.FLOW_FULL_CODE, templateEntity.getEnCode());
  1055. data.put(FlowConstant.LAUNCH_USER_NAME, userName);
  1056. data.put(FlowConstant.LAUNCH_TIME, DateUtil.daFormat(new Date()));
  1057. data.put(FlowConstant.USER_NAME, userName);
  1058. NodeModel global = nodes.get(NodeEnum.global.getType());
  1059. String titleContent = !FlowNature.TitleType.equals(global.getTitleType()) ? global.getTitleContent() : global.getDefaultContent();
  1060. if (StringUtil.isNotEmpty(fo.getId())) {
  1061. TaskEntity taskEntity = this.getById(fo.getId());
  1062. if (null != taskEntity) {
  1063. data.put(FlowConstant.FLOW_NAME, taskEntity.getFullName());
  1064. if (StringUtil.isNotBlank(fo.getDelegateUser())) {
  1065. taskEntity.setDelegateUserId(fo.getDelegateUser());
  1066. }
  1067. taskEntity.setCreatorUserId(StringUtil.isNotBlank(fo.getUserId()) ? fo.getUserId() : userId);
  1068. // 流程名称
  1069. if (ObjectUtil.equals(TaskStatusEnum.RUNNING.getCode(), fo.getStatus())
  1070. && ObjectUtil.equals(taskEntity.getStatus(), TaskStatusEnum.TO_BE_SUBMIT.getCode())) {
  1071. String fullName = FlowJsonUtil.field(titleContent, data, "1");
  1072. taskEntity.setFullName(fullName);
  1073. }
  1074. return taskEntity;
  1075. }
  1076. }
  1077. TaskEntity entity = new TaskEntity();
  1078. entity.setType(fo.getIsFlow());
  1079. if (StringUtil.isNotEmpty(fo.getId())) {
  1080. entity.setId(fo.getId());
  1081. } else {
  1082. entity.setId(RandomUtil.uuId());
  1083. }
  1084. entity.setUrgent(fo.getFlowUrgent());
  1085. entity.setSortCode(0L);
  1086. if (StringUtil.isNotBlank(fo.getDelegateUser())) {
  1087. entity.setDelegateUserId(fo.getDelegateUser());
  1088. }
  1089. // 发起人就是创建人
  1090. entity.setCreatorUserId(StringUtil.isNotBlank(fo.getUserId()) ? fo.getUserId() : userId);
  1091. entity.setCreatorTime(new Date());
  1092. FileConfig fileConfig = global.getFileConfig();
  1093. entity.setIsFile(fileConfig.getOn() ? 0 : null);
  1094. // 流程名称
  1095. String fullName = templateEntity.getFullName();
  1096. if (!ObjectUtil.equals(fo.getStatus(), TaskStatusEnum.TO_BE_SUBMIT.getCode())) {
  1097. data.put(FlowConstant.FLOW_NAME, fullName);
  1098. fullName = FlowJsonUtil.field(titleContent, data, "1");
  1099. }
  1100. entity.setParentId(fo.getParentId());
  1101. if (!StringUtil.equals(FlowNature.ParentId, fo.getParentId())) {
  1102. fullName += "(子流程)";
  1103. entity.setSubCode(fo.getSubCode());
  1104. entity.setSubParameter(JsonUtil.getObjectToString(fo.getSubParameter()));
  1105. entity.setIsAsync(fo.getIsAsync());
  1106. }
  1107. entity.setFullName(fullName);
  1108. entity.setDelegateUserId(fo.getDelegateUser());
  1109. entity.setFlowCode(templateEntity.getEnCode());
  1110. entity.setFlowName(templateEntity.getFullName());
  1111. entity.setFlowCategory(templateEntity.getCategory());
  1112. TemplateJsonEntity jsonEntity = fo.getJsonEntity();
  1113. if (null != jsonEntity && StringUtil.isNotBlank(jsonEntity.getVersion())) {
  1114. entity.setFlowVersion(jsonEntity.getVersion());
  1115. } else {
  1116. entity.setFlowVersion(templateEntity.getVersion());
  1117. }
  1118. entity.setTemplateId(templateEntity.getId());
  1119. entity.setFlowId(templateEntity.getFlowId());
  1120. // entity.setIsBatch(1);// 0:否,1:是
  1121. if (templateEntity.getType() != null) {
  1122. entity.setFlowType(templateEntity.getType());
  1123. }
  1124. return entity;
  1125. }
  1126. // 发起撤回
  1127. @DSTransactional
  1128. @Override
  1129. public void recall(String id, FlowModel flowModel) throws WorkFlowException {
  1130. taskUtil.setFlowModel(id, flowModel);
  1131. TaskEntity taskEntity = flowModel.getTaskEntity();
  1132. taskUtil.checkTemplateHide(taskEntity.getTemplateId());
  1133. List<TemplateNodeEntity> nodeEntityList = flowModel.getNodeEntityList();
  1134. if (CollectionUtil.isEmpty(nodeEntityList)) {
  1135. throw new WorkFlowException(MsgCode.WF076.get());
  1136. }
  1137. operatorUtil.addTask(ImmutableList.of(taskEntity.getId()));
  1138. // 开始节点
  1139. TemplateNodeEntity nodeEntity = nodeEntityList.stream()
  1140. .filter(e -> StringUtil.equals(NodeEnum.start.getType(), e.getNodeType())).findFirst().orElse(null);
  1141. if (null == nodeEntity) {
  1142. throw new WorkFlowException(MsgCode.WF076.get());
  1143. }
  1144. NodeModel start = JsonUtil.getJsonToBean(nodeEntity.getNodeJson(), NodeModel.class);
  1145. flowModel.setNodeEntity(nodeEntity);
  1146. flowModel.setIsException(true);
  1147. if (!buttonUtil.checkRecall(flowModel)) {
  1148. throw new WorkFlowException(MsgCode.WF077.get());
  1149. }
  1150. // 删除子流程(判断方法中,存在异步 或 同步子流程已提交 则不允许撤回)
  1151. taskUtil.deleteSubflow(taskEntity.getId(), null);
  1152. // 删除外部节点
  1153. eventLogService.delete(taskEntity.getId(), null);
  1154. // 记录
  1155. FlowMethod flowMethod = new FlowMethod();
  1156. flowMethod.setType(RecordEnum.recall.getCode());
  1157. flowMethod.setFlowModel(flowModel);
  1158. OperatorEntity operatorEntity = new OperatorEntity();
  1159. operatorEntity.setNodeCode(nodeEntity.getNodeCode());
  1160. operatorEntity.setNodeName(start.getNodeName());
  1161. operatorEntity.setTaskId(taskEntity.getId());
  1162. operatorEntity.setHandleId(taskEntity.getCreatorUserId());
  1163. operatorEntity.setHandleTime(new Date());
  1164. flowMethod.setOperatorEntity(operatorEntity);
  1165. recordUtil.createRecord(flowMethod);
  1166. // 节点记录
  1167. NodeRecordModel nodeRecordModel = new NodeRecordModel();
  1168. nodeRecordModel.setTaskId(taskEntity.getId());
  1169. nodeRecordModel.setNodeCode(nodeEntity.getNodeCode());
  1170. nodeRecordModel.setNodeStatus(NodeStateEnum.recall.getCode());
  1171. nodeRecordService.update(nodeRecordModel);
  1172. // 删除经办
  1173. QueryWrapper<OperatorEntity> wrapper = new QueryWrapper<>();
  1174. wrapper.lambda().eq(OperatorEntity::getTaskId, taskEntity.getId());
  1175. operatorService.remove(wrapper);
  1176. // 删除候选人
  1177. candidatesService.deleteByCodes(taskEntity.getId(), null);
  1178. // 删除发起人
  1179. launchUserService.delete(taskEntity.getId());
  1180. // 删除引擎实例
  1181. flowAbleUrl.deleteInstance(taskEntity.getInstanceId(), "retract");
  1182. // 变更任务状态
  1183. UpdateWrapper<TaskEntity> updateWrapper = new UpdateWrapper<>();
  1184. updateWrapper.lambda().eq(TaskEntity::getId, taskEntity.getId())
  1185. .set(TaskEntity::getInstanceId, null)
  1186. .set(TaskEntity::getRejectDataId, null)
  1187. .set(TaskEntity::getCurrentNodeName, FlowNature.START_NAME)
  1188. .set(TaskEntity::getCurrentNodeCode, FlowNature.START_CODE)
  1189. .set(TaskEntity::getStatus, TaskStatusEnum.RECALL.getCode());
  1190. this.update(updateWrapper);
  1191. if (taskEntity.getRejectDataId() != null) {
  1192. rejectDataService.removeById(taskEntity.getRejectDataId());
  1193. }
  1194. }
  1195. // 催办
  1196. @Override
  1197. public boolean press(String id) throws WorkFlowException {
  1198. FlowModel flowModel = new FlowModel();
  1199. taskUtil.setFlowModel(id, flowModel);
  1200. TaskEntity taskEntity = flowModel.getTaskEntity();
  1201. List<TemplateNodeEntity> nodeEntityList = flowModel.getNodeEntityList();
  1202. // 消息
  1203. QueryWrapper<OperatorEntity> queryWrapper = new QueryWrapper<>();
  1204. queryWrapper.lambda().eq(OperatorEntity::getTaskId, id).eq(OperatorEntity::getCompletion, FlowNature.Normal)
  1205. .ne(OperatorEntity::getStatus, OperatorStateEnum.Futility.getCode())
  1206. .isNull(OperatorEntity::getHandleStatus).isNotNull(OperatorEntity::getDuedate);
  1207. List<OperatorEntity> operatorList = operatorService.list(queryWrapper);
  1208. if (operatorList.isEmpty()) {
  1209. return false;
  1210. }
  1211. FlowMsgModel flowMsgModel = new FlowMsgModel();
  1212. flowMsgModel.setNodeList(nodeEntityList);
  1213. flowMsgModel.setFlowModel(flowModel);
  1214. flowMsgModel.setTaskEntity(taskEntity);
  1215. flowMsgModel.setOperatorList(operatorList);
  1216. flowMsgModel.setPress(true);
  1217. msgUtil.message(flowMsgModel);
  1218. return true;
  1219. }
  1220. @DSTransactional
  1221. @Override
  1222. public void revoke(String id, FlowModel flowModel) throws Exception {
  1223. taskUtil.setFlowModel(id, flowModel);
  1224. TaskEntity taskEntity = flowModel.getTaskEntity();
  1225. if (!TaskStatusEnum.PASSED.getCode().equals(taskEntity.getStatus())) {
  1226. throw new WorkFlowException(MsgCode.WF078.get());
  1227. }
  1228. // 处理撤销表单的数据
  1229. taskUtil.submitOfRevoke(flowModel);
  1230. }
  1231. @DSTransactional
  1232. @Override
  1233. public List<TaskEntity> delete(String id) throws Exception {
  1234. TaskEntity entity = this.getById(id);
  1235. if (null == entity) {
  1236. throw new WorkFlowException(MsgCode.FA001.get());
  1237. }
  1238. if (TaskStatusEnum.PAUSED.getCode().equals(entity.getStatus())) {
  1239. throw new WorkFlowException(MsgCode.WF114.get());
  1240. }
  1241. List<Integer> status = ImmutableList.of(TaskStatusEnum.TO_BE_SUBMIT.getCode(), TaskStatusEnum.RECALL.getCode());
  1242. if (!status.contains(entity.getStatus())) {
  1243. throw new WorkFlowException(MsgCode.WF063.get());
  1244. }
  1245. if (StringUtil.isNotEmpty(entity.getParentId()) && !FlowNature.ParentId.equals(entity.getParentId())) {
  1246. throw new WorkFlowException(entity.getFullName() + MsgCode.WF021.get());
  1247. }
  1248. List<String> idList = ImmutableList.of(entity.getId());
  1249. this.delete(idList);
  1250. List<TaskEntity> list = ImmutableList.of(entity);
  1251. return list;
  1252. }
  1253. @DSTransactional
  1254. @Override
  1255. public void deleteBatch(List<String> ids) throws Exception {
  1256. if (ids.isEmpty()) {
  1257. return;
  1258. }
  1259. List<TaskEntity> taskList = taskUtil.getOrderStaList(ids);
  1260. List<TaskEntity> child = taskList.stream()
  1261. .filter(t -> StringUtil.isNotEmpty(t.getParentId()) && !FlowNature.ParentId.equals(t.getParentId())).collect(Collectors.toList());
  1262. if (!child.isEmpty()) {
  1263. throw new WorkFlowException(child.get(0).getFullName() + MsgCode.WF021.get());
  1264. }
  1265. List<TaskEntity> taskStatusList = new ArrayList<>();
  1266. for (String id : ids) {
  1267. List<String> childAllList = this.getChildAllList(id);
  1268. taskStatusList.addAll(taskUtil.getOrderStaList(childAllList));
  1269. }
  1270. List<TaskEntity> taskStatus = taskStatusList.stream()
  1271. .filter(t -> TaskStatusEnum.PAUSED.getCode().equals(t.getStatus())).collect(Collectors.toList());
  1272. if (!taskStatus.isEmpty()) {
  1273. throw new WorkFlowException(taskStatus.get(0).getFullName() + MsgCode.WF113.get());
  1274. }
  1275. this.delete(ids);
  1276. taskUtil.deleteFormData(taskStatusList);
  1277. List<String> instanceIds = taskStatusList.stream()
  1278. .filter(t -> TaskStatusEnum.RUNNING.getCode().equals(t.getStatus()) || TaskStatusEnum.CANCEL.getCode().equals(t.getStatus()))
  1279. .map(TaskEntity::getInstanceId).distinct().collect(Collectors.toList());
  1280. if (CollectionUtil.isNotEmpty(instanceIds)) {
  1281. for (String instanceId : instanceIds) {
  1282. flowAbleUrl.deleteInstance(instanceId, "monitor");
  1283. }
  1284. }
  1285. }
  1286. public void delete(List<String> idList) {
  1287. List<String> idAll = new ArrayList<>();
  1288. this.deleTaskAll(idList, idAll);
  1289. List<String> revokeTaskIds = revokeService.getByTaskId(idAll);
  1290. idAll.addAll(revokeTaskIds);
  1291. if (!idAll.isEmpty()) {
  1292. QueryWrapper<TaskEntity> task = new QueryWrapper<>();
  1293. task.lambda().in(TaskEntity::getId, idAll);
  1294. this.setIgnoreLogicDelete().removeByIds(this.list(task));
  1295. this.clearIgnoreLogicDelete();
  1296. // 候选人
  1297. QueryWrapper<CandidatesEntity> candidates = new QueryWrapper<>();
  1298. candidates.lambda().select(CandidatesEntity::getId);
  1299. candidates.lambda().in(CandidatesEntity::getTaskId, idAll);
  1300. candidatesService.setIgnoreLogicDelete().removeByIds(candidatesService.list(candidates));
  1301. candidatesService.clearIgnoreLogicDelete();
  1302. // 发起人
  1303. QueryWrapper<LaunchUserEntity> launchUser = new QueryWrapper<>();
  1304. launchUser.lambda().select(LaunchUserEntity::getId);
  1305. launchUser.lambda().in(LaunchUserEntity::getTaskId, idAll);
  1306. launchUserService.setIgnoreLogicDelete().removeByIds(launchUserService.list(launchUser));
  1307. launchUserService.clearIgnoreLogicDelete();
  1308. // 评论
  1309. QueryWrapper<CommentEntity> comment = new QueryWrapper<>();
  1310. comment.lambda().select(CommentEntity::getId);
  1311. comment.lambda().in(CommentEntity::getTaskId, idAll);
  1312. commentService.setIgnoreLogicDelete().removeByIds(commentService.list(comment));
  1313. commentService.clearIgnoreLogicDelete();
  1314. // 经办
  1315. QueryWrapper<OperatorEntity> operator = new QueryWrapper<>();
  1316. operator.lambda().select(OperatorEntity::getId);
  1317. operator.lambda().in(OperatorEntity::getTaskId, idAll);
  1318. operatorService.setIgnoreLogicDelete().removeByIds(operatorService.list(operator));
  1319. operatorService.clearIgnoreLogicDelete();
  1320. // 记录
  1321. QueryWrapper<RecordEntity> record = new QueryWrapper<>();
  1322. record.lambda().select(RecordEntity::getId);
  1323. record.lambda().in(RecordEntity::getTaskId, idAll);
  1324. recordService.setIgnoreLogicDelete().removeByIds(recordService.list(record));
  1325. recordService.clearIgnoreLogicDelete();
  1326. // 退回信息
  1327. List<TaskEntity> taskList = this.list(task);
  1328. List<String> rejectDataIds = taskList.stream().map(TaskEntity::getRejectDataId).collect(Collectors.toList());
  1329. if (CollectionUtil.isNotEmpty(rejectDataIds)) {
  1330. QueryWrapper<RejectDataEntity> rejectData = new QueryWrapper<>();
  1331. rejectData.lambda().select(RejectDataEntity::getId);
  1332. rejectData.lambda().in(RejectDataEntity::getId, rejectDataIds);
  1333. rejectDataService.setIgnoreLogicDelete().removeByIds(rejectDataService.list(rejectData));
  1334. rejectDataService.clearIgnoreLogicDelete();
  1335. }
  1336. // 抄送
  1337. QueryWrapper<CirculateEntity> circulate = new QueryWrapper<>();
  1338. circulate.lambda().select(CirculateEntity::getId);
  1339. circulate.lambda().in(CirculateEntity::getTaskId, idAll);
  1340. circulateService.setIgnoreLogicDelete().removeByIds(circulateService.list(circulate));
  1341. circulateService.clearIgnoreLogicDelete();
  1342. // 任务条件
  1343. QueryWrapper<TaskLineEntity> taskLine = new QueryWrapper<>();
  1344. taskLine.lambda().select(TaskLineEntity::getId);
  1345. taskLine.lambda().in(TaskLineEntity::getTaskId, idAll);
  1346. taskLineService.setIgnoreLogicDelete().removeByIds(taskLineService.list(taskLine));
  1347. taskLineService.clearIgnoreLogicDelete();
  1348. // 撤销
  1349. QueryWrapper<RevokeEntity> revoke = new QueryWrapper<>();
  1350. revoke.lambda().select(RevokeEntity::getId);
  1351. revoke.lambda().in(RevokeEntity::getRevokeTaskId, idAll);
  1352. revokeService.setIgnoreLogicDelete().removeByIds(revokeService.list(revoke));
  1353. revokeService.clearIgnoreLogicDelete();
  1354. //节点流转
  1355. QueryWrapper<NodeRecordEntity> nodeRecord = new QueryWrapper<>();
  1356. nodeRecord.lambda().select(NodeRecordEntity::getId);
  1357. nodeRecord.lambda().in(NodeRecordEntity::getTaskId, idAll);
  1358. nodeRecordService.setIgnoreLogicDelete().removeByIds(nodeRecordService.list(nodeRecord));
  1359. nodeRecordService.clearIgnoreLogicDelete();
  1360. //外部事件
  1361. QueryWrapper<EventLogEntity> eventLog = new QueryWrapper<>();
  1362. eventLog.lambda().select(EventLogEntity::getId);
  1363. eventLog.lambda().in(EventLogEntity::getTaskId, idAll);
  1364. eventLogService.setIgnoreLogicDelete().removeByIds(eventLogService.list(eventLog));
  1365. eventLogService.clearIgnoreLogicDelete();
  1366. // 任务流程
  1367. triggerTaskService.deleteByTaskId(idAll);
  1368. }
  1369. }
  1370. @Override
  1371. public void deleTaskAll(List<String> idList, List<String> idAll) {
  1372. idAll.addAll(idList);
  1373. for (String id : idList) {
  1374. List<TaskEntity> taskAll = this.getChildList(id, TaskEntity::getId);
  1375. List<String> list = taskAll.stream().map(TaskEntity::getId).collect(Collectors.toList());
  1376. this.deleTaskAll(list, idAll);
  1377. }
  1378. }
  1379. public List<TaskEntity> getChildList(String id, SFunction<TaskEntity, ?>... columns) {
  1380. return getChildList(ImmutableList.of(id), columns);
  1381. }
  1382. public List<TaskEntity> getChildList(List<String> id, SFunction<TaskEntity, ?>... columns) {
  1383. QueryWrapper<TaskEntity> queryWrapper = new QueryWrapper<>();
  1384. queryWrapper.lambda().select(columns).in(TaskEntity::getParentId, id);
  1385. return this.list(queryWrapper);
  1386. }
  1387. public List<String> getChildAllList(String id) {
  1388. List<String> idAll = new ArrayList<>();
  1389. List<String> idList = ImmutableList.of(id);
  1390. this.deleTaskAll(idList, idAll);
  1391. return idAll;
  1392. }
  1393. public void getChildList(String id, boolean suspend, List<String> list) {
  1394. List<TaskEntity> taskAll = this.getChildList(id, TaskEntity::getId, TaskEntity::getIsAsync);
  1395. if (suspend) {
  1396. taskAll = taskAll.stream().filter(t -> FlowNature.ChildSync.equals(t.getIsAsync())).collect(Collectors.toList());
  1397. }
  1398. for (TaskEntity entity : taskAll) {
  1399. list.add(entity.getId());
  1400. this.getChildList(entity.getId(), suspend, list);
  1401. }
  1402. }
  1403. // 终止与挂起的区别,就是能否在列表中查询到,撤销中不允许终止等操作
  1404. @DSTransactional
  1405. @Override
  1406. public void cancel(String id, FlowModel flowModel, boolean isCancel) throws WorkFlowException {
  1407. if (isCancel) {
  1408. // 任务流程的终止
  1409. TriggerTaskEntity triggerTask = triggerTaskService.getById(id);
  1410. if (null != triggerTask) {
  1411. triggerTask.setStatus(TaskStatusEnum.CANCEL.getCode());
  1412. triggerTaskService.updateById(triggerTask);
  1413. return;
  1414. }
  1415. }
  1416. taskUtil.setFlowModel(id, flowModel);
  1417. TaskEntity taskEntity = flowModel.getTaskEntity();
  1418. taskUtil.isSuspend(taskEntity);
  1419. // 下架的判断
  1420. if (!isCancel) {
  1421. TemplateEntity template = templateService.getById(taskEntity.getTemplateId());
  1422. if (null != template) {
  1423. if (!ObjectUtil.equals(template.getStatus(), TemplateStatueEnum.up.getCode())) {
  1424. throw new WorkFlowException(MsgCode.WF140.get());
  1425. }
  1426. }
  1427. }
  1428. List<String> idList = ImmutableList.of(id);
  1429. List<TaskEntity> taskList = new ArrayList<>();
  1430. // 递归获取子流程
  1431. for (String taskId : idList) {
  1432. List<String> childAllList = this.getChildAllList(taskId);
  1433. taskList.addAll(taskUtil.getOrderStaList(childAllList));
  1434. }
  1435. List<TemplateNodeEntity> nodeEntityList = flowModel.getNodeEntityList();
  1436. for (TaskEntity entity : taskList) {
  1437. taskUtil.isSuspend(entity);
  1438. // 记录
  1439. FlowMethod flowMethod = new FlowMethod();
  1440. flowMethod.setFlowModel(flowModel);
  1441. Integer type = isCancel ? RecordEnum.cancel.getCode() : RecordEnum.activate.getCode();
  1442. flowMethod.setType(type);
  1443. OperatorEntity operatorEntity = new OperatorEntity();
  1444. String code = StringUtil.isNotEmpty(entity.getCurrentNodeCode()) ? entity.getCurrentNodeCode() : FlowNature.START_CODE;
  1445. operatorEntity.setNodeCode(code);
  1446. String name = StringUtil.isNotEmpty(entity.getCurrentNodeName()) ? entity.getCurrentNodeName() : FlowNature.START_NAME;
  1447. operatorEntity.setNodeName(name);
  1448. operatorEntity.setTaskId(entity.getId());
  1449. operatorEntity.setHandleId(UserProvider.getLoginUserId());
  1450. flowMethod.setOperatorEntity(operatorEntity);
  1451. recordUtil.createRecord(flowMethod);
  1452. if (isCancel) {
  1453. // 终止,更新实例
  1454. entity.setHisStatus(entity.getStatus());
  1455. entity.setStatus(TaskStatusEnum.CANCEL.getCode());
  1456. this.updateById(entity);
  1457. // 消息
  1458. FlowMsgModel flowMsgModel = new FlowMsgModel();
  1459. flowMsgModel.setNodeList(nodeEntityList);
  1460. flowMsgModel.setFlowModel(flowModel);
  1461. flowMsgModel.setTaskEntity(entity);
  1462. flowMsgModel.setEnd(true);
  1463. msgUtil.message(flowMsgModel);
  1464. } else {
  1465. // 复活
  1466. entity.setStatus(entity.getHisStatus());
  1467. this.updateById(entity);
  1468. operatorUtil.updateCreateTime(flowModel);
  1469. }
  1470. operatorUtil.addTask(ImmutableList.of(entity.getId()));
  1471. }
  1472. }
  1473. @Override
  1474. public boolean checkAsync(String id) {
  1475. List<TaskEntity> childList = this.getChildList(id, TaskEntity::getId, TaskEntity::getIsAsync);
  1476. return childList.stream().anyMatch(e -> FlowNature.ChildAsync.equals(e.getIsAsync()));
  1477. }
  1478. // isSuspend: true 挂起、false 恢复
  1479. @DSTransactional
  1480. @Override
  1481. public void pause(String id, FlowModel flowModel, Boolean isSuspend) throws WorkFlowException {
  1482. List<String> idList = new ArrayList<>();
  1483. idList.add(id);
  1484. boolean pause = false;
  1485. // 暂停的选项,0.全部 1:仅主流程,同时暂停同步子流程
  1486. if (isSuspend) {
  1487. pause = flowModel.getPause() == 1;
  1488. } else {
  1489. TaskEntity taskEntity = this.getInfo(id);
  1490. if (ObjectUtil.equals(taskEntity.getIsRestore(), FlowNature.NotRestore)) {
  1491. throw new WorkFlowException("无法恢复");
  1492. }
  1493. List<TaskEntity> childList = this.getChildList(id, TaskEntity::getId, TaskEntity::getIsRestore);
  1494. // 存在 0(能恢复的),就只恢复 1(不能恢复的,即同步的)
  1495. pause = childList.stream().anyMatch(e -> ObjectUtil.equals(e.getIsRestore(), FlowNature.Restore));
  1496. }
  1497. String userId = UserProvider.getLoginUserId();
  1498. this.getChildList(id, pause, idList);
  1499. List<TaskEntity> orderStaList = taskUtil.getOrderStaList(idList);
  1500. this.pause(orderStaList, isSuspend, id);
  1501. for (TaskEntity entity : orderStaList) {
  1502. // 记录
  1503. FlowMethod flowMethod = new FlowMethod();
  1504. flowMethod.setFlowModel(flowModel);
  1505. flowMethod.setType(isSuspend ? RecordEnum.pause.getCode() : RecordEnum.reboot.getCode());
  1506. OperatorEntity operatorEntity = new OperatorEntity();
  1507. operatorEntity.setNodeCode(StringUtil.isNotBlank(entity.getCurrentNodeCode()) ? entity.getCurrentNodeCode() : FlowNature.START_CODE);
  1508. operatorEntity.setNodeName(StringUtil.isNotBlank(entity.getCurrentNodeName()) ? entity.getCurrentNodeName() : FlowNature.START_NAME);
  1509. operatorEntity.setTaskId(entity.getId());
  1510. operatorEntity.setHandleId(userId);
  1511. flowMethod.setOperatorEntity(operatorEntity);
  1512. recordUtil.createRecord(flowMethod);
  1513. operatorUtil.addTask(ImmutableList.of(entity.getId()));
  1514. }
  1515. }
  1516. public List<OperatorEntity> pause(List<TaskEntity> orderStaList, boolean isSuspend, String id) {
  1517. List<OperatorEntity> operatorList = new ArrayList<>();
  1518. for (TaskEntity taskEntity : orderStaList) {
  1519. if (isSuspend) {
  1520. // 暂停
  1521. if (!ObjectUtil.equals(taskEntity.getStatus(), TaskStatusEnum.PAUSED.getCode())) {
  1522. taskEntity.setHisStatus(taskEntity.getStatus());
  1523. taskEntity.setStatus(TaskStatusEnum.PAUSED.getCode());
  1524. }
  1525. taskEntity.setIsRestore(ObjectUtil.equals(taskEntity.getId(), id) ? FlowNature.Restore : FlowNature.NotRestore);
  1526. this.updateById(taskEntity);
  1527. } else {
  1528. // 恢复
  1529. taskEntity.setStatus(taskEntity.getHisStatus());
  1530. taskEntity.setHisStatus(TaskStatusEnum.PAUSED.getCode());
  1531. taskEntity.setIsRestore(FlowNature.Restore);
  1532. this.updateById(taskEntity);
  1533. }
  1534. // 过滤作废的经办
  1535. List<OperatorEntity> list = operatorUtil.getList(taskEntity.getId()).stream()
  1536. .filter(e -> !e.getStatus().equals(OperatorStateEnum.Futility.getCode())).collect(Collectors.toList());
  1537. operatorList.addAll(list);
  1538. }
  1539. return operatorList;
  1540. }
  1541. @DSTransactional
  1542. @Override
  1543. public void assign(String id, FlowModel flowModel) throws WorkFlowException {
  1544. taskUtil.setFlowModel(id, flowModel);
  1545. TaskEntity entity = flowModel.getTaskEntity();
  1546. taskUtil.isSuspend(entity);
  1547. taskUtil.isCancel(entity);
  1548. String handleId = flowModel.getUserInfo() == null ? UserProvider.getLoginUserId() : flowModel.getUserInfo().getUserId();
  1549. List<TemplateNodeEntity> nodeEntityList = flowModel.getNodeEntityList();
  1550. // 作废原先的经办、生成指派的经办
  1551. OperatorEntity operator = operatorUtil.handleAssign(flowModel);
  1552. List<OperatorEntity> list = new ArrayList<>();
  1553. list.add(operator);
  1554. String nodeCode = flowModel.getNodeCode();
  1555. NodeModel nodeModel = flowModel.getNodes().get(nodeCode);
  1556. Boolean autoTransfer = flowModel.getAutoTransferFlag();
  1557. boolean isProcessing = ObjectUtil.equals(nodeModel.getType(), NodeEnum.processing.getType());
  1558. if (autoTransfer) {
  1559. flowModel.setHandleOpinion(isProcessing ? "系统转办" : "系统转审");
  1560. }
  1561. //指派逐级审批失效
  1562. if (StringUtil.isNotEmpty(nodeCode)) {
  1563. launchUserService.delete(operator.getTaskId(), ImmutableList.of(nodeCode));
  1564. }
  1565. // 记录
  1566. FlowMethod flowMethod = new FlowMethod();
  1567. flowMethod.setFlowModel(flowModel);
  1568. Integer transferType = isProcessing ? RecordEnum.transferProcessing.getCode() : RecordEnum.transfer.getCode();
  1569. flowMethod.setType(autoTransfer ? transferType : RecordEnum.assign.getCode());
  1570. OperatorEntity operatorEntity = new OperatorEntity();
  1571. operatorEntity.setId(operator.getId());
  1572. operatorEntity.setNodeCode(nodeCode);
  1573. operatorEntity.setNodeId(operator.getNodeId());
  1574. operatorEntity.setNodeName(nodeModel.getNodeName());
  1575. operatorEntity.setTaskId(entity.getId());
  1576. operatorEntity.setHandleId(autoTransfer ? FlowNature.SYSTEM_CODE : handleId);
  1577. flowMethod.setOperatorEntity(operatorEntity);
  1578. List<String> userIds = ImmutableList.of(flowModel.getHandleIds());
  1579. flowMethod.setUserId(String.join(",", userIds));
  1580. recordUtil.createRecord(flowMethod);
  1581. // 消息
  1582. FlowMsgModel flowMsgModel = new FlowMsgModel();
  1583. flowMsgModel.setNodeList(nodeEntityList);
  1584. flowMsgModel.setFlowModel(flowModel);
  1585. flowMsgModel.setTaskEntity(entity);
  1586. flowMsgModel.setOperatorList(list);
  1587. if (flowModel.getAutoTransferFlag()) {
  1588. flowMsgModel.setTransfer(true);
  1589. } else {
  1590. flowMsgModel.setAssign(true);
  1591. }
  1592. msgUtil.message(flowMsgModel);
  1593. operatorUtil.addOperatorList(list, flowModel);
  1594. }
  1595. @Override
  1596. public TaskUserListModel getTaskUserList(String taskId) {
  1597. Set<String> userIdSet = new HashSet<>();
  1598. // 发起人
  1599. TaskEntity taskEntity = this.getById(taskId);
  1600. if (null != taskEntity) {
  1601. userIdSet.add(taskEntity.getCreatorUserId());
  1602. }
  1603. // 审批人
  1604. List<OperatorEntity> operatorList = operatorService.getList(taskId);
  1605. if (CollectionUtil.isNotEmpty(operatorList)) {
  1606. userIdSet.addAll(operatorList.stream().map(OperatorEntity::getHandleId).collect(Collectors.toList()));
  1607. }
  1608. // 抄送
  1609. List<CirculateEntity> circulateList = circulateService.getList(taskId);
  1610. if (CollectionUtil.isNotEmpty(circulateList)) {
  1611. userIdSet.addAll(circulateList.stream().map(CirculateEntity::getUserId).collect(Collectors.toList()));
  1612. }
  1613. List<RecordEntity> recordList = recordService.getList(taskId);
  1614. if (CollectionUtil.isNotEmpty(recordList)) {
  1615. userIdSet.addAll(recordList.stream().map(RecordEntity::getHandleId).collect(Collectors.toList()));
  1616. }
  1617. TaskUserListModel model = new TaskUserListModel();
  1618. model.setAllUserIdList(new ArrayList<>(userIdSet));
  1619. model.setFlowTask(taskEntity);
  1620. model.setOperatorList(operatorList);
  1621. model.setCirculateList(circulateList);
  1622. model.setOperatorRecordList(recordList);
  1623. return model;
  1624. }
  1625. @Override
  1626. public List<BeforeInfoVo> subFlowInfo(FlowModel flowModel) throws WorkFlowException {
  1627. String taskId = flowModel.getTaskId();
  1628. String nodeCode = flowModel.getNodeCode();
  1629. List<BeforeInfoVo> list = new ArrayList<>();
  1630. QueryWrapper<TaskEntity> wrapper = new QueryWrapper<>();
  1631. wrapper.lambda().eq(TaskEntity::getParentId, taskId).eq(TaskEntity::getSubCode, nodeCode);
  1632. List<TaskEntity> entityList = this.list(wrapper);
  1633. if (CollectionUtil.isNotEmpty(entityList)) {
  1634. for (TaskEntity entity : entityList) {
  1635. FlowModel model = new FlowModel();
  1636. model.setFlowId(entity.getFlowId());
  1637. BeforeInfoVo info = this.getInfo(entity.getId(), model);
  1638. list.add(info);
  1639. }
  1640. }
  1641. return list;
  1642. }
  1643. // 消息跳转流程时,校验以及返回opType
  1644. @Override
  1645. public String checkInfo(String id) throws WorkFlowException {
  1646. CirculateEntity circulate = circulateService.getById(id);
  1647. if (null != circulate) {
  1648. return OpTypeEnum.Circulate.getType();
  1649. }
  1650. OperatorEntity operator = operatorService.getInfo(id);
  1651. if (null == operator) {
  1652. throw new WorkFlowException(MsgCode.FA001.get());
  1653. }
  1654. if (operator.getStatus().equals(OperatorStateEnum.Futility.getCode())) {
  1655. throw new WorkFlowException("该流程无权限查看");
  1656. }
  1657. TaskEntity taskEntity = this.getById(operator.getTaskId());
  1658. if (null == taskEntity) {
  1659. throw new WorkFlowException(MsgCode.FA001.get());
  1660. }
  1661. if (TaskStatusEnum.CANCEL.getCode().equals(taskEntity.getStatus())) {
  1662. throw new WorkFlowException(MsgCode.WF041.get());
  1663. }
  1664. if (TaskStatusEnum.RECALL.getCode().equals(taskEntity.getStatus())) {
  1665. throw new WorkFlowException(MsgCode.WF042.get());
  1666. }
  1667. taskUtil.checkTemplateHide(taskEntity.getTemplateId());
  1668. String handleId = operator.getHandleId();
  1669. String userId = UserProvider.getLoginUserId();
  1670. List<String> delegateList = delegateService.getToUser(handleId, taskEntity.getFlowId());
  1671. delegateList.add(handleId);
  1672. if (!delegateList.contains(userId)) {
  1673. throw new WorkFlowException(MsgCode.FA021.get());
  1674. }
  1675. String opType = OpTypeEnum.LaunchDetail.getType();
  1676. if (null == operator.getSignTime() && null == operator.getStartHandleTime() && null == operator.getHandleStatus()) {
  1677. opType = OpTypeEnum.Sign.getType();
  1678. }
  1679. if (null != operator.getSignTime() && null == operator.getStartHandleTime() && null == operator.getHandleStatus()) {
  1680. opType = OpTypeEnum.Todo.getType();
  1681. }
  1682. if (null != operator.getSignTime() && null != operator.getStartHandleTime() && null == operator.getHandleStatus()) {
  1683. opType = OpTypeEnum.Doing.getType();
  1684. }
  1685. if (null != operator.getHandleStatus() || operator.getCompletion().equals(FlowNature.Action)) {
  1686. opType = OpTypeEnum.Circulate.getType();
  1687. }
  1688. return opType;
  1689. }
  1690. @Override
  1691. public void updateIsFile(String taskId) throws WorkFlowException {
  1692. TaskEntity taskEntity = this.getInfo(taskId);
  1693. if (null != taskEntity) {
  1694. taskEntity.setIsFile(1);
  1695. this.updateById(taskEntity);
  1696. }
  1697. }
  1698. // 获取发起表单
  1699. @Override
  1700. public ViewFormModel getStartForm(String taskId) throws WorkFlowException {
  1701. ViewFormModel model = new ViewFormModel();
  1702. TaskEntity taskEntity = this.getInfo(taskId);
  1703. List<TemplateNodeEntity> nodeEntityList = templateNodeService.getList(taskEntity.getFlowId());
  1704. TemplateNodeEntity nodeEntity = nodeEntityList.stream()
  1705. .filter(e -> ObjectUtil.equals(e.getNodeType(), NodeEnum.start.getType())).findFirst().orElse(null);
  1706. if (null != nodeEntity) {
  1707. String formId = nodeEntity.getFormId();
  1708. VisualdevEntity formInfo = serviceUtil.getFormInfo(formId);
  1709. model.setFormInfo(formInfo);
  1710. Map<String, Object> map = serviceUtil.infoData(formId, taskId);
  1711. model.setFormData(map);
  1712. }
  1713. return model;
  1714. }
  1715. @Override
  1716. public TaskTo getFlowTodoCount(TaskTo taskTo) {
  1717. TaskPagination pagination = new TaskPagination();
  1718. pagination.setDelegateType(true);
  1719. pagination.setPageSize(1L);
  1720. pagination.setCurrentPage(1L);
  1721. String appCode = RequestContext.getAppCode();
  1722. boolean isMainSystem = Objects.equals(JnpfConst.MAIN_SYSTEM_CODE, appCode);
  1723. SystemEntity systemEntity = serviceUtil.getInfoByEnCode(!isMainSystem ? appCode : JnpfConst.WORK_FLOW_CODE);
  1724. if (!isMainSystem) {
  1725. pagination.setSystemId(systemEntity.getId());
  1726. }
  1727. TaskTo vo = new TaskTo();
  1728. boolean isPc = RequestContext.isOrignPc();
  1729. String webType = isPc ? JnpfConst.WEB : JnpfConst.APP;
  1730. List<ModuleModel> moduleListAll = taskTo.getModuleList() != null ? taskTo.getModuleList() : new ArrayList<>();
  1731. List<ModuleModel> moduleList = moduleListAll.stream().
  1732. filter(e -> Objects.equals(e.getSystemId(), systemEntity.getId()) && Objects.equals(webType, e.getCategory()))
  1733. .collect(Collectors.toList());
  1734. Map<String, List<ModuleModel>> encodeMap = moduleList.stream().collect(Collectors.groupingBy(ModuleModel::getEnCode));
  1735. vo.setIsLaunch(ObjectUtil.isNotEmpty(encodeMap.get(JnpfConst.WORK_FLOWLAUNCH)));
  1736. if (vo.getIsLaunch()) {
  1737. getList(pagination);
  1738. vo.setFlowLaunch(pagination.getTotal());
  1739. }
  1740. vo.setIsToSign(ObjectUtil.isNotEmpty(encodeMap.get(JnpfConst.WORK_FLOWSIGN)));
  1741. if (vo.getIsToSign()) {
  1742. if (ObjectUtil.isNotEmpty(taskTo.getFlowToSignType())) {
  1743. pagination.setFlowCategory(String.join(",", taskTo.getFlowToSignType()));
  1744. }
  1745. pagination.setCategory(CategoryEnum.Sign.getType());
  1746. operatorService.getList(pagination);
  1747. vo.setFlowToSign(pagination.getTotal());
  1748. }
  1749. vo.setIsTodo(ObjectUtil.isNotEmpty(encodeMap.get(JnpfConst.WORK_FLOWTODO)));
  1750. if (vo.getIsTodo()) {
  1751. if (ObjectUtil.isNotEmpty(taskTo.getFlowTodoType())) {
  1752. pagination.setFlowCategory(String.join(",", taskTo.getFlowTodoType()));
  1753. }
  1754. pagination.setCategory(CategoryEnum.Todo.getType());
  1755. operatorService.getList(pagination);
  1756. vo.setFlowTodo(pagination.getTotal());
  1757. }
  1758. vo.setIsDoing(ObjectUtil.isNotEmpty(encodeMap.get(JnpfConst.WORK_FLOWDOING)));
  1759. if (vo.getIsDoing()) {
  1760. if (ObjectUtil.isNotEmpty(taskTo.getFlowDoingType())) {
  1761. pagination.setFlowCategory(String.join(",", taskTo.getFlowDoingType()));
  1762. }
  1763. pagination.setCategory(CategoryEnum.Doing.getType());
  1764. operatorService.getList(pagination);
  1765. vo.setFlowDoing(pagination.getTotal());
  1766. }
  1767. vo.setIsDone(ObjectUtil.isNotEmpty(encodeMap.get(JnpfConst.WORK_FLOWDONE)));
  1768. if (vo.getIsDone()) {
  1769. if (ObjectUtil.isNotEmpty(taskTo.getFlowDoneType())) {
  1770. pagination.setFlowCategory(String.join(",", taskTo.getFlowDoneType()));
  1771. }
  1772. recordService.getList(pagination);
  1773. vo.setFlowDone(pagination.getTotal());
  1774. }
  1775. vo.setIsCirculate(ObjectUtil.isNotEmpty(encodeMap.get(JnpfConst.WORK_FLOWCIRCULATE)));
  1776. if (vo.getIsCirculate()) {
  1777. if (ObjectUtil.isNotEmpty(taskTo.getFlowCirculateType())) {
  1778. pagination.setFlowCategory(String.join(",", taskTo.getFlowCirculateType()));
  1779. }
  1780. circulateService.getList(pagination);
  1781. vo.setFlowCirculate(pagination.getTotal());
  1782. }
  1783. return vo;
  1784. }
  1785. @Override
  1786. public FlowTodoVO getFlowTodo(TaskPagination pagination) {
  1787. FlowTodoVO flowTodoVO = new FlowTodoVO();
  1788. String appCode = RequestContext.getAppCode();
  1789. String category = pagination.getCategory();
  1790. pagination.setSystemId(serviceUtil.getSystemCodeById(appCode));
  1791. if (Objects.equals(JnpfConst.MAIN_SYSTEM_CODE, appCode)) {
  1792. appCode = JnpfConst.WORK_FLOW_CODE;
  1793. }
  1794. boolean isPc = RequestContext.isOrignPc();
  1795. String webType = isPc ? JnpfConst.WEB : JnpfConst.APP;
  1796. SystemEntity systemEntity = serviceUtil.getInfoByEnCode(appCode);
  1797. AuthorizeVO authorize = serviceUtil.getAuthorizeByUser();
  1798. List<ModuleModel> moduleList = authorize.getModuleList().stream().
  1799. filter(e -> Objects.equals(e.getSystemId(), systemEntity.getId()) && Objects.equals(webType, e.getCategory()))
  1800. .collect(Collectors.toList());
  1801. Map<String, List<ModuleModel>> encodeMap = moduleList.stream().collect(Collectors.groupingBy(ModuleModel::getEnCode));
  1802. Map<String, String> flowType = ImmutableMap.of(
  1803. CategoryEnum.Sign.getType(), JnpfConst.WORK_FLOWSIGN,
  1804. CategoryEnum.Todo.getType(), JnpfConst.WORK_FLOWTODO,
  1805. CategoryEnum.Doing.getType(), JnpfConst.WORK_FLOWDOING
  1806. );
  1807. String module = flowType.get(category);
  1808. flowTodoVO.setIsAuthorize(ObjectUtil.isNotEmpty(encodeMap.get(module)));
  1809. if (flowTodoVO.getIsAuthorize()) {
  1810. List<OperatorVo> waitList = operatorService.getList(pagination);
  1811. List<TaskFlowTodoVO> list = new ArrayList<>();
  1812. for (OperatorVo operatorVo : waitList) {
  1813. TaskFlowTodoVO vo = JsonUtil.getJsonToBean(operatorVo, TaskFlowTodoVO.class);
  1814. vo.setTaskNodeId(operatorVo.getNodeCode());
  1815. vo.setTaskOperatorId(operatorVo.getId());
  1816. vo.setType(2);
  1817. list.add(vo);
  1818. }
  1819. flowTodoVO.setList(list);
  1820. }
  1821. return flowTodoVO;
  1822. }
  1823. }