库存递减Dao
@Update ( "update tb_sku set seckill_num=seckill_num-#{count} where id=#{id} and seckill_num>=#{count} and islock=1" )
int dcount ( @Param ( "id" ) String id, @Param ( "count" ) Integer count) ;
库存递减serviceImpl
@Override
public int dcount ( String id, Integer count) {
int dcount = skuMapper. dcount ( id, count) ;
if ( dcount== 0 ) {
Sku sku = skuMapper. selectByPrimaryKey ( id) ;
if ( sku. getSeckillNum ( ) < count) {
return StatusCode . DECOUNT_NUM ;
} else if ( sku. getIslock ( ) == 2 ) {
return StatusCode . DECOUNT_HOT ;
}
return 0 ;
}
return StatusCode . DECOUNT_OK ;
}
库存递减Controller
@PutMapping ( value = "/dcount/{id}/{count}" )
public Result < Sku > dcount ( @PathVariable ( value = "id" ) String id, @PathVariable ( value = "count" ) Integer count) {
int code = skuService. dcount ( id, count) ;
String message= "" ;
Sku sku = null ;
switch ( code) {
case StatusCode . DECOUNT_OK :
sku = skuService. findById ( id) ;
message= "库存递减成功!" ;
break ;
case StatusCode . DECOUNT_NUM :
message= "库存不足!" ;
break ;
case StatusCode . DECOUNT_HOT :
message= "商品是热点商品!" ;
break ;
default :
}
return new Result < Sku > ( true , code, message, sku) ;
}
新增订单serviceImpl
@GlobalTransactional
@Override
public int add ( Order order) {
String userKey= "USER" + order. getUsername ( ) + "ID" + order. getSkuId ( ) ;
Result < Sku > dcount = skuFeign. dcount ( order. getSkuId ( ) , order. getTotalNum ( ) ) ;
if ( dcount. getCode ( ) == StatusCode . DECOUNT_OK ) {
Sku sku = dcount. getData ( ) ;
order. setOrderStatus ( "0" ) ;
order. setPayStatus ( "0" ) ;
order. setConsignStatus ( "0" ) ;
order. setSkuId ( sku. getId ( ) ) ;
order. setName ( sku. getName ( ) ) ;
order. setPrice ( sku. getSeckillPrice ( ) * order. getTotalNum ( ) ) ;
orderMapper. insertSelective ( order) ;
redisTemplate. boundValueOps ( userKey) . set ( "" ) ;
redisTemplate. boundValueOps ( userKey) . expire ( 1 , TimeUnit . MINUTES ) ;
return StatusCode . ORDER_OK ;
} else {
if ( dcount. getCode ( ) == StatusCode . DECOUNT_NUM ) {
return StatusCode . DECOUNT_NUM ;
} else if ( dcount. getCode ( ) == StatusCode . DECOUNT_HOT ) {
String key = "SKU_" + order. getSkuId ( ) ;
Long increment = redisTemplate. boundHashOps ( key) . increment ( userKey, 1 ) ;
if ( increment== 1 ) {
Map < String , String > queueMap = new HashMap < String , String > ( ) ;
queueMap. put ( "username" , order. getUsername ( ) ) ;
queueMap. put ( "id" , order. getSkuId ( ) ) ;
kafkaTemplate. send ( "neworder" , JSON . toJSONString ( queueMap) ) ;
}
return StatusCode . ORDER_QUEUE ;
}
return dcount. getCode ( ) ;
}
}