新建一个通知,通知下面选择需要通知到的通知人,要求通知发送的时候如果通知发送失败,不能新建通知和具体的通知人关系。发送某个人失败,要求通知成功建立,其他人成功发送则建立通知和通知人的关系,失败发送的话也不影响其他人的成功。
本想想的是这个东西大概率要用事物的传播特性做吧,七个传播特性
REQUIRED:如果当前没有事务,就新建一个事务。如果当前存在事务,则加入这个事务。这是最常见的选择。
SUPPORTS:如果当前没有事务,就以非事务方式执行。 如果当前有事务,则使用事务。
MANDATORY:如果当前没有事务,就抛出异常。
REQUIRES_NEW:如果当前存在事务,把当前事务挂起,并且自己创建一个新的事务给自己使用。如果当前没有事务,则自己新建一个事务。
NOT_SUPPORTED:以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。
NEVER:以非事务方式执行,如果当前存在事务,则抛出异常。
NESTED:如果当前事务存在,则执行一个嵌套事务,如果当前没有事务,就新建一个事务。
干了半天没做出来,不确定能不能够实现,然后使用trycatch加事务注解处理了
@Transactional
@Override
public Map<String, Object> noticeSend(SdssNotificationNoticeInfoQueryVo sdssNotificationNoticeInfoQueryVo) {
Map<String, Object> map = doCheck(sdssNotificationNoticeInfoQueryVo);
if (!"0".equals(String.valueOf(map.get("status")))) {
return map;
}
String staffCode = unifastContext.getUser().getStaffCode();
sdssNotificationNoticeInfoQueryVo.setNotifierStaffNo(staffCode);
sdssNotificationNoticeInfoQueryVo.setIfNotified(1);
sdssNotificationNoticeInfoQueryVo.setNotificationTime(new Timestamp(System.currentTimeMillis()));
if (-1 == sdssNotificationNoticeInfoQueryVo.getId()) {
socialSecurityBaseMapper.createNotice(sdssNotificationNoticeInfoQueryVo);
} else {
//跟新通知单信息
socialSecurityBaseMapper.updateSdssNotificationNotice(sdssNotificationNoticeInfoQueryVo);
//删除通知单关联socialSecurityBaseMapper.deleteSdssNotificationNoticeInfo(sdssNotificationNoticeInfoQueryVo.getId());
}
List<SdssNotificationBaseTableInfoQueryVo> sdssNotificationBaseTableInfoQueryVos = deduplicationList(sdssNotificationNoticeInfoQueryVo.getSdssNotificationBaseTableInfoQueryVos());
for (SdssNotificationBaseTableInfoQueryVo notificationBaseTableInfoQueryVo : sdssNotificationBaseTableInfoQueryVos) {
try {
SdssNotificationNoticeInfo sdssNotificationNoticeInfo = new SdssNotificationNoticeInfo();
sdssNotificationNoticeInfo.setNotificationTableId(sdssNotificationNoticeInfoQueryVo.getId());
sdssNotificationNoticeInfo.setYear(sdssNotificationNoticeInfoQueryVo.getYear());
sdssNotificationNoticeInfo.setCityId(sdssNotificationNoticeInfoQueryVo.getCityId());
sdssNotificationNoticeInfo.setStaffNo(notificationBaseTableInfoQueryVo.getStaffNo());
socialSecurityBaseMapper.createNoticeInfo(sdssNotificationNoticeInfo);
Map<String,Object> param = new HashMap<>();
param.put("id",sdssNotificationNoticeInfo.getId());
param.put("status","1");
List<Map<String, Object>> userIdByEmployeeNumber = socialSecurityBaseMapper.findUserIdByEmployeeNumber(sdssNotificationNoticeInfoQueryVo.getNotifierStaffNo());
String sendemployeeid = "";
if (!userIdByEmployeeNumber.isEmpty()) {
sendemployeeid = String.valueOf(userIdByEmployeeNumber.get(0).get("employeeNumber"));
}
String reciveemployeeid = "";
List<Map<String, Object>> userIdByEmployeeNumber1 = socialSecurityBaseMapper.findUserIdByEmployeeNumber(sdssNotificationNoticeInfo.getStaffNo());
if (!userIdByEmployeeNumber1.isEmpty()) {
reciveemployeeid = String.valueOf(userIdByEmployeeNumber1.get(0).get("employeeNumber"));
}
String cityName = notificationBaseTableInfoQueryVo.getCityName();
int year = notificationBaseTableInfoQueryVo.getYear();
String title = "关于"+year+"年度"+cityName+"人员社保基数变更的通知单";
String userid = "356442";
String flowKey = "SocialBaseConfirm";
StartProcessBody startProcessBody = new StartProcessBody();
startProcessBody.setTitle(title);
startProcessBody.setCurrentUserId(sendemployeeid);
startProcessBody.setTaskDefinitionKey(sdssNotificationNoticeInfoQueryVo.getTaskDefinitionKey());
startProcessBody.setBusinessKey(String.valueOf(sdssNotificationNoticeInfo.getId()));
startProcessBody.setProcessDefinitionKey(flowKey);
startProcessBody.setNextUserId(Arrays.asList(reciveemployeeid));
BaseResponse<ProcessVO> result = new BaseResponse<ProcessVO>();
result = workflowClient.start(startProcessBody);
if (!CommonUseEnum.ONE.getValue().equals(result.getCode())) {
throw new RuntimeException("流程发起失败!");
}
socialSecurityBaseMapper.updateSdssNotificationNoticeInfoIfNotified(param);
} catch (Exception e) {
log.error("通知单发送失败", e.getMessage());
}
}
map.put("status", 0);
map.put("msg", "修改完成");
return map;
}
实话说也没有实现子流程的回滚,也是有问题的,但是完成了我的需求,我是感觉用注解是不能够完全处理问题的,我就想到用手动事务,写了一个手动提交事务的,还可以实现两个事务独立互不影响的效果
@Override
public Map<String, Object> noticetesttrans(SdssNotificationNoticeInfoQueryVo sdssNotificationNoticeInfoQueryVo) {
Map<String, Object> map = new HashMap<>();
//谁有问题谁回滚
// TransactionStatus transactionStatus = platformTransactionManager.getTransaction(transactionDefinition);
// try{
// createNotice1(sdssNotificationNoticeInfoQueryVo);
// platformTransactionManager.commit(transactionStatus);
// }
// catch (Exception e){
// map.put("status", 0);
// map.put("msg", "修改失败");
// platformTransactionManager.rollback(transactionStatus);
// }
//
// TransactionStatus transactionStatuss = platformTransactionManager.getTransaction(transactionDefinition);
// try{
// createNoticeInfo1(sdssNotificationNoticeInfoQueryVo);
// platformTransactionManager.commit(transactionStatuss);
// }
// catch (Exception e){
// map.put("status", 0);
// map.put("msg", "修改失败");
// platformTransactionManager.rollback(transactionStatuss);
// }
//父子结构,主体有问题,连带子一起回滚,子有问题继续处理
TransactionStatus transactionStatus = platformTransactionManager.getTransaction(transactionDefinition);
try {
createNotice1(sdssNotificationNoticeInfoQueryVo);
platformTransactionManager.commit(transactionStatus);
map.put("status", 0);
map.put("msg", "修改完成");
} catch (Exception e) {
platformTransactionManager.rollback(transactionStatus);
map.put("status", -1);
map.put("msg", "修改失败");
return map;
}
try {
createNoticeInfo1(sdssNotificationNoticeInfoQueryVo);
map.put("status", 0);
map.put("msg", "修改完成");
} catch (Exception e) {
platformTransactionManager.rollback(transactionStatus);
map.put("status", -1);
map.put("msg", "修改失败");
return map;
}
map.put("status", 0);
map.put("msg", "修改完成");
return map;
}
/**
* 创建消息体
* @param sdssNotificationNoticeInfoQueryVo
*/
public void createNotice1(SdssNotificationNoticeInfoQueryVo sdssNotificationNoticeInfoQueryVo){
//逻辑
socialSecurityBaseMapper.createNotice(sdssNotificationNoticeInfoQueryVo);
//逻辑
// int i = 1/0;
}
public void createNoticeInfo1(SdssNotificationNoticeInfoQueryVo sdssNotificationNoticeInfoQueryVo){
if(sdssNotificationNoticeInfoQueryVo.getId()==0){
sdssNotificationNoticeInfoQueryVo.setId(9999);
}
List<SdssNotificationBaseTableInfoQueryVo> sdssNotificationBaseTableInfoQueryVos = sdssNotificationNoticeInfoQueryVo.getSdssNotificationBaseTableInfoQueryVos();
for (int i = 0; i < sdssNotificationBaseTableInfoQueryVos.size(); i++) {
SdssNotificationBaseTableInfoQueryVo notificationBaseTableInfoQueryVo = sdssNotificationBaseTableInfoQueryVos.get(i);
SdssNotificationNoticeInfo sdssNotificationNoticeInfo = new SdssNotificationNoticeInfo();
sdssNotificationNoticeInfo.setNotificationTableId(sdssNotificationNoticeInfoQueryVo.getId());
sdssNotificationNoticeInfo.setYear(sdssNotificationNoticeInfoQueryVo.getYear());
sdssNotificationNoticeInfo.setCityId(sdssNotificationNoticeInfoQueryVo.getCityId());
sdssNotificationNoticeInfo.setStaffNo(notificationBaseTableInfoQueryVo.getStaffNo());
socialSecurityBaseMapper.createNoticeInfo(sdssNotificationNoticeInfo);
if(i == 1){
int qw = 1/0;
}
}
}