diff --git a/Others/README.md b/Others/README.md
index e32f54a..6233534 100644
--- a/Others/README.md
+++ b/Others/README.md
@@ -1,3 +1,5 @@
MavenRepo: 不存在的Maven依赖,需要手动复制到本地Maven仓库中
-sql: 项目数据库文件
\ No newline at end of file
+sql: 项目数据库文件
+
+课程:https://www.imooc.com/video/18469
\ No newline at end of file
diff --git a/Others/sql/flashsale.sql b/Others/sql/flashsale.sql
index daac562..7910f4c 100644
--- a/Others/sql/flashsale.sql
+++ b/Others/sql/flashsale.sql
@@ -11,7 +11,7 @@
Target Server Version : 50726
File Encoding : 65001
- Date: 05/03/2022 15:19:32
+ Date: 05/03/2022 16:32:52
*/
SET NAMES utf8mb4;
@@ -93,6 +93,7 @@ CREATE TABLE `order_info` (
`item_price` decimal(10, 2) NOT NULL,
`amount` int(255) NOT NULL,
`order_price` decimal(10, 2) NOT NULL,
+ `promo_id` int(11) NOT NULL DEFAULT 0,
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci ROW_FORMAT = DYNAMIC;
@@ -114,7 +115,7 @@ CREATE TABLE `promo_info` (
PRIMARY KEY (`id`) USING BTREE,
INDEX `item_id`(`item_id`) USING BTREE,
CONSTRAINT `promo_info_ibfk_1` FOREIGN KEY (`item_id`) REFERENCES `item_info` (`id`) ON DELETE RESTRICT ON UPDATE RESTRICT
-) ENGINE = InnoDB AUTO_INCREMENT = 2 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci ROW_FORMAT = Dynamic;
+) ENGINE = InnoDB AUTO_INCREMENT = 2 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci ROW_FORMAT = DYNAMIC;
-- ----------------------------
-- Records of promo_info
@@ -135,7 +136,7 @@ CREATE TABLE `sequence_info` (
-- ----------------------------
-- Records of sequence_info
-- ----------------------------
-INSERT INTO `sequence_info` VALUES ('order_info', 0, 1);
+INSERT INTO `sequence_info` VALUES ('order_info', 5, 1);
-- ----------------------------
-- Table structure for user_info
diff --git a/frontend/getitem.html b/frontend/getitem.html
index 2d14603..a9469be 100644
--- a/frontend/getitem.html
+++ b/frontend/getitem.html
@@ -108,6 +108,7 @@
data: {
"itemId": g_itemVO.id,
"amount": 1, // 暂时写死,买1件
+ "promoId": g_itemVO.promoId,
},
xhrFields: {withCredentials: true},
success: function (data) {
diff --git a/src/main/java/com/cxyxiaomo/flashsale/controller/ItemController.java b/src/main/java/com/cxyxiaomo/flashsale/controller/ItemController.java
index 6af77bf..1e5e7c4 100644
--- a/src/main/java/com/cxyxiaomo/flashsale/controller/ItemController.java
+++ b/src/main/java/com/cxyxiaomo/flashsale/controller/ItemController.java
@@ -82,7 +82,7 @@ public class ItemController extends BaseController {
if (itemModel.getPromoModel() != null) {
// 有正在进行或即将进行的秒杀活动
itemVO.setPromoStatus(itemModel.getPromoModel().getStatus());
- itemVO.setPromoId(itemModel.getId());
+ itemVO.setPromoId(itemModel.getPromoModel().getId());
itemVO.setStartDate(itemModel.getPromoModel().getStartDate().toString(DateTimeFormat.forPattern("yyyy-MM-dd HH:mm:ss")));
itemVO.setPromoPrice(itemModel.getPromoModel().getPromoPrice());
} else {
diff --git a/src/main/java/com/cxyxiaomo/flashsale/controller/OrderController.java b/src/main/java/com/cxyxiaomo/flashsale/controller/OrderController.java
index 6b6b529..bb7e0cc 100644
--- a/src/main/java/com/cxyxiaomo/flashsale/controller/OrderController.java
+++ b/src/main/java/com/cxyxiaomo/flashsale/controller/OrderController.java
@@ -27,7 +27,8 @@ public class OrderController extends BaseController {
@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 {
+ @RequestParam(name = "amount") Integer amount,
+ @RequestParam(name = "promoId", required = false) Integer promoId) throws BusinessException {
// 获取用户登陆状态
Boolean isLogin = (Boolean) httpServletRequest.getSession().getAttribute("IS_LOGIN");
if (isLogin == null || !isLogin.booleanValue()) {
@@ -36,7 +37,7 @@ public class OrderController extends BaseController {
// 获取用户的登录信息
UserModel userModel = (UserModel) httpServletRequest.getSession().getAttribute("LOGIN_USER");
- OrderModel orderModel = orderService.createOrder(userModel.getId(), itemId, amount);
+ OrderModel orderModel = orderService.createOrder(userModel.getId(), itemId, promoId, amount);
return CommonReturnType.create(null);
}
diff --git a/src/main/java/com/cxyxiaomo/flashsale/dao/OrderDOMapper.java b/src/main/java/com/cxyxiaomo/flashsale/dao/OrderDOMapper.java
index 0de7dcb..7b7aa0f 100644
--- a/src/main/java/com/cxyxiaomo/flashsale/dao/OrderDOMapper.java
+++ b/src/main/java/com/cxyxiaomo/flashsale/dao/OrderDOMapper.java
@@ -7,7 +7,7 @@ public interface OrderDOMapper {
* This method was generated by MyBatis Generator.
* This method corresponds to the database table order_info
*
- * @mbg.generated Thu Mar 03 22:04:45 CST 2022
+ * @mbg.generated Sat Mar 05 15:52:04 CST 2022
*/
int deleteByPrimaryKey(String id);
@@ -15,7 +15,7 @@ public interface OrderDOMapper {
* This method was generated by MyBatis Generator.
* This method corresponds to the database table order_info
*
- * @mbg.generated Thu Mar 03 22:04:45 CST 2022
+ * @mbg.generated Sat Mar 05 15:52:04 CST 2022
*/
int insert(OrderDO record);
@@ -23,7 +23,7 @@ public interface OrderDOMapper {
* This method was generated by MyBatis Generator.
* This method corresponds to the database table order_info
*
- * @mbg.generated Thu Mar 03 22:04:45 CST 2022
+ * @mbg.generated Sat Mar 05 15:52:04 CST 2022
*/
int insertSelective(OrderDO record);
@@ -31,7 +31,7 @@ public interface OrderDOMapper {
* This method was generated by MyBatis Generator.
* This method corresponds to the database table order_info
*
- * @mbg.generated Thu Mar 03 22:04:45 CST 2022
+ * @mbg.generated Sat Mar 05 15:52:04 CST 2022
*/
OrderDO selectByPrimaryKey(String id);
@@ -39,7 +39,7 @@ public interface OrderDOMapper {
* This method was generated by MyBatis Generator.
* This method corresponds to the database table order_info
*
- * @mbg.generated Thu Mar 03 22:04:45 CST 2022
+ * @mbg.generated Sat Mar 05 15:52:04 CST 2022
*/
int updateByPrimaryKeySelective(OrderDO record);
@@ -47,7 +47,7 @@ public interface OrderDOMapper {
* This method was generated by MyBatis Generator.
* This method corresponds to the database table order_info
*
- * @mbg.generated Thu Mar 03 22:04:45 CST 2022
+ * @mbg.generated Sat Mar 05 15:52:04 CST 2022
*/
int updateByPrimaryKey(OrderDO record);
}
\ No newline at end of file
diff --git a/src/main/java/com/cxyxiaomo/flashsale/dataobject/OrderDO.java b/src/main/java/com/cxyxiaomo/flashsale/dataobject/OrderDO.java
index f85f7e9..15d4bef 100644
--- a/src/main/java/com/cxyxiaomo/flashsale/dataobject/OrderDO.java
+++ b/src/main/java/com/cxyxiaomo/flashsale/dataobject/OrderDO.java
@@ -8,7 +8,7 @@ public class OrderDO {
* This field was generated by MyBatis Generator.
* This field corresponds to the database column order_info.id
*
- * @mbg.generated Thu Mar 03 22:04:45 CST 2022
+ * @mbg.generated Sat Mar 05 15:52:04 CST 2022
*/
private String id;
@@ -17,7 +17,7 @@ public class OrderDO {
* This field was generated by MyBatis Generator.
* This field corresponds to the database column order_info.user_id
*
- * @mbg.generated Thu Mar 03 22:04:45 CST 2022
+ * @mbg.generated Sat Mar 05 15:52:04 CST 2022
*/
private Integer userId;
@@ -26,7 +26,7 @@ public class OrderDO {
* This field was generated by MyBatis Generator.
* This field corresponds to the database column order_info.item_id
*
- * @mbg.generated Thu Mar 03 22:04:45 CST 2022
+ * @mbg.generated Sat Mar 05 15:52:04 CST 2022
*/
private Integer itemId;
@@ -35,7 +35,7 @@ public class OrderDO {
* This field was generated by MyBatis Generator.
* This field corresponds to the database column order_info.item_price
*
- * @mbg.generated Thu Mar 03 22:04:45 CST 2022
+ * @mbg.generated Sat Mar 05 15:52:04 CST 2022
*/
private BigDecimal itemPrice;
@@ -44,7 +44,7 @@ public class OrderDO {
* This field was generated by MyBatis Generator.
* This field corresponds to the database column order_info.amount
*
- * @mbg.generated Thu Mar 03 22:04:45 CST 2022
+ * @mbg.generated Sat Mar 05 15:52:04 CST 2022
*/
private Integer amount;
@@ -53,17 +53,26 @@ public class OrderDO {
* This field was generated by MyBatis Generator.
* This field corresponds to the database column order_info.order_price
*
- * @mbg.generated Thu Mar 03 22:04:45 CST 2022
+ * @mbg.generated Sat Mar 05 15:52:04 CST 2022
*/
private BigDecimal orderPrice;
+ /**
+ *
+ * This field was generated by MyBatis Generator.
+ * This field corresponds to the database column order_info.promo_id
+ *
+ * @mbg.generated Sat Mar 05 15:52:04 CST 2022
+ */
+ private Integer promoId;
+
/**
* This method was generated by MyBatis Generator.
* This method returns the value of the database column order_info.id
*
* @return the value of order_info.id
*
- * @mbg.generated Thu Mar 03 22:04:45 CST 2022
+ * @mbg.generated Sat Mar 05 15:52:04 CST 2022
*/
public String getId() {
return id;
@@ -75,7 +84,7 @@ public class OrderDO {
*
* @param id the value for order_info.id
*
- * @mbg.generated Thu Mar 03 22:04:45 CST 2022
+ * @mbg.generated Sat Mar 05 15:52:04 CST 2022
*/
public void setId(String id) {
this.id = id == null ? null : id.trim();
@@ -87,7 +96,7 @@ public class OrderDO {
*
* @return the value of order_info.user_id
*
- * @mbg.generated Thu Mar 03 22:04:45 CST 2022
+ * @mbg.generated Sat Mar 05 15:52:04 CST 2022
*/
public Integer getUserId() {
return userId;
@@ -99,7 +108,7 @@ public class OrderDO {
*
* @param userId the value for order_info.user_id
*
- * @mbg.generated Thu Mar 03 22:04:45 CST 2022
+ * @mbg.generated Sat Mar 05 15:52:04 CST 2022
*/
public void setUserId(Integer userId) {
this.userId = userId;
@@ -111,7 +120,7 @@ public class OrderDO {
*
* @return the value of order_info.item_id
*
- * @mbg.generated Thu Mar 03 22:04:45 CST 2022
+ * @mbg.generated Sat Mar 05 15:52:04 CST 2022
*/
public Integer getItemId() {
return itemId;
@@ -123,7 +132,7 @@ public class OrderDO {
*
* @param itemId the value for order_info.item_id
*
- * @mbg.generated Thu Mar 03 22:04:45 CST 2022
+ * @mbg.generated Sat Mar 05 15:52:04 CST 2022
*/
public void setItemId(Integer itemId) {
this.itemId = itemId;
@@ -135,7 +144,7 @@ public class OrderDO {
*
* @return the value of order_info.item_price
*
- * @mbg.generated Thu Mar 03 22:04:45 CST 2022
+ * @mbg.generated Sat Mar 05 15:52:04 CST 2022
*/
public BigDecimal getItemPrice() {
return itemPrice;
@@ -147,7 +156,7 @@ public class OrderDO {
*
* @param itemPrice the value for order_info.item_price
*
- * @mbg.generated Thu Mar 03 22:04:45 CST 2022
+ * @mbg.generated Sat Mar 05 15:52:04 CST 2022
*/
public void setItemPrice(BigDecimal itemPrice) {
this.itemPrice = itemPrice;
@@ -159,7 +168,7 @@ public class OrderDO {
*
* @return the value of order_info.amount
*
- * @mbg.generated Thu Mar 03 22:04:45 CST 2022
+ * @mbg.generated Sat Mar 05 15:52:04 CST 2022
*/
public Integer getAmount() {
return amount;
@@ -171,7 +180,7 @@ public class OrderDO {
*
* @param amount the value for order_info.amount
*
- * @mbg.generated Thu Mar 03 22:04:45 CST 2022
+ * @mbg.generated Sat Mar 05 15:52:04 CST 2022
*/
public void setAmount(Integer amount) {
this.amount = amount;
@@ -183,7 +192,7 @@ public class OrderDO {
*
* @return the value of order_info.order_price
*
- * @mbg.generated Thu Mar 03 22:04:45 CST 2022
+ * @mbg.generated Sat Mar 05 15:52:04 CST 2022
*/
public BigDecimal getOrderPrice() {
return orderPrice;
@@ -195,9 +204,33 @@ public class OrderDO {
*
* @param orderPrice the value for order_info.order_price
*
- * @mbg.generated Thu Mar 03 22:04:45 CST 2022
+ * @mbg.generated Sat Mar 05 15:52:04 CST 2022
*/
public void setOrderPrice(BigDecimal orderPrice) {
this.orderPrice = orderPrice;
}
+
+ /**
+ * This method was generated by MyBatis Generator.
+ * This method returns the value of the database column order_info.promo_id
+ *
+ * @return the value of order_info.promo_id
+ *
+ * @mbg.generated Sat Mar 05 15:52:04 CST 2022
+ */
+ public Integer getPromoId() {
+ return promoId;
+ }
+
+ /**
+ * This method was generated by MyBatis Generator.
+ * This method sets the value of the database column order_info.promo_id
+ *
+ * @param promoId the value for order_info.promo_id
+ *
+ * @mbg.generated Sat Mar 05 15:52:04 CST 2022
+ */
+ public void setPromoId(Integer promoId) {
+ this.promoId = promoId;
+ }
}
\ No newline at end of file
diff --git a/src/main/java/com/cxyxiaomo/flashsale/service/OrderService.java b/src/main/java/com/cxyxiaomo/flashsale/service/OrderService.java
index 2b2f06a..713c88f 100644
--- a/src/main/java/com/cxyxiaomo/flashsale/service/OrderService.java
+++ b/src/main/java/com/cxyxiaomo/flashsale/service/OrderService.java
@@ -11,5 +11,5 @@ public interface OrderService {
* @param amount 购买商品数量
* @return
*/
- OrderModel createOrder(Integer userId, Integer itemId, Integer amount) throws BusinessException;
+ OrderModel createOrder(Integer userId, Integer itemId, Integer promoId, Integer amount) throws BusinessException;
}
diff --git a/src/main/java/com/cxyxiaomo/flashsale/service/impl/OrderServiceImpl.java b/src/main/java/com/cxyxiaomo/flashsale/service/impl/OrderServiceImpl.java
index 9c0fe18..21f325f 100644
--- a/src/main/java/com/cxyxiaomo/flashsale/service/impl/OrderServiceImpl.java
+++ b/src/main/java/com/cxyxiaomo/flashsale/service/impl/OrderServiceImpl.java
@@ -39,7 +39,7 @@ public class OrderServiceImpl implements OrderService {
@Override
@Transactional
- public OrderModel createOrder(Integer userId, Integer itemId, Integer amount) throws BusinessException {
+ public OrderModel createOrder(Integer userId, Integer itemId, Integer promoId, Integer amount) throws BusinessException {
// 1. 校验下单状态
// 下单的商品是否存在;用户是否合法;购买数量是否正确
ItemModel itemModel = itemService.getItemById(itemId);
@@ -56,7 +56,18 @@ public class OrderServiceImpl implements OrderService {
throw new BusinessException(EmBusinessError.PARAMETER_VALIDATION_ERROR, "数量信息不正确");
}
- // 2. 落单减库存 / 支付减库存(有可能超卖)
+ // 校验活动信息
+ if (promoId != null) {
+ if (promoId.intValue() != itemModel.getPromoModel().getId()) {
+ // (1) 校验对应活动是否存在这个适用商品
+ throw new BusinessException(EmBusinessError.PARAMETER_VALIDATION_ERROR, "活动信息不正确");
+ } else if (itemModel.getPromoModel().getStatus() != 2) {
+ // (2) 校验活动是否进行中
+ throw new BusinessException(EmBusinessError.PARAMETER_VALIDATION_ERROR, "不在活动时间内");
+ }
+ }
+
+ // 2. 落单减库存
boolean result = itemService.decreaseStock(itemId, amount);
if (!result) {
throw new BusinessException(EmBusinessError.STOCK_NOT_ENOUGH);
@@ -67,8 +78,13 @@ public class OrderServiceImpl implements OrderService {
orderModel.setUserId(userId);
orderModel.setItemId(itemId);
orderModel.setAmount(amount);
- orderModel.setItemPrice(itemModel.getPrice());
- orderModel.setOrderPrice(itemModel.getPrice().multiply(new BigDecimal(amount)));
+ if (promoId != null) {
+ orderModel.setItemPrice(itemModel.getPromoModel().getPromoPrice());
+ } else {
+ orderModel.setItemPrice(itemModel.getPrice());
+ }
+ orderModel.setPromoId(promoId);
+ orderModel.setOrderPrice(orderModel.getItemPrice().multiply(new BigDecimal(amount)));
// 生成交易流水号(订单号)
orderModel.setId(generateOrderNo());
diff --git a/src/main/java/com/cxyxiaomo/flashsale/service/model/OrderModel.java b/src/main/java/com/cxyxiaomo/flashsale/service/model/OrderModel.java
index f054175..00a9f34 100644
--- a/src/main/java/com/cxyxiaomo/flashsale/service/model/OrderModel.java
+++ b/src/main/java/com/cxyxiaomo/flashsale/service/model/OrderModel.java
@@ -14,13 +14,16 @@ public class OrderModel {
// 购买的商品Id
private Integer itemId;
- // 购买商品的单价
+ // 若非空,则表示是以秒杀商品方式下单
+ private Integer promoId;
+
+ // 购买商品的单价(若promoId非空,则表示秒杀商品价格)
private BigDecimal itemPrice;
// 购买数量
private Integer amount;
- // 购买金额
+ // 购买金额(若promoId非空,则表示秒杀商品价格)
private BigDecimal orderPrice;
public String getId() {
@@ -47,6 +50,14 @@ public class OrderModel {
this.itemId = itemId;
}
+ public Integer getPromoId() {
+ return promoId;
+ }
+
+ public void setPromoId(Integer promoId) {
+ this.promoId = promoId;
+ }
+
public BigDecimal getItemPrice() {
return itemPrice;
}
diff --git a/src/main/resources/mapping/OrderDOMapper.xml b/src/main/resources/mapping/OrderDOMapper.xml
index 8a48298..e8f2a07 100644
--- a/src/main/resources/mapping/OrderDOMapper.xml
+++ b/src/main/resources/mapping/OrderDOMapper.xml
@@ -5,7 +5,7 @@
@@ -13,20 +13,21 @@
+
- id, user_id, item_id, item_price, amount, order_price
+ id, user_id, item_id, item_price, amount, order_price, promo_id