目录
Extarrangement:
实验排课申请
由于实验课安排需要发送给此门课程任课老师查看,所以流程定义时不能直接设置为特定的候选人,因此要修改流程定义方法
FlowDefinitionServiceImpl:
因为修改了extarrangement中的flowCandidateUsernamesOfTask()方法
/**
* 根据流程定义ID启动流程实例
*
* @param procDefId 流程定义Id
* @param variables 流程变量
* @return
*/
@Override
@Transactional
public Result startProcessInstanceById(String procDefId, Map<String, Object> variables) {
ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery()
.processDefinitionId(procDefId)
.singleResult();
if (Objects.nonNull(processDefinition) && processDefinition.isSuspended()) {
return Result.error("流程已被挂起,请先激活流程");
}
// variables.put("skip", true);
// variables.put(ProcessConstants.FLOWABLE_SKIP_EXPRESSION_ENABLED, true);
// 设置流程发起人Id到流程中
SysUser sysUser = iFlowThirdService.getLoginUser();
identityService.setAuthenticatedUserId(sysUser.getUsername());
variables.put(ProcessConstants.PROCESS_INITIATOR, sysUser.getUsername());
ProcessInstance processInstance = runtimeService.startProcessInstanceById(procDefId, variables);
// 给第一步申请人节点设置任务执行人和意见
Task task = taskService.createTaskQuery().processInstanceId(processInstance.getProcessInstanceId()).active().singleResult();
if (Objects.nonNull(task)) {
taskService.addComment(task.getId(), processInstance.getProcessInstanceId(), FlowComment.NORMAL.getType(), sysUser.getRealname() + "发起流程申请");
taskService.setAssignee(task.getId(), sysUser.getUsername());
//taskService.complete(task.getId(), variables);
}
/*======================todo 启动之后 回调以及关键数据保存======================*/
//业务数据id
String dataId = variables.get("dataId").toString();
//如果保存数据前未调用必调的FlowCommonService.initActBusiness方法,就会有问题
FlowMyBusiness business = flowMyBusinessService.getByDataId(dataId);
//设置数据
FlowNextDto nextFlowNode = flowTaskService.getNextFlowNode(task.getId(), variables);
System.out.println(variables);
taskService.complete(task.getId(), variables);
//下一个实例节点 多实例会是一个list,随意取一个即可 数组中定义Key是一致的
//Task task2 = taskService.createTaskQuery().processInstanceId(processInstance.getProcessInstanceId()).active().singleResult();
List<Task> task2List = taskService.createTaskQuery().processInstanceId(processInstance.getProcessInstanceId()).active().list();
Task task2 = null;
if(task2List.size()>0) task2 = task2List.get(0);
String doneUsers = business.getDoneUsers();
// 处理过流程的人
JSONArray doneUserList = new JSONArray();
if (StrUtil.isNotBlank(doneUsers)){
doneUserList = JSON.parseArray(doneUsers);
}
if (!doneUserList.contains(sysUser.getUsername())){
doneUserList.add(sysUser.getUsername());
}
if (nextFlowNode!=null){
System.out.println("有下一个节点");
//**有下一个节点
UserTask nextTask = nextFlowNode.getUserTask();
//能够处理下个节点的候选人
List<SysUser> nextFlowNodeUserList = nextFlowNode.getUserList();
System.out.println("nextFlowNodeUser"+nextFlowNodeUserList.toString());
List<String> collect_username = nextFlowNodeUserList.stream().map(SysUser::getUsername).collect(Collectors.toList());
System.out.println("collect_username"+collect_username.toString());
//spring容器类名
String serviceImplName = business.getServiceImplName();
FlowCallBackServiceI flowCallBackService = (FlowCallBackServiceI) SpringContextUtils.getBean(serviceImplName);
List<String> beforeParamsCandidateUsernames = flowCallBackService.flowCandidateUsernamesOfTask(task2.getTaskDefinitionKey(), variables);
if (CollUtil.isNotEmpty(beforeParamsCandidateUsernames)){
// 删除后重写
for (Task task2One : task2List) {
for (String oldUser : collect_username) {
taskService.deleteCandidateUser(task2One.getId(),oldUser);
}
}
// 业务层有指定候选人,覆盖
for (Task task2One : task2List) {
System.out.println("startProcessInstanceById()"+variables.get("candidateUsers"));
for (String newUser : beforeParamsCandidateUsernames) {
taskService.addCandidateUser(task2One.getId(),newUser);
}
}
business.setTodoUsers(JSON.toJSONString(beforeParamsCandidateUsernames));
}
business.setProcessDefinitionId(procDefId)
.setProcessInstanceId(processInstance.getProcessInstanceId())
.setActStatus(ActStatus.start)
.setProposer(sysUser.getUsername())
.setTaskId(task2.getId())
.setTaskName(nextTask.getName())
.setTaskNameId(nextTask.getId())
.setPriority(nextTask.getPriority())
.setDoneUsers(doneUserList.toJSONString())
.setTodoUsers(JSON.toJSONString(beforeParamsCandidateUsernames))
;
} else {
System.out.println("没有下一个节点");
// **没有下一个节点,流程已经结束了
business.setProcessDefinitionId(procDefId)
.setProcessInstanceId(processInstance.getProcessInstanceId())
.setActStatus(ActStatus.pass)
.setProposer(sysUser.getUsername())
.setDoneUsers(doneUserList.toJSONString())
;
}
flowMyBusinessService.updateById(business);
//spring容器类名
String serviceImplName = business.getServiceImplName();
FlowCallBackServiceI flowCallBackService = (FlowCallBackServiceI) SpringContextUtils.getBean(serviceImplName);
// 流程处理完后,进行回调业务层
business.setValues(variables);
if (flowCallBackService!=null)flowCallBackService.afterFlowHandle(business);
return Result.OK("流程启动成功");
}
ExtarrangementServiceImpl需要implements FlowCallBackServiceI接口,还需要实现关联流程relationAct()方法
ExtarrangementServiceImpl:
/**
* 初始生成业务与流程的关联信息<br/>
* 当业务模块新增一条数据后调用,此时业务数据关联一个流程定义,以备后续流程使用
* @return 是否成功
* @param title 必填。流程业务简要描述。例:2021年11月26日xxxxx申请
* @param dataId 必填。业务数据Id,如果是一对多业务关系,传入主表的数据Id
* @param serviceImplName 必填。业务service注入spring容器的名称。
* 例如:@Service("demoService")则传入 demoService
* @param processDefinitionKey 必填。流程定义Key,传入此值,未来启动的会是该类流程的最新一个版本
* @param processDefinitionId 选填。流程定义Id,传入此值,未来启动的为指定版本的流程
*/
public void initActBusiness(String title, String dataId, String serviceImplName, String processDefinitionKey, String processDefinitionId){
flowCommonService.initActBusiness(title,dataId,"extarrangementService","Extarrangement","process_0nodg6qf:5:d6328b65-e796-11ec-92e0-98fa9b690463");
}
@Override
public void relationAct(String dataId) {
flowCommonService.initActBusiness("实验课排课:dataId"+dataId,dataId,"extarrangementService","Extarrangement","process_0nodg6qf:5:d6328b65-e796-11ec-92e0-98fa9b690463");
}
@Override
public void afterFlowHandle(FlowMyBusiness business) {
//流程操作后做些什么
business.getTaskNameId();//接下来审批的节点
business.getValues();//前端传进来的参数
business.getActStatus();//流程状态 ActStatus.java
//....其他
}
@Override
public Object getBusinessDataById(String dataId) {
return this.getById(dataId);
}
@Override
public Map<String, Object> flowValuesOfTask(String taskNameId, Map<String, Object> values) {
return null;
}
@Override
public List<String> flowCandidateUsernamesOfTask(String taskNameId, Map<String, Object> values) {
String user = (String) values.get("candidateUsers");
return Lists.newArrayList(user);
}
@Override
public boolean save(Extarrangement extarrangement){
/**新增数据,初始化流程关联信息**/
extarrangement.setId(IdUtil.fastSimpleUUID());
return super.save(extarrangement);
}
@Override
public boolean removeById(Serializable id){
/**删除数据,移除流程关联信息**/
flowCommonService.delActBusiness(id.toString());
return super.removeById(id);
}
前端需要传送candidateUsers给后端:
<act-apply-btn @success="loadData" :data-id="record.id" :service-type="2" :hasDeploy = "record.anpai" text="通知安排" :variables="{candidateUsers:record.tid}" :tongzhi="record.tongzhi"></act-apply-btn>
后端获取调用flowCandidateUsernamesOfTask()获取候选人
ChangeScoresApply:
changeScoresApplyMapper.xml:
<select id="getMyList" resultType="org.jeecg.modules.demo.ScoresInput.entity.ChangeScoresApply">
select *
from change_scores_apply a left join flow_my_business b on a.id =b.data_id
where (a.tea_id = #{tid} and b.act_status != "审批通过" and a.scoreisapply = "是") or (a.scoreisapply = "否" and a.tea_id = #{tid})
</select>
<update id="setApply">
update change_scores_apply
set scoreisapply = "是"
where id = #{id}
</update>
<update id="cancelApply">
update change_scores_apply
set scoreisapply = "否"
where id = #{id}
</update>
<select id="getChangeScoreApply" resultType="org.jeecg.modules.demo.ScoresInput.entity.ChangeScoresApply">
select *
from change_scores_apply
where tea_id=#{tid} and les_ord = #{lesord} and cs_id = #{csid}
</select>
ChangeScoresApplyServiceImpl:
implements继承FlowCallBackServiceI接口:
@Service("changeScoresApplyService")
public class ChangeScoresApplyServiceImpl extends ServiceImpl<ChangeScoresApplyMapper, ChangeScoresApply> implements IChangeScoresApplyService , FlowCallBackServiceI {
@Autowired
FlowCommonService flowCommonService;
/**
* 初始生成业务与流程的关联信息<br/>
* 当业务模块新增一条数据后调用,此时业务数据关联一个流程定义,以备后续流程使用
* @return 是否成功
* @param title 必填。流程业务简要描述。例:2021年11月26日xxxxx申请
* @param dataId 必填。业务数据Id,如果是一对多业务关系,传入主表的数据Id
* @param serviceImplName 必填。业务service注入spring容器的名称。
* 例如:@Service("demoService")则传入 demoService
* @param processDefinitionKey 必填。流程定义Key,传入此值,未来启动的会是该类流程的最新一个版本
* @param processDefinitionId 选填。流程定义Id,传入此值,未来启动的为指定版本的流程
*/
public void initActBusiness(String title, String dataId, String serviceImplName, String processDefinitionKey, String processDefinitionId){
flowCommonService.initActBusiness(title,dataId,"changeScoresApplyService","ChangeScoresApply","process_duc92htd:2:2722f03f-e700-11ec-8471-98fa9b690463");
}
@Override
public void relationAct(String dataId) {
flowCommonService.initActBusiness("修改成绩申请:dataId"+dataId,dataId,"changeScoresApplyService","ChangeScoresApply","process_duc92htd:2:2722f03f-e700-11ec-8471-98fa9b690463");
}
@Override
public List<ChangeScoresApply> getMyList(String tid) {
return this.baseMapper.getMyList(tid);
}
@Override
public void setApply(String id) {
this.baseMapper.setApply(id);
}
@Override
public void cancelApply(String id) {
this.baseMapper.cancelApply(id);
}
@Override
public List<ChangeScoresApply> getChangeScoreApply(String tid, String lesord, String csid) {
return this.baseMapper.getChangeScoreApply(tid,lesord,csid);
}
@Override
public void afterFlowHandle(FlowMyBusiness business) {
//流程操作后做些什么
business.getTaskNameId();//接下来审批的节点
business.getValues();//前端传进来的参数
business.getActStatus();//流程状态 ActStatus.java
//....其他
}
@Override
public Object getBusinessDataById(String dataId) {
return this.getById(dataId);
}
@Override
public Map<String, Object> flowValuesOfTask(String taskNameId, Map<String, Object> values) {
return null;
}
//设置候选人
@Override
public List<String> flowCandidateUsernamesOfTask(String taskNameId, Map<String, Object> values) {
//修改候选人
if(values.get("candidateUsers") == null){
return Lists.newArrayList("teaAdmin");
}else{
String user = (String) values.get("candidateUsers");
return Lists.newArrayList(user);
}
}
@Override
public boolean save(ChangeScoresApply scoresApply){
/**新增数据,初始化流程关联信息**/
scoresApply.setId(IdUtil.fastSimpleUUID());
this.relationAct(scoresApply.getId());
return super.save(scoresApply);
}
@Override
public boolean removeById(Serializable id){
/**删除数据,移除流程关联信息**/
flowCommonService.delActBusiness(id.toString());
return super.removeById(id);
}
}
ChangeScoresApplyController:
@AutoLog(value = "关联流程")
@ApiOperation(value="关联流程", notes="关联流程")
@RequestMapping(value = "/relationAct",method = RequestMethod.GET)
public Result<?> relationAct(HttpServletRequest request,HttpServletResponse response){
String dataId = request.getParameter("dataId");
changeScoresApplyService.relationAct(dataId);
return Result.OK();
}
@RequestMapping(value = "/getMyList",method = RequestMethod.GET)
public Result<?> getMyList(@RequestParam(value = "tid",defaultValue = "1")String tid){
SysUser user = iFlowThirdService.getLoginUser();
tid = user.getUsername();
System.out.println("username"+tid);
List<ChangeScoresApply> allList = changeScoresApplyService.getMyList(tid);
return Result.OK(allList);
}
@RequestMapping(value = "/setApply",method = RequestMethod.GET)
public Result<Object> setApply(@RequestParam(value = "id",required = true)String id){
changeScoresApplyService.setApply(id);
return Result.OK();
}
@RequestMapping(value = "/cancelApply",method = RequestMethod.GET)
public Result<Object> cancelApply(@RequestParam(value = "id",required = true)String id){
changeScoresApplyService.cancelApply(id);
return Result.OK();
}
前端申请在源码中可查看,博客不再赘述。