Commit b7e84840 authored by 周健威's avatar 周健威

添加分布式事务补偿处理

parent 2ddebc2d
...@@ -31,6 +31,7 @@ import com.xxfc.platform.order.pojo.order.VehicleItemDTO; ...@@ -31,6 +31,7 @@ import com.xxfc.platform.order.pojo.order.VehicleItemDTO;
import com.xxfc.platform.order.pojo.price.RentVehiclePriceVO; import com.xxfc.platform.order.pojo.price.RentVehiclePriceVO;
import com.xxfc.platform.universal.constant.DictionaryKey; import com.xxfc.platform.universal.constant.DictionaryKey;
import com.xxfc.platform.universal.feign.ThirdFeign; import com.xxfc.platform.universal.feign.ThirdFeign;
import com.xxfc.platform.vehicle.common.RestResponse;
import com.xxfc.platform.vehicle.constant.AccompanyingItemType; import com.xxfc.platform.vehicle.constant.AccompanyingItemType;
import com.xxfc.platform.vehicle.entity.BranchCompany; import com.xxfc.platform.vehicle.entity.BranchCompany;
import com.xxfc.platform.vehicle.entity.VehicleBookRecord; import com.xxfc.platform.vehicle.entity.VehicleBookRecord;
...@@ -143,75 +144,138 @@ public class OrderRentVehicleService extends AbstractOrderHandle<OrderRentVehicl ...@@ -143,75 +144,138 @@ public class OrderRentVehicleService extends AbstractOrderHandle<OrderRentVehicl
//设置订单名称 //设置订单名称
bo.getOrder().setName(bo.getVehicleModel().getName()); bo.getOrder().setName(bo.getVehicleModel().getName());
//是否有使用会员权益 则调用接口触发新增消费记录次数 //分布式事务执行标记
//扣减免费天数 Integer cloudTransact = 0;
if(SYS_TRUE.equals(bo.getOrder().getHasMemberRight())) {
if(null == bo.getFreeDays()) {
bo.setFreeDays(0);
}
int result = userFeign.memberDays(bo.getAppUserDTO().getUserid(), bo.getFreeDays(), UserFeign.MEMBER_DAYS_LOCK);
if(result < 0) {
throw new BaseException(ResultCode.FAILED_CODE);
}
}
OrderItem vehicleModelItem = bo.getItemByTypeEnum(ItemTypeEnum.VEHICLE_MODEL);
BigDecimal amount = vehicleModelItem.getTotalAmount();
//如果有使用优惠券,则扣减
if(BigDecimal.ZERO.compareTo(bo.getOrder().getCouponAmount()) < 0) {
activityFeign.use(bo.getAppUserDTO().getUserid(), Convert.toList(String.class, bo.getOrder().getCouponTickerNos()), bo.getOrder().getNo(), channel, amount, ActivityFeign.TYPE_USE);
}
//插入随声物品item try{
List<OrderAccompanyDTO> oads = new ArrayList<OrderAccompanyDTO>(); //插入随声物品item
List<AccompanyingItemVo> accompanyingItemList = vehicleFeign.listAccompanyingItem().getData(); List<OrderAccompanyDTO> oads = new ArrayList<OrderAccompanyDTO>();
List<AccompanyingItemVo> accompanyingItemList = vehicleFeign.listAccompanyingItem().getData();
// Map<String, AccompanyingItemVo> accompanyingItemMap = vehicleFeign.listAccompanyingItem().getData() // Map<String, AccompanyingItemVo> accompanyingItemMap = vehicleFeign.listAccompanyingItem().getData()
// .parallelStream().collect(Collectors.toMap(en -> en.getId().toString(), en -> en)); // .parallelStream().collect(Collectors.toMap(en -> en.getId().toString(), en -> en));
if(null == bo.getAccompanyItems()) { if(null == bo.getAccompanyItems()) {
bo.setAccompanyItems(new ArrayList<OrderAccompanyDTO>()); bo.setAccompanyItems(new ArrayList<OrderAccompanyDTO>());
} }
Map<String, OrderAccompanyDTO> orderAccompanyDTOMap = bo.getAccompanyItems() Map<String, OrderAccompanyDTO> orderAccompanyDTOMap = bo.getAccompanyItems()
.parallelStream().collect(Collectors.toMap(en -> en.getId().toString(), en -> en)); .parallelStream().collect(Collectors.toMap(en -> en.getId().toString(), en -> en));
for(AccompanyingItemVo aiv : accompanyingItemList) { for(AccompanyingItemVo aiv : accompanyingItemList) {
if(AccompanyingItemType.TOOL.getCode().equals(aiv.getType()) if(AccompanyingItemType.TOOL.getCode().equals(aiv.getType())
|| AccompanyingItemType.EQUIPMENT.getCode().equals(aiv.getType())) { || AccompanyingItemType.EQUIPMENT.getCode().equals(aiv.getType())) {
OrderAccompanyDTO orderAccompanyDTO = BeanUtil.toBean(aiv, OrderAccompanyDTO.class); OrderAccompanyDTO orderAccompanyDTO = BeanUtil.toBean(aiv, OrderAccompanyDTO.class);
orderAccompanyDTO.setUnitPrice(aiv.getPrice());
orderAccompanyDTO.setNum(aiv.getNumber());
oads.add(orderAccompanyDTO);
}else {
OrderAccompanyDTO orderAccompanyDTO = orderAccompanyDTOMap.get(aiv.getId().toString());
if(null != orderAccompanyDTO) {
BeanUtil.copyProperties(aiv, orderAccompanyDTO);
orderAccompanyDTO.setUnitPrice(aiv.getPrice()); orderAccompanyDTO.setUnitPrice(aiv.getPrice());
orderAccompanyDTO.setNum(aiv.getNumber());
oads.add(orderAccompanyDTO); oads.add(orderAccompanyDTO);
}else {
OrderAccompanyDTO orderAccompanyDTO = orderAccompanyDTOMap.get(aiv.getId().toString());
if(null != orderAccompanyDTO) {
BeanUtil.copyProperties(aiv, orderAccompanyDTO);
orderAccompanyDTO.setUnitPrice(aiv.getPrice());
oads.add(orderAccompanyDTO);
}
} }
} }
} bo.setAccompanyItems(oads);
bo.setAccompanyItems(oads);
//获取可用车辆 //获取可用车辆
acquireVehicle(bo, null, null); acquireVehicle(bo, null, null);
cloudTransact = 1;
OrderItem accompanyItem = orderItemBiz.initOrderItem(BigDecimal.ZERO, 1, "随车物品", null, ACCOMPANY); //添加随声物品项
accompanyItem.setRealAmount(BigDecimal.ZERO); OrderItem accompanyItem = orderItemBiz.initOrderItem(BigDecimal.ZERO, 1, "随车物品", null, ACCOMPANY);
accompanyItem.setDetail(JSONUtil.toJsonStr(bo.getAccompanyItems())); accompanyItem.setRealAmount(BigDecimal.ZERO);
accompanyItem.setOrderId(bo.getOrder().getId()); accompanyItem.setDetail(JSONUtil.toJsonStr(bo.getAccompanyItems()));
orderItemBiz.insertSelective(accompanyItem); accompanyItem.setOrderId(bo.getOrder().getId());
orderItemBiz.insertSelective(accompanyItem);
//是否有使用会员权益 则调用接口触发新增消费记录次数
//扣减免费天数
useOrBackFreeDays(bo, UserFeign.MEMBER_DAYS_LOCK);
cloudTransact = 2;
//设置后台系统创建人 OrderItem vehicleModelItem = bo.getItemByTypeEnum(ItemTypeEnum.VEHICLE_MODEL);
if(StrUtil.isNotBlank(bo.getCrtUser())) { BigDecimal amount = vehicleModelItem.getTotalAmount();
bo.getOrder().setCrtUser(bo.getCrtUser());
//如果有使用优惠券,则扣减
if(BigDecimal.ZERO.compareTo(bo.getOrder().getCouponAmount()) < 0) {
activityFeign.use(bo.getAppUserDTO().getUserid(), Convert.toList(String.class, bo.getOrder().getCouponTickerNos()), bo.getOrder().getNo(), channel, amount, ActivityFeign.TYPE_USE);
}
cloudTransact = 3;
//设置后台系统创建人
if(StrUtil.isNotBlank(bo.getCrtUser())) {
bo.getOrder().setCrtUser(bo.getCrtUser());
}
super.handleDetail(bo);
}catch (Exception e) {
//事务补偿处理
log.error("cloudTransact : {}", cloudTransact);
RestResponse<Integer> restResponse;
try {
//判断分布式事务执行到哪里
switch (cloudTransact) {
case 1 :
//取消车辆预定
//未支付,拒绝之前的预约
errorRejectVehicle(bo);
break;
case 2 :
//取消车辆预定
//未支付,拒绝之前的预约
errorRejectVehicle(bo);
useOrBackFreeDays(bo, UserFeign.MEMBER_DAYS_WITHDRAW);
break;
case 3 :
//取消车辆预定
//未支付,拒绝之前的预约
errorRejectVehicle(bo);
//退还天数
useOrBackFreeDays(bo, UserFeign.MEMBER_DAYS_WITHDRAW);
//退还优惠券
for(String backCoupon : Convert.toList(String.class, bo.getOrder().getCouponTickerNos())) {
activityFeign.cancelUse(backCoupon);
}
break;
default:
break;
}
} catch (Exception ex) {
log.error(ex.getMessage(), ex);
} finally {
throw e;
}
} }
super.handleDetail(bo);
//发送定时取消订单(数据字典设置--5分钟) //发送定时取消订单(数据字典设置--5分钟)
rabbitProduct.sendDelayMessage(bo.getOrder(), autoCancelTime); rabbitProduct.sendDelayMessage(bo.getOrder(), autoCancelTime);
} }
private void useOrBackFreeDays(RentVehicleBO bo, int memberDaysWithdraw) {
//退还天数
if (SYS_TRUE.equals(bo.getOrder().getHasMemberRight())) {
if (null == bo.getFreeDays()) {
bo.setFreeDays(0);
}
int result = userFeign.memberDays(bo.getAppUserDTO().getUserid(), bo.getFreeDays(), memberDaysWithdraw);
if (result < 0) {
throw new BaseException(ResultCode.FAILED_CODE);
}
}
}
private void errorRejectVehicle(RentVehicleBO bo) {
//取消车辆预定
//未支付,拒绝之前的预约
RestResponse<Integer> restResponse = vehicleFeign.rentRejectVehicleBooking(bo.getBookRecordId());
log.info("下单失败,拒绝预约{}, 结果: {}", bo.getBookRecordId(), restResponse.toString());
}
@Override @Override
public void handleCalculate(RentVehicleBO bo) { public void handleCalculate(RentVehicleBO bo) {
RentVehiclePriceVO rvpv = calculatePrice(bo); RentVehiclePriceVO rvpv = calculatePrice(bo);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment