首先創建交易模型,然後根據模型創建表,生成實體。然後創建service,寫創建訂單的方法。
創建訂單
1校驗下單狀態 商品存在?用戶合法?購買數量正確?
@Override
public ItemModel getItemById(Integer id) {
ItemDO itemDO = itemDOMapper.selectByPrimaryKey(id);
if (itemDO==null){
return null;
}
ItemStockDO itemStockDO = itemStockDOMapper.selectByItemId(itemDO.getId());
ItemModel itemModel = convertItemModelFromItemDO(itemDO,itemStockDO);
return itemModel;
}
@Override
public UserModel getUserById(Integer id) {
userDO userDO = userDOMapper.selectByPrimaryKey(id);
if (userDO == null){
return null;
}
UserPasswordDO userPasswordDO = userPasswordDOMapper.selectByUserId(id);
return converFronDataObject(userDO,userPasswordDO);
}
2落單減庫存(下單就鎖庫存),支付減庫存(支付纔去減庫存)這裏使用落單減庫存
在itemservice中創建一個減庫存的方法decreaseStock,接收商品id和數量的參數。然後在庫存的mapper.xml中新增
<update id="decreaseStock">
update item_stock
set stock = stock - #{amount}
where item_id = #{itemId} and stock >= #{amount}
</update>
ItemStockDOMapper.Java中
int decreaseStock(@Param("itemId") Integer itemId,@Param("amount") Integer amount);
然後在decreaseStock中調用itemStockDOMapper的decreaseStock,接收返回值,根據返回值來確定修改結果
@Override
public boolean decreaseStock(Integer itemId,Integer amount) throws BusinessException {
int affectedRow = itemStockDOMapper.decreaseStock(itemId,amount);
if (affectedRow>0){
return true;
}else {
return false;
}
}
3.生成交易流水號
自增序列:在數據庫中建一張表,包含name,currentValue,step。step是步長。在使用時每次都根據name來取對應的currentValue,並且取出來之後要更新currentValue,使它加上它的一個步長,這樣就可以保證每次的自增序列不會重複
根據name獲取tSequence:
<select id="getSequenceByName" parameterType="java.lang.String" resultMap="BaseResultMap">
select
<include refid="Base_Column_List" />
from sequence_info
where name = #{name,jdbcType=VARCHAR} for update
</select>
生成流水號:
@Transactional(propagation = Propagation.REQUIRES_NEW)
public String generateOderNo(){
//訂單號16位
StringBuilder stringBuilder = new StringBuilder();
//前8位是年月日
LocalDateTime now = LocalDateTime.now();
String nowDate = now.format(DateTimeFormatter.ISO_DATE).replace("-","");
stringBuilder.append(nowDate);
//中間6位爲自增序列
int sequence = 0;
SequenceDO sequenceDO = sequenceDOMapper.getSequenceByName("order_info");
sequence = sequenceDO.getCurrentValue();
sequenceDO.setCurrentValue(sequenceDO.getCurrentValue()+sequenceDO.getStep());
sequenceDOMapper.updateByPrimaryKeySelective(sequenceDO);
String sequencestr = String.valueOf(sequence);
for (int i=0;i<6-sequencestr.length();i++){
stringBuilder.append(0);
}
stringBuilder.append(sequencestr);
//最後2位爲分庫分表位 暫時寫死
stringBuilder.append("00");
return stringBuilder.toString();
}
private OrderInfoDO convertDOFromModel(orderModel orderModel){
if (orderModel==null){
return null;
}
OrderInfoDO orderInfoDO = new OrderInfoDO();
orderInfoDO.setId(orderModel.getId());
orderInfoDO.setAmount(orderModel.getAmount());
orderInfoDO.setItemid(orderModel.getItemId());
orderInfoDO.setItemprice(orderModel.getItemPrice().doubleValue());
orderInfoDO.setOrderprice(orderModel.getOrderPrice().doubleValue());
orderInfoDO.setUserid(orderModel.getUserId());
return orderInfoDO;
}
4訂單入庫
5加上商品銷量
在xml中增加一個方法然後在itemservice中調用
<update id="increaseSales" parameterType="com.miaosha3.dataobject.ItemDO">
update item
set sales = sales + #{amount},
where id = #{id,jdbcType=INTEGER}
</update>
@Override
@Transactional
public void increaseSales(Integer itemId, Integer amount) {
itemDOMapper.increaseSales(itemId,amount);
}
6返回前端
@Override
@Transactional
public orderModel createOrder(Integer userId, Integer itemId, Integer amount) throws BusinessException {
//校驗下單狀態 商品存在?用戶合法?購買數量正確?
ItemModel itemModel = itemService.getItemById(itemId);
if (itemModel==null){
throw new BusinessException(EmBusinessError.PAEAMETER_VALIDATION_ERROR,"商品信息不合法");
}
if (itemModel.getStock()<amount){
throw new BusinessException(EmBusinessError.PAEAMETER_VALIDATION_ERROR,"商品數量不足");
}
UserModel userModel = userService.getUserById(userId);
if (userModel==null){
throw new BusinessException(EmBusinessError.PAEAMETER_VALIDATION_ERROR,"用戶信息不存在");
}
if (amount <= 0 ||amount > 99){
throw new BusinessException(EmBusinessError.PAEAMETER_VALIDATION_ERROR,"數量信息不正確");
}
//落單減庫存(下單就鎖庫存),支付減庫存(支付纔去減庫存)這裏使用落單減庫存
boolean result = itemService.decreaseStock(itemId,amount);
if (!result){
throw new BusinessException(EmBusinessError.STOCK_NOT_ENOUGH);
}
//訂單入庫
orderModel orderModel = new orderModel();
orderModel.setUserId(userId);
orderModel.setItemId(itemId);
orderModel.setAmount(amount);
orderModel.setItemPrice(itemModel.getPrice());
orderModel.setOrderPrice(orderModel.getItemPrice().multiply(
new BigDecimal(amount)
));
//生成交易流水號
orderModel.setId(generateOderNo());
OrderInfoDO orderInfoDO = convertDOFromModel(orderModel);
orderInfoDOMapper.insertSelective(orderInfoDO);
//加上商品銷量
itemService.increaseSales(itemId,amount);
//返回前端
return null;
}
封裝下單請求
在控制器接收請求,在封裝請求調用service
@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("IS_LOGIN");//登錄成功保存的session
if (isLogin == null || !isLogin.booleanValue()){
throw new BusinessException(EmBusinessError.NOT_LOGIN);
}
UserModel userModel = (UserModel) httpServletRequest.getSession().getAttribute("LOGIN_USER");
orderModel orderModel = orderService.createOrder(userModel.getId(),itemId,amount);
return CommonReturnType.create(null);
}