Spring Boot 構建電商基礎秒殺項目 (十) 交易下單
阿新 • • 發佈:2019-03-24
ttr sum dell tps 項目 true create items log
SpringBoot構建電商基礎秒殺項目 學習筆記
新建表
create table if not exists order_info ( id varchar(32) not null default '', user_id int not null default 0, item_id int not null default 0, item_price double(10, 2) not null default 0, amount int not null default 0, order_price double(10, 2) default 0, primary key (id) ); create table if not exists sequence_info ( name varchar(64) not null default '', current_value int not null default 0, step int not null default 1, primary key (name) ); insert into sequence_info (name, current_value, step) values ('order_info', 1, 1);
新增 OrderModel
public class OrderModel { private String id; private Integer userId; private Integer itemId; private BigDecimal itemPrice; private Integer amount; private BigDecimal orderPrice; public String getId() { return id; } public void setId(String id) { this.id = id; } public Integer getUserId() { return userId; } public void setUserId(Integer userId) { this.userId = userId; } public Integer getItemId() { return itemId; } public void setItemId(Integer itemId) { this.itemId = itemId; } public BigDecimal getItemPrice() { return itemPrice; } public void setItemPrice(BigDecimal itemPrice) { this.itemPrice = itemPrice; } public Integer getAmount() { return amount; } public void setAmount(Integer amount) { this.amount = amount; } public BigDecimal getOrderPrice() { return orderPrice; } public void setOrderPrice(BigDecimal orderPrice) { this.orderPrice = orderPrice; } }
新增 ItemService
public interface ItemService { ItemModel createItem(ItemModel itemModel) throws BusinessException; List<ItemModel> listItem(); ItemModel getItemById(Integer id); boolean decreaseStock(Integer itemId, Integer amount); void increaseSales(Integer itemId, Integer amount) throws BusinessException; }
新增 ItemServiceImpl
@Service
public class ItemServiceImpl implements ItemService {
@Autowired
private ValidatorImpl validator;
@Autowired
private ItemDOMapper itemDOMapper;
@Autowired
private ItemStockDOMapper itemStockDOMapper;
@Override
@Transactional
public ItemModel createItem(ItemModel itemModel) throws BusinessException {
ValidationResult result = validator.validate(itemModel);
if(result.isHasErrors()){
throw new BusinessException(EmBusinessError.PARAMETER_VALIDATION_ERROR, result.getErrMsg());
}
ItemDO itemDO = convertFromModel(itemModel);
itemDOMapper.insertSelective(itemDO);
itemModel.setId(itemDO.getId());
ItemStockDO itemStockDO = convertItemStockFromModel(itemModel);
itemStockDOMapper.insertSelective(itemStockDO);
return getItemById(itemModel.getId());
}
@Override
public List<ItemModel> listItem() {
List<ItemDO> itemDOList = itemDOMapper.listItem();
List<ItemModel> itemModelList = itemDOList.stream().map(itemDO -> {
ItemStockDO itemStockDO = itemStockDOMapper.selectByItemId(itemDO.getId());
ItemModel itemModel = convertFromDataObject(itemDO, itemStockDO);
return itemModel;
}).collect(Collectors.toList());
return itemModelList;
}
@Override
public ItemModel getItemById(Integer id) {
ItemDO itemDO = itemDOMapper.selectByPrimaryKey(id);
if(itemDO == null){
return null;
}
ItemStockDO itemStockDO = itemStockDOMapper.selectByItemId(itemDO.getId());
ItemModel itemModel = convertFromDataObject(itemDO, itemStockDO);
return itemModel;
}
private ItemDO convertFromModel(ItemModel itemModel){
if(itemModel == null){
return null;
}
ItemDO itemDO = new ItemDO();
BeanUtils.copyProperties(itemModel, itemDO);
itemDO.setPrice(itemModel.getPrice().doubleValue());
return itemDO;
}
private ItemStockDO convertItemStockFromModel(ItemModel itemModel){
if(itemModel == null){
return null;
}
ItemStockDO itemStockDO = new ItemStockDO();
itemStockDO.setItemId(itemModel.getId());
itemStockDO.setStock(itemModel.getStock());
return itemStockDO;
}
private ItemModel convertFromDataObject(ItemDO itemDO, ItemStockDO itemStockDO){
if(itemDO == null){
return null;
}
ItemModel itemModel = new ItemModel();
BeanUtils.copyProperties(itemDO, itemModel);
itemModel.setPrice(new BigDecimal(itemDO.getPrice()));
itemModel.setStock(itemStockDO.getStock());
return itemModel;
}
@Override
@Transactional
public boolean decreaseStock(Integer itemId, Integer amount) {
int affectedRow = itemStockDOMapper.decreaseStock(itemId, amount);
return affectedRow > 0;
}
@Override
@Transactional
public void increaseSales(Integer itemId, Integer amount) throws BusinessException {
itemDOMapper.increaseSales(itemId, amount);
}
}
新增 OrderController
@Controller("order")
@RequestMapping("/order")
@CrossOrigin(allowCredentials = "true", allowedHeaders = "*")
public class OrderController extends BaseController {
@Autowired
private OrderService orderService;
@Autowired
private HttpServletRequest httpServletRequest;
@RequestMapping(value = "/createorder", method = {RequestMethod.POST}, consumes = {CONTENT_TYPE_FORMED})
@ResponseBody
public CommonReturnType createOrder(@RequestParam(name="itemId") Integer itemId,
@RequestParam(name="amount") Integer amount)
throws BusinessException {
Boolean isLogin = (Boolean)httpServletRequest.getSession().getAttribute("LOGIN");
if(isLogin == null || !isLogin.booleanValue()){
throw new BusinessException(EmBusinessError.USER_NOT_LOGIN);
}
UserModel userModel = (UserModel)httpServletRequest.getSession().getAttribute("LOGIN_USER");
OrderModel orderModel = orderService.createOrder(userModel.getId(), itemId, amount);
return CommonReturnType.create(null);
}
}
源碼:spring-boot-seckill
Spring Boot 構建電商基礎秒殺項目 (十) 交易下單