Flowable,userTask加任务监听器,然而通常情况下实现类注入的bean一直为null,解决方案如下:
1、流程定义xml中的任务监听器,使用delegateExpression表达式将所使用的任务监听器关联起来
<userTask id="test" name="测试" flowable:assignee="${applyUserId}" flowable:formKey="testForm">
<extensionElements>
<!-- <flowable:taskListener event="create" class="cn.flowable.listener.MyListener"></flowable:taskListener> -->
<flowable:taskListener event="create" delegateExpression="${myListener}"></flowable:taskListener>
<modeler:initiator-can-complete xmlns:modeler="http://flowable.org/modeler"><![CDATA[false]]></modeler:initiator-can-complete>
</extensionElements>
</userTask>
2、自己的任务监听器实现类需要实现org.flowable.engine.delegate.TaskListener类,通过 @Component(value="myListener") 注解将我的监听器交给spring管理,其中value的值和xml中delegateExpression表达式中变量的值保持一致
@Component(value="myListener")
public class MyListener implements TaskListener {
@Autowired
private AsyncServiceImpl asyncService;
@Override
public void notify(DelegateExecution delegateExecution) {
Map<String, Object> variables = delegateExecution.getVariables(); //获取任务处理参数
String orderNo = variables.get("orderNo").toString(); //获取订单号
String expressNo = variables.get("expressNo").toString(); //获取快递单号
Wrapper<Tborder> wrapper = new EntityWrapper<>();
wrapper.eq("order_no",orderNo);
Tborder tborder = iTborderService.getTborderProcessId(wrapper);
Map<String,Object> var = new HashMap<>();
var.put("title",variables.get("title")+delegateExecution.getEventName());
var.put("applyUserId",variables.get("applyUserId"));
var.put("applyUserName",variables.get("applyUserName"));
var.put("market","market");
var.put("processType",variables.get("processType"));
var.put("noticeyw","noticeyw");
var.put("processId",delegateExecution.getProcessDefinitionId());
if (variables.containsKey("harveststate")){
int harveststate = Integer.parseInt(variables.get("harveststate").toString());
switch (harveststate){
//仅损坏退货补发数量
case 1:
//损坏数量退回
Map<String, String> addressMap = DetailedAddressUtil.detailAddress(tborder.getBizAddress());
String damage = variables.get("damage").toString();
tborder.setId(null);
tborder.setExpressNo(expressNo);
tborder.setCreateTime(DateUtil.getTime());
tborder.setQrcode(null);
tborder.setBizProvince(addressMap.get("province"));
tborder.setBizCity(addressMap.get("city"));
tborder.setBizArea(addressMap.get("county"));
tborder.setBizAddress(addressMap.get("village"));
tborder.setOperator("系统任务处理");
tborder.setBz(variables.get("orderDamage")==null?variables.get("orderDamage").toString():"");
tborder.setSendTime(DateUtil.getTime());
tborder.setOrderType(6); //设置退货类型订单
tborder.setOrderState(1); //设置退货中状态
tborder.setCause("到货玻璃破损/到货破损"); //退货原因
iTborderService.insertOrder(tborder,"","","","","2","单面游戏机","0",damage);
String orderIdDamage = tborder.getOrderNo();
new Thread(()->{
Map<String,Object> map = new HashMap<>();
map.put("title",variables.get("title"));
map.put("applyUserId",variables.get("operation"));
map.put("applyUserName","系统任务处理");
map.put("processType", ProcessType.TBORDERPROCESS.getType());
map.put("processType2","tborderinfo");
map.put("orderType",6);
String processId = completeService.processStart("order1678083939449", map,true);
iTborderService.updateProcessId(orderIdDamage, processId);
map = null;
map = new HashMap<>();
map.put("message","系统处理");
completeService.processIdComplete(processId,map);
}).start();
//补发数量
String reissue = variables.get("damage").toString();
delegateExecution.setVariable("title",variables.get("title")+"机器有损坏发已自动发起退货新增发货");
tborder.setId(null);
tborder.setExpressNo(null);
tborder.setCreateTime(DateUtil.getTime());
tborder.setQrcode(null);
tborder.setBz(variables.get("orderDamage")==null?variables.get("orderDamage").toString():"");
//tborder.setOrderType(7);
//补发在订单管理新增订单,设置为场地维护
tborder.setOrderType(5);
tborder.setCause("到货玻璃破损/到货破损"); //补发原因与退货原因一致
iTborderService.insertOrder(tborder,"","","","","2","单面游戏机","0",reissue);
String orderNoReissue = tborder.getOrderNo();
new Thread(()->{
Map<String,Object> map = new HashMap<>();
map.put("title",variables.get("title"));
map.put("applyUserId",variables.get("operation"));
map.put("applyUserName","系统任务处理");
map.put("processType", ProcessType.TBORDERPROCESS.getType());
map.put("processType2","tbordernew");
map.put("warehouse","order_game_ship");
map.put("orderType",variables.get("orderType"));
map.put("orderTypeSing",1);
map.put("orderDetail",2);
String processId = completeService.processStart("order1678083939449", map,true);
iTborderService.updateProcessId(orderNoReissue, processId);
map = null;
map = new HashMap<>();
map.put("message","系统处理");
completeService.processIdComplete(processId,map);
var.put("title",variables.get("title")+"进场出现机器损坏");
var.put("processId",processId);
completeService.noticeProcessStart(var);
}).start();
break;
//仅多余退货
case 2:
// 多余数量退回
String superfluous = variables.get("superfluous").toString();
delegateExecution.setVariable("title",variables.get("title")+"场地机器存在多余业务处理退货");
tborder.setId(null);
tborder.setExpressNo(expressNo);
tborder.setCreateTime(DateUtil.getTime());
tborder.setQrcode(null);
tborder.setOperator("系统任务处理");
tborder.setBz(variables.get("orderDamage")==null?variables.get("orderDamage").toString():"");
tborder.setSendTime(DatetimeUtil.formatDateTime(new Date()));
tborder.setOrderType(6); //设置退货类型订单
tborder.setOrderState(4); //设置退货中状态
iTborderService.insertOrder(tborder,"","","","","2","单面游戏机","0",superfluous);
String orderNoSuperfluous = tborder.getOrderNo();
new Thread(()->{
Map<String,Object> map = new HashMap<>();
map.put("title","退货订单"+variables.get("title"));
map.put("applyUserId",variables.get("operation"));
map.put("applyUserName","系统任务处理");
map.put("processType", ProcessType.TBORDERPROCESS.getType());
map.put("processType2","tborderinfo");
map.put("orderTypeSing",1);
map.put("orderType",6);
String processId = completeService.processStart("order1678083939449", map,true);
iTborderService.updateProcessId(orderNoSuperfluous, processId);
map = null;
map = new HashMap<>();
map.put("message","系统处理");
completeService.processIdComplete(processId,map);
var.put("title",variables.get("title")+"已进场多余机器进行撤回");
var.put("processId",processId);
completeService.noticeProcessStart(var);
}).start();
break;
}
}else {
var.put("title",variables.get("title")+"已进场");
completeService.noticeProcessStart(var);
}
if (variables.containsKey("bindZFB")&&"15".equals(variables.get("orderTypeSing").toString())){
String bizCode = variables.get("bizCode").toString();
String bindZFB = variables.get("bindZFB").toString().replaceAll("ZFB0", "");
Tborder tborder1 = new Tborder();
tborder1.setQrcode(bindZFB);
tborder1.setBizCode(bizCode);
asyncService.bindMachine(tborder1);
}
}
}