1 ,调用类
public static void taskProcessing(CWfTaskCommand req) {
String flowCodes = req.getFlowCode();
SceneInterFace strategy = StrategyFactory.getPayStrategy(flowCodes);
strategy.execute(req);
}
2 ,策略实现
/**
* @author TYL
* @date 2020/12/25 16:10
*/
public class StrategyFactory {
/**
* 使用策略工厂获取具体策略实现
* @param code
* @return
*/
public static SceneInterFace getPayStrategy(String code) {
try {
return (SceneInterFace) Class.forName(TaskSceneEnum.getClassNameByCode(code)).newInstance();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
return null;
}
}
3 枚举类
/**
* @author tyl
* @version V1.0
* @Description: 任务处理状态
* @date 2020/12/25 14:46
*/
public enum TaskSceneEnum {
//场景1
OWN_PENDING("005005001","com.jy.claim.workflow.service.impl.task.SceneOneServiceImpl"),
OWN_INPROESS("005005002","com.jy.claim.workflow.service.impl.task.SceneOneServiceImpl"),
OWN_REASSIGNMENT("005005003","com.jy.claim.workflow.service.impl.task.SceneOneServiceImpl"),
//场景2
LINK_PENDING("005006001","com.jy.claim.workflow.service.impl.task.SceneTwoServiceImpl"),
LINK_INPROESS("005006002","com.jy.claim.workflow.service.impl.task.SceneTwoServiceImpl"),
LINK_REPORT("005006004","com.jy.claim.workflow.service.impl.task.SceneTwoServiceImpl"),
LINK_FINISH("005006009","com.jy.claim.workflow.service.impl.task.SceneTwoServiceImpl"),
LOSS_ASSESSMENT_PENDING("005007001","com.jy.claim.workflow.service.impl.task.SceneTwoServiceImpl"),
LOSS_ASSESSMENT_INPROESS("005007002","com.jy.claim.workflow.service.impl.task.SceneTwoServiceImpl"),
LOSS_ASSESSMENT_FINISH("005007009","com.jy.claim.workflow.service.impl.task.SceneTwoServiceImpl"),
PRICING_ASSESSMENT_PENDING("006007001","com.jy.claim.workflow.service.impl.task.SceneTwoServiceImpl"),
PRICING_ASSESSMENT_INPROESS("006007002","com.jy.claim.workflow.service.impl.task.SceneTwoServiceImpl"),
PRICING_ASSESSMENT_FINISH("006007009","com.jy.claim.workflow.service.impl.task.SceneTwoServiceImpl"),
ASSESSMENT_PRICING_PENDING("007006001","com.jy.claim.workflow.service.impl.task.SceneTwoServiceImpl"),
ASSESSMENT_PRICING_INPROESS("007006002","com.jy.claim.workflow.service.impl.task.SceneTwoServiceImpl"),
ASSESSMENT_PRICING_FINISH("007006009","com.jy.claim.workflow.service.impl.task.SceneTwoServiceImpl"),
ASSESSMENT_PRICING_RETURN("007006017","com.jy.claim.workflow.service.impl.task.SceneTwoServiceImpl"),
ASSESSMENT_LOSS_PENDING("007005001","com.jy.claim.workflow.service.impl.task.SceneTwoServiceImpl"),
ASSESSMENT_LOSS_INPROESS("007005002","com.jy.claim.workflow.service.impl.task.SceneTwoServiceImpl"),
ASSESSMENT_LOSS_FINISH("007005009","com.jy.claim.workflow.service.impl.task.SceneTwoServiceImpl"),
ASSESSMENT_LOSS_RETURN("007005017","com.jy.claim.workflow.service.impl.task.SceneTwoServiceImpl"),
PRICING_LOSS_PENDING("006005001","com.jy.claim.workflow.service.impl.task.SceneTwoServiceImpl"),
PRICING_LOSS_INPROESS("006005002","com.jy.claim.workflow.service.impl.task.SceneTwoServiceImpl"),
PRICING_LOSS_FINISH("006005009","com.jy.claim.workflow.service.impl.task.SceneTwoServiceImpl"),
PRICING_LOSS_RETURN("006005007","com.jy.claim.workflow.service.impl.task.SceneTwoServiceImpl"),
//场景三
ASSESSMENT_PRICING_PENDING_THREE("00000000","com.jy.claim.workflow.service.impl.task.SceneThreeServiceImpl"),
ASSESSMENT_PRICING_INPROESS_THREE("007006002","com.jy.claim.workflow.service.impl.task.SceneThreeServiceImpl"),
ASSESSMENT_PRICING_FINISH_THREE("007006009","com.jy.claim.workflow.service.impl.task.SceneThreeServiceImpl"),
ASSESSMENT_PRICING_RETURN_THREE("007006017","com.jy.claim.workflow.service.impl.task.SceneThreeServiceImpl"),
ASSESSMENT_LOSS_PENDING_THREE("007005001","com.jy.claim.workflow.service.impl.task.SceneThreeServiceImpl"),
ASSESSMENT_LOSS_INPROESS_THREE("007005002","com.jy.claim.workflow.service.impl.task.SceneThreeServiceImpl"),
ASSESSMENT_LOSS_FINISH_THREE("007005009","com.jy.claim.workflow.service.impl.task.SceneThreeServiceImpl"),
ASSESSMENT_LOSS_RETURN_THREE("007005017","com.jy.claim.workflow.service.impl.task.SceneThreeServiceImpl"),
PRICING_LOSS_PENDING_THREE("006005001","com.jy.claim.workflow.service.impl.task.SceneThreeServiceImpl"),
PRICING_LOSS_INPROESS_THREE("006005002","com.jy.claim.workflow.service.impl.task.SceneThreeServiceImpl"),
PRICING_LOSS_FINISH_THREE("006005009","com.jy.claim.workflow.service.impl.task.SceneThreeServiceImpl"),
PRICING_LOSS_RETURN_THREE("006005007","com.jy.claim.workflow.service.impl.task.SceneThreeServiceImpl"),
;
/**
* 场景三
* @return
*/
public static List<String> getReturnList(){
ArrayList list = new ArrayList();
list.add(TaskSceneEnum.ASSESSMENT_PRICING_PENDING.getCode());
list.add(TaskSceneEnum.ASSESSMENT_PRICING_INPROESS.getCode());
list.add(TaskSceneEnum.ASSESSMENT_PRICING_FINISH.getCode());
list.add(TaskSceneEnum.ASSESSMENT_PRICING_RETURN.getCode());
list.add(TaskSceneEnum.ASSESSMENT_LOSS_PENDING.getCode());
list.add(TaskSceneEnum.ASSESSMENT_LOSS_INPROESS.getCode());
list.add(TaskSceneEnum.ASSESSMENT_LOSS_FINISH.getCode());
list.add(TaskSceneEnum.ASSESSMENT_LOSS_RETURN.getCode());
list.add(TaskSceneEnum.PRICING_LOSS_PENDING.getCode());
list.add(TaskSceneEnum.PRICING_LOSS_INPROESS.getCode());
list.add(TaskSceneEnum.PRICING_LOSS_FINISH.getCode());
list.add(TaskSceneEnum.PRICING_LOSS_RETURN.getCode());
return list;
}
/**
* 场景1
* @return
*/
public static List<String> getOwnList(){
ArrayList list = new ArrayList();
list.add(TaskSceneEnum.OWN_PENDING.getCode());
list.add(TaskSceneEnum.OWN_INPROESS.getCode());
list.add(TaskSceneEnum.OWN_REASSIGNMENT.getCode());
return list;
}
/**
* 场景2
* @return
*/
public static List<String> getLinkList(){
ArrayList list = new ArrayList();
list.add(TaskSceneEnum.LINK_PENDING.getCode());
list.add(TaskSceneEnum.LINK_INPROESS.getCode());
list.add(TaskSceneEnum.LINK_REPORT.getCode());
list.add(TaskSceneEnum.LINK_FINISH.getCode());
list.add(TaskSceneEnum.LOSS_ASSESSMENT_PENDING.getCode());
list.add(TaskSceneEnum.LOSS_ASSESSMENT_INPROESS.getCode());
list.add(TaskSceneEnum.LOSS_ASSESSMENT_FINISH.getCode());
list.add(TaskSceneEnum.PRICING_ASSESSMENT_PENDING.getCode());
list.add(TaskSceneEnum.PRICING_ASSESSMENT_INPROESS.getCode());
list.add(TaskSceneEnum.PRICING_ASSESSMENT_FINISH.getCode());
list.add(TaskSceneEnum.ASSESSMENT_PRICING_PENDING.getCode());
list.add(TaskSceneEnum.ASSESSMENT_PRICING_INPROESS.getCode());
list.add(TaskSceneEnum.ASSESSMENT_PRICING_FINISH.getCode());
list.add(TaskSceneEnum.ASSESSMENT_PRICING_RETURN.getCode());
list.add(TaskSceneEnum.ASSESSMENT_LOSS_PENDING.getCode());
list.add(TaskSceneEnum.ASSESSMENT_LOSS_INPROESS.getCode());
list.add(TaskSceneEnum.ASSESSMENT_LOSS_FINISH.getCode());
list.add(TaskSceneEnum.ASSESSMENT_LOSS_RETURN.getCode());
list.add(TaskSceneEnum.PRICING_LOSS_PENDING.getCode());
list.add(TaskSceneEnum.PRICING_LOSS_INPROESS.getCode());
list.add(TaskSceneEnum.PRICING_LOSS_FINISH.getCode());
list.add(TaskSceneEnum.PRICING_LOSS_RETURN.getCode());
return list;
}
private String code;
private String className;
TaskSceneEnum(String code, String className) {
this.code = code;
this.className = className;
}
public static String getClassNameByCode(String code) {
String className = "";
if (StringUtils.isEmpty(code)) {
return className;
}
for (TaskSceneEnum e : TaskSceneEnum.values()) {
if (e.code.equalsIgnoreCase(code)) {
className = e.className;
break;
}
}
return className;
}
public String getCode() {
return code;
}
public String getClassName() {
return className;
}
}
4 接口 实现类
5 策略1
/**
* @author TYL
* @date 2020/12/25 15:10
*/
@Service
@Slf4j
public class SceneOneServiceImpl implements SceneInterFace{
private static ICWfTaskService icWfTaskService = SpringContextUtils.getBean(ICWfTaskService.class);
/**
* @author TYL
* @param req
* @deprecated 场景1:删除、新增,只有当前环节=>当前环节;调度、改派
*/
@Override
@Transactional(rollbackFor = Exception.class)
public void execute(CWfTaskCommand req) {
CountDownLatch countDownLatch=new CountDownLatch(2);
CWfTask cWfTask= new CWfTask();
BeanUtils.copyProperties(req,cWfTask);
cWfTask.setId(CommonUtil.getUUID());
ThreadPoolExecutor executor = new ThreadPoolExecutor(2, 4, 200, TimeUnit.MILLISECONDS,
new ArrayBlockingQueue<Runnable>(10));
executor.execute(() -> {
icWfTaskService.deleteById(req.getId());
log.info("删除数据成功id[{}],线程名[{}]",req.getId(),Thread.currentThread().getName());
countDownLatch.countDown();
});
executor.submit(()-> {
icWfTaskService.save(cWfTask);
log.info("删除数据成功id[{}],线程名[{}]",cWfTask.getId(),Thread.currentThread().getName());
countDownLatch.countDown();
});
try {
countDownLatch.await();
} catch (InterruptedException e) {
e.printStackTrace();
}finally {
executor.shutdown();
}
}
}
6 策略2
/**
* @author TYL
* @date 2020/12/25 15:10
*/
@Service
@Slf4j
public class SceneTwoServiceImpl implements SceneInterFace {
private static ICWfTaskService icWfTaskService = SpringContextUtils.getBean(ICWfTaskService.class);
/**
* 任务处理
* 场景2:完成当前任务,新增任务,只有环节变更情况;任务流转
*/
@Override
public void execute(CWfTaskCommand req) {
CountDownLatch countDownLatch=new CountDownLatch(2);
CWfTask cWfTask= new CWfTask();
BeanUtils.copyProperties(req,cWfTask);
cWfTask.setId(CommonUtil.getUUID());
CWfTask updateWfTask= new CWfTask();
BeanUtils.copyProperties(req,updateWfTask);
ThreadPoolExecutor executor = new ThreadPoolExecutor(2, 4, 200, TimeUnit.MILLISECONDS,
new ArrayBlockingQueue<Runnable>(10));
executor.execute(() -> {
icWfTaskService.updateById(updateWfTask);
log.info("更新数据成功id[{}],线程名[{}]",req.getId(),Thread.currentThread().getName());
countDownLatch.countDown();
});
executor.submit(()-> {
icWfTaskService.save(cWfTask);
log.info("新增数据成功id[{}],线程名[{}]",cWfTask.getId(),Thread.currentThread().getName());
countDownLatch.countDown();
});
try {
countDownLatch.await();
} catch (InterruptedException e) {
e.printStackTrace();
}finally {
executor.shutdown();
}
}
}
7 策略3
/**
* @author TYL
* @date 2020/12/25 15:10
*/
@Service
@Slf4j
public class SceneThreeServiceImpl implements SceneInterFace {
private static ICWfTaskService icWfTaskService = SpringContextUtils.getBean(ICWfTaskService.class);
/**
* 场景3:退回时,完成当前任务,删除原任务,新增任务;任务退回
* @param req
*/
@Override
public void execute(CWfTaskCommand req) {
CountDownLatch countDownLatch=new CountDownLatch(3);
CWfTask cWfTask= new CWfTask();
BeanUtils.copyProperties(req,cWfTask);
cWfTask.setId(CommonUtil.getUUID());
CWfTask updateWfTask= new CWfTask();
BeanUtils.copyProperties(req,updateWfTask);
ThreadPoolExecutor executor = new ThreadPoolExecutor(2, 4, 200, TimeUnit.MILLISECONDS,
new ArrayBlockingQueue<Runnable>(10));
executor.execute(() -> {
CWfTask updateWfTaskTaskClass= new CWfTask();
updateWfTaskTaskClass.setId(req.getId());
updateWfTaskTaskClass.setTaskStatus("009");
icWfTaskService.update(updateWfTask);
log.info("更新状态已完成成功id[{}],线程名[{}]",req.getId(),Thread.currentThread().getName());
countDownLatch.countDown();
});
executor.submit(()-> {
icWfTaskService.deleteById(req.getId());
log.info("删除数据成功id[{}],线程名[{}]",cWfTask.getId(),Thread.currentThread().getName());
countDownLatch.countDown();
});
executor.submit(()-> {
icWfTaskService.save(cWfTask);
log.info("新增数据成功id[{}],线程名[{}]",cWfTask.getId(),Thread.currentThread().getName());
countDownLatch.countDown();
});
try {
countDownLatch.await();
} catch (InterruptedException e) {
e.printStackTrace();
}finally {
executor.shutdown();
}
}
}
8 接口
/**
* @author TYL
* @date 2020/12/25 15:10
*/
public interface SceneInterFace {
public void execute(CWfTaskCommand req);
}