diff --git a/README.md b/README.md index 13149b1c6..220de8853 100644 --- a/README.md +++ b/README.md @@ -183,20 +183,22 @@ youlai-mall [![Star History Chart](https://api.star-history.com/svg?repos=youlaitech/youlai-mall&type=Timeline)](https://star-history.com/#youlaitech/youlai-mall&Timeline) -## 💻贡献者们 +## 💻贡献者 -## 💥加交流群 +## 🚀交流群 -> 群二维码失效添加开发者,备注“有来”进群即可 +> 关注「有来技术」公众号,获取交流群二维码。 +> +> 如果交流群的二维码过期,加我微信,备注「前端」、「后端」或「全栈」即可。 +> +> 为了避免营销广告人群混入,此举无奈,望理解! -| 交流群 | 开发者 | 开发者 | -|---------------------------------------------------------|-------------------------------------------------|---------------------------------------------------| -| ![](https://oss.youlai.tech/youlai-boot/2023/05/13/d085a0b01c914daebe9b4e0f251b9fc4.png) | ![](https://www.youlai.tech/files/blog/rui.jpg) | ![](https://www.youlai.tech/files/blog/chuan.jpg) | -| ![](https://s2.loli.net/2022/11/19/OGjum9wr8f6idLX.png) | -|---------------------------------------------------------| +|公众号|交流群| +|-|-| +||| ## 📰开源协议 diff --git a/docs/nacos/nacos_config.zip b/docs/nacos/nacos_config.zip index b2680a818..d55fc5244 100644 Binary files a/docs/nacos/nacos_config.zip and b/docs/nacos/nacos_config.zip differ diff --git a/docs/sql/mysql5.x/mall_oms.sql b/docs/sql/mysql5.x/mall_oms.sql index ff269b0b6..aeeeba54f 100644 --- a/docs/sql/mysql5.x/mall_oms.sql +++ b/docs/sql/mysql5.x/mall_oms.sql @@ -2,6 +2,7 @@ * 商城订单表 * MySQL5.x版本 */ + use mall_oms; SET NAMES utf8; @@ -16,16 +17,17 @@ CREATE TABLE `oms_order` ( `order_sn` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '' COMMENT '订单号', `total_amount` bigint NOT NULL DEFAULT 0 COMMENT '订单总额(分)', `total_quantity` int NOT NULL DEFAULT 0 COMMENT '商品总数', - `source_type` tinyint NOT NULL DEFAULT 1 COMMENT '订单来源[0->PC订单;1->APP订单]', + `source` tinyint NULL DEFAULT NULL COMMENT '订单来源(1:APP;2:网页)', `status` int NOT NULL DEFAULT 101 COMMENT '订单状态:\r\n101->待付款;\r\n102->用户取消;\r\n103->系统取消;\r\n201->已付款;\r\n202->申请退款;\r\n203->已退款;\r\n301->待发货;\r\n401->已发货;\r\n501->用户收货;\r\n502->系统收货;\r\n901->已完成;', `remark` varchar(500) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '' COMMENT '订单备注', `member_id` bigint NOT NULL DEFAULT 0 COMMENT '会员id', `coupon_id` bigint NOT NULL DEFAULT 0 COMMENT '使用的优惠券', `coupon_amount` bigint NOT NULL DEFAULT 0 COMMENT '优惠券抵扣金额(分)', `freight_amount` bigint NOT NULL DEFAULT 0 COMMENT '运费金额(分)', + `payment_amount` bigint NOT NULL DEFAULT 0 COMMENT '应付总额(分)', `pay_amount` bigint NOT NULL DEFAULT 0 COMMENT '应付总额(分)', - `pay_time` datetime NULL DEFAULT NULL COMMENT '支付时间', - `pay_type` tinyint NULL DEFAULT NULL COMMENT '支付方式【1->微信jsapi;2->支付宝;3->余额; 4->微信app;】', + `payment_time` datetime NULL DEFAULT NULL COMMENT '支付时间', + `payment_method` tinyint NULL DEFAULT NULL COMMENT '支付方式(1:微信JSAPI;2:支付宝;3:余额;4:微信APP)', `out_trade_no` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '微信支付等第三方支付平台的商户订单号', `transaction_id` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '微信支付订单号', `out_refund_no` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '商户退款单号', @@ -37,31 +39,14 @@ CREATE TABLE `oms_order` ( `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间', `update_time` datetime NULL DEFAULT NULL COMMENT '修改时间', PRIMARY KEY (`id`) USING BTREE, - UNIQUE INDEX `index_order_sn`(`order_sn`) USING BTREE COMMENT '订单号唯一索引', - UNIQUE INDEX `index_otn`(`out_trade_no`) USING BTREE COMMENT '商户订单号唯一索引', - UNIQUE INDEX `index_ti`(`transaction_id`) USING BTREE COMMENT '商户支付单号唯一索引', - UNIQUE INDEX `index_orn`(`out_refund_no`) USING BTREE COMMENT '商户退款单号唯一索引', - UNIQUE INDEX `index_ri`(`refund_id`) USING BTREE COMMENT '退款单号唯一索引' -) ENGINE = InnoDB AUTO_INCREMENT = 1351548262424821956 CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '订单详情表' ROW_FORMAT = DYNAMIC; + UNIQUE INDEX `index_order_sn`(`order_sn` ASC) USING BTREE COMMENT '订单号唯一索引', + UNIQUE INDEX `index_otn`(`out_trade_no` ASC) USING BTREE COMMENT '商户订单号唯一索引', + UNIQUE INDEX `index_ti`(`transaction_id` ASC) USING BTREE COMMENT '商户支付单号唯一索引', + UNIQUE INDEX `index_orn`(`out_refund_no` ASC) USING BTREE COMMENT '商户退款单号唯一索引', + UNIQUE INDEX `index_ri`(`refund_id` ASC) USING BTREE COMMENT '退款单号唯一索引' +) ENGINE = InnoDB AUTO_INCREMENT = 1351548262424822232 CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '订单详情表' ROW_FORMAT = DYNAMIC; + --- ---------------------------- --- Records of oms_order --- ---------------------------- -INSERT INTO `oms_order` VALUES (1351548262424821940, '20210815300000009', 100, 1, 1, 201, '', 39, 0, 0, 0, 100, '2021-08-15 12:38:02', 3, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0, '2021-08-15 12:38:02', '2021-08-15 12:38:02'); -INSERT INTO `oms_order` VALUES (1351548262424821941, '20210815300000010', 300, 1, 1, 201, '', 39, 0, 0, 0, 300, '2021-08-15 21:34:00', 3, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0, '2021-08-15 21:33:56', '2021-08-15 21:34:00'); -INSERT INTO `oms_order` VALUES (1351548262424821942, '20210815300000011', 100, 1, 1, 201, '', 4, 0, 0, 0, 100, '2021-08-15 21:34:16', 3, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0, '2021-08-15 21:34:10', '2021-08-15 21:34:16'); -INSERT INTO `oms_order` VALUES (1351548262424821943, '20210815300000012', 100, 1, 1, 201, '', 39, 0, 0, 0, 100, '2021-08-15 21:44:02', 3, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0, '2021-08-15 21:44:01', '2021-08-15 21:44:02'); -INSERT INTO `oms_order` VALUES (1351548262424821944, '20210815300000013', 100, 1, 1, 201, '', 39, 0, 0, 0, 100, '2021-08-15 21:45:27', 3, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0, '2021-08-15 21:45:21', '2021-08-15 21:45:27'); -INSERT INTO `oms_order` VALUES (1351548262424821945, '20210815300000014', 100, 1, 1, 201, '', 39, 0, 0, 0, 100, '2021-08-15 22:00:38', 3, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0, '2021-08-15 22:00:36', '2021-08-15 22:00:38'); -INSERT INTO `oms_order` VALUES (1351548262424821948, '20210816300000002', 100, 1, 1, 201, '', 39, 0, 0, 0, 100, '2021-08-16 23:18:17', 3, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0, '2021-08-16 23:18:14', '2021-08-16 23:18:17'); -INSERT INTO `oms_order` VALUES (1351548262424821949, '20210828300000009', 100, 1, 1, 201, '', 39, 0, 0, 0, 100, '2021-08-28 00:43:59', 3, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0, '2021-08-28 00:43:55', NULL); -INSERT INTO `oms_order` VALUES (1351548262424821950, '20220213300000040', 100, 1, 1, 201, '', 39, 0, 0, 0, 100, '2022-02-13 21:55:52', 3, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0, '2022-02-13 21:52:46', '2022-02-13 21:52:46'); -INSERT INTO `oms_order` VALUES (1351548262424821951, '20220224300000001', 100, 1, 1, 201, '', 39, 0, 0, 0, 100, '2022-02-24 00:54:10', 3, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0, '2022-02-24 00:54:06', '2022-02-24 00:54:06'); -INSERT INTO `oms_order` VALUES (1351548262424821952, '20220224300000002', 100, 1, 1, 201, '', 39, 0, 0, 0, 100, '2022-02-24 00:54:56', 3, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0, '2022-02-24 00:54:55', '2022-02-24 00:54:55'); -INSERT INTO `oms_order` VALUES (1351548262424821953, '20220224300000003', 100, 1, 1, 201, '', 39, 0, 0, 0, 100, '2022-02-24 01:16:40', 3, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0, '2022-02-24 01:16:37', '2022-02-24 01:16:37'); -INSERT INTO `oms_order` VALUES (1351548262424821954, '20220224300000004', 100, 1, 1, 201, '', 39, 0, 0, 0, 100, '2022-02-24 01:17:21', 3, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0, '2022-02-24 01:17:20', '2022-02-24 01:17:20'); -INSERT INTO `oms_order` VALUES (1351548262424821955, '20220224300000005', 100, 1, 1, 201, '', 39, 0, 0, 0, 100, '2022-02-24 09:34:55', 3, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0, '2022-02-24 09:34:53', '2022-02-24 09:34:53'); -INSERT INTO `oms_order` VALUES (1351548262424821956, '20220224300000008', 100, 1, 1, 103, '', 39, 0, 0, 0, 100, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0, '2022-02-24 23:23:22', '2022-02-24 23:23:22'); -- ---------------------------- -- Table structure for oms_order_delivery @@ -106,95 +91,16 @@ CREATE TABLE `oms_order_item` ( `sku_name` varchar(128) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '' COMMENT '规格名称', `pic_url` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '' COMMENT '商品图片', `price` bigint NOT NULL DEFAULT 0 COMMENT '商品单价(单位:分)', - `count` int NOT NULL DEFAULT 0 COMMENT '商品数量', + `quantity` int NULL DEFAULT NULL COMMENT '商品数量', `total_amount` bigint NOT NULL DEFAULT 0 COMMENT '商品总价(单位:分)', `deleted` tinyint(1) NULL DEFAULT 0 COMMENT '逻辑删除标识(1:已删除;0:正常)', `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间', `update_time` datetime NULL DEFAULT NULL COMMENT '修改时间', PRIMARY KEY (`id`) USING BTREE, - INDEX `index_order_id`(`order_id`) USING BTREE COMMENT '订单id索引' -) ENGINE = InnoDB AUTO_INCREMENT = 210 CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '订单商品信息表' ROW_FORMAT = DYNAMIC; + INDEX `index_order_id`(`order_id` ASC) USING BTREE COMMENT '订单id索引' +) ENGINE = InnoDB AUTO_INCREMENT = 501 CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '订单商品信息表' ROW_FORMAT = DYNAMIC; + --- ---------------------------- --- Records of oms_order_item --- ---------------------------- -INSERT INTO `oms_order_item` VALUES (128, 1351548262424821882, NULL, 190, '1614505936507', '测试手机2 黑 4+64 ', 'http://a.youlai.store:9000/default/37729cd58065419f84b15f44b0e4f27f.jpg', 159900, 1, 159900, 0, '2021-03-22 23:34:46', '2021-03-22 23:34:46'); -INSERT INTO `oms_order_item` VALUES (129, 1351548262424821883, NULL, 190, '1614505936507', '测试手机2 黑 4+64 ', 'http://a.youlai.store:9000/default/37729cd58065419f84b15f44b0e4f27f.jpg', 159900, 1, 159900, 0, '2021-03-23 01:03:47', '2021-03-23 01:03:47'); -INSERT INTO `oms_order_item` VALUES (130, 1351548262424821884, NULL, 190, '1614505936507', '测试手机2 黑 4+64 ', 'http://a.youlai.store:9000/default/37729cd58065419f84b15f44b0e4f27f.jpg', 159900, 2, 319800, 0, '2021-03-23 01:10:17', '2021-03-23 01:10:17'); -INSERT INTO `oms_order_item` VALUES (131, 1351548262424821885, NULL, 190, '1614505936507', '测试手机2 黑 4+64 ', 'http://a.youlai.store:9000/default/37729cd58065419f84b15f44b0e4f27f.jpg', 159900, 1, 159900, 0, '2021-03-23 02:21:27', '2021-03-23 02:21:27'); -INSERT INTO `oms_order_item` VALUES (132, 1351548262424821886, NULL, 190, '1614505936507', '测试手机2 黑 4+64 ', 'http://a.youlai.store:9000/default/37729cd58065419f84b15f44b0e4f27f.jpg', 159900, 2, 319800, 0, '2021-03-23 06:37:27', '2021-03-23 06:37:27'); -INSERT INTO `oms_order_item` VALUES (133, 1351548262424821887, NULL, 190, '1614505936507', '测试手机2 黑 4+64 ', 'http://a.youlai.store:9000/default/37729cd58065419f84b15f44b0e4f27f.jpg', 159900, 1, 159900, 0, '2021-03-23 07:02:27', '2021-03-23 07:02:27'); -INSERT INTO `oms_order_item` VALUES (134, 1351548262424821888, NULL, 190, '1614505936507', '测试手机2 黑 4+64 ', 'http://a.youlai.store:9000/default/37729cd58065419f84b15f44b0e4f27f.jpg', 159900, 2, 319800, 0, '2021-03-23 07:31:43', '2021-03-23 07:31:43'); -INSERT INTO `oms_order_item` VALUES (135, 1351548262424821889, NULL, 190, '1614505936507', '测试手机2 黑 4+64 ', 'http://a.youlai.store:9000/default/37729cd58065419f84b15f44b0e4f27f.jpg', 159900, 1, 159900, 0, '2021-03-23 18:55:41', '2021-03-23 18:55:41'); -INSERT INTO `oms_order_item` VALUES (136, 1351548262424821890, NULL, 190, '1614505936507', '测试手机2 黑 4+64 ', 'http://a.youlai.store:9000/default/37729cd58065419f84b15f44b0e4f27f.jpg', 159900, 2, 319800, 0, '2021-03-25 19:02:51', '2021-03-25 19:02:51'); -INSERT INTO `oms_order_item` VALUES (137, 1351548262424821891, NULL, 190, '1614505936507', '测试手机2 黑 4+64 ', 'http://a.youlai.store:9000/default/37729cd58065419f84b15f44b0e4f27f.jpg', 159900, 1, 159900, 0, '2021-03-29 15:57:45', '2021-03-29 15:57:45'); -INSERT INTO `oms_order_item` VALUES (138, 1351548262424821892, NULL, 186, '1614505517559', '测试手机1 黑 6+128 ', 'http://a.youlai.store:9000/default/9715dde8c35c429b8c56cbe800ebd205.jpg', 299900, 1, 299900, 0, '2021-03-29 16:02:46', '2021-03-29 16:02:46'); -INSERT INTO `oms_order_item` VALUES (139, 1351548262424821893, NULL, 190, '1614505936507', '测试手机2 黑 4+64 ', 'http://a.youlai.store:9000/default/37729cd58065419f84b15f44b0e4f27f.jpg', 159900, 1, 159900, 0, '2021-03-31 14:22:33', '2021-03-31 14:22:33'); -INSERT INTO `oms_order_item` VALUES (140, 1351548262424821894, NULL, 190, '1614505936507', '测试手机2 黑 4+64 ', 'http://a.youlai.store:9000/default/37729cd58065419f84b15f44b0e4f27f.jpg', 159900, 1, 159900, 0, '2021-04-14 22:59:43', '2021-04-14 22:59:43'); -INSERT INTO `oms_order_item` VALUES (141, 1351548262424821895, NULL, 192, '1614505936511', '测试手机2 黑 8+256 ', 'http://a.youlai.tech:9000/default/3e369c91377a4c9f9eb33f66a6dd6906.jpg', 199900, 1, 199900, 0, '2021-04-14 23:03:21', '2021-04-14 23:03:21'); -INSERT INTO `oms_order_item` VALUES (142, 1351548262424821896, NULL, 190, '1614505936507', '测试手机2 黑 4+64 ', 'http://a.youlai.tech:9000/default/c9f6f4f2e4de46f78d9c7a87d25948e1.jpg', 159900, 1, 159900, 0, '2021-04-14 23:33:48', '2021-04-14 23:33:48'); -INSERT INTO `oms_order_item` VALUES (143, 1351548262424821897, NULL, 190, '1614505936507', '测试手机2 黑 4+64 ', 'http://a.youlai.tech:9000/default/c9f6f4f2e4de46f78d9c7a87d25948e1.jpg', 159900, 2, 319800, 0, '2021-04-14 23:38:15', '2021-04-14 23:38:15'); -INSERT INTO `oms_order_item` VALUES (144, 1351548262424821898, NULL, 190, '1614505936507', '测试手机2 黑 4+64 ', 'http://a.youlai.tech:9000/default/c9f6f4f2e4de46f78d9c7a87d25948e1.jpg', 159900, 2, 319800, 0, '2021-04-14 23:38:31', '2021-04-14 23:38:31'); -INSERT INTO `oms_order_item` VALUES (145, 1351548262424821899, NULL, 190, '1614505936507', '测试手机2 黑 4+64 ', 'http://a.youlai.tech:9000/default/c9f6f4f2e4de46f78d9c7a87d25948e1.jpg', 159900, 2, 319800, 0, '2021-04-14 23:42:47', '2021-04-14 23:42:47'); -INSERT INTO `oms_order_item` VALUES (146, 1351548262424821900, NULL, 190, '1614505936507', '测试手机2 黑 4+64 ', 'http://a.youlai.tech:9000/default/c9f6f4f2e4de46f78d9c7a87d25948e1.jpg', 159900, 3, 479700, 0, '2021-04-14 23:48:04', '2021-04-14 23:48:04'); -INSERT INTO `oms_order_item` VALUES (147, 1351548262424821901, NULL, 190, '1614505936507', '测试手机2 黑 4+64 ', 'http://a.youlai.tech:9000/default/c9f6f4f2e4de46f78d9c7a87d25948e1.jpg', 159900, 1, 159900, 0, '2021-04-16 16:18:27', '2021-04-16 16:18:27'); -INSERT INTO `oms_order_item` VALUES (150, 1351548262424821904, NULL, 232, '1622008618852', '名称 红色 l ', '', 200, 1, 200, 0, '2021-06-11 00:20:33', '2021-06-11 00:20:33'); -INSERT INTO `oms_order_item` VALUES (151, 1351548262424821905, NULL, 232, '1622008618852', '名称 红色 l ', '', 200, 1, 200, 0, '2021-06-11 00:24:07', '2021-06-11 00:24:07'); -INSERT INTO `oms_order_item` VALUES (152, 1351548262424821906, NULL, 232, '1622008618852', '名称 红色 l ', '', 200, 1, 200, 0, '2021-06-11 00:26:16', '2021-06-11 00:26:16'); -INSERT INTO `oms_order_item` VALUES (153, 1351548262424821907, NULL, 232, '1622008618852', '名称 红色 l ', '', 200, 1, 200, 0, '2021-06-11 00:42:43', '2021-06-11 00:42:43'); -INSERT INTO `oms_order_item` VALUES (154, 1351548262424821908, NULL, 236, '1623369301480', '测试合约机 黑 6+64g ', 'http://a.youlai.tech:9000/default/c6e941103d8841acaf2f3f7356e11686.jpg', 999900, 1, 999900, 0, '2021-06-11 07:58:04', '2021-06-11 07:58:04'); -INSERT INTO `oms_order_item` VALUES (155, 1351548262424821909, NULL, 236, '1623369301480', '测试合约机 黑 6+64g ', 'http://a.youlai.tech:9000/default/c6e941103d8841acaf2f3f7356e11686.jpg', 999900, 1, 999900, 0, '2021-06-11 08:35:11', '2021-06-11 08:35:11'); -INSERT INTO `oms_order_item` VALUES (156, 1351548262424821909, NULL, 244, '1623369301480', '测试合约机 蓝 12+256g ', 'http://a.youlai.tech:9000/default/c6e941103d8841acaf2f3f7356e11686.jpg', 999900, 1, 999900, 0, '2021-06-11 08:35:11', '2021-06-11 08:35:11'); -INSERT INTO `oms_order_item` VALUES (157, 1351548262424821910, NULL, 236, '1623369301480', '测试合约机 黑 6+64g ', 'http://a.youlai.tech:9000/default/c6e941103d8841acaf2f3f7356e11686.jpg', 999900, 1, 999900, 0, '2021-06-12 14:16:13', '2021-06-12 14:16:13'); -INSERT INTO `oms_order_item` VALUES (158, 1351548262424821911, NULL, 236, '1623369301480', '测试合约机 黑 6+64g ', 'http://a.youlai.tech:9000/default/c6e941103d8841acaf2f3f7356e11686.jpg', 999900, 2, 1999800, 0, '2021-06-17 08:48:45', '2021-06-17 08:48:45'); -INSERT INTO `oms_order_item` VALUES (163, 1351548262424821918, NULL, 236, '1623369301480', '测试合约机 黑 6+64g ', 'http://a.youlai.tech:9000/default/c6e941103d8841acaf2f3f7356e11686.jpg', 999900, 2, 1999800, 0, NULL, NULL); -INSERT INTO `oms_order_item` VALUES (164, 1351548262424821919, NULL, 236, '1623369301480', '测试合约机 黑 6+64g ', 'http://a.youlai.tech:9000/default/c6e941103d8841acaf2f3f7356e11686.jpg', 999900, 1, 999900, 0, NULL, NULL); -INSERT INTO `oms_order_item` VALUES (165, 1351548262424821920, NULL, 236, '1623369301480', '测试合约机 黑 6+64g ', 'http://a.youlai.tech:9000/default/c6e941103d8841acaf2f3f7356e11686.jpg', 999900, 2, 1999800, 0, NULL, NULL); -INSERT INTO `oms_order_item` VALUES (166, 1351548262424821921, NULL, 197, '1616310848932', '测试衣服1 白 M ', 'http://a.youlai.store:9000/default/063350d473a64ee7857e91841add1177.jpg', 29900, 1, 29900, 0, NULL, NULL); -INSERT INTO `oms_order_item` VALUES (167, 1351548262424821922, NULL, 197, '1616310848932', '测试衣服1 白 M ', 'http://a.youlai.store:9000/default/063350d473a64ee7857e91841add1177.jpg', 29900, 4, 119600, 0, NULL, NULL); -INSERT INTO `oms_order_item` VALUES (168, 1351548262424821923, NULL, 245, '1626080416010', 'huawei mate40pro 12 2 3 ', '', 609900, 1, 609900, 0, NULL, NULL); -INSERT INTO `oms_order_item` VALUES (169, 1351548262424821924, NULL, 245, '1626080416010', 'huawei mate40pro 12 2 3 ', '', 609900, 2, 1219800, 0, NULL, NULL); -INSERT INTO `oms_order_item` VALUES (170, 1351548262424821925, NULL, 245, '1626080416010', 'huawei mate40pro 12 2 3 ', '', 609900, 2, 1219800, 0, NULL, NULL); -INSERT INTO `oms_order_item` VALUES (171, 1351548262424821927, NULL, 300, '1', 'tid_1_1|tid_2_1|tid_3_', 'http://a.youlai.tech:9000/default/852f076dd41d4e199c969289838149fa.jpg', 100, 1, 100, 0, '2021-08-13 00:25:33', '2021-08-13 00:25:33'); -INSERT INTO `oms_order_item` VALUES (172, 1351548262424821928, NULL, 300, '1', 'tid_1_1|tid_2_1|tid_3_', 'http://a.youlai.tech:9000/default/852f076dd41d4e199c969289838149fa.jpg', 100, 1, 100, 0, '2021-08-13 00:29:25', '2021-08-13 00:29:25'); -INSERT INTO `oms_order_item` VALUES (173, 1351548262424821912, NULL, 300, '1', 'tid_1_1|tid_2_1|tid_3_', 'http://a.youlai.tech:9000/default/852f076dd41d4e199c969289838149fa.jpg', 100, 1, 100, 0, '2021-08-13 22:45:19', '2021-08-13 22:45:19'); -INSERT INTO `oms_order_item` VALUES (174, 1351548262424821913, NULL, 300, '1', 'tid_1_1|tid_2_1|tid_3_', 'http://a.youlai.tech:9000/default/852f076dd41d4e199c969289838149fa.jpg', 100, 1, 100, 0, '2021-08-13 23:37:42', '2021-08-13 23:37:42'); -INSERT INTO `oms_order_item` VALUES (175, 1351548262424821914, NULL, 300, '1', 'tid_1_1|tid_2_1|tid_3_', 'http://a.youlai.tech:9000/default/852f076dd41d4e199c969289838149fa.jpg', 100, 1, 100, 0, '2021-08-14 00:17:19', '2021-08-14 00:17:19'); -INSERT INTO `oms_order_item` VALUES (176, 1351548262424821914, NULL, 291, '1', '', 'http://a.youlai.tech:9000/default/fb3f1be8aae644f497255f29aa51c641.jpg', 100, 1, 100, 0, '2021-08-14 00:17:19', '2021-08-14 00:17:19'); -INSERT INTO `oms_order_item` VALUES (177, 1351548262424821915, NULL, 300, '1', 'tid_1_1|tid_2_1|tid_3_', 'http://a.youlai.tech:9000/default/852f076dd41d4e199c969289838149fa.jpg', 100, 1, 100, 0, '2021-08-14 01:24:26', '2021-08-14 01:24:26'); -INSERT INTO `oms_order_item` VALUES (178, 1351548262424821916, NULL, 300, '1', 'tid_1_1|tid_2_1|tid_3_', 'http://a.youlai.tech:9000/default/852f076dd41d4e199c969289838149fa.jpg', 100, 1, 100, 0, '2021-08-14 17:24:13', '2021-08-14 17:24:13'); -INSERT INTO `oms_order_item` VALUES (179, 1351548262424821917, NULL, 300, '1', 'tid_1_1|tid_2_1|tid_3_', 'http://a.youlai.tech:9000/default/852f076dd41d4e199c969289838149fa.jpg', 100, 1, 100, 0, '2021-08-14 17:30:19', '2021-08-14 17:30:19'); -INSERT INTO `oms_order_item` VALUES (180, 1351548262424821918, NULL, 300, '1', 'tid_1_1|tid_2_1|tid_3_', 'http://a.youlai.tech:9000/default/852f076dd41d4e199c969289838149fa.jpg', 100, 1, 100, 0, '2021-08-14 18:58:28', '2021-08-14 18:58:28'); -INSERT INTO `oms_order_item` VALUES (181, 1351548262424821919, NULL, 300, '1', 'tid_1_1|tid_2_1|tid_3_', 'http://a.youlai.tech:9000/default/852f076dd41d4e199c969289838149fa.jpg', 100, 2, 200, 0, '2021-08-14 19:01:46', '2021-08-14 19:01:46'); -INSERT INTO `oms_order_item` VALUES (182, 1351548262424821921, NULL, 300, '1', 'tid_1_1|tid_2_1|tid_3_', 'http://a.youlai.tech:9000/default/852f076dd41d4e199c969289838149fa.jpg', 100, 1, 100, 0, '2021-08-14 21:41:42', '2021-08-14 21:41:42'); -INSERT INTO `oms_order_item` VALUES (183, 1351548262424821922, NULL, 300, '1', 'tid_1_1|tid_2_1|tid_3_', 'http://a.youlai.tech:9000/default/852f076dd41d4e199c969289838149fa.jpg', 100, 1, 100, 0, '2021-08-14 22:32:39', '2021-08-14 22:32:39'); -INSERT INTO `oms_order_item` VALUES (184, 1351548262424821923, NULL, 300, '1', 'tid_1_1|tid_2_1|tid_3_', 'http://a.youlai.tech:9000/default/852f076dd41d4e199c969289838149fa.jpg', 100, 1, 100, 0, '2021-08-14 22:35:14', '2021-08-14 22:35:14'); -INSERT INTO `oms_order_item` VALUES (185, 1351548262424821924, NULL, 300, '1', 'tid_1_1|tid_2_1|tid_3_', 'http://a.youlai.tech:9000/default/852f076dd41d4e199c969289838149fa.jpg', 100, 1, 100, 0, '2021-08-14 22:38:04', '2021-08-14 22:38:04'); -INSERT INTO `oms_order_item` VALUES (186, 1351548262424821925, NULL, 300, '1', 'tid_1_1|tid_2_1|tid_3_', 'http://a.youlai.tech:9000/default/852f076dd41d4e199c969289838149fa.jpg', 100, 1, 100, 0, '2021-08-14 23:14:42', '2021-08-14 23:14:42'); -INSERT INTO `oms_order_item` VALUES (187, 1351548262424821926, NULL, 300, '1', 'tid_1_1|tid_2_1|tid_3_', 'http://a.youlai.tech:9000/default/852f076dd41d4e199c969289838149fa.jpg', 100, 1, 100, 0, '2021-08-15 00:42:26', '2021-08-15 00:42:26'); -INSERT INTO `oms_order_item` VALUES (188, 1351548262424821927, NULL, 300, '1', 'tid_1_1|tid_2_1|tid_3_', 'http://a.youlai.tech:9000/default/852f076dd41d4e199c969289838149fa.jpg', 100, 1, 100, 0, '2021-08-15 00:46:45', '2021-08-15 00:46:45'); -INSERT INTO `oms_order_item` VALUES (189, 1351548262424821928, NULL, 300, '1', 'tid_1_1|tid_2_1|tid_3_', 'http://a.youlai.tech:9000/default/852f076dd41d4e199c969289838149fa.jpg', 100, 1, 100, 0, '2021-08-15 00:50:57', '2021-08-15 00:50:57'); -INSERT INTO `oms_order_item` VALUES (190, 1351548262424821929, NULL, 300, '1', 'tid_1_1|tid_2_1|tid_3_', 'http://a.youlai.tech:9000/default/852f076dd41d4e199c969289838149fa.jpg', 100, 1, 100, 0, '2021-08-15 00:54:41', '2021-08-15 00:54:41'); -INSERT INTO `oms_order_item` VALUES (191, 1351548262424821930, NULL, 300, '1', 'tid_1_1|tid_2_1|tid_3_', 'http://a.youlai.tech:9000/default/852f076dd41d4e199c969289838149fa.jpg', 100, 1, 100, 0, '2021-08-15 01:00:50', '2021-08-15 01:00:50'); -INSERT INTO `oms_order_item` VALUES (192, 1351548262424821931, NULL, 300, '1', 'tid_1_1|tid_2_1|tid_3_', 'http://a.youlai.tech:9000/default/852f076dd41d4e199c969289838149fa.jpg', 100, 1, 100, 0, '2021-08-15 09:24:03', '2021-08-15 09:24:03'); -INSERT INTO `oms_order_item` VALUES (193, 1351548262424821932, NULL, 300, '1', 'tid_1_1|tid_2_1|tid_3_', 'http://a.youlai.tech:9000/default/852f076dd41d4e199c969289838149fa.jpg', 100, 1, 100, 0, '2021-08-15 09:24:14', '2021-08-15 09:24:14'); -INSERT INTO `oms_order_item` VALUES (194, 1351548262424821933, NULL, 300, '1', 'tid_1_1|tid_2_1|tid_3_', 'http://a.youlai.tech:9000/default/852f076dd41d4e199c969289838149fa.jpg', 100, 1, 100, 0, '2021-08-15 12:23:37', '2021-08-15 12:23:37'); -INSERT INTO `oms_order_item` VALUES (195, 1351548262424821940, NULL, 300, '1', 'tid_1_1|tid_2_1|tid_3_', 'http://a.youlai.tech:9000/default/852f076dd41d4e199c969289838149fa.jpg', 100, 1, 100, 0, '2021-08-15 12:38:02', '2021-08-15 12:38:02'); -INSERT INTO `oms_order_item` VALUES (196, 1351548262424821941, NULL, 331, '4', '黑色 8+256G 套餐一 ', '', 300, 1, 300, 0, '2021-08-15 21:33:56', '2021-08-15 21:33:56'); -INSERT INTO `oms_order_item` VALUES (197, 1351548262424821942, NULL, 308, '1', '123 1233 ', '', 100, 1, 100, 0, '2021-08-15 21:34:10', '2021-08-15 21:34:10'); -INSERT INTO `oms_order_item` VALUES (198, 1351548262424821943, NULL, 300, '1', 'tid_1_1|tid_2_1|tid_3_', 'http://a.youlai.tech:9000/default/852f076dd41d4e199c969289838149fa.jpg', 100, 1, 100, 0, '2021-08-15 21:44:01', '2021-08-15 21:44:01'); -INSERT INTO `oms_order_item` VALUES (199, 1351548262424821944, NULL, 300, '1', 'tid_1_1|tid_2_1|tid_3_', 'http://a.youlai.tech:9000/default/852f076dd41d4e199c969289838149fa.jpg', 100, 1, 100, 0, '2021-08-15 21:45:22', '2021-08-15 21:45:22'); -INSERT INTO `oms_order_item` VALUES (200, 1351548262424821945, NULL, 328, '1', '黑色 6+128G 标准 ', '', 100, 1, 100, 0, '2021-08-15 22:00:37', '2021-08-15 22:00:37'); -INSERT INTO `oms_order_item` VALUES (201, 1351548262424821946, NULL, 300, '1', 'tid_1_1|tid_2_1|tid_3_', 'http://a.youlai.tech:9000/default/852f076dd41d4e199c969289838149fa.jpg', 100, 1, 100, 0, '2021-08-16 17:05:17', '2021-08-16 17:05:17'); -INSERT INTO `oms_order_item` VALUES (202, 1351548262424821948, NULL, 300, '1', 'tid_1_1|tid_2_1|tid_3_', 'http://a.youlai.tech:9000/default/852f076dd41d4e199c969289838149fa.jpg', 100, 1, 100, 0, '2021-08-16 23:18:16', '2021-08-16 23:18:16'); -INSERT INTO `oms_order_item` VALUES (203, 1351548262424821949, NULL, 300, '1', 'tid_1_1|tid_2_1|tid_3_', 'http://a.youlai.tech:9000/default/852f076dd41d4e199c969289838149fa.jpg', 100, 1, 100, 0, NULL, NULL); -INSERT INTO `oms_order_item` VALUES (204, 1351548262424821950, NULL, 300, '1', 'tid_1_1|tid_2_1|tid_3_', 'http://a.youlai.tech:9000/default/852f076dd41d4e199c969289838149fa.jpg', 100, 1, 100, 0, '2022-02-13 21:52:46', '2022-02-13 21:52:46'); -INSERT INTO `oms_order_item` VALUES (205, 1351548262424821951, NULL, 300, '1', 'tid_1_1|tid_2_1|tid_3_', 'http://a.youlai.tech:9000/default/852f076dd41d4e199c969289838149fa.jpg', 100, 1, 100, 0, '2022-02-24 00:54:07', '2022-02-24 00:54:07'); -INSERT INTO `oms_order_item` VALUES (206, 1351548262424821952, NULL, 296, '1213', '117|11', '', 100, 1, 100, 0, '2022-02-24 00:54:55', '2022-02-24 00:54:55'); -INSERT INTO `oms_order_item` VALUES (207, 1351548262424821953, NULL, 300, '1', 'tid_1_1|tid_2_1|tid_3_', 'http://a.youlai.tech:9000/default/852f076dd41d4e199c969289838149fa.jpg', 100, 1, 100, 0, '2022-02-24 01:16:38', '2022-02-24 01:16:38'); -INSERT INTO `oms_order_item` VALUES (208, 1351548262424821954, NULL, 300, '1', 'tid_1_1|tid_2_1|tid_3_', 'http://a.youlai.tech:9000/default/852f076dd41d4e199c969289838149fa.jpg', 100, 1, 100, 0, '2022-02-24 01:17:20', '2022-02-24 01:17:20'); -INSERT INTO `oms_order_item` VALUES (209, 1351548262424821955, NULL, 291, '1', '', 'http://a.youlai.tech:9000/default/fb3f1be8aae644f497255f29aa51c641.jpg', 100, 1, 100, 0, '2022-02-24 09:34:53', '2022-02-24 09:34:53'); -INSERT INTO `oms_order_item` VALUES (210, 1351548262424821956, NULL, 300, '1', 'tid_1_1|tid_2_1|tid_3_', 'http://a.youlai.tech:9000/default/852f076dd41d4e199c969289838149fa.jpg', 100, 1, 100, 0, '2022-02-24 23:23:22', '2022-02-24 23:23:22'); -- ---------------------------- -- Table structure for oms_order_log @@ -277,7 +183,7 @@ CREATE TABLE `undo_log` ( `log_status` int NOT NULL COMMENT '0:normal status,1:defense status', `log_created` datetime(6) NOT NULL COMMENT 'create datetime', `log_modified` datetime(6) NOT NULL COMMENT 'modify datetime', - UNIQUE INDEX `ux_undo_log`(`xid`, `branch_id`) USING BTREE + UNIQUE INDEX `ux_undo_log`(`xid` ASC, `branch_id` ASC) USING BTREE ) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = 'AT transaction mode undo table' ROW_FORMAT = DYNAMIC; -- ---------------------------- diff --git a/docs/sql/mysql5.x/mall_pms.sql b/docs/sql/mysql5.x/mall_pms.sql index 19cf5740c..92b2b53e4 100644 --- a/docs/sql/mysql5.x/mall_pms.sql +++ b/docs/sql/mysql5.x/mall_pms.sql @@ -1,5 +1,5 @@ /* -* 商城商品表 +* 商品数据库 * MySQL5.x版本 */ use mall_pms; @@ -71,7 +71,7 @@ CREATE TABLE `pms_category_attribute` ( `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间', `update_time` datetime NULL DEFAULT NULL COMMENT '更新时间', PRIMARY KEY (`id`) USING BTREE, - INDEX `fk_pms_attr_pms_category`(`category_id`) USING BTREE + INDEX `fk_pms_attr_pms_category`(`category_id` ASC) USING BTREE ) ENGINE = InnoDB AUTO_INCREMENT = 183 CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '商品属性表' ROW_FORMAT = DYNAMIC; -- ---------------------------- @@ -82,17 +82,17 @@ INSERT INTO `pms_category_attribute` VALUES (35, 5, '规格', 1, '2021-07-11 18: INSERT INTO `pms_category_attribute` VALUES (36, 5, '上市时间', 2, '2021-07-11 18:00:08', '2022-06-01 17:41:05'); -- ---------------------------- --- Table structure for pms_catetgory_brand +-- Table structure for pms_category_brand -- ---------------------------- -DROP TABLE IF EXISTS `pms_catetgory_brand`; -CREATE TABLE `pms_catetgory_brand` ( - `category_id` bigint NOT NULL, - `brand_id` bigint NOT NULL, - PRIMARY KEY (`category_id`) USING BTREE +DROP TABLE IF EXISTS `pms_category_brand`; +CREATE TABLE `pms_category_brand` ( + `category_id` bigint NOT NULL, + `brand_id` bigint NOT NULL, + PRIMARY KEY (`category_id`) USING BTREE ) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = DYNAMIC; -- ---------------------------- --- Records of pms_catetgory_brand +-- Records of pms_category_brand -- ---------------------------- -- ---------------------------- @@ -106,34 +106,35 @@ CREATE TABLE `pms_sku` ( `name` varchar(128) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '商品名称', `spec_ids` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '商品规格值,以英文逗号(,)分割', `price` bigint NULL DEFAULT NULL COMMENT '商品价格(单位:分)', - `stock_num` int NULL DEFAULT 0 COMMENT '库存数量', - `locked_stock_num` int NULL DEFAULT 0 COMMENT '锁定库存数量', + `stock` int UNSIGNED NULL DEFAULT NULL COMMENT '库存数量', + `locked_stock` int NULL DEFAULT NULL COMMENT '库存锁定数量', `pic_url` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '商品图片地址', `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间', `update_time` datetime NULL DEFAULT NULL COMMENT '更新时间', PRIMARY KEY (`id`) USING BTREE, - INDEX `fk_pms_sku_pms_spu`(`spu_id`) USING BTREE + INDEX `fk_pms_sku_pms_spu`(`spu_id` ASC) USING BTREE ) ENGINE = InnoDB AUTO_INCREMENT = 755 CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '商品库存表' ROW_FORMAT = DYNAMIC; -- ---------------------------- -- Records of pms_sku -- ---------------------------- -INSERT INTO `pms_sku` VALUES (1, 'sn001', 1, '黑 6+128g', '1_3', 399900, 999, 5, 'https://www.youlai.tech/files/default/c25b39470474494485633c49101a0f5d.png', '2021-08-08 00:43:26', '2022-07-03 14:16:16'); -INSERT INTO `pms_sku` VALUES (2, 'sn002', 1, '黑 8+256g', '1_4', 499900, 9998, 0, 'https://www.youlai.tech/files/default/c25b39470474494485633c49101a0f5d.png', '2021-08-08 00:43:26', '2022-07-03 14:16:16'); -INSERT INTO `pms_sku` VALUES (3, 'sn003', 1, '蓝 6+128g', '216_3', 399900, 9998, 0, 'https://www.youlai.tech/files/default/835d73a337964b9b97e5c7c90acc8cb2.png', '2022-03-05 09:25:53', '2022-07-03 14:16:16'); -INSERT INTO `pms_sku` VALUES (4, 'sn004', 1, '蓝 8+256g', '216_4', 499900, 9988, 0, 'https://www.youlai.tech/files/default/835d73a337964b9b97e5c7c90acc8cb2.png', '2022-03-05 09:25:53', '2022-07-03 14:16:16'); -INSERT INTO `pms_sku` VALUES (5, '10000001', 2, '魔幻青 RTX3060/i7-12700H/165Hz 2.5K屏', '256_258', 1025000, 9816, 26, 'http://a.youlai.tech:9000/default/8815c9a46fcc4b1ea952623406750da5.jpg', '2022-03-11 14:39:21', '2022-07-08 00:29:56'); -INSERT INTO `pms_sku` VALUES (6, '10000002', 2, '魔幻青 RTX3050tTi/12代i5/144Hz高色域屏', '256_259', 925000, 10000, 0, 'http://a.youlai.tech:9000/default/8815c9a46fcc4b1ea952623406750da5.jpg', '2022-03-11 14:39:21', '2022-07-08 00:29:56'); -INSERT INTO `pms_sku` VALUES (7, '10000003', 2, '日蚀灰 RTX3060/i7-12700H/165Hz 2.5K屏', '257_258', 1025000, 10000, 0, 'http://a.youlai.tech:9000/default/3210cd1ffb6c4346b743a10855d3cb37.jpg', '2022-03-11 14:39:21', '2022-07-08 00:29:56'); -INSERT INTO `pms_sku` VALUES (8, '10000004', 2, '日蚀灰 RTX3050tTi/12代i5/144Hz高色域屏', '257_259', 925000, 10000, 0, 'http://a.youlai.tech:9000/default/3210cd1ffb6c4346b743a10855d3cb37.jpg', '2022-03-11 14:39:21', '2022-07-08 00:29:56'); -INSERT INTO `pms_sku` VALUES (747, '111', 287, '16g 512g 【2022款】锐龙六核R5-6600U/核芯显卡/100%sRGB高色域', '841_843_845', 589900, 9991, 2, NULL, '2022-07-07 00:22:13', '2022-07-08 00:29:41'); -INSERT INTO `pms_sku` VALUES (748, '112', 287, '16g 512g 【2022款】锐龙八核R7-6800U/核芯显卡/100%sRGB高色域', '841_843_846', 629900, 9999, 0, NULL, '2022-07-07 00:22:13', '2022-07-08 00:29:41'); -INSERT INTO `pms_sku` VALUES (749, '113', 287, '16g 1t 【2022款】锐龙六核R5-6600U/核芯显卡/100%sRGB高色域', '841_844_845', 639900, 9999, 0, NULL, '2022-07-07 00:22:13', '2022-07-08 00:29:41'); -INSERT INTO `pms_sku` VALUES (750, '114', 287, '16g 1t 【2022款】锐龙八核R7-6800U/核芯显卡/100%sRGB高色域', '841_844_846', 639900, 9999, 0, NULL, '2022-07-07 00:22:13', '2022-07-08 00:29:41'); -INSERT INTO `pms_sku` VALUES (751, '115', 287, '32g 512g 【2022款】锐龙六核R5-6600U/核芯显卡/100%sRGB高色域', '842_843_845', 589900, 9999, 0, NULL, '2022-07-07 00:22:13', '2022-07-08 00:29:41'); -INSERT INTO `pms_sku` VALUES (752, '116', 287, '32g 512g 【2022款】锐龙八核R7-6800U/核芯显卡/100%sRGB高色域', '842_843_846', 629900, 9999, 0, NULL, '2022-07-07 00:22:13', '2022-07-08 00:29:41'); -INSERT INTO `pms_sku` VALUES (753, '117', 287, '32g 1t 【2022款】锐龙六核R5-6600U/核芯显卡/100%sRGB高色域', '842_844_845', 639900, 9999, 0, NULL, '2022-07-07 00:22:13', '2022-07-08 00:29:41'); -INSERT INTO `pms_sku` VALUES (754, '118', 287, '32g 1t 【2022款】锐龙八核R7-6800U/核芯显卡/100%sRGB高色域', '842_844_846', 639900, 9999, 0, NULL, '2022-07-07 00:22:13', '2022-07-08 00:29:41'); +INSERT INTO `pms_sku` VALUES (1, 'sn001', 1, '黑 6+128g', '1_3', 399900, 996, 0, 'https://www.youlai.tech/files/default/c25b39470474494485633c49101a0f5d.png', '2021-08-08 00:43:26', '2022-07-03 14:16:16'); +INSERT INTO `pms_sku` VALUES (2, 'sn002', 1, '黑 8+256g', '1_4', 499900, 999, 0, 'https://www.youlai.tech/files/default/c25b39470474494485633c49101a0f5d.png', '2021-08-08 00:43:26', '2022-07-03 14:16:16'); +INSERT INTO `pms_sku` VALUES (3, 'sn003', 1, '蓝 6+128g', '216_3', 399900, 999, 0, 'https://www.youlai.tech/files/default/835d73a337964b9b97e5c7c90acc8cb2.png', '2022-03-05 09:25:53', '2022-07-03 14:16:16'); +INSERT INTO `pms_sku` VALUES (4, 'sn004', 1, '蓝 8+256g', '216_4', 499900, 999, 0, 'https://www.youlai.tech/files/default/835d73a337964b9b97e5c7c90acc8cb2.png', '2022-03-05 09:25:53', '2022-07-03 14:16:16'); +INSERT INTO `pms_sku` VALUES (5, '10000001', 2, '魔幻青 RTX3060/i7-12700H/165Hz 2.5K屏', '256_258', 1025000, 999, 0, 'http://a.youlai.tech:9000/default/8815c9a46fcc4b1ea952623406750da5.jpg', '2022-03-11 14:39:21', '2022-07-08 00:29:56'); +INSERT INTO `pms_sku` VALUES (6, '10000002', 2, '魔幻青 RTX3050tTi/12代i5/144Hz高色域屏', '256_259', 925000, 999, 0, 'http://a.youlai.tech:9000/default/8815c9a46fcc4b1ea952623406750da5.jpg', '2022-03-11 14:39:21', '2022-07-08 00:29:56'); +INSERT INTO `pms_sku` VALUES (7, '10000003', 2, '日蚀灰 RTX3060/i7-12700H/165Hz 2.5K屏', '257_258', 1025000, 999, 0, 'http://a.youlai.tech:9000/default/3210cd1ffb6c4346b743a10855d3cb37.jpg', '2022-03-11 14:39:21', '2022-07-08 00:29:56'); +INSERT INTO `pms_sku` VALUES (8, '10000004', 2, '日蚀灰 RTX3050tTi/12代i5/144Hz高色域屏', '257_259', 925000, 999, 0, 'http://a.youlai.tech:9000/default/3210cd1ffb6c4346b743a10855d3cb37.jpg', '2022-03-11 14:39:21', '2022-07-08 00:29:56'); +INSERT INTO `pms_sku` VALUES (9, '111', 3, '16g 512g 【2022款】锐龙六核R5-6600U/核芯显卡/100%sRGB高色域', '841_843_845', 589900, 999, 0, 'https://oss.youlai.tech/youlai-boot/2023/06/08/78b8efecb753426f81e5dcfcd175495f.jpg', '2022-07-07 00:22:13', '2022-07-08 00:29:41'); +INSERT INTO `pms_sku` VALUES (10, '112', 3, '16g 512g 【2022款】锐龙八核R7-6800U/核芯显卡/100%sRGB高色域', '841_843_846', 629900, 999, 0, 'https://oss.youlai.tech/youlai-boot/2023/06/08/93cbc9dc6fe144f5a59793a6248479a0.jpg', '2022-07-07 00:22:13', '2022-07-08 00:29:41'); +INSERT INTO `pms_sku` VALUES (11, '113', 3, '16g 1t 【2022款】锐龙六核R5-6600U/核芯显卡/100%sRGB高色域', '841_844_845', 639900, 999, 0, 'https://oss.youlai.tech/youlai-boot/2023/06/08/78b8efecb753426f81e5dcfcd175495f.jpg', '2022-07-07 00:22:13', '2022-07-08 00:29:41'); +INSERT INTO `pms_sku` VALUES (12, '114', 3, '16g 1t 【2022款】锐龙八核R7-6800U/核芯显卡/100%sRGB高色域', '841_844_846', 639900, 999, 0, 'https://oss.youlai.tech/youlai-boot/2023/06/08/93cbc9dc6fe144f5a59793a6248479a0.jpg', '2022-07-07 00:22:13', '2022-07-08 00:29:41'); +INSERT INTO `pms_sku` VALUES (13, '115', 3, '32g 512g 【2022款】锐龙六核R5-6600U/核芯显卡/100%sRGB高色域', '842_843_845', 589900, 999, 0, 'https://oss.youlai.tech/youlai-boot/2023/06/08/78b8efecb753426f81e5dcfcd175495f.jpg', '2022-07-07 00:22:13', '2022-07-08 00:29:41'); +INSERT INTO `pms_sku` VALUES (14, '116', 3, '32g 512g 【2022款】锐龙八核R7-6800U/核芯显卡/100%sRGB高色域', '842_843_846', 629900, 999, 0, 'https://oss.youlai.tech/youlai-boot/2023/06/08/93cbc9dc6fe144f5a59793a6248479a0.jpg', '2022-07-07 00:22:13', '2022-07-08 00:29:41'); +INSERT INTO `pms_sku` VALUES (15, '117', 3, '32g 1t 【2022款】锐龙六核R5-6600U/核芯显卡/100%sRGB高色域', '842_844_845', 639900, 999, 0, 'https://oss.youlai.tech/youlai-boot/2023/06/08/78b8efecb753426f81e5dcfcd175495f.jpg', '2022-07-07 00:22:13', '2022-07-08 00:29:41'); +INSERT INTO `pms_sku` VALUES (16, '118', 3, '32g 1t 【2022款】锐龙八核R7-6800U/核芯显卡/100%sRGB高色域', '842_844_846', 639900, 999, 0, 'https://oss.youlai.tech/youlai-boot/2023/06/08/93cbc9dc6fe144f5a59793a6248479a0.jpg', '2022-07-07 00:22:13', '2022-07-08 00:29:41'); +INSERT INTO `pms_sku` VALUES (17, 'sn001', 4, '黑 6+128g', '1_3', 399900, 999, 0, 'https://oss.youlai.tech/youlai-boot/2023/06/08/6b83dd33eaa248ed8e11cff0003287ee.jpg', '2021-08-08 00:43:26', '2022-07-03 14:16:16'); -- ---------------------------- -- Table structure for pms_spu @@ -156,8 +157,8 @@ CREATE TABLE `pms_spu` ( `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间', `update_time` datetime NULL DEFAULT NULL COMMENT '更新时间', PRIMARY KEY (`id`) USING BTREE, - INDEX `fk_pms_spu_pms_brand`(`brand_id`) USING BTREE, - INDEX `fk_pms_spu_pms_category`(`category_id`) USING BTREE + INDEX `fk_pms_spu_pms_brand`(`brand_id` ASC) USING BTREE, + INDEX `fk_pms_spu_pms_category`(`category_id` ASC) USING BTREE ) ENGINE = InnoDB AUTO_INCREMENT = 288 CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '商品表' ROW_FORMAT = DYNAMIC; -- ---------------------------- @@ -165,7 +166,8 @@ CREATE TABLE `pms_spu` ( -- ---------------------------- INSERT INTO `pms_spu` VALUES (1, '小米12 PRO', 5, 10, 599900, 599900, 1, 'https://oss.youlai.tech/default/0ccd5bf5cf384185be1f18a01da076b9.png', '[]', '台', '好快,好稳,\n好一次强上加强。\n高通全新一代芯片赋能,速度大幅提升。\n三大专业主摄影像加持,能力全面进化。\n大师级设计理念新诠释,质感简而不凡。\n斩获十五项纪录旗舰屏,感官万般出众。', '

\"\"

', 1, NULL, '2022-07-03 14:16:16'); INSERT INTO `pms_spu` VALUES (2, '华硕天选3', 101, 11, 1145000, 929900, 0, 'https://www.youlai.tech/files/default/d97457b3fd7d4aef8846da96fe032bf8.jpg', '[\"https://www.youlai.tech/files/default/3edd01c723ff456384cea9bd3c9b19e7.jpg\", \"https://www.youlai.tech/files/default/a6681c18fc294ee49efb8e121b8e943f.jpg\", \"https://www.youlai.tech/files/default/97458ae9ea734bc498724660abb1c6cd.jpg\", \"https://www.youlai.tech/files/default/501b0e6dcb3f4d69b7e40e90b3d3ac32.jpg\"]', NULL, '中国台湾华硕电脑股份有限公司 [1] 是当前全球第一大主板生产商、全球第三大显卡生产商,同时也是全球领先的3C解决方案提供商之一,致力于为个人和企业用户提供最具创新价值的产品及应用方案。华硕的产品线完整覆盖至笔记本电脑、主板、显卡、服务器、光存储、有线/无线网络通讯产品、LCD、掌上电脑、智能手机等全线3C产品。其中显卡和主板以及笔记本电脑三大产品已经成为华硕的主要竞争实力。', '

\"\"\"\"

', 1, '2022-03-11 14:39:21', '2022-07-08 00:29:56'); -INSERT INTO `pms_spu` VALUES (287, '惠普战X ', 99, 33, 639900, 629900, 0, 'https://oss.youlai.tech/default/e59859e0effb4b66a0f7380ff5369d66.jpg', '[\"https://oss.youlai.tech/default/de9c5625e35b4c0aa9888c48d4def446.jpg\"]', NULL, '【2022新款】HP/惠普战X 16英寸锐龙新款6000系列R5六核/R7八核高性能学生家用轻薄办公商用笔记本电脑\n六核/八核处理器,高性能集成显卡', '

\"\"

', 1, '2022-07-07 00:22:13', '2022-07-08 00:29:41'); +INSERT INTO `pms_spu` VALUES (3, '惠普战X ', 99, 33, 639900, 629900, 0, 'https://oss.youlai.tech/default/e59859e0effb4b66a0f7380ff5369d66.jpg', '[\"https://oss.youlai.tech/default/de9c5625e35b4c0aa9888c48d4def446.jpg\"]', NULL, '【2022新款】HP/惠普战X 16英寸锐龙新款6000系列R5六核/R7八核高性能学生家用轻薄办公商用笔记本电脑\n六核/八核处理器,高性能集成显卡', '

\"\"

', 1, '2022-07-07 00:22:13', '2022-07-08 00:29:41'); +INSERT INTO `pms_spu` VALUES (4, '小米13', 5, 10, 599900, 599900, 1, 'https://oss.youlai.tech/youlai-boot/2023/06/08/6b83dd33eaa248ed8e11cff0003287ee.jpg', '[]', '台', '好快,好稳,\n好一次强上加强。\n高通全新一代芯片赋能,速度大幅提升。\n三大专业主摄影像加持,能力全面进化。\n大师级设计理念新诠释,质感简而不凡。\n斩获十五项纪录旗舰屏,感官万般出众。', '

\"\"

', 1, NULL, '2022-07-03 14:16:16'); -- ---------------------------- -- Table structure for pms_spu_attribute @@ -182,8 +184,8 @@ CREATE TABLE `pms_spu_attribute` ( `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间', `update_time` datetime NULL DEFAULT NULL COMMENT '更新时间', PRIMARY KEY (`id`) USING BTREE, - INDEX `fk_pms_spu_attribute_pms_attr`(`name`) USING BTREE, - INDEX `fk_pms_spu_attribute_pms_spu`(`spu_id`) USING BTREE + INDEX `fk_pms_spu_attribute_pms_attr`(`name` ASC) USING BTREE, + INDEX `fk_pms_spu_attribute_pms_spu`(`spu_id` ASC) USING BTREE ) ENGINE = InnoDB AUTO_INCREMENT = 847 CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '商品属性/规格表' ROW_FORMAT = DYNAMIC; -- ---------------------------- @@ -203,15 +205,15 @@ INSERT INTO `pms_spu_attribute` VALUES (256, 2, NULL, '颜色', '魔幻青', 1, INSERT INTO `pms_spu_attribute` VALUES (257, 2, NULL, '颜色', '日蚀灰', 1, 'http://a.youlai.tech:9000/default/3210cd1ffb6c4346b743a10855d3cb37.jpg', '2022-03-11 14:39:21', '2022-07-08 00:29:56'); INSERT INTO `pms_spu_attribute` VALUES (258, 2, NULL, '规格', 'RTX3060/i7-12700H/165Hz 2.5K屏', 1, NULL, '2022-03-11 14:39:21', '2022-07-08 00:29:56'); INSERT INTO `pms_spu_attribute` VALUES (259, 2, NULL, '规格', 'RTX3050tTi/12代i5/144Hz高色域屏', 1, NULL, '2022-03-11 14:39:21', '2022-07-08 00:29:56'); -INSERT INTO `pms_spu_attribute` VALUES (838, 287, NULL, '内存', '16g 32g', 2, NULL, '2022-07-07 00:22:13', '2022-07-08 00:29:41'); -INSERT INTO `pms_spu_attribute` VALUES (839, 287, NULL, '重量', '1.5kg(含)-2kg(不含)', 2, NULL, '2022-07-07 00:22:13', '2022-07-08 00:29:41'); -INSERT INTO `pms_spu_attribute` VALUES (840, 287, NULL, '显卡类型', '核芯显卡', 2, NULL, '2022-07-07 00:22:13', '2022-07-08 00:29:41'); -INSERT INTO `pms_spu_attribute` VALUES (841, 287, NULL, '内存容量', '16g', 1, NULL, '2022-07-07 00:22:13', '2022-07-08 00:29:41'); -INSERT INTO `pms_spu_attribute` VALUES (842, 287, NULL, '内存容量', '32g', 1, NULL, '2022-07-07 00:22:13', '2022-07-08 00:29:41'); -INSERT INTO `pms_spu_attribute` VALUES (843, 287, NULL, '硬盘容量', '512g', 1, NULL, '2022-07-07 00:22:13', '2022-07-08 00:29:41'); -INSERT INTO `pms_spu_attribute` VALUES (844, 287, NULL, '硬盘容量', '1t', 1, NULL, '2022-07-07 00:22:13', '2022-07-08 00:29:41'); -INSERT INTO `pms_spu_attribute` VALUES (845, 287, NULL, '套餐类型', '【2022款】锐龙六核R5-6600U/核芯显卡/100%sRGB高色域', 1, NULL, '2022-07-07 00:22:13', '2022-07-08 00:29:41'); -INSERT INTO `pms_spu_attribute` VALUES (846, 287, NULL, '套餐类型', '【2022款】锐龙八核R7-6800U/核芯显卡/100%sRGB高色域', 1, NULL, '2022-07-07 00:22:13', '2022-07-08 00:29:41'); +INSERT INTO `pms_spu_attribute` VALUES (838, 3, NULL, '内存', '16g 32g', 2, NULL, '2022-07-07 00:22:13', '2022-07-08 00:29:41'); +INSERT INTO `pms_spu_attribute` VALUES (839, 3, NULL, '重量', '1.5kg(含)-2kg(不含)', 2, NULL, '2022-07-07 00:22:13', '2022-07-08 00:29:41'); +INSERT INTO `pms_spu_attribute` VALUES (840, 3, NULL, '显卡类型', '核芯显卡', 2, NULL, '2022-07-07 00:22:13', '2022-07-08 00:29:41'); +INSERT INTO `pms_spu_attribute` VALUES (841, 3, NULL, '内存容量', '16g', 1, NULL, '2022-07-07 00:22:13', '2022-07-08 00:29:41'); +INSERT INTO `pms_spu_attribute` VALUES (842, 3, NULL, '内存容量', '32g', 1, NULL, '2022-07-07 00:22:13', '2022-07-08 00:29:41'); +INSERT INTO `pms_spu_attribute` VALUES (843, 3, NULL, '硬盘容量', '512g', 1, NULL, '2022-07-07 00:22:13', '2022-07-08 00:29:41'); +INSERT INTO `pms_spu_attribute` VALUES (844, 3, NULL, '硬盘容量', '1t', 1, NULL, '2022-07-07 00:22:13', '2022-07-08 00:29:41'); +INSERT INTO `pms_spu_attribute` VALUES (845, 3, NULL, '套餐类型', '【2022款】锐龙六核R5-6600U/核芯显卡/100%sRGB高色域', 1, NULL, '2022-07-07 00:22:13', '2022-07-08 00:29:41'); +INSERT INTO `pms_spu_attribute` VALUES (846, 3, NULL, '套餐类型', '【2022款】锐龙八核R7-6800U/核芯显卡/100%sRGB高色域', 1, NULL, '2022-07-07 00:22:13', '2022-07-08 00:29:41'); -- ---------------------------- -- Table structure for undo_log @@ -225,8 +227,11 @@ CREATE TABLE `undo_log` ( `log_status` int NOT NULL COMMENT '0:normal status,1:defense status', `log_created` datetime(6) NOT NULL COMMENT 'create datetime', `log_modified` datetime(6) NOT NULL COMMENT 'modify datetime', - UNIQUE INDEX `ux_undo_log`(`xid`, `branch_id`) USING BTREE + UNIQUE INDEX `ux_undo_log`(`xid` ASC, `branch_id` ASC) USING BTREE ) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = 'AT transaction mode undo table' ROW_FORMAT = DYNAMIC; +-- ---------------------------- +-- Records of undo_log +-- ---------------------------- SET FOREIGN_KEY_CHECKS = 1; diff --git a/docs/sql/mysql8.x/mall_oms.sql b/docs/sql/mysql8.x/mall_oms.sql index 02507f9a0..b354318db 100644 --- a/docs/sql/mysql8.x/mall_oms.sql +++ b/docs/sql/mysql8.x/mall_oms.sql @@ -24,81 +24,65 @@ SET FOREIGN_KEY_CHECKS = 0; -- ---------------------------- DROP TABLE IF EXISTS `oms_order`; CREATE TABLE `oms_order` ( - `id` bigint NOT NULL AUTO_INCREMENT COMMENT 'id', - `order_sn` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL DEFAULT '' COMMENT '订单号', - `total_amount` bigint NOT NULL DEFAULT 0 COMMENT '订单总额(分)', - `total_quantity` int NOT NULL DEFAULT 0 COMMENT '商品总数', - `source_type` tinyint NOT NULL DEFAULT 1 COMMENT '订单来源[0->PC订单;1->APP订单]', - `status` int NOT NULL DEFAULT 101 COMMENT '订单状态:\r\n101->待付款;\r\n102->用户取消;\r\n103->系统取消;\r\n201->已付款;\r\n202->申请退款;\r\n203->已退款;\r\n301->待发货;\r\n401->已发货;\r\n501->用户收货;\r\n502->系统收货;\r\n901->已完成;', - `remark` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL DEFAULT '' COMMENT '订单备注', - `member_id` bigint NOT NULL DEFAULT 0 COMMENT '会员id', - `coupon_id` bigint NOT NULL DEFAULT 0 COMMENT '使用的优惠券', - `coupon_amount` bigint NOT NULL DEFAULT 0 COMMENT '优惠券抵扣金额(分)', - `freight_amount` bigint NOT NULL DEFAULT 0 COMMENT '运费金额(分)', - `pay_amount` bigint NOT NULL DEFAULT 0 COMMENT '应付总额(分)', - `pay_time` datetime NULL DEFAULT NULL COMMENT '支付时间', - `pay_type` tinyint NULL DEFAULT NULL COMMENT '支付方式【1->微信jsapi;2->支付宝;3->余额; 4->微信app;】', - `out_trade_no` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '微信支付等第三方支付平台的商户订单号', - `transaction_id` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '微信支付订单号', - `out_refund_no` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '商户退款单号', - `refund_id` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '微信退款单号', - `delivery_time` datetime NULL DEFAULT NULL COMMENT '发货时间', - `receive_time` datetime NULL DEFAULT NULL COMMENT '确认收货时间', - `comment_time` datetime NULL DEFAULT NULL COMMENT '评价时间', - `deleted` tinyint(1) NULL DEFAULT 0 COMMENT '逻辑删除【0->正常;1->已删除】', - `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间', - `update_time` datetime NULL DEFAULT NULL COMMENT '修改时间', - PRIMARY KEY (`id`) USING BTREE, - UNIQUE INDEX `index_order_sn`(`order_sn`) USING BTREE COMMENT '订单号唯一索引', - UNIQUE INDEX `index_otn`(`out_trade_no`) USING BTREE COMMENT '商户订单号唯一索引', - UNIQUE INDEX `index_ti`(`transaction_id`) USING BTREE COMMENT '商户支付单号唯一索引', - UNIQUE INDEX `index_orn`(`out_refund_no`) USING BTREE COMMENT '商户退款单号唯一索引', - UNIQUE INDEX `index_ri`(`refund_id`) USING BTREE COMMENT '退款单号唯一索引' -) ENGINE = InnoDB AUTO_INCREMENT = 1351548262424821956 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '订单详情表' ROW_FORMAT = DYNAMIC; + `id` bigint NOT NULL AUTO_INCREMENT COMMENT 'id', + `order_sn` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL DEFAULT '' COMMENT '订单号', + `total_amount` bigint NOT NULL DEFAULT 0 COMMENT '订单总额(分)', + `total_quantity` int NOT NULL DEFAULT 0 COMMENT '商品总数', + `source` tinyint NULL DEFAULT NULL COMMENT '订单来源(1:APP;2:网页)', + `status` int NOT NULL DEFAULT 101 COMMENT '订单状态:\r\n101->待付款;\r\n102->用户取消;\r\n103->系统取消;\r\n201->已付款;\r\n202->申请退款;\r\n203->已退款;\r\n301->待发货;\r\n401->已发货;\r\n501->用户收货;\r\n502->系统收货;\r\n901->已完成;', + `remark` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL DEFAULT '' COMMENT '订单备注', + `member_id` bigint NOT NULL DEFAULT 0 COMMENT '会员id', + `coupon_id` bigint NOT NULL DEFAULT 0 COMMENT '使用的优惠券', + `coupon_amount` bigint NOT NULL DEFAULT 0 COMMENT '优惠券抵扣金额(分)', + `freight_amount` bigint NOT NULL DEFAULT 0 COMMENT '运费金额(分)', + `payment_amount` bigint NOT NULL DEFAULT 0 COMMENT '应付总额(分)', + `pay_amount` bigint NOT NULL DEFAULT 0 COMMENT '应付总额(分)', + `payment_time` datetime NULL DEFAULT NULL COMMENT '支付时间', + `payment_method` tinyint NULL DEFAULT NULL COMMENT '支付方式(1:微信JSAPI;2:支付宝;3:余额;4:微信APP)', + `out_trade_no` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '微信支付等第三方支付平台的商户订单号', + `transaction_id` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '微信支付订单号', + `out_refund_no` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '商户退款单号', + `refund_id` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '微信退款单号', + `delivery_time` datetime NULL DEFAULT NULL COMMENT '发货时间', + `receive_time` datetime NULL DEFAULT NULL COMMENT '确认收货时间', + `comment_time` datetime NULL DEFAULT NULL COMMENT '评价时间', + `deleted` tinyint(1) NULL DEFAULT 0 COMMENT '逻辑删除【0->正常;1->已删除】', + `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间', + `update_time` datetime NULL DEFAULT NULL COMMENT '修改时间', + PRIMARY KEY (`id`) USING BTREE, + UNIQUE INDEX `index_order_sn`(`order_sn` ASC) USING BTREE COMMENT '订单号唯一索引', + UNIQUE INDEX `index_otn`(`out_trade_no` ASC) USING BTREE COMMENT '商户订单号唯一索引', + UNIQUE INDEX `index_ti`(`transaction_id` ASC) USING BTREE COMMENT '商户支付单号唯一索引', + UNIQUE INDEX `index_orn`(`out_refund_no` ASC) USING BTREE COMMENT '商户退款单号唯一索引', + UNIQUE INDEX `index_ri`(`refund_id` ASC) USING BTREE COMMENT '退款单号唯一索引' +) ENGINE = InnoDB AUTO_INCREMENT = 1351548262424822232 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '订单详情表' ROW_FORMAT = DYNAMIC; + --- ---------------------------- --- Records of oms_order --- ---------------------------- -INSERT INTO `oms_order` VALUES (1351548262424821940, '20210815300000009', 100, 1, 1, 201, '', 39, 0, 0, 0, 100, '2021-08-15 12:38:02', 3, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0, '2021-08-15 12:38:02', '2021-08-15 12:38:02'); -INSERT INTO `oms_order` VALUES (1351548262424821941, '20210815300000010', 300, 1, 1, 201, '', 39, 0, 0, 0, 300, '2021-08-15 21:34:00', 3, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0, '2021-08-15 21:33:56', '2021-08-15 21:34:00'); -INSERT INTO `oms_order` VALUES (1351548262424821942, '20210815300000011', 100, 1, 1, 201, '', 4, 0, 0, 0, 100, '2021-08-15 21:34:16', 3, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0, '2021-08-15 21:34:10', '2021-08-15 21:34:16'); -INSERT INTO `oms_order` VALUES (1351548262424821943, '20210815300000012', 100, 1, 1, 201, '', 39, 0, 0, 0, 100, '2021-08-15 21:44:02', 3, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0, '2021-08-15 21:44:01', '2021-08-15 21:44:02'); -INSERT INTO `oms_order` VALUES (1351548262424821944, '20210815300000013', 100, 1, 1, 201, '', 39, 0, 0, 0, 100, '2021-08-15 21:45:27', 3, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0, '2021-08-15 21:45:21', '2021-08-15 21:45:27'); -INSERT INTO `oms_order` VALUES (1351548262424821945, '20210815300000014', 100, 1, 1, 201, '', 39, 0, 0, 0, 100, '2021-08-15 22:00:38', 3, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0, '2021-08-15 22:00:36', '2021-08-15 22:00:38'); -INSERT INTO `oms_order` VALUES (1351548262424821948, '20210816300000002', 100, 1, 1, 201, '', 39, 0, 0, 0, 100, '2021-08-16 23:18:17', 3, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0, '2021-08-16 23:18:14', '2021-08-16 23:18:17'); -INSERT INTO `oms_order` VALUES (1351548262424821949, '20210828300000009', 100, 1, 1, 201, '', 39, 0, 0, 0, 100, '2021-08-28 00:43:59', 3, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0, '2021-08-28 00:43:55', NULL); -INSERT INTO `oms_order` VALUES (1351548262424821950, '20220213300000040', 100, 1, 1, 201, '', 39, 0, 0, 0, 100, '2022-02-13 21:55:52', 3, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0, '2022-02-13 21:52:46', '2022-02-13 21:52:46'); -INSERT INTO `oms_order` VALUES (1351548262424821951, '20220224300000001', 100, 1, 1, 201, '', 39, 0, 0, 0, 100, '2022-02-24 00:54:10', 3, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0, '2022-02-24 00:54:06', '2022-02-24 00:54:06'); -INSERT INTO `oms_order` VALUES (1351548262424821952, '20220224300000002', 100, 1, 1, 201, '', 39, 0, 0, 0, 100, '2022-02-24 00:54:56', 3, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0, '2022-02-24 00:54:55', '2022-02-24 00:54:55'); -INSERT INTO `oms_order` VALUES (1351548262424821953, '20220224300000003', 100, 1, 1, 201, '', 39, 0, 0, 0, 100, '2022-02-24 01:16:40', 3, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0, '2022-02-24 01:16:37', '2022-02-24 01:16:37'); -INSERT INTO `oms_order` VALUES (1351548262424821954, '20220224300000004', 100, 1, 1, 201, '', 39, 0, 0, 0, 100, '2022-02-24 01:17:21', 3, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0, '2022-02-24 01:17:20', '2022-02-24 01:17:20'); -INSERT INTO `oms_order` VALUES (1351548262424821955, '20220224300000005', 100, 1, 1, 201, '', 39, 0, 0, 0, 100, '2022-02-24 09:34:55', 3, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0, '2022-02-24 09:34:53', '2022-02-24 09:34:53'); -INSERT INTO `oms_order` VALUES (1351548262424821956, '20220224300000008', 100, 1, 1, 103, '', 39, 0, 0, 0, 100, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0, '2022-02-24 23:23:22', '2022-02-24 23:23:22'); -- ---------------------------- -- Table structure for oms_order_delivery -- ---------------------------- DROP TABLE IF EXISTS `oms_order_delivery`; CREATE TABLE `oms_order_delivery` ( - `id` bigint NOT NULL AUTO_INCREMENT COMMENT 'id', - `order_id` bigint NOT NULL COMMENT '订单id', - `delivery_company` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL DEFAULT '' COMMENT '物流公司(配送方式)', - `delivery_sn` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL DEFAULT '' COMMENT '物流单号', - `receiver_name` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL DEFAULT '' COMMENT '收货人姓名', - `receiver_phone` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL DEFAULT '' COMMENT '收货人电话', - `receiver_post_code` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL DEFAULT '' COMMENT '收货人邮编', - `receiver_province` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL DEFAULT '' COMMENT '省份/直辖市', - `receiver_city` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL DEFAULT '' COMMENT '城市', - `receiver_region` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL DEFAULT '' COMMENT '区', - `receiver_detail_address` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL DEFAULT '' COMMENT '详细地址', - `remark` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL DEFAULT '' COMMENT '备注', - `delivery_status` tinyint NULL DEFAULT 0 COMMENT '物流状态【0->运输中;1->已收货】', - `delivery_time` datetime NULL DEFAULT NULL COMMENT '发货时间', - `receive_time` datetime NULL DEFAULT NULL COMMENT '确认收货时间', - `deleted` tinyint(1) NULL DEFAULT 0 COMMENT '逻辑删除【0->正常;1->已删除】', - `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间', - `update_time` datetime NULL DEFAULT NULL COMMENT '修改时间', - PRIMARY KEY (`id`) USING BTREE + `id` bigint NOT NULL AUTO_INCREMENT COMMENT 'id', + `order_id` bigint NOT NULL COMMENT '订单id', + `delivery_company` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL DEFAULT '' COMMENT '物流公司(配送方式)', + `delivery_sn` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL DEFAULT '' COMMENT '物流单号', + `receiver_name` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL DEFAULT '' COMMENT '收货人姓名', + `receiver_phone` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL DEFAULT '' COMMENT '收货人电话', + `receiver_post_code` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL DEFAULT '' COMMENT '收货人邮编', + `receiver_province` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL DEFAULT '' COMMENT '省份/直辖市', + `receiver_city` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL DEFAULT '' COMMENT '城市', + `receiver_region` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL DEFAULT '' COMMENT '区', + `receiver_detail_address` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL DEFAULT '' COMMENT '详细地址', + `remark` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL DEFAULT '' COMMENT '备注', + `delivery_status` tinyint NULL DEFAULT 0 COMMENT '物流状态【0->运输中;1->已收货】', + `delivery_time` datetime NULL DEFAULT NULL COMMENT '发货时间', + `receive_time` datetime NULL DEFAULT NULL COMMENT '确认收货时间', + `deleted` tinyint(1) NULL DEFAULT 0 COMMENT '逻辑删除【0->正常;1->已删除】', + `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间', + `update_time` datetime NULL DEFAULT NULL COMMENT '修改时间', + PRIMARY KEY (`id`) USING BTREE ) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '订单物流记录表' ROW_FORMAT = DYNAMIC; -- ---------------------------- @@ -110,119 +94,40 @@ CREATE TABLE `oms_order_delivery` ( -- ---------------------------- DROP TABLE IF EXISTS `oms_order_item`; CREATE TABLE `oms_order_item` ( - `id` bigint NOT NULL AUTO_INCREMENT COMMENT 'id', - `order_id` bigint NOT NULL COMMENT '订单ID', - `spu_name` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '商品名称', - `sku_id` bigint NOT NULL DEFAULT 0 COMMENT '商品ID', - `sku_sn` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL DEFAULT '' COMMENT '商品编码', - `sku_name` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL DEFAULT '' COMMENT '规格名称', - `pic_url` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL DEFAULT '' COMMENT '商品图片', - `price` bigint NOT NULL DEFAULT 0 COMMENT '商品单价(单位:分)', - `count` int NOT NULL DEFAULT 0 COMMENT '商品数量', - `total_amount` bigint NOT NULL DEFAULT 0 COMMENT '商品总价(单位:分)', - `deleted` tinyint(1) NULL DEFAULT 0 COMMENT '逻辑删除标识(1:已删除;0:正常)', - `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间', - `update_time` datetime NULL DEFAULT NULL COMMENT '修改时间', - PRIMARY KEY (`id`) USING BTREE, - INDEX `index_order_id`(`order_id`) USING BTREE COMMENT '订单id索引' -) ENGINE = InnoDB AUTO_INCREMENT = 210 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '订单商品信息表' ROW_FORMAT = DYNAMIC; + `id` bigint NOT NULL AUTO_INCREMENT COMMENT 'id', + `order_id` bigint NOT NULL COMMENT '订单ID', + `spu_name` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '商品名称', + `sku_id` bigint NOT NULL DEFAULT 0 COMMENT '商品ID', + `sku_sn` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL DEFAULT '' COMMENT '商品编码', + `sku_name` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL DEFAULT '' COMMENT '规格名称', + `pic_url` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL DEFAULT '' COMMENT '商品图片', + `price` bigint NOT NULL DEFAULT 0 COMMENT '商品单价(单位:分)', + `quantity` int NULL DEFAULT NULL COMMENT '商品数量', + `total_amount` bigint NOT NULL DEFAULT 0 COMMENT '商品总价(单位:分)', + `deleted` tinyint(1) NULL DEFAULT 0 COMMENT '逻辑删除标识(1:已删除;0:正常)', + `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间', + `update_time` datetime NULL DEFAULT NULL COMMENT '修改时间', + PRIMARY KEY (`id`) USING BTREE, + INDEX `index_order_id`(`order_id` ASC) USING BTREE COMMENT '订单id索引' +) ENGINE = InnoDB AUTO_INCREMENT = 501 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '订单商品信息表' ROW_FORMAT = DYNAMIC; + --- ---------------------------- --- Records of oms_order_item --- ---------------------------- -INSERT INTO `oms_order_item` VALUES (128, 1351548262424821882, NULL, 190, '1614505936507', '测试手机2 黑 4+64 ', 'http://a.youlai.store:9000/default/37729cd58065419f84b15f44b0e4f27f.jpg', 159900, 1, 159900, 0, '2021-03-22 23:34:46', '2021-03-22 23:34:46'); -INSERT INTO `oms_order_item` VALUES (129, 1351548262424821883, NULL, 190, '1614505936507', '测试手机2 黑 4+64 ', 'http://a.youlai.store:9000/default/37729cd58065419f84b15f44b0e4f27f.jpg', 159900, 1, 159900, 0, '2021-03-23 01:03:47', '2021-03-23 01:03:47'); -INSERT INTO `oms_order_item` VALUES (130, 1351548262424821884, NULL, 190, '1614505936507', '测试手机2 黑 4+64 ', 'http://a.youlai.store:9000/default/37729cd58065419f84b15f44b0e4f27f.jpg', 159900, 2, 319800, 0, '2021-03-23 01:10:17', '2021-03-23 01:10:17'); -INSERT INTO `oms_order_item` VALUES (131, 1351548262424821885, NULL, 190, '1614505936507', '测试手机2 黑 4+64 ', 'http://a.youlai.store:9000/default/37729cd58065419f84b15f44b0e4f27f.jpg', 159900, 1, 159900, 0, '2021-03-23 02:21:27', '2021-03-23 02:21:27'); -INSERT INTO `oms_order_item` VALUES (132, 1351548262424821886, NULL, 190, '1614505936507', '测试手机2 黑 4+64 ', 'http://a.youlai.store:9000/default/37729cd58065419f84b15f44b0e4f27f.jpg', 159900, 2, 319800, 0, '2021-03-23 06:37:27', '2021-03-23 06:37:27'); -INSERT INTO `oms_order_item` VALUES (133, 1351548262424821887, NULL, 190, '1614505936507', '测试手机2 黑 4+64 ', 'http://a.youlai.store:9000/default/37729cd58065419f84b15f44b0e4f27f.jpg', 159900, 1, 159900, 0, '2021-03-23 07:02:27', '2021-03-23 07:02:27'); -INSERT INTO `oms_order_item` VALUES (134, 1351548262424821888, NULL, 190, '1614505936507', '测试手机2 黑 4+64 ', 'http://a.youlai.store:9000/default/37729cd58065419f84b15f44b0e4f27f.jpg', 159900, 2, 319800, 0, '2021-03-23 07:31:43', '2021-03-23 07:31:43'); -INSERT INTO `oms_order_item` VALUES (135, 1351548262424821889, NULL, 190, '1614505936507', '测试手机2 黑 4+64 ', 'http://a.youlai.store:9000/default/37729cd58065419f84b15f44b0e4f27f.jpg', 159900, 1, 159900, 0, '2021-03-23 18:55:41', '2021-03-23 18:55:41'); -INSERT INTO `oms_order_item` VALUES (136, 1351548262424821890, NULL, 190, '1614505936507', '测试手机2 黑 4+64 ', 'http://a.youlai.store:9000/default/37729cd58065419f84b15f44b0e4f27f.jpg', 159900, 2, 319800, 0, '2021-03-25 19:02:51', '2021-03-25 19:02:51'); -INSERT INTO `oms_order_item` VALUES (137, 1351548262424821891, NULL, 190, '1614505936507', '测试手机2 黑 4+64 ', 'http://a.youlai.store:9000/default/37729cd58065419f84b15f44b0e4f27f.jpg', 159900, 1, 159900, 0, '2021-03-29 15:57:45', '2021-03-29 15:57:45'); -INSERT INTO `oms_order_item` VALUES (138, 1351548262424821892, NULL, 186, '1614505517559', '测试手机1 黑 6+128 ', 'http://a.youlai.store:9000/default/9715dde8c35c429b8c56cbe800ebd205.jpg', 299900, 1, 299900, 0, '2021-03-29 16:02:46', '2021-03-29 16:02:46'); -INSERT INTO `oms_order_item` VALUES (139, 1351548262424821893, NULL, 190, '1614505936507', '测试手机2 黑 4+64 ', 'http://a.youlai.store:9000/default/37729cd58065419f84b15f44b0e4f27f.jpg', 159900, 1, 159900, 0, '2021-03-31 14:22:33', '2021-03-31 14:22:33'); -INSERT INTO `oms_order_item` VALUES (140, 1351548262424821894, NULL, 190, '1614505936507', '测试手机2 黑 4+64 ', 'http://a.youlai.store:9000/default/37729cd58065419f84b15f44b0e4f27f.jpg', 159900, 1, 159900, 0, '2021-04-14 22:59:43', '2021-04-14 22:59:43'); -INSERT INTO `oms_order_item` VALUES (141, 1351548262424821895, NULL, 192, '1614505936511', '测试手机2 黑 8+256 ', 'http://a.youlai.tech:9000/default/3e369c91377a4c9f9eb33f66a6dd6906.jpg', 199900, 1, 199900, 0, '2021-04-14 23:03:21', '2021-04-14 23:03:21'); -INSERT INTO `oms_order_item` VALUES (142, 1351548262424821896, NULL, 190, '1614505936507', '测试手机2 黑 4+64 ', 'http://a.youlai.tech:9000/default/c9f6f4f2e4de46f78d9c7a87d25948e1.jpg', 159900, 1, 159900, 0, '2021-04-14 23:33:48', '2021-04-14 23:33:48'); -INSERT INTO `oms_order_item` VALUES (143, 1351548262424821897, NULL, 190, '1614505936507', '测试手机2 黑 4+64 ', 'http://a.youlai.tech:9000/default/c9f6f4f2e4de46f78d9c7a87d25948e1.jpg', 159900, 2, 319800, 0, '2021-04-14 23:38:15', '2021-04-14 23:38:15'); -INSERT INTO `oms_order_item` VALUES (144, 1351548262424821898, NULL, 190, '1614505936507', '测试手机2 黑 4+64 ', 'http://a.youlai.tech:9000/default/c9f6f4f2e4de46f78d9c7a87d25948e1.jpg', 159900, 2, 319800, 0, '2021-04-14 23:38:31', '2021-04-14 23:38:31'); -INSERT INTO `oms_order_item` VALUES (145, 1351548262424821899, NULL, 190, '1614505936507', '测试手机2 黑 4+64 ', 'http://a.youlai.tech:9000/default/c9f6f4f2e4de46f78d9c7a87d25948e1.jpg', 159900, 2, 319800, 0, '2021-04-14 23:42:47', '2021-04-14 23:42:47'); -INSERT INTO `oms_order_item` VALUES (146, 1351548262424821900, NULL, 190, '1614505936507', '测试手机2 黑 4+64 ', 'http://a.youlai.tech:9000/default/c9f6f4f2e4de46f78d9c7a87d25948e1.jpg', 159900, 3, 479700, 0, '2021-04-14 23:48:04', '2021-04-14 23:48:04'); -INSERT INTO `oms_order_item` VALUES (147, 1351548262424821901, NULL, 190, '1614505936507', '测试手机2 黑 4+64 ', 'http://a.youlai.tech:9000/default/c9f6f4f2e4de46f78d9c7a87d25948e1.jpg', 159900, 1, 159900, 0, '2021-04-16 16:18:27', '2021-04-16 16:18:27'); -INSERT INTO `oms_order_item` VALUES (150, 1351548262424821904, NULL, 232, '1622008618852', '名称 红色 l ', '', 200, 1, 200, 0, '2021-06-11 00:20:33', '2021-06-11 00:20:33'); -INSERT INTO `oms_order_item` VALUES (151, 1351548262424821905, NULL, 232, '1622008618852', '名称 红色 l ', '', 200, 1, 200, 0, '2021-06-11 00:24:07', '2021-06-11 00:24:07'); -INSERT INTO `oms_order_item` VALUES (152, 1351548262424821906, NULL, 232, '1622008618852', '名称 红色 l ', '', 200, 1, 200, 0, '2021-06-11 00:26:16', '2021-06-11 00:26:16'); -INSERT INTO `oms_order_item` VALUES (153, 1351548262424821907, NULL, 232, '1622008618852', '名称 红色 l ', '', 200, 1, 200, 0, '2021-06-11 00:42:43', '2021-06-11 00:42:43'); -INSERT INTO `oms_order_item` VALUES (154, 1351548262424821908, NULL, 236, '1623369301480', '测试合约机 黑 6+64g ', 'http://a.youlai.tech:9000/default/c6e941103d8841acaf2f3f7356e11686.jpg', 999900, 1, 999900, 0, '2021-06-11 07:58:04', '2021-06-11 07:58:04'); -INSERT INTO `oms_order_item` VALUES (155, 1351548262424821909, NULL, 236, '1623369301480', '测试合约机 黑 6+64g ', 'http://a.youlai.tech:9000/default/c6e941103d8841acaf2f3f7356e11686.jpg', 999900, 1, 999900, 0, '2021-06-11 08:35:11', '2021-06-11 08:35:11'); -INSERT INTO `oms_order_item` VALUES (156, 1351548262424821909, NULL, 244, '1623369301480', '测试合约机 蓝 12+256g ', 'http://a.youlai.tech:9000/default/c6e941103d8841acaf2f3f7356e11686.jpg', 999900, 1, 999900, 0, '2021-06-11 08:35:11', '2021-06-11 08:35:11'); -INSERT INTO `oms_order_item` VALUES (157, 1351548262424821910, NULL, 236, '1623369301480', '测试合约机 黑 6+64g ', 'http://a.youlai.tech:9000/default/c6e941103d8841acaf2f3f7356e11686.jpg', 999900, 1, 999900, 0, '2021-06-12 14:16:13', '2021-06-12 14:16:13'); -INSERT INTO `oms_order_item` VALUES (158, 1351548262424821911, NULL, 236, '1623369301480', '测试合约机 黑 6+64g ', 'http://a.youlai.tech:9000/default/c6e941103d8841acaf2f3f7356e11686.jpg', 999900, 2, 1999800, 0, '2021-06-17 08:48:45', '2021-06-17 08:48:45'); -INSERT INTO `oms_order_item` VALUES (163, 1351548262424821918, NULL, 236, '1623369301480', '测试合约机 黑 6+64g ', 'http://a.youlai.tech:9000/default/c6e941103d8841acaf2f3f7356e11686.jpg', 999900, 2, 1999800, 0, NULL, NULL); -INSERT INTO `oms_order_item` VALUES (164, 1351548262424821919, NULL, 236, '1623369301480', '测试合约机 黑 6+64g ', 'http://a.youlai.tech:9000/default/c6e941103d8841acaf2f3f7356e11686.jpg', 999900, 1, 999900, 0, NULL, NULL); -INSERT INTO `oms_order_item` VALUES (165, 1351548262424821920, NULL, 236, '1623369301480', '测试合约机 黑 6+64g ', 'http://a.youlai.tech:9000/default/c6e941103d8841acaf2f3f7356e11686.jpg', 999900, 2, 1999800, 0, NULL, NULL); -INSERT INTO `oms_order_item` VALUES (166, 1351548262424821921, NULL, 197, '1616310848932', '测试衣服1 白 M ', 'http://a.youlai.store:9000/default/063350d473a64ee7857e91841add1177.jpg', 29900, 1, 29900, 0, NULL, NULL); -INSERT INTO `oms_order_item` VALUES (167, 1351548262424821922, NULL, 197, '1616310848932', '测试衣服1 白 M ', 'http://a.youlai.store:9000/default/063350d473a64ee7857e91841add1177.jpg', 29900, 4, 119600, 0, NULL, NULL); -INSERT INTO `oms_order_item` VALUES (168, 1351548262424821923, NULL, 245, '1626080416010', 'huawei mate40pro 12 2 3 ', '', 609900, 1, 609900, 0, NULL, NULL); -INSERT INTO `oms_order_item` VALUES (169, 1351548262424821924, NULL, 245, '1626080416010', 'huawei mate40pro 12 2 3 ', '', 609900, 2, 1219800, 0, NULL, NULL); -INSERT INTO `oms_order_item` VALUES (170, 1351548262424821925, NULL, 245, '1626080416010', 'huawei mate40pro 12 2 3 ', '', 609900, 2, 1219800, 0, NULL, NULL); -INSERT INTO `oms_order_item` VALUES (171, 1351548262424821927, NULL, 300, '1', 'tid_1_1|tid_2_1|tid_3_', 'http://a.youlai.tech:9000/default/852f076dd41d4e199c969289838149fa.jpg', 100, 1, 100, 0, '2021-08-13 00:25:33', '2021-08-13 00:25:33'); -INSERT INTO `oms_order_item` VALUES (172, 1351548262424821928, NULL, 300, '1', 'tid_1_1|tid_2_1|tid_3_', 'http://a.youlai.tech:9000/default/852f076dd41d4e199c969289838149fa.jpg', 100, 1, 100, 0, '2021-08-13 00:29:25', '2021-08-13 00:29:25'); -INSERT INTO `oms_order_item` VALUES (173, 1351548262424821912, NULL, 300, '1', 'tid_1_1|tid_2_1|tid_3_', 'http://a.youlai.tech:9000/default/852f076dd41d4e199c969289838149fa.jpg', 100, 1, 100, 0, '2021-08-13 22:45:19', '2021-08-13 22:45:19'); -INSERT INTO `oms_order_item` VALUES (174, 1351548262424821913, NULL, 300, '1', 'tid_1_1|tid_2_1|tid_3_', 'http://a.youlai.tech:9000/default/852f076dd41d4e199c969289838149fa.jpg', 100, 1, 100, 0, '2021-08-13 23:37:42', '2021-08-13 23:37:42'); -INSERT INTO `oms_order_item` VALUES (175, 1351548262424821914, NULL, 300, '1', 'tid_1_1|tid_2_1|tid_3_', 'http://a.youlai.tech:9000/default/852f076dd41d4e199c969289838149fa.jpg', 100, 1, 100, 0, '2021-08-14 00:17:19', '2021-08-14 00:17:19'); -INSERT INTO `oms_order_item` VALUES (176, 1351548262424821914, NULL, 291, '1', '', 'http://a.youlai.tech:9000/default/fb3f1be8aae644f497255f29aa51c641.jpg', 100, 1, 100, 0, '2021-08-14 00:17:19', '2021-08-14 00:17:19'); -INSERT INTO `oms_order_item` VALUES (177, 1351548262424821915, NULL, 300, '1', 'tid_1_1|tid_2_1|tid_3_', 'http://a.youlai.tech:9000/default/852f076dd41d4e199c969289838149fa.jpg', 100, 1, 100, 0, '2021-08-14 01:24:26', '2021-08-14 01:24:26'); -INSERT INTO `oms_order_item` VALUES (178, 1351548262424821916, NULL, 300, '1', 'tid_1_1|tid_2_1|tid_3_', 'http://a.youlai.tech:9000/default/852f076dd41d4e199c969289838149fa.jpg', 100, 1, 100, 0, '2021-08-14 17:24:13', '2021-08-14 17:24:13'); -INSERT INTO `oms_order_item` VALUES (179, 1351548262424821917, NULL, 300, '1', 'tid_1_1|tid_2_1|tid_3_', 'http://a.youlai.tech:9000/default/852f076dd41d4e199c969289838149fa.jpg', 100, 1, 100, 0, '2021-08-14 17:30:19', '2021-08-14 17:30:19'); -INSERT INTO `oms_order_item` VALUES (180, 1351548262424821918, NULL, 300, '1', 'tid_1_1|tid_2_1|tid_3_', 'http://a.youlai.tech:9000/default/852f076dd41d4e199c969289838149fa.jpg', 100, 1, 100, 0, '2021-08-14 18:58:28', '2021-08-14 18:58:28'); -INSERT INTO `oms_order_item` VALUES (181, 1351548262424821919, NULL, 300, '1', 'tid_1_1|tid_2_1|tid_3_', 'http://a.youlai.tech:9000/default/852f076dd41d4e199c969289838149fa.jpg', 100, 2, 200, 0, '2021-08-14 19:01:46', '2021-08-14 19:01:46'); -INSERT INTO `oms_order_item` VALUES (182, 1351548262424821921, NULL, 300, '1', 'tid_1_1|tid_2_1|tid_3_', 'http://a.youlai.tech:9000/default/852f076dd41d4e199c969289838149fa.jpg', 100, 1, 100, 0, '2021-08-14 21:41:42', '2021-08-14 21:41:42'); -INSERT INTO `oms_order_item` VALUES (183, 1351548262424821922, NULL, 300, '1', 'tid_1_1|tid_2_1|tid_3_', 'http://a.youlai.tech:9000/default/852f076dd41d4e199c969289838149fa.jpg', 100, 1, 100, 0, '2021-08-14 22:32:39', '2021-08-14 22:32:39'); -INSERT INTO `oms_order_item` VALUES (184, 1351548262424821923, NULL, 300, '1', 'tid_1_1|tid_2_1|tid_3_', 'http://a.youlai.tech:9000/default/852f076dd41d4e199c969289838149fa.jpg', 100, 1, 100, 0, '2021-08-14 22:35:14', '2021-08-14 22:35:14'); -INSERT INTO `oms_order_item` VALUES (185, 1351548262424821924, NULL, 300, '1', 'tid_1_1|tid_2_1|tid_3_', 'http://a.youlai.tech:9000/default/852f076dd41d4e199c969289838149fa.jpg', 100, 1, 100, 0, '2021-08-14 22:38:04', '2021-08-14 22:38:04'); -INSERT INTO `oms_order_item` VALUES (186, 1351548262424821925, NULL, 300, '1', 'tid_1_1|tid_2_1|tid_3_', 'http://a.youlai.tech:9000/default/852f076dd41d4e199c969289838149fa.jpg', 100, 1, 100, 0, '2021-08-14 23:14:42', '2021-08-14 23:14:42'); -INSERT INTO `oms_order_item` VALUES (187, 1351548262424821926, NULL, 300, '1', 'tid_1_1|tid_2_1|tid_3_', 'http://a.youlai.tech:9000/default/852f076dd41d4e199c969289838149fa.jpg', 100, 1, 100, 0, '2021-08-15 00:42:26', '2021-08-15 00:42:26'); -INSERT INTO `oms_order_item` VALUES (188, 1351548262424821927, NULL, 300, '1', 'tid_1_1|tid_2_1|tid_3_', 'http://a.youlai.tech:9000/default/852f076dd41d4e199c969289838149fa.jpg', 100, 1, 100, 0, '2021-08-15 00:46:45', '2021-08-15 00:46:45'); -INSERT INTO `oms_order_item` VALUES (189, 1351548262424821928, NULL, 300, '1', 'tid_1_1|tid_2_1|tid_3_', 'http://a.youlai.tech:9000/default/852f076dd41d4e199c969289838149fa.jpg', 100, 1, 100, 0, '2021-08-15 00:50:57', '2021-08-15 00:50:57'); -INSERT INTO `oms_order_item` VALUES (190, 1351548262424821929, NULL, 300, '1', 'tid_1_1|tid_2_1|tid_3_', 'http://a.youlai.tech:9000/default/852f076dd41d4e199c969289838149fa.jpg', 100, 1, 100, 0, '2021-08-15 00:54:41', '2021-08-15 00:54:41'); -INSERT INTO `oms_order_item` VALUES (191, 1351548262424821930, NULL, 300, '1', 'tid_1_1|tid_2_1|tid_3_', 'http://a.youlai.tech:9000/default/852f076dd41d4e199c969289838149fa.jpg', 100, 1, 100, 0, '2021-08-15 01:00:50', '2021-08-15 01:00:50'); -INSERT INTO `oms_order_item` VALUES (192, 1351548262424821931, NULL, 300, '1', 'tid_1_1|tid_2_1|tid_3_', 'http://a.youlai.tech:9000/default/852f076dd41d4e199c969289838149fa.jpg', 100, 1, 100, 0, '2021-08-15 09:24:03', '2021-08-15 09:24:03'); -INSERT INTO `oms_order_item` VALUES (193, 1351548262424821932, NULL, 300, '1', 'tid_1_1|tid_2_1|tid_3_', 'http://a.youlai.tech:9000/default/852f076dd41d4e199c969289838149fa.jpg', 100, 1, 100, 0, '2021-08-15 09:24:14', '2021-08-15 09:24:14'); -INSERT INTO `oms_order_item` VALUES (194, 1351548262424821933, NULL, 300, '1', 'tid_1_1|tid_2_1|tid_3_', 'http://a.youlai.tech:9000/default/852f076dd41d4e199c969289838149fa.jpg', 100, 1, 100, 0, '2021-08-15 12:23:37', '2021-08-15 12:23:37'); -INSERT INTO `oms_order_item` VALUES (195, 1351548262424821940, NULL, 300, '1', 'tid_1_1|tid_2_1|tid_3_', 'http://a.youlai.tech:9000/default/852f076dd41d4e199c969289838149fa.jpg', 100, 1, 100, 0, '2021-08-15 12:38:02', '2021-08-15 12:38:02'); -INSERT INTO `oms_order_item` VALUES (196, 1351548262424821941, NULL, 331, '4', '黑色 8+256G 套餐一 ', '', 300, 1, 300, 0, '2021-08-15 21:33:56', '2021-08-15 21:33:56'); -INSERT INTO `oms_order_item` VALUES (197, 1351548262424821942, NULL, 308, '1', '123 1233 ', '', 100, 1, 100, 0, '2021-08-15 21:34:10', '2021-08-15 21:34:10'); -INSERT INTO `oms_order_item` VALUES (198, 1351548262424821943, NULL, 300, '1', 'tid_1_1|tid_2_1|tid_3_', 'http://a.youlai.tech:9000/default/852f076dd41d4e199c969289838149fa.jpg', 100, 1, 100, 0, '2021-08-15 21:44:01', '2021-08-15 21:44:01'); -INSERT INTO `oms_order_item` VALUES (199, 1351548262424821944, NULL, 300, '1', 'tid_1_1|tid_2_1|tid_3_', 'http://a.youlai.tech:9000/default/852f076dd41d4e199c969289838149fa.jpg', 100, 1, 100, 0, '2021-08-15 21:45:22', '2021-08-15 21:45:22'); -INSERT INTO `oms_order_item` VALUES (200, 1351548262424821945, NULL, 328, '1', '黑色 6+128G 标准 ', '', 100, 1, 100, 0, '2021-08-15 22:00:37', '2021-08-15 22:00:37'); -INSERT INTO `oms_order_item` VALUES (201, 1351548262424821946, NULL, 300, '1', 'tid_1_1|tid_2_1|tid_3_', 'http://a.youlai.tech:9000/default/852f076dd41d4e199c969289838149fa.jpg', 100, 1, 100, 0, '2021-08-16 17:05:17', '2021-08-16 17:05:17'); -INSERT INTO `oms_order_item` VALUES (202, 1351548262424821948, NULL, 300, '1', 'tid_1_1|tid_2_1|tid_3_', 'http://a.youlai.tech:9000/default/852f076dd41d4e199c969289838149fa.jpg', 100, 1, 100, 0, '2021-08-16 23:18:16', '2021-08-16 23:18:16'); -INSERT INTO `oms_order_item` VALUES (203, 1351548262424821949, NULL, 300, '1', 'tid_1_1|tid_2_1|tid_3_', 'http://a.youlai.tech:9000/default/852f076dd41d4e199c969289838149fa.jpg', 100, 1, 100, 0, NULL, NULL); -INSERT INTO `oms_order_item` VALUES (204, 1351548262424821950, NULL, 300, '1', 'tid_1_1|tid_2_1|tid_3_', 'http://a.youlai.tech:9000/default/852f076dd41d4e199c969289838149fa.jpg', 100, 1, 100, 0, '2022-02-13 21:52:46', '2022-02-13 21:52:46'); -INSERT INTO `oms_order_item` VALUES (205, 1351548262424821951, NULL, 300, '1', 'tid_1_1|tid_2_1|tid_3_', 'http://a.youlai.tech:9000/default/852f076dd41d4e199c969289838149fa.jpg', 100, 1, 100, 0, '2022-02-24 00:54:07', '2022-02-24 00:54:07'); -INSERT INTO `oms_order_item` VALUES (206, 1351548262424821952, NULL, 296, '1213', '117|11', '', 100, 1, 100, 0, '2022-02-24 00:54:55', '2022-02-24 00:54:55'); -INSERT INTO `oms_order_item` VALUES (207, 1351548262424821953, NULL, 300, '1', 'tid_1_1|tid_2_1|tid_3_', 'http://a.youlai.tech:9000/default/852f076dd41d4e199c969289838149fa.jpg', 100, 1, 100, 0, '2022-02-24 01:16:38', '2022-02-24 01:16:38'); -INSERT INTO `oms_order_item` VALUES (208, 1351548262424821954, NULL, 300, '1', 'tid_1_1|tid_2_1|tid_3_', 'http://a.youlai.tech:9000/default/852f076dd41d4e199c969289838149fa.jpg', 100, 1, 100, 0, '2022-02-24 01:17:20', '2022-02-24 01:17:20'); -INSERT INTO `oms_order_item` VALUES (209, 1351548262424821955, NULL, 291, '1', '', 'http://a.youlai.tech:9000/default/fb3f1be8aae644f497255f29aa51c641.jpg', 100, 1, 100, 0, '2022-02-24 09:34:53', '2022-02-24 09:34:53'); -INSERT INTO `oms_order_item` VALUES (210, 1351548262424821956, NULL, 300, '1', 'tid_1_1|tid_2_1|tid_3_', 'http://a.youlai.tech:9000/default/852f076dd41d4e199c969289838149fa.jpg', 100, 1, 100, 0, '2022-02-24 23:23:22', '2022-02-24 23:23:22'); -- ---------------------------- -- Table structure for oms_order_log -- ---------------------------- DROP TABLE IF EXISTS `oms_order_log`; CREATE TABLE `oms_order_log` ( - `id` bigint NOT NULL AUTO_INCREMENT COMMENT 'id', - `order_id` bigint NOT NULL COMMENT '订单id', - `user` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '操作人[用户;系统;后台管理员]', - `detail` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL DEFAULT '' COMMENT '操作详情', - `order_status` int NULL DEFAULT NULL COMMENT '操作时订单状态', - `remark` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL DEFAULT '' COMMENT '备注', - `deleted` tinyint(1) NULL DEFAULT 0 COMMENT '逻辑删除【0->正常;1->已删除】', - `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间', - `update_time` datetime NULL DEFAULT NULL COMMENT '修改时间', - PRIMARY KEY (`id`) USING BTREE + `id` bigint NOT NULL AUTO_INCREMENT COMMENT 'id', + `order_id` bigint NOT NULL COMMENT '订单id', + `user` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '操作人[用户;系统;后台管理员]', + `detail` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL DEFAULT '' COMMENT '操作详情', + `order_status` int NULL DEFAULT NULL COMMENT '操作时订单状态', + `remark` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL DEFAULT '' COMMENT '备注', + `deleted` tinyint(1) NULL DEFAULT 0 COMMENT '逻辑删除【0->正常;1->已删除】', + `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间', + `update_time` datetime NULL DEFAULT NULL COMMENT '修改时间', + PRIMARY KEY (`id`) USING BTREE ) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '订单操作历史记录' ROW_FORMAT = DYNAMIC; -- ---------------------------- @@ -234,21 +139,21 @@ CREATE TABLE `oms_order_log` ( -- ---------------------------- DROP TABLE IF EXISTS `oms_order_pay`; CREATE TABLE `oms_order_pay` ( - `id` bigint NOT NULL AUTO_INCREMENT COMMENT 'id', - `order_id` bigint NOT NULL COMMENT '订单id', - `pay_sn` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL DEFAULT '' COMMENT '支付流水号', - `pay_amount` bigint NOT NULL DEFAULT 0 COMMENT '应付总额(分)', - `pay_time` datetime NULL DEFAULT NULL COMMENT '支付时间', - `pay_type` tinyint NULL DEFAULT NULL COMMENT '支付方式【1->支付宝;2->微信;3->银联; 4->货到付款;】', - `pay_status` tinyint NULL DEFAULT NULL COMMENT '支付状态', - `confirm_time` datetime NULL DEFAULT NULL COMMENT '确认时间', - `callback_content` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL DEFAULT '' COMMENT '回调内容', - `callback_time` datetime NULL DEFAULT NULL COMMENT '回调时间', - `pay_subject` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL DEFAULT '' COMMENT '交易内容', - `deleted` tinyint(1) NULL DEFAULT 0 COMMENT '逻辑删除【0->正常;1->已删除】', - `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间', - `update_time` datetime NULL DEFAULT NULL COMMENT '修改时间', - PRIMARY KEY (`id`) USING BTREE + `id` bigint NOT NULL AUTO_INCREMENT COMMENT 'id', + `order_id` bigint NOT NULL COMMENT '订单id', + `pay_sn` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL DEFAULT '' COMMENT '支付流水号', + `pay_amount` bigint NOT NULL DEFAULT 0 COMMENT '应付总额(分)', + `pay_time` datetime NULL DEFAULT NULL COMMENT '支付时间', + `pay_type` tinyint NULL DEFAULT NULL COMMENT '支付方式【1->支付宝;2->微信;3->银联; 4->货到付款;】', + `pay_status` tinyint NULL DEFAULT NULL COMMENT '支付状态', + `confirm_time` datetime NULL DEFAULT NULL COMMENT '确认时间', + `callback_content` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL DEFAULT '' COMMENT '回调内容', + `callback_time` datetime NULL DEFAULT NULL COMMENT '回调时间', + `pay_subject` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL DEFAULT '' COMMENT '交易内容', + `deleted` tinyint(1) NULL DEFAULT 0 COMMENT '逻辑删除【0->正常;1->已删除】', + `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间', + `update_time` datetime NULL DEFAULT NULL COMMENT '修改时间', + PRIMARY KEY (`id`) USING BTREE ) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '支付信息表' ROW_FORMAT = DYNAMIC; -- ---------------------------- @@ -260,17 +165,17 @@ CREATE TABLE `oms_order_pay` ( -- ---------------------------- DROP TABLE IF EXISTS `oms_order_setting`; CREATE TABLE `oms_order_setting` ( - `id` bigint NOT NULL AUTO_INCREMENT COMMENT 'id', - `flash_order_overtime` int NULL DEFAULT NULL COMMENT '秒杀订单超时关闭时间(分)', - `normal_order_overtime` int NULL DEFAULT NULL COMMENT '正常订单超时时间(分)', - `confirm_overtime` int NULL DEFAULT NULL COMMENT '发货后自动确认收货时间(天)', - `finish_overtime` int NULL DEFAULT NULL COMMENT '自动完成交易时间,不能申请退货(天)', - `comment_overtime` int NULL DEFAULT NULL COMMENT '订单完成后自动好评时间(天)', - `member_level` tinyint NULL DEFAULT NULL COMMENT '会员等级【0-不限会员等级,全部通用;其他-对应的其他会员等级】', - `deleted` tinyint(1) NULL DEFAULT 0 COMMENT '逻辑删除【0->正常;1->已删除】', - `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间', - `update_time` datetime NULL DEFAULT NULL COMMENT '修改时间', - PRIMARY KEY (`id`) USING BTREE + `id` bigint NOT NULL AUTO_INCREMENT COMMENT 'id', + `flash_order_overtime` int NULL DEFAULT NULL COMMENT '秒杀订单超时关闭时间(分)', + `normal_order_overtime` int NULL DEFAULT NULL COMMENT '正常订单超时时间(分)', + `confirm_overtime` int NULL DEFAULT NULL COMMENT '发货后自动确认收货时间(天)', + `finish_overtime` int NULL DEFAULT NULL COMMENT '自动完成交易时间,不能申请退货(天)', + `comment_overtime` int NULL DEFAULT NULL COMMENT '订单完成后自动好评时间(天)', + `member_level` tinyint NULL DEFAULT NULL COMMENT '会员等级【0-不限会员等级,全部通用;其他-对应的其他会员等级】', + `deleted` tinyint(1) NULL DEFAULT 0 COMMENT '逻辑删除【0->正常;1->已删除】', + `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间', + `update_time` datetime NULL DEFAULT NULL COMMENT '修改时间', + PRIMARY KEY (`id`) USING BTREE ) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '订单配置信息' ROW_FORMAT = DYNAMIC; -- ---------------------------- @@ -282,14 +187,14 @@ CREATE TABLE `oms_order_setting` ( -- ---------------------------- DROP TABLE IF EXISTS `undo_log`; CREATE TABLE `undo_log` ( - `branch_id` bigint NOT NULL COMMENT 'branch transaction id', - `xid` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT 'global transaction id', - `context` varchar(128) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT 'undo_log context,such as serialization', - `rollback_info` longblob NOT NULL COMMENT 'rollback info', - `log_status` int NOT NULL COMMENT '0:normal status,1:defense status', - `log_created` datetime(6) NOT NULL COMMENT 'create datetime', - `log_modified` datetime(6) NOT NULL COMMENT 'modify datetime', - UNIQUE INDEX `ux_undo_log`(`xid`, `branch_id`) USING BTREE + `branch_id` bigint NOT NULL COMMENT 'branch transaction id', + `xid` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT 'global transaction id', + `context` varchar(128) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT 'undo_log context,such as serialization', + `rollback_info` longblob NOT NULL COMMENT 'rollback info', + `log_status` int NOT NULL COMMENT '0:normal status,1:defense status', + `log_created` datetime(6) NOT NULL COMMENT 'create datetime', + `log_modified` datetime(6) NOT NULL COMMENT 'modify datetime', + UNIQUE INDEX `ux_undo_log`(`xid` ASC, `branch_id` ASC) USING BTREE ) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = 'AT transaction mode undo table' ROW_FORMAT = DYNAMIC; -- ---------------------------- diff --git a/docs/sql/mysql8.x/mall_pms.sql b/docs/sql/mysql8.x/mall_pms.sql index 73abecd09..27354f307 100644 --- a/docs/sql/mysql8.x/mall_pms.sql +++ b/docs/sql/mysql8.x/mall_pms.sql @@ -82,7 +82,7 @@ CREATE TABLE `pms_category_attribute` ( `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间', `update_time` datetime NULL DEFAULT NULL COMMENT '更新时间', PRIMARY KEY (`id`) USING BTREE, - INDEX `fk_pms_attr_pms_category`(`category_id`) USING BTREE + INDEX `fk_pms_attr_pms_category`(`category_id` ASC) USING BTREE ) ENGINE = InnoDB AUTO_INCREMENT = 183 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '商品属性表' ROW_FORMAT = DYNAMIC; -- ---------------------------- @@ -93,17 +93,17 @@ INSERT INTO `pms_category_attribute` VALUES (35, 5, '规格', 1, '2021-07-11 18: INSERT INTO `pms_category_attribute` VALUES (36, 5, '上市时间', 2, '2021-07-11 18:00:08', '2022-06-01 17:41:05'); -- ---------------------------- --- Table structure for pms_catetgory_brand +-- Table structure for pms_category_brand -- ---------------------------- -DROP TABLE IF EXISTS `pms_catetgory_brand`; -CREATE TABLE `pms_catetgory_brand` ( - `category_id` bigint NOT NULL, - `brand_id` bigint NOT NULL, - PRIMARY KEY (`category_id`) USING BTREE +DROP TABLE IF EXISTS `pms_category_brand`; +CREATE TABLE `pms_category_brand` ( + `category_id` bigint NOT NULL, + `brand_id` bigint NOT NULL, + PRIMARY KEY (`category_id`) USING BTREE ) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = DYNAMIC; -- ---------------------------- --- Records of pms_catetgory_brand +-- Records of pms_category_brand -- ---------------------------- -- ---------------------------- @@ -117,34 +117,35 @@ CREATE TABLE `pms_sku` ( `name` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '商品名称', `spec_ids` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '商品规格值,以英文逗号(,)分割', `price` bigint NULL DEFAULT NULL COMMENT '商品价格(单位:分)', - `stock_num` int NULL DEFAULT 0 COMMENT '库存数量', - `locked_stock_num` int NULL DEFAULT 0 COMMENT '锁定库存数量', + `stock` int UNSIGNED NULL DEFAULT NULL COMMENT '库存数量', + `locked_stock` int NULL DEFAULT NULL COMMENT '库存锁定数量', `pic_url` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '商品图片地址', `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间', `update_time` datetime NULL DEFAULT NULL COMMENT '更新时间', PRIMARY KEY (`id`) USING BTREE, - INDEX `fk_pms_sku_pms_spu`(`spu_id`) USING BTREE + INDEX `fk_pms_sku_pms_spu`(`spu_id` ASC) USING BTREE ) ENGINE = InnoDB AUTO_INCREMENT = 755 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '商品库存表' ROW_FORMAT = DYNAMIC; -- ---------------------------- -- Records of pms_sku -- ---------------------------- -INSERT INTO `pms_sku` VALUES (1, 'sn001', 1, '黑 6+128g', '1_3', 399900, 999, 5, 'https://www.youlai.tech/files/default/c25b39470474494485633c49101a0f5d.png', '2021-08-08 00:43:26', '2022-07-03 14:16:16'); -INSERT INTO `pms_sku` VALUES (2, 'sn002', 1, '黑 8+256g', '1_4', 499900, 9998, 0, 'https://www.youlai.tech/files/default/c25b39470474494485633c49101a0f5d.png', '2021-08-08 00:43:26', '2022-07-03 14:16:16'); -INSERT INTO `pms_sku` VALUES (3, 'sn003', 1, '蓝 6+128g', '216_3', 399900, 9998, 0, 'https://www.youlai.tech/files/default/835d73a337964b9b97e5c7c90acc8cb2.png', '2022-03-05 09:25:53', '2022-07-03 14:16:16'); -INSERT INTO `pms_sku` VALUES (4, 'sn004', 1, '蓝 8+256g', '216_4', 499900, 9988, 0, 'https://www.youlai.tech/files/default/835d73a337964b9b97e5c7c90acc8cb2.png', '2022-03-05 09:25:53', '2022-07-03 14:16:16'); -INSERT INTO `pms_sku` VALUES (5, '10000001', 2, '魔幻青 RTX3060/i7-12700H/165Hz 2.5K屏', '256_258', 1025000, 9816, 26, 'http://a.youlai.tech:9000/default/8815c9a46fcc4b1ea952623406750da5.jpg', '2022-03-11 14:39:21', '2022-07-08 00:29:56'); -INSERT INTO `pms_sku` VALUES (6, '10000002', 2, '魔幻青 RTX3050tTi/12代i5/144Hz高色域屏', '256_259', 925000, 10000, 0, 'http://a.youlai.tech:9000/default/8815c9a46fcc4b1ea952623406750da5.jpg', '2022-03-11 14:39:21', '2022-07-08 00:29:56'); -INSERT INTO `pms_sku` VALUES (7, '10000003', 2, '日蚀灰 RTX3060/i7-12700H/165Hz 2.5K屏', '257_258', 1025000, 10000, 0, 'http://a.youlai.tech:9000/default/3210cd1ffb6c4346b743a10855d3cb37.jpg', '2022-03-11 14:39:21', '2022-07-08 00:29:56'); -INSERT INTO `pms_sku` VALUES (8, '10000004', 2, '日蚀灰 RTX3050tTi/12代i5/144Hz高色域屏', '257_259', 925000, 10000, 0, 'http://a.youlai.tech:9000/default/3210cd1ffb6c4346b743a10855d3cb37.jpg', '2022-03-11 14:39:21', '2022-07-08 00:29:56'); -INSERT INTO `pms_sku` VALUES (747, '111', 287, '16g 512g 【2022款】锐龙六核R5-6600U/核芯显卡/100%sRGB高色域', '841_843_845', 589900, 9991, 2, NULL, '2022-07-07 00:22:13', '2022-07-08 00:29:41'); -INSERT INTO `pms_sku` VALUES (748, '112', 287, '16g 512g 【2022款】锐龙八核R7-6800U/核芯显卡/100%sRGB高色域', '841_843_846', 629900, 9999, 0, NULL, '2022-07-07 00:22:13', '2022-07-08 00:29:41'); -INSERT INTO `pms_sku` VALUES (749, '113', 287, '16g 1t 【2022款】锐龙六核R5-6600U/核芯显卡/100%sRGB高色域', '841_844_845', 639900, 9999, 0, NULL, '2022-07-07 00:22:13', '2022-07-08 00:29:41'); -INSERT INTO `pms_sku` VALUES (750, '114', 287, '16g 1t 【2022款】锐龙八核R7-6800U/核芯显卡/100%sRGB高色域', '841_844_846', 639900, 9999, 0, NULL, '2022-07-07 00:22:13', '2022-07-08 00:29:41'); -INSERT INTO `pms_sku` VALUES (751, '115', 287, '32g 512g 【2022款】锐龙六核R5-6600U/核芯显卡/100%sRGB高色域', '842_843_845', 589900, 9999, 0, NULL, '2022-07-07 00:22:13', '2022-07-08 00:29:41'); -INSERT INTO `pms_sku` VALUES (752, '116', 287, '32g 512g 【2022款】锐龙八核R7-6800U/核芯显卡/100%sRGB高色域', '842_843_846', 629900, 9999, 0, NULL, '2022-07-07 00:22:13', '2022-07-08 00:29:41'); -INSERT INTO `pms_sku` VALUES (753, '117', 287, '32g 1t 【2022款】锐龙六核R5-6600U/核芯显卡/100%sRGB高色域', '842_844_845', 639900, 9999, 0, NULL, '2022-07-07 00:22:13', '2022-07-08 00:29:41'); -INSERT INTO `pms_sku` VALUES (754, '118', 287, '32g 1t 【2022款】锐龙八核R7-6800U/核芯显卡/100%sRGB高色域', '842_844_846', 639900, 9999, 0, NULL, '2022-07-07 00:22:13', '2022-07-08 00:29:41'); +INSERT INTO `pms_sku` VALUES (1, 'sn001', 1, '黑 6+128g', '1_3', 399900, 996, 0, 'https://www.youlai.tech/files/default/c25b39470474494485633c49101a0f5d.png', '2021-08-08 00:43:26', '2022-07-03 14:16:16'); +INSERT INTO `pms_sku` VALUES (2, 'sn002', 1, '黑 8+256g', '1_4', 499900, 999, 0, 'https://www.youlai.tech/files/default/c25b39470474494485633c49101a0f5d.png', '2021-08-08 00:43:26', '2022-07-03 14:16:16'); +INSERT INTO `pms_sku` VALUES (3, 'sn003', 1, '蓝 6+128g', '216_3', 399900, 999, 0, 'https://www.youlai.tech/files/default/835d73a337964b9b97e5c7c90acc8cb2.png', '2022-03-05 09:25:53', '2022-07-03 14:16:16'); +INSERT INTO `pms_sku` VALUES (4, 'sn004', 1, '蓝 8+256g', '216_4', 499900, 999, 0, 'https://www.youlai.tech/files/default/835d73a337964b9b97e5c7c90acc8cb2.png', '2022-03-05 09:25:53', '2022-07-03 14:16:16'); +INSERT INTO `pms_sku` VALUES (5, '10000001', 2, '魔幻青 RTX3060/i7-12700H/165Hz 2.5K屏', '256_258', 1025000, 999, 0, 'http://a.youlai.tech:9000/default/8815c9a46fcc4b1ea952623406750da5.jpg', '2022-03-11 14:39:21', '2022-07-08 00:29:56'); +INSERT INTO `pms_sku` VALUES (6, '10000002', 2, '魔幻青 RTX3050tTi/12代i5/144Hz高色域屏', '256_259', 925000, 999, 0, 'http://a.youlai.tech:9000/default/8815c9a46fcc4b1ea952623406750da5.jpg', '2022-03-11 14:39:21', '2022-07-08 00:29:56'); +INSERT INTO `pms_sku` VALUES (7, '10000003', 2, '日蚀灰 RTX3060/i7-12700H/165Hz 2.5K屏', '257_258', 1025000, 999, 0, 'http://a.youlai.tech:9000/default/3210cd1ffb6c4346b743a10855d3cb37.jpg', '2022-03-11 14:39:21', '2022-07-08 00:29:56'); +INSERT INTO `pms_sku` VALUES (8, '10000004', 2, '日蚀灰 RTX3050tTi/12代i5/144Hz高色域屏', '257_259', 925000, 999, 0, 'http://a.youlai.tech:9000/default/3210cd1ffb6c4346b743a10855d3cb37.jpg', '2022-03-11 14:39:21', '2022-07-08 00:29:56'); +INSERT INTO `pms_sku` VALUES (9, '111', 3, '16g 512g 【2022款】锐龙六核R5-6600U/核芯显卡/100%sRGB高色域', '841_843_845', 589900, 999, 0, 'https://oss.youlai.tech/youlai-boot/2023/06/08/78b8efecb753426f81e5dcfcd175495f.jpg', '2022-07-07 00:22:13', '2022-07-08 00:29:41'); +INSERT INTO `pms_sku` VALUES (10, '112', 3, '16g 512g 【2022款】锐龙八核R7-6800U/核芯显卡/100%sRGB高色域', '841_843_846', 629900, 999, 0, 'https://oss.youlai.tech/youlai-boot/2023/06/08/93cbc9dc6fe144f5a59793a6248479a0.jpg', '2022-07-07 00:22:13', '2022-07-08 00:29:41'); +INSERT INTO `pms_sku` VALUES (11, '113', 3, '16g 1t 【2022款】锐龙六核R5-6600U/核芯显卡/100%sRGB高色域', '841_844_845', 639900, 999, 0, 'https://oss.youlai.tech/youlai-boot/2023/06/08/78b8efecb753426f81e5dcfcd175495f.jpg', '2022-07-07 00:22:13', '2022-07-08 00:29:41'); +INSERT INTO `pms_sku` VALUES (12, '114', 3, '16g 1t 【2022款】锐龙八核R7-6800U/核芯显卡/100%sRGB高色域', '841_844_846', 639900, 999, 0, 'https://oss.youlai.tech/youlai-boot/2023/06/08/93cbc9dc6fe144f5a59793a6248479a0.jpg', '2022-07-07 00:22:13', '2022-07-08 00:29:41'); +INSERT INTO `pms_sku` VALUES (13, '115', 3, '32g 512g 【2022款】锐龙六核R5-6600U/核芯显卡/100%sRGB高色域', '842_843_845', 589900, 999, 0, 'https://oss.youlai.tech/youlai-boot/2023/06/08/78b8efecb753426f81e5dcfcd175495f.jpg', '2022-07-07 00:22:13', '2022-07-08 00:29:41'); +INSERT INTO `pms_sku` VALUES (14, '116', 3, '32g 512g 【2022款】锐龙八核R7-6800U/核芯显卡/100%sRGB高色域', '842_843_846', 629900, 999, 0, 'https://oss.youlai.tech/youlai-boot/2023/06/08/93cbc9dc6fe144f5a59793a6248479a0.jpg', '2022-07-07 00:22:13', '2022-07-08 00:29:41'); +INSERT INTO `pms_sku` VALUES (15, '117', 3, '32g 1t 【2022款】锐龙六核R5-6600U/核芯显卡/100%sRGB高色域', '842_844_845', 639900, 999, 0, 'https://oss.youlai.tech/youlai-boot/2023/06/08/78b8efecb753426f81e5dcfcd175495f.jpg', '2022-07-07 00:22:13', '2022-07-08 00:29:41'); +INSERT INTO `pms_sku` VALUES (16, '118', 3, '32g 1t 【2022款】锐龙八核R7-6800U/核芯显卡/100%sRGB高色域', '842_844_846', 639900, 999, 0, 'https://oss.youlai.tech/youlai-boot/2023/06/08/93cbc9dc6fe144f5a59793a6248479a0.jpg', '2022-07-07 00:22:13', '2022-07-08 00:29:41'); +INSERT INTO `pms_sku` VALUES (17, 'sn001', 4, '黑 6+128g', '1_3', 399900, 999, 0, 'https://oss.youlai.tech/youlai-boot/2023/06/08/6b83dd33eaa248ed8e11cff0003287ee.jpg', '2021-08-08 00:43:26', '2022-07-03 14:16:16'); -- ---------------------------- -- Table structure for pms_spu @@ -167,8 +168,8 @@ CREATE TABLE `pms_spu` ( `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间', `update_time` datetime NULL DEFAULT NULL COMMENT '更新时间', PRIMARY KEY (`id`) USING BTREE, - INDEX `fk_pms_spu_pms_brand`(`brand_id`) USING BTREE, - INDEX `fk_pms_spu_pms_category`(`category_id`) USING BTREE + INDEX `fk_pms_spu_pms_brand`(`brand_id` ASC) USING BTREE, + INDEX `fk_pms_spu_pms_category`(`category_id` ASC) USING BTREE ) ENGINE = InnoDB AUTO_INCREMENT = 288 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '商品表' ROW_FORMAT = DYNAMIC; -- ---------------------------- @@ -176,7 +177,8 @@ CREATE TABLE `pms_spu` ( -- ---------------------------- INSERT INTO `pms_spu` VALUES (1, '小米12 PRO', 5, 10, 599900, 599900, 1, 'https://oss.youlai.tech/default/0ccd5bf5cf384185be1f18a01da076b9.png', '[]', '台', '好快,好稳,\n好一次强上加强。\n高通全新一代芯片赋能,速度大幅提升。\n三大专业主摄影像加持,能力全面进化。\n大师级设计理念新诠释,质感简而不凡。\n斩获十五项纪录旗舰屏,感官万般出众。', '

\"\"

', 1, NULL, '2022-07-03 14:16:16'); INSERT INTO `pms_spu` VALUES (2, '华硕天选3', 101, 11, 1145000, 929900, 0, 'https://www.youlai.tech/files/default/d97457b3fd7d4aef8846da96fe032bf8.jpg', '[\"https://www.youlai.tech/files/default/3edd01c723ff456384cea9bd3c9b19e7.jpg\", \"https://www.youlai.tech/files/default/a6681c18fc294ee49efb8e121b8e943f.jpg\", \"https://www.youlai.tech/files/default/97458ae9ea734bc498724660abb1c6cd.jpg\", \"https://www.youlai.tech/files/default/501b0e6dcb3f4d69b7e40e90b3d3ac32.jpg\"]', NULL, '中国台湾华硕电脑股份有限公司 [1] 是当前全球第一大主板生产商、全球第三大显卡生产商,同时也是全球领先的3C解决方案提供商之一,致力于为个人和企业用户提供最具创新价值的产品及应用方案。华硕的产品线完整覆盖至笔记本电脑、主板、显卡、服务器、光存储、有线/无线网络通讯产品、LCD、掌上电脑、智能手机等全线3C产品。其中显卡和主板以及笔记本电脑三大产品已经成为华硕的主要竞争实力。', '

\"\"\"\"

', 1, '2022-03-11 14:39:21', '2022-07-08 00:29:56'); -INSERT INTO `pms_spu` VALUES (287, '惠普战X ', 99, 33, 639900, 629900, 0, 'https://oss.youlai.tech/default/e59859e0effb4b66a0f7380ff5369d66.jpg', '[\"https://oss.youlai.tech/default/de9c5625e35b4c0aa9888c48d4def446.jpg\"]', NULL, '【2022新款】HP/惠普战X 16英寸锐龙新款6000系列R5六核/R7八核高性能学生家用轻薄办公商用笔记本电脑\n六核/八核处理器,高性能集成显卡', '

\"\"

', 1, '2022-07-07 00:22:13', '2022-07-08 00:29:41'); +INSERT INTO `pms_spu` VALUES (3, '惠普战X ', 99, 33, 639900, 629900, 0, 'https://oss.youlai.tech/default/e59859e0effb4b66a0f7380ff5369d66.jpg', '[\"https://oss.youlai.tech/default/de9c5625e35b4c0aa9888c48d4def446.jpg\"]', NULL, '【2022新款】HP/惠普战X 16英寸锐龙新款6000系列R5六核/R7八核高性能学生家用轻薄办公商用笔记本电脑\n六核/八核处理器,高性能集成显卡', '

\"\"

', 1, '2022-07-07 00:22:13', '2022-07-08 00:29:41'); +INSERT INTO `pms_spu` VALUES (4, '小米13', 5, 10, 599900, 599900, 1, 'https://oss.youlai.tech/youlai-boot/2023/06/08/6b83dd33eaa248ed8e11cff0003287ee.jpg', '[]', '台', '好快,好稳,\n好一次强上加强。\n高通全新一代芯片赋能,速度大幅提升。\n三大专业主摄影像加持,能力全面进化。\n大师级设计理念新诠释,质感简而不凡。\n斩获十五项纪录旗舰屏,感官万般出众。', '

\"\"

', 1, NULL, '2022-07-03 14:16:16'); -- ---------------------------- -- Table structure for pms_spu_attribute @@ -193,8 +195,8 @@ CREATE TABLE `pms_spu_attribute` ( `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间', `update_time` datetime NULL DEFAULT NULL COMMENT '更新时间', PRIMARY KEY (`id`) USING BTREE, - INDEX `fk_pms_spu_attribute_pms_attr`(`name`) USING BTREE, - INDEX `fk_pms_spu_attribute_pms_spu`(`spu_id`) USING BTREE + INDEX `fk_pms_spu_attribute_pms_attr`(`name` ASC) USING BTREE, + INDEX `fk_pms_spu_attribute_pms_spu`(`spu_id` ASC) USING BTREE ) ENGINE = InnoDB AUTO_INCREMENT = 847 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '商品属性/规格表' ROW_FORMAT = DYNAMIC; -- ---------------------------- @@ -214,15 +216,15 @@ INSERT INTO `pms_spu_attribute` VALUES (256, 2, NULL, '颜色', '魔幻青', 1, INSERT INTO `pms_spu_attribute` VALUES (257, 2, NULL, '颜色', '日蚀灰', 1, 'http://a.youlai.tech:9000/default/3210cd1ffb6c4346b743a10855d3cb37.jpg', '2022-03-11 14:39:21', '2022-07-08 00:29:56'); INSERT INTO `pms_spu_attribute` VALUES (258, 2, NULL, '规格', 'RTX3060/i7-12700H/165Hz 2.5K屏', 1, NULL, '2022-03-11 14:39:21', '2022-07-08 00:29:56'); INSERT INTO `pms_spu_attribute` VALUES (259, 2, NULL, '规格', 'RTX3050tTi/12代i5/144Hz高色域屏', 1, NULL, '2022-03-11 14:39:21', '2022-07-08 00:29:56'); -INSERT INTO `pms_spu_attribute` VALUES (838, 287, NULL, '内存', '16g 32g', 2, NULL, '2022-07-07 00:22:13', '2022-07-08 00:29:41'); -INSERT INTO `pms_spu_attribute` VALUES (839, 287, NULL, '重量', '1.5kg(含)-2kg(不含)', 2, NULL, '2022-07-07 00:22:13', '2022-07-08 00:29:41'); -INSERT INTO `pms_spu_attribute` VALUES (840, 287, NULL, '显卡类型', '核芯显卡', 2, NULL, '2022-07-07 00:22:13', '2022-07-08 00:29:41'); -INSERT INTO `pms_spu_attribute` VALUES (841, 287, NULL, '内存容量', '16g', 1, NULL, '2022-07-07 00:22:13', '2022-07-08 00:29:41'); -INSERT INTO `pms_spu_attribute` VALUES (842, 287, NULL, '内存容量', '32g', 1, NULL, '2022-07-07 00:22:13', '2022-07-08 00:29:41'); -INSERT INTO `pms_spu_attribute` VALUES (843, 287, NULL, '硬盘容量', '512g', 1, NULL, '2022-07-07 00:22:13', '2022-07-08 00:29:41'); -INSERT INTO `pms_spu_attribute` VALUES (844, 287, NULL, '硬盘容量', '1t', 1, NULL, '2022-07-07 00:22:13', '2022-07-08 00:29:41'); -INSERT INTO `pms_spu_attribute` VALUES (845, 287, NULL, '套餐类型', '【2022款】锐龙六核R5-6600U/核芯显卡/100%sRGB高色域', 1, NULL, '2022-07-07 00:22:13', '2022-07-08 00:29:41'); -INSERT INTO `pms_spu_attribute` VALUES (846, 287, NULL, '套餐类型', '【2022款】锐龙八核R7-6800U/核芯显卡/100%sRGB高色域', 1, NULL, '2022-07-07 00:22:13', '2022-07-08 00:29:41'); +INSERT INTO `pms_spu_attribute` VALUES (838, 3, NULL, '内存', '16g 32g', 2, NULL, '2022-07-07 00:22:13', '2022-07-08 00:29:41'); +INSERT INTO `pms_spu_attribute` VALUES (839, 3, NULL, '重量', '1.5kg(含)-2kg(不含)', 2, NULL, '2022-07-07 00:22:13', '2022-07-08 00:29:41'); +INSERT INTO `pms_spu_attribute` VALUES (840, 3, NULL, '显卡类型', '核芯显卡', 2, NULL, '2022-07-07 00:22:13', '2022-07-08 00:29:41'); +INSERT INTO `pms_spu_attribute` VALUES (841, 3, NULL, '内存容量', '16g', 1, NULL, '2022-07-07 00:22:13', '2022-07-08 00:29:41'); +INSERT INTO `pms_spu_attribute` VALUES (842, 3, NULL, '内存容量', '32g', 1, NULL, '2022-07-07 00:22:13', '2022-07-08 00:29:41'); +INSERT INTO `pms_spu_attribute` VALUES (843, 3, NULL, '硬盘容量', '512g', 1, NULL, '2022-07-07 00:22:13', '2022-07-08 00:29:41'); +INSERT INTO `pms_spu_attribute` VALUES (844, 3, NULL, '硬盘容量', '1t', 1, NULL, '2022-07-07 00:22:13', '2022-07-08 00:29:41'); +INSERT INTO `pms_spu_attribute` VALUES (845, 3, NULL, '套餐类型', '【2022款】锐龙六核R5-6600U/核芯显卡/100%sRGB高色域', 1, NULL, '2022-07-07 00:22:13', '2022-07-08 00:29:41'); +INSERT INTO `pms_spu_attribute` VALUES (846, 3, NULL, '套餐类型', '【2022款】锐龙八核R7-6800U/核芯显卡/100%sRGB高色域', 1, NULL, '2022-07-07 00:22:13', '2022-07-08 00:29:41'); -- ---------------------------- -- Table structure for undo_log @@ -236,7 +238,11 @@ CREATE TABLE `undo_log` ( `log_status` int NOT NULL COMMENT '0:normal status,1:defense status', `log_created` datetime(6) NOT NULL COMMENT 'create datetime', `log_modified` datetime(6) NOT NULL COMMENT 'modify datetime', - UNIQUE INDEX `ux_undo_log`(`xid`, `branch_id`) USING BTREE + UNIQUE INDEX `ux_undo_log`(`xid` ASC, `branch_id` ASC) USING BTREE ) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = 'AT transaction mode undo table' ROW_FORMAT = DYNAMIC; +-- ---------------------------- +-- Records of undo_log +-- ---------------------------- + SET FOREIGN_KEY_CHECKS = 1; diff --git a/laboratory/Dockerfile b/laboratory/Dockerfile deleted file mode 100644 index c59094154..000000000 --- a/laboratory/Dockerfile +++ /dev/null @@ -1,18 +0,0 @@ -FROM openjdk:8-jre -MAINTAINER youlai youlaitech@163.com - -RUN /bin/cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime \&& echo 'Asia/Shanghai' >/etc/timezone - -# /tmp 目录作为容器数据卷目录,SpringBoot内嵌Tomcat容器默认使用/tmp作为工作目录,任何向 /tmp 中写入的信息不会记录进容器存储层,从而保证容器存储层的无状态化 -# 在宿主机的/var/lib/docker目录下创建一个临时文件并把它链接到容器中的/tmp目录 -VOLUME /tmp - -# 复制jar到镜像 -ADD target/laboratory.jar app.jar - -ENTRYPOINT ["java", "-Xmx128m", "-Djava.security.egd=file:/dev/./urandom", "-jar", "/app.jar"] - -EXPOSE 8000 - - - diff --git a/laboratory/README.md b/laboratory/README.md deleted file mode 100644 index 07212db1d..000000000 --- a/laboratory/README.md +++ /dev/null @@ -1,10 +0,0 @@ -### 项目结构 - -``` lua -youlai-loboratory -├── base 基础设置 - ├── config -- 公共配置 -├── seata 分布式事务 -├── seata 分布式事务 -└── end -``` \ No newline at end of file diff --git a/laboratory/pom.xml b/laboratory/pom.xml deleted file mode 100644 index e28361baa..000000000 --- a/laboratory/pom.xml +++ /dev/null @@ -1,127 +0,0 @@ - - - - youlai-mall - com.youlai - 2.2.0 - - 4.0.0 - - laboratory - 有来实验室 - - - 8 - 8 - - - - - - - org.springframework.boot - spring-boot-configuration-processor - - - - - org.springframework.boot - spring-boot-starter-test - test - - - - - org.springframework.cloud - spring-cloud-starter-bootstrap - - - - - com.alibaba.cloud - spring-cloud-starter-alibaba-nacos-discovery - - - jsr305 - com.google.code.findbugs - - - - - - org.springframework.cloud - spring-cloud-starter-loadbalancer - - - - - com.alibaba.cloud - spring-cloud-starter-alibaba-nacos-config - - - - - com.github.xiaoymin - knife4j-micro-spring-boot-starter - - - - com.youlai - oms-api - - - - com.youlai - pms-api - - - - com.youlai - ums-api - - - - com.youlai - common-web - - - - com.youlai - common-mybatis - - - - - com.alibaba.cloud - spring-cloud-starter-alibaba-sentinel - - - - com.alibaba.csp - sentinel-datasource-nacos - - - - com.youlai - common-seata - - - - com.youlai - common-rabbitmq - - - - - - ${project.artifactId} - - - org.springframework.boot - spring-boot-maven-plugin - - - - diff --git a/laboratory/src/main/java/com/youlai/laboratory/LaboratoryApplication.java b/laboratory/src/main/java/com/youlai/laboratory/LaboratoryApplication.java deleted file mode 100644 index 006a75fd8..000000000 --- a/laboratory/src/main/java/com/youlai/laboratory/LaboratoryApplication.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.youlai.laboratory; - -import com.youlai.mall.oms.api.OrderFeignClient; -import com.youlai.mall.pms.api.SkuFeignClient; -import com.youlai.mall.ums.api.MemberFeignClient; -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.cloud.client.discovery.EnableDiscoveryClient; -import org.springframework.cloud.openfeign.EnableFeignClients; - -/** - * 实验室启动类 - * - * @author zc - * @date 2021/11/29 0029 22:50 - */ -@SpringBootApplication -@EnableFeignClients(basePackageClasses = {OrderFeignClient.class, SkuFeignClient.class, MemberFeignClient.class}) -@EnableDiscoveryClient -public class LaboratoryApplication { - public static void main(String[] args) { - SpringApplication.run(LaboratoryApplication.class, args); - } -} diff --git a/laboratory/src/main/java/com/youlai/laboratory/seata/controller/SeataController.java b/laboratory/src/main/java/com/youlai/laboratory/seata/controller/SeataController.java deleted file mode 100644 index 9d6b73ed0..000000000 --- a/laboratory/src/main/java/com/youlai/laboratory/seata/controller/SeataController.java +++ /dev/null @@ -1,56 +0,0 @@ -package com.youlai.laboratory.seata.controller; - -import com.youlai.common.result.Result; -import com.youlai.laboratory.seata.pojo.form.SeataForm; -import com.youlai.laboratory.seata.pojo.vo.SeataVO; -import com.youlai.laboratory.seata.service.SeataService; -import io.swagger.annotations.Api; -import io.swagger.annotations.ApiOperation; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.web.bind.annotation.*; - -/** - * Seata 控制层 - * - * @author haoxr - * @date 2022/4/16 20:46 - */ -@Api(tags = "「实验室」Seata接口") -@RestController -@RequestMapping("/api/v1/seata") -@RequiredArgsConstructor -@Slf4j -public class SeataController { - - private final SeataService seataService; - - @ApiOperation("获取模拟数据") - @GetMapping("/data") - public Result getData() { - SeataVO result = seataService.getData(); - return Result.success(result); - } - - @ApiOperation("重置模拟数据") - @PutMapping("/data/_reset") - public Result resetData() { - boolean result = seataService.resetData(); - return Result.success(result); - } - - @ApiOperation("订单支付") - @PostMapping("/_pay") - public Result payOrder(@RequestBody SeataForm seataForm) { - boolean openTx = seataForm.isOpenTx(); - - boolean result; - if (openTx) { - // 开启全局事务 - result = seataService.payOrderWithGlobalTx(seataForm); - } else { - result = seataService.payOrder(seataForm); - } - return Result.success(result); - } -} diff --git a/laboratory/src/main/java/com/youlai/laboratory/seata/pojo/form/SeataForm.java b/laboratory/src/main/java/com/youlai/laboratory/seata/pojo/form/SeataForm.java deleted file mode 100644 index a1723af06..000000000 --- a/laboratory/src/main/java/com/youlai/laboratory/seata/pojo/form/SeataForm.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.youlai.laboratory.seata.pojo.form; - -import lombok.Data; - -/** - * Seata 表单数据 - * - * @author haoxr - * @date 2022/4/21 23:16 - */ -@Data -public class SeataForm { - - /** - * 订单金额 - */ - private Long amount; - - /** - * 是否开启事务 - */ - private boolean openTx; - - /** - * 是否开启异常 - */ - private boolean openEx; - - -} diff --git a/laboratory/src/main/java/com/youlai/laboratory/seata/pojo/vo/SeataVO.java b/laboratory/src/main/java/com/youlai/laboratory/seata/pojo/vo/SeataVO.java deleted file mode 100644 index 2112511d8..000000000 --- a/laboratory/src/main/java/com/youlai/laboratory/seata/pojo/vo/SeataVO.java +++ /dev/null @@ -1,60 +0,0 @@ -package com.youlai.laboratory.seata.pojo.vo; - -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; - -/** - * Seata模拟数据视图对象 - * - * @author haoxr - * @date 2022/4/17 16:51 - */ -@ApiModel("Seata模拟数据视图对象") -@Data -public class SeataVO { - - @ApiModelProperty("商品库存信息") - private StockInfo stockInfo; - - @ApiModelProperty("会员信息") - private AccountInfo accountInfo; - - @ApiModelProperty("订单信息") - private OrderInfo orderInfo; - - @ApiModel("商品库存信息") - @Data - public static class StockInfo{ - - @ApiModelProperty("商品名称") - private String name; - @ApiModelProperty("商品图片") - private String picUrl; - @ApiModelProperty("库存数量") - private Integer stockNum; - - } - - @ApiModel("订单信息") - @Data - public static class OrderInfo{ - @ApiModelProperty("订单编号") - private String orderSn; - @ApiModelProperty("订单状态") - private Integer status; - - } - - @ApiModel("会员信息") - @Data - public static class AccountInfo{ - @ApiModelProperty("会员") - private String nickName; - @ApiModelProperty("订单状态") - private String avatarUrl; - @ApiModelProperty("订单状态") - private Long balance; - } - -} diff --git a/laboratory/src/main/java/com/youlai/laboratory/seata/service/SeataService.java b/laboratory/src/main/java/com/youlai/laboratory/seata/service/SeataService.java deleted file mode 100644 index 5958976dc..000000000 --- a/laboratory/src/main/java/com/youlai/laboratory/seata/service/SeataService.java +++ /dev/null @@ -1,37 +0,0 @@ -package com.youlai.laboratory.seata.service; - -import com.youlai.laboratory.seata.pojo.form.SeataForm; -import com.youlai.laboratory.seata.pojo.vo.SeataVO; - -/** - * Seata 实验室接口层 - * - * @author haoxr - * @date 2022/4/16 20:49 - */ -public interface SeataService { - - /** - * 获取模拟数据 - * - * @return - */ - SeataVO getData(); - - /** - * 重置模拟数据 - * - * @return - */ - boolean resetData(); - - /** - * 订单支付 - */ - boolean payOrder(SeataForm seataForm); - - /** - * 订单支付(全局事务) - */ - boolean payOrderWithGlobalTx(SeataForm seataForm); -} diff --git a/laboratory/src/main/java/com/youlai/laboratory/seata/service/impl/SeataServiceImpl.java b/laboratory/src/main/java/com/youlai/laboratory/seata/service/impl/SeataServiceImpl.java deleted file mode 100644 index b11f5b25f..000000000 --- a/laboratory/src/main/java/com/youlai/laboratory/seata/service/impl/SeataServiceImpl.java +++ /dev/null @@ -1,126 +0,0 @@ -package com.youlai.laboratory.seata.service.impl; - -import cn.hutool.core.bean.BeanUtil; -import com.youlai.laboratory.seata.pojo.form.SeataForm; -import com.youlai.laboratory.seata.pojo.vo.SeataVO; -import com.youlai.laboratory.seata.service.SeataService; -import com.youlai.mall.oms.api.OrderFeignClient; -import com.youlai.mall.oms.dto.OrderInfoDTO; -import com.youlai.mall.oms.dto.SeataOrderDTO; -import com.youlai.mall.pms.api.SkuFeignClient; -import com.youlai.mall.pms.pojo.dto.SkuDTO; -import com.youlai.mall.ums.api.MemberFeignClient; -import com.youlai.mall.ums.dto.MemberInfoDTO; -import io.seata.spring.annotation.GlobalTransactional; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -/** - * Seata 实验室业务类接口 - * - * @author haoxr - * @date 2022/4/16 20:49 - */ -@Service -@Slf4j -@RequiredArgsConstructor -public class SeataServiceImpl implements SeataService { - - private final SkuFeignClient skuFeignClient; - private final OrderFeignClient orderFeignClient; - private final MemberFeignClient memberFeignClient; - - - private static Long skuId = 1l; // SkuID - private static Long memberId = 1l; // 会员ID - private static Long orderId = 1l;// 订单ID - - - /** - * 获取模拟数据 - * - * @return - */ - @Override - public SeataVO getData() { - - - SeataVO seataVO = new SeataVO(); - - SkuDTO skuDTO = skuFeignClient.getSkuInfo(skuId).getData(); - SeataVO.StockInfo stockInfo = new SeataVO.StockInfo(); - BeanUtil.copyProperties(skuDTO, stockInfo); - stockInfo.setName(skuDTO.getSkuName()); - seataVO.setStockInfo(stockInfo); - - MemberInfoDTO memberInfoDTO = memberFeignClient.getMemberInfo(memberId).getData(); - SeataVO.AccountInfo accountInfo = new SeataVO.AccountInfo(); - BeanUtil.copyProperties(memberInfoDTO, accountInfo); - seataVO.setAccountInfo(accountInfo); - - SeataVO.OrderInfo orderInfo = new SeataVO.OrderInfo(); - OrderInfoDTO orderInfoDTO = orderFeignClient.getOrderInfo(orderId).getData(); - BeanUtil.copyProperties(orderInfoDTO, orderInfo); - seataVO.setOrderInfo(orderInfo); - - return seataVO; - } - - /** - * 重置还原数据 - * - * @return - */ - @Override - public boolean resetData() { - skuFeignClient.resetStock(skuId); // 还原库存 - memberFeignClient.resetBalance(memberId); // 还原余额 - orderFeignClient.resetOrder(orderId); // 删除订单 - return true; - - } - - /** - * 订单支付 - */ - @Override - public boolean payOrder(SeataForm seataForm) { - log.info("========扣减商品库存(全局事务)========"); - skuFeignClient.deductStock(skuId, 1); // 扣减库存 - - log.info("========创建订单(全局事务)========"); - SeataOrderDTO seataOrderDTO = new SeataOrderDTO( - memberId, - skuId, - seataForm.getAmount(), - seataForm.isOpenEx() - ); - orderFeignClient.payOrder(orderId, seataOrderDTO); - - return true; - } - - /** - * 订单支付(全局事务) - */ - @Override - @GlobalTransactional - public boolean payOrderWithGlobalTx(SeataForm seataForm) { - - log.info("========扣减商品库存========"); - skuFeignClient.deductStock(skuId, 1); // 扣减库存 - - log.info("========订单支付========"); - SeataOrderDTO seataOrderDTO = new SeataOrderDTO( - memberId, - skuId, - seataForm.getAmount(), - seataForm.isOpenEx() - ); - - orderFeignClient.payOrder(orderId, seataOrderDTO); - - return true; - } -} diff --git a/laboratory/src/main/java/com/youlai/laboratory/sentinel/controller/SentinelController.java b/laboratory/src/main/java/com/youlai/laboratory/sentinel/controller/SentinelController.java deleted file mode 100644 index ee823dc24..000000000 --- a/laboratory/src/main/java/com/youlai/laboratory/sentinel/controller/SentinelController.java +++ /dev/null @@ -1,37 +0,0 @@ -package com.youlai.laboratory.sentinel.controller; - -import com.youlai.common.result.Result; -import io.swagger.annotations.Api; -import io.swagger.annotations.ApiOperation; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; - -@Api(tags = "「实验室」Sentinel接口") -@RestController -@RequestMapping("/api/v1/sentinel") -@RequiredArgsConstructor -@Slf4j -public class SentinelController { - - @ApiOperation("【普通流控】获取数据") - @GetMapping("/flow_limiting/data") - public Result getFlowLimitingData() { - return Result.success("正常数据"); - } - - @ApiOperation("【网关流控-RouteID】获取数据") - @GetMapping("/gateway_route_flow_limiting/data") - public Result getGatewayRouteFlowLimitingData() { - return Result.success("正常数据"); - } - - @ApiOperation("【网关流控-API分组】获取数据") - @GetMapping("/gateway_api_flow_limiting/data") - public Result getGatewayApiFlowLimitingData() { - return Result.success("正常数据"); - } - -} diff --git a/laboratory/src/main/java/com/youlai/laboratory/sentinel/handler/DefaultBlockExceptionHandler.java b/laboratory/src/main/java/com/youlai/laboratory/sentinel/handler/DefaultBlockExceptionHandler.java deleted file mode 100644 index 5c2a3c76d..000000000 --- a/laboratory/src/main/java/com/youlai/laboratory/sentinel/handler/DefaultBlockExceptionHandler.java +++ /dev/null @@ -1,29 +0,0 @@ -package com.youlai.laboratory.sentinel.handler; - -import com.alibaba.csp.sentinel.adapter.spring.webmvc.callback.BlockExceptionHandler; -import com.alibaba.csp.sentinel.slots.block.BlockException; -import com.alibaba.csp.sentinel.slots.block.flow.FlowException; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.youlai.common.result.Result; -import com.youlai.common.result.ResultCode; -import org.springframework.http.HttpStatus; -import org.springframework.stereotype.Component; - -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; - -@Component -public class DefaultBlockExceptionHandler implements BlockExceptionHandler { - - @Override - public void handle(HttpServletRequest request, HttpServletResponse response, BlockException e) throws Exception { - response.setStatus(HttpStatus.TOO_MANY_REQUESTS.value()); - response.setCharacterEncoding("UTF-8"); - response.setContentType("application/json;charset=utf-8"); - if(e instanceof FlowException){ - // objectMapper.writeValue 用于将java对象转位JSON格式返回调用方 - new ObjectMapper().writeValue(response.getWriter(), Result.failed(ResultCode.FLOW_LIMITING)); - } - } - -} diff --git a/laboratory/src/main/resources/bootstrap-dev.yml b/laboratory/src/main/resources/bootstrap-dev.yml deleted file mode 100644 index d006a54d8..000000000 --- a/laboratory/src/main/resources/bootstrap-dev.yml +++ /dev/null @@ -1,23 +0,0 @@ -server: - port: 8805 - -spring: - main: - allow-circular-references: true - allow-bean-definition-overriding: true - mvc: - pathmatch: - matching-strategy: ant_path_matcher - cloud: - nacos: - # 注册中心 - discovery: - server-addr: http://localhost:8848 - # 配置中心 - config: - server-addr: http://f.youlai.tech:8848 - file-extension: yaml - # 公共配置 - shared-configs[0]: - data-id: youlai-common.yaml - refresh: true diff --git a/laboratory/src/main/resources/bootstrap-prod.yml b/laboratory/src/main/resources/bootstrap-prod.yml deleted file mode 100644 index a88aa5bab..000000000 --- a/laboratory/src/main/resources/bootstrap-prod.yml +++ /dev/null @@ -1,25 +0,0 @@ -server: - port: 8805 - -spring: - main: - allow-circular-references: true - allow-bean-definition-overriding: true - mvc: - pathmatch: - matching-strategy: ant_path_matcher - cloud: - nacos: - # 注册中心 - discovery: - server-addr: http://f.youlai.tech:8848 - namespace: prod-namespace-id - # 配置中心 - config: - server-addr: ${spring.cloud.nacos.discovery.server-addr} - namespace: prod-namespace-id - file-extension: yaml - # 公共配置 - shared-configs[0]: - data-id: youlai-common.yaml - refresh: true diff --git a/laboratory/src/main/resources/bootstrap.yml b/laboratory/src/main/resources/bootstrap.yml deleted file mode 100644 index beb80707c..000000000 --- a/laboratory/src/main/resources/bootstrap.yml +++ /dev/null @@ -1,5 +0,0 @@ -spring: - application: - name: laboratory - profiles: - active: dev diff --git a/mall-oms/oms-api/pom.xml b/mall-oms/oms-api/pom.xml index 4f1b65100..09eab42eb 100644 --- a/mall-oms/oms-api/pom.xml +++ b/mall-oms/oms-api/pom.xml @@ -5,7 +5,7 @@ mall-oms com.youlai - 2.2.0 + 2.4.1 4.0.0 diff --git a/mall-oms/oms-boot/pom.xml b/mall-oms/oms-boot/pom.xml index 8eb7ef104..0f26e26ad 100644 --- a/mall-oms/oms-boot/pom.xml +++ b/mall-oms/oms-boot/pom.xml @@ -5,7 +5,7 @@ mall-oms com.youlai - 2.2.0 + 2.4.1 4.0.0 @@ -49,7 +49,6 @@ - com.youlai oms-api diff --git a/mall-oms/oms-boot/src/main/java/com/youlai/mall/oms/common/constant/OmsConstants.java b/mall-oms/oms-boot/src/main/java/com/youlai/mall/oms/common/constant/OmsConstants.java deleted file mode 100644 index 383bdbba8..000000000 --- a/mall-oms/oms-boot/src/main/java/com/youlai/mall/oms/common/constant/OmsConstants.java +++ /dev/null @@ -1,28 +0,0 @@ -package com.youlai.mall.oms.common.constant; - -/** - * 订单常量 - * - * @author haoxr - * @date 2021/03/16 - */ -public interface OmsConstants { - - /** - * 会员购物车缓存KEY前缀 - */ - String MEMBER_CART_PREFIX = "MEMBER:CART:"; - - /** - * 订单防重提交锁KEY前缀 - */ - String ORDER_RESUBMIT_LOCK_PREFIX = "ORDER:RESUBMIT_LOCK:"; - - - /** - * 订单锁前缀 - * - */ - String ORDER_LOCK_PREFIX = "ORDER:LOCK:"; - -} diff --git a/mall-oms/oms-boot/src/main/java/com/youlai/mall/oms/config/OrderCloseRabbitConfig.java b/mall-oms/oms-boot/src/main/java/com/youlai/mall/oms/config/OrderRabbitConfig.java similarity index 92% rename from mall-oms/oms-boot/src/main/java/com/youlai/mall/oms/config/OrderCloseRabbitConfig.java rename to mall-oms/oms-boot/src/main/java/com/youlai/mall/oms/config/OrderRabbitConfig.java index 0853decd3..3c3a14f3d 100644 --- a/mall-oms/oms-boot/src/main/java/com/youlai/mall/oms/config/OrderCloseRabbitConfig.java +++ b/mall-oms/oms-boot/src/main/java/com/youlai/mall/oms/config/OrderRabbitConfig.java @@ -15,22 +15,21 @@ * 订单超时关单延时队列 * * @author haoxr - * @date 2022/2/4 23:21 + * @since 2.0.0 */ - @Component @Slf4j -public class OrderCloseRabbitConfig { +public class OrderRabbitConfig { // 普通延迟队列 private static final String ORDER_CLOSE_DELAY_QUEUE = "order.close.delay.queue"; private static final String ORDER_EXCHANGE = "order.exchange"; - private static final String ORDER_CLOSE_DELAY_ROUTING_KEY = "order.close.delay.routing.key"; + private static final String ORDER_CLOSE_DELAY_ROUTING_KEY = "order.close.delay"; // 死信关单队列 private static final String ORDER_ClOSE_QUEUE = "order.close.queue"; private static final String ORDER_DLX_EXCHANGE = "order.dlx.exchange"; - private static final String ORDER_ClOSE_ROUTING_KEY = "order.close.routing.key"; + private static final String ORDER_ClOSE_ROUTING_KEY = "order.close"; /** * 定义交换机 @@ -57,7 +56,7 @@ public Queue orderDelayQueue() { Map args = new HashMap<>(); args.put("x-dead-letter-exchange", ORDER_DLX_EXCHANGE); args.put("x-dead-letter-routing-key", ORDER_ClOSE_ROUTING_KEY); // 死信路由Key - args.put("x-message-ttl", 5 * 1000L); // 单位毫秒,5s用于测试 + args.put("x-message-ttl", 10 * 1000L); // 单位毫秒,10s用于测试 return new Queue(ORDER_CLOSE_DELAY_QUEUE, true, false, false, args); } diff --git a/mall-oms/oms-boot/src/main/java/com/youlai/mall/oms/config/ThreadPoolConfig.java b/mall-oms/oms-boot/src/main/java/com/youlai/mall/oms/config/ThreadPoolConfig.java index c2ffed7c8..35bc11b36 100644 --- a/mall-oms/oms-boot/src/main/java/com/youlai/mall/oms/config/ThreadPoolConfig.java +++ b/mall-oms/oms-boot/src/main/java/com/youlai/mall/oms/config/ThreadPoolConfig.java @@ -25,11 +25,11 @@ public ThreadPoolExecutor threadPoolExecutor() { int cpuCoreSize = Runtime.getRuntime().availableProcessors(); log.info("当前CPU核心数:{}", cpuCoreSize); - /** + /* * 计算密集型: 核心线程数=CPU核心 +1 √ * I/O密集型: 核心线程数=2*CPU核心 +1 */ - Integer corePoolSize = cpuCoreSize + 1; + int corePoolSize = cpuCoreSize + 1; return new ThreadPoolExecutor( corePoolSize, diff --git a/mall-oms/oms-boot/src/main/java/com/youlai/mall/oms/constant/OrderConstants.java b/mall-oms/oms-boot/src/main/java/com/youlai/mall/oms/constant/OrderConstants.java new file mode 100644 index 000000000..9fb0fcd05 --- /dev/null +++ b/mall-oms/oms-boot/src/main/java/com/youlai/mall/oms/constant/OrderConstants.java @@ -0,0 +1,28 @@ +package com.youlai.mall.oms.constant; + +/** + * 订单相关常量 + * + *

该接口定义了与订单相关的常量。

+ * + * @author haoxr + * @since 2.0.0 + */ +public interface OrderConstants { + + /** + * 会员购物车缓存键前缀 + */ + String MEMBER_CART_PREFIX = "order:cart:"; + + /** + * 订单防重提交令牌缓存键前缀 + */ + String ORDER_TOKEN_PREFIX = "order:token:"; + + /** + * 订单锁缓存键前缀 + */ + String ORDER_LOCK_PREFIX = "order:lock"; + +} diff --git a/mall-oms/oms-boot/src/main/java/com/youlai/mall/oms/controller/admin/OmsOrderController.java b/mall-oms/oms-boot/src/main/java/com/youlai/mall/oms/controller/admin/OmsOrderController.java index 72d68cbd8..970ce5a69 100644 --- a/mall-oms/oms-boot/src/main/java/com/youlai/mall/oms/controller/admin/OmsOrderController.java +++ b/mall-oms/oms-boot/src/main/java/com/youlai/mall/oms/controller/admin/OmsOrderController.java @@ -1,34 +1,34 @@ package com.youlai.mall.oms.controller.admin; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; -import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.youlai.common.result.PageResult; import com.youlai.common.result.Result; -import com.youlai.mall.oms.dto.OrderInfoDTO; -import com.youlai.mall.oms.dto.SeataOrderDTO; -import com.youlai.mall.oms.common.enums.OrderStatusEnum; -import com.youlai.mall.oms.pojo.dto.OrderDTO; -import com.youlai.mall.oms.pojo.entity.OmsOrder; -import com.youlai.mall.oms.pojo.entity.OmsOrderItem; -import com.youlai.mall.oms.pojo.query.OrderPageQuery; -import com.youlai.mall.oms.service.OrderItemService; +import com.youlai.mall.oms.model.dto.OrderDTO; +import com.youlai.mall.oms.model.entity.OmsOrder; +import com.youlai.mall.oms.model.entity.OmsOrderItem; +import com.youlai.mall.oms.model.query.OrderPageQuery; +import com.youlai.mall.oms.model.vo.OmsOrderPageVO; import com.youlai.mall.oms.service.admin.OmsOrderService; +import com.youlai.mall.oms.service.app.OrderItemService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiParam; import lombok.RequiredArgsConstructor; -import org.springframework.web.bind.annotation.*; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; import java.util.Collections; import java.util.List; import java.util.Optional; /** - * 「管理端」订单控制层 + * 管理端-订单控制层 * * @author huawei - * @date 2020/12/30 + * @since 2.3.0 */ @Api(tags = "「管理端」订单管理") @RestController @@ -42,9 +42,9 @@ public class OmsOrderController { @ApiOperation("订单分页列表") @GetMapping - public PageResult listOrderPages(OrderPageQuery queryParams) { - IPage result = orderService.listOrderPages(queryParams); - return PageResult.success(result); + public PageResult getOrderPage(OrderPageQuery queryParams) { + IPage page = orderService.getOrderPage(queryParams); + return PageResult.success(page); } @ApiOperation(value = "订单详情") @@ -65,42 +65,4 @@ public Result getOrderDetail( orderDTO.setOrder(order).setOrderItems(orderItems); return Result.success(orderDTO); } - - @ApiOperation(value = "「实验室」获取订单信息", hidden = true) - @GetMapping("/{orderId}/orderInfo") - public Result getOrderInfo( - @ApiParam("订单ID") @PathVariable Long orderId - ) { - OrderInfoDTO orderInfo = new OrderInfoDTO(); - - OmsOrder order = orderService.getById(orderId); - if (order != null) { - orderInfo.setOrderSn(order.getOrderSn()); - orderInfo.setStatus(order.getStatus()); - } - return Result.success(orderInfo); - } - - @ApiOperation(value = "「实验室」订单支付", hidden = true) - @PutMapping("/{orderId}/_pay") - public Result payOrder( - @ApiParam("订单ID") @PathVariable Long orderId, - @RequestBody SeataOrderDTO orderDTO - ) { - Boolean result = orderService.payOrder(orderId, orderDTO); - return Result.judge(result); - } - - @ApiOperation(value = "「实验室」订单重置", hidden = true) - @PutMapping("/{orderId}/_reset") - public Result resetOrder( - @ApiParam("订单ID") @PathVariable Long orderId - ) { - boolean result = orderService.update(new LambdaUpdateWrapper() - .eq(OmsOrder::getId, orderId) - .set(OmsOrder::getStatus, OrderStatusEnum.UNPAID.getValue()) - ); - return Result.judge(result); - } - } diff --git a/mall-oms/oms-boot/src/main/java/com/youlai/mall/oms/controller/app/CartController.java b/mall-oms/oms-boot/src/main/java/com/youlai/mall/oms/controller/app/CartController.java index 9f30109dc..a559659ff 100644 --- a/mall-oms/oms-boot/src/main/java/com/youlai/mall/oms/controller/app/CartController.java +++ b/mall-oms/oms-boot/src/main/java/com/youlai/mall/oms/controller/app/CartController.java @@ -2,8 +2,8 @@ import com.youlai.common.result.Result; import com.youlai.common.security.util.SecurityUtils; -import com.youlai.mall.oms.pojo.dto.CartItemDTO; -import com.youlai.mall.oms.service.CartService; +import com.youlai.mall.oms.model.dto.CartItemDTO; +import com.youlai.mall.oms.service.app.CartService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiParam; @@ -16,8 +16,7 @@ * 「移动端」购物车接口 * * @author huawei - * @email huawei_code@163.com - * @date 2020-12-30 22:31:10 + * @since 2020-12-30 22:31:10 */ @Api(tags = "「移动端」购物车接口") diff --git a/mall-oms/oms-boot/src/main/java/com/youlai/mall/oms/controller/app/OrderController.java b/mall-oms/oms-boot/src/main/java/com/youlai/mall/oms/controller/app/OrderController.java index a8e28a64a..924ecc153 100644 --- a/mall-oms/oms-boot/src/main/java/com/youlai/mall/oms/controller/app/OrderController.java +++ b/mall-oms/oms-boot/src/main/java/com/youlai/mall/oms/controller/app/OrderController.java @@ -3,74 +3,68 @@ import com.baomidou.mybatisplus.core.metadata.IPage; import com.youlai.common.result.PageResult; import com.youlai.common.result.Result; -import com.youlai.mall.oms.pojo.entity.OmsOrder; -import com.youlai.mall.oms.pojo.form.OrderSubmitForm; -import com.youlai.mall.oms.pojo.query.OrderPageQuery; -import com.youlai.mall.oms.pojo.vo.OrderConfirmVO; -import com.youlai.mall.oms.pojo.vo.OrderSubmitResultVO; -import com.youlai.mall.oms.service.OrderService; +import com.youlai.mall.oms.model.form.OrderPaymentForm; +import com.youlai.mall.oms.model.form.OrderSubmitForm; +import com.youlai.mall.oms.model.query.OrderPageQuery; +import com.youlai.mall.oms.model.vo.OrderConfirmVO; +import com.youlai.mall.oms.model.vo.OrderPageVO; +import com.youlai.mall.oms.service.app.OrderService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; +import io.swagger.annotations.ApiParam; import lombok.RequiredArgsConstructor; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; /** - * 「移动端」订单控制层 + * APP-订单控制层 * * @author huawei - * @date 2020/12/30 + * @since 2020/12/30 */ -@Api(tags = "「移动端」订单接口") +@Api(tags = "APP-订单接口") @RestController @RequestMapping("/app-api/v1/orders") @RequiredArgsConstructor public class OrderController { - final OrderService orderService; + private final OrderService orderService; - @ApiOperation("分页列表") + @ApiOperation("订单分页列表") @GetMapping - public PageResult listOrderPages(OrderPageQuery queryParams) { - IPage result = orderService.listOrderPages(queryParams); + public PageResult getOrderPage(OrderPageQuery queryParams) { + IPage result = orderService.getOrderPage(queryParams); return PageResult.success(result); } - /** - * 订单确认 → 进入创建订单页面 - *

- * 获取购买商品明细、用户默认收货地址、防重提交唯一token - * 进入订单创建页面有两个入口,1:立即购买;2:购物车结算 - * - * @param skuId 直接购买必填,购物车结算不填 - * @return - */ - @ApiOperation("订单确认") - @PostMapping("/_confirm") - public Result confirmOrder(@RequestParam(required = false) Long skuId) { + @ApiOperation(value = "订单确认", notes = "进入订单确认页面有两个入口,1:立即购买;2:购物车结算") + @PostMapping("/confirm") + public Result confirmOrder( + @ApiParam("立即购买必填,购物车结算不填") @RequestParam(required = false) Long skuId + ) { OrderConfirmVO result = orderService.confirmOrder(skuId); return Result.success(result); } @ApiOperation("订单提交") - @PostMapping("/_submit") - public Result submitOrder(@RequestBody @Validated OrderSubmitForm orderSubmitForm) { - OrderSubmitResultVO result = orderService.submitOrder(orderSubmitForm); - return Result.success(result); + @PostMapping("/submit") + public Result submitOrder(@Validated @RequestBody OrderSubmitForm submitForm) { + String orderSn = orderService.submitOrder(submitForm); + return Result.success(orderSn); } @ApiOperation("订单支付") - @PostMapping("/{orderId}/_pay") - public Result payOrder(@PathVariable Long orderId) { - boolean result = orderService.payOrder(orderId); + @PostMapping("/payment") + public Result payOrder(@Validated @RequestBody OrderPaymentForm paymentForm) { + boolean result = orderService.payOrder(paymentForm); return Result.judge(result); } @ApiOperation("订单删除") @DeleteMapping("/{orderId}") public Result deleteOrder(@PathVariable Long orderId) { - boolean result = orderService.deleteOrder(orderId); - return Result.judge(result); + boolean deleted = orderService.deleteOrder(orderId); + return Result.judge(deleted); } } diff --git a/mall-oms/oms-boot/src/main/java/com/youlai/mall/oms/controller/app/WxPayCallbackController.java b/mall-oms/oms-boot/src/main/java/com/youlai/mall/oms/controller/app/WxPayCallbackController.java index 206ab52e4..2ac8e435f 100644 --- a/mall-oms/oms-boot/src/main/java/com/youlai/mall/oms/controller/app/WxPayCallbackController.java +++ b/mall-oms/oms-boot/src/main/java/com/youlai/mall/oms/controller/app/WxPayCallbackController.java @@ -3,8 +3,8 @@ import com.github.binarywang.wxpay.bean.notify.SignatureHeader; import com.github.binarywang.wxpay.constant.WxPayConstants; import com.github.binarywang.wxpay.exception.WxPayException; -import com.youlai.mall.oms.pojo.vo.WxPayResponseVO; -import com.youlai.mall.oms.service.OrderService; +import com.youlai.mall.oms.model.vo.WxPayResponseVO; +import com.youlai.mall.oms.service.app.OrderService; import io.swagger.annotations.Api; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; diff --git a/mall-oms/oms-boot/src/main/java/com/youlai/mall/oms/converter/CartConverter.java b/mall-oms/oms-boot/src/main/java/com/youlai/mall/oms/converter/CartConverter.java new file mode 100644 index 000000000..869c7e610 --- /dev/null +++ b/mall-oms/oms-boot/src/main/java/com/youlai/mall/oms/converter/CartConverter.java @@ -0,0 +1,24 @@ + +package com.youlai.mall.oms.converter; + +import com.youlai.mall.oms.model.dto.CartItemDTO; +import com.youlai.mall.pms.pojo.dto.SkuInfoDTO; +import org.mapstruct.Mapper; +import org.mapstruct.Mapping; +import org.mapstruct.Mappings; + +/** + * 购物车对象转化器 + * + * @author haoxr + * @since 2.0.0 + */ +@Mapper(componentModel = "spring") +public interface CartConverter { + + @Mappings({ + @Mapping(target = "skuId", source = "id"), + }) + CartItemDTO sku2CartItem(SkuInfoDTO skuInfo); + +} \ No newline at end of file diff --git a/mall-oms/oms-boot/src/main/java/com/youlai/mall/oms/converter/OrderConverter.java b/mall-oms/oms-boot/src/main/java/com/youlai/mall/oms/converter/OrderConverter.java index c93ba60b2..43dc9f908 100644 --- a/mall-oms/oms-boot/src/main/java/com/youlai/mall/oms/converter/OrderConverter.java +++ b/mall-oms/oms-boot/src/main/java/com/youlai/mall/oms/converter/OrderConverter.java @@ -1,25 +1,81 @@ package com.youlai.mall.oms.converter; -import com.youlai.mall.oms.pojo.entity.OmsOrder; -import com.youlai.mall.oms.pojo.form.OrderSubmitForm; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.youlai.mall.oms.model.bo.OrderBO; +import com.youlai.mall.oms.model.entity.OmsOrder; +import com.youlai.mall.oms.model.form.OrderSubmitForm; +import com.youlai.mall.oms.model.vo.OmsOrderPageVO; +import com.youlai.mall.oms.model.vo.OrderPageVO; import org.mapstruct.Mapper; import org.mapstruct.Mapping; import org.mapstruct.Mappings; /** - * 订单转化器 + * 订单对象转化器 * * @author haoxr - * @date 2022/12/21 + * @since 2.0.0 */ @Mapper(componentModel = "spring") public interface OrderConverter { @Mappings({ @Mapping(target = "orderSn", source = "orderToken"), - @Mapping(target = "totalQuantity", expression = "java(orderSubmitForm.getOrderItems().stream().map(OrderItemDTO::getCount).reduce(0, Integer::sum))"), - @Mapping(target = "totalAmount", expression = "java(orderSubmitForm.getOrderItems().stream().map(item -> item.getPrice() * item.getCount()).reduce(0L, Long::sum))"), + @Mapping(target = "totalQuantity", + expression = "java(orderSubmitForm.getOrderItems().stream().map(OrderSubmitForm.OrderItem::getQuantity).reduce(0, Integer::sum))"), + @Mapping(target = "totalAmount", + expression = "java(orderSubmitForm.getOrderItems().stream().map(item -> item.getPrice() * item.getQuantity()).reduce(0L, Long::sum))"), + @Mapping(target = "source", expression = "java(orderSubmitForm.getOrderSource().getValue())"), }) - OmsOrder submitForm2Entity(OrderSubmitForm orderSubmitForm); + OmsOrder form2Entity(OrderSubmitForm orderSubmitForm); + + @Mappings({ + @Mapping( + target = "paymentMethodLabel", + expression = "java(com.youlai.common.base.IBaseEnum.getLabelByValue(bo.getPaymentMethod(), com.youlai.mall.oms.enums.PaymentMethodEnum.class))" + ), + @Mapping( + target = "sourceLabel", + expression = "java(com.youlai.common.base.IBaseEnum.getLabelByValue(bo.getSource(), com.youlai.mall.oms.enums.OrderSourceEnum.class))" + ), + @Mapping( + target = "statusLabel", + expression = "java(com.youlai.common.base.IBaseEnum.getLabelByValue(bo.getStatus(), com.youlai.mall.oms.enums.OrderStatusEnum.class))" + ), + @Mapping( + target = "orderItems", + source = "orderItems" + ) + }) + OmsOrderPageVO toVoPage(OrderBO bo); + + Page toVoPage(Page boPage); + + OmsOrderPageVO.OrderItem toVoPageOrderItem(OrderBO.OrderItem orderItem); + + + @Mappings({ + @Mapping( + target = "paymentMethodLabel", + expression = "java(com.youlai.common.base.IBaseEnum.getLabelByValue(bo.getPaymentMethod(), com.youlai.mall.oms.enums.PaymentMethodEnum.class))" + ), + @Mapping( + target = "sourceLabel", + expression = "java(com.youlai.common.base.IBaseEnum.getLabelByValue(bo.getSource(), com.youlai.mall.oms.enums.OrderSourceEnum.class))" + ), + @Mapping( + target = "statusLabel", + expression = "java(com.youlai.common.base.IBaseEnum.getLabelByValue(bo.getStatus(), com.youlai.mall.oms.enums.OrderStatusEnum.class))" + ), + @Mapping( + target = "orderItems", + source = "orderItems" + ) + }) + OrderPageVO toVoPageForApp(OrderBO bo); + + Page toVoPageForApp(Page boPage); + + OrderPageVO.OrderItem toVoPageOrderItemForApp(OrderBO.OrderItem orderItem); } \ No newline at end of file diff --git a/mall-oms/oms-boot/src/main/java/com/youlai/mall/oms/converter/OrderItemConverter.java b/mall-oms/oms-boot/src/main/java/com/youlai/mall/oms/converter/OrderItemConverter.java index 700315c5e..6841b75a0 100644 --- a/mall-oms/oms-boot/src/main/java/com/youlai/mall/oms/converter/OrderItemConverter.java +++ b/mall-oms/oms-boot/src/main/java/com/youlai/mall/oms/converter/OrderItemConverter.java @@ -1,40 +1,29 @@ package com.youlai.mall.oms.converter; -import cn.hutool.core.collection.CollectionUtil; -import com.youlai.mall.oms.pojo.dto.OrderItemDTO; -import com.youlai.mall.oms.pojo.entity.OmsOrderItem; +import com.youlai.mall.oms.model.entity.OmsOrderItem; +import com.youlai.mall.oms.model.form.OrderSubmitForm; import org.mapstruct.Mapper; import org.mapstruct.Mapping; import org.mapstruct.Mappings; -import java.util.Collections; import java.util.List; -import java.util.stream.Collectors; /** - * 订单对象转化器 + * 订单商品明细对象转化器 * * @author haoxr - * @date 2022/12/21 + * @since 2.0.0 */ @Mapper(componentModel = "spring") public interface OrderItemConverter { @Mappings({ - @Mapping(target = "totalAmount", expression = "java(dto.getPrice() * dto.getCount())"), - @Mapping(target = "orderId", source = "orderId"), + @Mapping(target = "totalAmount", expression = "java(item.getPrice() * item.getQuantity())"), }) - OmsOrderItem dto2Entity(Long orderId, OrderItemDTO dto); + OmsOrderItem item2Entity(OrderSubmitForm.OrderItem item); + List item2Entity(List list); - default List dto2Entity(Long orderId, List list) { - if (CollectionUtil.isNotEmpty(list)) { - List entities = list.stream().map(dto -> dto2Entity(orderId, dto)) - .collect(Collectors.toList()); - return entities; - } - return Collections.EMPTY_LIST; - } } \ No newline at end of file diff --git a/mall-oms/oms-boot/src/main/java/com/youlai/mall/oms/common/enums/OrderSourceTypeEnum.java b/mall-oms/oms-boot/src/main/java/com/youlai/mall/oms/enums/OrderSourceEnum.java similarity index 51% rename from mall-oms/oms-boot/src/main/java/com/youlai/mall/oms/common/enums/OrderSourceTypeEnum.java rename to mall-oms/oms-boot/src/main/java/com/youlai/mall/oms/enums/OrderSourceEnum.java index 8b8a631b9..0c2ec8227 100644 --- a/mall-oms/oms-boot/src/main/java/com/youlai/mall/oms/common/enums/OrderSourceTypeEnum.java +++ b/mall-oms/oms-boot/src/main/java/com/youlai/mall/oms/enums/OrderSourceEnum.java @@ -1,23 +1,22 @@ -package com.youlai.mall.oms.common.enums; +package com.youlai.mall.oms.enums; import com.youlai.common.base.IBaseEnum; import lombok.Getter; /** - * 订单来源类型枚举 + * 订单来源枚举 * * @author huawei - * @email huawei_code@163.com - * @date 2021/1/16 + * @since 2021/1/16 */ -public enum OrderSourceTypeEnum implements IBaseEnum { +public enum OrderSourceEnum implements IBaseEnum { APP(1, "APP"), // APP订单 - PC(2, "PC"), // PC订单 + WEB(2, "WEB"), // 网页 ; - OrderSourceTypeEnum(Integer value, String label) { + OrderSourceEnum(Integer value, String label) { this.value = value; this.label = label; } diff --git a/mall-oms/oms-boot/src/main/java/com/youlai/mall/oms/common/enums/OrderStatusEnum.java b/mall-oms/oms-boot/src/main/java/com/youlai/mall/oms/enums/OrderStatusEnum.java similarity index 88% rename from mall-oms/oms-boot/src/main/java/com/youlai/mall/oms/common/enums/OrderStatusEnum.java rename to mall-oms/oms-boot/src/main/java/com/youlai/mall/oms/enums/OrderStatusEnum.java index 6a790c861..4d614ab07 100644 --- a/mall-oms/oms-boot/src/main/java/com/youlai/mall/oms/common/enums/OrderStatusEnum.java +++ b/mall-oms/oms-boot/src/main/java/com/youlai/mall/oms/enums/OrderStatusEnum.java @@ -1,4 +1,4 @@ -package com.youlai.mall.oms.common.enums; +package com.youlai.mall.oms.enums; import com.youlai.common.base.IBaseEnum; import lombok.Getter; @@ -7,7 +7,7 @@ * 订单状态枚举 * * @author haoxr - * @date 2022/11/28 + * @since 2.0.0 */ public enum OrderStatusEnum implements IBaseEnum { @@ -34,8 +34,7 @@ public enum OrderStatusEnum implements IBaseEnum { /** * 售后中 */ - SERVICING(5, "售后中") - ; + SERVICING(5, "售后中"); OrderStatusEnum(Integer value, String label) { this.value = value; diff --git a/mall-oms/oms-boot/src/main/java/com/youlai/mall/oms/common/enums/PayTypeEnum.java b/mall-oms/oms-boot/src/main/java/com/youlai/mall/oms/enums/PaymentMethodEnum.java similarity index 63% rename from mall-oms/oms-boot/src/main/java/com/youlai/mall/oms/common/enums/PayTypeEnum.java rename to mall-oms/oms-boot/src/main/java/com/youlai/mall/oms/enums/PaymentMethodEnum.java index b4f1b163f..62480ef04 100644 --- a/mall-oms/oms-boot/src/main/java/com/youlai/mall/oms/common/enums/PayTypeEnum.java +++ b/mall-oms/oms-boot/src/main/java/com/youlai/mall/oms/enums/PaymentMethodEnum.java @@ -1,24 +1,23 @@ -package com.youlai.mall.oms.common.enums; +package com.youlai.mall.oms.enums; import com.youlai.common.base.IBaseEnum; import lombok.Getter; /** - * 订单支付类型枚举 + * 订单支付方式枚举 * * @author huawei - * @email huawei_code@163.com - * @date 2021/1/16 + * @since 2.0.0 */ -public enum PayTypeEnum implements IBaseEnum { +public enum PaymentMethodEnum implements IBaseEnum { WX_JSAPI(1, "微信JSAPI支付"), ALIPAY(2, "支付宝支付"), BALANCE(3, "会员余额支付"), WX_APP(4, "微信APP支付"); - PayTypeEnum(int value, String label) { + PaymentMethodEnum(int value, String label) { this.value = value; this.label = label; } diff --git a/mall-oms/oms-boot/src/main/java/com/youlai/mall/oms/listener/OmsCloseListener.java b/mall-oms/oms-boot/src/main/java/com/youlai/mall/oms/listener/OmsCloseListener.java new file mode 100644 index 000000000..71c862564 --- /dev/null +++ b/mall-oms/oms-boot/src/main/java/com/youlai/mall/oms/listener/OmsCloseListener.java @@ -0,0 +1,92 @@ +package com.youlai.mall.oms.listener; + + +import com.rabbitmq.client.Channel; +import com.youlai.mall.oms.service.app.OrderService; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.amqp.core.Message; +import org.springframework.amqp.rabbit.annotation.*; + +import java.io.IOException; + +/** + * 订单超时未支付取消 + * + * @author haoxr + * @since 2.0.0 + */ +//@Component // 注解绑定死信队列无效暂不使用 +@RequiredArgsConstructor +@Slf4j +public class OmsCloseListener { + private final OrderService orderService; + + // 延迟队列 + private static final String ORDER_CLOSE_DELAY_QUEUE = "order.close.delay.queue"; + private static final String ORDER_EXCHANGE = "order.exchange"; + private static final String ORDER_CLOSE_DELAY_ROUTING_KEY = "order.close.delay"; + + // 关单队列 + private static final String ORDER_ClOSE_QUEUE = "order.close.queue"; + private static final String ORDER_DLX_EXCHANGE = "order.dlx.exchange"; + private static final String ORDER_ClOSE_ROUTING_KEY = "order.close"; + + /** + * 延迟队列 + *

+ * 超过 x-message-ttl 设定时间未被消费转发到死信交换机 + */ + @RabbitListener(bindings = + { + @QueueBinding( + value = @Queue(value = ORDER_CLOSE_DELAY_QUEUE, + arguments = + { + @Argument(name = "x-dead-letter-exchange", value = ORDER_DLX_EXCHANGE), + @Argument(name = "x-dead-letter-routing-key", value = ORDER_ClOSE_ROUTING_KEY), + @Argument(name = "x-message-ttl", value = "5000", type = "java.lang.Long") // 超时10s + }), + exchange = @Exchange(value = ORDER_EXCHANGE), + key = {ORDER_CLOSE_DELAY_ROUTING_KEY} + ) + }, ackMode = "MANUAL" // 手动ACK + ) + public void handleOrderCloseDelay(String orderSn, Message message, Channel channel) throws IOException { + log.info("订单({})延时队列,10s内如果未支付将路由到关单队列", orderSn); + long deliveryTag = message.getMessageProperties().getDeliveryTag(); + /** + * @param deliveryTag 消息序号 + * @param multiple 是否批量处理(true:批量拒绝所有小于deliveryTag的消息;false:只处理当前消息) + * @param requeue 拒绝是否重新入队列 (true:消息重新入队;false:禁止消息重新入队) + */ + //channel.basicReject(deliveryTag, false); // 等于 channel.basicReject(deliveryTag, false); + } + + /** + * 关单队列 + */ + @RabbitListener(bindings = { + @QueueBinding( + value = @Queue(value = ORDER_ClOSE_QUEUE, durable = "true"), + exchange = @Exchange(value = ORDER_DLX_EXCHANGE), + key = {ORDER_ClOSE_ROUTING_KEY} + ) + }, ackMode = "MANUAL" // 手动ACK + ) + @RabbitListener(queues = "order.close.queue") + public void handleOrderClose(String orderSn, Message message, Channel channel) throws IOException { + + long deliveryTag = message.getMessageProperties().getDeliveryTag(); // 消息序号 + + log.info("订单({})超时未支付,系统自动关闭订单", orderSn); + try { + orderService.closeOrder(orderSn); + channel.basicAck(deliveryTag, false); + } catch (Exception e) { + + // TODO 关单失败,入定时任务表 + channel.basicReject(deliveryTag, false); + } + } +} diff --git a/mall-oms/oms-boot/src/main/java/com/youlai/mall/oms/listener/OrderCloseListener.java b/mall-oms/oms-boot/src/main/java/com/youlai/mall/oms/listener/OrderCloseListener.java index e2531ab0c..c208e1c98 100644 --- a/mall-oms/oms-boot/src/main/java/com/youlai/mall/oms/listener/OrderCloseListener.java +++ b/mall-oms/oms-boot/src/main/java/com/youlai/mall/oms/listener/OrderCloseListener.java @@ -1,92 +1,54 @@ package com.youlai.mall.oms.listener; - import com.rabbitmq.client.Channel; -import com.youlai.mall.oms.service.OrderService; +import com.youlai.mall.oms.service.app.OrderService; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.amqp.core.Message; -import org.springframework.amqp.rabbit.annotation.*; +import org.springframework.amqp.rabbit.annotation.RabbitListener; +import org.springframework.amqp.rabbit.core.RabbitTemplate; +import org.springframework.stereotype.Component; import java.io.IOException; /** - * 订单超时未支付取消 + * 订单超时未支付系统自动取消监听器 * * @author haoxr - * @date 2022/12/19 + * @since 2022/12/19 */ -//@Component +@Component @RequiredArgsConstructor @Slf4j public class OrderCloseListener { private final OrderService orderService; + private final RabbitTemplate rabbitTemplate; - // 延迟队列 - private static final String ORDER_CLOSE_DELAY_QUEUE = "order.close.delay.queue"; - private static final String ORDER_EXCHANGE = "order.exchange"; - private static final String ORDER_CLOSE_DELAY_ROUTING_KEY = "order.close.delay.routing.key"; - - // 关单队列 - private static final String ORDER_ClOSE_QUEUE = "order.close.queue"; - private static final String ORDER_DLX_EXCHANGE = "order.dlx.exchange"; - private static final String ORDER_ClOSE_ROUTING_KEY = "order.close.routing.key"; - - /** - * 延迟队列 - *

- * 超过 x-message-ttl 设定时间未被消费转发到死信交换机 - */ - @RabbitListener(bindings = - { - @QueueBinding( - value = @Queue(value = ORDER_CLOSE_DELAY_QUEUE, - arguments = - { - @Argument(name = "x-dead-letter-exchange", value = ORDER_DLX_EXCHANGE), - @Argument(name = "x-dead-letter-routing-key", value = ORDER_ClOSE_ROUTING_KEY), - @Argument(name = "x-message-ttl", value = "5000", type = "java.lang.Long") // 超时10s - }), - exchange = @Exchange(value = ORDER_EXCHANGE), - key = {ORDER_CLOSE_DELAY_ROUTING_KEY} - ) - }, ackMode = "MANUAL" // 手动ACK - ) - public void handleOrderCloseDelay(String orderSn, Message message, Channel channel) throws IOException { - log.info("订单【{}】延时队列,10s内如果未支付将路由到关单队列", orderSn); - long deliveryTag = message.getMessageProperties().getDeliveryTag(); - /** - * @param deliveryTag 消息序号 - * @param multiple 是否批量处理(true:批量拒绝所有小于deliveryTag的消息;false:只处理当前消息) - * @param requeue 拒绝是否重新入队列 (true:消息重新入队;false:禁止消息重新入队) - */ - //channel.basicReject(deliveryTag, false); // 等于 channel.basicReject(deliveryTag, false); - } - - /** - * 关单队列 - */ - @RabbitListener(bindings = { - @QueueBinding( - value = @Queue(value = ORDER_ClOSE_QUEUE, durable = "true"), - exchange = @Exchange(value = ORDER_DLX_EXCHANGE), - key = {ORDER_ClOSE_ROUTING_KEY} - ) - }, ackMode = "MANUAL" // 手动ACK - ) @RabbitListener(queues = "order.close.queue") - public void handleOrderClose(String orderSn, Message message, Channel channel) throws IOException { + public void closeOrder(String orderSn, Message message, Channel channel) { - long deliveryTag = message.getMessageProperties().getDeliveryTag(); // 消息序号 + long deliveryTag = message.getMessageProperties().getDeliveryTag(); // 消息序号(消息队列中的位置) - log.info("订单 【{}】 超时未支付,系统自动关闭订单", orderSn); + log.info("订单({})超时未支付,系统自动关闭订单", orderSn); try { - orderService.closeOrder(orderSn); - channel.basicAck(deliveryTag, false); + boolean closeOrderResult = orderService.closeOrder(orderSn); + log.info("关单结果:{}", closeOrderResult); + if (closeOrderResult) { + // 关单成功:释放库存 + rabbitTemplate.convertAndSend("stock.exchange", "stock.unlock", orderSn); + } else { + // 关单失败:订单已被关闭,手动ACK确认并从队列移除消息 + channel.basicAck(deliveryTag, false); // false: 不批量确认,仅确认当前单个消息 + } } catch (Exception e) { + // 关单异常:拒绝消息并重新入队 + try { + channel.basicReject(deliveryTag, true); // true: 重新放回队列 + // channel.basicReject(deliveryTag, false); // false: 直接丢弃消息 (TODO 定时任务补偿) + } catch (IOException ex) { + log.error("订单({})关闭失败,原因:{}", orderSn, ex.getMessage()); + } - // TODO 关单失败,入定时任务表 - channel.basicReject(deliveryTag, false); } } } diff --git a/mall-oms/oms-boot/src/main/java/com/youlai/mall/oms/mapper/OrderDeliveryMapper.java b/mall-oms/oms-boot/src/main/java/com/youlai/mall/oms/mapper/OrderDeliveryMapper.java index 814f75576..106e2d0b5 100644 --- a/mall-oms/oms-boot/src/main/java/com/youlai/mall/oms/mapper/OrderDeliveryMapper.java +++ b/mall-oms/oms-boot/src/main/java/com/youlai/mall/oms/mapper/OrderDeliveryMapper.java @@ -1,6 +1,6 @@ package com.youlai.mall.oms.mapper; -import com.youlai.mall.oms.pojo.entity.OmsOrderDelivery; +import com.youlai.mall.oms.model.entity.OmsOrderDelivery; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import org.apache.ibatis.annotations.Mapper; diff --git a/mall-oms/oms-boot/src/main/java/com/youlai/mall/oms/mapper/OrderItemMapper.java b/mall-oms/oms-boot/src/main/java/com/youlai/mall/oms/mapper/OrderItemMapper.java index 4aa8e12eb..40461f845 100644 --- a/mall-oms/oms-boot/src/main/java/com/youlai/mall/oms/mapper/OrderItemMapper.java +++ b/mall-oms/oms-boot/src/main/java/com/youlai/mall/oms/mapper/OrderItemMapper.java @@ -1,7 +1,7 @@ package com.youlai.mall.oms.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.youlai.mall.oms.pojo.entity.OmsOrderItem; +import com.youlai.mall.oms.model.entity.OmsOrderItem; import org.apache.ibatis.annotations.Mapper; /** diff --git a/mall-oms/oms-boot/src/main/java/com/youlai/mall/oms/mapper/OrderLogMapper.java b/mall-oms/oms-boot/src/main/java/com/youlai/mall/oms/mapper/OrderLogMapper.java index c3c273bf0..3f9323502 100644 --- a/mall-oms/oms-boot/src/main/java/com/youlai/mall/oms/mapper/OrderLogMapper.java +++ b/mall-oms/oms-boot/src/main/java/com/youlai/mall/oms/mapper/OrderLogMapper.java @@ -1,6 +1,6 @@ package com.youlai.mall.oms.mapper; -import com.youlai.mall.oms.pojo.entity.OmsOrderLog; +import com.youlai.mall.oms.model.entity.OmsOrderLog; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import org.apache.ibatis.annotations.Mapper; diff --git a/mall-oms/oms-boot/src/main/java/com/youlai/mall/oms/mapper/OrderMapper.java b/mall-oms/oms-boot/src/main/java/com/youlai/mall/oms/mapper/OrderMapper.java index 3ee4fa55f..e7c02049b 100644 --- a/mall-oms/oms-boot/src/main/java/com/youlai/mall/oms/mapper/OrderMapper.java +++ b/mall-oms/oms-boot/src/main/java/com/youlai/mall/oms/mapper/OrderMapper.java @@ -2,18 +2,18 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; -import com.youlai.mall.oms.pojo.entity.OmsOrder; -import com.youlai.mall.oms.pojo.query.OrderPageQuery; +import com.youlai.mall.oms.model.bo.OrderBO; +import com.youlai.mall.oms.model.entity.OmsOrder; +import com.youlai.mall.oms.model.query.OrderPageQuery; import org.apache.ibatis.annotations.*; import java.util.List; /** - * 订单详情表 + * 订单数据访问层 * * @author huawei - * @email huawei_code@163.com - * @date 2020-12-30 22:31:10 + * @since 2020-12-30 22:31:10 */ @Mapper public interface OrderMapper extends BaseMapper { @@ -25,5 +25,5 @@ public interface OrderMapper extends BaseMapper { * @param queryParams * @return */ - List listOrderPages(Page page, OrderPageQuery queryParams); + Page getOrderPage(Page page, OrderPageQuery queryParams); } diff --git a/mall-oms/oms-boot/src/main/java/com/youlai/mall/oms/mapper/OrderPayMapper.java b/mall-oms/oms-boot/src/main/java/com/youlai/mall/oms/mapper/OrderPayMapper.java index c5477b748..c82f5bbd3 100644 --- a/mall-oms/oms-boot/src/main/java/com/youlai/mall/oms/mapper/OrderPayMapper.java +++ b/mall-oms/oms-boot/src/main/java/com/youlai/mall/oms/mapper/OrderPayMapper.java @@ -1,6 +1,6 @@ package com.youlai.mall.oms.mapper; -import com.youlai.mall.oms.pojo.entity.OmsOrderPay; +import com.youlai.mall.oms.model.entity.OmsOrderPay; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import org.apache.ibatis.annotations.Mapper; diff --git a/mall-oms/oms-boot/src/main/java/com/youlai/mall/oms/mapper/OrderSettingMapper.java b/mall-oms/oms-boot/src/main/java/com/youlai/mall/oms/mapper/OrderSettingMapper.java index 4daf8e11a..9edb832c7 100644 --- a/mall-oms/oms-boot/src/main/java/com/youlai/mall/oms/mapper/OrderSettingMapper.java +++ b/mall-oms/oms-boot/src/main/java/com/youlai/mall/oms/mapper/OrderSettingMapper.java @@ -1,6 +1,6 @@ package com.youlai.mall.oms.mapper; -import com.youlai.mall.oms.pojo.entity.OmsOrderSetting; +import com.youlai.mall.oms.model.entity.OmsOrderSetting; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import org.apache.ibatis.annotations.Mapper; diff --git a/mall-oms/oms-boot/src/main/java/com/youlai/mall/oms/model/bo/OrderBO.java b/mall-oms/oms-boot/src/main/java/com/youlai/mall/oms/model/bo/OrderBO.java new file mode 100644 index 000000000..dd0d83d0b --- /dev/null +++ b/mall-oms/oms-boot/src/main/java/com/youlai/mall/oms/model/bo/OrderBO.java @@ -0,0 +1,124 @@ +package com.youlai.mall.oms.model.bo; + +import com.youlai.common.base.BaseEntity; +import com.youlai.mall.oms.enums.OrderSourceEnum; +import com.youlai.mall.oms.enums.OrderStatusEnum; +import com.youlai.mall.oms.enums.PaymentMethodEnum; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.time.LocalDateTime; +import java.util.Date; +import java.util.List; + +/** + * 订单业务对象 + * + * @author huawei + * @since 2.0.0 + */ +@EqualsAndHashCode(callSuper = true) +@Data +public class OrderBO extends BaseEntity { + + /** + * 订单ID + */ + private Long id; + /** + * 订单号 + */ + private String orderSn; + /** + * 订单总额(分) + */ + private Long totalAmount; + /** + * 商品总数 + */ + private Integer totalQuantity; + + /** + * 订单来源 {@link OrderSourceEnum} + */ + private Integer source; + + /** + * 订单状态 {@link OrderStatusEnum} + */ + private Integer status; + + /** + * 应付总额(分) + */ + private Long paymentAmount; + + /** + * 支付方式 {@link PaymentMethodEnum} + */ + private Integer paymentMethod; + + /** + * 订单创建时间 + */ + private LocalDateTime createTime; + + /** + * 订单备注 + */ + private String remark; + + /** + * 订单商品明细列表 + */ + private List orderItems; + + @Data + public static class OrderItem{ + + private Long id; + + /** + * 订单ID + */ + private Long orderId; + + /** + * 规格ID + */ + private Long skuId; + + /** + * SKU编号 + */ + private String skuSn; + + /** + * 商品名称 + */ + private String skuName; + + /** + * 商品sku图片 + */ + private String picUrl; + + /** + * 商品单价(单位:分) + */ + private Long price; + + /** + * 商品数量 + */ + private Integer quantity; + + /** + * 商品总金额(单位:分)(单价*数量) + */ + private Long totalAmount; + + + } + +} diff --git a/mall-oms/oms-boot/src/main/java/com/youlai/mall/oms/pojo/dto/CartItemDTO.java b/mall-oms/oms-boot/src/main/java/com/youlai/mall/oms/model/dto/CartItemDTO.java similarity index 95% rename from mall-oms/oms-boot/src/main/java/com/youlai/mall/oms/pojo/dto/CartItemDTO.java rename to mall-oms/oms-boot/src/main/java/com/youlai/mall/oms/model/dto/CartItemDTO.java index c31468a01..675a3c341 100644 --- a/mall-oms/oms-boot/src/main/java/com/youlai/mall/oms/pojo/dto/CartItemDTO.java +++ b/mall-oms/oms-boot/src/main/java/com/youlai/mall/oms/model/dto/CartItemDTO.java @@ -1,4 +1,4 @@ -package com.youlai.mall.oms.pojo.dto; +package com.youlai.mall.oms.model.dto; import lombok.*; diff --git a/mall-oms/oms-boot/src/main/java/com/youlai/mall/oms/model/dto/OrderDTO.java b/mall-oms/oms-boot/src/main/java/com/youlai/mall/oms/model/dto/OrderDTO.java new file mode 100644 index 000000000..896676a9b --- /dev/null +++ b/mall-oms/oms-boot/src/main/java/com/youlai/mall/oms/model/dto/OrderDTO.java @@ -0,0 +1,18 @@ +package com.youlai.mall.oms.model.dto; + +import com.youlai.mall.oms.model.entity.OmsOrder; +import com.youlai.mall.oms.model.entity.OmsOrderItem; +import lombok.Data; +import lombok.experimental.Accessors; + +import java.util.List; + +@Data +@Accessors(chain = true) +public class OrderDTO { + + private OmsOrder order; + + private List orderItems; + +} diff --git a/mall-oms/oms-boot/src/main/java/com/youlai/mall/oms/pojo/dto/OrderItemDTO.java b/mall-oms/oms-boot/src/main/java/com/youlai/mall/oms/model/dto/OrderItemDTO.java similarity index 86% rename from mall-oms/oms-boot/src/main/java/com/youlai/mall/oms/pojo/dto/OrderItemDTO.java rename to mall-oms/oms-boot/src/main/java/com/youlai/mall/oms/model/dto/OrderItemDTO.java index 274eb3575..f99d4302c 100644 --- a/mall-oms/oms-boot/src/main/java/com/youlai/mall/oms/pojo/dto/OrderItemDTO.java +++ b/mall-oms/oms-boot/src/main/java/com/youlai/mall/oms/model/dto/OrderItemDTO.java @@ -1,4 +1,4 @@ -package com.youlai.mall.oms.pojo.dto; +package com.youlai.mall.oms.model.dto; import lombok.*; @@ -6,7 +6,7 @@ * 订单商品 * * @author haoxr - * @date 2022/12/21 + * @since 2.0.0 */ @Data public class OrderItemDTO { @@ -44,5 +44,5 @@ public class OrderItemDTO { /** * 订单商品数量 */ - private Integer count; + private Integer quantity; } diff --git a/mall-oms/oms-boot/src/main/java/com/youlai/mall/oms/pojo/entity/OmsOrder.java b/mall-oms/oms-boot/src/main/java/com/youlai/mall/oms/model/entity/OmsOrder.java similarity index 83% rename from mall-oms/oms-boot/src/main/java/com/youlai/mall/oms/pojo/entity/OmsOrder.java rename to mall-oms/oms-boot/src/main/java/com/youlai/mall/oms/model/entity/OmsOrder.java index ef759cce9..af09e901e 100644 --- a/mall-oms/oms-boot/src/main/java/com/youlai/mall/oms/pojo/entity/OmsOrder.java +++ b/mall-oms/oms-boot/src/main/java/com/youlai/mall/oms/model/entity/OmsOrder.java @@ -1,4 +1,4 @@ -package com.youlai.mall.oms.pojo.entity; +package com.youlai.mall.oms.model.entity; import com.baomidou.mybatisplus.annotation.FieldStrategy; import com.baomidou.mybatisplus.annotation.IdType; @@ -6,7 +6,7 @@ import com.baomidou.mybatisplus.annotation.TableId; import com.youlai.common.base.BaseEntity; import lombok.Data; -import lombok.experimental.Accessors; +import lombok.EqualsAndHashCode; import java.util.Date; import java.util.List; @@ -15,16 +15,13 @@ * 订单详情表 * * @author huawei - * @email huawei_code@163.com - * @date 2020-12-30 22:31:10 + * @since 2.0.0 */ +@EqualsAndHashCode(callSuper = true) @Data -@Accessors(chain = true) public class OmsOrder extends BaseEntity { - /** - * id - */ + @TableId(type = IdType.AUTO) private Long id; /** @@ -42,7 +39,7 @@ public class OmsOrder extends BaseEntity { /** * 订单来源(0-PC订单;1-app订单) */ - private Integer sourceType; + private Integer source; /** * 订单状态(1-待付款;2-待发货;3-已发货;4-已完成;5-已关闭;6-已取消;) @@ -71,15 +68,15 @@ public class OmsOrder extends BaseEntity { /** * 应付总额(分) */ - private Long payAmount; + private Long paymentAmount; /** * 支付时间 */ - private Date payTime; + private Date paymentTime; /** - * 支付方式【1->微信jsapi;2->支付宝;3->余额; 4->微信app;】 + * 支付方式【1->微信jsapi;2->支付宝;3->余额;4->微信app;】 */ - private Integer payType; + private Integer paymentMethod; /** * 商户订单号 */ diff --git a/mall-oms/oms-boot/src/main/java/com/youlai/mall/oms/pojo/entity/OmsOrderDelivery.java b/mall-oms/oms-boot/src/main/java/com/youlai/mall/oms/model/entity/OmsOrderDelivery.java similarity index 97% rename from mall-oms/oms-boot/src/main/java/com/youlai/mall/oms/pojo/entity/OmsOrderDelivery.java rename to mall-oms/oms-boot/src/main/java/com/youlai/mall/oms/model/entity/OmsOrderDelivery.java index 6a33b62ba..398f30c10 100644 --- a/mall-oms/oms-boot/src/main/java/com/youlai/mall/oms/pojo/entity/OmsOrderDelivery.java +++ b/mall-oms/oms-boot/src/main/java/com/youlai/mall/oms/model/entity/OmsOrderDelivery.java @@ -1,4 +1,4 @@ -package com.youlai.mall.oms.pojo.entity; +package com.youlai.mall.oms.model.entity; import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableId; diff --git a/mall-oms/oms-boot/src/main/java/com/youlai/mall/oms/pojo/entity/OmsOrderItem.java b/mall-oms/oms-boot/src/main/java/com/youlai/mall/oms/model/entity/OmsOrderItem.java similarity index 80% rename from mall-oms/oms-boot/src/main/java/com/youlai/mall/oms/pojo/entity/OmsOrderItem.java rename to mall-oms/oms-boot/src/main/java/com/youlai/mall/oms/model/entity/OmsOrderItem.java index dee4fce57..2a4d17aec 100644 --- a/mall-oms/oms-boot/src/main/java/com/youlai/mall/oms/pojo/entity/OmsOrderItem.java +++ b/mall-oms/oms-boot/src/main/java/com/youlai/mall/oms/model/entity/OmsOrderItem.java @@ -1,20 +1,19 @@ -package com.youlai.mall.oms.pojo.entity; +package com.youlai.mall.oms.model.entity; import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableId; import com.youlai.common.base.BaseEntity; import lombok.Data; -import lombok.experimental.Accessors; +import lombok.EqualsAndHashCode; /** - * 订单明细表 + * 订单商品明细 * * @author huawei - * @email huawei_code@163.com - * @date 2020-12-30 22:31:10 + * @since 2020-12-30 */ +@EqualsAndHashCode(callSuper = true) @Data -@Accessors(chain = true) public class OmsOrderItem extends BaseEntity { @TableId(type = IdType.AUTO) @@ -36,7 +35,7 @@ public class OmsOrderItem extends BaseEntity { private Long skuId; /** - * SKU编号 + * SKU 编号 */ private String skuSn; @@ -58,7 +57,7 @@ public class OmsOrderItem extends BaseEntity { /** * 商品数量 */ - private Integer count; + private Integer quantity; /** * 商品总金额(单位:分) diff --git a/mall-oms/oms-boot/src/main/java/com/youlai/mall/oms/pojo/entity/OmsOrderLog.java b/mall-oms/oms-boot/src/main/java/com/youlai/mall/oms/model/entity/OmsOrderLog.java similarity index 94% rename from mall-oms/oms-boot/src/main/java/com/youlai/mall/oms/pojo/entity/OmsOrderLog.java rename to mall-oms/oms-boot/src/main/java/com/youlai/mall/oms/model/entity/OmsOrderLog.java index 9797dccb2..2d2308c9d 100644 --- a/mall-oms/oms-boot/src/main/java/com/youlai/mall/oms/pojo/entity/OmsOrderLog.java +++ b/mall-oms/oms-boot/src/main/java/com/youlai/mall/oms/model/entity/OmsOrderLog.java @@ -1,4 +1,4 @@ -package com.youlai.mall.oms.pojo.entity; +package com.youlai.mall.oms.model.entity; import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableId; diff --git a/mall-oms/oms-boot/src/main/java/com/youlai/mall/oms/pojo/entity/OmsOrderPay.java b/mall-oms/oms-boot/src/main/java/com/youlai/mall/oms/model/entity/OmsOrderPay.java similarity index 96% rename from mall-oms/oms-boot/src/main/java/com/youlai/mall/oms/pojo/entity/OmsOrderPay.java rename to mall-oms/oms-boot/src/main/java/com/youlai/mall/oms/model/entity/OmsOrderPay.java index 4a0998170..2353ae379 100644 --- a/mall-oms/oms-boot/src/main/java/com/youlai/mall/oms/pojo/entity/OmsOrderPay.java +++ b/mall-oms/oms-boot/src/main/java/com/youlai/mall/oms/model/entity/OmsOrderPay.java @@ -1,4 +1,4 @@ -package com.youlai.mall.oms.pojo.entity; +package com.youlai.mall.oms.model.entity; import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableId; diff --git a/mall-oms/oms-boot/src/main/java/com/youlai/mall/oms/pojo/entity/OmsOrderSetting.java b/mall-oms/oms-boot/src/main/java/com/youlai/mall/oms/model/entity/OmsOrderSetting.java similarity index 96% rename from mall-oms/oms-boot/src/main/java/com/youlai/mall/oms/pojo/entity/OmsOrderSetting.java rename to mall-oms/oms-boot/src/main/java/com/youlai/mall/oms/model/entity/OmsOrderSetting.java index 1ad1571cc..a27ffcffb 100644 --- a/mall-oms/oms-boot/src/main/java/com/youlai/mall/oms/pojo/entity/OmsOrderSetting.java +++ b/mall-oms/oms-boot/src/main/java/com/youlai/mall/oms/model/entity/OmsOrderSetting.java @@ -1,4 +1,4 @@ -package com.youlai.mall.oms.pojo.entity; +package com.youlai.mall.oms.model.entity; import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableId; diff --git a/mall-oms/oms-boot/src/main/java/com/youlai/mall/oms/model/form/OrderPaymentForm.java b/mall-oms/oms-boot/src/main/java/com/youlai/mall/oms/model/form/OrderPaymentForm.java new file mode 100644 index 000000000..d2b8c6541 --- /dev/null +++ b/mall-oms/oms-boot/src/main/java/com/youlai/mall/oms/model/form/OrderPaymentForm.java @@ -0,0 +1,36 @@ +package com.youlai.mall.oms.model.form; + +import com.youlai.mall.oms.enums.PaymentMethodEnum; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.ToString; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestParam; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotEmpty; +import javax.validation.constraints.NotNull; +import javax.validation.constraints.Size; +import java.util.List; + +/** + * 订单支付表单对象 + * + * @author haoxr + * @since 2.3.0 + */ +@Data +@ApiModel("订单支付表单对象") +public class OrderPaymentForm { + + @ApiModelProperty("订单编号") + private String orderSn; + + @ApiModelProperty("小程序 AppId") + String appId; + + @ApiModelProperty("支付方式") + private PaymentMethodEnum paymentMethod; + +} diff --git a/mall-oms/oms-boot/src/main/java/com/youlai/mall/oms/model/form/OrderSubmitForm.java b/mall-oms/oms-boot/src/main/java/com/youlai/mall/oms/model/form/OrderSubmitForm.java new file mode 100644 index 000000000..d9b05ce8f --- /dev/null +++ b/mall-oms/oms-boot/src/main/java/com/youlai/mall/oms/model/form/OrderSubmitForm.java @@ -0,0 +1,99 @@ +package com.youlai.mall.oms.model.form; + +import com.youlai.mall.oms.enums.OrderSourceEnum; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.ToString; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotEmpty; +import javax.validation.constraints.NotNull; +import javax.validation.constraints.Size; +import java.util.List; + +/** + * 订单提交表单对象 + * + * @author haoxr + * @since 2.0.0 + */ +@Data +@ToString +public class OrderSubmitForm { + + @ApiModelProperty("订单确认页面签发的令牌(防止重复提交)") + @NotBlank(message = "订单令牌不能为空") + private String orderToken; + + @ApiModelProperty("订单来源") + @NotNull(message = "订单来源不能为空") + private OrderSourceEnum orderSource; + + @ApiModelProperty("订单商品明细") + @NotEmpty(message = "订单商品不能为空") + private List orderItems; + + @ApiModelProperty("应付金额(单位:分)") + @NotNull(message = "应付金额不能为空") + private Long paymentAmount; + + @ApiModelProperty("收获地址") + @NotNull(message = "收货地址不能为空") + private ShippingAddress shippingAddress; + + @ApiModelProperty("订单备注") + @Size(max = 500, message = "订单备注长度不能超过500") + private String remark; + + @ApiModel("收获地址") + @Data + public static class ShippingAddress { + + @ApiModelProperty("收货人姓名") + private String consigneeName; + + @ApiModelProperty("收货人手机号") + private String consigneeMobile; + + @ApiModelProperty("省份") + private String province; + + @ApiModelProperty("城市") + private String city; + + @ApiModelProperty("区域") + private String district; + + @ApiModelProperty("详细地址") + private String detailAddress; + } + + @ApiModel("订单商品") + @Data + public static class OrderItem { + + @ApiModelProperty(value = "SKU ID") + private Long skuId; + + @ApiModelProperty(value = "SKU 编号") + private String skuSn; + + @ApiModelProperty(value = "SKU 名称") + private String skuName; + + @ApiModelProperty(value = "商品图片URL") + private String picUrl; + + @ApiModelProperty(value = "商品价格(单位:分)") + private Long price; + + @ApiModelProperty(value = "商品名称") + private String spuName; + + @ApiModelProperty(value = "商品数量") + private Integer quantity; + } + + +} diff --git a/mall-oms/oms-boot/src/main/java/com/youlai/mall/oms/model/query/OrderPageQuery.java b/mall-oms/oms-boot/src/main/java/com/youlai/mall/oms/model/query/OrderPageQuery.java new file mode 100644 index 000000000..aa3366307 --- /dev/null +++ b/mall-oms/oms-boot/src/main/java/com/youlai/mall/oms/model/query/OrderPageQuery.java @@ -0,0 +1,49 @@ +package com.youlai.mall.oms.model.query; + +import com.youlai.common.base.BasePageQuery; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.springframework.format.annotation.DateTimeFormat; + +import java.util.Date; + +/** + * 订单分页查询对象 + * + * @author haoxr + * @since 2.3.0 + */ +@EqualsAndHashCode(callSuper = true) +@ApiModel("订单分页查询对象") +@Data +public class OrderPageQuery extends BasePageQuery { + + /** + * 关键字(订单编号/商品名称/会员姓名/会员手机号) + */ + @ApiModelProperty("关键字(订单编号/商品名称/会员姓名/会员手机号)") + private String keywords; + + /** + * 订单状态 + */ + @ApiModelProperty("订单状态") + private Integer status; + + /** + * 开始时间 + */ + @ApiModelProperty(value = "开始时间(yyyy-MM-dd)",example = "2023-10-01") + @DateTimeFormat(pattern = "yyyy-MM-dd 00:00:00") // DateTimeFormat 用于将查询参数或表单参数转换为日期类型 + private Date beginDate; + + /** + * 截止时间 + */ + @ApiModelProperty(value = "截止时间(yyyy-MM-dd)",example = "2025-10-01") + @DateTimeFormat(pattern = "yyyy-MM-dd 23:59:59") + private Date endDate; + +} diff --git a/mall-oms/oms-boot/src/main/java/com/youlai/mall/oms/model/vo/OmsOrderPageVO.java b/mall-oms/oms-boot/src/main/java/com/youlai/mall/oms/model/vo/OmsOrderPageVO.java new file mode 100644 index 000000000..1f8613ca1 --- /dev/null +++ b/mall-oms/oms-boot/src/main/java/com/youlai/mall/oms/model/vo/OmsOrderPageVO.java @@ -0,0 +1,83 @@ +package com.youlai.mall.oms.model.vo; + +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.math.BigDecimal; +import java.util.Date; +import java.util.List; + +/** + * Admin-订单分页视图对象 + * + * @author haoxr + * @since 2.3.0 + */ +@ApiModel("Admin-订单分页视图对象") +@Data +public class OmsOrderPageVO { + + @ApiModelProperty("订单ID") + private Long id; + + @ApiModelProperty("订单编号") + private String orderSn; + + @ApiModelProperty("订单总金额(分)") + private BigDecimal totalAmount; + + @ApiModelProperty("订单总金额(分)") + private Long paymentAmount; + + @ApiModelProperty("支付方式标签") + private String paymentMethodLabel; + + @ApiModelProperty("订单状态") + private Integer status; + + @ApiModelProperty("订单状态标签") + private String statusLabel; + + @ApiModelProperty("商品总数") + private Integer totalQuantity; + + @ApiModelProperty("订单创建时间") + @JsonFormat(pattern = "yyyy/MM/dd HH:mm:ss") + private Date createTime; + + @ApiModelProperty("订单来源标签") + private String sourceLabel; + + @ApiModelProperty("订单备注") + private String remark; + + @ApiModelProperty("订单商品集合") + private List orderItems; + + @ApiModel("订单商品明细") + @Data + public static class OrderItem { + + @ApiModelProperty("商品ID") + private Long skuId; + + @ApiModelProperty("商品规格名称") + private String skuName; + + @ApiModelProperty("图片地址") + private String picUrl; + + @ApiModelProperty("商品价格") + private Long price; + + @ApiModelProperty("商品数量") + private Integer quantity; + + @ApiModelProperty("商品总金额(单位:分)") + private Long totalAmount; + + } + +} diff --git a/mall-oms/oms-boot/src/main/java/com/youlai/mall/oms/pojo/vo/OrderConfirmVO.java b/mall-oms/oms-boot/src/main/java/com/youlai/mall/oms/model/vo/OrderConfirmVO.java similarity index 50% rename from mall-oms/oms-boot/src/main/java/com/youlai/mall/oms/pojo/vo/OrderConfirmVO.java rename to mall-oms/oms-boot/src/main/java/com/youlai/mall/oms/model/vo/OrderConfirmVO.java index cbca5eec3..fa7a5c002 100644 --- a/mall-oms/oms-boot/src/main/java/com/youlai/mall/oms/pojo/vo/OrderConfirmVO.java +++ b/mall-oms/oms-boot/src/main/java/com/youlai/mall/oms/model/vo/OrderConfirmVO.java @@ -1,7 +1,6 @@ -package com.youlai.mall.oms.pojo.vo; +package com.youlai.mall.oms.model.vo; -import com.youlai.common.base.BaseVO; -import com.youlai.mall.oms.pojo.dto.OrderItemDTO; +import com.youlai.mall.oms.model.dto.OrderItemDTO; import com.youlai.mall.ums.dto.MemberAddressDTO; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; @@ -9,17 +8,28 @@ import java.util.List; - -@ApiModel("订单确认视图层对象") +/** + * 订单确认响应对象 + */ +@ApiModel("订单确认响应对象") @Data public class OrderConfirmVO { - @ApiModelProperty("订单token") + /** + * 订单防重提交令牌 + */ + @ApiModelProperty("订单防重提交令牌") private String orderToken; - @ApiModelProperty("订单明细") + /** + * 订单商品 + */ + @ApiModelProperty("订单商品") private List orderItems; + /** + * 会员收货地址列表 + */ @ApiModelProperty("会员收获地址列表") private List addresses; diff --git a/mall-oms/oms-boot/src/main/java/com/youlai/mall/oms/model/vo/OrderPageVO.java b/mall-oms/oms-boot/src/main/java/com/youlai/mall/oms/model/vo/OrderPageVO.java new file mode 100644 index 000000000..36c71a222 --- /dev/null +++ b/mall-oms/oms-boot/src/main/java/com/youlai/mall/oms/model/vo/OrderPageVO.java @@ -0,0 +1,83 @@ +package com.youlai.mall.oms.model.vo; + +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.math.BigDecimal; +import java.util.Date; +import java.util.List; + +/** + * App-订单分页视图对象 + * + * @author haoxr + * @since 2.3.0 + */ +@ApiModel("App-订单分页视图对象") +@Data +public class OrderPageVO { + + @ApiModelProperty("订单ID") + private Long id; + + @ApiModelProperty("订单编号") + private String orderSn; + + @ApiModelProperty("订单总金额(分)") + private BigDecimal totalAmount; + + @ApiModelProperty("订单总金额(分)") + private Long paymentAmount; + + @ApiModelProperty("支付方式标签") + private String paymentMethodLabel; + + @ApiModelProperty("订单状态") + private Integer status; + + @ApiModelProperty("订单状态标签") + private String statusLabel; + + @ApiModelProperty("商品总数") + private Integer totalQuantity; + + @ApiModelProperty("订单创建时间") + @JsonFormat(pattern = "yyyy/MM/dd HH:mm:ss") + private Date createTime; + + @ApiModelProperty("订单来源标签") + private String sourceLabel; + + @ApiModelProperty("订单备注") + private String remark; + + @ApiModelProperty("订单商品集合") + private List orderItems; + + @ApiModel("订单商品明细") + @Data + public static class OrderItem { + + @ApiModelProperty("商品ID") + private Long skuId; + + @ApiModelProperty("商品规格名称") + private String skuName; + + @ApiModelProperty("图片地址") + private String picUrl; + + @ApiModelProperty("商品价格") + private Long price; + + @ApiModelProperty("商品数量") + private Integer quantity; + + @ApiModelProperty("商品总金额(单位:分)") + private Long totalAmount; + + } + +} diff --git a/mall-oms/oms-boot/src/main/java/com/youlai/mall/oms/pojo/vo/WxPayResponseVO.java b/mall-oms/oms-boot/src/main/java/com/youlai/mall/oms/model/vo/WxPayResponseVO.java similarity index 79% rename from mall-oms/oms-boot/src/main/java/com/youlai/mall/oms/pojo/vo/WxPayResponseVO.java rename to mall-oms/oms-boot/src/main/java/com/youlai/mall/oms/model/vo/WxPayResponseVO.java index 5714fbd29..8de70ac34 100644 --- a/mall-oms/oms-boot/src/main/java/com/youlai/mall/oms/pojo/vo/WxPayResponseVO.java +++ b/mall-oms/oms-boot/src/main/java/com/youlai/mall/oms/model/vo/WxPayResponseVO.java @@ -1,6 +1,5 @@ -package com.youlai.mall.oms.pojo.vo; +package com.youlai.mall.oms.model.vo; -import lombok.Builder; import lombok.Data; import lombok.experimental.Accessors; diff --git a/mall-oms/oms-boot/src/main/java/com/youlai/mall/oms/pojo/dto/OrderDTO.java b/mall-oms/oms-boot/src/main/java/com/youlai/mall/oms/pojo/dto/OrderDTO.java deleted file mode 100644 index 0a47a8d4c..000000000 --- a/mall-oms/oms-boot/src/main/java/com/youlai/mall/oms/pojo/dto/OrderDTO.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.youlai.mall.oms.pojo.dto; - -import com.youlai.mall.oms.pojo.entity.OmsOrder; -import com.youlai.mall.oms.pojo.entity.OmsOrderItem; -import com.youlai.mall.ums.dto.MemberDTO; -import lombok.Data; -import lombok.experimental.Accessors; - -import java.util.List; - -/** - * @author huawei - * @desc - * @email huawei_code@163.com - * @date 2021/1/19 - */ -@Data -@Accessors(chain = true) -public class OrderDTO { - - private OmsOrder order; - - private List orderItems; - - private MemberDTO member; - -} diff --git a/mall-oms/oms-boot/src/main/java/com/youlai/mall/oms/pojo/form/OrderSubmitForm.java b/mall-oms/oms-boot/src/main/java/com/youlai/mall/oms/pojo/form/OrderSubmitForm.java deleted file mode 100644 index 0fcb4d468..000000000 --- a/mall-oms/oms-boot/src/main/java/com/youlai/mall/oms/pojo/form/OrderSubmitForm.java +++ /dev/null @@ -1,55 +0,0 @@ -package com.youlai.mall.oms.pojo.form; - -import com.youlai.mall.oms.common.enums.OrderSourceTypeEnum; -import com.youlai.mall.oms.pojo.dto.OrderItemDTO; -import com.youlai.mall.ums.dto.MemberAddressDTO; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; -import lombok.ToString; - -import javax.validation.constraints.Size; -import java.util.List; - -/** - * 订单提交表单对象 - * - * @author huawei - * @email huawei_code@163.com - * @date 2021/1/16 - */ -@Data -@ToString -public class OrderSubmitForm { - - - /** - * 订单来源 - * - * @see OrderSourceTypeEnum - */ - @ApiModelProperty("订单来源") - private Integer sourceType; - - @ApiModelProperty("提交订单确认页面签发的令牌(防止订单重复提交,订单提交成功转为订单编号)") - private String orderToken; - - @ApiModelProperty("订单总金额-用于验价(单位:分)") - private Long totalAmount; - - @ApiModelProperty("支付金额(单位:分)") - private Long payAmount; - - @ApiModelProperty("订单的商品明细") - private List orderItems; - - @ApiModelProperty("订单备注") - @Size(max = 500, message = "订单备注长度不能超过500") - private String remark; - - @ApiModelProperty("优惠券ID") - private String couponId; - - @ApiModelProperty("收获地址") - private MemberAddressDTO deliveryAddress; - -} diff --git a/mall-oms/oms-boot/src/main/java/com/youlai/mall/oms/pojo/query/OrderPageQuery.java b/mall-oms/oms-boot/src/main/java/com/youlai/mall/oms/pojo/query/OrderPageQuery.java deleted file mode 100644 index a433244b4..000000000 --- a/mall-oms/oms-boot/src/main/java/com/youlai/mall/oms/pojo/query/OrderPageQuery.java +++ /dev/null @@ -1,32 +0,0 @@ -package com.youlai.mall.oms.pojo.query; - -import com.youlai.common.base.BasePageQuery; -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; - - -/** - * @author haoxr - * @date 2022/2/1 19:14 - */ -@Data -@ApiModel("订单分页查询对象") -public class OrderPageQuery extends BasePageQuery { - - @ApiModelProperty("订单状态") - private Integer status; - - @ApiModelProperty("会员ID") - private Long memberId; - - @ApiModelProperty("订单编号") - private String orderSn; - - @ApiModelProperty(value = "开始时间(格式:yyyy-MM-dd)") - private String beginDate; - - @ApiModelProperty(value = "截止时间(格式:yyyy-MM-dd)") - private String endDate; - -} diff --git a/mall-oms/oms-boot/src/main/java/com/youlai/mall/oms/pojo/vo/OrderPageVO.java b/mall-oms/oms-boot/src/main/java/com/youlai/mall/oms/pojo/vo/OrderPageVO.java deleted file mode 100644 index 6b6dd810a..000000000 --- a/mall-oms/oms-boot/src/main/java/com/youlai/mall/oms/pojo/vo/OrderPageVO.java +++ /dev/null @@ -1,62 +0,0 @@ -package com.youlai.mall.oms.pojo.vo; - -import lombok.Data; - -import java.util.Date; -import java.util.List; - -/** - * 订单分页视图对象 - * - * @author haoxr - * @date 2022/2/1 20:58 - */ -@Data -public class OrderPageVO { - - private Long id; - - private String orderSn; - - private Long totalAmount; - - private Long payAmount; - - private Integer payType; - - private Integer status; - - private Integer totalQuantity; - - private Date createTime; - - private Long memberId; - - private Integer sourceType; - - private List orderItems; - - @Data - public static class OrderItem { - - private Long id; - - private Long orderId; - - private Long skuId; - - private String skuName; - - private String picUrl; - - private Long price; - - private Integer count; - - private Long totalAmount; - - private String spuName; - - } - -} diff --git a/mall-oms/oms-boot/src/main/java/com/youlai/mall/oms/pojo/vo/OrderSubmitResultVO.java b/mall-oms/oms-boot/src/main/java/com/youlai/mall/oms/pojo/vo/OrderSubmitResultVO.java deleted file mode 100644 index 7bfb2013f..000000000 --- a/mall-oms/oms-boot/src/main/java/com/youlai/mall/oms/pojo/vo/OrderSubmitResultVO.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.youlai.mall.oms.pojo.vo; - -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.AllArgsConstructor; -import lombok.Data; -import lombok.NoArgsConstructor; - -/** - * 订单提交结果 - * - * @author huawei - * @date 2021/1/21 - */ -@ApiModel("订单提交结果") -@Data -@AllArgsConstructor -@NoArgsConstructor -public class OrderSubmitResultVO { - - @ApiModelProperty("订单ID") - private Long orderId; - - @ApiModelProperty("订单编号,进入支付页面显示") - private String orderSn; - -} diff --git a/mall-oms/oms-boot/src/main/java/com/youlai/mall/oms/service/admin/OmsOrderService.java b/mall-oms/oms-boot/src/main/java/com/youlai/mall/oms/service/admin/OmsOrderService.java index a63eba794..f13e77c73 100644 --- a/mall-oms/oms-boot/src/main/java/com/youlai/mall/oms/service/admin/OmsOrderService.java +++ b/mall-oms/oms-boot/src/main/java/com/youlai/mall/oms/service/admin/OmsOrderService.java @@ -3,34 +3,25 @@ import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.service.IService; import com.youlai.mall.oms.dto.SeataOrderDTO; -import com.youlai.mall.oms.pojo.entity.OmsOrder; -import com.youlai.mall.oms.pojo.query.OrderPageQuery; +import com.youlai.mall.oms.model.entity.OmsOrder; +import com.youlai.mall.oms.model.query.OrderPageQuery; +import com.youlai.mall.oms.model.vo.OmsOrderPageVO; /** - * 「管理端」订单业务接口 + * Admin-订单业务接口 * * @author haoxr - * @date 2020/12/30 + * @since 2.3.0 */ public interface OmsOrderService extends IService { /** * 订单分页列表 * - * @param queryParams + * @param queryParams {@link OrderPageQuery} * @return */ - IPage listOrderPages(OrderPageQuery queryParams); + IPage getOrderPage(OrderPageQuery queryParams); - /** - * 「实验室」订单支付 - *

- * 非商城业务 - * - * @param orderDTO - * @return - */ - Boolean payOrder(Long orderId, SeataOrderDTO orderDTO); - } diff --git a/mall-oms/oms-boot/src/main/java/com/youlai/mall/oms/service/admin/impl/OmsOrderServiceImpl.java b/mall-oms/oms-boot/src/main/java/com/youlai/mall/oms/service/admin/impl/OmsOrderServiceImpl.java index d6c2e1277..7e365dd1b 100644 --- a/mall-oms/oms-boot/src/main/java/com/youlai/mall/oms/service/admin/impl/OmsOrderServiceImpl.java +++ b/mall-oms/oms-boot/src/main/java/com/youlai/mall/oms/service/admin/impl/OmsOrderServiceImpl.java @@ -1,83 +1,44 @@ package com.youlai.mall.oms.service.admin.impl; -import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import com.youlai.common.redis.BusinessSnGenerator; -import com.youlai.mall.oms.common.enums.OrderStatusEnum; -import com.youlai.mall.oms.dto.SeataOrderDTO; +import com.youlai.mall.oms.converter.OrderConverter; import com.youlai.mall.oms.mapper.OrderMapper; -import com.youlai.mall.oms.pojo.entity.OmsOrder; -import com.youlai.mall.oms.pojo.query.OrderPageQuery; +import com.youlai.mall.oms.model.bo.OrderBO; +import com.youlai.mall.oms.model.entity.OmsOrder; +import com.youlai.mall.oms.model.query.OrderPageQuery; +import com.youlai.mall.oms.model.vo.OmsOrderPageVO; import com.youlai.mall.oms.service.admin.OmsOrderService; -import com.youlai.mall.ums.api.MemberFeignClient; import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; -import java.util.List; - /** - * 「管理端」订单业务实现类 + * Admin-订单业务实现类 * * @author haoxr - * @date 2022/2/12 + * @since 2.3.0 */ @Service @RequiredArgsConstructor -@Slf4j public class OmsOrderServiceImpl extends ServiceImpl implements OmsOrderService { - private final MemberFeignClient memberFeignClient; - private final BusinessSnGenerator businessSnGenerator; - - /** - * 订单分页列表 - * - * @param queryParams - * @return - */ - @Override - public IPage listOrderPages(OrderPageQuery queryParams) { - Page page = new Page<>(queryParams.getPageNum(), queryParams.getPageSize()); - List list = this.baseMapper.listOrderPages(page, queryParams); - page.setRecords(list); - return page; - } + private final OrderConverter orderConverter; /** - * 「实验室」订单支付 + * Admin-订单分页列表 * - * @param orderDTO - * @return + * @param queryParams {@link OrderPageQuery} + * @return {@link OmsOrderPageVO} */ @Override - public Boolean payOrder(Long orderId, SeataOrderDTO orderDTO) { - - Long memberId = orderDTO.getMemberId(); - Long amount = orderDTO.getAmount(); - - // 扣减账户余额 - memberFeignClient.deductBalance(memberId, amount); - - // 是否开启异常 - Boolean openEx = orderDTO.getOpenEx(); - if (openEx) { - int i = 1 / 0; - } - - // 修改订单【已支付】 - String orderSn = businessSnGenerator.generateSerialNo("ORDER"); - - boolean result = this.update(new LambdaUpdateWrapper() - .eq(OmsOrder::getId, orderId) - .set(OmsOrder::getOrderSn, orderSn) - .set(OmsOrder::getStatus, OrderStatusEnum.PAID.getValue()) - ); + public IPage getOrderPage(OrderPageQuery queryParams) { + Page boPage = this.baseMapper.getOrderPage( + new Page<>(queryParams.getPageNum(), queryParams.getPageSize()), + queryParams); - return result; + return orderConverter.toVoPage(boPage); } } diff --git a/mall-oms/oms-boot/src/main/java/com/youlai/mall/oms/service/CartService.java b/mall-oms/oms-boot/src/main/java/com/youlai/mall/oms/service/app/CartService.java similarity index 82% rename from mall-oms/oms-boot/src/main/java/com/youlai/mall/oms/service/CartService.java rename to mall-oms/oms-boot/src/main/java/com/youlai/mall/oms/service/app/CartService.java index 04ae15631..1f71e4740 100644 --- a/mall-oms/oms-boot/src/main/java/com/youlai/mall/oms/service/CartService.java +++ b/mall-oms/oms-boot/src/main/java/com/youlai/mall/oms/service/app/CartService.java @@ -1,6 +1,6 @@ -package com.youlai.mall.oms.service; +package com.youlai.mall.oms.service.app; -import com.youlai.mall.oms.pojo.dto.CartItemDTO; +import com.youlai.mall.oms.model.dto.CartItemDTO; import java.util.List; diff --git a/mall-oms/oms-boot/src/main/java/com/youlai/mall/oms/service/OrderDeliveryService.java b/mall-oms/oms-boot/src/main/java/com/youlai/mall/oms/service/app/OrderDeliveryService.java similarity index 71% rename from mall-oms/oms-boot/src/main/java/com/youlai/mall/oms/service/OrderDeliveryService.java rename to mall-oms/oms-boot/src/main/java/com/youlai/mall/oms/service/app/OrderDeliveryService.java index dab15f591..09815f53e 100644 --- a/mall-oms/oms-boot/src/main/java/com/youlai/mall/oms/service/OrderDeliveryService.java +++ b/mall-oms/oms-boot/src/main/java/com/youlai/mall/oms/service/app/OrderDeliveryService.java @@ -1,8 +1,8 @@ -package com.youlai.mall.oms.service; +package com.youlai.mall.oms.service.app; import com.baomidou.mybatisplus.extension.service.IService; -import com.youlai.mall.oms.pojo.entity.OmsOrderDelivery; +import com.youlai.mall.oms.model.entity.OmsOrderDelivery; /** * 订单物流记录表 diff --git a/mall-oms/oms-boot/src/main/java/com/youlai/mall/oms/service/OrderItemService.java b/mall-oms/oms-boot/src/main/java/com/youlai/mall/oms/service/app/OrderItemService.java similarity index 72% rename from mall-oms/oms-boot/src/main/java/com/youlai/mall/oms/service/OrderItemService.java rename to mall-oms/oms-boot/src/main/java/com/youlai/mall/oms/service/app/OrderItemService.java index e843a81b6..4ae0fe881 100644 --- a/mall-oms/oms-boot/src/main/java/com/youlai/mall/oms/service/OrderItemService.java +++ b/mall-oms/oms-boot/src/main/java/com/youlai/mall/oms/service/app/OrderItemService.java @@ -1,7 +1,7 @@ -package com.youlai.mall.oms.service; +package com.youlai.mall.oms.service.app; import com.baomidou.mybatisplus.extension.service.IService; -import com.youlai.mall.oms.pojo.entity.OmsOrderItem; +import com.youlai.mall.oms.model.entity.OmsOrderItem; /** diff --git a/mall-oms/oms-boot/src/main/java/com/youlai/mall/oms/service/OrderLogService.java b/mall-oms/oms-boot/src/main/java/com/youlai/mall/oms/service/app/OrderLogService.java similarity index 88% rename from mall-oms/oms-boot/src/main/java/com/youlai/mall/oms/service/OrderLogService.java rename to mall-oms/oms-boot/src/main/java/com/youlai/mall/oms/service/app/OrderLogService.java index 4beebba34..bd8d7e977 100644 --- a/mall-oms/oms-boot/src/main/java/com/youlai/mall/oms/service/OrderLogService.java +++ b/mall-oms/oms-boot/src/main/java/com/youlai/mall/oms/service/app/OrderLogService.java @@ -1,8 +1,8 @@ -package com.youlai.mall.oms.service; +package com.youlai.mall.oms.service.app; import com.baomidou.mybatisplus.extension.service.IService; -import com.youlai.mall.oms.pojo.entity.OmsOrderLog; +import com.youlai.mall.oms.model.entity.OmsOrderLog; /** * 订单操作历史记录 diff --git a/mall-oms/oms-boot/src/main/java/com/youlai/mall/oms/service/OrderService.java b/mall-oms/oms-boot/src/main/java/com/youlai/mall/oms/service/app/OrderService.java similarity index 65% rename from mall-oms/oms-boot/src/main/java/com/youlai/mall/oms/service/OrderService.java rename to mall-oms/oms-boot/src/main/java/com/youlai/mall/oms/service/app/OrderService.java index b089eb258..94b564543 100644 --- a/mall-oms/oms-boot/src/main/java/com/youlai/mall/oms/service/OrderService.java +++ b/mall-oms/oms-boot/src/main/java/com/youlai/mall/oms/service/app/OrderService.java @@ -1,22 +1,23 @@ -package com.youlai.mall.oms.service; +package com.youlai.mall.oms.service.app; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.service.IService; import com.github.binarywang.wxpay.bean.notify.SignatureHeader; import com.github.binarywang.wxpay.exception.WxPayException; -import com.youlai.mall.oms.pojo.entity.OmsOrder; -import com.youlai.mall.oms.pojo.query.OrderPageQuery; -import com.youlai.mall.oms.pojo.vo.OrderConfirmVO; -import com.youlai.mall.oms.pojo.vo.OrderSubmitResultVO; -import com.youlai.mall.oms.pojo.form.OrderSubmitForm; +import com.youlai.mall.oms.enums.PaymentMethodEnum; +import com.youlai.mall.oms.model.entity.OmsOrder; +import com.youlai.mall.oms.model.form.OrderPaymentForm; +import com.youlai.mall.oms.model.query.OrderPageQuery; +import com.youlai.mall.oms.model.vo.OrderConfirmVO; +import com.youlai.mall.oms.model.form.OrderSubmitForm; +import com.youlai.mall.oms.model.vo.OrderPageVO; /** * 订单业务接口 * * @author huawei - * @email huawei_code@163.com - * @date 2020-12-30 22:31:10 + * @since 2020-12-30 22:31:10 */ public interface OrderService extends IService { @@ -27,19 +28,22 @@ public interface OrderService extends IService { * 进入订单创建页面有两个入口,1:立即购买;2:购物车结算 * * @param skuId 直接购买必填,购物车结算不填 - * @return + * @return {@link OrderConfirmVO} */ OrderConfirmVO confirmOrder(Long skuId); /** * 订单提交 + * + * @param orderSubmitForm {@link OrderSubmitForm} + * @return 订单编号 */ - OrderSubmitResultVO submitOrder(OrderSubmitForm orderSubmitForm); + String submitOrder(OrderSubmitForm orderSubmitForm); /** * 订单支付 */ - boolean payOrder(Long orderId); + T payOrder(OrderPaymentForm paymentForm); /** * 系统关闭订单 @@ -72,10 +76,10 @@ public interface OrderService extends IService { /** * 订单分页列表 * - * @param queryParams - * @return + * @param queryParams 订单分页查询参数 + * @return {@link OrderPageVO} */ - IPage listOrderPages(OrderPageQuery queryParams); + IPage getOrderPage(OrderPageQuery queryParams); } diff --git a/mall-oms/oms-boot/src/main/java/com/youlai/mall/oms/service/OrderSettingService.java b/mall-oms/oms-boot/src/main/java/com/youlai/mall/oms/service/app/OrderSettingService.java similarity index 71% rename from mall-oms/oms-boot/src/main/java/com/youlai/mall/oms/service/OrderSettingService.java rename to mall-oms/oms-boot/src/main/java/com/youlai/mall/oms/service/app/OrderSettingService.java index a943a2445..a8b6a2083 100644 --- a/mall-oms/oms-boot/src/main/java/com/youlai/mall/oms/service/OrderSettingService.java +++ b/mall-oms/oms-boot/src/main/java/com/youlai/mall/oms/service/app/OrderSettingService.java @@ -1,8 +1,8 @@ -package com.youlai.mall.oms.service; +package com.youlai.mall.oms.service.app; import com.baomidou.mybatisplus.extension.service.IService; -import com.youlai.mall.oms.pojo.entity.OmsOrderSetting; +import com.youlai.mall.oms.model.entity.OmsOrderSetting; /** * 订单配置信息 diff --git a/mall-oms/oms-boot/src/main/java/com/youlai/mall/oms/service/impl/CartServiceImpl.java b/mall-oms/oms-boot/src/main/java/com/youlai/mall/oms/service/app/impl/CartServiceImpl.java similarity index 74% rename from mall-oms/oms-boot/src/main/java/com/youlai/mall/oms/service/impl/CartServiceImpl.java rename to mall-oms/oms-boot/src/main/java/com/youlai/mall/oms/service/app/impl/CartServiceImpl.java index 771ce6a20..45c5914e0 100644 --- a/mall-oms/oms-boot/src/main/java/com/youlai/mall/oms/service/impl/CartServiceImpl.java +++ b/mall-oms/oms-boot/src/main/java/com/youlai/mall/oms/service/app/impl/CartServiceImpl.java @@ -1,16 +1,18 @@ -package com.youlai.mall.oms.service.impl; +package com.youlai.mall.oms.service.app.impl; import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.lang.Assert; import com.youlai.common.result.ResultCode; import com.youlai.common.security.util.SecurityUtils; import com.youlai.common.web.exception.BizException; -import com.youlai.mall.oms.common.constant.OmsConstants; -import com.youlai.mall.oms.pojo.dto.CartItemDTO; -import com.youlai.mall.oms.service.CartService; +import com.youlai.mall.oms.constant.OrderConstants; +import com.youlai.mall.oms.converter.CartConverter; +import com.youlai.mall.oms.model.dto.CartItemDTO; +import com.youlai.mall.oms.service.app.CartService; import com.youlai.mall.pms.api.SkuFeignClient; -import com.youlai.mall.pms.pojo.dto.SkuDTO; +import com.youlai.mall.pms.pojo.dto.SkuInfoDTO; import lombok.AllArgsConstructor; +import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.data.redis.core.BoundHashOperations; import org.springframework.data.redis.core.RedisTemplate; @@ -26,18 +28,19 @@ *

* 核心技术:BoundHashOperations * 数据格式: - * -- key <----> 购物车 - * -- hKey:value <----> 商品1 - * -- hKey:value <----> 商品2 - * -- hKey:value <----> 商品3 + * -- key <--> 商品列表 + * ---- hKey:value <--> skuId 商品1 + * ---- hKey:value <--> 商品2 + * ---- hKey:value <--> 商品3 */ @Service @Slf4j -@AllArgsConstructor +@RequiredArgsConstructor public class CartServiceImpl implements CartService { - private RedisTemplate redisTemplate; - private SkuFeignClient skuFeignService; + private final RedisTemplate redisTemplate; + private final SkuFeignClient skuFeignService; + private final CartConverter cartConverter; @Override public List listCartItems(Long memberId) { @@ -54,7 +57,7 @@ public List listCartItems(Long memberId) { */ @Override public boolean deleteCart() { - String key = OmsConstants.MEMBER_CART_PREFIX + SecurityUtils.getMemberId(); + String key = OrderConstants.MEMBER_CART_PREFIX + SecurityUtils.getMemberId(); redisTemplate.delete(key); return true; } @@ -65,35 +68,24 @@ public boolean deleteCart() { @Override public boolean addCartItem(Long skuId) { Long memberId = SecurityUtils.getMemberId(); - if (memberId == null) { - throw new BizException(ResultCode.INVALID_TOKEN); - } - BoundHashOperations cartHashOperations = getCartHashOperations(memberId); - String hKey = skuId + ""; + BoundHashOperations cartHashOperations = getCartHashOperations(memberId); + String hKey = String.valueOf(skuId); - CartItemDTO cartItem; - // 购物车已存在该商品,更新商品数量 - if (cartHashOperations.get(hKey) != null) { - cartItem = (CartItemDTO) cartHashOperations.get(hKey); + CartItemDTO cartItem = cartHashOperations.get(hKey); + + if (cartItem != null) { + // 购物车已存在该商品,更新商品数量 cartItem.setCount(cartItem.getCount() + 1); // 点击一次“加入购物车”,数量+1 cartItem.setChecked(true); - cartHashOperations.put(hKey, cartItem); - return true; - } - // 购物车不存在该商品,添加商品至购物车 - cartItem = new CartItemDTO(); - CompletableFuture cartItemCompletableFuture = CompletableFuture.runAsync(() -> { - SkuDTO skuInfo = skuFeignService.getSkuInfo(skuId).getData(); + } else { + // 购物车中不存在该商品,新增商品到购物车 + SkuInfoDTO skuInfo = skuFeignService.getSkuInfo(skuId); if (skuInfo != null) { - BeanUtil.copyProperties(skuInfo, cartItem); - cartItem.setStock(skuInfo.getStockNum()); + cartItem = cartConverter.sku2CartItem(skuInfo); cartItem.setCount(1); cartItem.setChecked(true); } - }); - CompletableFuture.allOf(cartItemCompletableFuture).join(); - - Assert.isTrue(cartItem.getSkuId() != null, "商品不存在"); + } cartHashOperations.put(hKey, cartItem); return true; } @@ -189,7 +181,7 @@ public boolean removeCheckedItem() { * 获取第一层,即某个用户的购物车 */ private BoundHashOperations getCartHashOperations(Long memberId) { - String cartKey = OmsConstants.MEMBER_CART_PREFIX + memberId; + String cartKey = OrderConstants.MEMBER_CART_PREFIX + memberId; BoundHashOperations operations = redisTemplate.boundHashOps(cartKey); return operations; } diff --git a/mall-oms/oms-boot/src/main/java/com/youlai/mall/oms/service/impl/OrderDeliveryServiceImpl.java b/mall-oms/oms-boot/src/main/java/com/youlai/mall/oms/service/app/impl/OrderDeliveryServiceImpl.java similarity index 67% rename from mall-oms/oms-boot/src/main/java/com/youlai/mall/oms/service/impl/OrderDeliveryServiceImpl.java rename to mall-oms/oms-boot/src/main/java/com/youlai/mall/oms/service/app/impl/OrderDeliveryServiceImpl.java index 95d2e1178..79b23a9b4 100644 --- a/mall-oms/oms-boot/src/main/java/com/youlai/mall/oms/service/impl/OrderDeliveryServiceImpl.java +++ b/mall-oms/oms-boot/src/main/java/com/youlai/mall/oms/service/app/impl/OrderDeliveryServiceImpl.java @@ -1,9 +1,9 @@ -package com.youlai.mall.oms.service.impl; +package com.youlai.mall.oms.service.app.impl; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.youlai.mall.oms.mapper.OrderDeliveryMapper; -import com.youlai.mall.oms.pojo.entity.OmsOrderDelivery; -import com.youlai.mall.oms.service.OrderDeliveryService; +import com.youlai.mall.oms.model.entity.OmsOrderDelivery; +import com.youlai.mall.oms.service.app.OrderDeliveryService; import org.springframework.stereotype.Service; @Service("orderDeliveryService") diff --git a/mall-oms/oms-boot/src/main/java/com/youlai/mall/oms/service/impl/OrderItemServiceImpl.java b/mall-oms/oms-boot/src/main/java/com/youlai/mall/oms/service/app/impl/OrderItemServiceImpl.java similarity index 68% rename from mall-oms/oms-boot/src/main/java/com/youlai/mall/oms/service/impl/OrderItemServiceImpl.java rename to mall-oms/oms-boot/src/main/java/com/youlai/mall/oms/service/app/impl/OrderItemServiceImpl.java index c54d10455..e318e79f6 100644 --- a/mall-oms/oms-boot/src/main/java/com/youlai/mall/oms/service/impl/OrderItemServiceImpl.java +++ b/mall-oms/oms-boot/src/main/java/com/youlai/mall/oms/service/app/impl/OrderItemServiceImpl.java @@ -1,9 +1,9 @@ -package com.youlai.mall.oms.service.impl; +package com.youlai.mall.oms.service.app.impl; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.youlai.mall.oms.mapper.OrderItemMapper; -import com.youlai.mall.oms.pojo.entity.OmsOrderItem; -import com.youlai.mall.oms.service.OrderItemService; +import com.youlai.mall.oms.model.entity.OmsOrderItem; +import com.youlai.mall.oms.service.app.OrderItemService; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; diff --git a/mall-oms/oms-boot/src/main/java/com/youlai/mall/oms/service/impl/OrderLogServiceImpl.java b/mall-oms/oms-boot/src/main/java/com/youlai/mall/oms/service/app/impl/OrderLogServiceImpl.java similarity index 87% rename from mall-oms/oms-boot/src/main/java/com/youlai/mall/oms/service/impl/OrderLogServiceImpl.java rename to mall-oms/oms-boot/src/main/java/com/youlai/mall/oms/service/app/impl/OrderLogServiceImpl.java index 1baa66fdb..944af10d2 100644 --- a/mall-oms/oms-boot/src/main/java/com/youlai/mall/oms/service/impl/OrderLogServiceImpl.java +++ b/mall-oms/oms-boot/src/main/java/com/youlai/mall/oms/service/app/impl/OrderLogServiceImpl.java @@ -1,10 +1,10 @@ -package com.youlai.mall.oms.service.impl; +package com.youlai.mall.oms.service.app.impl; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.youlai.common.security.util.SecurityUtils; import com.youlai.mall.oms.mapper.OrderLogMapper; -import com.youlai.mall.oms.pojo.entity.OmsOrderLog; -import com.youlai.mall.oms.service.OrderLogService; +import com.youlai.mall.oms.model.entity.OmsOrderLog; +import com.youlai.mall.oms.service.app.OrderLogService; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; diff --git a/mall-oms/oms-boot/src/main/java/com/youlai/mall/oms/service/app/impl/OrderServiceImpl.java b/mall-oms/oms-boot/src/main/java/com/youlai/mall/oms/service/app/impl/OrderServiceImpl.java new file mode 100644 index 000000000..843cf6724 --- /dev/null +++ b/mall-oms/oms-boot/src/main/java/com/youlai/mall/oms/service/app/impl/OrderServiceImpl.java @@ -0,0 +1,485 @@ +package com.youlai.mall.oms.service.app.impl; + +import cn.hutool.core.bean.BeanUtil; +import cn.hutool.core.lang.Assert; +import cn.hutool.core.util.RandomUtil; +import cn.hutool.core.util.StrUtil; +import cn.hutool.json.JSONUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.github.binarywang.wxpay.bean.notify.SignatureHeader; +import com.github.binarywang.wxpay.bean.notify.WxPayOrderNotifyV3Result; +import com.github.binarywang.wxpay.bean.notify.WxPayRefundNotifyV3Result; +import com.github.binarywang.wxpay.bean.request.WxPayUnifiedOrderV3Request; +import com.github.binarywang.wxpay.bean.result.WxPayUnifiedOrderV3Result; +import com.github.binarywang.wxpay.bean.result.enums.TradeTypeEnum; +import com.github.binarywang.wxpay.constant.WxPayConstants; +import com.github.binarywang.wxpay.exception.WxPayException; +import com.github.binarywang.wxpay.service.WxPayService; +import com.youlai.common.result.Result; +import com.youlai.common.security.util.SecurityUtils; +import com.youlai.common.web.exception.BizException; +import com.youlai.mall.oms.constant.OrderConstants; +import com.youlai.mall.oms.config.WxPayProperties; +import com.youlai.mall.oms.enums.OrderStatusEnum; +import com.youlai.mall.oms.enums.PaymentMethodEnum; +import com.youlai.mall.oms.converter.OrderConverter; +import com.youlai.mall.oms.converter.OrderItemConverter; +import com.youlai.mall.oms.mapper.OrderMapper; +import com.youlai.mall.oms.model.bo.OrderBO; +import com.youlai.mall.oms.model.dto.CartItemDTO; +import com.youlai.mall.oms.model.dto.OrderItemDTO; +import com.youlai.mall.oms.model.entity.OmsOrder; +import com.youlai.mall.oms.model.entity.OmsOrderItem; +import com.youlai.mall.oms.model.form.OrderPaymentForm; +import com.youlai.mall.oms.model.form.OrderSubmitForm; +import com.youlai.mall.oms.model.query.OrderPageQuery; +import com.youlai.mall.oms.model.vo.OrderConfirmVO; +import com.youlai.mall.oms.model.vo.OrderPageVO; +import com.youlai.mall.oms.service.app.CartService; +import com.youlai.mall.oms.service.app.OrderItemService; +import com.youlai.mall.oms.service.app.OrderService; +import com.youlai.mall.pms.api.SkuFeignClient; +import com.youlai.mall.pms.pojo.dto.SkuInfoDTO; +import com.youlai.mall.pms.pojo.dto.LockedSkuDTO; +import com.youlai.mall.ums.api.MemberFeignClient; +import com.youlai.mall.ums.dto.MemberAddressDTO; +import io.seata.spring.annotation.GlobalTransactional; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.redisson.api.RLock; +import org.redisson.api.RedissonClient; +import org.springframework.amqp.rabbit.core.RabbitTemplate; +import org.springframework.data.redis.core.StringRedisTemplate; +import org.springframework.data.redis.core.script.DefaultRedisScript; +import org.springframework.stereotype.Service; +import org.springframework.web.context.request.RequestAttributes; +import org.springframework.web.context.request.RequestContextHolder; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.Date; +import java.util.List; +import java.util.concurrent.CompletableFuture; +import java.util.concurrent.ThreadPoolExecutor; +import java.util.stream.Collectors; + + +/** + * 订单业务实现类 + * + * @author haoxr + * @since 2.0.0 + */ +@Service +@RequiredArgsConstructor +@Slf4j +public class OrderServiceImpl extends ServiceImpl implements OrderService { + + private final WxPayProperties wxPayProperties; + private final CartService cartService; + private final OrderItemService orderItemService; + private final RabbitTemplate rabbitTemplate; + private final StringRedisTemplate redisTemplate; + private final ThreadPoolExecutor threadPoolExecutor; + private final MemberFeignClient memberFeignClient; + private final SkuFeignClient skuFeignClient; + private final WxPayService wxPayService; + private final RedissonClient redissonClient; + private final OrderConverter orderConverter; + private final OrderItemConverter orderItemConverter; + + /** + * 订单分页列表 + */ + @Override + public IPage getOrderPage(OrderPageQuery queryParams) { + Page boPage = this.baseMapper.getOrderPage( + new Page<>(queryParams.getPageNum(), queryParams.getPageSize()), + queryParams); + return orderConverter.toVoPageForApp(boPage); + } + + /** + * 订单确认 → 进入创建订单页面 + *

+ * 获取购买商品明细、用户默认收货地址、防重提交唯一token + * 进入订单创建页面有两个入口,1:立即购买;2:购物车结算 + * + * @param skuId 商品ID(直接购买传值) + * @return {@link OrderConfirmVO} + */ + @Override + public OrderConfirmVO confirmOrder(Long skuId) { + + Long memberId = SecurityUtils.getMemberId(); + + // 解决子线程无法获取HttpServletRequest请求对象中数据的问题 + RequestAttributes attributes = RequestContextHolder.getRequestAttributes(); + RequestContextHolder.setRequestAttributes(attributes, true); + + // 获取订单商品 + CompletableFuture> getOrderItemsFuture = CompletableFuture.supplyAsync( + () -> this.getOrderItems(skuId, memberId), threadPoolExecutor) + .exceptionally(ex -> { + log.error("Failed to get order items: {}", ex.toString()); + return null; + }); + + // 用户收货地址 + CompletableFuture> getMemberAddressFuture = CompletableFuture.supplyAsync(() -> { + Result> getMemberAddressResult = memberFeignClient.listMemberAddresses(memberId); + if (Result.isSuccess(getMemberAddressResult)) { + return getMemberAddressResult.getData(); + } + return null; + }, threadPoolExecutor).exceptionally(ex -> { + log.error("Failed to get addresses for memberId {} : {}", memberId, ex.toString()); + return null; + }); + + // 生成唯一令牌,防止重复提交(原理:提交会消耗令牌,令牌被消耗无法再次提交) + CompletableFuture generateOrderTokenFuture = CompletableFuture.supplyAsync(() -> { + String orderToken = this.generateTradeNo(memberId); + redisTemplate.opsForValue().set(OrderConstants.ORDER_TOKEN_PREFIX + orderToken, orderToken); + return orderToken; + }, threadPoolExecutor).exceptionally(ex -> { + log.error("Failed to generate order token ."); + return null; + }); + + CompletableFuture.allOf(getOrderItemsFuture, getMemberAddressFuture, generateOrderTokenFuture).join(); + OrderConfirmVO orderConfirmVO = new OrderConfirmVO(); + orderConfirmVO.setOrderItems(getOrderItemsFuture.join()); + orderConfirmVO.setAddresses(getMemberAddressFuture.join()); + orderConfirmVO.setOrderToken(generateOrderTokenFuture.join()); + + log.info("Order confirm response for skuId {}: {}", skuId, orderConfirmVO); + return orderConfirmVO; + } + + /** + * 订单提交 + * + * @param submitForm {@link OrderSubmitForm} + * @return 订单编号 + */ + @Override + @GlobalTransactional + public String submitOrder(OrderSubmitForm submitForm) { + log.info("订单提交参数:{}", JSONUtil.toJsonStr(submitForm)); + String orderToken = submitForm.getOrderToken(); + + // 1. 判断订单是否重复提交(LUA脚本保证获取和删除的原子性,成功返回1,否则返回0) + String lockAcquireScript = "if redis.call('get', KEYS[1]) == ARGV[1] then return redis.call('del', KEYS[1]) else return 0 end"; + Long lockAcquired = this.redisTemplate.execute( + new DefaultRedisScript<>(lockAcquireScript, Long.class), + Collections.singletonList(OrderConstants.ORDER_TOKEN_PREFIX + orderToken), + orderToken + ); + Assert.isTrue(lockAcquired != null && lockAcquired.equals(1L), "订单重复提交,请刷新页面后重试"); + + // 2. 订单商品校验 (PS:校验进入订单确认页面到提交过程商品(价格、上架状态)变化) + List orderItems = submitForm.getOrderItems(); + List skuIds = orderItems.stream() + .map(OrderSubmitForm.OrderItem::getSkuId) + .collect(Collectors.toList()); + + List skuList = skuFeignClient.getSkuInfoList(skuIds); + for (OrderSubmitForm.OrderItem item : orderItems) { + SkuInfoDTO skuInfo = skuList.stream().filter(sku -> sku.getId().equals(item.getSkuId())) + .findFirst() + .orElse(null); + Assert.isTrue(skuInfo != null, "商品({})已下架或删除"); + Assert.isTrue(item.getPrice().compareTo(skuInfo.getPrice()) == 0, "商品({})价格发生变动,请刷新页面", item.getSkuName()); + } + + // 3. 校验库存并锁定库存 + List lockedSkuList = orderItems.stream() + .map(item -> new LockedSkuDTO(item.getSkuId(), item.getQuantity(), item.getSkuSn())) + .collect(Collectors.toList()); + + boolean lockStockResult = skuFeignClient.lockStock(orderToken, lockedSkuList); + Assert.isTrue(lockStockResult, "订单提交失败:锁定商品库存失败!"); + + // 4. 生成订单 + boolean result = this.saveOrder(submitForm); + log.info("order ({}) create result:{}", orderToken, result); + return orderToken; + } + + + /** + * 创建订单 + * + * @param submitForm 订单提交表单对象 + * @return + */ + private boolean saveOrder(OrderSubmitForm submitForm) { + OmsOrder order = orderConverter.form2Entity(submitForm); + order.setStatus(OrderStatusEnum.UNPAID.getValue()); + order.setMemberId(SecurityUtils.getMemberId()); + order.setSource(submitForm.getOrderSource().getValue()); + boolean result = this.save(order); + + Long orderId = order.getId(); + if (result) { + + // 保存订单明细 + List orderItemEntities = orderItemConverter.item2Entity(submitForm.getOrderItems()); + orderItemEntities.forEach(item -> item.setOrderId(orderId)); + + orderItemService.saveBatch(orderItemEntities); + + // 订单超时未支付取消 + rabbitTemplate.convertAndSend("order.exchange", "order.close.delay", submitForm.getOrderToken()); + } + return result; + } + + + /** + * 订单支付 + *

+ * 余额支付:库存、余额、订单处理 + * 微信支付:生成微信支付调起参数,订单、库存、余额处理在支付回调 + */ + @Override + @GlobalTransactional + public T payOrder(OrderPaymentForm paymentForm) { + String orderSn = paymentForm.getOrderSn(); + OmsOrder order = this.getOne(new LambdaQueryWrapper().eq(OmsOrder::getOrderSn, orderSn)); + Assert.isTrue(order != null, "订单不存在"); + + Assert.isTrue(OrderStatusEnum.UNPAID.getValue().equals(order.getStatus()), "订单不可支付,请检查订单状态"); + + RLock lock = redissonClient.getLock(OrderConstants.ORDER_LOCK_PREFIX + order.getOrderSn()); + try { + lock.lock(); + T result; + switch (paymentForm.getPaymentMethod()) { + case WX_JSAPI: + result = (T) wxJsapiPay(paymentForm.getAppId(), order.getOrderSn(), order.getPaymentAmount()); + break; + default: + result = (T) balancePay(order); + break; + } + return result; + } finally { + //释放锁 + if (lock.isLocked()) { + lock.unlock(); + } + } + } + + + /** + * 余额支付 + * + * @param order + * @return + */ + private Boolean balancePay(OmsOrder order) { + // 扣减余额 + Long memberId = order.getMemberId(); + Long payAmount = order.getPaymentAmount(); + Result deductBalanceResult = memberFeignClient.deductBalance(memberId, payAmount); + Assert.isTrue(Result.isSuccess(deductBalanceResult), "扣减账户余额失败"); + + // 扣减库存 + skuFeignClient.deductStock(order.getOrderSn()); + + // 更新订单状态 + order.setStatus(OrderStatusEnum.PAID.getValue()); + order.setPaymentMethod(PaymentMethodEnum.BALANCE.getValue()); + order.setPaymentTime(new Date()); + this.updateById(order); + // 支付成功删除购物车已勾选的商品 + cartService.removeCheckedItem(); + return Boolean.TRUE; + } + + + /** + * 微信支付调起 + * + * @param appId 微信小程序ID + * @param orderSn 订单编号 + * @param paymentAmount 支付金额 + * @return 微信支付调起参数 + */ + private WxPayUnifiedOrderV3Result.JsapiResult wxJsapiPay(String appId, String orderSn, Long paymentAmount) { + Long memberId = SecurityUtils.getMemberId(); + // 如果已经有outTradeNo了就先进行关单 + if (StrUtil.isNotBlank(orderSn)) { + try { + wxPayService.closeOrderV3(orderSn); + } catch (WxPayException e) { + log.error(e.getMessage(), e); + throw new BizException("微信关单异常"); + } + } + + // 更新订单状态 + boolean result = this.update(new LambdaUpdateWrapper() + .set(OmsOrder::getPaymentMethod, PaymentMethodEnum.WX_JSAPI.getValue()) + .eq(OmsOrder::getOrderSn, orderSn) + ); + + String memberOpenId = memberFeignClient.getMemberOpenId(memberId).getData(); + + WxPayUnifiedOrderV3Request wxRequest = new WxPayUnifiedOrderV3Request() + .setAppid(appId) + .setOutTradeNo(orderSn) + .setAmount(new WxPayUnifiedOrderV3Request + .Amount() + .setTotal(Math.toIntExact(paymentAmount)) + ) + .setPayer( + new WxPayUnifiedOrderV3Request.Payer() + .setOpenid(memberOpenId) + ) + .setDescription("赅买-订单编号:" + orderSn) + .setNotifyUrl(wxPayProperties.getPayNotifyUrl()); + WxPayUnifiedOrderV3Result.JsapiResult jsapiResult; + try { + jsapiResult = wxPayService.createOrderV3(TradeTypeEnum.JSAPI, wxRequest); + } catch (WxPayException e) { + log.error(e.getMessage(), e); + throw new BizException("微信统一下单异常"); + } + return jsapiResult; + } + + /** + * 关闭订单 + * + * @param orderSn 订单编号 + * @return 是否成功 true|false + */ + @Override + public boolean closeOrder(String orderSn) { + + return this.update(new LambdaUpdateWrapper() + .eq(OmsOrder::getOrderSn, orderSn) + .eq(OmsOrder::getStatus, OrderStatusEnum.UNPAID.getValue()) + .set(OmsOrder::getStatus, OrderStatusEnum.CANCELED.getValue()) + ); + } + + /** + * 删除订单 + * + * @param orderId 订单ID + * @return true/false + */ + @Override + public boolean deleteOrder(Long orderId) { + OmsOrder order = this.getById(orderId); + Assert.isTrue(order != null, "删除失败,订单不存在!"); + + Assert.isTrue( + OrderStatusEnum.CANCELED.getValue().equals(order.getStatus()) + || OrderStatusEnum.UNPAID.getValue().equals(order.getStatus()) + , + "当前状态订单不能删除" + ); + + return this.removeById(orderId); + } + + @Override + public void handleWxPayOrderNotify(SignatureHeader signatureHeader, String notifyData) throws WxPayException { + log.info("开始处理支付结果通知"); + // 解密支付通知内容 + final WxPayOrderNotifyV3Result.DecryptNotifyResult result = this.wxPayService.parseOrderNotifyV3Result(notifyData, signatureHeader).getResult(); + log.debug("支付通知解密成功:[{}]", result.toString()); + // 根据商户订单号查询订单 + OmsOrder orderDO = this.getOne(new LambdaQueryWrapper() + .eq(OmsOrder::getOutTradeNo, result.getOutTradeNo()) + ); + // 支付成功处理 + if (WxPayConstants.WxpayTradeStatus.SUCCESS.equals(result.getTradeState())) { + orderDO.setStatus(OrderStatusEnum.PAID.getValue()); + orderDO.setTransactionId(result.getTransactionId()); + orderDO.setPaymentTime(new Date()); + this.updateById(orderDO); + } + log.info("账单更新成功"); + // 支付成功删除购物车已勾选的商品 + cartService.removeCheckedItem(); + } + + @Override + public void handleWxPayRefundNotify(SignatureHeader signatureHeader, String notifyData) throws WxPayException { + log.info("开始处理退款结果通知"); + // 解密支付通知内容 + final WxPayRefundNotifyV3Result.DecryptNotifyResult result = this.wxPayService.parseRefundNotifyV3Result(notifyData, signatureHeader).getResult(); + log.debug("退款通知解密成功:[{}]", result.toString()); + // 根据商户退款单号查询订单 + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.lambda().eq(OmsOrder::getOutTradeNo, result.getOutTradeNo()); + OmsOrder orderDO = this.getOne(wrapper); + // 退款成功处理 + if (WxPayConstants.RefundStatus.SUCCESS.equals(result.getRefundStatus())) { + orderDO.setStatus(OrderStatusEnum.COMPLETE.getValue()); + orderDO.setRefundId(result.getRefundId()); + this.updateById(orderDO); + } + log.info("账单更新成功"); + } + + + /** + * 获取订单的商品明细信息 + *

+ * 创建订单两种方式,1:直接购买;2:购物车结算 + * + * @param skuId 直接购买必有值,购物车结算必没值 + * @return + */ + private List getOrderItems(Long skuId, Long memberId) { + List orderItems; + if (skuId != null) { // 直接购买 + orderItems = new ArrayList<>(); + SkuInfoDTO skuInfoDTO = skuFeignClient.getSkuInfo(skuId); + OrderItemDTO orderItemDTO = new OrderItemDTO(); + BeanUtil.copyProperties(skuInfoDTO, orderItemDTO); + orderItemDTO.setSkuId(skuInfoDTO.getId()); + orderItemDTO.setQuantity(1); // 直接购买商品的数量为1 + orderItems.add(orderItemDTO); + } else { // 购物车结算 + List cartItems = cartService.listCartItems(memberId); + orderItems = cartItems.stream() + .filter(CartItemDTO::getChecked) + .map(cartItem -> { + OrderItemDTO orderItemDTO = new OrderItemDTO(); + BeanUtil.copyProperties(cartItem, orderItemDTO); + return orderItemDTO; + }).collect(Collectors.toList()); + } + return orderItems; + } + + /** + * 生成商户订单号 + * + * @param memberId 会员ID + * @return + */ + private String generateTradeNo(Long memberId) { + // 用户id前补零保证五位,对超出五位的保留后五位 + String userIdFilledZero = String.format("%05d", memberId); + String fiveDigitsUserId = userIdFilledZero.substring(userIdFilledZero.length() - 5); + // 在前面加上wxo(wx order)等前缀是为了人工可以快速分辨订单号是下单还是退款、来自哪家支付机构等 + // 将时间戳+3位随机数+五位id组成商户订单号,规则参考自大众点评 + return System.currentTimeMillis() + RandomUtil.randomNumbers(3) + fiveDigitsUserId; + } + +} diff --git a/mall-oms/oms-boot/src/main/java/com/youlai/mall/oms/service/impl/OrderSettingServiceImpl.java b/mall-oms/oms-boot/src/main/java/com/youlai/mall/oms/service/app/impl/OrderSettingServiceImpl.java similarity index 65% rename from mall-oms/oms-boot/src/main/java/com/youlai/mall/oms/service/impl/OrderSettingServiceImpl.java rename to mall-oms/oms-boot/src/main/java/com/youlai/mall/oms/service/app/impl/OrderSettingServiceImpl.java index 6800f9d70..ea646f98c 100644 --- a/mall-oms/oms-boot/src/main/java/com/youlai/mall/oms/service/impl/OrderSettingServiceImpl.java +++ b/mall-oms/oms-boot/src/main/java/com/youlai/mall/oms/service/app/impl/OrderSettingServiceImpl.java @@ -1,9 +1,9 @@ -package com.youlai.mall.oms.service.impl; +package com.youlai.mall.oms.service.app.impl; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.youlai.mall.oms.mapper.OrderSettingMapper; -import com.youlai.mall.oms.pojo.entity.OmsOrderSetting; -import com.youlai.mall.oms.service.OrderSettingService; +import com.youlai.mall.oms.model.entity.OmsOrderSetting; +import com.youlai.mall.oms.service.app.OrderSettingService; import org.springframework.stereotype.Service; diff --git a/mall-oms/oms-boot/src/main/java/com/youlai/mall/oms/service/impl/OrderServiceImpl.java b/mall-oms/oms-boot/src/main/java/com/youlai/mall/oms/service/impl/OrderServiceImpl.java deleted file mode 100644 index f1162f290..000000000 --- a/mall-oms/oms-boot/src/main/java/com/youlai/mall/oms/service/impl/OrderServiceImpl.java +++ /dev/null @@ -1,420 +0,0 @@ -package com.youlai.mall.oms.service.impl; - -import cn.hutool.core.bean.BeanUtil; -import cn.hutool.core.collection.CollectionUtil; -import cn.hutool.core.lang.Assert; -import cn.hutool.core.util.RandomUtil; -import cn.hutool.core.util.StrUtil; -import cn.hutool.json.JSONUtil; -import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; -import com.baomidou.mybatisplus.core.metadata.IPage; -import com.baomidou.mybatisplus.extension.plugins.pagination.Page; -import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import com.github.binarywang.wxpay.bean.notify.SignatureHeader; -import com.github.binarywang.wxpay.bean.notify.WxPayOrderNotifyV3Result; -import com.github.binarywang.wxpay.bean.notify.WxPayRefundNotifyV3Result; -import com.github.binarywang.wxpay.bean.request.WxPayUnifiedOrderV3Request; -import com.github.binarywang.wxpay.bean.result.WxPayUnifiedOrderV3Result; -import com.github.binarywang.wxpay.bean.result.enums.TradeTypeEnum; -import com.github.binarywang.wxpay.constant.WxPayConstants; -import com.github.binarywang.wxpay.exception.WxPayException; -import com.github.binarywang.wxpay.service.WxPayService; -import com.youlai.common.redis.BusinessSnGenerator; -import com.youlai.common.result.Result; -import com.youlai.common.security.util.SecurityUtils; -import com.youlai.common.web.exception.BizException; -import com.youlai.mall.oms.config.WxPayProperties; -import com.youlai.mall.oms.common.enums.OrderStatusEnum; -import com.youlai.mall.oms.common.enums.PayTypeEnum; -import com.youlai.mall.oms.converter.OrderConverter; -import com.youlai.mall.oms.converter.OrderItemConverter; -import com.youlai.mall.oms.mapper.OrderMapper; -import com.youlai.mall.oms.pojo.dto.CartItemDTO; -import com.youlai.mall.oms.pojo.dto.OrderItemDTO; -import com.youlai.mall.oms.pojo.entity.OmsOrder; -import com.youlai.mall.oms.pojo.entity.OmsOrderItem; -import com.youlai.mall.oms.pojo.form.OrderSubmitForm; -import com.youlai.mall.oms.pojo.query.OrderPageQuery; -import com.youlai.mall.oms.pojo.vo.OrderConfirmVO; -import com.youlai.mall.oms.pojo.vo.OrderSubmitResultVO; -import com.youlai.mall.oms.service.CartService; -import com.youlai.mall.oms.service.OrderItemService; -import com.youlai.mall.oms.service.OrderService; -import com.youlai.mall.pms.api.SkuFeignClient; -import com.youlai.mall.pms.pojo.dto.CheckPriceDTO; -import com.youlai.mall.pms.pojo.dto.SkuDTO; -import com.youlai.mall.pms.pojo.dto.LockStockDTO; -import com.youlai.mall.ums.api.MemberFeignClient; -import com.youlai.mall.ums.dto.MemberAddressDTO; -import io.seata.spring.annotation.GlobalTransactional; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.redisson.api.RLock; -import org.redisson.api.RedissonClient; -import org.springframework.amqp.rabbit.connection.CorrelationData; -import org.springframework.amqp.rabbit.core.RabbitTemplate; -import org.springframework.data.redis.core.StringRedisTemplate; -import org.springframework.data.redis.core.script.DefaultRedisScript; -import org.springframework.stereotype.Service; -import org.springframework.web.context.request.RequestAttributes; -import org.springframework.web.context.request.RequestContextHolder; - -import java.util.ArrayList; -import java.util.Collections; -import java.util.Date; -import java.util.List; -import java.util.concurrent.CompletableFuture; -import java.util.concurrent.ThreadPoolExecutor; -import java.util.stream.Collectors; - -import static com.youlai.mall.oms.common.constant.OmsConstants.*; - -/** - * 订单业务实现类 - * - * @author haoxr - * @date 2022/2/12 - */ -@Service -@RequiredArgsConstructor -@Slf4j -public class OrderServiceImpl extends ServiceImpl implements OrderService { - - private final WxPayProperties wxPayProperties; - private final CartService cartService; - private final OrderItemService orderItemService; - private final RabbitTemplate rabbitTemplate; - private final StringRedisTemplate redisTemplate; - private final ThreadPoolExecutor threadPoolExecutor; - private final MemberFeignClient memberFeignClient; - private final BusinessSnGenerator businessSnGenerator; - private final SkuFeignClient skuFeignClient; - private final RedissonClient redissonClient; - private final WxPayService wxPayService; - private final OrderConverter orderConverter; - private final OrderItemConverter orderItemConverter; - - /** - * 订单分页列表 - */ - @Override - public IPage listOrderPages(OrderPageQuery queryParams) { - Page page = new Page<>(queryParams.getPageNum(), queryParams.getPageSize()); - List list = this.baseMapper.listOrderPages(page, queryParams); - page.setRecords(list); - return page; - } - - /** - * 订单确认 → 进入创建订单页面 - *

- * 获取购买商品明细、用户默认收货地址、防重提交唯一token - * 进入订单创建页面有两个入口,1:立即购买;2:购物车结算 - * - * @param skuId 直接购买必填,购物车结算不填 - * @return - */ - @Override - public OrderConfirmVO confirmOrder(Long skuId) { - OrderConfirmVO orderConfirmVO = new OrderConfirmVO(); - // 获取原请求线程的参数 - RequestAttributes attributes = RequestContextHolder.getRequestAttributes(); - Long memberId = SecurityUtils.getMemberId(); - // 获取订单的商品明细信息 - CompletableFuture getOrderItemsFuture = CompletableFuture.runAsync(() -> { - // 请求参数传递给子线程 - RequestContextHolder.setRequestAttributes(attributes); - List orderItems = this.getOrderItems(skuId, memberId); - orderConfirmVO.setOrderItems(orderItems); - }, threadPoolExecutor); - - // 获取会员收获地址 - CompletableFuture getMemberAddressFuture = CompletableFuture.runAsync(() -> { - RequestContextHolder.setRequestAttributes(attributes); - Result> getMemberAddressResult = memberFeignClient.listMemberAddresses(memberId); - List memberAddresses; - if (Result.isSuccess(getMemberAddressResult) && (memberAddresses = getMemberAddressResult.getData()) != null) { - orderConfirmVO.setAddresses(memberAddresses); - } else { - orderConfirmVO.setAddresses(Collections.EMPTY_LIST); - } - }, threadPoolExecutor); - - // 进入订单确认页面生成唯一token,订单提交根据此token判断是否重复提交 - CompletableFuture getOrderTokenFuture = CompletableFuture.runAsync(() -> { - RequestContextHolder.setRequestAttributes(attributes); - String orderToken = businessSnGenerator.generateSerialNo("ORDER"); - orderConfirmVO.setOrderToken(orderToken); - redisTemplate.opsForValue().set(ORDER_RESUBMIT_LOCK_PREFIX + orderToken, orderToken); - }, threadPoolExecutor); - - CompletableFuture.allOf(getOrderItemsFuture, getMemberAddressFuture, getOrderTokenFuture).join(); - log.info("订单确认响应:{}", orderConfirmVO); - return orderConfirmVO; - } - - /** - * 订单提交 - */ - @Override - @GlobalTransactional - public OrderSubmitResultVO submitOrder(OrderSubmitForm orderSubmitForm) { - log.info("订单提交数据:{}", JSONUtil.toJsonStr(orderSubmitForm)); - // 订单基础信息校验 - List orderItems = orderSubmitForm.getOrderItems(); - Assert.isTrue(CollectionUtil.isNotEmpty(orderItems), "订单没有商品"); - - // 订单重复提交校验 - String orderSn = orderSubmitForm.getOrderToken(); - Long releaseLockResult = this.redisTemplate.execute( - new DefaultRedisScript<>( - "if redis.call('get', KEYS[1]) == ARGV[1] then return redis.call('del', KEYS[1]) else return 0 end", Long.class - ), - Collections.singletonList(ORDER_RESUBMIT_LOCK_PREFIX + orderSn), - orderSn - ); // 释放锁成功则返回1 - Assert.isTrue(releaseLockResult.equals(1l), "订单重复提交,请刷新页面后重试"); - - // 订单验价 - List orderSkus = orderItems.stream() - .map(orderItem -> new CheckPriceDTO.OrderSku(orderItem.getSkuId(), orderItem.getCount()) - ).collect(Collectors.toList()); - - CheckPriceDTO checkPriceDTO = new CheckPriceDTO(orderSn, orderSubmitForm.getTotalAmount(), orderSkus); - Result checkPriceResult = skuFeignClient.checkPrice(checkPriceDTO); - Assert.isTrue(Result.isSuccess(checkPriceResult) && Boolean.TRUE.equals(checkPriceResult.getData()), - "当前页面已过期,请重新刷新页面再提交"); - - // 锁定订单商品的库存 - List lockedSkus = orderItems.stream() - .map(orderItem -> new LockStockDTO.LockedSku(orderItem.getSkuId(), orderItem.getCount())) - .collect(Collectors.toList()); - - LockStockDTO lockStockDTO = new LockStockDTO(orderSn, lockedSkus); - - Result lockStockResult = skuFeignClient.lockStock(lockStockDTO); - Assert.isTrue(Result.isSuccess(lockStockResult), "订单提交失败:锁定商品库存失败!"); - - // 创建订单 - OmsOrder orderEntity = orderConverter.submitForm2Entity(orderSubmitForm); - orderEntity.setStatus(OrderStatusEnum.UNPAID.getValue()); - orderEntity.setMemberId(SecurityUtils.getMemberId()); - boolean result = this.save(orderEntity); - // 添加订单明细 - Long orderId = orderEntity.getId(); - if (result) { - List itemEntities = orderItemConverter.dto2Entity(orderId, orderItems); - result = orderItemService.saveBatch(itemEntities); - if (result) { - // 订单超时未支付关单 - rabbitTemplate.convertAndSend("order.exchange", "order.close.delay.routing.key", orderSn); - } - } - Assert.isTrue(result, "订单提交失败"); - - // 成功响应返回值构建 - OrderSubmitResultVO submitVO = new OrderSubmitResultVO(orderId, orderEntity.getOrderSn()); - return submitVO; - } - - /** - * 订单支付 - */ - @Override - @GlobalTransactional - public boolean payOrder(Long orderId) { - - OmsOrder order = this.getById(orderId); - Assert.isTrue(order != null, "订单不存在"); - - Assert.isTrue(OrderStatusEnum.UNPAID.getValue().equals(order.getStatus()), "订单不可支付,请检查订单状态"); - - RLock lock = redissonClient.getLock(ORDER_LOCK_PREFIX + order.getOrderSn()); - try { - - lock.lock(); - // 扣减余额 - memberFeignClient.deductBalance(SecurityUtils.getMemberId(), order.getPayAmount()); - // 扣减库存 - skuFeignClient.deductStock(order.getOrderSn()); - // 修改订单状态 → 【已支付】 - order.setStatus(OrderStatusEnum.PAID.getValue()); - order.setPayType(PayTypeEnum.BALANCE.getValue()); - order.setPayTime(new Date()); - this.updateById(order); - // 支付成功删除购物车已勾选的商品 - cartService.removeCheckedItem(); - return true; - } finally { - //释放锁 - if (lock.isLocked()) { - lock.unlock(); - } - } - } - - /** - * 微信支付 - * - * @param appId - * @param order - * @return - */ - private WxPayUnifiedOrderV3Result.JsapiResult wxJsapiPay(String appId, OmsOrder order) { - Long memberId = SecurityUtils.getMemberId(); - Long payAmount = order.getPayAmount(); - // 如果已经有outTradeNo了就先进行关单 - if (PayTypeEnum.WX_JSAPI.getValue().equals(order.getPayType()) && StrUtil.isNotBlank(order.getOutTradeNo())) { - try { - wxPayService.closeOrderV3(order.getOutTradeNo()); - } catch (WxPayException e) { - log.error(e.getMessage(), e); - throw new BizException("微信关单异常"); - } - } - // 用户id前补零保证五位,对超出五位的保留后五位 - String userIdFilledZero = String.format("%05d", memberId); - String fiveDigitsUserId = userIdFilledZero.substring(userIdFilledZero.length() - 5); - // 在前面加上wxo(wx order)等前缀是为了人工可以快速分辨订单号是下单还是退款、来自哪家支付机构等 - // 将时间戳+3位随机数+五位id组成商户订单号,规则参考自大众点评 - String outTradeNo = "wxo_" + System.currentTimeMillis() + RandomUtil.randomNumbers(3) + fiveDigitsUserId; - log.info("商户订单号拼接完成:{}", outTradeNo); - // 更新订单状态 - order.setPayType(PayTypeEnum.WX_JSAPI.getValue()); - order.setOutTradeNo(outTradeNo); - this.updateById(order); - - String memberOpenId = memberFeignClient.getMemberOpenId(memberId).getData(); - - WxPayUnifiedOrderV3Request wxRequest = new WxPayUnifiedOrderV3Request().setOutTradeNo(outTradeNo).setAppid(appId).setNotifyUrl(wxPayProperties.getPayNotifyUrl()).setAmount(new WxPayUnifiedOrderV3Request.Amount().setTotal(Math.toIntExact(payAmount))).setPayer(new WxPayUnifiedOrderV3Request.Payer().setOpenid(memberOpenId)).setDescription("赅买-订单编号" + order.getOrderSn()); - WxPayUnifiedOrderV3Result.JsapiResult jsapiResult; - try { - jsapiResult = wxPayService.createOrderV3(TradeTypeEnum.JSAPI, wxRequest); - } catch (WxPayException e) { - log.error(e.getMessage(), e); - throw new BizException("微信统一下单异常"); - } - return jsapiResult; - } - - /** - * 关闭订单(超时未支付) - * - * @param orderSn 订单编号 - * @return - */ - @Override - public boolean closeOrder(String orderSn) { - OmsOrder order = this.getOne(new LambdaQueryWrapper() - .eq(OmsOrder::getOrderSn, orderSn) - .select(OmsOrder::getId, OmsOrder::getStatus) - ); - Assert.isTrue(order != null, "订单不存在"); - boolean result; - if (OrderStatusEnum.UNPAID.getValue().equals(order.getStatus())) { - result = this.update(new LambdaUpdateWrapper() - .eq(OmsOrder::getId, order.getId()) - .set(OmsOrder::getStatus, OrderStatusEnum.CANCELED.getValue())); - // 关单成功释放锁定的商品库存 - rabbitTemplate.convertAndSend("stock.exchange", "stock.release.routing.key", orderSn); - } else { // 订单非【待付款】状态无需关闭 - result = true; - } - return result; - } - - /** - * 删除订单 - * - * @param orderId 订单ID - * @return true/false - */ - @Override - public boolean deleteOrder(Long orderId) { - OmsOrder order = this.getById(orderId); - Assert.isTrue(order != null, "删除失败,订单不存在!"); - - Assert.isTrue( - OrderStatusEnum.CANCELED.getValue().equals(order.getStatus()) - || OrderStatusEnum.UNPAID.getValue().equals(order.getStatus()) - , - "当前状态订单不能删除" - ); - - return this.removeById(orderId); - } - - @Override - public void handleWxPayOrderNotify(SignatureHeader signatureHeader, String notifyData) throws WxPayException { - log.info("开始处理支付结果通知"); - // 解密支付通知内容 - final WxPayOrderNotifyV3Result.DecryptNotifyResult result = this.wxPayService.parseOrderNotifyV3Result(notifyData, signatureHeader).getResult(); - log.debug("支付通知解密成功:[{}]", result.toString()); - // 根据商户订单号查询订单 - OmsOrder orderDO = this.getOne(new LambdaQueryWrapper() - .eq(OmsOrder::getOutTradeNo, result.getOutTradeNo()) - ); - // 支付成功处理 - if (WxPayConstants.WxpayTradeStatus.SUCCESS.equals(result.getTradeState())) { - orderDO.setStatus(OrderStatusEnum.PAID.getValue()); - orderDO.setTransactionId(result.getTransactionId()); - orderDO.setPayTime(new Date()); - this.updateById(orderDO); - } - log.info("账单更新成功"); - // 支付成功删除购物车已勾选的商品 - cartService.removeCheckedItem(); - } - - @Override - public void handleWxPayRefundNotify(SignatureHeader signatureHeader, String notifyData) throws WxPayException { - log.info("开始处理退款结果通知"); - // 解密支付通知内容 - final WxPayRefundNotifyV3Result.DecryptNotifyResult result = this.wxPayService.parseRefundNotifyV3Result(notifyData, signatureHeader).getResult(); - log.debug("退款通知解密成功:[{}]", result.toString()); - // 根据商户退款单号查询订单 - QueryWrapper wrapper = new QueryWrapper<>(); - wrapper.lambda().eq(OmsOrder::getOutTradeNo, result.getOutTradeNo()); - OmsOrder orderDO = this.getOne(wrapper); - // 退款成功处理 - if (WxPayConstants.RefundStatus.SUCCESS.equals(result.getRefundStatus())) { - orderDO.setStatus(OrderStatusEnum.COMPLETE.getValue()); - orderDO.setRefundId(result.getRefundId()); - this.updateById(orderDO); - } - log.info("账单更新成功"); - } - - - /** - * 获取订单的商品明细信息 - *

- * 创建订单两种方式,1:直接购买;2:购物车结算 - * - * @param skuId 直接购买必有值,购物车结算必没值 - * @return - */ - private List getOrderItems(Long skuId, Long memberId) { - List orderItems; - if (skuId != null) { // 直接购买 - orderItems = new ArrayList<>(); - SkuDTO skuDTO = skuFeignClient.getSkuInfo(skuId).getData(); - OrderItemDTO orderItemDTO = new OrderItemDTO(); - BeanUtil.copyProperties(skuDTO, orderItemDTO); - - orderItemDTO.setCount(1); // 直接购买商品的数量为1 - orderItems.add(orderItemDTO); - } else { // 购物车结算 - List cartItems = cartService.listCartItems(memberId); - orderItems = cartItems.stream().filter(CartItemDTO::getChecked).map(cartItem -> { - OrderItemDTO orderItemDTO = new OrderItemDTO(); - BeanUtil.copyProperties(cartItem, orderItemDTO); - return orderItemDTO; - }).collect(Collectors.toList()); - } - return orderItems; - } - -} diff --git a/mall-oms/oms-boot/src/main/resources/mapper/OmsOrderItemMapper.xml b/mall-oms/oms-boot/src/main/resources/mapper/OmsOrderItemMapper.xml index 5be67e422..6c52afe99 100644 --- a/mall-oms/oms-boot/src/main/resources/mapper/OmsOrderItemMapper.xml +++ b/mall-oms/oms-boot/src/main/resources/mapper/OmsOrderItemMapper.xml @@ -4,16 +4,17 @@ "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> - - SELECT id, order_id, sku_id, + sku_sn, sku_name, pic_url, price, - count, + quantity, total_amount FROM oms_order_item diff --git a/mall-oms/oms-boot/src/main/resources/mapper/OmsOrderMapper.xml b/mall-oms/oms-boot/src/main/resources/mapper/OmsOrderMapper.xml index ff86c829b..3b8ecb0f6 100644 --- a/mall-oms/oms-boot/src/main/resources/mapper/OmsOrderMapper.xml +++ b/mall-oms/oms-boot/src/main/resources/mapper/OmsOrderMapper.xml @@ -4,68 +4,50 @@ "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> - - - - - - - - - - - - + - - - - - - - - - + column="{orderId=id}" + select="com.youlai.mall.oms.mapper.OrderItemMapper.getOrderItemsByOrderId"> - - SELECT - id, - order_sn, - total_amount, - pay_amount, - pay_type, - status, - total_amount, - total_quantity, - create_time, - member_id, - source_type - FROM oms_order + t1.id, + t1.order_sn, + t1.total_amount, + t1.payment_amount, + t1.payment_method, + t1.status, + t1.total_amount, + t1.total_quantity, + t1.create_time, + t1.member_id, + t1.source, + t1.remark + FROM + oms_order t1 - - AND status= #{queryParams.status} + + AND + ( + t1.order_sn like concat('%',#{queryParams.keywords},'%') + ) - - AND member_id= #{queryParams.memberId} - - - AND order_sn like concat('%',#{queryParams.orderSn},'%') + + AND t1.status= #{queryParams.status} - - - AND date_format (create_time,'%Y-%m-%d') >= date_format(#{queryParams.beginDate},'%Y-%m-%d') + + AND t1.create_time >= #{queryParams.beginDate} - - AND date_format (create_time,'%Y-%m-%d') <= date_format(#{queryParams.endDate},'%Y-%m-%d') + + AND t1.create_time <= #{queryParams.endDate} - ORDER BY create_time DESC + ORDER BY + t1.create_time DESC diff --git a/mall-oms/oms-boot/src/test/java/com/youlai/mall/oms/controller/OrderControllerTests.java b/mall-oms/oms-boot/src/test/java/com/youlai/mall/oms/controller/OrderControllerTests.java new file mode 100644 index 000000000..0cba8335b --- /dev/null +++ b/mall-oms/oms-boot/src/test/java/com/youlai/mall/oms/controller/OrderControllerTests.java @@ -0,0 +1,242 @@ +package com.youlai.mall.oms.controller; + +import cn.hutool.json.JSONUtil; +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.youlai.mall.oms.enums.OrderSourceEnum; +import com.youlai.mall.oms.enums.PaymentMethodEnum; +import com.youlai.mall.oms.model.form.OrderPaymentForm; +import com.youlai.mall.oms.model.form.OrderSubmitForm; +import lombok.extern.slf4j.Slf4j; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.http.HttpEntity; +import org.springframework.http.HttpHeaders; +import org.springframework.http.MediaType; +import org.springframework.test.web.servlet.MockMvc; +import org.springframework.test.web.servlet.MvcResult; +import org.springframework.test.web.servlet.request.MockHttpServletRequestBuilder; +import org.springframework.test.web.servlet.result.MockMvcResultHandlers; +import org.springframework.util.LinkedMultiValueMap; +import org.springframework.util.MultiValueMap; +import org.springframework.web.client.RestTemplate; + +import java.util.Arrays; +import java.util.Base64; + +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; + +/** + * 订单单元测试 + * + * @author haoxr + * @since 2.3.0 + */ +@SpringBootTest +@AutoConfigureMockMvc +@Slf4j +public class OrderControllerTests { + + + @Autowired + private MockMvc mockMvc; + + @Autowired + private ObjectMapper objectMapper; + + @Autowired + private RestTemplate restTemplate; + private final String mobile = "18866668888";// 商城会员手机号 + private final String verifyCode = "666666";// 短信验证码,666666是免校验验证码 + + private final Long skuId = 1L;// 购买商品ID + + /** + * 购买商品-正常流程测试 + */ + @Test + void testPurchaseFlow_Normal() throws Exception { + + // 会员登录 + String accessToken = acquireTokenByLogin(mobile, verifyCode); // 获取 accessToken,填充请求头用于身份认证 + + HttpHeaders headers = new HttpHeaders(); + headers.setBearerAuth(accessToken); + + // 添加购物车 + this.addToCard(skuId, headers); + + // 订单确认 + String orderToken = this.confirmOrder(headers); // 返回订单提交令牌,用于订单提交 + + // 订单提交 + String orderSn = this.submitOrder(orderToken, headers); // 返回订单编号,用于订单支付 + + // 订单支付 + this.payOrder(orderSn, headers); // 支付成功,商品库存扣减,账户余额扣减,订单状态改变(待支付 → 待发货) + } + + /** + * 购买商品-超时未支付流程测试 + */ + @Test + void testPurchaseFlow_PaymentTimeout() throws Exception { + + // 会员登录 + String accessToken = acquireTokenByLogin(mobile, verifyCode); // 获取 accessToken,填充请求头用于身份认证 + + HttpHeaders headers = new HttpHeaders(); + headers.setBearerAuth(accessToken); + + // 添加购物车 + this.addToCard(skuId, headers); + + // 订单确认 + String orderToken = this.confirmOrder(headers); // 返回订单提交令牌,用于订单提交 + + // 订单提交 + String orderSn = this.submitOrder(orderToken, headers); // 返回订单编号,用于订单支付 + + // 模拟等待超过支付超时时间 + Thread.sleep(30 * 1000); // OrderRabbitConfig#orderDelayQueue#x-message-ttl 设置10s未支付取消 + + // 订单支付 + this.payOrder(orderSn, headers); // 此处支付会异常,因为超时未支付,订单已被系统自动取消,无法再进行支付 + } + + + /** + * 添加商品至购物车 + */ + private void addToCard(Long skuId, HttpHeaders headers) throws Exception { + mockMvc.perform(post("/app-api/v1/carts") + .param("skuId", String.valueOf(skuId)) + .headers(headers)) + .andExpect(status().isOk()) + .andReturn(); + } + + /** + * 订单确认 + */ + private String confirmOrder(HttpHeaders headers) throws Exception { + MvcResult confirmResult = mockMvc.perform( + post("/app-api/v1/orders/confirm") + .headers(headers) + ).andExpect(status().isOk()) + .andReturn(); + String confirmJsonResponse = confirmResult.getResponse().getContentAsString(); + log.info("订单确认响应:{}", confirmJsonResponse); + JsonNode confirmJsonNode = objectMapper.readTree(confirmJsonResponse); + return confirmJsonNode.path("data").path("orderToken").asText(); + } + + /** + * 订单提交 + */ + private String submitOrder(String orderToken, HttpHeaders headers) throws Exception { + // 构造请求体 + OrderSubmitForm submitForm = new OrderSubmitForm(); + + // submitForm - 商品列表 + OrderSubmitForm.OrderItem orderItem = new OrderSubmitForm.OrderItem(); + orderItem.setSkuId(skuId); + orderItem.setQuantity(1); + orderItem.setSkuName("REDMI K60 16G+1T"); + orderItem.setSkuSn("sn001"); + orderItem.setSpuName("REDMI K60"); + orderItem.setPrice(399900L); + orderItem.setPicUrl("https://www.youlai.tech/files/default/c25b39470474494485633c49101a0f5d.png"); + submitForm.setOrderItems(Arrays.asList(orderItem)); + // submitForm - 收货地址 + OrderSubmitForm.ShippingAddress shippingAddress = new OrderSubmitForm.ShippingAddress(); + shippingAddress.setProvince("上海"); + shippingAddress.setCity("上海市"); + shippingAddress.setDistrict("浦东新区"); + shippingAddress.setConsigneeName("法外张三"); + shippingAddress.setConsigneeMobile("18866668888"); + shippingAddress.setDetailAddress("世纪公园"); + submitForm.setShippingAddress(shippingAddress); + + // submitForm - 订单信息 + submitForm.setOrderToken(orderToken); + submitForm.setPaymentAmount(orderItem.getPrice() * 1); + submitForm.setOrderSource(OrderSourceEnum.APP); + submitForm.setRemark("单元测试生成订单"); + + // 发起 POST 请求 + MockHttpServletRequestBuilder requestBuilder = post("/app-api/v1/orders/submit") + .headers(headers) + .contentType(MediaType.APPLICATION_JSON) + .content(objectMapper.writeValueAsString(submitForm)); + + // 执行请求并断言结果 + MvcResult submitResult = mockMvc.perform(requestBuilder) + .andExpect(status().isOk()) + .andReturn(); + String confirmJsonResponse = submitResult.getResponse().getContentAsString(); + JsonNode confirmJsonNode = objectMapper.readTree(confirmJsonResponse); + + return confirmJsonNode.path("data").asText(); + } + + /** + * 订单支付 + */ + private void payOrder(String orderSn, HttpHeaders headers) throws Exception { + + OrderPaymentForm paymentForm = new OrderPaymentForm(); + paymentForm.setOrderSn(orderSn); + paymentForm.setPaymentMethod(PaymentMethodEnum.BALANCE); + mockMvc.perform(post("/app-api/v1/orders/payment") + .headers(headers) + .contentType(MediaType.APPLICATION_JSON) + .content(objectMapper.writeValueAsString(paymentForm)) + ).andExpect(status().isOk()) + .andDo(MockMvcResultHandlers.print()); + } + + + /** + * 登录获取访问令牌 + * + * @param mobile 手机号 + * @param verifyCode 短信验证码 + * @return + */ + private String acquireTokenByLogin(String mobile, String verifyCode) { + String clientId = "mall-app"; + String clientSecret = "123456"; + String tokenUrl = "http://localhost:9000/oauth/token"; + + // 构建请求头 + HttpHeaders headers = new HttpHeaders(); + headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED); + + // 构建请求体 + MultiValueMap requestBody = new LinkedMultiValueMap<>(); + requestBody.add("grant_type", "sms_code"); + requestBody.add("client_id", clientId); + requestBody.add("client_secret", clientSecret); + requestBody.add("mobile", mobile); + requestBody.add("code", verifyCode); + + // 创建 Basic Auth 头部 + String authHeader = clientId + ":" + clientSecret; + String encodedAuthHeader = Base64.getEncoder().encodeToString(authHeader.getBytes()); + headers.set("Authorization", "Basic " + encodedAuthHeader); + + // 创建请求实体 + HttpEntity> requestEntity = new HttpEntity<>(requestBody, headers); + + // 发送请求 + String jsonStr = restTemplate.postForEntity(tokenUrl, requestEntity, String.class).getBody(); + + return JSONUtil.parseObj(jsonStr).getJSONObject("data").getStr("access_token"); + } + + +} diff --git a/mall-oms/oms-boot/src/test/java/com/youlai/mall/oms/controller/RabbitMQTest.java b/mall-oms/oms-boot/src/test/java/com/youlai/mall/oms/controller/RabbitMQTest.java deleted file mode 100644 index 686be2bd9..000000000 --- a/mall-oms/oms-boot/src/test/java/com/youlai/mall/oms/controller/RabbitMQTest.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.youlai.mall.oms.controller; - -import lombok.extern.slf4j.Slf4j; -import org.junit.jupiter.api.Test; -import org.springframework.amqp.rabbit.core.RabbitTemplate; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.context.SpringBootTest; - -@SpringBootTest -@Slf4j -public class RabbitMQTest { - - @Autowired - private RabbitTemplate rabbitTemplate; - - @Test - public void payOrderTest() { - rabbitTemplate.convertAndSend("order.exchange", "order.create.routing.key", "4acd475a-c6aa-4d9a-a3a5-40da7472cbee"); - } -} diff --git a/mall-oms/oms-boot/src/test/java/com/youlai/mall/oms/service/admin/impl/OmsOrderServiceImplTest.java b/mall-oms/oms-boot/src/test/java/com/youlai/mall/oms/service/admin/impl/OmsOrderServiceImplTest.java new file mode 100644 index 000000000..4b94789b1 --- /dev/null +++ b/mall-oms/oms-boot/src/test/java/com/youlai/mall/oms/service/admin/impl/OmsOrderServiceImplTest.java @@ -0,0 +1,36 @@ +package com.youlai.mall.oms.service.admin.impl; + +import cn.hutool.core.date.DateUtil; +import cn.hutool.json.JSONUtil; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.youlai.mall.oms.model.query.OrderPageQuery; +import com.youlai.mall.oms.model.vo.OmsOrderPageVO; +import com.youlai.mall.oms.service.admin.OmsOrderService; +import lombok.extern.slf4j.Slf4j; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; + +@SpringBootTest +@Slf4j +class OmsOrderServiceImplTest { + + @Autowired + private OmsOrderService omsOrderService; + + @Test + void testGetOrderPage() { + OrderPageQuery queryParams = new OrderPageQuery(); + queryParams.setPageNum(1); + queryParams.setPageSize(10); + queryParams.setBeginDate(DateUtil.parseDate("2022-01-01")); + queryParams.setEndDate(DateUtil.parseDate("2025-01-01")); + + IPage orderPage = omsOrderService.getOrderPage(queryParams); + + log.info(JSONUtil.toJsonStr(orderPage)); + + } + + +} \ No newline at end of file diff --git a/mall-oms/oms-boot/src/test/java/com/youlai/mall/oms/service/app/impl/OrderServiceImplTest.java b/mall-oms/oms-boot/src/test/java/com/youlai/mall/oms/service/app/impl/OrderServiceImplTest.java new file mode 100644 index 000000000..022a719a6 --- /dev/null +++ b/mall-oms/oms-boot/src/test/java/com/youlai/mall/oms/service/app/impl/OrderServiceImplTest.java @@ -0,0 +1,35 @@ +package com.youlai.mall.oms.service.app.impl; + +import cn.hutool.core.date.DateUtil; +import cn.hutool.json.JSONUtil; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.youlai.mall.oms.model.query.OrderPageQuery; +import com.youlai.mall.oms.model.vo.OrderPageVO; +import com.youlai.mall.oms.service.app.OrderService; +import lombok.extern.slf4j.Slf4j; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; + +@SpringBootTest +@Slf4j +class OrderServiceImplTest { + + @Autowired + private OrderService orderService; + + @Test + void testGetOrderPage() { + OrderPageQuery queryParams = new OrderPageQuery(); + queryParams.setPageNum(1); + queryParams.setPageSize(10); + queryParams.setBeginDate(DateUtil.parseDate("2022-01-01")); + queryParams.setEndDate(DateUtil.parseDate("2025-01-01")); + + IPage orderPage = orderService.getOrderPage(queryParams); + + log.info(JSONUtil.toJsonStr(orderPage)); + + } + +} \ No newline at end of file diff --git a/mall-oms/pom.xml b/mall-oms/pom.xml index fd8792a36..03447ed0f 100644 --- a/mall-oms/pom.xml +++ b/mall-oms/pom.xml @@ -5,7 +5,7 @@ youlai-mall com.youlai - 2.2.0 + 2.4.1 4.0.0 diff --git a/mall-pms/pms-api/pom.xml b/mall-pms/pms-api/pom.xml index 3fe16ce1c..58ad99d73 100644 --- a/mall-pms/pms-api/pom.xml +++ b/mall-pms/pms-api/pom.xml @@ -5,18 +5,25 @@ mall-pms com.youlai - 2.2.0 + 2.4.1 4.0.0 pms-api + com.youlai common-core + + com.youlai + common-web + true + + com.baomidou mybatis-plus-boot-starter diff --git a/mall-pms/pms-api/src/main/java/com/youlai/mall/pms/api/SkuFeignClient.java b/mall-pms/pms-api/src/main/java/com/youlai/mall/pms/api/SkuFeignClient.java index 2d2764af6..b73bf79da 100644 --- a/mall-pms/pms-api/src/main/java/com/youlai/mall/pms/api/SkuFeignClient.java +++ b/mall-pms/pms-api/src/main/java/com/youlai/mall/pms/api/SkuFeignClient.java @@ -1,66 +1,54 @@ package com.youlai.mall.pms.api; -import com.youlai.common.result.Result; -import com.youlai.mall.pms.pojo.dto.CheckPriceDTO; -import com.youlai.mall.pms.pojo.dto.SkuDTO; -import com.youlai.mall.pms.pojo.dto.LockStockDTO; +import com.youlai.common.web.config.FeignConfig; +import com.youlai.common.web.config.FeignDecoderConfig; +import com.youlai.mall.pms.pojo.dto.SkuInfoDTO; +import com.youlai.mall.pms.pojo.dto.LockedSkuDTO; import org.springframework.cloud.openfeign.FeignClient; import org.springframework.web.bind.annotation.*; +import java.util.List; -@FeignClient(value = "mall-pms", contextId = "sku") -public interface SkuFeignClient { - /** - * 获取商品库存单元信息 - */ - @GetMapping("/app-api/v1/sku/{skuId}/info") - Result getSkuInfo(@PathVariable Long skuId); - - /** - * 锁定商品库存 - */ - @PutMapping("/app-api/v1/sku/_lock") - Result lockStock(@RequestBody LockStockDTO lockStockDTO); +@FeignClient(value = "mall-pms", contextId = "sku", configuration = {FeignDecoderConfig.class}) +public interface SkuFeignClient { /** - * 解锁商品库存 + * 获取商品库存信息 */ - @PutMapping("/app-api/v1/sku/_unlock") - Result unlockStock(@RequestParam String orderSn); + @GetMapping("/app-api/v1/skus/{skuId}") + SkuInfoDTO getSkuInfo(@PathVariable Long skuId); /** - * 扣减订单商品库存 + * 获取商品库存信息列表 + * + * @param skuIds SKU ID 列表 + * @return 商品库存信息列表 */ - @PutMapping("/app-api/v1/sku/_deduct") - Result deductStock(@RequestParam String orderSn); + @GetMapping("/app-api/v1/skus") + List getSkuInfoList(@RequestParam List skuIds); /** - * 订单商品验价 - * - * @param checkPriceDTO + * 锁定商品库存 */ - @PostMapping("/app-api/v1/sku/price/_check") - Result checkPrice(@RequestBody CheckPriceDTO checkPriceDTO); + @PutMapping("/app-api/v1/skus/lock") + boolean lockStock(@RequestParam String orderToken, @RequestBody List lockedSkuList); /** - * 「实验室」重置商品库存 - * - * @param skuId - * @return + * 解锁商品库存 */ - @PutMapping("/api/v1/sku/{skuId}/stock/_reset") - Result resetStock(@PathVariable Long skuId); - + @PutMapping("/app-api/v1/skus/unlock") + boolean unlockStock(@RequestParam String orderSn); /** - * 「实验室」扣减商品库存 + * 扣减订单商品库存 + *

+ * 扣减指定订单商品的库存数量。 * - * @param skuId - * @param count 扣减数量 - * @return + * @param orderSn 订单编号 + * @return 扣减库存结果 */ - @PutMapping("/api/v1/sku/{skuId}/stock/_deduct") - Result deductStock(@PathVariable Long skuId, @RequestParam Integer count); + @PutMapping("/app-api/v1/skus/deduct") + boolean deductStock(@RequestParam String orderSn); } diff --git a/mall-pms/pms-api/src/main/java/com/youlai/mall/pms/pojo/dto/CheckPriceDTO.java b/mall-pms/pms-api/src/main/java/com/youlai/mall/pms/pojo/dto/CheckPriceDTO.java index 2a547d089..4867c96e6 100644 --- a/mall-pms/pms-api/src/main/java/com/youlai/mall/pms/pojo/dto/CheckPriceDTO.java +++ b/mall-pms/pms-api/src/main/java/com/youlai/mall/pms/pojo/dto/CheckPriceDTO.java @@ -19,20 +19,15 @@ @ToString public class CheckPriceDTO { - /** - * 订单编号 - */ - private String orderSn; - /** * 订单总金额 */ - private Long orderTotalAmount; + private Long totalAmount; /** * 订单商品明细 */ - private List orderSkus; + private List skus; /** * 订单商品对象 diff --git a/mall-pms/pms-api/src/main/java/com/youlai/mall/pms/pojo/dto/LockStockDTO.java b/mall-pms/pms-api/src/main/java/com/youlai/mall/pms/pojo/dto/LockStockDTO.java deleted file mode 100644 index 92f8a78a8..000000000 --- a/mall-pms/pms-api/src/main/java/com/youlai/mall/pms/pojo/dto/LockStockDTO.java +++ /dev/null @@ -1,49 +0,0 @@ -package com.youlai.mall.pms.pojo.dto; - -import lombok.AllArgsConstructor; -import lombok.Data; -import lombok.NoArgsConstructor; -import lombok.ToString; - -import java.util.List; - -/** - * 锁定库存传输对象 - * - * @author haoxr - * @date 2022/12/20 - */ -@Data -@ToString -@NoArgsConstructor -@AllArgsConstructor -public class LockStockDTO { - - /** - * 订单编号 - */ - private String orderSn; - - /** - * 锁定商品集合 - */ - private List lockedSkus; - - @Data - @AllArgsConstructor - @NoArgsConstructor - public static class LockedSku { - - /** - * 锁定商品ID - */ - private Long skuId; - - /** - * 商品数量 - */ - private Integer count; - - } - -} diff --git a/mall-pms/pms-api/src/main/java/com/youlai/mall/pms/pojo/dto/LockedSkuDTO.java b/mall-pms/pms-api/src/main/java/com/youlai/mall/pms/pojo/dto/LockedSkuDTO.java new file mode 100644 index 000000000..eaa34215c --- /dev/null +++ b/mall-pms/pms-api/src/main/java/com/youlai/mall/pms/pojo/dto/LockedSkuDTO.java @@ -0,0 +1,38 @@ +package com.youlai.mall.pms.pojo.dto; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; +import lombok.ToString; + + +/** + * 锁定库存传输对象 + * + * @author haoxr + * @since 2.0.0 + */ +@Data +@NoArgsConstructor +@AllArgsConstructor +public class LockedSkuDTO { + + /** + * 商品ID + */ + private Long skuId; + + /** + * 商品数量 + */ + private Integer quantity; + + + /** + * 商品编码 + */ + private String skuSn; + + + +} diff --git a/mall-pms/pms-api/src/main/java/com/youlai/mall/pms/pojo/dto/SkuDTO.java b/mall-pms/pms-api/src/main/java/com/youlai/mall/pms/pojo/dto/SkuInfoDTO.java similarity index 67% rename from mall-pms/pms-api/src/main/java/com/youlai/mall/pms/pojo/dto/SkuDTO.java rename to mall-pms/pms-api/src/main/java/com/youlai/mall/pms/pojo/dto/SkuInfoDTO.java index 026cbb4da..f4e5d71b6 100644 --- a/mall-pms/pms-api/src/main/java/com/youlai/mall/pms/pojo/dto/SkuDTO.java +++ b/mall-pms/pms-api/src/main/java/com/youlai/mall/pms/pojo/dto/SkuInfoDTO.java @@ -3,18 +3,20 @@ import lombok.Data; /** - * SKU信息传输对象 + * 商品库存信息DTO + *

+ * 用于表示商品的库存信息。 * * @author haoxr - * @date 2022/2/5 23:09 + * @since 2.0.0 */ @Data -public class SkuDTO { +public class SkuInfoDTO { /** - * skuId + * SKU的唯一标识符 */ - private Long skuId; + private Long id; /** * SKU 编号 */ @@ -34,9 +36,9 @@ public class SkuDTO { /** * SKU 库存数量 */ - private Integer stockNum; + private Integer stock; /** - * SPU 名称 + * 所属SPU的名称 */ private String spuName; } diff --git a/mall-pms/pms-boot/pom.xml b/mall-pms/pms-boot/pom.xml index 694a48749..c51e6a69f 100644 --- a/mall-pms/pms-boot/pom.xml +++ b/mall-pms/pms-boot/pom.xml @@ -5,7 +5,7 @@ mall-pms com.youlai - 2.2.0 + 2.4.1 4.0.0 diff --git a/mall-pms/pms-boot/src/main/java/com/youlai/mall/pms/common/constant/ProductConstants.java b/mall-pms/pms-boot/src/main/java/com/youlai/mall/pms/common/constant/ProductConstants.java index 39c5f0bd1..dbab547ff 100644 --- a/mall-pms/pms-boot/src/main/java/com/youlai/mall/pms/common/constant/ProductConstants.java +++ b/mall-pms/pms-boot/src/main/java/com/youlai/mall/pms/common/constant/ProductConstants.java @@ -1,22 +1,22 @@ package com.youlai.mall.pms.common.constant; /** - * 商品模块常量 + * 商品常量 * * @author haoxr - * @date 2021/02/28 + * @since 2.0.0 */ public interface ProductConstants { /** - * 订单锁定的商品列表key前缀 + * 锁定的商品列表缓存键前缀 */ - String ORDER_LOCKED_SKUS_PREFIX = "order:locked:skus:"; + String LOCKED_SKUS_PREFIX = "product:locked_skus:"; /** - * 商品分布式锁key前缀 + * 商品分布式锁缓存键前缀 */ - String SKU_LOCK_PREFIX = "product:sku:lock:"; + String SKU_LOCK_PREFIX = "product:sku_lock:"; /** * 临时规格ID前缀 diff --git a/mall-pms/pms-boot/src/main/java/com/youlai/mall/pms/controller/admin/PmsSkuController.java b/mall-pms/pms-boot/src/main/java/com/youlai/mall/pms/controller/admin/PmsSkuController.java index 6b872c701..5ff1cdfda 100644 --- a/mall-pms/pms-boot/src/main/java/com/youlai/mall/pms/controller/admin/PmsSkuController.java +++ b/mall-pms/pms-boot/src/main/java/com/youlai/mall/pms/controller/admin/PmsSkuController.java @@ -1,10 +1,11 @@ package com.youlai.mall.pms.controller.admin; -import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.youlai.common.result.Result; import com.youlai.mall.pms.pojo.entity.PmsSku; import com.youlai.mall.pms.service.SkuService; -import io.swagger.annotations.*; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import io.swagger.annotations.ApiParam; import lombok.RequiredArgsConstructor; import org.springframework.web.bind.annotation.*; @@ -12,7 +13,7 @@ * 「管理端」商品SKU控制层 * * @author haoxr - * @date 2022/2/8 + * @since 2022/2/8 */ @Api(tags = "「管理端」商品SKU接口") @RestController @@ -40,30 +41,4 @@ public Result updateSku( return Result.judge(result); } - @ApiOperation(value = "「实验室」扣减库存数量", hidden = true) - @PutMapping(value = "/{skuId}/stock/_deduct") - public Result deductStock( - @PathVariable Long skuId, - @RequestParam Integer count - - ) { - boolean result = skuService.update(new LambdaUpdateWrapper() - .setSql("stock_num = stock_num - " + count) - .eq(PmsSku::getId, skuId) - ); - return Result.judge(result); - } - - @ApiOperation(value = "「实验室」重置库存数量", hidden = true) - @PutMapping(value = "/{skuId}/stock/_reset") - public Result resetStock( - @PathVariable Long skuId - ) { - boolean result = skuService.update(new LambdaUpdateWrapper() - .eq(PmsSku::getId,skuId) - .set(PmsSku::getStockNum,999) - ); - return Result.judge(result); - } - } diff --git a/mall-pms/pms-boot/src/main/java/com/youlai/mall/pms/controller/admin/PmsSpuController.java b/mall-pms/pms-boot/src/main/java/com/youlai/mall/pms/controller/admin/PmsSpuController.java index ccf880891..8858868b4 100644 --- a/mall-pms/pms-boot/src/main/java/com/youlai/mall/pms/controller/admin/PmsSpuController.java +++ b/mall-pms/pms-boot/src/main/java/com/youlai/mall/pms/controller/admin/PmsSpuController.java @@ -30,8 +30,8 @@ public class PmsSpuController { @ApiOperation(value = "商品分页列表") @GetMapping("/pages") - public PageResult listPmsSpuPages(SpuPageQuery queryParams) { - IPage result = spuServiced.listPmsSpuPages(queryParams); + public PageResult getSpuPage(SpuPageQuery queryParams) { + IPage result = spuServiced.getSpuPage(queryParams); return PageResult.success(result); } diff --git a/mall-pms/pms-boot/src/main/java/com/youlai/mall/pms/controller/app/SkuController.java b/mall-pms/pms-boot/src/main/java/com/youlai/mall/pms/controller/app/SkuController.java index db268abc7..1f35c3fbd 100644 --- a/mall-pms/pms-boot/src/main/java/com/youlai/mall/pms/controller/app/SkuController.java +++ b/mall-pms/pms-boot/src/main/java/com/youlai/mall/pms/controller/app/SkuController.java @@ -1,9 +1,8 @@ package com.youlai.mall.pms.controller.app; import com.youlai.common.result.Result; -import com.youlai.mall.pms.pojo.dto.CheckPriceDTO; -import com.youlai.mall.pms.pojo.dto.SkuDTO; -import com.youlai.mall.pms.pojo.dto.LockStockDTO; +import com.youlai.mall.pms.pojo.dto.SkuInfoDTO; +import com.youlai.mall.pms.pojo.dto.LockedSkuDTO; import com.youlai.mall.pms.service.SkuService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; @@ -11,63 +10,61 @@ import lombok.RequiredArgsConstructor; import org.springframework.web.bind.annotation.*; +import java.util.List; + /** - * SKU控制层 + * 商品库存 * * @author haoxr - * @date 2022/12/21 + * @since 2.0.0 */ -@Api(tags = "「移动端」SKU接口") +@Api(tags = "「移动端」商品库存接口") @RestController -@RequestMapping("/app-api/v1/sku") +@RequestMapping("/app-api/v1/skus") @RequiredArgsConstructor public class SkuController { private final SkuService skuService; @ApiOperation(value = "获取商品库存信息") - @GetMapping("/{skuId}/info") - public Result getSkuInfo( + @GetMapping("/{skuId}") + public Result getSkuInfo( @ApiParam("商品ID") @PathVariable Long skuId ) { - SkuDTO skuInfo = skuService.getSkuInfo(skuId); + SkuInfoDTO skuInfo = skuService.getSkuInfo(skuId); return Result.success(skuInfo); } - @ApiOperation("获取商品库存数量") - @GetMapping("/{skuId}/stock_num") - public Result getStockNum( - @ApiParam("商品ID") @PathVariable Long skuId + @ApiOperation(value = "获取商品库存列表") + @GetMapping + public Result> getSkuInfoList( + @ApiParam("SKU ID 列表") @RequestParam List skuIds ) { - Integer stockNum = skuService.getStockNum(skuId); - return Result.success(stockNum); + List skuInfos = skuService.listSkuInfos(skuIds); + return Result.success(skuInfos); } - @ApiOperation(value = "锁定库存") - @PutMapping("/_lock") - public Result lockStock(@RequestBody LockStockDTO lockStockDTO) { - boolean lockResult = skuService.lockStock(lockStockDTO); - return Result.success(lockResult); + @ApiOperation(value = "校验并锁定库存") + @PutMapping("/lock") + public Result lockStock( + @RequestParam String orderToken, + @RequestBody List lockedSkuList + ) { + boolean lockStockResult = skuService.lockStock(orderToken,lockedSkuList); + return Result.success(lockStockResult); } @ApiOperation(value = "解锁库存") - @PutMapping("/_unlock") - public Result unlockStock(String orderToken) { + @PutMapping("/unlock") + public Result unlockStock(String orderToken) { boolean result = skuService.unlockStock(orderToken); return Result.judge(result); } @ApiOperation(value = "扣减库存") - @PutMapping("/_deduct") - public Result deductStock(String orderToken) { - boolean result = skuService.deductStock(orderToken); + @PutMapping("/deduct") + public Result deductStock(String orderSn) { + boolean result = skuService.deductStock(orderSn); return Result.judge(result); } - - @ApiOperation(value = "商品验价") - @PostMapping("/price/_check") - public Result checkPrice(@RequestBody CheckPriceDTO checkPriceDTO) { - boolean result = skuService.checkPrice(checkPriceDTO); - return Result.success(result); - } } diff --git a/mall-pms/pms-boot/src/main/java/com/youlai/mall/pms/controller/app/SpuController.java b/mall-pms/pms-boot/src/main/java/com/youlai/mall/pms/controller/app/SpuController.java index f129ac005..dd1cac5de 100644 --- a/mall-pms/pms-boot/src/main/java/com/youlai/mall/pms/controller/app/SpuController.java +++ b/mall-pms/pms-boot/src/main/java/com/youlai/mall/pms/controller/app/SpuController.java @@ -29,8 +29,8 @@ public class SpuController { @ApiOperation(value = "商品分页列表") @GetMapping("/pages") - public PageResult listSpuPages(SpuPageQuery queryParams) { - IPage result = spuService.listSpuPages(queryParams); + public PageResult getSpuPageForApp(SpuPageQuery queryParams) { + IPage result = spuService.getSpuPageForApp(queryParams); return PageResult.success(result); } diff --git a/mall-pms/pms-boot/src/main/java/com/youlai/mall/pms/converter/SkuConverter.java b/mall-pms/pms-boot/src/main/java/com/youlai/mall/pms/converter/SkuConverter.java new file mode 100644 index 000000000..de1be0afd --- /dev/null +++ b/mall-pms/pms-boot/src/main/java/com/youlai/mall/pms/converter/SkuConverter.java @@ -0,0 +1,21 @@ +package com.youlai.mall.pms.converter; + +import com.youlai.mall.pms.pojo.dto.SkuInfoDTO; +import com.youlai.mall.pms.pojo.entity.PmsSku; +import org.mapstruct.Mapper; + +import java.util.List; + +/** + * 商品对象转换器 + * + * @author haoxr + * @since 2022/6/11 + */ +@Mapper(componentModel = "spring") +public interface SkuConverter { + + SkuInfoDTO entity2SkuInfoDto(PmsSku entity); + + List entity2SkuInfoDto(List list); +} diff --git a/mall-pms/pms-boot/src/main/java/com/youlai/mall/pms/listener/StockReleaseListener.java b/mall-pms/pms-boot/src/main/java/com/youlai/mall/pms/listener/StockReleaseListener.java index ec20d91c1..bd0f7d987 100644 --- a/mall-pms/pms-boot/src/main/java/com/youlai/mall/pms/listener/StockReleaseListener.java +++ b/mall-pms/pms-boot/src/main/java/com/youlai/mall/pms/listener/StockReleaseListener.java @@ -11,10 +11,10 @@ import java.io.IOException; /** - * 商品库存释放监听器 + * 商品库存 * * @author haoxr - * @date 2022/12/20 + * @since 2022/12/20 */ @Component @RequiredArgsConstructor @@ -23,27 +23,33 @@ public class StockReleaseListener { private final SkuService skuService; - private static final String STOCK_RELEASE_QUEUE = "stock.release.queue"; + private static final String STOCK_UNLOCK_QUEUE = "stock.unlock.queue"; private static final String STOCK_EXCHANGE = "stock.exchange"; - private static final String STOCK_RELEASE_ROUTING_KEY = "stock.release.routing.key"; + private static final String STOCK_UNLOCK_ROUTING_KEY = "stock.unlock"; @RabbitListener(bindings = @QueueBinding( - value = @Queue(value = STOCK_RELEASE_QUEUE, durable = "true"), + value = @Queue(value = STOCK_UNLOCK_QUEUE, durable = "true"), exchange = @Exchange(value = STOCK_EXCHANGE), - key = {STOCK_RELEASE_ROUTING_KEY} + key = {STOCK_UNLOCK_ROUTING_KEY} ), ackMode = "MANUAL" // 手动ACK ) @RabbitHandler - public void handleStockRelease(String orderSn, Message message, Channel channel) throws IOException { - log.info("订单【{}】取消释放库存消息监听", orderSn); + public void unlockStock(String orderSn, Message message, Channel channel) { + log.info("订单({})取消释放库存", orderSn); long deliveryTag = message.getMessageProperties().getDeliveryTag(); // 消息序号 try { skuService.unlockStock(orderSn); - channel.basicAck(deliveryTag, false); + // 手动ACK确认消息并从队列移除消息 + channel.basicAck(deliveryTag, false); // false: 不批量确认,仅确认当前单个消息 } catch (Exception e) { - channel.basicReject(deliveryTag, true); + // 库存释放异常:拒绝消息并重新入队 + try { + channel.basicReject(deliveryTag, true); // true: 重新放回队列 + } catch (IOException ex) { + log.error("订单({})关闭失败,原因:{}", orderSn, ex.getMessage()); + } } } } diff --git a/mall-pms/pms-boot/src/main/java/com/youlai/mall/pms/mapper/PmsSkuMapper.java b/mall-pms/pms-boot/src/main/java/com/youlai/mall/pms/mapper/PmsSkuMapper.java index 855ac88cf..fb40f21c7 100644 --- a/mall-pms/pms-boot/src/main/java/com/youlai/mall/pms/mapper/PmsSkuMapper.java +++ b/mall-pms/pms-boot/src/main/java/com/youlai/mall/pms/mapper/PmsSkuMapper.java @@ -1,7 +1,7 @@ package com.youlai.mall.pms.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.youlai.mall.pms.pojo.dto.SkuDTO; +import com.youlai.mall.pms.pojo.dto.SkuInfoDTO; import com.youlai.mall.pms.pojo.entity.PmsSku; import org.apache.ibatis.annotations.Mapper; @@ -14,5 +14,5 @@ public interface PmsSkuMapper extends BaseMapper { * @param skuId * @return */ - SkuDTO getSkuInfo(Long skuId); + SkuInfoDTO getSkuInfo(Long skuId); } diff --git a/mall-pms/pms-boot/src/main/java/com/youlai/mall/pms/mapper/PmsSpuMapper.java b/mall-pms/pms-boot/src/main/java/com/youlai/mall/pms/mapper/PmsSpuMapper.java index 5acba09e3..964658b3f 100644 --- a/mall-pms/pms-boot/src/main/java/com/youlai/mall/pms/mapper/PmsSpuMapper.java +++ b/mall-pms/pms-boot/src/main/java/com/youlai/mall/pms/mapper/PmsSpuMapper.java @@ -20,7 +20,7 @@ public interface PmsSpuMapper extends BaseMapper { * @param queryParams * @return */ - List listPmsSpuPages(Page page, SpuPageQuery queryParams); + List getSpuPage(Page page, SpuPageQuery queryParams); /** * 「应用端」商品分页列表 @@ -29,7 +29,7 @@ public interface PmsSpuMapper extends BaseMapper { * @param queryParams * @return */ - List listSpuPages(Page page, SpuPageQuery queryParams); + List getSpuPageForApp(Page page, SpuPageQuery queryParams); } diff --git a/mall-pms/pms-boot/src/main/java/com/youlai/mall/pms/pojo/entity/PmsSku.java b/mall-pms/pms-boot/src/main/java/com/youlai/mall/pms/pojo/entity/PmsSku.java index eb63e415a..17b7f7c1f 100644 --- a/mall-pms/pms-boot/src/main/java/com/youlai/mall/pms/pojo/entity/PmsSku.java +++ b/mall-pms/pms-boot/src/main/java/com/youlai/mall/pms/pojo/entity/PmsSku.java @@ -45,12 +45,12 @@ public class PmsSku extends BaseEntity { /** * 库存数量 */ - private Integer stockNum; + private Integer stock; /** * 锁定库存数量 */ - private Integer lockedStockNum; + private Integer lockedStock; /** * 商品图片地址 diff --git a/mall-pms/pms-boot/src/main/java/com/youlai/mall/pms/pojo/vo/SpuDetailVO.java b/mall-pms/pms-boot/src/main/java/com/youlai/mall/pms/pojo/vo/SpuDetailVO.java index 8741e3d3b..df8f6248b 100644 --- a/mall-pms/pms-boot/src/main/java/com/youlai/mall/pms/pojo/vo/SpuDetailVO.java +++ b/mall-pms/pms-boot/src/main/java/com/youlai/mall/pms/pojo/vo/SpuDetailVO.java @@ -103,7 +103,7 @@ public static class Sku { private Long price; @ApiModelProperty("库存") - private Integer stockNum; + private Integer stock; @ApiModelProperty("商品图片URL") private String picUrl; diff --git a/mall-pms/pms-boot/src/main/java/com/youlai/mall/pms/service/SkuService.java b/mall-pms/pms-boot/src/main/java/com/youlai/mall/pms/service/SkuService.java index b6a96cc47..7f4a1a5c5 100644 --- a/mall-pms/pms-boot/src/main/java/com/youlai/mall/pms/service/SkuService.java +++ b/mall-pms/pms-boot/src/main/java/com/youlai/mall/pms/service/SkuService.java @@ -1,41 +1,45 @@ package com.youlai.mall.pms.service; import com.baomidou.mybatisplus.extension.service.IService; -import com.youlai.mall.pms.pojo.dto.CheckPriceDTO; -import com.youlai.mall.pms.pojo.dto.SkuDTO; +import com.youlai.mall.pms.pojo.dto.SkuInfoDTO; import com.youlai.mall.pms.pojo.entity.PmsSku; -import com.youlai.mall.pms.pojo.dto.LockStockDTO; +import com.youlai.mall.pms.pojo.dto.LockedSkuDTO; + +import java.util.List; /** - * 商品库存单元接口 + * 商品库存接口 * * @author haoxr - * @date 2022/2/5 17:11 + * @since 2.0.0 */ public interface SkuService extends IService { /** - * 获取商品的库存数量 + * 获取商品库存信息 * - * @param skuId - * @return + * @param skuId SKU ID + * @return 商品库存信息 */ - Integer getStockNum(Long skuId); + SkuInfoDTO getSkuInfo(Long skuId); /** - * 获取商品库存信息 + * 获取商品库存信息列表 * - * @param skuId - * @return + * @param skuIds SKU ID 列表 + * @return 商品库存信息列表 */ - SkuDTO getSkuInfo(Long skuId); - + List listSkuInfos(List skuIds); /** - * 锁定库存 + * 校验并锁定库存 + * + * @param orderToken 订单临时编号 (此时订单未创建) + * @param lockedSkuList 锁定商品库存信息列表 + * @return true/false */ - boolean lockStock(LockStockDTO lockStockDTO); + boolean lockStock(String orderToken,List lockedSkuList); /** * 解锁库存 @@ -48,30 +52,4 @@ public interface SkuService extends IService { boolean deductStock(String orderSn); - /** - * 商品验价 - * - * @param checkPriceDTO - * @return - */ - boolean checkPrice(CheckPriceDTO checkPriceDTO); - - - /** - * 「实验室」修改商品库存数量 - * - * @param skuId - * @param stockNum 商品库存数量 - * @return - */ - boolean updateStockNum(Long skuId, Integer stockNum); - - /** - * 「实验室」扣减商品库存 - * - * @param skuId - * @param num 商品库存数量 - * @return - */ - boolean deductStock(Long skuId, Integer num); } diff --git a/mall-pms/pms-boot/src/main/java/com/youlai/mall/pms/service/SpuService.java b/mall-pms/pms-boot/src/main/java/com/youlai/mall/pms/service/SpuService.java index 88568bf06..316f71141 100644 --- a/mall-pms/pms-boot/src/main/java/com/youlai/mall/pms/service/SpuService.java +++ b/mall-pms/pms-boot/src/main/java/com/youlai/mall/pms/service/SpuService.java @@ -24,7 +24,7 @@ public interface SpuService extends IService { * @param queryParams * @return */ - IPage listPmsSpuPages(SpuPageQuery queryParams); + IPage getSpuPage(SpuPageQuery queryParams); /** * 「应用端」商品分页列表 @@ -32,7 +32,7 @@ public interface SpuService extends IService { * @param queryParams * @return */ - IPage listSpuPages(SpuPageQuery queryParams); + IPage getSpuPageForApp(SpuPageQuery queryParams); /** diff --git a/mall-pms/pms-boot/src/main/java/com/youlai/mall/pms/service/impl/SkuServiceImpl.java b/mall-pms/pms-boot/src/main/java/com/youlai/mall/pms/service/impl/SkuServiceImpl.java index c44ba3402..6a5ce9445 100644 --- a/mall-pms/pms-boot/src/main/java/com/youlai/mall/pms/service/impl/SkuServiceImpl.java +++ b/mall-pms/pms-boot/src/main/java/com/youlai/mall/pms/service/impl/SkuServiceImpl.java @@ -2,33 +2,32 @@ import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.lang.Assert; +import cn.hutool.json.JSONUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.youlai.mall.pms.common.constant.ProductConstants; +import com.youlai.mall.pms.converter.SkuConverter; import com.youlai.mall.pms.mapper.PmsSkuMapper; -import com.youlai.mall.pms.pojo.dto.CheckPriceDTO; -import com.youlai.mall.pms.pojo.dto.SkuDTO; -import com.youlai.mall.pms.pojo.dto.LockStockDTO; +import com.youlai.mall.pms.pojo.dto.SkuInfoDTO; +import com.youlai.mall.pms.pojo.dto.LockedSkuDTO; import com.youlai.mall.pms.pojo.entity.PmsSku; import com.youlai.mall.pms.service.SkuService; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.redisson.api.RLock; import org.redisson.api.RedissonClient; -import org.springframework.cache.annotation.Cacheable; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.util.List; -import java.util.stream.Collectors; /** - * 商品SKU业务实现类 + * 商品库存业务实现类 * * @author haoxr - * @date 2022/12/21 + * @since 2022/12/21 */ @Service @Slf4j @@ -37,68 +36,68 @@ public class SkuServiceImpl extends ServiceImpl implements private final RedisTemplate redisTemplate; private final RedissonClient redissonClient; + private final SkuConverter skuConverter; + /** - * 获取商品库存数量 + * 获取商品库存信息 * - * @param skuId - * @return + * @param skuId SKU ID + * @return 商品库存信息 */ @Override - @Cacheable(cacheNames = "pms", key = "'stock_num:'+#skuId") - public Integer getStockNum(Long skuId) { + public SkuInfoDTO getSkuInfo(Long skuId) { + return this.baseMapper.getSkuInfo(skuId); + } - PmsSku pmsSku = this.getOne(new LambdaQueryWrapper().eq(PmsSku::getId, skuId) - .select(PmsSku::getStockNum)); - Integer stockNum = pmsSku != null ? pmsSku.getStockNum() : 0; - return stockNum; + /** + * 获取商品库存信息列表 + * + * @param skuIds SKU ID 列表 + * @return 商品库存信息列表 + */ + @Override + public List listSkuInfos(List skuIds) { + List list = this.list(new LambdaQueryWrapper().in(PmsSku::getId, skuIds)); + return skuConverter.entity2SkuInfoDto(list); } /** - * 锁定库存 + * 校验并锁定库存 * - * @param lockStock 订单编号 + 锁定商品集合 + * @param orderToken 订单临时编号 (此时订单未创建) + * @param lockedSkuList 锁定商品库存信息列表 * @return true/false */ @Override @Transactional - public boolean lockStock(LockStockDTO lockStock) { - String orderSn = lockStock.getOrderSn(); - log.info("创建订单【{}】锁定商品库存:{}", orderSn, lockStock); - - List lockedSkus = lockStock.getLockedSkus(); + public boolean lockStock(String orderToken, List lockedSkuList) { + Assert.isTrue(CollectionUtil.isNotEmpty(lockedSkuList), "订单({})未包含任何商品", orderToken); - Assert.isTrue(CollectionUtil.isNotEmpty(lockedSkus), "锁定的商品为空"); - - // 循环遍历锁定商品 - for (LockStockDTO.LockedSku lockedSku : lockedSkus) { - // 获取商品分布式锁 - RLock lock = redissonClient.getLock(ProductConstants.SKU_LOCK_PREFIX + lockedSku.getSkuId()); - // 加锁 - lock.lock(); + // 校验库存数量是否足够以及锁定库存 + for (LockedSkuDTO lockedSku : lockedSkuList) { + Long skuId = lockedSku.getSkuId(); + RLock lock = redissonClient.getLock(ProductConstants.SKU_LOCK_PREFIX + skuId); // 构建商品锁对象 try { + lock.lock(); + + Integer quantity = lockedSku.getQuantity(); // 订单的商品数量 + // 库存足够 boolean lockResult = this.update(new LambdaUpdateWrapper() - .setSql("locked_stock_num = locked_stock_num + " + lockedSku.getCount()) + .setSql("locked_stock = locked_stock + " + quantity) // 修改锁定商品数 .eq(PmsSku::getId, lockedSku.getSkuId()) - .apply("stock_num - locked_stock_num >= {0}", lockedSku.getCount()) + .apply("stock - locked_stock >= {0}", quantity) // 剩余商品数 ≥ 订单商品数 ); - Assert.isTrue(lockResult, "锁定商品 {} 失败", lockedSku.getSkuId()); + Assert.isTrue(lockResult, "商品({})库存不足", lockedSku.getSkuSn()); } finally { - // 释放锁 if (lock.isLocked()) { lock.unlock(); } } } - /** - * 将锁定的商品和数量缓存至Redis,用于后续的场景: - * - * 1.订单取消解锁库存; - * 2.订单支付扣减库存。 - */ - - redisTemplate.opsForValue().set(ProductConstants.ORDER_LOCKED_SKUS_PREFIX + orderSn, lockedSkus); + // 锁定的商品缓存至 Redis (后续使用:1.取消订单解锁库存;2:支付订单扣减库存) + redisTemplate.opsForValue().set(ProductConstants.LOCKED_SKUS_PREFIX + orderToken, lockedSkuList); return true; } @@ -107,169 +106,75 @@ public boolean lockStock(LockStockDTO lockStock) { *

* 订单超时未支付,释放锁定的商品库存 * + * @param orderSn 订单号 * @return true/false */ @Override public boolean unlockStock(String orderSn) { - log.info("订单取消:释放订单【{}】锁定的商品库存", orderSn); - List lockedSkus = (List) redisTemplate.opsForValue() - .get(ProductConstants.ORDER_LOCKED_SKUS_PREFIX + orderSn); + List lockedSkus = (List) redisTemplate.opsForValue().get(ProductConstants.LOCKED_SKUS_PREFIX + orderSn); + log.info("释放订单({})锁定的商品库存:{}", orderSn, JSONUtil.toJsonStr(lockedSkus)); - // 遍历解锁商品 - if (CollectionUtil.isNotEmpty(lockedSkus)) { - for (LockStockDTO.LockedSku lockedSku : lockedSkus) { - // 获取商品分布式锁 - RLock lock = redissonClient.getLock(ProductConstants.SKU_LOCK_PREFIX + lockedSku.getSkuId()); - // 加锁 + // 库存已释放 + if (CollectionUtil.isEmpty(lockedSkus)) { + return true; + } + + // 遍历恢复锁定的商品库存 + for (LockedSkuDTO lockedSku : lockedSkus) { + RLock lock = redissonClient.getLock(ProductConstants.SKU_LOCK_PREFIX + lockedSku.getSkuId()); // 获取商品分布式锁 + try { lock.lock(); - try { - this.update(new LambdaUpdateWrapper() - .eq(PmsSku::getId, lockedSku.getSkuId()) - .setSql("locked_stock_num = locked_stock_num - " + lockedSku.getCount())); - } finally { - // 释放锁 - if (lock.isLocked()) { - lock.unlock(); - } + this.update(new LambdaUpdateWrapper() + .setSql("locked_stock = locked_stock - " + lockedSku.getQuantity()) + .eq(PmsSku::getId, lockedSku.getSkuId()) + ); + } finally { + if (lock.isLocked()) { + lock.unlock(); } } } - - // 移除订单的商品信息缓存 - redisTemplate.delete(ProductConstants.ORDER_LOCKED_SKUS_PREFIX + orderSn); + // 移除 redis 订单锁定的商品 + redisTemplate.delete(ProductConstants.LOCKED_SKUS_PREFIX + orderSn); return true; } /** * 扣减库存 *

- * 订单支付完成扣减订单商品库存和释放锁定的库存 + * 订单支付扣减商品库存和释放锁定库存 * * @param orderSn 订单编号 * @return ture/false */ @Override public boolean deductStock(String orderSn) { - log.info("订单【{}】支付成功:扣减订单商品库存", orderSn); - // 获取订单提交时锁定的商品 - List lockedSkus = (List) redisTemplate.opsForValue() - .get(ProductConstants.ORDER_LOCKED_SKUS_PREFIX + orderSn); + List lockedSkus = (List) redisTemplate.opsForValue().get(ProductConstants.LOCKED_SKUS_PREFIX + orderSn); + log.info("订单({})支付成功,扣减订单商品库存:{}", orderSn, JSONUtil.toJsonStr(lockedSkus)); + + Assert.isTrue(CollectionUtil.isNotEmpty(lockedSkus), "扣减商品库存失败:订单({})未包含商品"); + + for (LockedSkuDTO lockedSku : lockedSkus) { - if (CollectionUtil.isNotEmpty(lockedSkus)) { + RLock lock = redissonClient.getLock(ProductConstants.SKU_LOCK_PREFIX + lockedSku.getSkuId()); // 获取商品分布式锁 - for (LockStockDTO.LockedSku lockedSku : lockedSkus) { - // 获取商品分布式锁 - RLock lock = redissonClient.getLock(ProductConstants.SKU_LOCK_PREFIX + lockedSku.getSkuId()); - // 加锁 + try { lock.lock(); - try { - this.update(new LambdaUpdateWrapper() - .eq(PmsSku::getId, lockedSku.getSkuId()) - .setSql("stock_num = stock_num - " + lockedSku.getCount()) - .setSql("locked_stock_num = locked_stock_num - " + lockedSku.getCount()) - ); - } finally { - // 释放锁 - if (lock.isLocked()) { - lock.unlock(); - } + this.update(new LambdaUpdateWrapper() + .setSql("stock = stock - " + lockedSku.getQuantity()) + .setSql("locked_stock = locked_stock - " + lockedSku.getQuantity()) + .eq(PmsSku::getId, lockedSku.getSkuId()) + ); + } finally { + if (lock.isLocked()) { + lock.unlock(); } } - } - // 移除订单的商品缓存 - redisTemplate.delete(ProductConstants.ORDER_LOCKED_SKUS_PREFIX + orderSn); - return true; - } - - /** - * 订单商品验价 - *

- * 判断订单总金额和订单商品实时价格之和是否相等 - * 不相等:商品实时价格和页面价格不等,订单无效 - * - * @param checkPrice 验价参数(订单总金额、订单商品明细) - * @return true/false - */ - @Override - public boolean checkPrice(CheckPriceDTO checkPrice) { - log.info("订单【{}】商品验价:{}", checkPrice); - // 订单总金额 - Long orderTotalAmount = checkPrice.getOrderTotalAmount(); - // 计算商品总金额 - List orderSkus = checkPrice.getOrderSkus(); - if (orderTotalAmount == null || CollectionUtil.isEmpty(orderSkus)) { - log.warn("订单【{}】验价失败:订单总金额或订单商品为空,无法进行验价!"); - return false; - } - // 订单商品ID集合 - List orderSkuIds = orderSkus.stream().map(orderItem -> orderItem.getSkuId()) - .collect(Collectors.toList()); - // 获取商品的实时价格 - List skuList = this.list(new LambdaQueryWrapper().in(PmsSku::getId, orderSkuIds) - .select(PmsSku::getId, PmsSku::getPrice) - ); - if (CollectionUtil.isEmpty(skuList)) { - log.warn("订单【{}】验价失败:订单商品库存不存在或已下架!"); - return false; - } - // 计算商品实时总价 - Long skuTotalAmount = skuList.stream().map(sku -> { - // 获取订单中该商品数量 - CheckPriceDTO.OrderSku matchOrderSku = orderSkus.stream() - .filter(orderSku -> sku.getId().equals(orderSku.getSkuId())) - .findFirst().orElse(null); - // 单个商品实时总价 = 实时单价 * 订单该商品数量 - return matchOrderSku != null ? sku.getPrice() * matchOrderSku.getCount() : 0L; - }).reduce(0L, Long::sum); - // 比较订单总价和商品实时总价 - boolean checkPriceResult = orderTotalAmount.compareTo(skuTotalAmount) == 0; - return checkPriceResult; - } - /** - * 获取商品库存信息 - * - * @param skuId - * @return - */ - @Override - public SkuDTO getSkuInfo(Long skuId) { - SkuDTO skuInfo = this.baseMapper.getSkuInfo(skuId); - return skuInfo; - } - - /** - * 「实验室」修改商品库存数量 - * - * @param skuId - * @param stockNum 商品库存数量 - * @return - */ - @Override - @Transactional - public boolean updateStockNum(Long skuId, Integer stockNum) { - boolean result = this.update(new LambdaUpdateWrapper() - .eq(PmsSku::getId, skuId) - .set(PmsSku::getStockNum, stockNum) - ); - return result; - } - - /** - * 「实验室」扣减商品库存 - * - * @param skuId - * @param num 商品库存数量 - * @return - */ - @Override - public boolean deductStock(Long skuId, Integer num) { - boolean result = this.update(new LambdaUpdateWrapper() - .setSql("stock_num = stock_num - " + num) - .eq(PmsSku::getId, skuId) - ); - return result; + // 移除订单锁定的商品 + redisTemplate.delete(ProductConstants.LOCKED_SKUS_PREFIX + orderSn); + return true; } } diff --git a/mall-pms/pms-boot/src/main/java/com/youlai/mall/pms/service/impl/SpuServiceImpl.java b/mall-pms/pms-boot/src/main/java/com/youlai/mall/pms/service/impl/SpuServiceImpl.java index f090759b2..bed66fc25 100644 --- a/mall-pms/pms-boot/src/main/java/com/youlai/mall/pms/service/impl/SpuServiceImpl.java +++ b/mall-pms/pms-boot/src/main/java/com/youlai/mall/pms/service/impl/SpuServiceImpl.java @@ -59,9 +59,9 @@ public class SpuServiceImpl extends ServiceImpl implements * @return */ @Override - public IPage listPmsSpuPages(SpuPageQuery queryParams) { + public IPage getSpuPage(SpuPageQuery queryParams) { Page page = new Page<>(queryParams.getPageNum(), queryParams.getPageSize()); - List list = this.baseMapper.listPmsSpuPages(page, queryParams); + List list = this.baseMapper.getSpuPage(page, queryParams); page.setRecords(list); return page; } @@ -73,9 +73,9 @@ public IPage listPmsSpuPages(SpuPageQuery queryParams) { * @return */ @Override - public IPage listSpuPages(SpuPageQuery queryParams) { + public IPage getSpuPageForApp(SpuPageQuery queryParams) { Page page = new Page<>(queryParams.getPageNum(), queryParams.getPageSize()); - List list = this.baseMapper.listSpuPages(page, queryParams); + List list = this.baseMapper.getSpuPageForApp(page, queryParams); page.setRecords(list); return page; } diff --git a/mall-pms/pms-boot/src/main/resources/mapper/PmsSkuMapper.xml b/mall-pms/pms-boot/src/main/resources/mapper/PmsSkuMapper.xml index 4164a9254..1674a4098 100644 --- a/mall-pms/pms-boot/src/main/resources/mapper/PmsSkuMapper.xml +++ b/mall-pms/pms-boot/src/main/resources/mapper/PmsSkuMapper.xml @@ -12,20 +12,20 @@ pic_url , spec_ids, price , - stock_num + stock FROM pms_sku WHERE spu_id = #{id} - select - t1.id skuId, + t1.id, t1.sku_sn, concat(t2.name,' ',t1.name) skuName, t1.pic_url, t1.price, - t1.stock_num, + t1.stock, t2.name as spuName from pms_sku t1 left join pms_spu t2 on t1.spu_id = t2.id diff --git a/mall-pms/pms-boot/src/main/resources/mapper/PmsSpuMapper.xml b/mall-pms/pms-boot/src/main/resources/mapper/PmsSpuMapper.xml index a547dc525..d4a8280c2 100644 --- a/mall-pms/pms-boot/src/main/resources/mapper/PmsSpuMapper.xml +++ b/mall-pms/pms-boot/src/main/resources/mapper/PmsSpuMapper.xml @@ -4,7 +4,7 @@ "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> - + @@ -27,13 +27,13 @@ - - + + - SELECT t1.id, t1.name, @@ -65,7 +65,7 @@ - SELECT id, NAME, diff --git a/mall-pms/pom.xml b/mall-pms/pom.xml index db941c4f8..24eab7c16 100644 --- a/mall-pms/pom.xml +++ b/mall-pms/pom.xml @@ -5,7 +5,7 @@ youlai-mall com.youlai - 2.2.0 + 2.4.1 4.0.0 diff --git a/mall-sms/pom.xml b/mall-sms/pom.xml index 7b3092f3e..d4ef96a04 100644 --- a/mall-sms/pom.xml +++ b/mall-sms/pom.xml @@ -5,7 +5,7 @@ youlai-mall com.youlai - 2.2.0 + 2.4.1 4.0.0 diff --git a/mall-sms/sms-api/pom.xml b/mall-sms/sms-api/pom.xml index 3f5856dc5..4927545c0 100644 --- a/mall-sms/sms-api/pom.xml +++ b/mall-sms/sms-api/pom.xml @@ -5,7 +5,7 @@ mall-sms com.youlai - 2.2.0 + 2.4.1 4.0.0 diff --git a/mall-sms/sms-boot/pom.xml b/mall-sms/sms-boot/pom.xml index 32491c9f5..8fa26c7e1 100644 --- a/mall-sms/sms-boot/pom.xml +++ b/mall-sms/sms-boot/pom.xml @@ -5,7 +5,7 @@ mall-sms com.youlai - 2.2.0 + 2.4.1 4.0.0 diff --git a/mall-ums/pom.xml b/mall-ums/pom.xml index 4b3e1bb96..01ff92b76 100644 --- a/mall-ums/pom.xml +++ b/mall-ums/pom.xml @@ -5,7 +5,7 @@ youlai-mall com.youlai - 2.2.0 + 2.4.1 4.0.0 diff --git a/mall-ums/ums-api/pom.xml b/mall-ums/ums-api/pom.xml index 07ce27060..892490c5e 100644 --- a/mall-ums/ums-api/pom.xml +++ b/mall-ums/ums-api/pom.xml @@ -5,7 +5,7 @@ mall-ums com.youlai - 2.2.0 + 2.4.1 4.0.0 @@ -37,7 +37,7 @@ com.youlai pms-api - 2.2.0 + 2.4.1 compile diff --git a/mall-ums/ums-api/src/main/java/com/youlai/mall/ums/api/MemberFeignClient.java b/mall-ums/ums-api/src/main/java/com/youlai/mall/ums/api/MemberFeignClient.java index 12b36ec8a..dec26b19f 100644 --- a/mall-ums/ums-api/src/main/java/com/youlai/mall/ums/api/MemberFeignClient.java +++ b/mall-ums/ums-api/src/main/java/com/youlai/mall/ums/api/MemberFeignClient.java @@ -4,8 +4,8 @@ import com.youlai.mall.pms.pojo.vo.ProductHistoryVO; import com.youlai.mall.ums.dto.MemberAddressDTO; import com.youlai.mall.ums.dto.MemberAuthDTO; -import com.youlai.mall.ums.dto.MemberDTO; import com.youlai.mall.ums.dto.MemberInfoDTO; +import com.youlai.mall.ums.dto.MemberRegisterDTO; import org.springframework.cloud.openfeign.FeignClient; import org.springframework.web.bind.annotation.*; @@ -27,7 +27,7 @@ public interface MemberFeignClient { * @return */ @PostMapping("/app-api/v1/members") - Result addMember(@RequestBody MemberDTO member); + Result registerMember(@RequestBody MemberRegisterDTO member); /** * 获取会员的 openid diff --git a/mall-ums/ums-api/src/main/java/com/youlai/mall/ums/dto/MemberAddressDTO.java b/mall-ums/ums-api/src/main/java/com/youlai/mall/ums/dto/MemberAddressDTO.java index ec1157df0..3d9773500 100644 --- a/mall-ums/ums-api/src/main/java/com/youlai/mall/ums/dto/MemberAddressDTO.java +++ b/mall-ums/ums-api/src/main/java/com/youlai/mall/ums/dto/MemberAddressDTO.java @@ -1,12 +1,13 @@ package com.youlai.mall.ums.dto; +import io.swagger.annotations.ApiModelProperty; import lombok.Data; /** * 会员地址传输层对象 * * @author haoxr - * @date 2022/2/12 15:57 + * @since 2022/2/12 15:57 */ @Data public class MemberAddressDTO { @@ -15,18 +16,25 @@ public class MemberAddressDTO { private Long memberId; + @ApiModelProperty("收货人姓名") private String consigneeName; + @ApiModelProperty("收货人手机号") private String consigneeMobile; + @ApiModelProperty("省份") private String province; + @ApiModelProperty("城市") private String city; + @ApiModelProperty("区域") private String area; + @ApiModelProperty("详细地址") private String detailAddress; + @ApiModelProperty("是否默认地址(1:是;0:否)") private Integer defaulted; } diff --git a/mall-ums/ums-api/src/main/java/com/youlai/mall/ums/dto/MemberAuthDTO.java b/mall-ums/ums-api/src/main/java/com/youlai/mall/ums/dto/MemberAuthDTO.java index 19cad325c..7eb743a88 100644 --- a/mall-ums/ums-api/src/main/java/com/youlai/mall/ums/dto/MemberAuthDTO.java +++ b/mall-ums/ums-api/src/main/java/com/youlai/mall/ums/dto/MemberAuthDTO.java @@ -1,16 +1,19 @@ package com.youlai.mall.ums.dto; +import lombok.AllArgsConstructor; import lombok.Data; +import lombok.NoArgsConstructor; import lombok.experimental.Accessors; /** * 会员认证传输层对象 * * @author haoxr - * @date 2022/2/12 + * @since 2022/2/12 */ @Data -@Accessors(chain = true) +@AllArgsConstructor +@NoArgsConstructor public class MemberAuthDTO { /** diff --git a/mall-ums/ums-api/src/main/java/com/youlai/mall/ums/dto/MemberDTO.java b/mall-ums/ums-api/src/main/java/com/youlai/mall/ums/dto/MemberRegisterDTO.java similarity index 93% rename from mall-ums/ums-api/src/main/java/com/youlai/mall/ums/dto/MemberDTO.java rename to mall-ums/ums-api/src/main/java/com/youlai/mall/ums/dto/MemberRegisterDTO.java index 937f026a6..5a4e65063 100644 --- a/mall-ums/ums-api/src/main/java/com/youlai/mall/ums/dto/MemberDTO.java +++ b/mall-ums/ums-api/src/main/java/com/youlai/mall/ums/dto/MemberRegisterDTO.java @@ -11,7 +11,7 @@ * @date 2022/2/12 */ @Data -public class MemberDTO { +public class MemberRegisterDTO { private Integer gender; diff --git a/mall-ums/ums-boot/pom.xml b/mall-ums/ums-boot/pom.xml index ddc2ef366..4e4246534 100644 --- a/mall-ums/ums-boot/pom.xml +++ b/mall-ums/ums-boot/pom.xml @@ -5,7 +5,7 @@ mall-ums com.youlai - 2.2.0 + 2.4.1 4.0.0 diff --git a/mall-ums/ums-boot/src/main/java/com/youlai/mall/ums/controller/app/MemberController.java b/mall-ums/ums-boot/src/main/java/com/youlai/mall/ums/controller/app/MemberController.java index 3a8a35259..a7a8c9968 100644 --- a/mall-ums/ums-boot/src/main/java/com/youlai/mall/ums/controller/app/MemberController.java +++ b/mall-ums/ums-boot/src/main/java/com/youlai/mall/ums/controller/app/MemberController.java @@ -8,7 +8,7 @@ import com.youlai.mall.pms.pojo.vo.ProductHistoryVO; import com.youlai.mall.ums.dto.MemberAddressDTO; import com.youlai.mall.ums.dto.MemberAuthDTO; -import com.youlai.mall.ums.dto.MemberDTO; +import com.youlai.mall.ums.dto.MemberRegisterDTO; import com.youlai.mall.ums.pojo.entity.UmsMember; import com.youlai.mall.ums.pojo.vo.MemberVO; import com.youlai.mall.ums.service.IUmsMemberService; @@ -18,7 +18,6 @@ import lombok.RequiredArgsConstructor; import org.springframework.web.bind.annotation.*; -import java.util.Collections; import java.util.List; import java.util.Set; @@ -41,7 +40,7 @@ public Result getMemberById(@ApiParam("会员ID") @PathVariable Long mem @ApiOperation(value = "新增会员") @PostMapping - public Result addMember(@RequestBody MemberDTO member) { + public Result addMember(@RequestBody MemberRegisterDTO member) { Long memberId = memberService.addMember(member); return Result.success(memberId); } diff --git a/mall-ums/ums-boot/src/main/java/com/youlai/mall/ums/convert/MemberConvert.java b/mall-ums/ums-boot/src/main/java/com/youlai/mall/ums/convert/MemberConvert.java index cc0c39078..c7a6b787e 100644 --- a/mall-ums/ums-boot/src/main/java/com/youlai/mall/ums/convert/MemberConvert.java +++ b/mall-ums/ums-boot/src/main/java/com/youlai/mall/ums/convert/MemberConvert.java @@ -1,8 +1,8 @@ package com.youlai.mall.ums.convert; import com.youlai.mall.ums.dto.MemberAuthDTO; -import com.youlai.mall.ums.dto.MemberDTO; import com.youlai.mall.ums.dto.MemberInfoDTO; +import com.youlai.mall.ums.dto.MemberRegisterDTO; import com.youlai.mall.ums.pojo.entity.UmsMember; import org.mapstruct.Mapper; import org.mapstruct.Mapping; @@ -12,7 +12,7 @@ * 会员对象转换器 * * @author haoxr - * @date 2022/6/11 + * @since 2022/6/11 */ @Mapper(componentModel = "spring") public interface MemberConvert { @@ -30,5 +30,5 @@ public interface MemberConvert { MemberInfoDTO entity2MemberInfoDTO(UmsMember entity); - UmsMember dto2Entity(MemberDTO memberDTO); + UmsMember dto2Entity(MemberRegisterDTO memberDTO); } diff --git a/mall-ums/ums-boot/src/main/java/com/youlai/mall/ums/service/IUmsMemberService.java b/mall-ums/ums-boot/src/main/java/com/youlai/mall/ums/service/IUmsMemberService.java index d49fa32b2..61b870cac 100644 --- a/mall-ums/ums-boot/src/main/java/com/youlai/mall/ums/service/IUmsMemberService.java +++ b/mall-ums/ums-boot/src/main/java/com/youlai/mall/ums/service/IUmsMemberService.java @@ -7,8 +7,8 @@ import com.youlai.mall.pms.pojo.vo.ProductHistoryVO; import com.youlai.mall.ums.dto.MemberAddressDTO; import com.youlai.mall.ums.dto.MemberAuthDTO; -import com.youlai.mall.ums.dto.MemberDTO; import com.youlai.mall.ums.dto.MemberInfoDTO; +import com.youlai.mall.ums.dto.MemberRegisterDTO; import com.youlai.mall.ums.pojo.entity.UmsMember; import com.youlai.mall.ums.pojo.vo.MemberVO; @@ -51,7 +51,7 @@ public interface IUmsMemberService extends IService { * @param member * @return */ - Long addMember(MemberDTO member); + Long addMember(MemberRegisterDTO member); /** * 获取登录会员信息 diff --git a/mall-ums/ums-boot/src/main/java/com/youlai/mall/ums/service/impl/UmsMemberServiceImpl.java b/mall-ums/ums-boot/src/main/java/com/youlai/mall/ums/service/impl/UmsMemberServiceImpl.java index e7ad5c278..d4e4ef3f1 100644 --- a/mall-ums/ums-boot/src/main/java/com/youlai/mall/ums/service/impl/UmsMemberServiceImpl.java +++ b/mall-ums/ums-boot/src/main/java/com/youlai/mall/ums/service/impl/UmsMemberServiceImpl.java @@ -14,8 +14,8 @@ import com.youlai.mall.ums.convert.MemberConvert; import com.youlai.mall.ums.dto.MemberAddressDTO; import com.youlai.mall.ums.dto.MemberAuthDTO; -import com.youlai.mall.ums.dto.MemberDTO; import com.youlai.mall.ums.dto.MemberInfoDTO; +import com.youlai.mall.ums.dto.MemberRegisterDTO; import com.youlai.mall.ums.mapper.UmsMemberMapper; import com.youlai.mall.ums.pojo.entity.UmsAddress; import com.youlai.mall.ums.pojo.entity.UmsMember; @@ -118,7 +118,7 @@ public MemberAuthDTO getMemberByMobile(String mobile) { * @return */ @Override - public Long addMember(MemberDTO memberDTO) { + public Long addMember(MemberRegisterDTO memberDTO) { UmsMember umsMember = memberConvert.dto2Entity(memberDTO); boolean result = this.save(umsMember); Assert.isTrue(result, "新增会员失败"); diff --git a/pom.xml b/pom.xml index 5c81d99f0..174623995 100644 --- a/pom.xml +++ b/pom.xml @@ -6,7 +6,7 @@ com.youlai youlai-mall - 2.2.0 + 2.4.1 pom @@ -21,15 +21,12 @@ mall-ums mall-pms mall-oms - - - laboratory org.springframework.boot spring-boot-starter-parent - 2.7.11 + 2.7.15 @@ -39,7 +36,7 @@ UTF-8 1.8 - 2.7.11 + 2.7.15 youlai @@ -63,7 +60,6 @@ 1.5.0.RC1 4.1.5.B 3.0.5 - 1.6.2 9.16.1 @@ -72,7 +68,7 @@ 1.5.2 - 3.16.8 + 3.23.3 4.5.25 @@ -282,12 +278,6 @@ ${project.version} - - com.github.whvcse - easy-captcha - ${easy-captcha.version} - - com.aliyun aliyun-java-sdk-core diff --git a/youlai-auth/pom.xml b/youlai-auth/pom.xml index 20be2b37e..46cab7fd3 100644 --- a/youlai-auth/pom.xml +++ b/youlai-auth/pom.xml @@ -5,7 +5,7 @@ youlai-mall com.youlai - 2.2.0 + 2.4.1 4.0.0 diff --git a/youlai-auth/src/main/java/com/youlai/auth/extension/mobile/SmsCodeAuthenticationProvider.java b/youlai-auth/src/main/java/com/youlai/auth/extension/mobile/SmsCodeAuthenticationProvider.java index dc2fb3e7e..989e1d232 100644 --- a/youlai-auth/src/main/java/com/youlai/auth/extension/mobile/SmsCodeAuthenticationProvider.java +++ b/youlai-auth/src/main/java/com/youlai/auth/extension/mobile/SmsCodeAuthenticationProvider.java @@ -1,5 +1,6 @@ package com.youlai.auth.extension.mobile; +import cn.hutool.core.lang.Assert; import cn.hutool.core.util.StrUtil; import com.youlai.auth.userdetails.member.MemberUserDetailsServiceImpl; import com.youlai.common.constant.SecurityConstants; @@ -19,7 +20,7 @@ * 短信验证码认证授权提供者 * * @author haoxr - * @date 2021/9/25 + * @since 2.0.0 */ @Data public class SmsCodeAuthenticationProvider implements AuthenticationProvider { @@ -34,6 +35,8 @@ public Authentication authenticate(Authentication authentication) throws Authent String mobile = (String) authenticationToken.getPrincipal(); String code = (String) authenticationToken.getCredentials(); + Assert.notNull("短信验证码不能为空"); + if (!code.equals("666666")) { // 666666 是后门,因为短信收费,正式环境删除这个if分支 String codeKey = SecurityConstants.SMS_CODE_PREFIX + mobile; String correctCode = redisTemplate.opsForValue().get(codeKey); diff --git a/youlai-auth/src/main/java/com/youlai/auth/extension/wechat/WechatAuthenticationProvider.java b/youlai-auth/src/main/java/com/youlai/auth/extension/wechat/WechatAuthenticationProvider.java index 7e0220b88..20ab08fa8 100644 --- a/youlai-auth/src/main/java/com/youlai/auth/extension/wechat/WechatAuthenticationProvider.java +++ b/youlai-auth/src/main/java/com/youlai/auth/extension/wechat/WechatAuthenticationProvider.java @@ -1,15 +1,8 @@ package com.youlai.auth.extension.wechat; import cn.binarywang.wx.miniapp.api.WxMaService; -import cn.binarywang.wx.miniapp.bean.WxMaJscode2SessionResult; -import cn.binarywang.wx.miniapp.bean.WxMaUserInfo; -import cn.hutool.core.bean.BeanUtil; import com.youlai.auth.userdetails.member.MemberUserDetailsServiceImpl; -import com.youlai.common.result.Result; -import com.youlai.common.result.ResultCode; import com.youlai.mall.ums.api.MemberFeignClient; -import com.youlai.mall.ums.dto.MemberAuthDTO; -import com.youlai.mall.ums.dto.MemberDTO; import lombok.Data; import lombok.SneakyThrows; import org.springframework.security.authentication.AuthenticationProvider; @@ -18,13 +11,13 @@ import org.springframework.security.core.userdetails.UserDetails; import org.springframework.security.core.userdetails.UserDetailsService; -import java.util.HashSet; +import java.util.Collections; /** * 微信认证提供者 * - * @author haoxr - * @date 2021/9/25 + * @author haoxr + * @since 2021/9/25 */ @Data public class WechatAuthenticationProvider implements AuthenticationProvider { @@ -45,26 +38,11 @@ public class WechatAuthenticationProvider implements AuthenticationProvider { public Authentication authenticate(Authentication authentication) throws AuthenticationException { WechatAuthenticationToken authenticationToken = (WechatAuthenticationToken) authentication; String code = (String) authenticationToken.getPrincipal(); + String encryptedData = authenticationToken.getEncryptedData(); + String iv = authenticationToken.getIv(); - WxMaJscode2SessionResult sessionInfo = wxMaService.getUserService().getSessionInfo(code); - String openid = sessionInfo.getOpenid(); - Result memberAuthResult = memberFeignClient.loadUserByOpenId(openid); - // 微信用户不存在,注册成为新会员 - if (memberAuthResult != null && ResultCode.USER_NOT_EXIST.getCode().equals(memberAuthResult.getCode())) { - - String sessionKey = sessionInfo.getSessionKey(); - String encryptedData = authenticationToken.getEncryptedData(); - String iv = authenticationToken.getIv(); - // 解密 encryptedData 获取用户信息 - WxMaUserInfo userInfo = wxMaService.getUserService().getUserInfo(sessionKey, encryptedData, iv); - - MemberDTO memberDTO = new MemberDTO(); - BeanUtil.copyProperties(userInfo, memberDTO); - memberDTO.setOpenid(openid); - memberFeignClient.addMember(memberDTO); - } - UserDetails userDetails = ((MemberUserDetailsServiceImpl) userDetailsService).loadUserByOpenId(openid); - WechatAuthenticationToken result = new WechatAuthenticationToken(userDetails, new HashSet<>()); + UserDetails userDetails = ((MemberUserDetailsServiceImpl) userDetailsService).loadUserByWechatCode(code,encryptedData,iv); + WechatAuthenticationToken result = new WechatAuthenticationToken(userDetails, Collections.EMPTY_SET); result.setDetails(authentication.getDetails()); return result; } diff --git a/youlai-auth/src/main/java/com/youlai/auth/extension/wechat/WechatAuthenticationToken.java b/youlai-auth/src/main/java/com/youlai/auth/extension/wechat/WechatAuthenticationToken.java index 0c1356135..71f0fef61 100644 --- a/youlai-auth/src/main/java/com/youlai/auth/extension/wechat/WechatAuthenticationToken.java +++ b/youlai-auth/src/main/java/com/youlai/auth/extension/wechat/WechatAuthenticationToken.java @@ -8,8 +8,10 @@ import java.util.Collection; /** - * @author haoxr - * @date 2021/9/25 + * 微信认证令牌 + * + * @author haoxr + * @since 2021/9/25 */ public class WechatAuthenticationToken extends AbstractAuthenticationToken { private static final long serialVersionUID = 550L; diff --git a/youlai-auth/src/main/java/com/youlai/auth/extension/wechat/WechatTokenGranter.java b/youlai-auth/src/main/java/com/youlai/auth/extension/wechat/WechatTokenGranter.java index 67984d1b9..35586742d 100644 --- a/youlai-auth/src/main/java/com/youlai/auth/extension/wechat/WechatTokenGranter.java +++ b/youlai-auth/src/main/java/com/youlai/auth/extension/wechat/WechatTokenGranter.java @@ -11,10 +11,10 @@ import java.util.Map; /** - * 微信授权者 + * 微信授权者 * - * @author haoxr - * @date 2021/9/25 + * @author haoxr + * @since 2021/9/25 */ public class WechatTokenGranter extends AbstractTokenGranter { @@ -47,7 +47,7 @@ protected OAuth2Authentication getOAuth2Authentication(ClientDetails client, Tok parameters.remove("encryptedData"); parameters.remove("iv"); - Authentication userAuth = new WechatAuthenticationToken(code, encryptedData,iv); // 未认证状态 + Authentication userAuth = new WechatAuthenticationToken(code, encryptedData, iv); // 未认证状态 ((AbstractAuthenticationToken) userAuth).setDetails(parameters); try { diff --git a/youlai-auth/src/main/java/com/youlai/auth/extension/wechat/WechatUserInfo.java b/youlai-auth/src/main/java/com/youlai/auth/extension/wechat/WechatUserInfo.java deleted file mode 100644 index 5ea1cb785..000000000 --- a/youlai-auth/src/main/java/com/youlai/auth/extension/wechat/WechatUserInfo.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.youlai.auth.extension.wechat; - -import lombok.Data; - -/** - * 微信用户信息 - * - * @author haoxr - * @date 2021/10/4 - */ -@Data -public class WechatUserInfo { - private String avatarUrl; - - private String city; - - private String country; - - private Integer gender; - - private String language; - - private String nickName; - - private String province; - -} diff --git a/youlai-auth/src/main/java/com/youlai/auth/userdetails/member/MemberUserDetailsServiceImpl.java b/youlai-auth/src/main/java/com/youlai/auth/userdetails/member/MemberUserDetailsServiceImpl.java index 4e6992178..5a47db27c 100644 --- a/youlai-auth/src/main/java/com/youlai/auth/userdetails/member/MemberUserDetailsServiceImpl.java +++ b/youlai-auth/src/main/java/com/youlai/auth/userdetails/member/MemberUserDetailsServiceImpl.java @@ -1,10 +1,19 @@ package com.youlai.auth.userdetails.member; +import cn.binarywang.wx.miniapp.api.WxMaService; +import cn.binarywang.wx.miniapp.bean.WxMaJscode2SessionResult; +import cn.binarywang.wx.miniapp.bean.WxMaUserInfo; +import cn.hutool.core.bean.BeanUtil; +import cn.hutool.core.lang.Assert; +import com.youlai.common.enums.StatusEnum; import com.youlai.common.result.Result; import com.youlai.common.result.ResultCode; import com.youlai.mall.ums.api.MemberFeignClient; import com.youlai.mall.ums.dto.MemberAuthDTO; +import com.youlai.mall.ums.dto.MemberRegisterDTO; import lombok.RequiredArgsConstructor; +import lombok.SneakyThrows; +import me.chanjar.weixin.common.error.WxErrorException; import org.springframework.security.authentication.AccountExpiredException; import org.springframework.security.authentication.DisabledException; import org.springframework.security.authentication.LockedException; @@ -23,6 +32,7 @@ public class MemberUserDetailsServiceImpl implements UserDetailsService { private final MemberFeignClient memberFeignClient; + private final WxMaService wxMaService; @Override public UserDetails loadUserByUsername(String username) { @@ -84,4 +94,59 @@ public UserDetails loadUserByOpenId(String openId) { } return userDetails; } + + /** + * 获取会员信息 + * + * @param code + * @param encryptedData + * @param iv + * @return + * @throws WxErrorException + */ + public UserDetails loadUserByWechatCode(String code, String encryptedData, String iv) throws WxErrorException { + // 根据 code 获取 openid + WxMaJscode2SessionResult sessionInfo = wxMaService.getUserService().getSessionInfo(code); + String openid = sessionInfo.getOpenid(); + + // 根据 openid 获取微信用户认证信息 + Result getMemberAuthInfoResult = memberFeignClient.loadUserByOpenId(openid); + + MemberAuthDTO memberAuthInfo = null; + + // 会员不存在,注册成为新会员 + if (ResultCode.USER_NOT_EXIST.getCode().equals(getMemberAuthInfoResult.getCode())) { + String sessionKey = sessionInfo.getSessionKey(); + // 解密 encryptedData 获取用户信息 + WxMaUserInfo userInfo = wxMaService.getUserService().getUserInfo(sessionKey, encryptedData, iv); + + MemberRegisterDTO memberRegisterInfo = new MemberRegisterDTO(); + BeanUtil.copyProperties(userInfo, memberRegisterInfo); + memberRegisterInfo.setOpenid(openid); + // 注册会员 + Result registerMemberResult = memberFeignClient.registerMember(memberRegisterInfo); + // 注册成功将会员信息赋值给会员认证信息 + Long memberId; + if (Result.isSuccess(registerMemberResult) && (memberId = registerMemberResult.getData()) != null) { + memberAuthInfo = new MemberAuthDTO(memberId, openid, StatusEnum.ENABLE.getValue()); + } + } else { + Assert.isTrue((memberAuthInfo = getMemberAuthInfoResult.getData()) != null, "获取会员认证信息失败"); + } + + // 用户不存在 + if (memberAuthInfo == null) { + throw new UsernameNotFoundException(ResultCode.USER_NOT_EXIST.getMsg()); + } + + UserDetails userDetails = new MemberUserDetails(memberAuthInfo); + if (!userDetails.isEnabled()) { + throw new DisabledException("该账户已被禁用!"); + } else if (!userDetails.isAccountNonLocked()) { + throw new LockedException("该账号已被锁定!"); + } else if (!userDetails.isAccountNonExpired()) { + throw new AccountExpiredException("该账号已过期!"); + } + return userDetails; + } } diff --git a/youlai-auth/src/main/java/com/youlai/auth/userdetails/user/SysUserDetailsServiceImpl.java b/youlai-auth/src/main/java/com/youlai/auth/userdetails/user/SysUserDetailsServiceImpl.java index eb1fbed4e..9e2f01629 100644 --- a/youlai-auth/src/main/java/com/youlai/auth/userdetails/user/SysUserDetailsServiceImpl.java +++ b/youlai-auth/src/main/java/com/youlai/auth/userdetails/user/SysUserDetailsServiceImpl.java @@ -26,10 +26,9 @@ public class SysUserDetailsServiceImpl implements UserDetailsService { @Override public UserDetails loadUserByUsername(String username) { - Result result = userFeignClient.getUserAuthInfo(username); + UserAuthInfo userAuthInfo = userFeignClient.getUserAuthInfo(username); - UserAuthInfo userAuthInfo = null; - Assert.isTrue(Result.isSuccess(result) && (userAuthInfo = result.getData()) != null, + Assert.isTrue(userAuthInfo!= null, "用户不存在"); if (!StatusEnum.ENABLE.getValue().equals(userAuthInfo.getStatus()) ) { diff --git a/youlai-common/common-core/pom.xml b/youlai-common/common-core/pom.xml index 6d0d4025c..fb2e7a634 100644 --- a/youlai-common/common-core/pom.xml +++ b/youlai-common/common-core/pom.xml @@ -5,7 +5,7 @@ youlai-common com.youlai - 2.2.0 + 2.4.1 4.0.0 diff --git a/youlai-common/common-core/src/main/java/com/youlai/common/base/IBaseEnum.java b/youlai-common/common-core/src/main/java/com/youlai/common/base/IBaseEnum.java index 089d983b7..2efe8afea 100644 --- a/youlai-common/common-core/src/main/java/com/youlai/common/base/IBaseEnum.java +++ b/youlai-common/common-core/src/main/java/com/youlai/common/base/IBaseEnum.java @@ -45,7 +45,10 @@ static & IBaseEnum> E getEnumByValue(Object value, Class c * @return */ static & IBaseEnum> String getLabelByValue(Object value, Class clazz) { - Objects.requireNonNull(value); + if (value == null) { + return null; + } + EnumSet allEnums = EnumSet.allOf(clazz); // 获取类型下的所有枚举 E matchEnum = allEnums.stream() .filter(e -> ObjectUtil.equal(e.getValue(), value)) diff --git a/youlai-common/common-elasticsearch/pom.xml b/youlai-common/common-elasticsearch/pom.xml index 83f483e2e..001670117 100644 --- a/youlai-common/common-elasticsearch/pom.xml +++ b/youlai-common/common-elasticsearch/pom.xml @@ -5,7 +5,7 @@ youlai-common com.youlai - 2.2.0 + 2.4.1 4.0.0 diff --git a/youlai-common/common-file/pom.xml b/youlai-common/common-file/pom.xml index 614501828..fcfcf4620 100644 --- a/youlai-common/common-file/pom.xml +++ b/youlai-common/common-file/pom.xml @@ -5,7 +5,7 @@ youlai-common com.youlai - 2.2.0 + 2.4.1 4.0.0 diff --git a/youlai-common/common-log/pom.xml b/youlai-common/common-log/pom.xml index f9e110c76..ff3f7be2c 100644 --- a/youlai-common/common-log/pom.xml +++ b/youlai-common/common-log/pom.xml @@ -5,7 +5,7 @@ youlai-common com.youlai - 2.2.0 + 2.4.1 4.0.0 diff --git a/youlai-common/common-mybatis/pom.xml b/youlai-common/common-mybatis/pom.xml index 16a99374e..f9b0ff66d 100644 --- a/youlai-common/common-mybatis/pom.xml +++ b/youlai-common/common-mybatis/pom.xml @@ -5,7 +5,7 @@ youlai-common com.youlai - 2.2.0 + 2.4.1 4.0.0 diff --git a/youlai-common/common-rabbitmq/pom.xml b/youlai-common/common-rabbitmq/pom.xml index 961848c68..1a10a315e 100644 --- a/youlai-common/common-rabbitmq/pom.xml +++ b/youlai-common/common-rabbitmq/pom.xml @@ -5,7 +5,7 @@ youlai-common com.youlai - 2.2.0 + 2.4.1 4.0.0 diff --git a/youlai-common/common-redis/pom.xml b/youlai-common/common-redis/pom.xml index 426d0b902..89b42aefd 100644 --- a/youlai-common/common-redis/pom.xml +++ b/youlai-common/common-redis/pom.xml @@ -5,7 +5,7 @@ youlai-common com.youlai - 2.2.0 + 2.4.1 4.0.0 diff --git a/youlai-common/common-redis/src/main/java/com/youlai/common/redis/BusinessSnGenerator.java b/youlai-common/common-redis/src/main/java/com/youlai/common/redis/BusinessSnGenerator.java deleted file mode 100644 index 27e37896b..000000000 --- a/youlai-common/common-redis/src/main/java/com/youlai/common/redis/BusinessSnGenerator.java +++ /dev/null @@ -1,44 +0,0 @@ -package com.youlai.common.redis; - -import cn.hutool.core.util.StrUtil; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.data.redis.core.RedisTemplate; -import org.springframework.stereotype.Component; - -import java.time.LocalDateTime; -import java.time.ZoneOffset; -import java.time.format.DateTimeFormatter; - -@Component -@Slf4j -@RequiredArgsConstructor -public class BusinessSnGenerator { - - - private final RedisTemplate redisTemplate; - - /** - * @param digit 业务序号位数 - * @return - */ - public String generateSerialNo(String businessType, Integer digit) { - if (StrUtil.isBlank(businessType)) { - businessType = "COMMON"; - } - String date = LocalDateTime.now(ZoneOffset.of("+8")) - .format(DateTimeFormatter.ofPattern("yyyyMMdd")); - String key = "SN:" + businessType + ":" + date; - Long increment = redisTemplate.opsForValue().increment(key); - return date + String.format("%0" + digit + "d", increment); - } - - public String generateSerialNo(Integer digit) { - return this.generateSerialNo(null,6); - } - - public String generateSerialNo(String businessType) { - return this.generateSerialNo(businessType,6); - } - -} diff --git a/youlai-common/common-redis/src/main/java/com/youlai/common/redis/RedisCacheConfig.java b/youlai-common/common-redis/src/main/java/com/youlai/common/redis/RedisCacheConfig.java index f8559b066..affae9b2f 100644 --- a/youlai-common/common-redis/src/main/java/com/youlai/common/redis/RedisCacheConfig.java +++ b/youlai-common/common-redis/src/main/java/com/youlai/common/redis/RedisCacheConfig.java @@ -16,6 +16,7 @@ * Redis缓存配置 * * @author haoxr + * @since 1.0.0 */ @EnableConfigurationProperties(CacheProperties.class) @Configuration @@ -23,7 +24,7 @@ public class RedisCacheConfig { @Bean - public RedisCacheManager redisCacheManager(RedisConnectionFactory redisConnectionFactory, CacheProperties cacheProperties){ + public RedisCacheManager redisCacheManager(RedisConnectionFactory redisConnectionFactory, CacheProperties cacheProperties) { return RedisCacheManager.builder(RedisCacheWriter.nonLockingRedisCacheWriter(redisConnectionFactory)) .cacheDefaults(redisCacheConfiguration(cacheProperties)) .build(); diff --git a/youlai-common/common-redis/src/main/resources/META-INF/spring.factories b/youlai-common/common-redis/src/main/resources/META-INF/spring.factories index 20fdfd17e..6e54ad980 100644 --- a/youlai-common/common-redis/src/main/resources/META-INF/spring.factories +++ b/youlai-common/common-redis/src/main/resources/META-INF/spring.factories @@ -1,6 +1,5 @@ org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ com.youlai.common.redis.RedisConfig,\ - com.youlai.common.redis.BusinessSnGenerator,\ com.youlai.common.redis.RedissonConfig,\ com.youlai.common.redis.RedisCacheConfig diff --git a/youlai-common/common-seata/pom.xml b/youlai-common/common-seata/pom.xml index b309efd5d..e0a7991d2 100644 --- a/youlai-common/common-seata/pom.xml +++ b/youlai-common/common-seata/pom.xml @@ -5,7 +5,7 @@ youlai-common com.youlai - 2.2.0 + 2.4.1 4.0.0 @@ -23,15 +23,10 @@ spring-cloud-starter-alibaba-seata - io.seata - seata-spring-boot-starter + com.alibaba + druid - - io.seata - seata-spring-boot-starter - ${seata.version} - \ No newline at end of file diff --git a/youlai-common/common-security/pom.xml b/youlai-common/common-security/pom.xml index 61c11e545..400bcde3a 100644 --- a/youlai-common/common-security/pom.xml +++ b/youlai-common/common-security/pom.xml @@ -5,7 +5,7 @@ youlai-common com.youlai - 2.2.0 + 2.4.1 4.0.0 diff --git a/youlai-common/common-sms/pom.xml b/youlai-common/common-sms/pom.xml index f3c33af2c..efdaa43f7 100644 --- a/youlai-common/common-sms/pom.xml +++ b/youlai-common/common-sms/pom.xml @@ -5,7 +5,7 @@ youlai-common com.youlai - 2.2.0 + 2.4.1 4.0.0 diff --git a/youlai-common/common-web/pom.xml b/youlai-common/common-web/pom.xml index cc999bc8e..5af627bc8 100644 --- a/youlai-common/common-web/pom.xml +++ b/youlai-common/common-web/pom.xml @@ -5,7 +5,7 @@ youlai-common com.youlai - 2.2.0 + 2.4.1 4.0.0 @@ -79,6 +79,13 @@ spring-boot-starter-validation + + org.springframework.cloud + spring-cloud-starter-openfeign + true + + + diff --git a/youlai-common/common-web/src/main/java/com/youlai/common/web/config/FeignConfig.java b/youlai-common/common-web/src/main/java/com/youlai/common/web/config/FeignConfig.java index 2d114cf15..56a00f6cb 100644 --- a/youlai-common/common-web/src/main/java/com/youlai/common/web/config/FeignConfig.java +++ b/youlai-common/common-web/src/main/java/com/youlai/common/web/config/FeignConfig.java @@ -18,7 +18,7 @@ * Feign相关配置类 * * @author Gadfly - * @since 2021-08-06 9:47 + * @since 2021/08/06 */ @Configuration @@ -31,7 +31,7 @@ public class FeignConfig { */ @Bean public ServletRegistrationBean dispatcherRegistration(DispatcherServlet servlet) { - servlet.setThreadContextInheritable(true); + servlet.setThreadContextInheritable(true); // 子线程可以继承父线程上下文信息 return new ServletRegistrationBean<>(servlet, "/**"); } diff --git a/youlai-common/common-web/src/main/java/com/youlai/common/web/config/FeignDecoderConfig.java b/youlai-common/common-web/src/main/java/com/youlai/common/web/config/FeignDecoderConfig.java new file mode 100644 index 000000000..c187747ea --- /dev/null +++ b/youlai-common/common-web/src/main/java/com/youlai/common/web/config/FeignDecoderConfig.java @@ -0,0 +1,23 @@ +package com.youlai.common.web.config; + +import com.youlai.common.web.decoder.FeignDecoder; +import feign.codec.Decoder; +import feign.optionals.OptionalDecoder; +import org.springframework.beans.factory.ObjectProvider; +import org.springframework.boot.autoconfigure.http.HttpMessageConverters; +import org.springframework.cloud.openfeign.support.ResponseEntityDecoder; +import org.springframework.cloud.openfeign.support.SpringDecoder; +import org.springframework.context.annotation.Bean; + +/** + * @author haoxr + * @since 2023/8/24 + */ +public class FeignDecoderConfig { + + @Bean + public Decoder feignDecoder(ObjectProvider messageConverters) { + return new OptionalDecoder((new ResponseEntityDecoder(new FeignDecoder(new SpringDecoder(messageConverters))))); + } + +} diff --git a/mall-ums/ums-boot/src/main/java/com/youlai/mall/ums/config/RestTemplateConfig.java b/youlai-common/common-web/src/main/java/com/youlai/common/web/config/RestTemplateConfig.java similarity index 95% rename from mall-ums/ums-boot/src/main/java/com/youlai/mall/ums/config/RestTemplateConfig.java rename to youlai-common/common-web/src/main/java/com/youlai/common/web/config/RestTemplateConfig.java index 38c5d52e0..933aa6cdc 100644 --- a/mall-ums/ums-boot/src/main/java/com/youlai/mall/ums/config/RestTemplateConfig.java +++ b/youlai-common/common-web/src/main/java/com/youlai/common/web/config/RestTemplateConfig.java @@ -1,4 +1,4 @@ -package com.youlai.mall.ums.config; +package com.youlai.common.web.config; import org.springframework.context.annotation.Bean; diff --git a/youlai-common/common-web/src/main/java/com/youlai/common/web/config/ValidationConfig.java b/youlai-common/common-web/src/main/java/com/youlai/common/web/config/ValidationConfig.java index b633429e6..5c14bfa79 100644 --- a/youlai-common/common-web/src/main/java/com/youlai/common/web/config/ValidationConfig.java +++ b/youlai-common/common-web/src/main/java/com/youlai/common/web/config/ValidationConfig.java @@ -14,7 +14,7 @@ * 运行时入参校验配置 * * @author haoxr - * @date 2022/11/10 + * @since 2022/11/10 */ @Configuration public class ValidationConfig { diff --git a/youlai-common/common-web/src/main/java/com/youlai/common/web/decoder/FeignDecoder.java b/youlai-common/common-web/src/main/java/com/youlai/common/web/decoder/FeignDecoder.java new file mode 100644 index 000000000..600739913 --- /dev/null +++ b/youlai-common/common-web/src/main/java/com/youlai/common/web/decoder/FeignDecoder.java @@ -0,0 +1,60 @@ +package com.youlai.common.web.decoder; + +import cn.hutool.http.HttpStatus; +import com.youlai.common.result.Result; +import com.youlai.common.web.exception.BizException; +import feign.FeignException; +import feign.Response; +import feign.codec.DecodeException; +import feign.codec.Decoder; +import org.springframework.cloud.openfeign.support.SpringDecoder; + +import java.io.IOException; +import java.lang.reflect.Method; +import java.lang.reflect.ParameterizedType; +import java.lang.reflect.Type; + +/** + * @author haoxr + * @link https://zhuanlan.zhihu.com/p/545505705 + * @since 2023/8/23 + */ +public class FeignDecoder implements Decoder { + + private final SpringDecoder decoder; + + public FeignDecoder(SpringDecoder decoder) { + this.decoder = decoder; + } + + @Override + public Object decode(Response response, Type type) throws IOException, FeignException { + Method method = response.request().requestTemplate().methodMetadata().method(); + boolean notTheSame = method.getReturnType() != Result.class; + if (notTheSame) { + Type newType = new ParameterizedType() { + @Override + public Type[] getActualTypeArguments() { + return new Type[]{type}; + } + + @Override + public Type getRawType() { + return Result.class; + } + + @Override + public Type getOwnerType() { + return null; + } + }; + Result result = (Result) this.decoder.decode(response, newType); + if (Result.isSuccess(result)) { + return result.getData(); + } else { + throw new DecodeException(HttpStatus.HTTP_INTERNAL_ERROR, result.getMsg(), response.request()); + } + } + return this.decoder.decode(response, type); + } +} diff --git a/youlai-common/common-web/src/main/java/com/youlai/common/web/exception/BizException.java b/youlai-common/common-web/src/main/java/com/youlai/common/web/exception/BizException.java index 82de5cf6c..7830ff28f 100644 --- a/youlai-common/common-web/src/main/java/com/youlai/common/web/exception/BizException.java +++ b/youlai-common/common-web/src/main/java/com/youlai/common/web/exception/BizException.java @@ -7,7 +7,7 @@ * 自定义业务异常 * * @author haoxr - * @date 2022/7/31 + * @since 0.0.1 */ @Getter public class BizException extends RuntimeException { diff --git a/youlai-common/common-web/src/main/java/com/youlai/common/web/exception/GlobalExceptionHandler.java b/youlai-common/common-web/src/main/java/com/youlai/common/web/exception/GlobalExceptionHandler.java index 11e4f37e4..73c06f903 100644 --- a/youlai-common/common-web/src/main/java/com/youlai/common/web/exception/GlobalExceptionHandler.java +++ b/youlai-common/common-web/src/main/java/com/youlai/common/web/exception/GlobalExceptionHandler.java @@ -5,6 +5,7 @@ import com.youlai.common.result.Result; import com.youlai.common.result.ResultCode; import feign.FeignException; +import feign.codec.DecodeException; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.TypeMismatchException; import org.springframework.context.support.DefaultMessageSourceResolvable; @@ -180,6 +181,11 @@ public Result processException(FeignException.BadRequest e) { } @ResponseStatus(HttpStatus.BAD_REQUEST) + @ExceptionHandler(DecodeException.class) + public Result handleDecodeException(DecodeException e) { + return Result.failed(e.getMessage()); + } + @ResponseStatus(HttpStatus.BAD_REQUEST) @ExceptionHandler(BizException.class) public Result handleBizException(BizException e) { log.error("biz exception:{}", e.getMessage(), e); diff --git a/youlai-common/common-web/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports b/youlai-common/common-web/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports index 1c0660c8c..815830628 100644 --- a/youlai-common/common-web/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports +++ b/youlai-common/common-web/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports @@ -1,3 +1,4 @@ com.youlai.common.web.config.WebMvcConfig com.youlai.common.web.config.FeignConfig + com.youlai.common.web.config.RestTemplateConfig com.youlai.common.web.exception.GlobalExceptionHandler \ No newline at end of file diff --git a/youlai-common/pom.xml b/youlai-common/pom.xml index 961367a4b..59c0ac530 100644 --- a/youlai-common/pom.xml +++ b/youlai-common/pom.xml @@ -7,7 +7,7 @@ youlai-mall com.youlai - 2.2.0 + 2.4.1 youlai-common diff --git a/youlai-gateway/pom.xml b/youlai-gateway/pom.xml index 3816e542b..3db401c75 100644 --- a/youlai-gateway/pom.xml +++ b/youlai-gateway/pom.xml @@ -6,7 +6,7 @@ youlai-mall com.youlai - 2.2.0 + 2.4.1 youlai-gateway @@ -96,11 +96,6 @@ common-redis - - com.github.whvcse - easy-captcha - - diff --git a/youlai-gateway/src/main/java/com/youlai/gateway/captcha/enums/CaptchaTypeEnum.java b/youlai-gateway/src/main/java/com/youlai/gateway/captcha/enums/CaptchaTypeEnum.java deleted file mode 100644 index 18ac70acc..000000000 --- a/youlai-gateway/src/main/java/com/youlai/gateway/captcha/enums/CaptchaTypeEnum.java +++ /dev/null @@ -1,31 +0,0 @@ -package com.youlai.gateway.captcha.enums; - -/** - * 验证码类型枚举 - * - * @author haoxr - * @date 2022/5/18 12:14 - */ -public enum CaptchaTypeEnum { - - /** - * 算数 - */ - ARITHMETIC, - /** - * 中文 - */ - CHINESE, - /** - * 中文闪图 - */ - CHINESE_GIF, - /** - * 闪图 - */ - GIF, - - SPEC - - -} diff --git a/youlai-gateway/src/main/java/com/youlai/gateway/captcha/handler/CaptchaHandler.java b/youlai-gateway/src/main/java/com/youlai/gateway/captcha/handler/CaptchaHandler.java deleted file mode 100644 index cbdf7404e..000000000 --- a/youlai-gateway/src/main/java/com/youlai/gateway/captcha/handler/CaptchaHandler.java +++ /dev/null @@ -1,72 +0,0 @@ -package com.youlai.gateway.captcha.handler; - -import cn.hutool.core.util.IdUtil; -import com.wf.captcha.base.Captcha; -import com.youlai.common.constant.SecurityConstants; -import com.youlai.common.result.Result; -import com.youlai.gateway.captcha.producer.CaptchaProducer; -import com.youlai.gateway.captcha.enums.CaptchaTypeEnum; -import lombok.RequiredArgsConstructor; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.data.redis.core.StringRedisTemplate; -import org.springframework.stereotype.Component; -import org.springframework.web.reactive.function.BodyInserters; -import org.springframework.web.reactive.function.server.HandlerFunction; -import org.springframework.web.reactive.function.server.ServerRequest; -import org.springframework.web.reactive.function.server.ServerResponse; -import reactor.core.publisher.Mono; - -import java.util.HashMap; -import java.util.Map; -import java.util.concurrent.TimeUnit; - -/** - * 验证码处理器 - * - * @author haoxr - * @date 2021/10/4 - */ -@Component -@RequiredArgsConstructor -public class CaptchaHandler implements HandlerFunction { - - private final CaptchaProducer captchaProducer; - private final StringRedisTemplate stringRedisTemplate; - - /** - * 验证码类型,默认:ARITHMETIC - */ - @Value("${captcha.type:ARITHMETIC}") - CaptchaTypeEnum captchaType; - - /** - * 验证码值的有效期(单位:秒),默认:120 - */ - @Value("${captcha.ttl:120}") - long captchaValueTtl ; - - @Override - public Mono handle(ServerRequest request) { - - Captcha captcha = captchaProducer.getCaptcha(captchaType); - String captchaValue = captcha.text(); - // 对于数学类型的需要进行处理 - if (captchaType == null || captchaType == CaptchaTypeEnum.ARITHMETIC) { - if (captcha.getCharType() - 1 == CaptchaTypeEnum.ARITHMETIC.ordinal() && captchaValue.contains(".")) { - captchaValue = captchaValue.split("\\.")[0]; - } - } - - // 缓存验证码至Redis - String uuid = IdUtil.simpleUUID(); - stringRedisTemplate.opsForValue().set(SecurityConstants.VERIFY_CODE_KEY_PREFIX + uuid, captchaValue, captchaValueTtl, TimeUnit.SECONDS); - - // 获取到验证码Base64编码字符串 - String captchaBase64 = captcha.toBase64(); - Map result = new HashMap<>(2); - result.put("verifyCodeKey", uuid); - result.put("verifyCodeImg", captchaBase64); - - return ServerResponse.ok().body(BodyInserters.fromValue(Result.success(result))); - } -} diff --git a/youlai-gateway/src/main/java/com/youlai/gateway/captcha/producer/CaptchaProducer.java b/youlai-gateway/src/main/java/com/youlai/gateway/captcha/producer/CaptchaProducer.java deleted file mode 100644 index 506f4df27..000000000 --- a/youlai-gateway/src/main/java/com/youlai/gateway/captcha/producer/CaptchaProducer.java +++ /dev/null @@ -1,94 +0,0 @@ -package com.youlai.gateway.captcha.producer; - -import com.wf.captcha.*; -import com.wf.captcha.base.Captcha; -import com.youlai.gateway.captcha.enums.CaptchaTypeEnum; -import org.springframework.stereotype.Component; - -import java.awt.*; - -@Component -public class CaptchaProducer { - - /** - * 验证码内容长度 - */ - private int length = 4; - /** - * 验证码宽度 - */ - private int width = 120; - /** - * 验证码高度 - */ - private int height = 36; - - /** - * 验证码字体 - */ - private String fontName = "Verdana"; - - /** - * 字体风格 - */ - private Integer fontStyle = Font.PLAIN; - - /** - * 字体大小 - */ - private int fontSize = 20; - - public Captcha getCaptcha(CaptchaTypeEnum codeType) { - Captcha captcha; - switch (codeType) { - case ARITHMETIC: - captcha = new FixedArithmeticCaptcha(width, height); // 算术类型 - captcha.setLen(2); //固定设置为两位,图片为算数运算表达式 - break; - case CHINESE: - captcha = new ChineseCaptcha(width, height); - captcha.setLen(length); - break; - case CHINESE_GIF: - captcha = new ChineseGifCaptcha(width, height); - captcha.setLen(length); - break; - case GIF: - captcha = new GifCaptcha(width, height);//最后一位是位数 - captcha.setLen(length); - break; - case SPEC: - captcha = new SpecCaptcha(width, height); - captcha.setLen(length); - break; - default: - throw new RuntimeException("验证码配置信息错误!"); - } - captcha.setFont(new Font(fontName, fontStyle, fontSize)); - return captcha; - } - - static class FixedArithmeticCaptcha extends ArithmeticCaptcha { - public FixedArithmeticCaptcha(int width, int height) { - super(width, height); - } - - @Override - protected char[] alphas() { - // 生成随机数字和运算符 - int n1 = num(1, 10), n2 = num(1, 10); - int opt = num(3); - - // 计算结果 - int res = new int[]{n1 + n2, n1 - n2, n1 * n2}[opt]; - // 转换为字符运算符 - char optChar = "+-x".charAt(opt); - - this.setArithmeticString(String.format("%s%c%s=?", n1, optChar, n2)); - this.chars = String.valueOf(res); - - return chars.toCharArray(); - } - } - -} diff --git a/youlai-gateway/src/main/java/com/youlai/gateway/sentinel/SentinelConfiguration.java b/youlai-gateway/src/main/java/com/youlai/gateway/config/SentinelConfiguration.java similarity index 96% rename from youlai-gateway/src/main/java/com/youlai/gateway/sentinel/SentinelConfiguration.java rename to youlai-gateway/src/main/java/com/youlai/gateway/config/SentinelConfiguration.java index 59294a1a1..763f3a874 100644 --- a/youlai-gateway/src/main/java/com/youlai/gateway/sentinel/SentinelConfiguration.java +++ b/youlai-gateway/src/main/java/com/youlai/gateway/config/SentinelConfiguration.java @@ -1,4 +1,4 @@ -package com.youlai.gateway.sentinel; +package com.youlai.gateway.config; import com.alibaba.csp.sentinel.adapter.gateway.sc.callback.BlockRequestHandler; import com.alibaba.csp.sentinel.adapter.gateway.sc.callback.GatewayCallbackManager; diff --git a/youlai-gateway/src/main/java/com/youlai/gateway/swagger/config/SwaggerResourceConfig.java b/youlai-gateway/src/main/java/com/youlai/gateway/config/SwaggerResourceConfig.java similarity index 97% rename from youlai-gateway/src/main/java/com/youlai/gateway/swagger/config/SwaggerResourceConfig.java rename to youlai-gateway/src/main/java/com/youlai/gateway/config/SwaggerResourceConfig.java index 7123bdbd7..67762f9e5 100644 --- a/youlai-gateway/src/main/java/com/youlai/gateway/swagger/config/SwaggerResourceConfig.java +++ b/youlai-gateway/src/main/java/com/youlai/gateway/config/SwaggerResourceConfig.java @@ -1,4 +1,4 @@ -package com.youlai.gateway.swagger.config; +package com.youlai.gateway.config; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; diff --git a/youlai-gateway/src/main/java/com/youlai/gateway/handler/CaptchaHandler.java b/youlai-gateway/src/main/java/com/youlai/gateway/handler/CaptchaHandler.java new file mode 100644 index 000000000..9e6a9b610 --- /dev/null +++ b/youlai-gateway/src/main/java/com/youlai/gateway/handler/CaptchaHandler.java @@ -0,0 +1,52 @@ +package com.youlai.gateway.handler; + +import cn.hutool.captcha.CaptchaUtil; +import cn.hutool.captcha.GifCaptcha; +import cn.hutool.core.util.IdUtil; +import com.youlai.common.constant.SecurityConstants; +import com.youlai.common.result.Result; +import lombok.RequiredArgsConstructor; +import org.springframework.data.redis.core.StringRedisTemplate; +import org.springframework.stereotype.Component; +import org.springframework.web.reactive.function.BodyInserters; +import org.springframework.web.reactive.function.server.HandlerFunction; +import org.springframework.web.reactive.function.server.ServerRequest; +import org.springframework.web.reactive.function.server.ServerResponse; +import reactor.core.publisher.Mono; + +import java.util.HashMap; +import java.util.Map; +import java.util.concurrent.TimeUnit; + +/** + * 验证码处理器 + * + * @author haoxr + * @since 2.4.1 + */ +@Component +@RequiredArgsConstructor +public class CaptchaHandler implements HandlerFunction { + + private final StringRedisTemplate redisTemplate; + + @Override + public Mono handle(ServerRequest request) { + + // 获取验证码 + GifCaptcha captcha = CaptchaUtil.createGifCaptcha(120, 40, 4); // 宽、高、位数 + String captchaCode = captcha.getCode(); // 验证码 + String captchaBase64 = captcha.getImageBase64Data(); // 验证码图片Base64 + + // 验证码文本缓存至Redis,用于登录校验 + String verifyCodeKey = IdUtil.fastSimpleUUID(); + redisTemplate.opsForValue().set(SecurityConstants.VERIFY_CODE_KEY_PREFIX + verifyCodeKey, captchaCode, + 120, TimeUnit.SECONDS); + + Map result = new HashMap<>(2); + result.put("verifyCodeKey", verifyCodeKey); + result.put("verifyCodeImg", captchaBase64); + + return ServerResponse.ok().body(BodyInserters.fromValue(Result.success(result))); + } +} diff --git a/youlai-gateway/src/main/java/com/youlai/gateway/handler/SwaggerHandler.java b/youlai-gateway/src/main/java/com/youlai/gateway/handler/SwaggerHandler.java new file mode 100644 index 000000000..2bd17954d --- /dev/null +++ b/youlai-gateway/src/main/java/com/youlai/gateway/handler/SwaggerHandler.java @@ -0,0 +1,65 @@ +package com.youlai.gateway.handler; + +import lombok.RequiredArgsConstructor; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.MediaType; +import org.springframework.stereotype.Component; +import org.springframework.web.reactive.function.BodyInserters; +import org.springframework.web.reactive.function.server.ServerRequest; +import org.springframework.web.reactive.function.server.ServerResponse; +import reactor.core.publisher.Mono; +import springfox.documentation.swagger.web.*; + +import java.util.Optional; + +/** + * Swagger 处理器 + * + * @author haoxr + * @since 2023/9/21 + */ +@Component +@RequiredArgsConstructor +public class SwaggerHandler { + + private final SwaggerResourcesProvider swaggerResources; + + @Autowired(required = false) + private SecurityConfiguration securityConfiguration; + + @Autowired(required = false) + private UiConfiguration uiConfiguration; + + + /** + * 聚合各个服务的 swagger 接口 + */ + public Mono handleResource(ServerRequest request) { + return ServerResponse.ok() + .contentType(MediaType.APPLICATION_JSON) + .body(BodyInserters + .fromValue(swaggerResources.get())); + } + + /** + * 权限处理器 + */ + public Mono handleSecurity(ServerRequest request) { + return ServerResponse.ok() + .contentType(MediaType.APPLICATION_JSON) + .body(BodyInserters + .fromValue(Optional.ofNullable(securityConfiguration) + .orElse(SecurityConfigurationBuilder.builder().build()))); + } + + /** + * UI处理器 + */ + public Mono handleUi(ServerRequest request) { + return ServerResponse.ok() + .contentType(MediaType.APPLICATION_JSON) + .body(BodyInserters + .fromValue(Optional.ofNullable(uiConfiguration) + .orElse(UiConfigurationBuilder.builder().build()))); + } +} diff --git a/youlai-gateway/src/main/java/com/youlai/gateway/captcha/router/CaptchaRouter.java b/youlai-gateway/src/main/java/com/youlai/gateway/router/CaptchaRouter.java similarity index 78% rename from youlai-gateway/src/main/java/com/youlai/gateway/captcha/router/CaptchaRouter.java rename to youlai-gateway/src/main/java/com/youlai/gateway/router/CaptchaRouter.java index ae438c664..1d6154ce8 100644 --- a/youlai-gateway/src/main/java/com/youlai/gateway/captcha/router/CaptchaRouter.java +++ b/youlai-gateway/src/main/java/com/youlai/gateway/router/CaptchaRouter.java @@ -1,6 +1,7 @@ -package com.youlai.gateway.captcha.router; +package com.youlai.gateway.router; -import com.youlai.gateway.captcha.handler.CaptchaHandler; +import com.youlai.gateway.handler.CaptchaHandler; +import lombok.RequiredArgsConstructor; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.http.MediaType; @@ -13,16 +14,20 @@ * 验证码路由 * * @author haoxr - * @date 2022/5/17 12:10 + * @since 2.4.1 */ @Configuration +@RequiredArgsConstructor public class CaptchaRouter { + private final CaptchaHandler captchaHandler; + @Bean - public RouterFunction captchaRouterFunction(CaptchaHandler captchaHandler) { + public RouterFunction captchaRouterFunction() { return RouterFunctions .route(RequestPredicates.GET("/captcha") .and(RequestPredicates.accept(MediaType.TEXT_PLAIN)), captchaHandler::handle); } + } diff --git a/youlai-gateway/src/main/java/com/youlai/gateway/swagger/router/SwaggerRouter.java b/youlai-gateway/src/main/java/com/youlai/gateway/router/SwaggerRouter.java similarity index 57% rename from youlai-gateway/src/main/java/com/youlai/gateway/swagger/router/SwaggerRouter.java rename to youlai-gateway/src/main/java/com/youlai/gateway/router/SwaggerRouter.java index 864a92c98..f148b7ad0 100644 --- a/youlai-gateway/src/main/java/com/youlai/gateway/swagger/router/SwaggerRouter.java +++ b/youlai-gateway/src/main/java/com/youlai/gateway/router/SwaggerRouter.java @@ -1,8 +1,6 @@ -package com.youlai.gateway.swagger.router; +package com.youlai.gateway.router; -import com.youlai.gateway.swagger.handler.SwaggerResourceHandler; -import com.youlai.gateway.swagger.handler.SwaggerSecurityHandler; -import com.youlai.gateway.swagger.handler.SwaggerUiHandler; +import com.youlai.gateway.handler.SwaggerHandler; import lombok.RequiredArgsConstructor; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @@ -12,35 +10,26 @@ import org.springframework.web.reactive.function.server.RouterFunctions; import org.springframework.web.reactive.function.server.ServerResponse; +import static org.springframework.web.reactive.function.server.RequestPredicates.path; + /** - * Swagger路由 + * Swagger 路由 * * @author haoxr - * @date 2022/5/16 16:34 + * @since 2022/5/16 */ @Configuration @RequiredArgsConstructor public class SwaggerRouter { - /** - * 聚合各个服务的swagger接口 - */ - private final SwaggerResourceHandler swaggerResourceHandler; - /** - * 权限处理器 - */ - private final SwaggerSecurityHandler swaggerSecurityHandler; - /** - * UI处理器 - */ - private final SwaggerUiHandler swaggerUiHandler; + private final SwaggerHandler swaggerHandler; @Bean public RouterFunction swaggerRouterFunction() { return RouterFunctions - .route(RequestPredicates.GET("/swagger-resources/configuration/security").and(RequestPredicates.accept(MediaType.ALL)), swaggerSecurityHandler::handle) - .andRoute(RequestPredicates.GET("/swagger-resources/configuration/ui").and(RequestPredicates.accept(MediaType.ALL)), swaggerUiHandler::handle) - .andRoute(RequestPredicates.GET("/swagger-resources").and(RequestPredicates.accept(MediaType.ALL)), swaggerResourceHandler::handle); + .route(RequestPredicates.GET("/swagger-resources/configuration/security").and(RequestPredicates.accept(MediaType.ALL)), swaggerHandler::handleSecurity) + .andRoute(RequestPredicates.GET("/swagger-resources/configuration/ui").and(RequestPredicates.accept(MediaType.ALL)), swaggerHandler::handleUi) + .andRoute(RequestPredicates.GET("/swagger-resources").and(RequestPredicates.accept(MediaType.ALL)), swaggerHandler::handleResource); } } diff --git a/youlai-gateway/src/main/java/com/youlai/gateway/swagger/handler/SwaggerResourceHandler.java b/youlai-gateway/src/main/java/com/youlai/gateway/swagger/handler/SwaggerResourceHandler.java deleted file mode 100644 index 42e7396c8..000000000 --- a/youlai-gateway/src/main/java/com/youlai/gateway/swagger/handler/SwaggerResourceHandler.java +++ /dev/null @@ -1,35 +0,0 @@ -package com.youlai.gateway.swagger.handler; - -import lombok.RequiredArgsConstructor; -import org.springframework.http.MediaType; -import org.springframework.stereotype.Component; -import org.springframework.web.reactive.function.BodyInserters; -import org.springframework.web.reactive.function.server.HandlerFunction; -import org.springframework.web.reactive.function.server.ServerRequest; -import org.springframework.web.reactive.function.server.ServerResponse; -import reactor.core.publisher.Mono; -import springfox.documentation.swagger.web.SwaggerResourcesProvider; - - -/** - * 聚合各个服务的swagger接口 - * - * @author haoxr - * @date 2022/5/17 0:53 - */ -@Component -@RequiredArgsConstructor -public class SwaggerResourceHandler implements HandlerFunction { - - private final SwaggerResourcesProvider swaggerResources; - - @Override - public Mono handle(ServerRequest request) { - Mono responseMono = ServerResponse.ok() - .contentType(MediaType.APPLICATION_JSON) - .body(BodyInserters - .fromValue(swaggerResources.get())); - return responseMono; - } - -} diff --git a/youlai-gateway/src/main/java/com/youlai/gateway/swagger/handler/SwaggerSecurityHandler.java b/youlai-gateway/src/main/java/com/youlai/gateway/swagger/handler/SwaggerSecurityHandler.java deleted file mode 100644 index 354530a14..000000000 --- a/youlai-gateway/src/main/java/com/youlai/gateway/swagger/handler/SwaggerSecurityHandler.java +++ /dev/null @@ -1,38 +0,0 @@ -package com.youlai.gateway.swagger.handler; - -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.http.MediaType; -import org.springframework.stereotype.Component; -import org.springframework.web.reactive.function.BodyInserters; -import org.springframework.web.reactive.function.server.HandlerFunction; -import org.springframework.web.reactive.function.server.ServerRequest; -import org.springframework.web.reactive.function.server.ServerResponse; -import reactor.core.publisher.Mono; -import springfox.documentation.swagger.web.SecurityConfiguration; -import springfox.documentation.swagger.web.SecurityConfigurationBuilder; - -import java.util.Optional; - - -/** - * 权限处理器 - * - * @author haoxr - * @date 2022/5/17 - */ -@Component -public class SwaggerSecurityHandler implements HandlerFunction { - - @Autowired(required = false) - private SecurityConfiguration securityConfiguration; - - @Override - public Mono handle(ServerRequest request) { - Mono responseMono = ServerResponse.ok() - .contentType(MediaType.APPLICATION_JSON) - .body(BodyInserters - .fromValue(Optional.ofNullable(securityConfiguration) - .orElse(SecurityConfigurationBuilder.builder().build()))); - return responseMono; - } -} diff --git a/youlai-gateway/src/main/java/com/youlai/gateway/swagger/handler/SwaggerUiHandler.java b/youlai-gateway/src/main/java/com/youlai/gateway/swagger/handler/SwaggerUiHandler.java deleted file mode 100644 index 38255f645..000000000 --- a/youlai-gateway/src/main/java/com/youlai/gateway/swagger/handler/SwaggerUiHandler.java +++ /dev/null @@ -1,41 +0,0 @@ -package com.youlai.gateway.swagger.handler; - -import lombok.RequiredArgsConstructor; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.http.MediaType; -import org.springframework.stereotype.Component; -import org.springframework.web.reactive.function.BodyInserters; -import org.springframework.web.reactive.function.server.HandlerFunction; -import org.springframework.web.reactive.function.server.ServerRequest; -import org.springframework.web.reactive.function.server.ServerResponse; -import reactor.core.publisher.Mono; -import springfox.documentation.swagger.web.UiConfiguration; -import springfox.documentation.swagger.web.UiConfigurationBuilder; - -import java.util.Optional; - - -/** - * UI处理器 - * - * @author haoxr - * @date 2022/5/17 0:51 - */ -@Component -public class SwaggerUiHandler implements HandlerFunction { - - - @Autowired(required = false) - private UiConfiguration uiConfiguration; - - @Override - public Mono handle(ServerRequest request) { - Mono responseMono = ServerResponse.ok() - .contentType(MediaType.APPLICATION_JSON) - .body(BodyInserters - .fromValue(Optional.ofNullable(uiConfiguration) - .orElse(UiConfigurationBuilder.builder().build()))); - return responseMono; - } - -} diff --git a/youlai-system/pom.xml b/youlai-system/pom.xml index 612891aaa..07aeceabf 100644 --- a/youlai-system/pom.xml +++ b/youlai-system/pom.xml @@ -5,7 +5,7 @@ youlai-mall com.youlai - 2.2.0 + 2.4.1 4.0.0 diff --git a/youlai-system/system-api/pom.xml b/youlai-system/system-api/pom.xml index 2bde367fb..cd2334564 100644 --- a/youlai-system/system-api/pom.xml +++ b/youlai-system/system-api/pom.xml @@ -5,7 +5,7 @@ youlai-system com.youlai - 2.2.0 + 2.4.1 4.0.0 diff --git a/youlai-system/system-api/src/main/java/com/youlai/system/api/UserFeignClient.java b/youlai-system/system-api/src/main/java/com/youlai/system/api/UserFeignClient.java index 210cb73bd..d265c8c4f 100644 --- a/youlai-system/system-api/src/main/java/com/youlai/system/api/UserFeignClient.java +++ b/youlai-system/system-api/src/main/java/com/youlai/system/api/UserFeignClient.java @@ -1,15 +1,16 @@ package com.youlai.system.api; +import com.youlai.common.result.Result; +import com.youlai.common.web.config.FeignDecoderConfig; import com.youlai.system.api.fallback.UserFeignFallbackClient; import com.youlai.system.dto.UserAuthInfo; -import com.youlai.common.result.Result; import org.springframework.cloud.openfeign.FeignClient; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; -@FeignClient(value = "youlai-system", fallback = UserFeignFallbackClient.class) +@FeignClient(value = "youlai-system", fallback = UserFeignFallbackClient.class, configuration = {FeignDecoderConfig.class}) public interface UserFeignClient { - @GetMapping("/api/v1/users/{username}/authinfo") - Result getUserAuthInfo(@PathVariable String username); + @GetMapping("/api/v1/users/{username}/authInfo") + UserAuthInfo getUserAuthInfo(@PathVariable String username); } diff --git a/youlai-system/system-api/src/main/java/com/youlai/system/api/fallback/UserFeignFallbackClient.java b/youlai-system/system-api/src/main/java/com/youlai/system/api/fallback/UserFeignFallbackClient.java index 05e902a2d..e824d15be 100644 --- a/youlai-system/system-api/src/main/java/com/youlai/system/api/fallback/UserFeignFallbackClient.java +++ b/youlai-system/system-api/src/main/java/com/youlai/system/api/fallback/UserFeignFallbackClient.java @@ -3,6 +3,7 @@ import com.youlai.system.api.UserFeignClient; import com.youlai.common.result.Result; import com.youlai.common.result.ResultCode; +import com.youlai.system.dto.UserAuthInfo; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; @@ -17,8 +18,8 @@ public class UserFeignFallbackClient implements UserFeignClient { @Override - public Result getUserAuthInfo(String username) { + public UserAuthInfo getUserAuthInfo(String username) { log.error("feign远程调用系统用户服务异常后的降级方法"); - return Result.failed(ResultCode.DEGRADATION); + return new UserAuthInfo(); } } diff --git a/youlai-system/system-boot/pom.xml b/youlai-system/system-boot/pom.xml index fc6d94f6d..c8ab7107f 100644 --- a/youlai-system/system-boot/pom.xml +++ b/youlai-system/system-boot/pom.xml @@ -5,7 +5,7 @@ youlai-system com.youlai - 2.2.0 + 2.4.1 4.0.0 diff --git a/youlai-system/system-boot/src/main/java/com/youlai/system/controller/SysUserController.java b/youlai-system/system-boot/src/main/java/com/youlai/system/controller/SysUserController.java index f718968c8..6ccf7e281 100644 --- a/youlai-system/system-boot/src/main/java/com/youlai/system/controller/SysUserController.java +++ b/youlai-system/system-boot/src/main/java/com/youlai/system/controller/SysUserController.java @@ -49,8 +49,8 @@ public class SysUserController { @ApiOperation(value = "用户分页列表") @GetMapping("/pages") - public PageResult listUserPages(UserPageQuery queryParams) { - IPage result = userService.listUserPages(queryParams); + public PageResult getUserPage(UserPageQuery queryParams) { + IPage result = userService.getUserPage(queryParams); return PageResult.success(result); } @@ -160,7 +160,7 @@ public void exportUsers(UserPageQuery queryParams, HttpServletResponse response) } @ApiOperation(value = "根据用户名获取认证信息", hidden = true) - @GetMapping("/{username}/authinfo") + @GetMapping("/{username}/authInfo") public Result getUserAuthInfo( @ApiParam("用户名") @PathVariable String username ) { diff --git a/youlai-system/system-boot/src/main/java/com/youlai/system/mapper/SysUserMapper.java b/youlai-system/system-boot/src/main/java/com/youlai/system/mapper/SysUserMapper.java index c82b1d8ad..0d3e2ceda 100644 --- a/youlai-system/system-boot/src/main/java/com/youlai/system/mapper/SysUserMapper.java +++ b/youlai-system/system-boot/src/main/java/com/youlai/system/mapper/SysUserMapper.java @@ -30,7 +30,7 @@ public interface SysUserMapper extends BaseMapper { * @return */ @DataPermission(deptAlias = "u",userAlias = "u") - Page listUserPages(Page page, UserPageQuery queryParams); + Page getUserPage(Page page, UserPageQuery queryParams); /** * 获取用户表单详情 diff --git a/youlai-system/system-boot/src/main/java/com/youlai/system/pojo/vo/user/UserVO.java b/youlai-system/system-boot/src/main/java/com/youlai/system/pojo/vo/user/UserVO.java index bedafbad3..95dbbc70e 100644 --- a/youlai-system/system-boot/src/main/java/com/youlai/system/pojo/vo/user/UserVO.java +++ b/youlai-system/system-boot/src/main/java/com/youlai/system/pojo/vo/user/UserVO.java @@ -11,7 +11,7 @@ * 用户分页视图对象 * * @author haoxr - * @date 2022/1/15 9:41 + * @since 2022/1/15 9:41 */ @ApiModel("用户分页视图对象") @Data diff --git a/youlai-system/system-boot/src/main/java/com/youlai/system/service/SysUserService.java b/youlai-system/system-boot/src/main/java/com/youlai/system/service/SysUserService.java index 631d0ae94..369cc8fde 100644 --- a/youlai-system/system-boot/src/main/java/com/youlai/system/service/SysUserService.java +++ b/youlai-system/system-boot/src/main/java/com/youlai/system/service/SysUserService.java @@ -28,7 +28,7 @@ public interface SysUserService extends IService { * * @return */ - IPage listUserPages(UserPageQuery queryParams); + IPage getUserPage(UserPageQuery queryParams); /** diff --git a/youlai-system/system-boot/src/main/java/com/youlai/system/service/impl/SysUserServiceImpl.java b/youlai-system/system-boot/src/main/java/com/youlai/system/service/impl/SysUserServiceImpl.java index aa65a30fc..ac8dd1c7e 100644 --- a/youlai-system/system-boot/src/main/java/com/youlai/system/service/impl/SysUserServiceImpl.java +++ b/youlai-system/system-boot/src/main/java/com/youlai/system/service/impl/SysUserServiceImpl.java @@ -74,10 +74,10 @@ public class SysUserServiceImpl extends ServiceImpl impl * @return */ @Override - public IPage listUserPages(UserPageQuery queryParams) { + public IPage getUserPage(UserPageQuery queryParams) { // 查询数据 - Page userBoPage = this.baseMapper.listUserPages( + Page userBoPage = this.baseMapper.getUserPage( new Page<>(queryParams.getPageNum(), queryParams.getPageSize()), queryParams diff --git a/youlai-system/system-boot/src/main/resources/mapper/SysUserMapper.xml b/youlai-system/system-boot/src/main/resources/mapper/SysUserMapper.xml index 36d6173d6..c9528e5a7 100644 --- a/youlai-system/system-boot/src/main/resources/mapper/SysUserMapper.xml +++ b/youlai-system/system-boot/src/main/resources/mapper/SysUserMapper.xml @@ -5,7 +5,7 @@ - SELECT u.id, u.username,